滲透技巧——Windows日誌的刪除與繞過
0x00 前言
在滲透測試過程中,Windows日誌往往會記錄系統上的敏感操作,如添加用戶,遠程登錄執行等。
對於一次完整的滲透測試,通常會選擇對Windows日誌進行清除和繞過,而對於防禦者來說,了解常用的繞過方法也有助於更好的保護自己的系統。
所以本文將要介紹常見的Windows日誌清除與繞過方法,分享經驗,幫助大家。
0x01 簡介
本文將要介紹以下內容:
- Windows日誌的常用清除方法
- Windows日誌的兩種繞過方法
0x02 Windows日誌
Windows日誌包括五個類別:
- 應用程序
- 安全
- Setup
- 系統
- 轉發事件
查看方式:
1、 通過面板
位置如下:
Control Panel\System and Security-View event logs-Windows Logs
如下圖
2、 通過Powershell
常用命令如下:
(管理員權限)
查看所有日誌:
Get-WinEvent
查看應用程序類別下的日誌:
Get-WinEvent -FilterHashtable @{logname="Application";}
0x03 Windows日誌的常用清除方法
1、wevtutil.exe
操作系統默認包含,支持系統:Win7及以上
常用命令如下:
(1) 統計日誌列表,查詢所有日誌信息,包含時間,數目
wevtutil.exe gli Application
操作如下圖
(2) 查看指定類別的日誌內容
wevtutil qe /f:text Application
操作如下圖
(3) 刪除該類日誌所有內容
wevtutil cl Application
操作如下圖
Application日誌全部清除,數目為0
(4) 刪除單條內容
尚不支持
2、NSA DanderSpiritz
DanderSpritz是NSA的一款界面化的遠控工具
相關介紹可參考:
https://3gstudent.github.io/3gstudent.github.io/NSA-DanderSpiritz%E6%B5%8B%E8%AF%95%E6%8C%87%E5%8D%97-%E6%9C%A8%E9%A9%AC%E7%94%9F%E6%88%90%E4%B8%8E%E6%B5%8B%E8%AF%95/
常用命令如下:
(1) 統計日誌列表,查詢所有日誌信息,包含時間,數目
eventlogquery -log Application
(2) 查看指定類別的日誌內容
eventlogfilter -log Application -num 10
(3) 刪除該類日誌所有內容
eventlogclear -log Application
(4) 刪除單條內容
eventlogedit -log Application -record 1
註:
record序號可通過eventlogfilter獲得
0x04 Windows日誌的繞過方法
本文介紹的思路參考自Halil [email protected],地址如下:
https://artofpwn.com/phant0m-killing-windows-event-log.html
繞過原理:
Windows日誌對應於eventlog服務,找到該服務對應的進程svchost.exe,進而篩選出svchost.exe進程中具體實現日誌功能的線程,調用TerminateThread結束線程,破壞日誌記錄功能
特別的地方:
由於只結束了實現日誌功能的線程,所以Windows Event Log服務沒有被破壞,狀態仍為正在運行
繞過方法一
1、 定位eventlog服務對應進程svchost.exe的pid
2、 遍歷該進程中的所有線程
3、 判斷線程是否滿足條件
Windows Event Log 服務需要調用wevtsvc.dll,完整路徑為%WinDir%\System32\wevtsvc.dll
並且,如果線程調用了wevtsvc.dll,就可以判讀該線程實現了日誌記錄功能
4、 結束線程
使用TerminateThread
註:
Halil [email protected],完整代碼可參考:
https://github.com/hlldz/Invoke-Phant0m
powershell腳本執行後,Windows日誌功能失效,無法記錄日誌,操作如下圖
5、 恢復方法
結束進程svchost.exe
重新開啟Windows Event Log 服務:
net start eventlog
操作如下圖
繞過方法二
1、 定位eventlog服務對應進程svchost.exe的pid
powershell代碼如下:
Get-WmiObject -Class win32_service -Filter "name = ‘eventlog‘" | select -exp ProcessId
找到svchost.exe的pid為7008,如下圖
2、 遍歷該進程中的所有線程
使用PsList
下載地址:
https://technet.microsoft.com/en-us/sysinternals/bb896682.aspx
具體參數如下:
pslist.exe /accepteula -d 7008
獲取進程svchost.exe中的所有線程,如下圖
3、 判斷線程是否滿足條件
獲取線程對應的服務,如果為eventlog,則滿足條件
使用工具:ScTagQuery
下載地址:
http://www.winsiderss.com/tools/sctagquery/sctagqry.zip
具體參數如下:
sctagqry.exe -t 7928
根據返回的結果Service Tag,判斷線程對應的服務
找到對應eventlog的線程,如下圖
線程8136符合條件,依次嘗試,直到獲取所有符合條件線程
註:
使用Process Explorer可以簡化此過程
找到eventlog服務對應進程svchost.exe
如下圖
右鍵查看屬性,選擇Threads標簽,查看線程,可直接獲得線程對應的服務
如下圖
符合條件的線程TID為:
- 8136
- 8052
- 6708
- 2316
- 6356
4、 結束線程
調用TerminateThread
通過c++實現,部分代碼如下:
int main(int argc, char* argv[])
{
printf("TerminateThread TID:\n");
for(int i=1;i<argc;i++)
{
printf("%s\n",argv[i]);
HANDLE hThread = OpenThread(0x0001, FALSE,atoi(argv[i]));
if(TerminateThread(hThread,0)==0)
printf("[!] TerminateThread Error, TID: %s \n",argv[i]);
CloseHandle(hThread);
}
return 0;
}
完整代碼已上傳至github,地址如下:
https://github.com/3gstudent/Windwos-EventLog-Bypass/blob/master/TerminateEventLogThread.cpp
控制臺支持傳入多個參數,向其傳入5個TID: 8136 8052 6708 2316 6356
自動結束對應線程,日誌功能失效
具體操作如下圖
註:
稍後我會在github上更新該繞過方法的完整實現代碼,地址如下:
https://github.com/3gstudent/Windwos-EventLog-Bypass
0x05 補充
1、安裝sysmon可對Windows日誌功能進行擴展
相關介紹和繞過思路可參考;
https://3gstudent.github.io/3gstudent.github.io/%E9%80%9A%E8%BF%87APC%E5%AE%9E%E7%8E%B0Dll%E6%B3%A8%E5%85%A5-%E7%BB%95%E8%BF%87Sysmon%E7%9B%91%E6%8E%A7/
2、繞過方法僅針對Windows日誌
對應用程序和服務日誌失效,例如Windows Powershell
如下圖
0x06 小結
本文對Windows日誌的清除和繞過方法做了介紹,希望能夠幫助大家,接下來會分享繞過方法二的具體程序實現方法。
滲透技巧——Windows日誌的刪除與繞過