导语:Sysmon是Mark Russinovich编写的一个工具,Sysmon 3.0或者PowerShell模块,用于创建和管理for v2.0配置文件。它是一个Windows系统服务和设备驱动程序,是来自微软的SysInternal工具的一部分。它可以监控Windows系统操作并将其记录到Windo
Sysmon是Mark Russinovich编写的一个工具,Sysmon 3.0或者PowerShell模块,用于创建和管理for v2.0配置文件。它是一个Windows系统服务和设备驱动程序,是来自微软的SysInternal工具的一部分。它可以监控Windows系统操作并将其记录到Windows事件日志中。在系统上安装该工具时,可以给出XML配置文件,以便控制所记录的内容。
PowerShell模块中的所有函数都包含帮助信息和使用get帮助cmdlet可以查看的用法示例。
我在以前的多篇文章中已经介绍过了,甚至还编写了Posh-Sysmon(用于创建和管理Sysmon配置文件的PowerShell模块)。
· 源代码名称:Posh-Sysmon
· 源代码网址:http://www.github.com/darkoperator/Posh-Sysmon
· Posh-Sysmon源代码文档https://github.com/darkoperator/Posh-Sysmon/wikiPosh-Sysmon
· 源代码下载https://github.com/darkoperator/Posh-Sysmon/releases
Posh-Sysmon的主要目的是跟踪单个主机上的潜在恶意活动,并且它基于与Procmon(Process是一款能够实时显示文件系统、注册表与进程活动的高级工具,是微软推荐的一个系统监视工具。它整合了旧的Sysinternals工具,Filemon与Regmon,并增加了进程ID、用户、进程可靠度、等等监视项,可以记录到文件中,它的强大功能足以使 Process Monitor 成为你系统中的核心组件以及病毒探测工具。)相同的技术。但它与其他Sysinternals工具的不同之处在于,Sysmon实际上安装在主机上并将其信息保存到Windows Eventlog中,这样使用SIEM(安全信息和事件管理)工具更容易收集信息。
Sysmon能够收集的信息包括:
1.创建和结束进程;
2.处理更改文件创建时间;
3.网络连接;
4.驱动加载;
5.镜像加载;
6.CreateRemoteThread调用;
7.以Raw访问方式读取文件;
8.某个进程读取另一个进程空间;
9.文件创建;
10.注册表事件;
11.管道( pipe )交互操作事件;
12.WMI永久事件;
所有日志记录都基于用戶使用的sysmon.exe工具指定的规则,并最终保存到注册表中。目前大多数企业环境会通过应用包管理方式来部署Sysmon,然后通过注册表的二进制bob推送方式将规则推送至目标主机。
如何检测Sysmon的存在
对于攻击者来说,他们需要做的第一件事就是确定系统中是否存在Sysmon。通常,当攻击者在系统上安装Sysmon时,它将创建一个服务来加载驱动程序,该注册表项将存储服务和驱动程序的配置,并安装事件清单以定义事件并创建事件日志,将生成的事件存放在事件日志中。按着这个逻辑,攻击者可以根据存放事件的位置来检测Sysmon是否存在。但事实却是,很多攻击者往往习惯使用最简且收益最大化的解决方案。在检测控件时,大多数攻击者将执行以下的一种操作:
1.枚举进程;
2.枚举服务;
3.枚举C:\Windows\System32\Drivers下的驱动;
其中最常见的是枚举C:\Windows\System32\Drivers下的驱动,因为像Cylance这样的EDR解决方案将根据用户的调用方式隐藏服务名称,而某些解决方案还没有运行进程。
基于此,Sysmon可以实现以下的这个功能:用户可以在其中更改其可执行文件和驱动程序的名称,以便对其在系统中的存在进行模糊处理。
要更改服务名称和进程,只需将sysmon可执行文件重命名为用户想要的任何名称。虽然这很实用,但从如下输出中,攻击者却发现驱动并没有被重命名。
PS C:\Users\carlos\Desktop> .\HPPrinterController.exe -i System Monitor v8.00 - System activity monitor Copyright (C) 2014-2018 Mark Russinovich and Thomas Garnier Sysinternals - www.sysinternals.com HPPrinterController installed. SysmonDrv installed. Starting SysmonDrv. SysmonDrv started. Starting HPPrinterController.. HPPrinterController started.
原因何在?因为要更改驱动程序名称,攻击者还需要在安装期间使用-d参数指定它,并为其指定名称。
PS C:\Users\carlos\Desktop> .\HPPrinterController.exe -i -d hpprndrv System Monitor v8.00 - System activity monitor Copyright (C) 2014-2018 Mark Russinovich and Thomas Garnier Sysinternals - www.sysinternals.com HPPrinterController installed. hpprndrv installed. Starting hpprndrv. hpprndrv started. Starting HPPrinterController.. HPPrinterController started.
在卸载和更新服务的配置信息时,攻击者还需要注意:必须用以上指定的名称来使用和复制Sysmon,就连配置数据所对应的注册表路径也需要使用相同的名称,这一点在Sysmon的升级版本和新规则应用方面尤为重要。
不过,攻击者仍然可以查看系统已加载的过滤驱动程序,并使用fltmc.exe来查看其altitude号码,如果攻击者使用的是Meterpreter,Beacon或任何其他支持mimikatz的代理,则还可以在Mimikatz中使用misc::mflt命令,进而在内存中列出驱动的altitude号。以下是Sysmon驱动的altitude号为385201。
在Mimikatz中使用misc::mflt命令得到的altitude号:
mimikatz # misc::mflt 0 3 385201 hpprndrv 0 0 244000 storqosflt 0 1 189900 wcifs 0 0 180451 CldFlt 0 0 141100 FileCrypt 0 1 135000 luafv 0 1 46000 npsvctrig 0 3 40700 Wof 0 4 40500 FileInfo
使用fltmc.exe得到的altitude号:
PS C:\> fltMC.exe Filter Name Num Instances Altitude Frame ------------------------------ ------------- ------------ ----- hpprndrv 3 385201 0 storqosflt 0 244000 0 wcifs 1 189900 0 CldFlt 0 180451 0 FileCrypt 0 141100 0 luafv 1 135000 0 npsvctrig 1 46000 0 Wof 3 40700 0 FileInfo 4 40500 0
如果攻击者是在更复杂或非许可的环境中运行,那么运行fltmc.exe或加载mimikatz必然会引发安全警报。其中一种不太准确的方法是检测sysmon的事件日志文件是否存在,该方法至少会让攻击者知道sysmon是否已安装在系统上。为此,攻击者可以检查注册表项HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Channels\Microsoft-Windows-Sysmon/Operational:
PS C:\> ls HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Channels | Where-Object {$_.name -like "*sysmon*"} Hive: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Channels Name Property ---- -------- Microsoft-Windows-Sysmon/Opera OwningPublisher : {5770385f-c22a-43e0-bf4c-06f5698ffbd9} tional Enabled : 1 Isolation : 2 ChannelAccess : O:BAG:SYD:(A;;0xf0007;;;SY)(A;;0x7;;;BA)(A;;0x1;;;BO)(A;;0x1;;;SO)(A;;0x1;;;S-1-5-32-573) MaxSize : 67108864 MaxSizeUpper : 0 Type : 1
攻击者也可以在注册表中查看的其他标志,比如输入值,因为Sysinternals工具在首次使用时会弹出许可证窗口,而接受许可证会在注册表中留下输入值。对于sysmon来说,这个输入值位于当前用户的HKCU\Software\Sysinternals路径中。
PS C:\> ls HKCU:\Software\Sysinternals | Select-Object name Name ---- HKEY_CURRENT_USER\Software\Sysinternals\Process Explorer HKEY_CURRENT_USER\Software\Sysinternals\Process Monitor HKEY_CURRENT_USER\Software\Sysinternals\sigcheck HKEY_CURRENT_USER\Software\Sysinternals\Streams HKEY_CURRENT_USER\Software\Sysinternals\Strings HKEY_CURRENT_USER\Software\Sysinternals\System Monitor HKEY_CURRENT_USER\Software\Sysinternals\ZoomIt
还有一种方法可以检测sysmon是否已安装在系统上,就是看是否有重命名的情况出现。Sysmon对服务的描述为System Monitor service,即使用户修改了这个名称,这个描述符依然保持不变。这样,攻击者就可以使用WMI或SC.exe通过此字符串进行识别。
PS C:\> Get-CimInstance win32_service -Filter "Description = 'System Monitor service'" ProcessId Name StartMode State Status ExitCode --------- ---- --------- ----- ------ -------- 2220 HPPrinterController Auto Running OK 0
绕过Sysmon的两种方法
目前,攻击者有2个绕过sysmon的方法,第一个是在利用sysmon进程中的盲点,第二种则是直接禁用sysmon。 Matt Grabber(一种抓取工具)能够进行逆向分析,找到注册表输入内容的格式。HarmJ0y开发了一款名为Seatbelt的.Net下assembly加载工具,攻击者可以在Cobalt Strike中使用该工具来加载内存中的配置信息。如果攻击者导出注册表项,Matt也提供了一个PowerShell函数用来解析导出的数据。了解了具体规则后,攻击者就可以围绕这些规则进行有针对性的绕过了。
删除配置项
攻击者可以删除注册表中的规则项,此时, Sysmon在发现注册表被更改后,它将自动重新加载配置。由于此时没有任何安全检测规则存在,它将暂时失去防护能力,不过失效时间,取决于配置的维护方式。如果配置由Ansible,Chef或DSC等配置管理系统管理,可能需要几秒到几分钟才能将配置更改回原始状态,如果使用GPO来管理,那么当GPO更新时,可以在90分钟内恢复原始状态。为了解决这个问题,攻击者可以使用各种Windows技术(如.Net、VBS、PE文件等)创建VMI临时性Consumer监控相应的注册表项,当发现修改操作时,则会删除修改数据或者重新设置表项内容。之所以使用临时的Consumer,是因为大多数防护解决方案会重点关注正在创建或修改的WMI永久事件。
$query = "SELECT * FROM RegistryKeyChangeEvent " + "WHERE Hive ='HKEY_LOCAL_MACHINE' " + "AND KeyPath ='SYSTEM\\CurrentControlSet\\Services\\SysmonDrv\\Parameters'" Register-WMIEvent -Query $query -Action { Write-host "Sysmon config updated, deleting config." Remove-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\SysmonDrv\Parameters" -Name "Rules" }
需要注意的一点是,Sysmon将恢复为默认配置,以便记录创建和结束进程事件。
如果攻击者想要跟踪WMI过滤器的使用过程,那就在WMI-Activity/Operational下的事件日志中查看,事件ID为5860,其中EventData中的字段表明可能的原因为Temporary,日志中同样包含生成该事件的进程ID。
不过也有特例,如果攻击者使用的是Sysmon 8.0,配置中则包含针对进程创建和结束的每个过滤器的规则名,其中就会包含空白的规则名。
攻击者还可以通过GPO在注册表项上设置审核规则,并在安全日志中记录事件4687,该事件将包括用户和更改注册表项的进程信息。如果该信息表明目标进程既不是由Sysmon,也不是由GPO更新导致的注册表修改,那么我SIEM中就会出现安全警报。
直接卸载SysmonDrv过滤器驱动程序
另一个方法比较直接,就是直接卸载SysmonDrv驱动程序,该驱动程序为Sysmon提供有关所有磁盘操作的信息,然后写入事件日志。正如攻击者之前看到的,这个驱动程序具有唯一的altitude号,如果攻击者以管理员身份运行,则可以卸载此驱动程序,而此时Sysmon基本上是完全失效的。攻击者可以使用fltmc.exe工具卸载驱动程序。如下所示,攻击者可以通过altitude号识别出了隐藏的驱动程序,并成功卸载该驱动。
PS C:\> fltMC.exe Filter Name Num Instances Altitude Frame ------------------------------ ------------- ------------ ----- hpprndrv 3 385201 0 storqosflt 0 244000 0 wcifs 1 189900 0 CldFlt 0 180451 0 FileCrypt 0 141100 0 luafv 1 135000 0 npsvctrig 1 46000 0 Wof 3 40700 0 FileInfo 4 40500 0 PS C:\> fltMC.exe unload hpprndrv PS C:\> fltMC.exe Filter Name Num Instances Altitude Frame ------------------------------ ------------- ------------ ----- storqosflt 0 244000 0 wcifs 1 189900 0 CldFlt 0 180451 0 FileCrypt 0 141100 0 luafv 1 135000 0 npsvctrig 1 46000 0 Wof 3 40700 0 FileInfo 4 40500 0
Sysmon实际上会将最后一个命令记录为执行命令,因此当执行此命令并使用unload参数时,就会触发SIEM发出警报。
System日志中也会生成ID为1的事件,其中Source字段的值为FilterManager,Task Category字段的值为None。
总结
本文提醒安全测试者,在模拟攻击中识别安全控件时,要查找和控件相关的多个指标,并在识别时提取相关信息。