cartographier un botnet via GoogleMaps : Les scripts !

Cet article s'inscrit dans la ligne directe de l'article du 6 septembre "Cartographier un botnet via GoogleMaps" qui présentait comment j'avais mis un visage sur un réseau de machines zombies en le cartographiant via GoogleMaps.


passons à la technique

Il est maintenant temps de rentrer dans les détails de mise en œuvre afin que vous puissiez faire de même de votre coté. Une fois n'est pas coutume, on va faire dans le code source : Au menu, un peu de Perl suivi d'un script en Python et en dessert du Javascript.
Je vous rassure : Ce qui a été fait reste assez simple et pourra facilement être reproductible voir même étendu.
 

générer une liste d'adresses IP

Comme je ne pouvais évidemment pas vous donner la liste des adresses IP du botnet utilisées dans l'article initial, un script était nécessaire pour générer des adresses IP aléatoire : donne la possibilité de générer de la "matière de base" avec laquelle travailler.

Ce script Perl est super simple (directement pompé d'un forum sur le Net). Vous le lancez et vous récupérez 2600 adresses IP aléatoires, une adresse IP par ligne (le script Perl est disponible dans l'archive en fin de l'article, et il y a aussi un fichier avec des adresses IP aléatoires pour les impatients).
Pour utiliser le script, redirigez simplement la sortie standard vers un fichier : linuxbox$ ./generate_random_ip.pl > iplist.txt

Utilisez vos adresses IP ou générez-en. L'important c'est d'avoir des adresses IP à se mettre sous la dent. Cartographier ses logs de firewalls ou de serveurs de mail (par exemple) peut être intéressant... a vous de voir !


installez un moteur de géolocalisation d'adresses IP

Pour géolocaliser mes adresses IP, j'ai utilisé la version gratuite de la base proposée par MaxMind. Il y a une version payante plus précise et plus à jour mais pour mes tests c'était grandement suffisant. Pour télécharger les versions "Lite", cela se trouve ICI.

Je ne rentrerai pas dans les détails de l'installation de la base MaxMind car les informations fournies sont plutôt bien faites. A vous de vous débrouiller sur ce coup là. Perso, sous un Linux Ubuntu c'était "finger in the noze".

Gardez dans un coin l'endroit (le chemin) ou la base MaxMind est installée : Cela sera nécessaire pour configurer le script python qui va servir pour la phase de géolocalisation.


script de géolocalisation et génération d'un fichier XML en sortie

Maintenant ça ne rigole plus : On rentre dans le cœur du sujet.
Le script python va tout d'abord ouvrir le fichier texte contenant les adresses IP et va créer une table avec toutes les adresses IP, en prenant soin d'enlever celles qui sont éventuellement en double.

Une fois le tableau créé avec les adresses IP récupérée depuis le fichier texte, le script va réaliser; via un appel au moteur MaxMind, la géolocalisation de chaque adresse IP : Parmi les informations récupérées, on retrouve la longitude, la latitude, le pays, etc...
Avec ces infos, il va tout simplement générer un nœud XML qui sera intégré dans un document XML.

Le script Python s'attend à trouver un fichier texte (iplist.txt) dans le répertoire courant et affiche sur la sortie standard le XML généré, pour lancer le script et créer un fichier avec les données : linuxbox$ ./geolocalise_ip.py > data.xml


un peu de HTML et du JavaScript

Le dernier fichier, c'est une page HTML contenant du code Javascript qui va faire les appels à GoogleMaps pour créer la carte GoogleMaps. Vous noterez que j'utilise une librairie tierce qui fait ce que l'on appelle du "clustering" (c'est à dire du regroupement de points) afin d'éviter d'avoir trop de points sur la carte.

En effet, la première carte que j'ai mise au point déposait un point ("marqueur") pour chaque adresse IP : Ça marche mais au delà de 1000 IP c'est devenu d'une lenteur effroyable...
Le script Javascript est commenté, je ne le détaillerai pas plus. Ceux qui bidouillent un peu devraient s'y retrouver sans trop de problèmes.

Le script cherche un fichier "data.xml" présent dans le même répertoire, l'ouvre et parse le XML. Il récupère les infos utiles et appelle les API de GoogleMaps ainsi que celles de la la librairie de clustering.


pour tester par vous-même,

ca se passe à cette URL : Une belle carte GoogleMaps navigable/zoomable générée en direct. (Le message d'erreur Google sur l'absence d'une clef API est normal).


voila c'est fini

En fait, avec le reçul, rien de bien magique mais le résultat est sympathique et diablement "fun" pour épater la galerie. :-)

Bon, mes scripts sont un peu "brut de fonderie" et feront surement hurler les developpeurs Perl, Python ou Javascript. En fait, je suis resté dans le mode "quick & dirty" car il ne s'agissait que de tester une idée... A vos claviers pour faire encore mieux. Vous aurez un message d'erreur au démarrage (absence de clef API GoogleMaps) : Ca marche quand même mais je vous laisserai le soin de faire ce qu'il faut.

Si il y a des questions : je tenterai d'y répondre via la fonction "commentaires". Pour ceux ayant des propositions d'améliorations, n'hésitez pas à les partager !

Fichiers:
J'ai mis dans une archive "ZIP" l'ensemble des fichiers suivants :


  • generate_random_ip.pl : Script Perl pour générer des adresses IP aléatoires
  • iplist.txt : Une liste de 2600 adresses IP aléatoires
  • geolocalise_ip.py : Script Pythong pour la géolocalisation et genération d'un document XML.
  • index.html : Fichier principal avec le Javascript appelant l'API GoogleMaps
Jean-François Audenard

Au sein de la direction sécurité du Groupe Orange, je suis en charge de la veille sécurité et de la sensibilisation à la sécurité. Franchise, optimisme et bonne-humeur sont mes moteurs quotidiens