跳转到帖子

游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

TheHackerWorld官方

Windows XML Event Log(EVTX)Single Log Clearing(V)——通过DuplicateHandle获得日志文件的句柄 删除当前系统的单个日志记录

精选回复

发布于

0x00 前言

Windows单日志清理系列第五篇介绍了删除当前系统单日志记录的第三种方法:枚举当前系统的所有进程,获取指定日志文件的句柄,通过DuplicateHandle复制句柄,获取权限,使用句柄修改日志文件。

0x01 简介

本文将介绍以下内容:

利用理念

程序实现

枚举所有进程以获取指定的文件句柄。

通过DuplicateHandle复制句柄。

开放源代码

0x02 利用分析

上一篇文章《Windows XML Event Log (EVTX)单条日志清除(四)——通过注入获取日志文件句柄删除当前系统单条日志记录》提到,在特定条件下,Windows系统的较高版本不允许保护进程svchost.exe的注入,而我们又不想停止日志服务,怎么办?

我之前的文章《渗透技巧——Windows系统的文件恢复与删除》就涉及到了解决方案。可以尝试通过DuplicateHandle复制句柄,将“伪句柄”转换为真实句柄,获得日志文件的操作权限。

0x03 枚举所有进程,获得指定文件句柄

想法如下:

使用内核API NtQuerySystemInformation查询SystemHandleInformation,获取所有进程的句柄。

过滤掉文件类型的句柄。

如果句柄对应的进程打不开,就留一个标志位,不要重复打开进程。

过滤掉可能导致挂起的句柄,使用API WaitForSingleObject进行判断。

通过NtDuplicateObject获取句柄的名称和具体数值信息,筛选出指定的句柄。

代码参考地址:

https://github . com/3g student/home-of-C-Language/blob/master/enumerate process & GetFile ' shandle & close handle(win 7)。卡片打印处理机(Card Print Processor的缩写)

该代码适用于Win7及更高版本的操作系统,并提供了是否选择关闭句柄的功能。

当然也可以先枚举服务信息,找到日志服务对应的进程,缩小查询范围,再得到日志文件的句柄。想法如下:

枚举服务信息,找到日志服务对应的进程。

使用内核API NtQuerySystemInformation查询SystemHandleInformation,获取所有进程的句柄。

过滤掉日志服务对应进程中的句柄。

通过NtDuplicateObject获取句柄的名称和具体数值信息,筛选出指定的句柄。

这样效率会更高,也不会遇到可能导致暂停的手柄。

代码参考地址:

https://github . com/3g student/home-of-C-Language/blob/master/GetPIDandHandle(evtx)。卡片打印处理机(Card Print Processor的缩写)

代码实现了自动获取日志服务的过程,缩小了查询范围,获得了日志文件的句柄。

0x04 通过DuplicateHandle复制句柄

通过枚举过程获得日志文件的句柄后,发现这是一个“伪句柄”,原因如下:

获取句柄的具体内容需要调用NtDuplicateObject。

重复对象的函数原型:

BOOL WINAPI重复处理(

_In_ HANDLE hSourceProcessHandle,

_In_ HANDLE hSourceHandle,

_In_ HANDLE hTargetProcessHandle,

_Out_ LPHANDLE lpTargetHandle,

_ In _ DWORD dwDesiredAccess,

bInheritHandle,

_In_ DWORD dwOptions

);

官方文件:

https://msdn . Microsoft . com/en-us/library/ms 724251(vs . 85)。aspx

第7个参数dwOptions可以有两个值:

DUPLICATE_CLOSE_SOURCE,0x00000001,关闭源句柄。无论返回任何错误状态,都会发生这种情况。

DUPLICATE _ SAME _ ACCESS0x 00000002忽略dwDesiredAccess参数。重复句柄与源句柄具有相同的访问权限。

另一份参考文件:

https://docs . Microsoft . com/en-us/windows-hardware/drivers/ddi/content/ntifs/nf-ntifs-zwduplicateobject

获取参考信息:

DUPLICATE _ SAME _ ATTRIBUTESInstead不使用HandleAttributes参数,而是将属性从源句柄复制到目标句柄。

参考资料中没有提到DUPLICATE_SAME_ATTRIBUTES的值,这里的猜测是0。

注:

如果读者有更好的回答和解释,希望可以告诉我。

为了保证我们调用NtDuplicateObject遍历句柄时,不会影响到系统中的其他句柄。这里我们先设置dwOptions为DUPLICATE_SAME_ATTRIBUTES(即0),只获取句柄的属性。

参数如下:

NtDuplicateObject(process Handle,(HANDLE)句柄。Handle,GetCurrentProcess(),dupHandle,0,0,0)

找到指定的日志文件句柄后,下一步是操作日志文件。在这里,您需要将dwOptions设置为DUPLICATE_SAME_ACCESS,这意味着完全复制。

用法如下:

NtDuplicateObject(process Handle,(HANDLE)句柄。Handle,GetCurrentProcess(),dupHandle,0,0,DUPLICATE_SAME_ACCESS)

句柄和源句柄具有相同的权限。操作日志文件时,只需将dupHandle传入CreateFileMapping即可。

CreateFileMapping(dupHandle,NULL,PAGE_READWRITE,0,0,NULL);

其余的日志删除操作,请参考之前的系列文章。

完整的代码是开源的,包括两种删除日志的方法:

1、自己解析格式,实现日志删除

地址如下:

https://github.com/3gstudent/Eventlogedit-evtx-Evolution/blob/master/deleterecordbygethandle . CPP

代码实现获取指定日志文件的句柄,通过句柄可以获得日志文件的操作权限,可以删除指定evtx文件的单个日志。

测试下图

4-1.png

2、使用WinAPI EvtExportLog,过滤出想要删除的内容

https://github.com/3gstudent/Eventlogedit-evtx-Evolution/blob/master/deleterecordbygethandleex . CPP

该代码读取指定路径下的日志文件的内容,以覆盖系统日志。

测试下图

4-2.png

通常,日志线程首先被挂起,这样系统就无法继续收集日志。代码地址如下:

https://github.com/3gstudent/Eventlogedit-evtx-Evolution/blob/master/suspendorresumetid . CPP

然后读取系统日志内容,删除指定日志,保存新日志。代码如下:

https://github.com/3gstudent/Eventlogedit-evtx-Evolution/blob/master/DeleteRecord-evtexportlog . CPP

最后,使用DeleteRecordbyGetHandleEx读取新日志,覆盖系统日志,并删除日志。

注:

以上两种方法,删除setup.evtx没有问题,删除system.evtx和security.evtx会因为竞争条件导致删除失败。

0x05 小结

介绍了删除当前系统中单个日志记录的第三种方法:枚举当前系统中的所有进程,获取指定日志文件的句柄,通过DuplicateHandle复制句柄,获取权限,使用句柄修改日志文件。

优点是不需要注入进程svchost.exe,所以不需要考虑保护进程的注入旁路,不需要考虑进程间的信息传递,所以效率更高。

留下回复

创建帐户或登录后发表意见

最近浏览 0

  • 没有会员查看此页面。