
Sysmon(https://docs.microsoft.com/en-us/sysinternals/downloads/sysmon)是微软推出的一款很好用的系统监控工具,可以记录进程、模块、驱动、网络以及文件等多种事件,这些事件可以用作行为监控。得益于Sysmon的免费以及有效性,当前已经被越来越多公司用作安全数据采集工具。Sysmon官网当前已经更新到V10大版本,在新的版本中更是增加了对进程解析DNS的记录。(PS:笔者在测试V10版本的时候,发现Sysmon的驱动中存在一个内核bug,这个bug会导致在安装完V10版本,并在尝试卸载时触发蓝屏。笔者在发现这个bug之后反馈给了Sysmon的开发维护人员,预计会在近期修复这个bug)。笔者在最近发现Sysmon存在version.dll劫持的漏洞,笔者曾提交该漏洞值MSRC。MSRC的人回复说这个不符合他们的漏洞安全服务标准,认为这个优先级很低,自然也就不会有CVE号了,但是微软说会修复这个漏洞(PS:也许看到此文章时,该漏洞已被修复,如果您想自行验证的话,可以使用之前版本的Sysmon来验证)。鉴于Sysmon已经被广泛使用,并且经过MSRC的回复说可以披露该漏洞信息,因此我认为披露出这个漏洞是有必要的。
我在查看Sysmon二进制文件信息时发现在Sysmon.exe以及Sysmon64.exe的导入函数中出现了version.dll中的API:Sysmon会利用version.dll中的API来获取文件版本信息。于是想到这里可能存在被劫持利用的可能!

在验证是否能被劫持之前,先介绍下version.dll。version.dll是用于Windows NT上的应用程序进行Windows文件版本检查的模块,在正常的系统中,它会存在系统的System32和SysWOW64目录中,当然也不排除第三方应用中会存在自己的version.dll。
接下来就是验证能否被劫持,我迅速编写了一个假的version.dll,并将其放置在了如下位置:
1. Sysmon的安装目录(任何安装sysmon时的目录)
2. C:Windows目录:安装完之后,Sysmon的主文件Sysmon.exe和驱动文件SysmonDrv.sys会存在这个目录中。
结果发现,Sysmon会毫不犹豫的加载我自己构造的version.dll,并且在Windows7和Windows10等多个系统中都适用(注:C:Windows中原本是不存在version.dll的):


这其实是很可怕的。通过version.dll劫持利用,我可以轻松实现以下目的:
1) 持久化:Sysmon是系统服务,会跟随系统启动而运行。因此,通过这种劫持方式,恶意程序可以轻松实现持久化驻留而很难被发现。
2) 特权提升:作为系统服务,Sysmon会以system的身份运行,那么加载的假的version.dll将也能够自动获取System权限运行。
构造POC也是非常简单的。我的假的version.dll只需要导出Sysmon所需要的真正的version.dll中的API,接下来做一些简单的利用,这里是弹出了一个对话框并调用计算器程序。但这里其实是可以做到任意代码执行的!

接下来就是把构造好的version.dll放置到与Windows目录下,便可以轻松实现version.dll的劫持利用了!
可以看到,计算器程序被唤起,并且是以system权限运行的:



我们可以使用Sysmon本身的事件类别来做监控:
1. FileCreate(事件ID:11):向C:Windows目录创建version.dll。
2. ImageLoad(事件ID:7):Sysmon.exe(Sysmon64.exe)加载非系统目录(system32、SysWOW64)下的version.dll。
3. 待微软修复这个漏洞,尽快更新Sysmon到最新版本。
最后说一句,version.dll是大多数应用程序会使用的dll,也许这些应用程序都存在被劫持的风险。感兴趣的读者可以自行验证。