之前看到一篇關於Lsass內存dump的文章,學習記錄一下。
lsass.exe(Local Security Authority Subsystem Service)進程空間中,存有着機器的域、本地用戶名和密碼等重要信息。如果獲取本地高權限,用戶便可以訪問 LSASS 進程內存,從而可以導出內部數據(password),用於橫向移動和權限提升。
Windows環境中,一款知名的開源工具Mimikatz(開發者為Benjamin Delpy)可以從 LSASS 內存數據中提取用戶名和密碼。但是直接運行相應工具,可能會被本地AV產品檢測到,因此 dump LSASS 進程內存后進行回傳變得原來越常見。
Dump LSASS 的已知方法
1. 微軟簽名文件
-
ProcDump
ProcDump是微軟簽名的合法二進制文件,被提供用於轉儲進程內存。
-
任務管理器
打開任務管理器,選中目標進程,右鍵菜單中點擊“創建轉儲文件”,文件保存為%temp%\<進程名>.dmp。
-
ProcExp
和ProcDump同屬於Windows提供的合法工具,該程序可以認為是任務管理器的升級版,同樣是右鍵選中目標進程后創建轉儲文件,包括 Minidump 和 Full Dump 兩種。如果是要竊取 LSASS 中的用戶登錄憑據,應選擇全部DUMP。
-
SQLDumper
SQLDumper.exe包含在Microsoft SQL和Office中,可生成完整轉儲文件。
-
Comsvcs.dll
每個Windows系統中都可以找到該文件,可以使用Rundll32執行其導出函數MiniDump實現進程的完全轉儲。
-
CreateDump.exe
.NET5中提供的工具。
2. 其他工具/方法
- PowerSploit的模塊之一Out-MiniDump
- Process Hacker
- AvDump.exe(Avast反病毒產品組件)
3. 全內存轉儲(指的是整個RAM內存空間進行轉儲,耗時長且占磁盤空間大)
- WinPmem
- RowCopy(從 hiberfil.sys 導出憑據)
- 從 VMEM/VMSN 中獲取憑據,這二者是虛擬機內存存儲文件
4. 自定義轉儲
- MiniDumpWriteDump方法,導出自dbghelp.dll,該API調用 NtReadVirtualMemory 讀取目標進程內存數據
- MiniDumpWriteDump + PssCaptureSnapshot,后者可用於獲取目標進程的內存快照,之后調用MiniDumpWriteDump將從獲取的快照內存中讀取數據,而不是直接從目標進程中獲取,更容易躲避AV/EDR檢測。
一種DUMP LSASS的新方式
該技術和Werfault.exe進程有關,在某個運行中的進程崩潰時,werfault.exe將會Dump崩潰進程的內存,從這一點看,可以利用該行為進行目標進程內存的Dump。
這種方法依賴於Win7開始引入的一種被稱為“靜默進程退出”的機制,該機制提供了在兩種情況下可以觸發對被監控進行進行特殊動作的能力:
(1)被監控進程調用 ExitProcess() 終止自身;
(2)其他進程調用 TerminateProcess() 結束被監控進程。
經過配置,在觸發"靜默進程退出"機制時,可被支持的幾個動作包括:
- 啟動一個監控進程
- 顯示一個彈窗
- 創建一個Dump文件
這里主要討論第3種方式,即創建DUMP文件。
要對一個進程設置”靜默退出“監控,需要對幾個注冊表項進行預置:
-
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\<被監控進程名>\ 注冊表項下的GlobalFlag值:0x200(FLG_MONITOR_SILENT_PROCESS_EXIT);
-
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit\<被監控進程名>\ 注冊表項下的3個鍵值:
1)ReportingMode(REG_DWORD),該值可設置為以下幾個,具有不同功能:
a)LAUNCH_MONITORPROCESS (0x1) – 啟動監控進程;
b)LOCAL_DUMP (0x2) – 為導致被監控進程終止的進程和被監控進程本身 二者 創建DUMP文件;
c)NOTIFICATION (0x4) – 顯示彈窗。2)LocalDumpFolder (REG_SZ) – DUMP文件被存放的目錄,默認為
%TEMP%\\Silent Process Exit
;3)DumpType – 根據 MINIDUMP_TYPE 枚舉值指定DUMP文件的類型 (Micro, Mini, Heap 或 Custom) ,完全轉儲目標進程內存的值為
MiniDumpWithFullMemory
(0x2)。
那么現在只需要終止目標進程即可獲得相應文件的DUMP文件,但是我們的目的是為了獲取LSASS進程中的管理員登錄憑據,而kill掉LSASS意味着系統將重啟。不僅增大了被發現的風險,還可能導致程序無法再次運行。
那么是否具有可以觸發”Silent Process Exit“機制但又不實際終止被監控進程的方法呢?還是有的。根據作者所述,它參考了博客 Hexacorn’s blog(該博客發布過大量Windows平台利用技術的研究文章) 。從中可知,當進程終止時,它將從ntdll.dll調用 RtlReportSilentProcessExit API,該API將與Windows錯誤報告服務(WerSvcGroup下的WerSvc )通信,以告知當前進程正在執行靜默退出。然后,WER服務將啟動WerFault.exe轉儲當前進程。值得注意的是,調用此API不會導致進程退出。這可以讓我們在LSASS進程上執行DUMP動作而不導致LSASS的終止。
NTSTATUS(NTAPI* RtlReportSilentProcessExit) (
_In_ HANDLE ProcessHandle,
_In_ NTSTATUS ExitStatus
);
作者使用兩種方式,一種是直接調用RtlReportSilentProcessExit,一種是遠程在LSASS中創建線程執行RtlReportSilentProcessExit。這里我只嘗試直接調用RtlReportSilentProcessExit,注入其他進程動作太多了(懶)。
通過Procmon觀察一下,可知進程順序是 lsassdump.exe->svchost.exe (WerSvcGroup)->WerFault.exe,由運行級別為high的Wefault.exe進行dump文件創建。
檢測方法就看攻擊過程分析一一識別。
關於另一個使用Silent Process Exit進行持久化駐留的手法,個人感覺純粹為了持久化的話感覺沒有那么實用,倒不如用於惡意進程被刪除時進行保護,比如重啟或是延遲重啟、重命名移動重啟等等,不過如果對於專業人員沒啥用。
參考
https://www.deepinstinct.com/2021/01/24/lsass-memory-dumps-are-stealthier-than-ever-before/
https://www.deepinstinct.com/2021/02/16/lsass-memory-dumps-are-stealthier-than-ever-before-part-2/