Statistiques Simscan

Un article de Wiki SOS-ADMIN.

Ce guide vous est proposé par www.elginux.com

Nous appellerons ce script :
SimScanStat-1.0.2-beta

Sommaire

Pré-requis

Ce petit script bash permettant d'obtenir des statisques pour simscan nécessite de patcher simscan, de plus il vous faudra avoir metalog comme gestionnaire de log

Patch Simscan

Code : simscan.path
--- /home/src/simscan-1.2/simscan.c     2006-05-21 02:29:43.000000000 +0200
+++ /home/src/simscan-1.2.bak/simscan.c 2006-05-26 08:14:43.000000000 +0200
@@ -33,6 +33,7 @@
 #include <string.h>
 #include <ctype.h>
 #include <errno.h>
+#include <syslog.h>
 #include "config.h"
 #include "cdb/cdb.h"
 #ifdef ENABLE_REGEX
@@ -1873,23 +1873,37 @@
 {
  int i;
  float reqhits;

   gettimeofday(&stop,(struct timezone *) 0);
   utime=SECS(stop)-SECS(start);

+/* openlog */
+openlog("simscan",LOG_PID,LOG_MAIL);
+

   if ( spam == 1 ) {
     if ( PerDomainHits == 1 ) reqhits = PDHits;
     else reqhits = ReqHits;
     fprintf(stderr, "simscan:[%d]:%s (%.2f/%.2f):%3.4fs:%s:%s:%s:%s",
       getppid(), state, SpamHits,reqhits, utime, subject,
       getenv("TCPREMOTEIP"), MailFrom, RcptTo[0]);
+    syslog(LOG_WARNING,"simscan:[%d]:%s (%.2f/%.2f):%3.4fs:%s:%s:%s:%s",
+      getppid(), state, SpamHits,reqhits, utime, subject,
+      getenv("TCPREMOTEIP"), MailFrom, RcptTo[0]);
   } else {
     fprintf(stderr, "simscan:[%d]:%s:%3.4fs:%s:%s:%s:%s",
       getppid(),state,utime,subject,getenv("TCPREMOTEIP"),MailFrom,RcptTo[0]);
+    syslog(LOG_WARNING,"simscan:[%d]:%s:%3.4fs:%s:%s:%s:%s",
+      getppid(),state,utime,subject,getenv("TCPREMOTEIP"),MailFrom,RcptTo[0]);
   }

   for(i=1;i<MaxRcptTo;++i) {
     fprintf(stderr, ",%s", RcptTo[i]);
   }
   fprintf(stderr, "\n");
+
+closelog();
+
 }

Metalog

Fichier : /etc/metalog/metalog.conf
Simscan :
  regex    = "simscan:"
  logdir   = "/var/log/simscan"
  command  = "/usr/local/sbin/simscan_log.sh"

le script /usr/local/sbin/simscan_log.sh

cat "/usr/local/sbin/simscan_log.sh"
#!/bin/bash
echo $3|tai64n>>/var/log/simscan/simscan.log

Maintenant nous avons un fichier /var/log/simscan/simscan.log contenant toutes les informations dont nous avons besoin et que nous allons analyser

Le script d'analyse simscan_stat.sh

Code : simscan_stat.sh
#!/bin/bash
#
# Ce script est sous licence opensource
# Merci de ne pas supprimer les mentions ci-dessous
# Nom : SimScanStat
# Version : 1.0.2-beta
# Editeur : Elgi
# Email : laurent AT elginux DOT com
# Site : http://www.elginux.com

opt=0
while [ -n "$1" ]
do
        case $1 in
                -s)
                        let opt+=1; shift 1;;
                -v)
                        let opt+=2; shift 1;;
                -d)
                        let opt+=4; shift 1;;
                -dom)
                        if [[ -n "$2" ]]
                        then
                                dom=$2;
                                shift 2;
                        else
                                shift 1;
                        fi
                        ;;
                *)
                        echo "Option inconnue"
                        break;;
        esac
done

if [[ $opt == 0 && -z "$dom" ]]
then
        echo "Usage : simscan_stat.sh [option]"
        echo ""
        echo "Option :"
        echo "-s => statistique sucinct du serveur"
        echo "-v => statistique des virus du serveur"
        echo "-d => statistique par domaine"
        echo "-dom [domain.tld] => statistique de domain.tld"
        exit 1
fi

log=/var/log/simscan/simscan.log

function etat_email {
        if [[ $2 != 0 ]]
        then
                echo "Nombre d'email $1 : "$2" => "$(echo "scale=2; ($2*100)/$3" | bc)"%"
        fi
}

if [[ $opt != 0 ]]
then
        ttotal=0

        for sec in `cat $log | awk -F ":" '{print $4}' | cut -d 's' -f1`;
        do
                ttotal=$( echo "scale=4; $ttotal+$sec" | bc );
        done;
        nbr=`cat $log | wc -l`
        moy=$( echo "scale=4; $ttotal/$nbr" | bc )

        clean=0
        relayclient=0
        spam=0
        virus=0
        passthru=0

        for etat in `cat $log | awk -F ":" '{print $3}' | awk '{print $1}'`;
        do
                case "$etat" in
                        "CLEAN" )
                                let clean+=1;;
                        "RELAYCLIENT" )
                                let relayclient+=1;;
                        "SPAM" )
                                let spam+=1;;
                        "VIRUS" )
                                let virus+=1;;
                        "PASSTHRU" )
                                let passthru+=1;;
                esac
        done;
fi

if [[ $opt == 1 || $opt == 3 || $opt == 5 || $opt == 7 ]]
then
        echo "Nombre d'email : "$nbr
        echo "Temps total d'analyse : "$ttotal" secondes"
        echo "Temps moyen d'analyse par email : "$moy" secondes"
        etat_email CLEAN $clean $nbr
        etat_email RELAYCLIENT $relayclient $nbr
        etat_email SPAM $spam $nbr
        etat_email VIRUS $virus $nbr
        etat_email PASSTHRU $passthru $nbr
fi

if [[ $opt == 2 || $opt == 3 || $opt == 6 || $opt == 7 ]]
then
        echo ""
        echo "Liste, nombre et pourcentage de virus :"
        virus_name=`cat $log | grep "VIRUS" | awk -F ":" '{print $5}' | sort | uniq`
        for name in $virus_name;
        do
                nbr_virus=`cat $log | grep "$name" | wc -l`
                pourcent_virus=$(echo "scale=2; ($nbr_virus*100)/$virus" | bc)
                echo $name" => "$nbr_virus" => "$pourcent_virus"%";
        done;
fi

if [[ $opt == 4 || $opt == 5 || $opt == 6 || $opt == 7 ]]
then
        for domain in `cat /var/qmail/control/virtualdomains | awk -F ":" '{print $1}' | sort`;
        do
                echo ""
                echo $domain
                nbr_domain=`cat $log | awk -F ":" '{print $8}' | grep "$domain" | wc -l`
                echo "Nombre d'email : "$nbr_domain
                clean=0
                relayclient=0
                spam=0
                virus=0
                passthru=0
                for etat in `cat $log | awk -F ":" '{print $3":"$8}' | grep "$domain" | awk '{print $1}'`;
                do
                        case "$etat" in
                                "CLEAN" )
                                        let clean+=1;;
                                "RELAYCLIENT" )
                                        let relayclient+=1;;
                                "SPAM" )
                                        let spam+=1;;
                                "VIRUS" )
                                        let virus+=1;;
                                "PASSTHRU" )
                                        let passthru+=1;;
                        esac
                done
                etat_email CLEAN $clean $nbr_domain
                etat_email RELAYCLIENT $relayclient $nbr_domain
                etat_email SPAM $spam $nbr_domain
                etat_email VIRUS $virus $nbr_domain
                etat_email PASSTHRU $passthru $nbr_domain
        done;
fi

if [[ -n $dom ]]
then
        echo ""
        echo $dom
        nbr_domain=`cat $log | awk -F ":" '{print $8}' | grep "$dom" | wc -l`
        echo "Nombre d'email : "$nbr_domain
        clean=0
        relayclient=0
        spam=0
        virus=0
        passthru=0
        for etat in `cat $log | awk -F ":" '{print $3":"$8}' | grep "$dom" | awk '{print $1}'`;
        do
                case "$etat" in
                        "CLEAN" )
                                let clean+=1;;
                        "RELAYCLIENT" )
                                let relayclient+=1;;
                        "SPAM" )
                                let spam+=1;;
                        "VIRUS" )
                                let virus+=1;;
                        "PASSTHRU" )
                                let passthru+=1;;
                esac
        done
        etat_email CLEAN $clean $nbr_domain
        etat_email RELAYCLIENT $relayclient $nbr_domain
        etat_email SPAM $spam $nbr_domain
        etat_email VIRUS $virus $nbr_domain
        etat_email PASSTHRU $passthru $nbr_domain
fi

Exemple d'utilisation

# sh simscan_stat.sh
Usage : simscan_stat.sh [option]

Option :
-s => statistique sucinct du serveur
-v => statistique des virus du serveur
-d => statistique par domaine
-dom [domain.tld] => statistique de domain.tld
# sh simscan_stat.sh -s
Nombre d'email : 3578
Temps total d'analyse : 33369.2575 secondes
Temps moyen d'analyse par email : 9.3262 secondes
Nombre d'email CLEAN : 250 => 6.98%
Nombre d'email RELAYCLIENT : 496 => 13.86%
Nombre d'email SPAM : 2740 => 76.57%
Nombre d'email VIRUS : 92 => 2.57%
# sh simscan_stat.sh -v

Liste, nombre et pourcentage de virus :
HTML.Phishing.Bank-345 => 2 => 2.17%
Worm.Mydoom.M => 6 => 6.52%
Worm.Nyxem.E => 1 => 1.08%
Worm.SomeFool.Gen-1 => 2 => 2.17%
Worm.SomeFool.Gen-2 => 1 => 1.08%
Worm.SomeFool.Z => 1 => 1.08%
Worm.Zafi.D => 79 => 85.86%
# sh simscan_stat.sh -s -v -dom mon_domaine.tld
Nombre d'email : 7530
Temps total d'analyse : 62103.9705 secondes
Temps moyen d'analyse par email : 8.2475 secondes
Nombre d'email CLEAN : 531 => 7.05%
Nombre d'email RELAYCLIENT : 1210 => 16.06%
Nombre d'email SPAM : 5109 => 67.84%
Nombre d'email VIRUS : 680 => 9.03%

Liste, nombre et pourcentage de virus :
HTML.Phishing.Bank-345 => 4 => .58%
Worm.Mydoom.M => 8 => 1.17%
Worm.Nyxem.E => 1 => .14%
Worm.SomeFool.AM => 1 => .14%
Worm.SomeFool.Gen-1 => 2 => .29%
Worm.SomeFool.Gen-2 => 2 => .29%
Worm.SomeFool.Z => 1 => .14%
Worm.Zafi.D => 661 => 97.20%

mon_domaine.tld
Nombre d'email : 5002
Nombre d'email CLEAN : 222 => 4.43%
Nombre d'email SPAM : 4765 => 95.26%
Nombre d'email VIRUS : 2 => .03%