背景
根据卡巴斯基发布的研究报告发现一项恶意活动,其中的技术涉及将shellcode直接放入Windows事件日志,Windows事件日志可以被攻击者用来掩盖特洛伊木马病毒的恶意使用。实现了”无文件”攻击技术,下面就利用该涉及的技术,简单尝试一下。
前置知识
Windows事件日志
Windows默认事件日志查看器为eventvwr.msc,能实现简单的使用,Win+R键后输入eventvwr回车即能打开。Windows主要的日志在“Windows 日志”中,该文件夹中包含所有Windows系统上的五个标准类别。比较常用的Windows日志有系统日志、安全日志、应用程序日志这三个日志内容。
- 应用程序
- 安全
- Setup
- 系统
- Forwarded Events
事件查看器的另一个“应用程序和服务日志”文件夹里,包含Windows系统中其它各类重要服务组件的事件日志。Windows PowerShell日志在该集合中。
Windows事件日志文件实际上是以特定的数据结构的方式存储内容,每条记录事件的数据结构由9个字段组成,包括日志名称、来源、记录时间、事件ID、任务类别、级别、计算机、事件数据(EventData)等信息。其中事件数据仅支持消息和二进制数据。
写入事件日志
我们可以使用PowerShell操作Windows事件日志,其中Write-EventLog命令可以将事件写入事件日志,参考微软官方文档,其中参数对应上面介绍的字段:
执行命令
在事件查看器中,可以看到事件ID为65535的日志成功创建在应用程序日志中,消息为Hello World!
简单复现
写入载荷
只需在Write-EventLog中使用-RawData参数,就可以在事件日志字段中包含二进制数据,而且必须将二进制数据作为字节数组传到-RawData参数中。我们可以将其包含数据的十六进制字符串转换为字节数组,然后再传递。
首先,使用msfvenom生成弹计算器 payload。输出格式为十六进制字符串
利用工具网站转为字节数组
使用密钥管理服务日志和KmsRequests作为源进行事件日志写入。
执行后,Payload已成功存储到事件日志当中。于事件日志的详细信息就能查看到。
执行载荷
为了提取并执行写入的载荷,这边用非常简单的C++程序和Python脚本进行证明,代码放在这里。
用Visual Studio编译PoC代码后放在环境中执行,从”隐藏”在事件日志Key Management Services的第一条日志中提取二进制载荷数据并且成功执行。过程中defender并未对其进行告警。
另外使用Python的win32evtlog实现读取事件日志内容,然后也用非常常见的shellcode注入技术执行该载荷。
同样成功执行隐藏在事件日志中的载荷:
可以看到,对Windows事件日志写入和读取Shellcode,都是使用合法的API调用,所以能借此很好的对载荷进行隐藏。作为一种持久化方法,还是能有更好的玩法。例如配合DLL搜索顺序劫持加载恶意代码等。
注意事项
用户限制
事件日志的写入权限问题。为了能在事件日志条目中存储有效负载,我们拿到的权限必须要能写入日志。
大小限制
需要注意的另一个限制是,事件日志中可以存储的数据量有大小限制。基于事件消息字符串的最大字符限制为31,839个字符。
更持久
在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\对应的日志名称下的条目中,存在一个EventMessageFile属性。如果在注入载荷的时候,事件ID不存在于该属性指定的源关联的事件消息文件中,则会出现下图这个日志消息:
为了能够更加的持久化不被发现,事件ID和级别等字段都应该伪装成日常日志的样子,以免被应急人员察觉到异常。
参考:
https://threatpost.com/attackers-use-event-logs-to-hide-fileless-malware/179484
https://securelist.com/a-new-secret-stash-for-fileless-malware/106393
https://learn.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-readeventloga
本文作者:supersaiyan, 转载请注明来自FreeBuf.COM