导语:“While you dont know attack, how can u know about defense?”
本文首发于 TreatHubter社区 Windows 日志攻防之攻击篇
引言
从防御者视角来说,回溯攻击过程中日志分析是不可或缺的一个环节,国内对此日志方面的攻防探讨甚少,笔者结合自己渗透过程中的一些经验,浅显的谈一谈在攻击者的角度如何来利用日志,希望此文能抛砖引玉,改变国内安全从业者跪舔国外安全研究人员的这种“拿来主义”。
思路
就日志来说,见过不少较为暴力的方式是将整个日志进行删除,此种攻击行为笔者通常称之为不优雅,真正高阶的渗透应该是悄然而入再隐秘而出。因此,可以总结出如下能够在渗透过程中对日志发起的攻击:
1.有选择性的删除(修改)日志
2.阻止本地日志的产生
3.对抗实时日志采集系统
选择性日志删除实现
我们知道Windows日志是以实体文件保存在磁盘上的,因此可以很容易的想到一个实现选择性修改或者删除日志的方式,既是通过修改文件内容来达到此目的。
Windows日志文件的格式在NT5及NT6上有较大的差异,主要异同如下:
NT5中的日志文件结构为二进制文件,涉及的结构体可以通过翻阅MSDN查到( EVENTLOGHEADER、EVENTLOGRECORD、EVENTLOGEOF 其一地址为 https://msdn.microsoft.com/en-us/library/windows/desktop/aa363646(v=vs.85).aspx ),NT5下日志文件的保存路径为 %SystemPath%system32config ,文件扩展名为 evt ,可以通过wmi的nteventlog对象来操作。
NT6中的日志文件结构则类似于XML文档,微软直接提供了一组API对其进行操作,通过翻阅MSDN查到 ( EvTXXXX https://msdn.microsoft.com/en-us/library/windows/desktop/aa385784(v=vs.85).aspx ),NT6下日志文件保存的路径为 %SystemPath%winevtlogs (x64下需要注意路径映射问题),文件扩展名为 evtx ,可以通过命令 wevtutil 进行相关操作。
要对日志文件进行修改,那么首先需要解决的问题是文件占坑,我们打开调试器之后可以很清楚的看到日志服务的对应的宿主进程为 Services.exe (NT6下为svchost.exe),所调用的动态链接库文件为 eventlog.dll(NT6下为 wevtsvc.dll) ,于是很自然的我们可以通过注入进程的方式来遍历打开的文件句柄,同时挂起动态链接库文件的操作线程,解决占坑之后就可以对日志文件进行删除与修改了。
介于NT5内核的系统已经退出历史舞台,这里也不再做过多讨论,有了结构体说明之后可以很容易的像操作其他二进制文件那样来操作日志文件。刚才说过NT6内核下直接有对应API来完成此日志的操作,所以通过查阅MSDN我们可以很方便的找到对应的API,或者通过读写XML文件的方式(自己解析结构稍微麻烦一点)来进行日志文件的修改。修改完成后保存即可,此后再恢复现场既实现了有选择性的日志删除或者修改。
阻止本地日志的产生
有很多情况下,攻陷了一台Windows终端之后,为了方便我们在此终端上进行的一些猥琐操作,我们不不希望被记录到,除了在事后对先前产生的日志进行有选择的篡改之外,我们还可以用更为粗暴的方式来阻止本地日志的产生。
前面说过对于产生日志的主要服务是哪些,那么我们可以很容易的整理出如下思路来阻止本地日志的产生:
1. 通过遍历进程找到日志服务对应的宿主进程PID
2. 通过甄别加载的动态链接库文件找到对应的线程ID
3. 非常暴力的干掉对应线程
至此,Windows Event Log 服务便失去了它原有的活力的,成为了哑巴 😉
对抗实时日志采集系统
现在越来越多的大型采用ELK架构(ElasticSearch + Logstash + Kibana),通常在Windows又会采用流行的nxlog作为日志采集的agent,那么一个常见的实时日志采集流程如下:
1. nxlog 使用模块 im_file 收集日志文件,开启位置记录功能
2.nxlog 使用模块tcp输出日志
3.logstash 使用input/tcp ,收集日志,输出至es
通过阅读源码可知 nxlog 的tcp通信 apr_socket_send 来发送数据,在Windows对应的动态链接库文件为libapr-1-0.dll,知晓了对应的函数,我们可以很容易的通过注入进程后Hook apr_socket_send 的函数来修改想要传送的数据包,从而达到欺骗实时日志采集系统的目的。
如果需要做得较为完美,可以通过 nxlog 的配置文件来获取其使用何种通道及文件格式来传输日志,针对不同类型的方式,在传输过程中进行Hook(如以上例子中TCP模式),或者在产生日志信息时进行Hook(如大部分情况下会Json)。
写在最后
请欣赏一个简短选择性删除日志的Demo(自备扶梯):
https://www.youtube.com/watch?v=OCIdz7YsDOw&feature=youtu.be