横向移动 描述了攻击者用来在多个系统和帐户之间进行枢轴,从而提高对环境的访问权限并随后更接近其目标的技术。攻击者可能会安装自己的远程访问工具来实现横向移动,或使用被盗的凭据以及本机网络和操作系统工具,这些工具在与正常的系统管理活动融合时可能更隐蔽。
检测横向移动行为通常需要在源系统和目标系统上都设计检测,并且需要关联多种类型的事件(例如网络事件与进程执行事件),以便捕获远程执行上下文。
在本博客中,我们将探讨一些技术示例,并利用 Elastic 的事件查询语言 (EQL) 的功能来设计行为搜索和检测。
横向移动的工作方式
横向移动通常由以下高级步骤组成
- 远程身份验证到目标主机(需要有效的访问凭据)
- 将要执行的命令暂存到远程主机或目标主机可访问的其他资源,例如 Internet URL 或网络文件共享
- 通过可访问的远程服务和协议(服务、任务计划程序、WinRM、WMI、远程注册表)在目标主机上远程触发暂存程序的执行(立即或计划)
- 清除暂存的有效负载和任何其他相关工件以避免怀疑(可选)
请注意,暂存程序(步骤 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.port 和 destination.port 都等于或大于 RPC 动态端口(49152 到 65535),并且来自同一个 process.entity_id。这可以用以下 EQL 查询来表示:
图 12:用于在源主机上搜索出站任务计划程序活动的 EQL 查询
当然,此查询的匹配结果也可能与计划任务发现相关。以下是一个警报示例,我们可以观察到用户名、源 IP 和目标 IP,以及用于执行远程任务活动的进程名称。
图 13:源主机上通过计划任务进行横向移动的检测警报
在目标主机上,我们可以通过两种方式搜索远程计划任务的创建/修改:
- 任务计划程序服务 (svchost.exe) 传入的 DCE/RPC(通过 TCP/IP)网络事件,随后创建任务 XML 配置文件 (C:\Windows\System32\Tasks\task_filename)。
- 任务计划程序服务 (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)。
在目标主机上,我们可以看到以下关键事件序列:
- 虚拟系统进程(process.pid 等于 4)在 tcp 端口 445 上(通过 SMB 的 DCE/RPC)传入网络连接
- 远程注册表服务进程启动 (svchost.exe,其 process.args 包含字符串 RemoteRegistry)
- 远程注册表服务进程执行注册表更改
图 20:目标主机上与远程注册表相关的事件
以下 EQL 搜索可用于通过 Remote Registry 服务的 host.id 和 process.entity_id 来关联 (2) 和 (3)
图 21:用于检测通过目标主机上的 Regsvc 进行远程注册表修改的 EQL 搜索
如果我们将 (1) 包含在上述 序列中以捕获 source.ip 地址,则可能会触发不相关的传入 SMB 连接,因为三个事件之间仅限于 host.id 值的唯一共同元素。
图 22:目标主机上通过 Regsvc 进行远程注册表修改的检测警报
攻击者可能会尝试通过 Windows Management Instrumentation (WMI) 注册表提供程序 (StdReg) 实现相同的结果,其行为有所不同。
- WMI 服务(svchost.exe,其 process.args 包含 Winmgmt 字符串)接受传入的 DCE/RPC(通过 TCP/IP)网络连接,其中 source.port 和 destination.port 都大于或等于 RPC 动态端口(49152 到 65535)。
- 启动 WMI 提供程序主机的新实例(process.name 等于 WmiPrvSe.exe,user.name 等于本地服务或 user.id 等于 S-1-5-19)。
- 启动的 WMI 提供程序主机加载注册表提供程序 StdProv.dll 模块。
- 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 搜索的结果示例
在目标主机上,以下关键事件会在一分钟的时间窗口内发生:
- RDP 服务 (TermService svchost.exe) 在端口 3389 上接受传入的网络连接。
- 在 RunMRU 注册表项下,将新的(或对现有项的更新)字符串值设置为 cmd、powershell、taskmgr 或 tsclient(取决于所选的 SharpRDP 执行方法),这是由于通过 SendKeys 方法在 运行对话框中键入命令所致。
- 根据执行方法,将使用 cmd.exe、powershell.exe、taskmgr.exe 的 process.parent.name 或者从 tsclient 装载点(具有 RDP 目标服务器的 RDP 客户端主机中的共享驱动器)运行的随机可执行文件创建新进程(攻击者命令)。
对于 (2),请注意,当从 运行对话框运行任何内容时,将在 HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU 中创建一个注册表项,显示在 运行对话框中输入的内容。
图 28:用于在目标主机上搜索 SharpRDP 行为的 EQL
目标主机上的检测警报及其组成事件详细信息示例
图 29:目标主机上 SharpRDP 的检测警报(TermService 网络连接)
图 30:目标主机上 SharpRDP 的检测警报(RunMRU 设置为 Powershell)
图 31:目标主机上 SharpRDP 的检测警报(PowerShell 子进程)
总结
事件查询语言 (EQL) 相关功能使我们能够捕获各种横向移动技术的复杂行为。高级步骤如下:
- 了解理论和某种技术的基本构建块(网络协议、加载的模块、服务、进程名称和参数)
- 识别关键事件及其构成某种行为的顺序(源主机和目标主机)
- 识别可用于关联的通用值(序列)— 识别更多共性可以减少误报
- 识别丰富可能性,例如序列中的额外事件,这些事件在警报分类期间可能很有用
- 评估相关性的时间窗口:使用较短的时间窗口(例如,30 秒而不是 1 秒)可以减少误报,但也可能因网络延迟或系统缓慢而引入误报。
- 使用不同的方法和工具进行测试,并相应地调整狩猎逻辑,或者在某些情况下复制逻辑以捕获边缘情况。
一些用作示例的 EQL 检测规则可以在 Elastic detection-rules 存储库中找到。
- 远程文件复制到隐藏共享
- 横向工具传输
- 通过文件共享进行远程执行
- 通过启动文件夹进行横向移动
- 通过 PowerShell 进行出站计划任务活动
- 远程计划任务创建
- 潜在的 SharpRDP 行为
- 加载了可疑的 RDP ActiveX 客户端
- 通过 TSClient 挂载点执行
如果您是 Elastic Security 的新手,可以在 Elastic Cloud 上的 Elasticsearch Service 上体验我们的最新版本。