Notification Ossec sur Twitter en perl

Aujourd’hui,

du twitter et de l’ossec, comme je le disais dans mon précédent article sur les notifications d’ossec, l’utilisation de twitter pour les notification ne fonctionne plus, car depuis aout 2010, les authentifications http ne fonctionnent plus, et il faut passer par le système Oauth, qui permet de ne plus avoir à stocker ses mots de passe dans chaque application utilisant le service, et de pouvoir désactiver les accès depuis le site de twitter.

J’ai utilisé le langage perl pour l’autorisation et la publication des tweets :
Il faut tout d’abord aller sur le site des applications twitter pour récupérer les clés d’autorisation de l’application et son ‘secret’.

Installer les dépendances :

apt-get install libnet-twitter-perl

Puis lancer le logiciel une premiere fois pour générer les tokens d’accès.
(Les deux fichiers suivant se mettent dans active-response/bin)

#!/usr/bin/perl
#
# Net::Twitter - OAuth et Envoie de status
#
use warnings;
use strict;
use Net::Twitter;
use File::Spec;
use Storable;
use Data::Dumper;

my $status = shift or die("Il manque le status en parametre");
$status = substr $status, 0, 140;

my %consumer_tokens = (
    consumer_key    => 'Remplacer par votre clé',
    consumer_secret => 'Remplacer par votre secret',
);

my (undef, undef, $datafile) = File::Spec->splitpath($0);
$datafile =~ s/\..*/.dat/;

my $nt = Net::Twitter->new(traits => [qw/API::REST OAuth/], %consumer_tokens);
my $access_tokens = eval { retrieve($datafile) } || [];

if ( @$access_tokens ) {
    $nt->access_token($access_tokens->[0]);
    $nt->access_token_secret($access_tokens->[1]);
}
else {
    my $auth_url = $nt->get_authorization_url;
    print " Autoriser cette application via : $auth_url\nPuis, entrez le PIN# pour continuer: ";

    my $pin = ;
    chomp $pin;
    my @access_tokens = $nt->request_access_token(verifier => $pin);
    store \@access_tokens, $datafile;
}
#$status = $nt->user_timeline({ count => 1 });
#print Dumper $status;
my $result = $nt->update($status);

Il faut ensuite créer un nouveau script pour gérer les status depuis les notifications d’ossec :

J’ai modifié le script existant pour utiliser mon script de publication, et aussi pour spécifier les messages d’erreurs fournit par l’id 20100 (de Snort), qui renvoit un message bidon, là je fournit l’erreur détectée par Snort de façon plus précise.

#!/bin/sh
# Tweeter an alert - copy at /var/ossec/active-response/bin/ossec-tweeter.sh
# Author: Daniel Cid



# Checking user arguments
if [ "x$1" = "xdelete" ]; then
    exit 0;
fi
ALERTID=$4
RULEID=$5
LOCAL=`dirname $0`;
ALERTTIME=`echo "$ALERTID" | cut -d  "." -f 1`
ALERTLAST=`echo "$ALERTID" | cut -d  "." -f 2`



# Logging
cd $LOCAL
cd ../
PWD=`pwd`
echo "`date` $0 $1 $2 $3 $4 $5 $6 $7 $8" >> ${PWD}/../logs/active-responses.log
ALERTFULL=`grep -A 10 "$ALERTTIME" ${PWD}/../logs/alerts/alerts.log | grep -v ".$ALERTLAST: " -A 10 | grep -v "Src IP: " | grep -v "User: " |grep "Rule: " -A 1|head -1|sed 's/Rule: //'`


if [ $5 -eq "20100" ]
then
	ALERTFULLTMP=`grep -A 10 "$ALERTTIME" ${PWD}/../logs/alerts/alerts.log | grep -v ".$ALERTLAST: " -A 10 | grep -v "Src IP: " | grep -v "User: " |grep "Rule: " -A 1|sed 's/Rule: //'|head -2`
	REALMSG=`echo $ALERTFULLTMP|sed -e "s/.*(.*) \(.*\) \[\*.*/\1/g"`
	ALERTFULL=`echo $ALERTFULL|sed -e "s/'.*'/'$REALMSG'/g"`
fi

STATUS="Ban temp : $3 Regle : $ALERTFULL"
/var/ossec/active-response/bin/twitter.pl "$STATUS"

Modifier la conf de etc/ossec.conf en rajoutant :

  
    ossec-tweeter
    ossec-tweeter.sh
    srcip
    yes
  
  
    ossec-tweeter
    local
    6
  

Et normalement, c’est tout bon, vous devriez pouvoir twitter les attaques …