精华 Windows 日志攻防之攻击篇
发布于 5 个月前 阅读权限 无需登录 作者 darkray 5654 次浏览 来自 日志分析

Windows 日志攻防之攻击篇

“While you dont know attack, how can u know about defense?”

引言

从防御者视角来说,回溯攻击过程中日志分析是不可或缺的一个环节,国内对此日志方面的攻防探讨甚少,笔者结合自己渗透过程中的一些经验,浅显的谈一谈在攻击者的角度如何来利用日志,希望此文能抛砖引玉,改变国内安全从业者跪舔国外安全研究人员的这种“拿来主义”。

思路

就日志来说,见过不少较为暴力的方式是将整个日志进行删除,此种攻击行为笔者通常称之为不优雅,真正高阶的渗透应该是悄然而入再隐秘而出。因此,可以总结出如下能够在渗透过程中对日志发起的攻击:

  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%\system32\config ,文件扩展名为 evt ,可以通过wmi的nteventlog对象来操作。 NT6中的日志文件结构则类似于XML文档,微软直接提供了一组API对其进行操作,通过翻阅MSDN查到 ( EvTXXXX https://msdn.microsoft.com/en-us/library/windows/desktop/aa385784(v=vs.85).aspx ),NT6下日志文件保存的路径为 %SystemPath%\winevt\logs (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

笔者王者荣耀300场KDA 8.5左右,求一个坑位与靠谱队友,共登最强王者,实现人生理想 :)

34 回复

logmaze.exe能分享下吗?

未来随着企业安全监控做的完善 对抗实时日志采集系统 很有必要啊

@7water 思路写得比较清楚了,其实自己动手能够很快的实现一个,这里不提供Bin

@0c0c0f 实时日志收集对抗这块,还有很多方面需要做的,如果单单针对某一款日志收集的工具去做针对,其实还比较麻烦,有一个通用方式有机会可以分享一下

@darkray 你这个是在搞定机器的前提下删除日志或者不让生成日志啊,那么在你攻击尝试的时候,这个日志肯定是有的啊,这个你就没啥办法了吧,所以在防御这块我觉得日志这块还得采集的实时或者进行日志实时备份啊。

@iswin 对,这个场景只适用于搞定目标后的,阻碍事后回溯攻击过程。在横向移动中,如果同时结合流量侧数据和终端侧日志,能暴露异常的点还是很多的

@darkray 回头给你看下我们的大数据分析平台,基于流量+日志的,对于这种横向移动的,貌似很easy🙂

直接停掉 Windows Event Log 服务不行me ?

感觉选择性日志删除比较好啊。

日志对抗,mark

学习了,mark!!!

好东西,准备照此思路写个工具看看。

大师傅们,Windows 的evtx有啥好用的分析工具么,除了用Windows自带的工具打开外。 logparse不太好使了。

@stone powershell就行了。

可以的,很强势

学习了,mark!!!

@iswin 谢谢啊~ 我试试

学习了,mark!!!

mimikatz下面event::drop 就能暂停日志记录 event::clear清除日志

师傅们好叼!!!

22楼的mimikatz还能日志操作功能还真涨姿势了,这个平台感觉就像另一个另一个wooyun的paper,至少比现有的seebug的paper好一些,有丰富的讨论,期待网站后续发展。

感觉要学习一波

涨姿势!

学习了,mark!!!社区还是蛮给力的~

@zeroplus 有权限要求吗?

看雪好像有一篇win下日志选择性删除的帖子

@stone 可以试试Event Log Explorer

阻止日志产生现成的方案有Invoke-Phant0m 楼上说的mimikatz

当你远程登陆到服务器 日志就已经成了 这条登陆的日志只能靠覆盖日志 或者选择性删除才能抹去

过了这关 之后登陆 只要放个类似于SHITT的后门 登陆前停止日志服务或者进程 在登陆自然悄无声息

然而说了那么多还是要抹去第一批登陆记录的日志

实际工作中安全事件应急响应事件分析linux系统入侵比windows更有趣,因为linux留下的痕迹比较多而且比较复杂,同理入侵后要清除痕迹也比windows繁琐。不过处理linux系统的安全事件比较有趣

非常不错,学习了

@iswin 后来确实是用的powershell,多谢大牛提点

回到顶部