NTA告警引发的dll劫持思考(溯源)
目錄
溯源
DLL
DLL Hijacking Vulnerability(DLL劫持漏洞)
DLL劫持攻擊
轉(zhuǎn)發(fā)式劫持
DLL劫持防御?
某天在客戶局點巡檢時,NTA設備發(fā)現(xiàn)了CS的告警:定位了被入侵的主機,觀仔本以為只是普通的一次攻防演練的后遺癥,深入追查后竟發(fā)現(xiàn)其使用了dll劫持技術(shù)進行持久化攻擊,最終觀仔通過聯(lián)動沙箱確認了入侵事件。
直接上溯源過程。
溯源
NTA設備告警:
一般有c2通訊可能會有SYN連接,檢查外聯(lián)SYN連接及對應的進程id:
$ netstat -bn|findstr "SYN_SENT"因為考慮到可能是心跳包,所以執(zhí)行了多次:
查看進程id對應的進程:?
查找進程對應的原始命令:?
在受害機器(win7)的“開始”搜索這個文件:?
將這個dll文件上傳到我們的NTA沙箱,檢出高危,確認出現(xiàn)了dll劫持。?
DLL
動態(tài)庫與靜態(tài)庫
庫是寫好的,現(xiàn)有的,成熟的,可以復用的代碼。現(xiàn)實中每個程序都要依賴很多基礎的底層庫,不可能每個人的代碼都從零開始,因此庫的存在意義非同尋常。
動態(tài)鏈接庫(Dynamic-Link-Library,縮寫dll), 是微軟公司在微軟視窗操作系統(tǒng)中實現(xiàn)共享函數(shù)庫概念的一種實現(xiàn)方式。這些庫函數(shù)的擴展名是.DLL、.OCX(包含ActiveX控制的庫)或者.DRV(舊式的系統(tǒng)的驅(qū)動程序)。
Linux下靜態(tài)庫名字一般是:libxxx.a?window則是:?*.lib、*.h
Linux下動態(tài)庫名字一般是:libxxx.so?window則是:?.dll、.OCX...
例如靜態(tài)庫占用1M內(nèi)存,有2000個這樣的程序,將占用近2GB的空間。另一個方面是如果靜態(tài)庫更新了,使用它的程序需要重新打包,全量更新。
動態(tài)鏈接最直接的好處是磁盤和內(nèi)存的消耗減少,缺點就是容易造成版本沖突,比如不同的應用程序共享同一個dll,而它們需求的是不同的版本,這就會出現(xiàn)矛盾,解決辦法是把不同版本的dll放在不同的文件夾中。
著名的DLL HELL問題:
有些程序只能在老的版本運行,而新的程序需要需要新版本的 DLL。而每個應用程序都安裝一份自己的拷貝,就失去了 DLL 的優(yōu)勢。因為dll的文件沒有一個很好的命名機制, 所以很容易發(fā)生重名 而以前微軟鼓勵把dll安裝在\system目錄下(為了節(jié)省空間), 這樣會發(fā)生很嚴重的問題, 比方說你的sth.dll替換了我的sth.dll。現(xiàn)在微軟已經(jīng)開始建議安裝dll到自己的程序目錄下, 減少了撞車的可能性。
動態(tài)庫的特點:
1)把一些庫函數(shù)的鏈接載入推遲到程序運行的時期。
2)可以實現(xiàn)進程間資源共享。(動態(tài)庫也被成為共享庫)
3)易于升級
DLL Hijacking Vulnerability(DLL劫持漏洞)
如果在進程嘗試加載一個DLL時沒有指定DLL的絕對路徑,那么Windows會嘗試去按照順序搜索這些特定目錄來查找這個DLL,如果攻擊者能夠?qū)阂獾腄LL放在優(yōu)先于正常DLL所在的目錄,那么就能夠欺騙系統(tǒng)去加載惡意的DLL,形成”劫持”,CWE將其歸類為UntrustedSearch Path Vulnerability,比較直譯的一種解釋。
在Windows XP SP2 之前(不包括), 默認未啟用DLL搜索模式。
Windows查找DLL目錄及其順序如下:
1.加載應用程序的目錄。
2.當前目錄。
3.系統(tǒng)目錄。使用GetSystemDirectory函數(shù)獲取該目錄的路徑。
4.16位系統(tǒng)目錄。沒有函數(shù)獲取這個目錄的路徑,但是會搜索它。
5.Windows目錄。使用GetWindowsDirectory函數(shù)獲取該目錄的路徑。
6.PATH環(huán)境變量中列出的目錄。注意,這并不包括App Paths注冊表項指定的每個應用程序的路徑。在計算DLL搜索路徑時,不使用App Paths鍵。
后來為了減輕這個影響,默認情況下,從Windows XP Service Pack 2(SP2)開始啟用安全DLL搜索模式。
1.加載應用程序的目錄。
2.系統(tǒng)目錄。使用GetSystemDirectory函數(shù)獲取該目錄的路徑。
3.16位系統(tǒng)目錄。沒有函數(shù)獲取這個目錄的路徑,但是會搜索它。
4.Windows目錄。使用GetWindowsDirectory函數(shù)獲取該目錄的路徑。
5.當前目錄。
6.PATH環(huán)境變量中列出的目錄。注意,這并不包括App Paths注冊表項指定的每個應用程序的路徑。在計算DLL搜索路徑時,不使用App Paths鍵。
可以看到當前目錄被放置在了后面,對系統(tǒng)dll起到一定的保護作用。
強制關(guān)閉SafeDllSearchMode的方法:
創(chuàng)建注冊表項:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode
值為0
Windows7 之后, 微軟為了更進一步的防御系統(tǒng)的DLL被劫持,將一些容易被劫持的系統(tǒng)DLL寫進了一個注冊表項中,那么凡是此項下的DLL文件就會被禁止從EXE自身所在的目錄下調(diào)用,而只能從系統(tǒng)目錄即SYSTEM32目錄下調(diào)用。注冊表路徑如下:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
但是如果開發(fā)者濫用DLL目錄,依然會導致DLL劫持問題。
常用的手法為:持久化階段,不影響功能,在程序運行目錄下面,原始dll改一個名,用惡意的dll去調(diào)用它。
DLL劫持攻擊
這里介紹一種常用的方式轉(zhuǎn)發(fā)式劫持。
轉(zhuǎn)發(fā)式劫持
這里推薦一個工具 PEview.exe,以wx為例,觀察其啟動需要導入的dll。
在節(jié)點?SECTION.rdata---IMPORT Directory Table下:
上面的幾個dll是受系統(tǒng)保護的重要DLL,寫到注冊表里監(jiān)控了,一般修改難度較大。
注冊表查看哪些DLL受系統(tǒng)保護,且加載路徑固定:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SessionManager\knowndlls
凡是此項下的DLL文件就會被禁止從EXE自身目錄下調(diào)用,而只能從系統(tǒng)目錄,也就是system32目錄下調(diào)用。
如果要改下面的dll,可以隨便選一個dbghelp.dll。
可以使用VS自帶工具查看dll版本:
E:\software\VS2019enterprise\VS2019\VC\Tools\MSVC\14.28.29333\bin\Hostx64\x64>dumpbin.exe /headers C:\Users\Administrator\source\repos\DllTest\Debug\DllTest.dll
使用yeyeshun大佬修改版工具可以進行dll劫持攻擊,并且不影響源程序功能。
選擇對應版本的AheadLib導入dll進行dll轉(zhuǎn)發(fā)(這里選擇轉(zhuǎn)發(fā)自己編寫的測試程序里的DllTest.dll):
原始DLL這里很關(guān)鍵,是要將被劫持的dll重命名為DllTestOrg.dll。
新建一個dll項目,修改dllmain.cpp:
將上一步工具生成的CPP代碼追加復制到dllmain.cpp里。
同時修改dwReason == DLL_PROCESS_ATTACH的代碼,在dll加載時執(zhí)行惡意代碼:
我這里增加了彈窗和彈計算器,payload貼出來:
::MessageBox(NULL, TEXT("OK"), TEXT("OK"), MB_OK); STARTUPINFO si = { sizeof(si) }; PROCESS_INFORMATION pi; CreateProcess(TEXT("C:\\WINDOWS\\System32\\calc.exe"), NULL, NULL, NULL, false, 0, NULL, NUL編譯,將生成的dll重命名為被劫持的dll(DllTest.dll),并放在被劫持的dll程序所在目錄,將被劫持的dll重命名為DllTestOrg.dll用于給新生成的惡意dll調(diào)用。運行原exe,完成劫持:
先彈出OK:
再彈出計算器,并執(zhí)行原程序調(diào)用的功能1+2=3 和彈出OLD。?
DLL劫持防御?
1.調(diào)用第三方DLL時,使用絕對路徑
2.調(diào)用API SetDllDirectory(L"")將當前目錄從DLL加載順序中移除
3.校驗dll MD5
4.使用procmon類監(jiān)控工具。
總結(jié)
以上是生活随笔為你收集整理的NTA告警引发的dll劫持思考(溯源)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。