
Python MITM DNS-сервер на основе регулярных выражений с поддержкой атак DNS Rebinding
Update 4/14/2020 - поддержка Python 2 удалена, код переведён на Python3
Теперь с round-robin и улучшенными возможностями!
Баг-репорты: @crypt0s - Twitter
[email protected] - Email
DNS-сервер на основе регулярных выражений Python!
USAGE:
./fakedns.py [-h] -c Config path [-i interface IP address] [--rebind]
Файл dns.conf должен быть настроен следующим образом:
[RECORD TYPE CODE] [python regular expression] [answer] [rebind answer]
Ответом может быть IP-адрес или строка self,
синтаксический сахар self будет преобразован в локальный IP-адрес вашей текущей машины, например 192.168.1.100.
Если совпадения не найдено, DNS-сервер попытается разрешить запрос с помощью DNS-сервера, указанного в настройках вашей локальной машины, и передаст запрос этому серверу от имени запрашивающего пользователя.
- A
- TXT
- AAAA
- PTR
- SOA
- MX
- CNAME
- Поддерживает DNS Rebinding
- Поддерживает round-robin
Реализованы правила round-robin. Каждый раз, когда клиент запрашивает подходящее правило, FakeDNS отдаёт следующий IP из списка IP-адресов, указанных в правиле.
Список IP-адресов разделяется запятыми.
Например:
A robin.net 1.2.3.4,1.1.1.1,2.2.2.2
Это правило round-robin для robin.net, которое будет отдавать ответы, указывающие на 1.2.3.4, 1.1.1.1 и 2.2.2.2, перебирая их в этом порядке каждый раз, когда любой клиент запрашивает запись robin.net.
ПРИМЕЧАНИЕ : Эти IP-адреса не передаются клиенту в ответе списком — клиент по-прежнему получает только один IP в ответе (это может измениться позже)
FakeDNS поддерживает правила rebinding, что по сути означает, что сервер принимает определённое количество запросов от клиента для домена до достижения порога (по умолчанию 1 запрос), а затем меняет IP-адрес на другой.
Например:
A rebind.net 1.1.1.1 10%4.5.6.7
Означает, что у нас есть A-запись для rebind.net, которая возвращает 1.1.1.1 для первых 10 попыток. При 11-м запросе от клиента, который уже сделал 10 запросов, FakeDNS начинает отдавать второй IP — 4.5.6.7
Вы можете указать здесь список адресов, и FakeDNS будет перебирать их в режиме round-robin, как и в «обычном» правиле.
(только localhost без дополнительных шагов)
Я добился больших успехов при тестировании/разработке FakeDNS в Docker, поскольку это проще, чем запускать его напрямую на современных установках Ubuntu, на которых уже работают собственные DNS-сервисы на порту 53.
Если хотите попробовать, вы можете сделать это без особых усилий, выполнив следующие шаги:
Предполагая, что вы находитесь в каталоге 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. Для проверки вы можете выполнить nslookup -port=5353 testrule.test 127.0.0.1, который при первом запросе должен вернуть 1.1.1.1`
Или, если вы хотите использовать docker-compose, просто запустите docker-compose up и используйте тот же тест, что и выше.