前言
關於DNS隧道的一些簡單研究和利用。
DNS協議基礎
域名系統(服務)協議(DNS)是一種分布式網絡,主要用於域名與 IP 地址的相互轉換。
DNS域名解析流程
本地DNS緩存-遞歸查詢-迭代查詢
本地DNS緩存
包含瀏覽器緩存,本地host文件,系統dns緩存
遞歸查詢
該模式下DNS 服務器接收到客戶機請求,必須使用一個准確的查詢結果回復客戶機。
迭代查詢
本地域名服務器向根域名服務器查詢,根域名服務器告訴它下一步到哪里去查詢,然后它在根據結果逐層向下查詢,直到得到最終結果。每次它都是以dns客戶機的身份去各個服務器查詢,即迭代查詢是本地服務器進行的操作。
基本解析流程
以訪問http://test.cseroad.space進行舉例
1、檢查瀏覽器緩存,本地host文件和本機的dns緩存,失敗后,向本地設置的dns服務器(如114.114.114.114)發送查詢請求,dns服務器到自身解析數據庫中查詢,查詢成功返回IP地址(此過程成為遞歸查詢)查詢失敗則觸發迭代查詢過程。
2、本地dns服務器向根域名服務器發送關於space的查詢請求。
3、根域名服務器接收到查詢請求,並把查詢結果返回給dns服務器。
4、本地dns服務器收到根域名服務器返回的頂級域名服務器的地址,並向它查詢關於cseroad的域名服務器地址。
5、頂級域名服務器接收到請求,進行查詢,並把查詢結果返回到dns服務器。
6、本地dns服務器收到關於cseroad的權限域名服務器地址,並發起查詢test的請求。
7、權限域名服務器收到請求,並把test對應的A記錄的ip返回給dns服務器。
8、本地dns服務器把權限域名服務器返回的ip地址發送到個人電腦。
9、個人電腦成功解析到http://test.cseroad.space對應的ip地址,在瀏覽器中進行訪問。

DNS隧道
DNS隧道(DNS Tunneling)是將其他協議的內容封裝在DNS協議中,然后以DNS請求和響應包完成傳輸數據(通信)的技術。當前網絡世界中的DNS是一項必不可少的服務,所以防火牆和入侵檢測設備處於可用性和用戶友好的考慮將很難做到完全過濾掉DNS流量,因此,攻擊者可以利用它實現遠程控制,文件傳輸等操作。
DNS隧道的兩大類型
直連隧道:用戶端直接和指定的目標DNS服務器建立連接,然后將需要傳輸的數據編碼封裝在DNS協議中進行通信。這種方式的優點是具有較高速度,但蔽性弱、易被探測追蹤的缺點也很明顯。另外直連方式的限制比較多,如目前很多的企業網絡為了盡可能的降低遭受網絡攻擊的風險,一般將相關策略配置為僅允許與指定的可信任DNS服務器之間的流量通過。
中繼隧道:通過DNS迭代查詢而實現的中繼DNS隧道,這種方式及其隱秘,且可在絕大部分場景下部署成功。但由於數據包到達目標DNS服務器前需要經過多個節點的跳轉,數據傳輸速度和傳輸能力較直連會慢很多。
在實戰用到DNS隧道的場景,對隱蔽性要求很高,速度相對來說沒那么重要,因此主要使用中繼隧道。
技術要點
DNS緩存機制的規避
再使用中繼隧道時,如果需要解析的域名在本地的DNS Server中已經有緩存時,本地的DNS Server就不會轉發數據包。所以在構造的請求中,每次查詢的域名都是不一樣的。
DNS載荷的編碼
從高層來看,載荷只是客戶端和服務器通信的正常流量。例如客戶端發送一個A記錄請求給服務器,查詢的主機名為2roAUSwVqwOWCaaDC.test.nuoyan.com,其中2roAUSwVqwOWCaaDc則是客戶端傳遞給服務器的信息,這串字符解碼后的信息便是DNS隧道。
可利用DNS查詢類型
DNS的記錄類型有很多,常見的有A,AAAA,CNAME,MX,NS等。DNS隧道可以利用其中的一些記錄類型來傳輸數據。例如A,MX,CNAME,TXT等。
A 記錄 指定主機名(或域名)對應的IPV4地址記錄
AAAA 記錄 指定主機名(或域名)對應的IPV6地址記錄
NS 記錄 指定該域名由哪個DNS服務器來進行解析
MX 記錄 指向一個郵件服務器
PTR 記錄 將一個IP地址映射到對應的域名,也可以看成是A記錄的反向
CNAME 記錄 允許將多個名字映射到同一台計算機
TXT 記錄 一般指主機名或域名的說明
主動連接
內網客戶端位於防火牆后方,服務端無法做到主動連接,因此大多的dns隧道工具,客戶端會定時向服務端發送請求,保證二者之間的通信狀態。
常用工具
dnscat2,iodine,DeNise,dns2tcp等單獨的DNS隧道工具。
cs,msf,empire等集合了DNS隧道功能的安全工具。
本次分別演示使用dnscat2和cs的DNS隱藏隧道。
實驗環境
內網win7虛擬機
阿里雲vps
py來的域名
Dnscat2搭建DNS隧道
1、安裝環境依賴和服務端
apt-get install ruby ruby-dev git make g++ rubygems
gem update --system
gem install bundler
git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/server
bundle install
如下表示安裝成功。

2、客戶端下載安裝
Dnscat2支持跨平台
linux客戶端
git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/client/
make
windows客戶端
下載鏈接
下載dnascat2的win32.zip
3、建立隧道
因為要使用中繼隧道,設置一個NS記錄指向自己的子域名,再設置一個A記錄指向自己部署server端的服務器地址。

使用dig +trace dnsa.cseroad.space 查看域名詳細解析過程,對應着迭代查詢過程。

ruby ./dnscat2.rb dnsa.cseroad.space --no-cache
執行dnscat2,輸入配置的子域名 --no-cache 代表禁止緩存

secret為隨機生成的密鑰,友好的給出了2種連接方式,分別為中繼和直連。
直接在客戶端執行中繼連接方式,session established表示隧道建立成功。

服務端接收到客戶端的請求,創建了session 1會話。

進入這個session
session -i 1
查看工具支持的功能。

執行系統命令,更多的功能不再演示。

cs使用DNS隧道建立連接
cs作為當前最流行的安全工具肯定少不了DNS隧道功能。
cs的安裝過程不再贅述。
1、新建基於DNS隧道的監聽器
payload選擇beacon_dns,host填寫A類解析的域名,端口隨意。

輸入設置的ns服務器域名

2、基於監聽器創建payload
推薦使用powershell,powershell不會產生文件落地,且免殺性操作性強。


成功上線。

通過Wireshark可以查看到cs的流量都是通過DNS發出的,使用的為A類查詢進行數據傳輸。

總結
DNS隧道在隱蔽性,穿透性上仍然具備不小的優勢。
在大多數情況下它不會是最優選擇,但在某些情況下它會成為唯一選擇。
作者:Tide_諾言
鏈接:https://www.jianshu.com/p/84c526ad1548
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。