
Un servidor DNS MITM en Python basado en expresiones regulares con soporte para ataques de DNS Rebinding.
Actualización 4/14/2020: se eliminó el soporte para Python 2 y el código se cambió a Python3
¡Ahora con round-robin y opciones mejoradas!
Errores: @crypt0s - Twitter
[email protected] - Correo electrónico
¡Un servidor DNS basado en expresiones regulares de Python!
USAGE:
./fakedns.py [-h] -c Config path [-i interface IP address] [--rebind]
El archivo dns.conf debe configurarse de la siguiente manera:
[RECORD TYPE CODE] [python regular expression] [answer] [rebind answer]
La respuesta puede ser una dirección IP o la cadena self,
el azúcar sintáctico self se traducirá a la dirección IP local de tu máquina actual, como 192.168.1.100.
Si no se encuentra una coincidencia, el servidor DNS intentará resolver la solicitud utilizando el servidor DNS que tengas configurado en tu máquina local y hará de proxy de la solicitud a ese servidor en nombre del usuario solicitante.
- A
- TXT
- AAAA
- PTR
- SOA
- MX
- CNAME
- Supports DNS Rebinding
- Supports round-robin
Las reglas round-robin están implementadas. Cada vez que un cliente solicita una regla que coincide, FakeDNS sirve la siguiente IP de la lista de IP proporcionadas en la regla.
Una lista de IP está separada por comas.
Por ejemplo:
A robin.net 1.2.3.4,1.1.1.1,2.2.2.2
Es una regla round-robin para robin.net que servirá respuestas apuntando a 1.2.3.4, 1.1.1.1 y 2.2.2.2, iterando en ese orden cada vez que cualquier cliente realice una solicitud para la entrada robin.net.
NOTA: Estas IP no se incluyen como lista al cliente en la respuesta; solo reciben una única IP en la respuesta (podría cambiar eso más adelante)
FakeDNS soporta reglas de rebinding, lo que básicamente significa que el servidor acepta un cierto número de solicitudes de un cliente para un dominio hasta un umbral (por defecto 1 solicitud) y luego cambia la dirección IP a una diferente.
Por ejemplo:
A rebind.net 1.1.1.1 10%4.5.6.7
Significa que tenemos un registro A para rebind.net que se resuelve a 1.1.1.1 durante los primeros 10 intentos. En la 11.ª solicitud de un cliente que ya ha realizado 10 solicitudes, FakeDNS comienza a servir la segunda IP, 4.5.6.7
Puedes usar una lista de direcciones aquí y FakeDNS las rotará (round-robin) por ti, igual que en la regla "normal".
(solo localhost sin pasos adicionales)
He tenido mucho éxito probando/desarrollando FakeDNS en Docker porque es más fácil que ejecutarlo de forma nativa en instalaciones modernas de Ubuntu, que ya tienen sus propios servicios DNS ejecutándose en el puerto 53.
Si quieres probarlo, puedes hacerlo sin mucho esfuerzo siguiendo estos pasos:
Asumiendo que estás dentro del directorio FakeDns: sudo docker run --interactive --tty --volume \pwd`:/opt/FakeDns -p 5353:53/udp python:3.8 /opt/FakeDns/fakedns.py -c /opt/FakeDns/dns.conf.example. Y para probar, puedes ejecutar nslookup -port=5353 testrule.test 127.0.0.1, que debería devolver 1.1.1.1` en tu primera solicitud
O, si prefieres usar docker-compose, simplemente ejecuta docker-compose up y usa la misma prueba de arriba.