Netfilterqueue over iptables

Back in 2017, j’écrivais un outil en python permettant d’automatiser le DNS spoofing sur un réseau local. Tout se déroulait bien jusqu’à ce que j’arrive au moment de la redirection DNS. Comment j’allais faire pour catcher les requêtes DNS de mes victimes, les falsifier et leur envoyer la réponse ?!

En trifouillant un peu sur le web je suis tombé sur un post de byt3bl33der (le créateur du framework MITMf) dont j’avais parlé dans ces deux articles : MITMf : Framework pour MITM et MITMf et BeEF: injection de javascript

Dans son post, il expliquait qu’il avait trouvé une librairie qui gère magnifiquement bien les appels au module NetFilter et donc qui pourrait permettre de catcher nos fameux paquets DNS pour faire de la redirection ! Et comme j’ai récemment écrit un article sur le fonctionnement d’Iptables, je me suis dit qu’il serait intéressant de vous faire une transcription en français de son post !

Bueno, pour commencer il va falloir télécharger la librairie NetFilter Queue disponible ici. Pour cela il suffit d’entrer ces commandes :

git clone https://github.com/kti/python-netfilterqueue.git
cd python-netfilterqueue
python setup.py install
apt-get install build-essential python-dev libnetfilter-queue-dev

Ensuite il va nous falloir un petit script python implémentant la librairie. Ça tombe bien, les créateurs en ont mis un à disposition sur leur github :

from netfilterqueue import NetfilterQueue

def print_and_accept(pkt):
  print(pkt)
  pkt.accept()

nfqueue = NetfilterQueue()
nfqueue.bind(1, print_and_accept)
try:
  nfqueue.run()
except KeyboardInterupt:
  print('')
  
nfqueue.unbind()

Mais que font ces lignes de code ?! Dans l’article sur les Iptables je vous avais dit qu’il existe une cible qui permet de mettre les paquets entrants sur notre interface réseau dans une file d’attente :

net1.png

A l’aide du code Python ci dessus, on va tout simplement raccorder notre script à cette file d’attente. Ainsi on pourra traiter les paquets arrivants dans cette file, les modifier et les renvoyer. Seulement voilà, pour que ça fonctionne il faut implémenter une règle Iptables.

Si on souhaite catcher les paquets UDP en direction du port 53 (donc les requêtes DNS), on pourra entrer cette règle Iptables :

iptables -t filter -A OUTPUT -p udp --dport 53 -j NFQUEUE --queue-num 1

Ici on spécifie un identifiant de file (–queue-num 1) qu’il faudra renseigner à notre binder dans le script Python (c’est le « 1 »)  :

nfqueue = NetfilterQueue()
nfqueue.bind(1, print_and_accept)

Si on lance le script et qu’on envoie une requête DNS on obtiendra ceci :

net2.png

Libre à vous par la suite de lire le contenu de ce paquet avec scapy (par exemple). Voilà voilà ! Avec cette librairie vous pourrez gérer votre DNS spoofing plus facilement  !