如何利用日志数据来检测横向渗透行为
所谓横向渗透,是指攻击者通过在多个系统和账户之间进行跳转,从而改善对环境的访问权限,从而更接近其目标的各种技术。同时,攻击者也可能会安装自己的远程访问工具来完成横向渗透,或者使用窃取的凭证与本地网络和操作系统工具结合使用,因为这些工具能更好的潜伏到正常的系统管理活动中。
为了检测横向渗透行为,不仅需要在源系统和目标系统上设计相应的检测方法,同时,还要考察多种类型事件(如网络事件与进程执行事件)之间的相关性,以捕获远程执行的上下文。
在本文中,我们将通过实例讲解如何利用开源搜索引擎Elastic的事件查询语言(EQL)的相关功能,来检测与横向渗透相关的各种行为。
横向渗透是如何进行的
横向渗透通常由以下步骤组成:
- 对目标主机进行远程身份验证(需要有效的访问凭证);
- 将命令投放到需要在其上执行的远程主机,或投放到可访问的其他资源(例如InternetURL或网络文件共享)的目标主机;
- 通过可访问的远程服务和协议(服务、任务调度器、WinRM、WMI、远程注册表),在目标主机上远程触发已植入程序的执行(立即执行或计划任务的形式执行);
- 清理植入的payload和任何其他痕迹,以避免引起怀疑(可选)。
请注意,投放程序(第2步)并不总是必要的,因为通常有暴露的服务可用于与目标主机进行远程交互,如PowerShell Remoting和远程桌面(RDP)服务等。
横向渗透工具的传输
在进行横向渗透的过程中,可以将文件从一个系统复制到另一个系统,以实现横向渗透工具或其他文件的传输。常见的传输方式包括利用SMB/Windows管理共享,通过使用内置的系统命令,如copy、move copy-item等。
图1 通过系统命令复制文件
在源机器上,攻击者也可以通过其他方式来复制文件,这样做的好处是:无需执行容易引起怀疑的命令。不过,寻找容易发现的检测机会还是很重要的。
下面的图2显示了一个EQL查询,该查询可用于检测与攻击者向远程主机传输文件相一致的行为:
- 执行一个命令解释器,其process.args关键字数组与文件复制(copy、move)和隐藏的文件共享有关(前缀为$符号,如c$ admin$);
- 通过影子副本卷投递数据(通常与通过投放NTDS.dit或注册表SAM键访问存储的账户密码哈希值的凭证访问有关)。
图2 EQL示例,用于检测通过隐藏文件共享从源机器传输文件的行为
在目标机器上,我们观察到,所有通过服务器消息块(SMB)复制的文件都是由虚拟进程System(总是有一个静态的process.pid值等于4,代表Windows内核代码和加载的内核模式驱动程序)的文件创建事件来表示。
图3 在Kibana的Discover视图中显示的文件创建事件细节,这是通过SMB传输文件的结果。
当然,仅靠一个文件创建事件是远远不够的(系统进程可能会创建与本地活动相关的文件),我们无法由此得出这个活动与横向渗透有关的结论。因此,我们需要将其与传入的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,以及用于执行远程任务活动的进程名称。
图13 源主机上通过调度任务进行横向渗透的检测警报
在目标主机上,我们可以通过两个选项来寻找远程计划任务的创建/修改事件:
- 通过任务调度服务(svchost.exe)传入DCE/RPC(通过TCP/IP)网络事件,后面是创建任务xml配置文件(C:\\Windows\\System32\Tasks\task_filename)的事件。
- 通过任务调度服务(svchost.exe)传入的DCE/RPC(通过TCP/IP)网络事件,后面是任务缓存的Action值的注册表变更事件(HKLM\\SOFTWARE\\Microsoft\\WindowsNT\\CurrentVersion\\Schedule\\TaskCache\\Tasks\\{GUID}\\Actions)。
其中,选项A为我们提供了任务名称(等于被修改/创建的文件的file.name),选项B为我们提供了任务操作本身(等于任务调度服务缓存任务操作配置的Action注册表值的base64解码数据)。
图14 在目标主机上检测创建任务(选项A)事件的EQL查询
图15 在目标主机上检测创建任务(选项B)事件的EQL查询
选项B的优点是提供了任务操作的相关细节,这些细节往往在进行分类的时候非常有用(设置为从可疑路径执行程序、LOLBAS进程等)。
图16 通过目标主机上的计划任务检测横向渗透的警报
对于注册表Action基于base64进行编码的数据,进行相应的解码之后,能够为我们提供关于创建的任务操作方面的详细信息。
图17 调度任务操作注册表值的base64解码数据
远程注册表事件
此外,攻击者也可能会利用远程注册表服务来绕过防御机制,或实现远程执行。一个简单的场景是修改远程系统上的Run注册表项,导致系统启动或用户登录时执行特定的程序。
图18 通过注册表实用程序远程修改Run注册表项
我们可以从源机器中通过寻找利用含有\\*的process.args来执行reg.exe的情况来检测这种行为,但同样的操作也可以通过API调用来实现,这样就可以避免基于进程.command_line的检测方法。
图19 源主机上的Reg.exe进程执行事件示例
请注意,Reg.exe并没有进行任何网络连接——相反,而是虚拟System进程在445端口(SMB上的DCE/RPC)上向目标主机发送了出站网络连接请求。
在目标主机上,我们可以看到以下一系列关键事件:
- 虚拟System进程(process.pid等于4)在tcp端口445(SMB上的DCE/RPC)上发出网络连接请求;
- RemoteRegistry服务进程启动(svchost.exe的process.args包含字符串RemoteRegistry);
- RemoteRegistry服务进程完成注册表的更改。
图20 目标主机上与远程注册表操作相关的事件
下面的EQL可以通过远程注册服务的host.id和process.entity_id来关联(2)和(3):
图21 通过Regsvc检测目标主机上的远程注册表修改情况的EQL
如果我们在上述序列中包含(1)来捕获source.ip地址,那么,它可能会在不相关的传入SMB连接上被触发,因为三个事件之间的唯一共同元素仅限于host.id值。
图22 目标主机上通过Regsvc进行远程注册表修改的检测警报
此外,攻击者还可能试图通过WindowsManagement 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等于Local Service或user.id等于S-1-5-19)被启动。
- 启动的WMI提供程序主机会加载注册表提供程序的StdProv.dll模块。
- WMI提供程序主机完成注册表更改。
我们可以用下面的EQL来表示(1)、(2)和(4)的相关性:
图23 检测通过目标主机上的Regsvc进行远程注册表修改事件的EQL
如果启用了StdProv.dll模块加载的日志记录,我们还可以在序列中添加(3)以减少潜在的误报:
图24 在目标主机上检测通过Regsvc进行远程注册表修改(库事件)事件的EQL
下面是一个检测预警的例子,我们可以看到远程修改的注册表细节和远程源.ip:
图25 检测通过目标主机上的WMI实现远程注册表修改事件
关于SharpRDP
SharpRDP是一个横向渗透工具,它利用远程桌面协议(RDP)执行经过认证的命令,而且不需要图形交互。
通过身份验证后,SharpRDP能够通过名为SendKeys的方法向远程系统发送虚拟按键:首先,它会在目标主机上打开运行对话框,然后输入指定的命令,从而在目标主机上执行相关的命令。
对于这个工具来说,来自源主机的主要指标,是一个异常进程(托管SharpRDP代码)加载了实现RDP客户端功能的远程桌面服务ActiveX客户端(MsTscAx.dll),随后,会建立到RDP tcp端口3389的出站网络连接,并且,这两个事件都来自同一个process.entity_id。
图26 用于检测可疑的RDP客户端的EQL
下面是一个与我们的EQL相匹配的例子,在这里,我们可以看到一个异常进程(除了mstsc.exe和类似的已知RDP客户端之外)加载了远程桌面服务ActiveX客户端(MsTscAx.dll),并创建了出站网络连接。
图27 可疑RDP客户端检测结果
在目标主机上,会在一分钟的时间窗口内发生以下注册表相关的事件:
- RDP服务(TermService svchost.exe)在3389端口接受了一个传入的网络连接。
- 在RunMRU注册表项下,一个新的(或更新现有的)字符串值被设置为cmd、powerhell、taskmgr或tsclient(取决于所选择的SharpRDP执行方法),这是通过SendKeys方法在Run对话框中键入命令而引发的。
- 根据执行方式的不同,还可能会创建一个新的进程(即攻击者的命令),其process.parent.name为cmd.exe、powerhell.exe、taskmgr.exe,或者是从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)提供的相关功能,我们能够检测各种与横向渗透技术相关的复杂攻击行为。概括来说,检测步骤如下所示:
- 理解某项技术的理论和构建模块(网络协议、加载模块、服务、进程名称和参数)。
- 识别构成某种行为的关键事件及其顺序(包括源主机和目标主机)。
- 识别可用于关联攻击(序列)的共同值——识别更多的共同点可以减少假阳性误报。
- 识别丰富的可能性,例如序列中对警报分类有用的额外事件。
- 评估相关的时间窗口——使用较短的时间窗口(例如,30秒而非1秒)可以减少假阳性误报,但也可能会引入由网络延迟或系统缓慢而引起的假阴性误报。
- 使用不同的方法和工具进行测试,并相应地调整检测逻辑,或者在某些情况下,通过重复逻辑以捕获边缘案例。
另外,本文中的某些示例性EQL检测规则可以在Elastic的检测规则存储库中找到,这些规则可检测下列事件:
- 将远程文件复制到隐藏共享
- 横向工具传输
- 通过文件共享实现远程执行
- 通过启动文件夹进行横向渗透
- 通过PowerShell进行的出站计划任务活动
- 远程计划任务创建
- 潜在SharpRDP行为
- 已加载可疑的RDP ActiveX客户端
- 通过TSClient挂载点执行
原文地址: https://www.elastic.co/blog/hunting-for-lateral-movement-using-event-query-language
最新评论