渗透技巧——Windows command line process auditing 的绕过

发布于 2024-10-18 12:03:59 字数 5044 浏览 5 评论 0

0x00 前言

command line process auditing 是 Windows 的一项功能,开启该功能后,ID 为 4688 的日志将会记录进程创建时的命令行参数

本文将要介绍通过修改进程参数绕过日志记录的方法,测试开源工具 SwampThing,分享实现 SwampThing 的 C 语言代码,分析利用思路,给出防御建议

SwampThing 的地址:https://github.com/FuzzySecurity/Sharp-Suite/blob/master/SwampThing

0x01 简介

本文将要介绍以下内容:

  • 实现原理
  • 开启 command line process auditing 的方法
  • 测试 SwampThing
  • 通过 c++实现 SwampThing
  • 利用思路
  • 防御建议

0x02 实现原理

方法上同创建傀儡进程类似,区别在于这个方法只修改新进程的 CommandLine 参数

实现思路:

  1. 通过 CreateProcess 创建进程,传入参数 lpCommandLine,传入参数 CREATE_SUSPENDED 使进程挂起
  2. 修改新进程的 Commandline 参数
  3. 通过 ResumeThread 唤醒进程,执行新的 Commandline 参数
  4. 如果新进程没有退出,再将 Commandline 参数还原

在具体实现上,还需要考虑以下问题:

1、进程的选择

启动的进程需要能够加载 Commandline 参数,例如 cmd.exe,powershell.exe,wmic.exe 等

2、修改远程进程的 Commandline 参数

通过 NtQueryInformationProcess 找到远程进程的基地址,计算偏移获得 Commandline 参数的位置,再分别通过 ReadProcessMemory 和 WriteProcessMemory 对 Commandline 参数进行读写

补充:修改当前进程的 Commandline 参数可参考:https://github.com/3gstudent/Homework-of-C-Language/blob/master/MasqueradePEBtoCopyfile.cpp

0x03 开启 command line process auditing

官方文档:https://docs.microsoft.com/en-us/windows-server/identity/ad-ds/manage/component-updates/command-line-process-auditing

该功能默认关闭,需要手动配置来开启

1、执行 gpedit.msc 进入组策略

2、开启进程审核功能

英文系统:

Computer Configuration > Policies > Windows Settings > Security Settings > Advanced Audit Configuration > Detailed Tracking > Audit Process Creation

中文系统:

计算机配置 > 策略 > Windows 设置 > 安全设置 > 高级审核配置 > 详细跟踪> 审核创建进程

3、开启事件日志的额外功能,记录命令行参数

英文系统:

Administrative Template > System > Audit Process Creation > Include command line in process creation events

中文系统:

管理模板 > 系统 > 审核创建的进程 > 在创建事件的过程中包含命令行

开启 command line process auditing 后,在 Windows 日志的 Security 分类下,ID 为 4688 的日志记录进程创建信息

实例如下图

Alt text

通过命令行查询 ID 为 4688 的日志的命令如下:

wevtutil qe security /f:text /q:*[System[(EventID=4688)]]

0x04 测试 SwampThing

地址:https://github.com/FuzzySecurity/Sharp-Suite/blob/master/SwampThing

使用 c#编写

编译成功后需要以下三个文件:

  • SwampThing.exe
  • CommandlLine.dll
  • CommandLine.xml

命令行参数如下:

SwampThing.exe -l C:\Windows\System32\notepad.exe -f C:\aaa.txt -r C:\bbb.txt

启动的 notepad.exe 将会加载 C:\bbb.txt,但通过 ProcessExplorer 查看 notepad.exe 进程的参数为 C:\aaa.txt

如下图

Alt text

开启 command line process auditing 后,ID 为 4688 的日志记录 notepad.exe 进程参数为 C:\aaa.txt

成功绕过 command line process auditing,如下图

Alt text

SwampThing 在实现上只针对执行后不自动退出的进程(例如 notepad.exe),也就是说,通过 ResumeThread 唤醒进程后会再次修改进程参数,将其还原

显而易见,对于执行后就退出的进程(例如 cmd.exe /c),通过 ResumeThread 唤醒进程后,无法再次修改进程参数,将会报错,如下图

Alt text

0x05 通过 c++实现 SwampThing

我通过 c++实现了和 SwampThing 类似的功能,但在细节上有以下不同:

  1. 通过 ResumeThread 唤醒进程后,不再还原进程参数,可适用于 cmd.exe /c
  2. 修改 CreateProcess 创建进程的参数,指定 pStartupInfo->dwFlags 和 pStartupInfo->wShowWindow,隐藏启动进程的界面

代码下载地址:https://github.com/3gstudent/Homework-of-C-Language/blob/master/ProcessCommandlineSpoofing.cpp

代码实现了以下功能:

  • 执行命令 cmd.exe /c start calc.exe
  • 开启 command line process auditing 后,ID 为 4688 的日志记录的进程参数为 cmd.exe /c start notepad.exe

0x06 利用思路

这个方法可以用来隐藏进程的真实参数

在利用上,还可以选择 wmic.exe,正如 SwampThing 提到的那样——使用 wmic 来加载一个 xsl 文件,当然,SwampThing 和我开源的 C 代码都需要修改以后才能实现通过 wmic 加载 xsl

0x07 防御建议

相对于创建傀儡进程,这种方法不需要使用 VirtualAllocEx 申请新的内存,不需要通过 SetThreadContext 设置入口点

通过对比 PE 文件在本地和内存之间是否有区别也无法检测这种方法

在检测上可以尝试查看进程的父进程是否可疑

0x08 小结

本文介绍了通过修改进程参数绕过 command line process auditing 的方法,测试开源工具 SwampThing,分享实现 SwampThing 的 C 语言代码,分析利用思路,最后给出防御建议。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

挽你眉间

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

玍銹的英雄夢

文章 0 评论 0

我不会写诗

文章 0 评论 0

十六岁半

文章 0 评论 0

浸婚纱

文章 0 评论 0

qq_kJ6XkX

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文