Samir Bousseaden

使用事件查询语言搜索横向移动

Elastic 事件查询语言 (EQL) 的关联功能使从业人员能够捕获攻击者横向移动技术中的复杂行为。在本博客文章中了解如何检测各种此类技术。

阅读 13 分钟安全运营, 检测科学
Hunting for Lateral Movement using Event Query Language

横向移动 描述了攻击者用来在多个系统和帐户之间进行枢轴,从而提高对环境的访问权限并随后更接近其目标的技术。攻击者可能会安装自己的远程访问工具来实现横向移动,或使用被盗的凭据以及本机网络和操作系统工具,这些工具在与正常的系统管理活动融合时可能更隐蔽。

检测横向移动行为通常需要在源系统和目标系统上都设计检测,并且需要关联多种类型的事件(例如网络事件与进程执行事件),以便捕获远程执行上下文。

在本博客中,我们将探讨一些技术示例,并利用 Elastic 的事件查询语言 (EQL) 的功能来设计行为搜索和检测。

横向移动的工作方式

横向移动通常由以下高级步骤组成

  1. 远程身份验证到目标主机(需要有效的访问凭据)
  2. 将要执行的命令暂存到远程主机或目标主机可访问的其他资源,例如 Internet URL 或网络文件共享
  3. 通过可访问的远程服务和协议(服务任务计划程序WinRMWMI远程注册表)在目标主机上远程触发暂存程序的执行(立即或计划)
  4. 清除暂存的有效负载和任何其他相关工件以避免怀疑(可选)

请注意,暂存程序(步骤 2)并非总是必要的,因为通常会公开允许与目标主机进行远程交互的服务,例如 PowerShell 远程处理远程桌面 (RDP)

横向工具传输

在操作过程中,可能会将文件从一个系统复制到另一个系统,以暂存攻击者工具或其他文件。一个常见的滥用载体是使用内置的系统命令(例如 copy、move copy-item 和其他命令)通过 SMB/Windows 管理共享进行传输。

图 1:通过系统命令复制文件

在源计算机上,有其他方法可以在不执行可疑命令的情况下复制文件。不过,寻找唾手可得的检测机会非常重要。

下图 2 显示了一个 EQL 查询,该查询查找与攻击者将文件传输到远程主机一致的以下行为

  • 执行命令解释器,其中包含与文件复制相关的 process.args 关键字数组(复制、移动)和隐藏的文件共享(以 $ 符号为前缀,例如 c$ admin$)
  • 暂存来自卷影复制卷的数据(通常与通过暂存 NTDS.dit注册表 SAM 密钥以访问存储的帐户密码哈希相关的凭据访问)

图 2:通过隐藏的文件共享从源计算机搜索文件传输的 EQL

在目标计算机上,我们观察到所有通过服务器消息块 (SMB) 复制的文件都由虚拟进程 System 的文件创建事件表示(始终具有等于 4 的静态 process.pid 值,并表示 Windows 内核代码和加载的内核模式驱动程序)

图 3:在 Kibana 的“Discover”视图中描述的由于通过 SMB 进行文件传输而产生的文件创建事件详细信息

仅凭文件创建事件不足以(System 进程可能会创建与本地活动相关的文件)得出此活动属于横向移动尝试的结论。因此,我们需要将其与同一进程的传入 SMB 网络事件相关联

图 4:从目标主机搜索通过隐藏的文件共享进行文件传输的 EQL

上述查询查找传入的远程网络事件(到 tcp 端口 445 (SMB)),然后立即创建或修改文件(可以限制为可执行文件扩展名以减少误报),并且这两个事件都由同一个 (process.entity_id) 虚拟 System 进程执行。

图 5:来自目标主机的横向工具传输的检测警报示例

上面的警报包含有关复制的文件以及横向移动活动的 source.ip 地址的详细信息。相同的逻辑也会在 PSExec 上触发,PSExec 是一种远程执行实用程序,攻击者经常出于相同的目的滥用它

图 6:来自目标主机的 PSEXEC 上触发的横向工具传输

我们还可以利用 EQL 关联来捕获通过 SMB 复制的文件立即执行的实例

图 7:搜索通过文件共享进行远程执行的 EQL

上面的 EQL 查找一系列事件,其中文件由虚拟 System 进程创建/修改,然后是进程事件,其中 process.executable 等于 file.path。下面是警报示例

图 8:来自目标主机的通过文件共享进行远程执行的检测警报

可以通过 SMB 滥用文件传输以进行远程执行的另一个示例是将恶意可执行文件、脚本或快捷方式复制到目标主机的 启动文件夹。这将导致在用户登录时自动执行引用的程序,并且在用户的上下文中执行。

图 9:搜索通过启动文件夹进行横向移动的 EQL

以下是通过 启动文件夹 进行横向移动的检测警报示例

图 10:通过启动文件夹进行横向移动的检测警报

远程计划任务

攻击者可以利用计划任务进行远程执行 — 通过内置的系统实用程序(例如 schtasks.exe),或直接通过 任务计划程序 API,这可能更隐蔽,因为可见性有限。

以下是通过 MoveScheduler 渗透测试工具创建远程任务的示例

图 11:通过 MoveScheduler 进行横向移动

schtasks.exe 和自定义实现的直接使用都会导致进程加载任务计划程序 COM API (taskschd.dll),然后建立出站网络连接,其中source.portdestination.port 都等于或大于 RPC 动态端口(49152 到 65535),并且来自同一个 process.entity_id。这可以用以下 EQL 查询来表示:

图 12:用于在源主机上搜索出站任务计划程序活动的 EQL 查询

当然,此查询的匹配结果也可能与计划任务发现相关。以下是一个警报示例,我们可以观察到用户名、源 IP 和目标 IP,以及用于执行远程任务活动的进程名称。

图 13:源主机上通过计划任务进行横向移动的检测警报

目标主机上,我们可以通过两种方式搜索远程计划任务的创建/修改:

  1. 任务计划程序服务 (svchost.exe) 传入的 DCE/RPC(通过 TCP/IP)网络事件,随后创建任务 XML 配置文件 (C:\Windows\System32\Tasks\task_filename)。
  2. 任务计划程序服务 (svchost.exe) 传入的 DCE/RPC(通过 TCP/IP)网络事件,随后注册表更改了任务缓存的操作值 (HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tasks\{GUID}\Actions)。

选项 A 提供了任务名称(等于更改/创建的文件的 file.name),选项 B 提供了任务操作本身(等于任务计划程序服务缓存任务操作配置的操作注册表值的 base64 解码数据)。

图 14:用于在目标主机上搜索任务创建的 EQL 查询(选项 A)

图 15:用于在目标主机上搜索任务创建的 EQL 查询(选项 B)

选项 B 的优势在于提供了有关任务操作的详细信息,这些信息在分类时非常有用(设置为从可疑路径LOLBAS 进程等执行程序)。

图 16:目标主机上通过计划任务进行横向移动的检测警报

解码注册表操作 base64 编码的数据可以提供有关创建的任务操作的详细信息

图 17:计划任务操作注册表值的 Base64 解码数据

远程注册表

攻击者可能会利用远程注册表服务进行防御规避或远程执行。一个简单的场景是在远程系统上修改 Run 键注册表,从而导致程序在系统启动或用户登录时执行。

图 18:通过 reg 实用程序远程修改 Run 注册表项

我们可以通过查找包含 \ * 的 process.args 的 reg.exe 执行情况来从源机器上搜索此行为,但是可以通过 API 调用实现相同的操作,从而避免基于 process .command_line 的检测。

图 19:源主机上 Reg.exe 进程执行事件示例

请注意,Reg.exe 不执行任何网络连接 — 相反,是虚拟系统进程在端口 445 上向目标主机发出出站网络连接(通过 SMB 的 DCE/RPC)。

在目标主机上,我们可以看到以下关键事件序列:

  1. 虚拟系统进程(process.pid 等于 4)在 tcp 端口 445 上(通过 SMB 的 DCE/RPC)传入网络连接
  2. 远程注册表服务进程启动 (svchost.exe,其 process.args 包含字符串 RemoteRegistry)
  3. 远程注册表服务进程执行注册表更改

图 20:目标主机上与远程注册表相关的事件

以下 EQL 搜索可用于通过 Remote Registry 服务的 host.idprocess.entity_id 来关联 (2) 和 (3)

图 21:用于检测通过目标主机上的 Regsvc 进行远程注册表修改的 EQL 搜索

如果我们将 (1) 包含在上述 序列中以捕获 source.ip 地址,则可能会触发不相关的传入 SMB 连接,因为三个事件之间仅限于 host.id 值的唯一共同元素。

图 22:目标主机上通过 Regsvc 进行远程注册表修改的检测警报

攻击者可能会尝试通过 Windows Management Instrumentation (WMI) 注册表提供程序 (StdReg) 实现相同的结果,其行为有所不同。

  1. WMI 服务(svchost.exe,其 process.args 包含 Winmgmt 字符串)接受传入的 DCE/RPC(通过 TCP/IP)网络连接,其中 source.portdestination.port 都大于或等于 RPC 动态端口(49152 到 65535)。
  2. 启动 WMI 提供程序主机的新实例(process.name 等于 WmiPrvSe.exe,user.name 等于本地服务或 user.id 等于 S-1-5-19)。
  3. 启动的 WMI 提供程序主机加载注册表提供程序 StdProv.dll 模块。
  4. WMI 提供程序主机执行注册表更改。

我们可以使用以下 EQL 搜索来表示 (1)、(2) 和 (4) 的关联:

图 23:用于检测通过目标主机上的 Regsvc 进行远程注册表修改的 EQL 搜索

如果启用了 StdProv.dll 模块加载的日志记录,我们还可以将 (3) 添加到 序列中,以减少潜在的误报。

图 24:用于检测通过目标主机上的 Regsvc 进行远程注册表修改的 EQL 搜索(库事件)

以下是一个检测警报示例,我们可以看到远程修改的注册表详细信息和远程 source.ip

图 25:通过 WMI 在目标主机上进行远程注册表修改的检测警报

Sharp 远程桌面

SharpRDP 是一种横向移动工具,它利用远程桌面协议 (RDP) 进行身份验证的命令执行,而无需图形交互。

身份验证后,SharpRDP 通过一种名为 SendKeys 的方法向远程系统发送虚拟击键,以在目标主机上打开运行对话框,然后输入指定的命令,该命令将在目标主机上执行。

源主机的主要指示符是加载实现 RDP 客户端功能的远程桌面服务 ActiveX 客户端 (MsTscAx.dll) 的不寻常进程(托管 SharpRDP 代码),然后是到 RDP tcp 端口 3389 的出站网络连接,并且这两个事件都来自同一个 process.entity_id

图 26:用于搜索可疑 RDP 客户端的 EQL

以下是与我们的搜索 EQL 匹配的结果示例,我们可以在其中看到加载远程桌面服务 ActiveX 客户端 (MsTscAx.dll) 的不寻常进程(mstsc.exe 和类似的已知 RDP 客户端除外)以及出站网络连接。

图 27:可疑 RDP 客户端 EQL 搜索的结果示例

在目标主机上,以下关键事件会在一分钟的时间窗口内发生:

  1. RDP 服务 (TermService svchost.exe) 在端口 3389 上接受传入的网络连接。
  2. RunMRU 注册表项下,将新的(或对现有项的更新)字符串值设置为 cmd、powershell、taskmgr 或 tsclient(取决于所选的 SharpRDP 执行方法),这是由于通过 SendKeys 方法在 运行对话框中键入命令所致。
  3. 根据执行方法,将使用 cmd.exe、powershell.exe、taskmgr.exe 的 process.parent.name 或者从 tsclient 装载点(具有 RDP 目标服务器的 RDP 客户端主机中的共享驱动器)运行的随机可执行文件创建新进程(攻击者命令)。

对于 (2),请注意,当从 运行对话框运行任何内容时,将在 HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU 中创建一个注册表项,显示在 运行对话框中输入的内容。

上述事件序列可以用以下 EQL 表示:

图 28:用于在目标主机上搜索 SharpRDP 行为的 EQL

目标主机上的检测警报及其组成事件详细信息示例

图 29:目标主机上 SharpRDP 的检测警报(TermService 网络连接)

图 30:目标主机上 SharpRDP 的检测警报(RunMRU 设置为 Powershell)

图 31:目标主机上 SharpRDP 的检测警报(PowerShell 子进程)

总结

事件查询语言 (EQL) 相关功能使我们能够捕获各种横向移动技术的复杂行为。高级步骤如下:

  1. 了解理论和某种技术的基本构建块(网络协议、加载的模块、服务、进程名称和参数)
  2. 识别关键事件及其构成某种行为的顺序(源主机和目标主机)
  3. 识别可用于关联的通用值序列)— 识别更多共性可以减少误报
  4. 识别丰富可能性,例如序列中的额外事件,这些事件在警报分类期间可能很有用
  5. 评估相关性的时间窗口:使用较短的时间窗口(例如,30 秒而不是 1 秒)可以减少误报,但也可能因网络延迟或系统缓慢而引入误报。
  6. 使用不同的方法和工具进行测试,并相应地调整狩猎逻辑,或者在某些情况下复制逻辑以捕获边缘情况。

一些用作示例的 EQL 检测规则可以在 Elastic detection-rules 存储库中找到。

如果您是 Elastic Security 的新手,可以在 Elastic Cloud 上的 Elasticsearch Service 上体验我们的最新版本。