DecoyMini 技术交流社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3798|回复: 0

[工具] 使用 SysmonSimulator 理解 Sysmon 事件

[复制链接]

172

主题

34

回帖

30

荣誉

Rank: 9Rank: 9Rank: 9

UID
2
积分
339
精华
1
沃币
2 枚
注册时间
2021-6-24

论坛管理

发表于 2022-6-9 11:13:45 | 显示全部楼层 |阅读模式
https://rootdse.org/posts/understanding-sysmon-events/#event-id-5-process-terminated

介绍


我想了解 Sysmon 如何检测 Windows 上的各种活动并生成事件日志,因此我创建了一个用 C 编写的工具 SysmonSimulator,它使用 Win32 API 来模拟攻击技术并提供生成 Sysmon 事件日志的说明。威胁检测团队可以使用它来测试 EDR 检测和关联规则。源代码在 Github 上可用,任何人都可以根据自己的要求进行修改以进行测试

此外,很多时候,我需要 SIEM 规则关联的原始事件来测试用例。我曾经搜索为不同攻击场景生成好的、可疑和恶意事件的日志数据所需的工具,以构建针对误报、真假性和漏报的单元测试。这些类型的攻击技术可以使用 SysmonSimulator 进行模拟,通过调用相关的 Windows API 来生成事件日志。我将在这篇文章中使用 Sysmon 作为参考,但你也可以使用 SysmonSimulator 模拟攻击来测试其他 EDR 产品。我将解释 Sysmon 记录的所有事件 ID,以显示生成了哪些类型的日志,以及从监控的角度来看它为何如此重要。

Sysmon


Sysmon 是由 Mark Russinovich 和微软的少数其他贡献者开发的主机级监控和跟踪工具。它是 Sysinternals 套件的一部分,现在归微软所有。 Sysmon 获取有关在系统上执行的操作的大量信息并将它们记录到 Windows 事件查看器中。对威胁检测团队非常有帮助,因为除了现有的 Windows 事件之外,还提供了更多信息,有助于更好地了解针对不同攻击场景的检测。

Sysmon 使用名为 SysmonDrv.sys 的驱动程序和在后台运行的服务。为了捕获附加信息,Sysmon 驱动程序注册多个回调例程以收集由不同 Windows API 执行的活动。Windows 内核使用回调例程将指定的操作通知给 sysmon 驱动程序。Sysmon 还研究了 Windows 事件跟踪 (ETW)。我们将在事件日志部分进一步讨论。为了过滤事件日志中的噪音,可以通过在其配置文件中定义 XML 规则来自定义和微调 Sysmon 的事件日志。

Sysmon 可以从 这里 下载。可以在 此处 阅读有关 Sysmon 功能的更多信息。

要安装 Sysmon 服务和驱动程序,请以管理员身份打开命令提示符并输入以下命令:

  1. sysmon64.exe -i –accepteula
复制代码

或者,如果想使用自定义 XML 配置文件进行安装,可以按如下方式安装:



安装可以验证如下:



以下是可以修改的 Sysmon XML 配置文件的示例:



Sysmon 最好的一点是,它还提供了一个选项,可以通过一组 XML 规则进行更精细和特定的事件日志记录,可以根据检测工程师的要求在其 XML 配置文件中进行修改。

可以参考 Sysmon 的 SwiftOnSecurity XML 配置以获取更多信息 - https://github.com/SwiftOnSecuri ... onconfig-export.xml

安装 Sysmon 后,会删除两个文件:

  • C:\Windows\SysmonDrv.sys
  • C:\Windows\Sysmon64.exe

第一个 SysmonDrv.sys 是 Sysmon 加载的驱动程序,它注册内核通知回调。除了使用遥测 API 和 ETW 之外,Sysmon 在内核对象上设置多个回调,并在系统上的所有卷上设置为 Minifilter 驱动程序,这允许它在文件处理 API 之前查看所有文件系统操作和操作系统。驱动程序在系统启动时由服务加载,该服务在系统启动时运行 Sysmon64.exe,并不断请求驱动程序获取所生成事件的状态。下图展示了 Sysmon 的架构:



Sysmon 事件在事件查看器中可用,如下所示:

Event Viewer -> Applications and Services Logs -> Microsoft -> Windows -> Sysmon -> Operational

Sysmon Simulator


一旦我们在系统上安装和配置了 sysmon,我们将使用 SysmonSimulator 工具来模拟日志并查看它是如何工作的。我已经在 Visual Studio 中编译了代码并打开了帮助部分,如下所示:



SysmonSimulator 需要上述参数列表中的事件 ID (例如:-eid 1),然后调用相关的 Windows API 函数来模拟攻击,并生成 Sysmon 事件日志,可以在 Windows 事件查看器中查看。

Sysmon 必须安装在需要运行 SysmonSimulator 进行测试的系统上,以便在 Event Viewer 中生成所需的事件。

Event ID 1: Process creation


Sysmon 中的进程创建事件提供了有关新创建进程的扩展信息,包括完整的命令行,可以帮助我们更多地了解进程执行。为了帮助所有日志之间的事件关联,有一个称为 ProcessGUID 的字段,它是进程的唯一值。它也链接在其他事件日志中。事实证明,根据父子进程关系以及该进程及其子进程执行的其他活动来发现可疑模式是有用的。事件 ID 1 的额外功能是它还记录文件的完整哈希,这有助于分析人员对已知的错误哈希进行关联或进行声誉检查。

对于这个演示,我保留了 sysmon 配置文件以仅查找由 SysmonSimulator.exe 创建的子进程

  1. <!-- -eid 1: Process Creation -->
  2. <ProcessCreate onmatch="include">
  3.     <ParentImage name="SysmonSimulator ProcessCreate Simulation for WMIC.exe" condition="end with">SysmonSimulator.exe</ParentImage>
  4.     <Image condition="end with">wmic.exe</Image>
  5. </ProcessCreate>
复制代码

当 SysmonSimulator 的事件 ID 1 被执行时,它将使用 CreateProcessA WINAPI 将 SysmonSimulator.exe 的子进程创建为 WMIC.exe,如下图所示:



为了检测进程创建事件,Sysmon 使用 PsSetCreateProcessNotifyRoutine 回调例程来监视由 CreateProcess()CreateProcessAsUser()CreateProcessWithToken()CreateProcessWithLogon() 等 API 执行的进程创建活动。

Event ID 1 - Process Creation - Event data fields and description

FieldDescription
UtcTime创建事件时的 UTC 时间
ProcessGuid产生/创建的进程的 ProcessGuid (child)
ProcessId操作系统用来标识创建的进程 (child) 的进程 ID
Image正在生成/创建的进程的文件路径,也考虑子进程或源进程
FileVersion与主进程 (child) 关联的图像版本
Description与主进程 (child) 关联的图像描述
Product与主进程 (child) 关联的图像所属的产品名称
OriginalFileName来自 PE 标头的 OriginalFileName,在编译时添加
Company与主进程 (child) 关联的图像所属的公司名称
CommandLine传递给与主进程关联的可执行文件的参数
CurrentDirectory没有与进程关联的图像名称的路径
User创建进程的帐户的名称 (child),它通常包含域名和用户名
LogonGuid创建新进程的用户的登录 GUID,可帮助你将此事件与包含相同登录 GUID 的其他事件相关联的值
LogonId创建新进程的用户的登录 ID,可帮助你将此事件与包含相同登录 ID 的其他事件相关联的值
TerminalSessionId用户所属的会话 ID
IntegrityLevel分配给进程的完整性标签
Hashes使用 HashType 字段中的算法的文件的完整哈希
ParentProcessGuid产生/创建主进程 (child) 的进程的 ProcessGUID
ParentProcessId产生/创建主进程 (child) 的进程的进程 ID
ParentImage产生/创建主进程的文件路径
ParentCommandLine传递给与父进程关联的可执行文件的参数
ParentUser创建父进程的帐户的名称,它通常包含域名和用户名

Event ID 2: A process changed a file creation time


在事件 ID 2 中,Sysmon 检测到一种称为 "Timestomping" 的技术,其中文件创建时间被操纵以使其看起来不是最近创建的文件,而是随操作系统一起安装的。在 Windows 上操纵文件时间是一种常见的反取证技术

对于 PoC,我已将 sysmon 配置文件更改为仅查找来自 SysmonSimulator.exe 的文件创建时间事件

  1. <!-- -eid 2: A process changed a file creation time -->
  2.     <FileCreateTime onmatch="include">
  3.         <Image name="SysmonSimulator FileCreateTime modification Simulation for SysmonCreateFileTime.txt" condition="end with">SysmonSimulator.exe</Image>
  4.         <TargetFilename condition="end with">SysmonCreateFileTime.txt
  5.         </TargetFilename>
  6.     </FileCreateTime>
复制代码

当来自 SysmonSimulator 的事件 ID 2 被执行时,它将使用 CreateFileW WINAPI 创建一个新文件作为 SysmonCreateFileTime.txt。然后将使用 SetFileTime 函数将其创建时间更改为过去的日期。



文件创建时间更改不一定表示恶意活动,因为许多进程合法地更改文件的创建时间。

为了检测文件创建时间更改事件,Sysmon 使用 FltRegisterFilter 注册一个微过滤器,以检测任何进程尝试使用 Windows API 函数 SetFileTime 更改文件的创建时间时的活动。

Event ID 2 - File creation time changed - Event data fields and description

FieldDescription
UtcTime创建事件时的 UTC 时间
ProcessGuid更改文件创建时间的进程的进程 Guid
ProcessId操作系统用于识别更改文件创建时间的进程的进程 ID
Image更改文件创建时间的进程的文件路径
TargetFilename文件的完整路径名
CreationUtcTime文件的新创建时间
PreviousCreationUtcTime文件的先前创建时间
User创建文件的帐户的名称,它通常包含域名和用户名

Event ID 3: Network connection


在 Sysmon EventID 3 中,记录了所有 TCP 和 UDP 网络连接,并且每个网络连接都通过 ProcessId 和 ProcessGUID 字段链接到一个进程,这对于关联非常有用。包括一些重要字段,例如源和目标主机名、IP 地址和端口号。

对于 PoC,我已将 sysmon 配置文件更改为仅查找由 SysmonSimulator.exe 通过指定端口号启动的网络连接事件:

  1. <!-- -eid 3 is NetworkConnect-->
  2.     <NetworkConnect onmatch="include">
  3.         <DestinationPort name="SysmonSimulator Network connect Simulation for NMAP" condition="is">31337</DestinationPort>
  4.     </NetworkConnect>
复制代码

当来自 SysmonSimulator 的事件 ID 3 被执行时,它将使用 Winsock 函数创建一个新的 TCP 套接字,连接到 TCP 端口 31337 上的 scan.nmap.org,然后关闭套接字。



通常,事件 ID 3 会生成大量日志,因此应通过为特定进程和端口创建必要的过滤器来适当调整 sysmon XML 配置文件。

为了检测网络连接事件,Sysmon 利用 Windows 事件跟踪 (ETW)。ETW 是内核级跟踪,有助于跟踪和记录用户模式应用程序和内核模式驱动程序引发的事件,以监控应用程序及其行为。Sysmon 利用 "SYSMON_TRACE" 跟踪会话下的 EVENT_TRACE_FLAG_NETWORK_TCPIP 中指定的 ETW 回调 "NT Kernel Logger" 来捕获在后台运行的 TCP /UDP,如下所示:



Event ID 3 - Network connection - Event data fields and description

FieldDescription
UtcTime创建事件时的 UTC 时间
ProcessGuid建立网络连接的进程的进程 GUID
ProcessId操作系统用来识别建立网络连接的进程的进程 ID
Image建立网络连接的进程的文件路径
User建立网络连接的帐户的名称
Protocol用于网络连接的协议
Initiated表示进程是否发起了 TCP 连接
SourceIsIpv6True/False (如果源 IP 是 IPv6 地址)
SourceIp建立网络连接的源 IP 地址
SourceHostname建立网络连接的主机的 DNS 名称
SourcePort源端口号
SourcePortName正在使用的源端口的名称
DestinationIsIpv6True/False (如果目标 IP 是 IPv6 地址)
DestinationIpIP 地址目的地
DestinationHostname被联系的主机的 DNS 名称
DestinationPort目的端口号
DestinationPortName目的端口名

Event ID 5: Process terminated


在事件 ID 5 中,Sysmon 在进程终止时记录进程终止事件。它提供进程的 UtcTime、ProcessGuid 和 ProcessId。对于威胁检测团队,如果进程可能已被对手终止,此事件 ID 可用于与进程启动和关闭事件相关联,还可以通过将进程终止时间与进程创建时间进行比较来衡量进程的生命周期 是时候测试 SIEM 行为规则了。

下面的 XML 配置查找所有进程终止事件:

  1. <!-- -eid 5 is ProcessTerminate-->
  2.     <ProcessTerminate onmatch="exclude">
  3.     </ProcessTerminate>
复制代码

当来自 SysmonSimulator 的事件 ID 5 被执行时,它执行以下步骤:

  • 询问要终止的进程 ID
  • 使用该进程 ID,通过使用 OpenProcess 函数获取目标进程的句柄
  • 将目标进程的句柄传递给 TerminateProcess 函数并终止进程

POC 可以看成如下:



为了检测进程终止事件,Sysmon 使用相同的 PsSetCreateProcessNotifyRoutine 事件注册机制并查找任何进程终止 API,如 ExitThread()ExitProcess()TerminateProcess() 及其相关的 NTAPI。为了验证调用退出进程的特定 Win32 API 时调用了哪个 NT API,我尝试了这些不同的 API 函数来终止进程,最后,ZwTerminateProcess() 被调用,内核终止进程及其所有线程, 并且在事件查看器中记录了进程终止事件。



Event ID 5 - Process terminated - Event data fields and description

FieldDescription
UtcTime创建事件时的 UTC 时间
ProcessGuid终止的进程的进程 GUID
ProcessId操作系统使用的进程 ID 来标识终止的进程
Image终止的进程的可执行文件的文件路径
User创建进程的帐户的名称。 它通常包含域名和用户名

Event ID 6: Driver loaded


在 Sysmon EventID 6 (已加载驱动程序) 中,提供了有关系统上正在加载的驱动程序的信息。此事件将有助于识别基于驱动程序的威胁,例如安装恶意或易受攻击的驱动程序,更重要的是已签名的驱动程序,因为它们提供了一种隐蔽的方式来进行恶意活动。此类活动有各种事件,其中驱动程序被加载到系统上以执行恶意活动,例如 XMRIG coinminer 驱动程序 (WinRing0x64.sys),它来自一个开源项目,通常被攻击者滥用来感染和挖掘比特币。攻击者通常使用内核驱动程序来安装 rootkit 或运行需要在内核级别运行的工具。所以作为防守者,我们应该时刻关注我们环境中的对手。

这是在 Sysmon 配置文件中记录 DriverLoaded 事件的标记:

  1. <DriverLoad onmatch="exclude"></DriverLoad>
复制代码

要仅生成用于测试 SIEM 工具的 DriverLoaded 事件日志,有一种已知方法可以加载由 Microsoft 签名的驱动程序 WdNisDrv.sys。 它在启用 Windows Defender 的实时保护时加载,如下面的屏幕截图所示:



让我们尝试加载非 Microsoft 驱动程序,例如 Mimidrv.sys,它与 Mimikatz 可执行文件一起使用。

Mimikatz 是一个很棒的工具,使用驱动程序来执行很多任务。其中一些如下:

  • 玩 Tokens & Privileges
  • 在系统上执行 BSOD
  • 设置进程的所有权限
  • 显示 SSDT x86 & x64
  • 列出 MiniFilters
  • 列出进程/线程/镜像/注册表的通知回调
  • 系统环境变量集
  • 系统环境变量删除

参考:https://blog.gentilkiwi.com/downloads/mimikatz-rmll.pdf

当我将 mimidrv.sys 加载到非 Microsoft 驱动程序的系统中时,DriverLoaded 事件如下所示:



为了检测驱动程序加载事件,Sysmon 使用 PsSetLoadImageNotifyRoutine 事件注册机制,该机制为此活动注册回调。

Event ID 6 Driver loaded - Event data fields and description

FieldDescription
UtcTime创建事件时的 UTC 时间
ImageLoaded加载驱动的文件路径
HashesSysmon 驱动程序捕获的哈希值
Signed加载的驱动程序是否已签名
Signature驱动签名者姓名
SignatureStatus签名状态

Event ID 7: Image loaded


在 Sysmon 事件 ID 7 中,在特定进程中加载模块时记录信息。这对于监控攻击者使用的可疑库或组合很有用。

这是用于在 Sysmon 配置文件中记录 ImageLoaded 事件的标记。对于 PoC,我只是在寻找由 SysmonSimulator.exe 加载的 crypt32.dll 模块。

  1. <!-- -eid 7 is ImageLoad-->
  2.     <ImageLoad onmatch="include">
  3.         <Image condition="end with">SysmonSimulator.exe</Image>       
  4.         <ImageLoaded condition="end with">crypt32.dll</ImageLoaded>
  5.     </ImageLoad>
复制代码

当 SysmonSimulator 的事件 ID 7 被执行时,它会调用 LoadLibraryA 函数将 crypt32.dll 模块加载到 SysmonSimulator.exe 的地址空间中。这是事件的样子:



可以创建自定义过滤器来搜索进程要加载的特定模块。例如,寻找加载 PowerShell 引擎 System.Management.Automation.dll 的自定义进程。

  1. <ImageLoaded condition="end with">System.Management.Automation.dll</ImageLoaded>
复制代码

为了检测镜像加载事件,Sysmon 使用相同的 PsSetLoadImageNotifyRoutine 事件注册机制,该机制为由 ImageLoad()NtMapViewOfSection()LoadLibrary() 等不同 API 函数执行的所有镜像加载活动注册一个回调。

Event ID 7 Image loaded - Event data fields and description

FieldDescription
UtcTime创建事件时的 UTC 时间
ProcessGuid加载驱动的文件路径
ProcessIdSysmon 驱动程序捕获的哈希值
Image加载的驱动程序是否已签名
ImageLoaded驱动签名者姓名
FileVersion加载的镜像版本
Description加载镜像的描述
Product加载的镜像所属的产品名称
Company加载的镜像所属的公司名称
OriginalFileName来自 PE 标头的 OriginalFileName,在编译时添加
Hashes使用 HashType 字段中的算法的文件的完整哈希
Signed说明加载的镜像是否签名
Signature签名者姓名
SignatureStatus签名状态
User加载镜像的帐户的名称,它通常包含域名和用户名

Event ID 8: CreateRemoteThread


在 Sysmon 事件 ID 8 (CreateRemoteThread) 中,当一个进程使用 CreateRemoteThread 函数在另一个进程中创建线程时会生成日志。恶意软件使用此技术注入代码并隐藏在其他进程中。该事件指示源和目标进程,它提供了有关将在新线程中运行的代码的信息:StartAddress、StartModule 和 StartFunction。

这是用于在 Sysmon 配置文件中记录 CreateRemoteThread 事件的标记。 对于 PoC,我只是在寻找由 SysmonSimulator.exe 创建的远程线程。

  1. <!-- -eid 8 is CreateRemoteThread-->
  2.     <CreateRemoteThread onmatch="include">
  3.         <SourceImage condition="end with">SysmonSimulator.exe</SourceImage>               
  4.     </CreateRemoteThread>
复制代码

当来自 SysmonSimulator 的事件 ID 8 被执行时,它执行以下步骤:

  • 使用 CreateProcessA 函数创建一个新的挂起进程 PING.exe 并获取其进程 ID。
  • 通过传递从创建的进程获取的进程 ID,使用 OpenProcess 函数打开目标进程。
  • 通过将进程 PING.exe 的句柄传递给 VirtualAllocEx 函数,在远程进程中分配内存。
  • 使用 WriteProcessMemory 函数将代码以打印存储在变量 shellcode 中的消息框写入分配的部分。
  • 使用 CreateRemoteThread 函数在远程进程中创建一个新线程来执行 shellcode。

POC 可以看成如下:



在这些类型的事件中,StartAddress 字段显示新线程开始的目标进程的地址。我们可以使用 Process Hacker 来查看该地址中的内容。可以看到,在远程进程中创建了一个新线程,该线程从 SysmonSimulator 加载到目标进程分配的虚拟内存空间中的 MessageBox shellcode 的地址开始。



为了检测 CreateRemoteThreat 事件,Sysmon 使用 PsSetCreateThreadNotifyRoutine 事件注册机制,该机制在创建新线程和删除此类线程时注册回调。

Event ID 8 - CreateRemoteThread - Event data fields and description

FieldDescription
UtcTime创建事件时的 UTC 时间
SourceProcessGuid在另一个进程中创建线程的源进程的进程 GUID
SourceProcessId操作系统用来识别在另一个进程中创建线程的源进程的进程 ID
SourceImage在另一个进程中创建线程的源进程的文件路径
TargetProcessGuid目标进程的进程 GUID
TargetProcessId操作系统用来识别目标进程的进程 ID
TargetImage目标进程的文件路径
NewThreadId目标进程中创建的新线程的 id
StartAddress新线程起始地址
StartModule从线程开始地址映射到PEB加载的模块列表确定的开始模块
StartFunction如果与镜像导出表中的函数完全匹配,则报告启动函数
SourceUser启动远程线程的进程的帐户名称
TargetUser启动线程的进程的帐户名称

Event ID 9: RawAccessRead


当进程使用 \.\ 语法对驱动器执行读取操作时,会记录 Sysmon 事件 ID 9 (RawAccessRead)。这种技术通常被恶意软件用于对被锁定以供读取的文件进行数据泄露,以及避免文件访问审计工具。攻击者使用此技术从主机复制重要文件,例如 NTDS.dit 和 SAM Registry 配置单元,以进行凭据收集。

这是用于在 Sysmon 配置文件中记录 RawAccessRead 事件的标记。对于 PoC,我只是在寻找 SysmonSimulator.exe 的 RawAccessRead。

  1. <!-- -eid 9 is RawAccessRead-->
  2.     <RawAccessRead onmatch="include">
  3.         <Image condition="end with">SysmonSimulator.exe</Image>
  4.     </RawAccessRead>
复制代码

当从 SysmonSimulator 执行 eid 9 时,它会调用 CreateFile() 函数以使用 \.\ 表示法搜索 C 驱动器:



在本次活动中,存在的重要字段是源进程和它试图读取的目标设备。

通常,任何合法进程都不应执行此类活动。主要由正常环境中的备份工具或驱动器映像工具等软件执行。

为了检测 RawAccessRead 事件,Sysmon 使用 FltRegisterFilter 注册一个微过滤器,以检测任何进程尝试使用 \.\ 表示使用 API 读取驱动器时的活动,例如 NtCreateFile()CreateFile()ObpLookupObjectName() 等等。

Event ID 9 - Raw access read - Event data fields and description

FieldDescription
UtcTime创建事件时的 UTC 时间
ProcessGuid从驱动器执行读取操作的进程的进程 GUID
ProcessId操作系统使用的进程 ID,用于识别从驱动器执行读取操作的进程
Image从驱动器执行读取操作的进程的文件路径
Device目标设备
User访问磁盘的帐户的名称,它通常包含域名和用户名

Event ID 10: ProcessAccess


当进程尝试使用 OpenProcess 函数打开另一个本地进程对象时,会记录 Sysmon 事件 ID 10 (ProcessAccess)。这是一种经常在目标进程的地址空间中进行读写的操作。此事件有助于检测读取 lsass.exe (本地安全机构) 等进程的内存内容以窃取凭据的恶意工具。

如果以更高权限打开目标进程,则可以执行诸如从目标进程内存读取数据、修补其内存、进程挖空、在目标进程中创建线程等操作,就像我们在事件 ID 8 (CreateRemoteThread) 中所做的那样 通常由对手执行。

这是用于在 Sysmon 配置文件中记录 ProcessAccess 事件的标记。对于 PoC,我只是在寻找 SysmonSimulator.exe 访问的进程。

  1. <!-- -eid 10 is ProcessAccess-->
  2.     <ProcessAccess onmatch="include">
  3.         <SourceImage condition="end with">SysmonSimulator.exe</SourceImage>
  4.     </ProcessAccess>
复制代码

当来自 SysmonSimulator 的事件 ID 10 被执行时,它执行以下步骤:

  • 向用户询问要访问的目标进程的进程 ID
  • 通过调用 OpenProcess 函数访问进程句柄
  • 关闭句柄并退出

通过传递从创建的进程获取的进程 ID 来打开目标进程 OpenProcess 函数。



我尝试使用 NtOpenProcess NTAPI 函数而不是 WINAPI 函数 OpenProcess 打开进程,sysmon 也检测到了这一点。


在这种情况下,最重要的是 CallTrace,威胁检测团队可以使用它来创建不同的用例。calltrace 在调用 OpenProcess 之前提供 DLL 和调用堆栈中函数的相对虚拟地址,这对于查找调用哪些函数来执行特定操作非常有帮助。

我将演示如何使用 Calltrace 字段来检测使用 MiniDumpWriteDump() 执行的凭据转储。

MiniDumpWriteDump() 是从 DLL dbgcore.dll 导出的函数



它位于 dbgcore.dll 中的偏移量 6cfb,因此我将在 Sysmon 配置中添加此条件,如下所示:

  1.                 <!-- -eid 10 Process accessed (Credential dumping)-->
  2.     <ProcessAccess onmatch="include">
  3.         <SourceImage condition="end with">dumplsass.exe</SourceImage>
  4.         <CallTrace condition="contains" name="Credential dumping performed by using function MiniDumpWriteDump from dbgcore.dll">C:\Windows\SYSTEM32\dbgcore.DLL+6cfb</CallTrace>
  5.     </ProcessAccess>
复制代码

现在,我将通过从自定义程序 dumplsass.exe 调用 MiniDumpWriteDump() 来转储 LSASS 内存。调用该函数后,将生成一个与上述条件匹配的事件日志,如下面的屏幕截图所示:



这是使用 Calltrace 字段检测使用 MiniDumpWriteDump() 执行的凭据转储的示例。同样,可以通过利用来自调用跟踪的信息来创建其他用例。

为了检测 ProcessAccess 事件,Sysmon 使用 ObRegisterCallbacks 注册线程、进程和桌面句柄操作的回调例程列表,以检测任何进程尝试使用 API 打开其他进程的句柄时的活动,例如 [OpenProcess()] (https://docs.microsoft.com/en-us/windows https://exatrack.com/public/SysmonInternals.pdf

Event ID 10 - Process Access- Event data fields and description

FieldDescription
UtcTime创建事件时的 UTC 时间
SourceProcessGUID打开另一个进程的源进程的进程 GUID,它源自机器 GUID、进程启动时间和进程令牌 ID 的截断部分。
SourceProcessId操作系统用来标识打开另一个进程的源进程的进程 ID,部分源自 EPROCESS 内核结构
SourceThreadId源进程中打开另一个进程的特定线程的 ID
SourceImage在另一个进程中创建线程的源进程的文件路径
TargetProcessGUID目标进程的进程 GUID
TargetProcessId操作系统用来识别目标进程的进程 ID
TargetImage目标进程的可执行文件路径
GrantedAccess与为目标进程请求的进程权限关联的访问标志 (位掩码)
CallTrace调用打开进程的位置的堆栈跟踪,包括 DLL 和函数的相对虚拟地址
functions在打开进程调用之前的调用堆栈中
SourceUser运行源进程的帐户的名称
TargetUser运行被访问的目标进程的帐户的名称

Event ID 11: FileCreate


在 Sysmon 事件 ID 11 (FileCreate) 中,在创建或覆盖文件时记录文件的创建和创建文件的进程的信息。此事件对于监视诸如启动文件夹以及临时目录和下载目录等位置很重要,这些位置是恶意软件在初始感染期间丢弃的常见位置。

这是用于在 Sysmon 配置文件中记录 FileCreate 事件的标记。对于 PoC,我只是在寻找由 SysmonSimulator.exe 创建的文件。

  1. <!-- -eid 11 is FileCreate-->
  2.     <FileCreate onmatch="include">
  3.         <Image condition="end with">SysmonSimulator.exe</Image>
  4.     </FileCreate>
复制代码

当来自 SysmonSimulator 的事件 ID 11 被执行时,将使用 CreateFileW WINAPI 创建一个新文件作为 NewFile.bat



如果系统上有另一个 AntiVirus 或 EDR minifilter 驱动程序的高度数范围低于 sysmon,并且它检测到恶意文件并阻止它写入磁盘,则 Sysmon 不会记录该事件,因为该 minifilter 驱动程序将在 Sysmon 之前加载,因为它的高度较低 数范围。

Sysmon 的预定义高度为 385201。我们可以使用 fltmc.exe 检查过滤器驱动程序的高度范围



为了检测 FileCreate 事件,Sysmon 使用 FltRegisterFilter 注册一个微过滤器,以便在任何进程尝试使用 NtCreateFile()CreateFile() 等 API 创建文件时检测活动。

Event ID 11 - File create- Event data fields and description

FieldDescription
UtcTime创建事件时的 UTC 时间
ProcessGuid创建文件的进程的进程 GUID
ProcessId操作系统使用的进程 ID 来标识创建文件的进程 (child)
Image创建文件的进程的文件路径
TargetFilename创建的文件的名称
CreationUtcTime文件创建时间
User创建文件的帐户的名称,它通常包含域名和用户名

Event ID 12: RegistryEvent- Object create and delete


在 Sysmon 事件 ID 12 中,检测到注册表项和值的创建和删除操作,这对于监视注册表自动启动位置的更改或查找注册表项(例如 Run、RunOnce 和其他几个键)的可疑添加非常有用,通过分析 指定注册表项中的所有值,并根据环境中的共性查找异常值。

Sysmon 使用注册表根键名称的缩写版本,具有以下映射:

Key nameAbbreviation
HKEY_LOCAL_MACHINEHKLM
HKEY_USERSHKU
HKEY_LOCAL_MACHINE\System\ControlSet00xHKLM\System\CurrentControlSet
HKEY_LOCAL_MACHINE\ClassesHKCR

这是用于在 Sysmon 配置文件中记录注册表事件的标记。对于 PoC,我只是在寻找由 SysmonSimulator.exe 创建的注册表事件。

  1. <!-- -eid 12,13,14 are RegistryEvent-->
  2.     <RegistryEvent onmatch="include">
  3.         <Image condition="end with">SysmonSimulator.exe</Image>
  4.     </RegistryEvent>
复制代码

当来自 SysmonSimulator 的事件 ID 11 被执行时,它将使用 RegCreateKeyA 函数创建一个新的注册表项作为 TestSysmon



为了检测这些注册表事件,Sysmon 驱动程序使用 CmRegisterCallback 注册一个注册表回调例程,以检测任何进程尝试使用 RegCreateKey()NtCreateKey()NtDeleteKey()RegDeleteTree()RegDeleteValue()RegDeleteKey() 等 API 创建或删除注册表对象时的活动。

提示:查找涉及恶意注册表活动的进程 (例如 - 创建注册表项的 MS Office 宏)

Event ID 12 - Registry event (Object create and delete)- Event data fields and description

FieldDescription
UtcTime创建事件时的 UTC 时间
EventTypeCreateKey 或 DeleteKey
ProcessGuid创建或删除注册表项的进程的进程 GUID
ProcessId操作系统用来标识创建或删除注册表项的进程的进程 ID
Image创建或删除注册表项的进程的文件路径
TargetObject注册表项的完整路径
User访问注册表的帐户的名称,它通常包含域名和用户名

Event ID 13: RegistryEvent- Value Set


Sysmon 事件 ID 13 标识系统上的注册表值修改。此事件记录为 DWORD 和 QWORD 类型的注册表值写入的值。

当来自 SysmonSimulator 的事件 ID 13 被执行时,它将执行以下步骤:

  • 尝试使用 RegOpenKeyExA 打开 TestSysmon 注册表项,如果不存在,它将使用 RegCreateKeyA 函数创建它。
  • 使用 RegSetValueExA 函数设置注册表项下测试值的数据和类型。



为了检测这些注册表事件,Sysmon 驱动程序使用 CmRegisterCallback 注册一个注册表回调例程,以便在任何进程尝试使用 NtSetValueKey()RegSetValue() 等 API 设置注册表对象的值时检测活动。

Event ID 13 - Registry event (Value set)- Event data fields and description

FieldDescription
UtcTime创建事件时的 UTC 时间
EventType设定值
ProcessGuid修改注册表值的进程的进程 GUID
ProcessId操作系统用来识别修改注册表值的进程的进程 ID
Image修改注册表值的进程的文件路径
TargetObject修改后的注册表项的完整路径
Details添加到注册表项的详细信息
User访问注册表的帐户的名称,它通常包含域名和用户名

Event ID 14: RegistryEvent- Key and Value Rename


Sysmon 事件 ID 14 检测注册表项和值重命名操作,并包括已重命名的项或值的新名称。

当来自 SysmonSimulator 的事件 ID 14 被执行时,它将执行以下步骤:

  • 使用 RegCreateKeyA 函数创建新的注册表项 NewRegistrySysmonTesting
  • 使用 RegRenameKey 函数将其重命名为 RegistrySysmonTestingRenamed



有关对注册表对象所做的更改,请参见三个 TargetObject 和 NewName。

为了检测这些注册表事件,Sysmon 驱动程序使用 CmRegisterCallback 注册一个注册表回调例程,以便在任何进程尝试使用 NtRenameKey() 等 API 重命名注册表项或其值时检测活动。

Event ID 14 - Registry event (Key and value rename)- Event data fields and description

FieldDescription
UtcTime创建事件时的 UTC 时间
EventType重命名 key
ProcessGuid重命名注册表值和键的进程的进程 GUID
ProcessId操作系统用来标识重命名注册表值和键的进程的进程 ID
Image重命名注册表值和键的进程的文件路径
TargetObject重命名的注册表项的完整路径
NewName注册表项的新名称
User访问注册表的帐户的名称。 它通常包含域名和用户名

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|小黑屋|DecoyMini 技术交流社区 ( 京ICP备2021005070号 )

GMT+8, 2024-4-29 17:30 , Processed in 0.066962 second(s), 26 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表