Obtenir des enregistrements NS inversés (alias DNS passif) pour une liste d'IP en Python | Reverse IP/DNS API | WhoisXML API

Obtenir des enregistrements NS inversés (alias DNS passif) pour une liste d'IP en Python

Le DNS passif, introduit par Florian Weimer en 2005, est aujourd'hui une ressource centrale dans les enquêtes sur la sécurité IP, la sécurité du fonctionnement du système de noms de domaine (DNS), et bien d'autres encore. Une base de données DNS passive contient des événements observés chaque fois qu'une IP se résout en un nom de domaine dans une communication DNS. Il s'agit donc d'une base de données indépendante de l'état actuel et de l'infrastructure physique du DNS lui-même. De plus, elle contient des informations temporelles : la date et l'heure auxquelles une telle résolution a été observée pour la première et la dernière fois ; ces informations ne peuvent pas être obtenues à partir du DNS. 

L'une des façons les plus simples d'obtenir de telles données est d'utiliser les services de WhoisXML API. Dans cet article, nous nous concentrons sur la recherche inversée : à partir d'une adresse IPv4, nous voulons révéler les noms de domaine auxquels ces IP appartenaient à certaines dates. 

Nous travaillerons en Python dans une ligne de commande Linux ou Mac OS X, mais il est facile de faire de même dans un environnement de ligne de commande Windows, à condition que Python soit fonctionnel. Notre description s'adresse aux débutants ; seules des compétences très basiques en Python et en scripts shell sont supposées. Nous utiliserons reverse IP API et le pack Python fourni qui rend l'utilisation de l'API très simple. Cette bibliothèque peut être installée à l'aide du gestionnaire de packs de Python, pip. La commande suivante, exécutée à partir du shell, la téléchargera et l'installera :

pip3 install reverse-ip

(Vous pouvez éventuellement le faire en tant qu'utilisateur root pour que la bibliothèque soit disponible sur l'ensemble de votre système, ou le faire dans un environnement virtuel Python pour limiter la portée de l'installation).  

Le pack reverse-ip est maintenant techniquement prêt à être utilisé, mais un abonnement à l'API est également nécessaire, un abonnement gratuit est également disponible. Lors de l'abonnement, vous recevrez une clé API, une chaîne de caractères, qui sera appelée YOUR_API_KEY dans ce qui suit. 

Une fois toutes les conditions préalables réunies, nous pouvons maintenant accomplir notre tâche. Supposons que nous disposons d'une liste d'adresses IP dans un fichier nommé ips_demo.csv. Pour la démonstration, nous utiliserons l'exemple suivant : 

172.67.155.63
104.21.20.75

Il s'agit d'adresses IP appartenant aux services web de WhoisXML API, mais elles sont également partagées avec d'autres services par notre fournisseur web. 

Nous allons mettre en œuvre un script qui lit les adresses IP à partir de l'entrée standard et écrit la sortie dans un format de valeurs séparées par des virgules (csv) sur la sortie standard. Modifions donc le script get_reverse_ip_of_a_list.py à l'aide d'un éditeur de texte approprié. Tout d'abord, lisons simplement les adresses IP et répétons-les sur la sortie standard, et ce code initial se lit comme suit :

#!/usr/bin/env python3 import sys   for line in sys.stdin.readlines():     ip = line.strip()     sys.stdout.write('"%s",'%ip)       sys.stdout.write("\n")

Nous pourrions opter pour une méthode plus sophistiquée de lecture de nos adresses IP, mais gardons les choses simples. Nous lisons simplement les répliques provenant de l'entrée standard et supprimons tout caractère supplémentaire comme les nouvelles lignes avec .strip(), et écrivons l'IP sur la sortie standard, entre des guillemets doubles suivis d'une virgule ; les résultats suivront ici. Ensuite, nous écrivons une nouvelle ligne, puisque nous avons déjà gardé l'espace entre les deux appels sys.stdout.write pour la partie principale du script. 

Mais avant de l'étendre, essayons : dans la ligne de commande de l'interpréteur de commandes, faisons

chmod +x get_reverse_ip_of_a_list.py
get_reverse_ip_of_a_list.py < ips_demo.csv

ce qui donne le résultat suivant :

"172.67.155.63",
"104.21.20.75",

ce qui est conforme aux attentes. 

Étendons maintenant notre script pour qu'il fasse son travail. Il se lira comme suit :

#!/usr/bin/env python3   import datetime from time import sleep from reverseip import Client   reverseip = Client('YOUR_API_KEY')   for line in sys.stdin.readlines():     ip = line.strip()     sys.stdout.write('"%s",'%ip)       data = reverseip.data(ip)     for record in data['result']: sys.stdout.write('"%s","%s","%s",'%(record['name'],     datetime.datetime.fromtimestamp( int(record['first_seen'])).strftime('%c'),     datetime.datetime.fromtimestamp( int(record['last_visit'])).strftime('%c')))     sys.stdout.write("\n")     sleep(.1)

N'oubliez pas de remplacer YOUR_API_KEY par votre véritable clé d'API pour que cela fonctionne. Ce que nous faisons est très simple : nous importons la classe Client du module, et créons l'instance reverseip, à laquelle nous passons la clé API. Ensuite, le résultat sera obtenu par l'appel de reverseip.data, facilement dans un dictionnaire Python ; pour les détails du format des données de sortie, veuillez consulter la documentation de l'API.  

Pour l'instant, il suffit de savoir que le champ de résultat de la sortie, c'est-à-dire data['result'], est un itérateur pour les enregistrements trouvés. (Plus précisément, pour un maximum de 300 enregistrements. En général, lorsque le nombre de noms de domaine pour une IP est supérieur à 50 ou 100, l'infrastructure est partagée et il n'est peut-être pas très utile d'avoir tous les enregistrements. Toutefois, si vous avez besoin de tous les enregistrements, la documentation de l'API décrit comment le faire). 

Nous itérons donc à travers les enregistrements s'il y en a. Chaque enregistrement comporte trois champs : le nom est le nom de domaine actuel, tandis que first_seen et last_visit indiquent la date de la première et de la dernière observation de cette paire nom-IP. Ces données sont fournies par l'API sous forme d'horodatage ; nous les convertissons en dates lisibles au format date et dans le fuseau horaire du système local à l'aide des fonctions apparemment lourdes mais logiques de la bibliothèque Python standard datetime. Nous ajoutons chaque triplet à la ligne de sortie donnée. 

Enfin, nous attendons 0,1 seconde pour éviter de nous heurter à une limite d'étranglement de l'API. (Le nombre maximal de requêtes par seconde est en fait de 30, de sorte que cette limite peut même être omise). Voyons ce que nous avons fait :

./get_reverse_ip_of_a_list.py < ips_demo.csv

se traduira désormais par

"172.67.155.63","labbry.com","Fri Jul 26 07:03:05 2019","Fri May  7 11:09:07 2021","livitte.com","Fri Sep 13 07:15:39 2019","Fri May ... "104.21.20.75","taalmedia.com","Fri Jun 21 13:50:38 2019","Fri Apr 23 18:12:27 2021",

du moins au moment de la rédaction de ce blog. (Nous avons tronqué la deuxième ligne pour des raisons typographiques.) Vous voudrez peut-être diriger la sortie standard vers un fichier :

./get_reverse_ip_of_a_list.py < ips_demo.csv > ips_pdns.csv

afin que le fichier ips_pdns.csv puisse être importé avec votre tableur bureautique préféré. 

En conclusion, nous avons démontré comment obtenir des données DNS passives très facilement en Python, même si vous venez de commencer à travailler avec Python, vous pouvez rapidement y arriver. En attendant, pour le programmeur Python avancé, le message est simplement qu'après avoir installé le pack Python reverse-ip et mis la main sur une clé API de WhoisXML API,

from reverseip import Client   reverseip = Client('YOUR_API_KEY')   data = reverseip.data(ip)

vous donne un dictionnaire Python avec les enregistrements DNS passifs pour une adresse IP. C'est peut-être la manière la plus simple d'obtenir de telles données avec un seul appel de fonction.