LINUX:Wazuh-Statistiques
But
Au fur et à mesure, les attaques se diversifient et s'accumulent. A partir des adresses IP, on peut connaitre le pays d'origine et de là établir des statistiques.
Script de regroupement et de localisation du pays d'origine
La première étape consiste à repérer dans le fichier "/var/ossec/logs/active-responses.log", les adresses IP bloquées. On les regroupe au fur et à mesure du temps en ne gardant qu'une occurrence.
La seconde étape consiste à localiser le pays où se situe chaque adresse IP. Il faut avoir installé et configuré cette fonctionnalité décrite dans l'article Géolocalisation IP.
Dans le répertoire "/manager/wazuh/stat" nous créons le script "nslookup.bat":
#!/bin/bash # Regroupement des adresses IP bloquées et localisation du pays d'origine de celle-ci cd /manager/wazuh/stat # lister ceux bloqués par wazuh # décomposer la ligne JSON en une ligne par paramètre /usr/bin/cat /var/ossec/logs/active-responses.log* | /usr/bin/grep "firewall-drop" | /usr/bin/grep '"command":"add"' > listeip.json.txt /usr/bin/sed -i 's/{/\n{\n/g' listeip.json.txt /usr/bin/sed -i 's/}/\n}\n/g' listeip.json.txt /usr/bin/sed -i 's/","/",\n"/g' listeip.json.txt /usr/bin/sed -i 's/,"/,\n"/g' listeip.json.txt # rechercher les adresses IP sources /usr/bin/grep '"srcip":' listeip.json.txt | /usr/bin/awk -F ":" '{printf("%s\n",$2)}' | /usr/bin/sort -u > listeip.srcip.txt /usr/bin/sed -i 's/\"//g' listeip.srcip.txt /usr/bin/sed -i 's/\,//g' listeip.srcip.txt # fusion - tri - unicité /usr/bin/sort -u listeip.srcip.txt > listeip.txt # nettoyage /usr/bin/rm -f listeip.srcip.txt /usr/bin/rm -f listeip.json.txt # récupérer la liste des adresses IP listeip=`/usr/bin/cat listeip.txt` # récupérer la liste des adresses IP déjà traitées listens=`/usr/bin/cat ns.lis | /usr/bin/awk '{printf("I%sI",$1)}'` # bouclage sur chaque adresse IP for ip in $listeip do ip1="I"$ip"I" liste1=`echo ${listens} | grep "${ip1}"` if [ "$liste1" = "" ] then echo -n "IP $ip " # IP IP=`/usr/bin/printf "%-15s" $ip` # NsLookup /usr/bin/nslookup $ip 195.238.2.21 > ns.tmp echo -n DNS /usr/bin/sed -i '/^$/d' ns.tmp /usr/bin/grep -v "server can't find" ns.tmp | /usr/bin/grep -v "no servers could be reached" | /usr/bin/grep -v Authoritative > ns1.tmp NSL=`/usr/bin/cat ns1.tmp | /usr/bin/awk '{printf("%s",$4)}'` # GeoIP2 # code pays /usr/bin/mmdblookup --ip $ip --file /usr/share/GeoIP/GeoLite2-Country.mmdb country iso_code > ns21.tmp echo -n GEO1 /usr/bin/sed -i '/^$/d' ns21.tmp /usr/bin/sed -i 's/<utf8_string>/ /g' ns21.tmp /usr/bin/sed -i 's/"/ /g' ns21.tmp NSG1=`/usr/bin/cat ns21.tmp | /usr/bin/awk '{printf("%s",$1)}'` # nom du pays /usr/bin/mmdblookup --ip $ip --file /usr/share/GeoIP/GeoLite2-Country.mmdb country names fr > ns22.tmp echo GEO2 /usr/bin/sed -i '/^$/d' ns22.tmp /usr/bin/sed -i 's/<utf8_string>/ /g' ns22.tmp /usr/bin/sed -i 's/"/ /g' ns22.tmp /usr/bin/sed -i 's/ /_/g' ns22.tmp /usr/bin/sed -i 's/__/=/g' ns22.tmp /usr/bin/sed -i 's/=_/ /g' ns22.tmp NSG2=`/usr/bin/cat ns22.tmp` /usr/bin/printf "%-25s" $NSG2 > ns23.tmp /usr/bin/sed -i 's/_/ /g' ns23.tmp NSG2=`/usr/bin/cat ns23.tmp` # impression /usr/bin/echo -e "${IP}\t${NSG1}\t${NSG2}\t${NSL}" >> ns.lis fi done # tri par code pays /usr/bin/sort -k 2 ns.lis -o nss.lis # nettoyage /usr/bin/rm -f ns.tmp /usr/bin/rm -f ns1.tmp /usr/bin/rm -f ns21.tmp /usr/bin/rm -f ns22.tmp /usr/bin/rm -f ns23.tmp /usr/bin/rm -f listeip.txt
Un fichier est créé "ns.lis" qu'il ne faut pas détruire. Au fur et à mesure du temps, les adresses IP et leur localisation vont s'y accumuler. Ce fichier comprend 4 colonnes: l'adresse IP, le code du pays, le nom du pays et, s'il est disponible, le nom de la machine.
Un second fichier "nss.lis" est le résultat trié par pays du premier fichier; ce second fichier peut être effacé.
Remarque: Faites attention, quelques fois les noms de certains pays changent d'orthographe. Il faut corriger directement ceux-ci dans le fichier "ns.lis" avec un éditeur de texte pour avoir un résultat correct.
CRON
Ce script est à exécuter régulièrement avant effacement du fichier "/var/ossec/logs/active-responses.log". On peut automatiser cette procédure par exemple une fois par jour ou toutes les heures via le service CRON.
On peut ajouter une ligne dans le fichier "/etc/crontab":
10 * * * * root /manager/wazuh/stat/nslookup.bat > /manager/wazuh/stat/nslookup.log
Dans cet exemple, il s'exécute tous les heures sous une session de l'utilisateur "root".
Script de statistiques
Sur base du fichier "ns.lis", on peut faire passer un script qui effectue le comptage par pays.
Voici un script simple nommé "compter.bat":
#!/bin/bash # Statistiques par pays des adresses IP cd /manager/wazuh/stat # récupérer les noms du pays /usr/bin/awk -F'\t' '{printf("%s\n",$3)}' ns.lis > ns3.1 # effacer les espaces en fin de ligne et remplacer les espaces intérieurs par un souligné puis tri unique /usr/bin/sed -i 's/[ ]*$//' ns3.1 /usr/bin/sed -i 's/ /_/g' ns3.1 /usr/bin/sort -u ns3.1 > ns3.2 # comptage par pays liste=`/usr/bin/cat ns3.2` echo -e "Pays\tnbs" > nscompte.lis echo "=====================" >> nscompte.lis for pays in $liste do echo -n -e "$pays\t" >> nscompte.lis /usr/bin/grep $pays ns3.1 | /usr/bin/wc -l >> nscompte.lis done # effacer les soulignés /usr/bin/sed -i 's/_/ /g' nscompte.lis # nettoyage /usr/bin/rm -f ns3.1 /usr/bin/rm -f ns3.2
Le résultat se retrouve dans le fichier "nscompte.lis".
Exemple de résultats
Les résultats ont été mis dans un tableur. Un histogramme présente les 20 plus grands. Il faut attendre quelques mois pour voir une stabilisation.