KaiWn 发布于2022年11月8日 分享 发布于2022年11月8日 0x00 前言 之前的文章《渗透技巧——Windows日志的删除与绕过》介绍了清除和绕过Windows日志的常用方法,但没有提到清除单个日志。 本次结合刚刚完成的关于清除Windows XML事件日志(EVTX)单条日志的系列文章,介绍了渗透测试中清除Windows XML事件日志(EVTX)单条日志的具体使用方法,并基于利用思路给出了一些防御建议。 Windows事件日志(evtx)单一日志清除系列文章的地址: Windows事件日志(evtx)单一日志清除(一)——删除思路和示例 Windows事件日志(evtx)单日志清除(II) ——程序删除EVTX文件的单日志记录 Windows事件日志(EVTX)单一日志清除(III) ——通过删除文件占用来删除当前系统的单一日志记录 Windows事件日志(EVTX)单日志清除(IV) ——通过注入日志文件句柄删除当前系统的单日志记录。 Windows事件日志(evtx)单条日志清除(5) ——通过DuplicateHandle获取日志文件句柄,删除当前系统的单条日志记录。 0x01 简介 本文将介绍以下内容: 通过命令行获取日志信息。 通过命令行导出日志文件 用修改后的日志文件覆盖原始系统文件。 细节和注意事项 辩护建议 0x02 通过命令行获得日志信息 1、获得Security的最近十条日志 wevtutil.exe量化宽松证券/f:text /rd:true /c:10 2、获得Security的前十条Security日志: wevtutil.exe量化宽松证券/f:text /c:10 注: 文本视图不输出EventRecordID。 您可以通过查看xml格式来获取日志的相应EventRecordID。 wevtutil.exe QE安全/f:xml /rd:true /c:10 注: 默认视图是xml,因此该命令可以缩写为: wevtutil.exe量化宽松证券/rd:true /c:10 参考的官方文件: https://docs . Microsoft . com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-和-2012/cc732848(v=ws.11) 0x03 通过命令行导出日志文件 导出的日志文件可以下载并在本地打开,后缀为evtx。 1、导出Security所有日志并保存为1.evtx wevtutil.exe EPL安全1.evtx 2、过滤日志并保存 (1)删除单条日志并保存 在Security (EventRecordID=1112)下删除一个日志,并将其另存为1.evtx wevtutil EPL Security 1 . evtx '/q:*[System[(event recordid!=1112)]]' (2)删除多条并保存 1. 根据EventRecordID筛选 删除Security下的几个日志(EventRecordID为13030、13031、13032),结果保存为1.evtx wevtutil EPL Security 1 . evtx '/q:*[System[(event recordid 13032)或(EventRecordID13030)]]' 2. 根据SystemTime筛选 注: 时间系统Time需要考虑时区的影响。 通过wevtutil查询日志信息。当输出格式为文本时,时间不考虑时区。 通过Windows界面查看日志信息,显示的时间不考虑时区。 日志信息通过wevtutil查询,输出格式为xml时,系统时间考虑时区。 示例: 通过wevtutil查询最新日志的时间,输出格式为文本,如下图所示 日期是2018-08-09T20: 22: 20.558。 通过Windows界面查看上次日志的时间,如下图所示 时间是2018-08-09T20:22:20.558。 通过wevtutil查询最新日志的时间,输出格式为xml,如下图所示 时间是system time=' 2018-08-10t 03:22:20:200 z ' 相隔七个小时。 因此,在删除指定日期的日志时,需要检查xml格式并获取SystemTime。 删除SystemTime在2018-08-10T03:20:00和2018-08-10T03:21:00之间的日志,并将结果保存为1.evtx。 wevtutil EPL Security 1 . evtx '/q:*[System[time created[@ System time ' 2018-08-10t 03:21:00 '或@ System time ' 2018-08-10t 03:20:00 ']]' 0x04 将修改后的日志文件覆盖系统原文件 删除一个或一些日志后,您需要用修改后的日志文件覆盖原始系统文件。 可以使用以下三种方法 1、通过解除文件占用 详情请咨询《Windows XML Event Log (EVTX)单条日志清除(三)——通过解除文件占用删除当前系统单条日志记录》。 实现思路如下: 结束日志进程 释放日志文件句柄 替换日志文件 重新启动日志服务 本文中的代码需要稍加修改。修改后的代码可以参考: https://github . com/3g student/home-of-C-Language/blob/master/DeleteRecordbyTerminateProcess(replace file)。卡片打印处理机(Card Print Processor的缩写) 代码实现了结束日志进程,释放日志文件句柄,替换指定的日志文件,最后重新启动日志服务。 2、通过注入 详情请咨询《Windows XML Event Log (EVTX)单条日志清除(四)——通过注入获取日志文件句柄删除当前系统单条日志记录》。 实现思路如下: (1)Loader 将dll注入日志进程 创建三个内存映射,将日志文件的句柄、新日志文件的长度和新日志文件的内容传递给dll。 释放Dll 关闭内存映射 可供参考的代码: https://github.com/3gstudent/Eventlogedit-evtx-Evolution/blob/master/Loader-evtexportlog . CPP (2)Dll 从内存映射中读取内容,以获得日志文件的句柄和新日志文件的内容。 调用MapViewOfFile()函数将文件数据映射到进程的地址空间。 修改内存数据并用新日志文件的内容覆盖它。 调用函数FlushViewOfFile()将内存数据写入磁盘。 关闭日志文件的内存映射。 可供参考的代码: https://github.com/3gstudent/Eventlogedit-evtx-Evolution/blob/master/Dll-evtexportlog . CPP 3、通过DuplicateHandle 详情请咨询《Windows XML Event Log (EVTX)单条日志清除(五)——通过DuplicateHandle获取日志文件句柄删除当前系统单条日志记录》。 实现思路如下: 枚举所有进程以获取指定的文件句柄。 通过DuplicateHandle复制句柄。 调用MapViewOfFile()函数将文件数据映射到进程的地址空间。 修改内存数据并用新日志文件的内容覆盖它。 调用函数FlushViewOfFile()将内存数据写入磁盘。 关闭日志文件的内存映射。 可供参考的代码: https://github.com/3gstudent/Eventlogedit-evtx-Evolution/blob/master/deleterecordbygethandleex . CPP 0x05 完整实现流程 1、挂起日志线程,使当前系统不再记录日志 可供参考的代码: https://github.com/3gstudent/Eventlogedit-evtx-Evolution/blob/master/suspendorresumetid . CPP 该代码支持三种操作,即挂起、恢复和终止。 2、过滤日志并保存 两种方法 (1)通过筛选条件删除指定的日志 方法可以参考0x03。 优势: 简单高效 缺点: 删除指定的日志后,后续日志的事件记录id不会更新。如果逐个比较日志的event recordids,可以发现被删除日志的数量和时间范围。 (2)自己实现 可供参考的代码: https://github.com/3gstudent/Eventlogedit-evtx-进化/blob/master/deleterecordoffile . CPP 好处是不留痕迹。 缺点是实现起来比较麻烦,在各种情况下需要考虑多个组块。 3、覆盖系统原日志文件 三种方法: (1)通过解除文件占用 在某些情况下,关闭Eventlog进程并重新启动服务Eventlog会生成日志文件,这些文件位于系统下,事件id为7034和7036。 您可以选择在日志重新启动后立即挂起线程,以避免日志被记录。参考代码: https://github.com/3gstudent/Eventlogedit-evtx-Evolution/blob/master/suspendorresumetidex . CPP 当日志进程不存在时,程序将一直等待。 (2)通过注入 存在注入失败或拦截的情况。 存在导致删除失败的竞争条件。 (3)通过DuplicateHandle 存在导致删除失败的竞争条件。 综上,共介绍了2*3=6种删除单条日志的方法。 补充: 缺省配置powershell v5.0或更低版本将在启动powershell时生成日志,该日志位于% systemroot % \ system32 \ wine vt \ logs \ windows powershell . evtx中 该日志不记录具体的脚本内容,但包括powershell.exe的启动时间。 挂起日志线程不会阻止日志的生成。 可以用一种方法清除日志。 powershell更高版本的日志旁路可以参考文章: https://www . MD sec . co . uk/2018/06/exploring-powershell-amsi-and-logging-evasion/ 4、恢复日志线程,恢复日志记录功能 可供参考的代码: https://github.com/3gstudent/Eventlogedit-evtx-Evolution/blob/master/suspendorresumetid . CPP 0x06 防御建议 当攻击者获得系统的完全权限时,系统的登录功能也会失效,可以关闭和修改。 因此,在取证中,日志不再可信,可以选择定期将日志备份到远程服务器。 0x07 小结 介绍了Windows XML事件日志(EVTX)在渗透测试中的具体使用,并基于使用思路给出了一些防御建议。 留下回复 链接帖子 意见的链接 分享到其他网站 更多分享选项…
推荐的帖子