DNS協議是一種請求應答協議,也是一種可用於應用層的隧道技術。雖然DNS流量的異常變化可能會被發現,但是在基於傳統socket隧道已經瀕臨淘汰,TCP、UDP通信大量被安全設備攔截的大背景下,DNS、ICMP、HTTP/HTTPS等難以禁用的協議已經成為攻擊者使用隧道的主流選擇。
選擇DNS協議作為通信隧道的主要優勢在於:一方面,DNS是網絡環境中必不可少的服務,另一方面,由於防火牆和IDS設備本身較少存在過濾DNS流量的行為,使得DNS報文本身具有了穿越WAF的能力。同時,越來越多的研究數據也證明了DNS隧道在APT攻擊和僵屍網絡中扮演着重要角色。
DNS隧道原理:
核心思想:端口不和服務綁定,可以傳輸任何數據。
正常網絡之間的通信,是發生在兩台機器建立TCP連接之后的,在進行通信時:如果目標是IP,則會直接發送報文,如果是域名,則將域名解析為IP再通信。C&C服務器在建立連接后將指令傳遞給客戶端上的后門程序。
DNS隧道的原理就是:在后門程序進行DNS查詢時,如果查詢的域名不在DNS服務器本機的緩存中,就會訪問互聯網進行查詢,然后返回結果,如果互聯網上有一台攻擊者設置的服務器,那么服務器就可以依靠域名解析的響應進行數據包的交換,從DNS協議的角度來看,這樣的操作只是反復查詢某個或者某些特定的域名並且得到解析結果,但其本質是,DNS預期的返回結果應該是一個IP地址,而事實上不是——返回的可以是任意字符串,包括加密的C&C指令,從而將其他協議封裝在DNS協議中進行傳輸。
DNS隧道木馬的通信結構如下:
DNS協議開頭為Transaction ID為字段,2字節,用於辨別DNS應答報文是哪個請求報文的響應:
技術要點:
- DNS緩存機制的規避
再使用中繼隧道時,如果需要解析的域名在本地的DNS Server中已經有緩存時,本地的DNS Server就不會轉發數據包。所以在構造的請求中,每次查詢的域名都是不一樣的。
- DNS載荷的編碼
從高層來看,載荷只是客戶端和服務器通信的正常流量。例如客戶端發送一個A記錄請求給服務器,查詢的主機名為2roAUSwVqwOWCaaDC.test.nuoyan.com,其中2roAUSwVqwOWCaaDc則是客戶端傳遞給服務器的信息,這串字符解碼后的信息便是DNS隧道。
DNS隧道分類:
DNS隧道攻擊分為兩種:IP直連型和域名中繼型,后面會分別介紹這兩種方式的代表工具。
IP直連型:
直連也就是客戶端直接和指定的目標DNS Server(Authoritative NS Server)連接,通過將數據編碼封裝在DNS協議中進行通信,這種方式速度更快,但是隱蔽性較差,容易被WAF或者IDS設備探測到,另外限制比較高,很多實際場景下不允許攻擊者來自定義DNS Server,否則很容易被發現。
DNS協議的下層協議為UDP傳輸協議,這種隧道客戶端通常使用UDP socket建立連接,實際上是基於UDP的,但是要利用到53端口。
域名中繼型:
通過DNS遞歸查詢實現的中繼隧道,比較隱蔽,但同時因為數據包到達目標DNS Server前需要經過多個節點,所以速度上較直連慢很多(其實就類似偽造一台私有DNS Server,當然也許大佬神仙們真有一台權威DNS Server也說不一定哈),同時我們還需要規避本地客戶端的DNS緩存,這里可以使用隨機域名生成算法(DGA)。很多惡意軟件利用該算法生成隨機域名,有效繞過黑名單檢測,通過輪詢的方式嘗試連接,尋找C2控制中心。(DGA算法的檢測測方法也有不少,這里按下不表)
①受到木馬控制的PC將數據封裝到DNS數據報文里,向位於內網的本地域名服務器請求查詢baidu.com.
②本地域名服務器透過防火牆向根域名服務器發送查詢請求
③經過大量的遞歸重定向,查詢請求發到baidu.com的(偽造)權威域名服務器
④baidu.com(偽造)權威域名服務器是在攻擊者控制下,解析並發送響應包
⑤dns響應包穿透內網防火牆
⑥進入內網
⑦本地域名服務器將響應包返回給受控客戶端
⑧受控客戶端解析DNS響應包中的數據,獲取指令
幾種常見DNS隧道工具流量分析
1、dns2tcp
dns2tcp是一個利用DNS隧道轉發TCP連接的工具,是由Olovier Dembour和Nicolas Collignons開發,使用C語言編寫。支持DNS協議KEY和TXT類型的請求。使用此工具不需要額外安裝TUN/TAP,可用性和實用性很強。
工具使用:
服務器端,默認配置文件
resources里面配置的是dns2tcp供客戶端使用的資源。作用是:客戶端在本地監聽一個端口,並指定使用的資源,當有數據往端口傳送后,dns2tcp客戶端將數據用DNS協議傳動到服務器,然后服務器將數據轉發到對應的資源配置的端口中。
啟動DNS2TCP客戶端的命令如下;
dns2tcpc -c -k pass -l 2222 -d 1 -r ssh -z ns1.abc.com
其中:-c表示啟用數據壓縮;-d表示啟動調試,1為調試等級;-l表示監聽本地端口,2222為端口名;-r為使用服務端上的哪個資源,ssh為資源名,可以為http;-z后的ns1.abc.com為前面配置的NS記錄的域名。
然后就可以在內網主機192.168.32.132訪問本地2222端口,測試成功,可以訪問外網主機的ssh資源。
類似的方法,選擇http然后將瀏覽器的代理服務器地址設為127.0.0.1:8118,代理類型為HTTP代理,也可以通過DNS隧道上網了。
流量分析:
請求體與響應體完全一致,響應體多出一段加密的base64的加密流
原理是通過DNS請求頭域名的信息的TXT記錄加密傳輸信息,可以看到DNS的查詢請求的域名信息test.lab.com前的一串數據,里面就是加密過后的交互數據。DNS隧道建立后,client還是會不斷地發包給server心跳包,確認服務器端處於存活狀態,保證傳輸的順暢。
DNS2TCP使用子域的前4個字節來維護和跟蹤相同的會話。通過刪除 session-tag,我們可以使用base64解碼SSH會話中的實際有效負載
總結:
client通過TXT類型記錄的域名前綴來發出數據,采用的是base64加密的方式。
從發包行為上可以發現,在進行傳輸數據這種大量數據交互操作的情況
2、iodine
與同類工具相比,iodine具有以下特點:
- 下行流量不編碼(下行流量是指流出服務器的流量,s to c)
- 強制密碼
- 支持同一網段之間的隧道
- 支持多種dns記錄格式
Iodine默認使用TXT和NULL類型發送數據,支持NULL,TXT,SRV,MX,CNAME,A等多種查詢請求類型。
iodine -fP passwd 96.45.188.252 dnsns.hackbiji.top
-f 前台運行 -D調試級別(輸出相關級別日志)
如果發生在內網,你無法訪問外網IP(96.45.188.252)的時候,可以去掉IP地址,直接通過內網的DNS服務器幫你請求,依然能達到建立隧道的效果。
iodine -fP hackbjipasswd dnsns.hackbiji.top
原理:
在服務端通過TAP虛擬網卡,在服務端建立一個局域網,彼此之間能ping通那種;
在客戶端通過TAP建立虛擬網卡,兩者之間通過dns隧道連接,實現出於同一個局域網,客戶端會出現一個“dns0”的虛擬網卡。
流量分析:
DNS默認使用數據類型為NULL類型,是一種已經過時的記錄類型,現在廢棄了。
3、Cobaltstrike DNS beacon
目標靶機的端口開放情況沒有變化,隱蔽性高。
CC服務器不容易暴露(因為借用了域名服務器可以使用重定向),藍隊需要遞歸dns查詢反向查找。
可以利用mode命令隨時改變數據傳輸通道,例如mode dns使用A記錄傳輸,mode dns6使用AAAA記錄,mode http顯而易見使用http通道等等。
profile idle參數可修改teamserver響應IP
流量分析
流量特征:
超長子域名
Dns默認響應值:0.0.0.0
默認使用TXT格式傳遞base64格式的加密信息