0x00 前言
sysmon相信经常处理windows应急响应的朋友都不陌生了,这款强大的轻量级监控工具。之前在没有思路的时候使用它监控windows各种行为,会有意想不到的收获。
借用freebuf上的介绍:
sysmon是由Windows Sysinternals出品的一款Sysinternals系列中的工具。它以系统服务和设备驱动程序的方法安装在系统上,并保持常驻性。sysmon用来监视和记录系统活动,并记录到windows事件日志,可以提供有关进程创建,网络链接和文件创建时间更改的详细信息。
通过收集使用Windows事件集合或SIEM代理生成的事件,然后分析它们,可以识别恶意或异常活动,并了解入侵者和恶意软件在您的网络上如何操作。
为什么这次要写这篇文章,主要是因为最近,这工具居然更新了DNS查询记录功能,让我们可以监控到系统上进程的DNS查询日志。这可是一个超级实用的功能,在很多时候,在一些检测设备,如IDS,态势感知上发现有恶意域名解析,这种在终端查起来是比较麻烦的,因为你只有这么一个线索,而且DNS查询这种流量,你要从他定位到恶意进程,还是有难度的;也有其他方法定位,但没有sysmon这么吊,比如可以通过内存扫描的方式,扫描域名字符串,过滤出匹配到的进程,然后再进一步用如processhacker工具去定位内存字符串是否确实存在,但这种方式只能在病毒还运行的时候能查到,可能潜伏没运行,并且这个字符串得还留存在内存中;或者用科来系统也可以监控数据包并锁定进程,但科来系统太大了,并且抓包也无法长期运行,sysmon轻便并且可以长期监控系统。除此之外我还想了一些歪门邪道,比如我写的一个工具domaintoprocess,但说实话不怎么好用,或者就自己开发,hook像gethostbyname一类解析域名的API,其实这个效果就和现在的sysmon差不多,它既然有了就省事很多了。
所以在此写一写自己的一些使用心得吧。
0x01 使用
要使用该工具,首先要进行安装,该工具安装后会以服务及驱动的形式运行,监控系统,经过测试这工具只支持win2008以上版本,这是一个缺憾。
安装时要使用管理员权限运行cmd,最常用的安装方式就是
sysmon.exe -accepteula -i -n
-i 即install,-n会监听network连接,sysmon有32位和64位两种,根据系统选择。
但我在此推荐大家使用另一个方式安装,sysmon可以使用xml配置文件进行安装,需要先配置好xml文件,但大家不必担心xml,这个已经有大佬为大家提供一个推荐的xml配置文件,并可以在此基础上进行修改。该配置文件为大家过滤了一些不必要监控的系统行为以及选择捕捉适当的条目,可以在应急响应中,将注意力集中真正有意义的日志上,并尽可能减少性能影响。
配置文件下载链接如下
https://github.com/SwiftOnSecurity/sysmon-config
安装命令如下
Sysmon64.exe -accepteula -i z-AlphaVersion.xml
后面带的是最近拿到的可以监听dns查询的xml配置文件,不过还是alpha版,需要完善。
安装后,如果需要修改配置文件,可使用以下命令修改
sysmon.exe -c sysmonconfig-export.xml
如果需要卸载使用以下命令
sysmon.exe -u
日志通过事件查看器查看,因为sysmon的日志是以evtx格式存储的。
具体事件路径为
应用程序和服务日志-Microsoft-Windows-Sysmon-Operational
如下图所示,或者你直接去C盘指定路径查文件也行
如同windows自带的系统日志,安全日志有事件ID一样,sysmon日志也有对应的事件ID,最新版本支持23种事件。
Event ID 1: Process creation
Event ID 2: A process changed a file creation time
Event ID 3: Network connection
Event ID 4: Sysmon service state changed
Event ID 5: Process terminated
Event ID 6: Driver loaded
Event ID 7: Image loaded
Event ID 8: CreateRemoteThread
Event ID 9: RawAccessRead
Event ID 10: ProcessAccess
Event ID 11: FileCreate
Event ID 12: RegistryEvent (Object create and delete)
Event ID 13: RegistryEvent (Value Set)
Event ID 14: RegistryEvent (Key and Value Rename)
Event ID 15: FileCreateStreamHash
Event ID 17: PipeEvent (Pipe Created)
Event ID 18: PipeEvent (Pipe Connected)
Event ID 19: WmiEvent (WmiEventFilter activity detected)
Event ID 20: WmiEvent (WmiEventConsumer activity detected)
Event ID 21: WmiEvent (WmiEventConsumerToFilter activity detected)
Event ID 22: DNSEvent (DNS query)
Event ID 255: Error
常用的有事件ID 1,监控进程创建,恶意进程的创建,包括他的父进程,PID,执行命令等等。
之前遇到过一起,开启会自动运行powershell,但查了启动项,任务计划,wmi都没发现痕迹,苦苦无解,然后使用sysmon监控进程创建,最终定位是谁拉起了powershell,往上溯源找到是一个伪造成正常程序图标和后缀的link文件,存放在Startup目录下,链接到存放在另一处的vbs脚本。
下图即为进程创建监控日志,可以看到几个关键点,创建的进程,命令行,以及父进程。
事件ID3,监控网络连接,当恶意程序外连CC服务器或者矿池等操作的时候,可以监控到是哪个进程发起的连接。这边也举个例子,之前遇到一种病毒,当你去用进程管理器或分析工具去查看时,该病毒会自动退出,防止被检测到,并且随机一段时间重启,但态势感知上发现确实有挖矿行为,使用sysmon监控,当他不定时运行时,即可捕捉到他连接矿池的行为,从而定位到进程。
下图为网络连接监控日志,可以看到网络连接的五元组,和对应的进程。
事件ID22,是这次重磅推出的新功能,DNS查询记录,这功能让应急响应人员可以很轻松的通过域名定位到进程,并且你即使开启了dnscache服务,也能定位到原先进程,sysmon原理没有分析过,猜测是监控了一些跟域名解析相关的API,而dnscache是这些API调用后下一步才会用到的,所以先于dnscache监控到原始进程。dnscache是一个缓存服务,简单来讲,就是会代理其他进程进行dns解析,并且会缓存解析结果,下一次解析就不再发送请求,读取缓存内容返回给指定程序即可。所以大家使用内存扫描工具,可能会定位到dnscache服务进程。
在监测设备上发现可疑域名解析时,通过这个功能,可以轻松定位到发起解析的进程,从而进一步分析进程文件是否确实有问题。
如下图所示,为dns查询日志,会记录解析域名和结果,以及对应的进程PID和路径。
我就举几个常用的事件类型来讲解,其他的事件类型我后续再对应案例具体分析吧,大家可以参考文章最后面freebuf链接以及微软链接,会有比较详细的说明。
其实sysmon最大优势就是可以实时监控,往往会遇到这么一个情况,检测设备检测到可疑行为,会有一个时延,而当工程师去查看设备时,又有一个时延,所以经常发现病毒的时候,已经滞后很长时间了,这个时候再去排查,可能病毒不在运行了,杀软又扫描不出来,无从下手,实际上也确实没有比较好的方法,虽然通过各种手段尝试或许能找到,比如查看可疑服务,任务计划,逐条分析排查,但需要消耗的时间会比较大,这个时候其实可以以使用sysmon进行后续监控,当再一次发现的时候进行日志分析处理。一来在没有思路的时候,可以以这个方式来缓冲一下,给自己留点时间思考分析,或者和其他人讨论下有没遇到过,或者思路啥的。二来,确实觉得这个时候没法查下去,或再查下去很费时间,用户可能办公也还要使用主机,但也不能跟用户说查不到没办法,这个时候就可以以此来为这次排查做个收尾闭环,并给出下一步计划,说明这次排查分析没发现病毒运行痕迹,可能处于潜伏,但我们在系统上安装了监控,后续再次发现问题的时候,我们可以提取日志分析定位问题,这样让用户知道当前进度以及困难之处,和下一步的安排。
0x02 配置文件
上面说了如何使用以及各类日志和应用场景,并且提到使用推荐的xml文件进行过滤,因为这个xml文件其实是一个推荐模板,可能会需要根据具体场景进行修改,下面就分析下这个xml文件,以及如何修改满足需求。
首先说明下有哪些事件过滤器。
其中只有ID 4和16无法过滤,其他可以根据ID标签来过滤。
ID | Tag |
1 ProcessCreate | Process Create |
2 FileCreateTime | File creation time |
3 NetworkConnect | Network connection detected |
4 n/a | Sysmon service state change (cannot be filtered) |
5 ProcessTerminate | Process terminated |
6 DriverLoad | Driver Loaded |
7 ImageLoad | Image loaded |
8 CreateRemoteThread | CreateRemoteThread detected |
9 RawAccessRead | RawAccessRead detected |
10 ProcessAccess | Process accessed |
11 FileCreate | File created |
12 RegistryEvent | Registry object added or deleted |
13 RegistryEvent | Registry value set |
14 RegistryEvent | Registry object renamed |
15 FileCreateStreamHash | File stream created |
16 n/a | Sysmon configuration change (cannot be filtered) |
17 PipeEvent | Named pipe created |
18 PipeEvent | Named pipe connected |
19 WmiEvent | WMI filter |
20 WmiEvent | WMI consumer |
21 WmiEvent | WMI consumer filter |
22 DNSQuery | DNS query |
然后我们看下配置文件,这个配置文件基本每行都有做注释,很详细了。每个事件过滤器都写进去了,并提供推荐配置,只需在这基础上修改。先看一下结构。
所有规则都在过滤器<EventFiltering>标签里。
然后各类事件单独封装在各个<RuleGroup>里,也就是说根据上面支持的事件过滤器,一共有15个<RuleGroup>,属性groupRelation都设置为or,表明事件标签里同一规则的每个项之间是或的关系。
选择以下事件标签来讲解,标签名称为FileCreateTime,表明过滤进程修改文件创建时间事件,属性onmatch为include表示匹配以下标签规则的才记录日志,exclude值,表示不匹配以下标签规则的才记录日志,exclude规则覆盖include规则。
事件标签内可以看到多个Image项,各项由于groupRelation设置为or,各项之间是或的关系,看下图存在两个相同的事件标签,但一个是include,一个是exclude,相同事件标签之间是与的关系。按下面规则表示不匹配镜像路径为“OneDrive.exe”或“C:\Windows\system32\backgroundTaskHost.exe”或包含“setup”字符或……的,同时只匹配镜像路径以“C:\Users”开头或以“.exe”结尾等等的。name属性表示规则名时,当匹配到其中某条规则日志会记录匹配到的规则名,condition表示匹配方式,如"begin with"表示以该值为开头,"image"表示匹配镜像路径,默认为is,精确匹配。
condition的值有以下几种,还是比较好理解的。
Condition | Description |
Is | Default, values are equals |
is not | Values are different |
Contains | The field contains this value |
Excludes | The field does not contain this value |
begin with | The field begins with this value |
end with | The field ends with this value |
less than | Lexicographical comparison is less than zero |
more than | Lexicographical comparison is more than zero |
Image | Match an image path (full path or only image name). For example: lsass.exe will match c:\windows\system32\lsass.exe |
每种事件有哪些项可以用来匹配过滤,如NetworkConnect的Image用来过滤镜像路径,这些可以参考最后freebuf的链接,这边主要讲自己的一些理解。
配置文件的结构分析差不多就这些,最后讲解下目前这个配置文件里各个事件规则的特点,方便大家进行适当修改调整。
1.ProcessCreate:只有exclude,不匹配系统自身默认会启动的一些服务程序,包括一些白名单程序启动。如果有额外的白名单程序不需要记录的可以添加进来。
2.FileCreateTime:包括include和exclude,主要记录C:\Users下或exe文件创建时间被修改,不记录一些安装程序修改记录,比如setup/install这一类名字的,当然可能会有病毒为这个名字,看具体情况调整。
3.NetworkConnect:包括include和exclude,这一块偏重于include,只记录一些特殊的连接,因为电脑经常联网会有大量的应用连接,会导致大量无用日志记录,所以这边只设置了一些可疑程序以及可疑端口连接监控,像powershell,cmd等等,或者目标端口为22,23,3389这一类的。可能会有一些网络连接记录不到,如果需要记录一些其他的网络连接,该需要手动修改这部分内容。这一块强制不记录主要是微软的一些连接。
4.ProcessTerminate:只有include,记录设备程序被终止,或C:\Users下的程序被停止
5.DriverLoad:只有exclude,不记录签名包含micrsoft、windows或以Intel的驱动加载。
6.ImageLoad:只有include,但为空,表明不记录任何镜像加载。
7.CreateRemoteThread:只有exclude,不记录一些系统程序的远程线程创建。
8.RawAccessRead:只有include,但为空,表明不记录该事件日志。
9.ProcessAccess:只有include,但为空,表明不记录该事件日志。
10.FileCreate:包括include和exclude,主要记录一些运行会触发病毒行为的程序,包括exe、vbs、bat等等,还有一些特殊路径下文件创建,如startup路径下有文件创建,就比较可疑。其他位置需要记录的,手动添加路径或文件名。不记录一些临时目录或一些白名单程序会创建文件的行为。
11.RegistryEvent:包括include和exclude,这两方面都有所平衡,一方面会记录病毒经常会访问的注册表路径,包括run,services一些启动项,RDP等等,另一方面不记录一些系统本身会修改的注册表路径,不然会充斥太多无用日志。
12.FileCreateStreamHash:只有include,主要记录浏览器下载的一些可疑脚本文件。
13.PipeEvent:只有include,但为空,表明不记录该事件日志。
14.WmiEvent:只有include,但为空,表明不记录该事件日志。
15.DnsQuery:只有exclude,这块就是排除一些正常并且频繁发生的域名解析,避免干扰。如果只需要记录某个域名解析,其实可以单独设置include过滤。
0x03 结语
写这篇文章的初衷,主要是最近工具发布了dns查询功能,想好好利用这个工具,并且在以往的使用中也发现这个工具蛮好用的,所以趁此机会,好好学一学这工具的使用,学习中发现在github上发现有人整理了这工具的配置文件,也刚好可以通过分析这个配置文件,更全面的了解这个工具,然后将自己学习理解的内容整理成笔记。当然我也只用到了其中一小部分的功能,后续还需要结合具体安全事件来更好理解使用工具。
https://docs.microsoft.com/en-us/sysinternals/downloads/sysmon
https://www.freebuf.com/sectool/122779.html