動态連結庫(DLL)的方式以及Windows API訓示使用它們的方式都可以用作任意代碼執行的接口,并協助惡意行為者實作其目标。
動态連結庫是Microsoft實施共享庫的産品。
這些庫通常具有檔案擴充名DLL,并且它們也是PE檔案,與exe檔案完全一樣。
DLL可以包含PE檔案可以包含的任何類型的内容,這些内容可能與代碼,資源或資料的任何組合不同。
DLL主要用于在系統上的應用程式和程序之間共享此内容,以便在為Windows建立應用程式時為程式員提供高度的靈活性。
DLL以相同的通路權限在調用過程的記憶體中執行。這意味着,如果DLL包含任何異常,則不會為調用EXE提供任何保護。惡意攻擊者可以通過使用諸如DLL劫持或DLL代理之類的方法來執行其惡意代碼來利用這一事實。
DLL搜尋順序簡介
在整個日常工作中,我們将大量流程加載到我們的系統中。使用Windows作業系統時,程序加載算法的關鍵步驟包括将動态連結庫(DLL)加載到記憶體中,以利用其功能并滿足其程序與DLL之間的依賴關系。每當啟動程序時,都會發生此操作。
Windows作業系統可能包含同一DLL的大量版本。由于一個系統可能承載可能需要同一個DLL的許多程序這一事實,是以應采用一種系統來確定從正确的路徑加載所需的DLL,同時確定已找到該DLL的最相關版本。
應用程式制造商通過使用LoadLibraryExA或LoadLibraryA函數來使用加載特定庫的操作。這些函數接收一個路徑參數,該參數導緻所請求的DLL,并向調用過程傳回子產品的句柄。
1.目前目錄
2.啟動過程的目錄
3.C:\ Windows \ System32
4.C:\ Windows \ System
5.C:\ Windows
6.“ PATH”的SYSTEM環境變量中包含的目錄
7.USER環境變量“ PATH”中包含的目錄
DLL攻擊
DLL包含要由加載過程執行的代碼,這會造成一種情況,即可以利用丢失的DLL或以不安全的方法實作的DLL來誘騙正在運作的系統執行惡意有效負載,在這種情況下,它利用本機DLL搜尋順序。惡意行為者可能會使用此技術來加載自己的DLL,該DLL可能包含任何類型的代碼。
攻擊利用過程
當我們确定某個程序按某個搜尋順序搜尋DLL,并且缺少DLL 或者錯誤實作的DLL的程序之後,才能夠進行下一步攻擊
第一步:确定DLL
首先,我們從Sysinternals設定ProcMon來篩選未找到以DLL結尾的路徑的任何操作:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SZmlDNiRDO1YmZhRGO3IzY3UmYxcjZ3IWZxYzYzY2M58CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
ProcMon下載下傳:https://docs.microsoft.com/en-us/sysinternals/downloads/procmon
我們可以看到“ Bginfo64.exe”找不到的對應DLL。
第二步:查找DLL和利用
在查找這些DLL時,得出的結論是Riched32.DLL是非本地DLL,是以,系統資料庫中沒有該DLL的預設搜尋路徑。但是如果我們正确配置它,系統最終也會加載它。
現在所需要做的就是在請求的路徑中建立該DLL:
那麼我們在請求路徑中建立該DLL(Riched32.dll),為了友善示範,我們的DLL
如果執行了,就彈窗 hello HBT黑白天 來證明我們的DLL可以執行指令
#define WIN32_LEAN_AND_MEAN#includeextern "C" __declspec(dllexport)DWORD WINAPI MessageBOXThread(LPVOID lpParam){ MessageBox(NULL,"hello hbt 黑白天","hello hbt 黑白天" , NULL); return 0;}extern " C" __declspec(dllexport)BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){switch (ul_reason_for_call){ case Dll_PROCESS_ATTACH; CreateThread(NULL,NULL,MessageBOXThread,NULL,NULL,NULL,NULL); break; case DLL_THREAD_ATTACH: case DLL_THREAD_ATTACH: case Dll_PROCESS_ATTACH: break;}return TRUE; })
我們把這個DLL命名為Riched32.dll放進Bginfo64.exe的DLL檔案夾中。
然後重新打開程序“ Bginfo64.exe。
出現該消息框,并且我們可以觀察到該程序加載了DLL:
那如果我們的DLL中包含惡意代碼呢。是不是可以繼承Bginfo64.exe執行指令??
最後一步:拿一個shell
确定了程序和易受攻擊的路徑之後,所缺少的就是建立我們希望執行的DLL有效負載。
我們可以使用一個“ DLLicious”的工具(https://github.com/J3wker/DLLicous-MaliciousDLL)來快速編譯包含的shell的DLL
用法
用法非常簡單,隻需使用Python3或“。\ DLLicous.py”運作腳本
我們可以使用
1.用C語言将反向Shell編寫DLL
2.Base64nc.exe 對NC二進制檔案進行編碼和解碼,然後将其寫入
DLL的工作目錄中,然後從該目錄中發起攻擊。另一個新功能是:nc.exe在DLL中也包含base64代碼,而不是從Web下載下傳或從SMB伺服器複制它。
通過使用PowerShell和DLL代碼中包含的NetCat的反向Shell
并嘗試與kali上的偵聽器聯系,然後使用PowerShell打開shell
我們可以看到執行劫持的程序後,将加載DLL并打開shell:
https://www.cynet.com/attack-techniques-hands-on/dlls-and-ways-they-can-hurt-us/
https://github.com/J3wker/DLLicous-MaliciousDLL
https://docs.microsoft.com/en-us/sysinternals/downloads/procmonhttps://docs.microsoft.com/en-us/sysinternals/downloads/procmon
滲透測試 紅隊攻防 免殺 權限維持 等等技術
及時分享最新漏洞複現以及EXP 國内外最新技術分享!!!
進來一起學習吧