目录导航
恶意 docx 生成器利用工具 CVE-2021-40444(Microsoft Office Word 远程代码执行漏洞),适用于任意 DLL 文件。
背景
尽管许多 PoC 已经在互联网上出现,但我猜想给自己一个将这个漏洞武器化的机会,因为我发现可用的信息缺乏,值得分享有价值的信息,同时考虑到微软已经针对这个漏洞发布了补丁。
到目前为止,我所看到的创建一个完全工作的生成器的唯一有价值的资源是:
上述资源概述了创建完整链所需的许多要求。为避免重复过多不必要的信息,我只总结一下相关细节。
漏洞利用链
- Docx 已打开
- 存储在 document.xml.rels 中的关系指向恶意 html
- 启动 IE 预览以打开 HTML 链接
- HTML 中的 JScript 包含一个指向 CAB 文件的对象和一个指向 INF 文件的 iframe,以“.cpl:”指令为前缀
- cab文件打开,INF文件存放在%TEMP%\Low目录下
- 由于 CAB 中的路径遍历 (ZipSlip) 漏洞,可以将 INF 存储在 %TEMP%
- 然后,使用“.cpl:”指令打开 INF 文件,导致通过 rundll32 侧加载 INF 文件(如果这是一个 DLL)
被忽视的条件
这个漏洞利用有很多被忽视的条件,这导致即使是好的 PoC,比如 lockedbyte 的 PoC,也无法正常工作。
也许没有人明确地“发布”它们以避免漏洞被更多地利用。不过现在已经打补丁了,应该不会有什么麻烦再放出细节吧。

HTML文件
至于这种tweet由威尔杜曼的HTML应该是大小至少4096个字节,以在MS Word中触发“预览” 。
cab文件
CAB 文件需要进行字节修补以避免提取错误并实现 ZipSlip:
filename.inf
应该成为../filename.inf
filename.inf
应该是<12-char>.inf
CFFOLDER.typeCompress
应为 0(未压缩)CFFOLDER.coffCabStart
应该增加3CFFOLDER.cCfData
应该是 2CFFILE.cbFile
应该大于整体CFHEADER.cbCabinet
CFDATA.csum
应该重新计算(或清零)
这些限制的原因很多,我没有花足够的时间去深入了解所有这些,但让我们看看最重要的:
- TypeCompress:如果 CAB 被压缩,在目标文件中打开它以触发 INF 写入的技巧将失败
- CoffCabStart : CoffCabStart 给出第一个 CFDATA 结构的绝对位置,因为我们添加了一个 ‘../’,我们需要将它增加 3 以指向文件(这更像是一个猜测)
- cCfData:由于只有 1 个文件,我们应该只有 1 个 CFDATA,我不太确定为什么必须将其设置为 2
- cbFile:有趣的是,如果 CAB 提取没有任何错误,INF 文件将被 WORD 标记为删除,从而破坏漏洞利用。防止这种情况的唯一方法是让 WORD 相信提取失败。如果 cbFile 值被定义为大于 CAB 文件本身,则提取器将在读取 cbFile 中定义的所有字节之前达到 EOF,从而引发提取错误。
- 最后但并非最不重要的是,应该重新计算csum值。幸运的是,正如j00sean所指出的 ,根据MS 文档,这个值可以是 0
注意 1:Defender 现在通过使用该_IMAGE_DOS_HEADER.e_magic
值作为签名来检测 CAB 文件是否包含 PE ,从而可能避免将 PE 文件嵌入到 CAB 中。可以绕过这个签名吗?我不确定,但正如之前所观察到的,这是一个修补过的漏洞,所以我不打算在这方面投入更多时间。由好奇的读者进一步探索。
NOTE2:Microsoft Patch 阻止任意 URI 方案,显然使用了黑名单方法(这只是一个假设)
DLL 攻击
与 CVE-2021-40444 相关的主要攻击链是通过.cpl
URI 方案加载的 DLL 攻击。为了利用它,攻击者需要生成一个特制的 DLL。如果你想测试它,试试我的evildll-gen 脚本。
JScript、VBScript、Javaw、MSIexec、…
正如Max Maluin所指出的,可以与滥用 IE 和相关文件扩展名的 URI 的多种文件类型进行交互。虽然这可能是利用 IE 的好方法,但它有局限性。
确实需要注意的是,漏洞利用中下载文件的方法是基于ActiveX控件更新的,不能用于下载任意文件。根据 Microsoft文档,该codebase
标签可以仅指向几种文件类型:OCX、INF 和 CAB。
即使我们可以直接下载 OCX 或 INF 文件,我们仍然不能确保将文件下载到系统内的正确位置。使用 cab 漏洞,可以使用.inf
路径遍历将文件移动到众所周知的路径中,但在任何其他情况下,文件将存储在随机目录中,因此几乎不可能引用它。
截至今天,我还没有找到一种无需 CAB 文件即可链接下载和执行的方法。
注意:仅就 IE 而言,HTML 走私可能是利用该漏洞的一种可能情况。
使用混合 RAR 文件的无Cab文件攻击
这种技术首先由公开爱德华布劳恩Twitter和在进一步说明本纸张。
请注意,使用这种技术,攻击链有点不同。此攻击要求用户下载特制的 RAR 文件,该文件通过链接有效的 WSF 脚本和有效的 RAR 文件获得。打开后,RAR 将包含一个带有对 HTML 的引用的 DOCX,后者将尝试将 RAR 文件加载为 WSF 脚本。
总结一下:
- 下载特制的RAR文件(可能是下载文件夹)
- DOCX 提取并打开
- 存储在 document.xml.rels 中的关系指向恶意 html
- 启动 IE 预览以打开 HTML 链接
- HTML 中的 JScript 包含一个指向 RAR 文件的脚本/iframe,前缀为“.wsf:”URI 方案
- 由于 RAR 被设计为同时是有效的 RAR 和有效的 WSF 脚本,因此脚本被执行
该工具实现的漏洞利用PoC有哪些
生成器实用程序目前可以重现以下攻击:
攻击 | HTML模板 | 目标 | 传输方式 | 执行方式 | Working |
---|---|---|---|---|---|
原始的攻击版本 | cab-orig-* | WORD | DOCX | CAB + DLL | YES |
j00sean IE-only 攻击 | cab-orig-j00san | IE | HTML | CAB + DLL | YES |
我的没有 DLL 的版本 | cab-uri-* | WORD | DOCX | CAB + JS/VBS | NO1 |
Eduardo B. 使用 RAR 的“CABless”攻击 | cabless-rar-* | WORD | RAR | WSF | YES |
修改j00sean攻击+HTML走私 | cabless-smuggling-* | IE | HTML | JS/VBS | YES2 |
1某些环境下CAB下载不正确
2用户需要点击“保存”在IE上下载文件
CAB 文件解析器
该实用程序cab_parser.py
可用于查看漏洞利用文件的标头,但不要将其视为完整的解析器。这是我开发的一个非常快速和肮脏的 CAB 标题查看器,以了解发生了什么。
工具下载地址
①GitHub:
https://github.com/klezVirus/CVE-2021-40444.zip
②云中转网盘:
yunzhongzhuan.com/#sharefile=Bb1kzVqp_…
解压密码: www.ddosi.org
安装
生成器设计为在 Windows 上工作,因为它使用该makecab
实用程序。
使用前,请务必安装所需的依赖项:
- 使用 Virtualenv
git clone https://github.com/klezVirus/CVE-2021-40444
cd CVE-2021-40444
pip install virtualenv
python -m virtualenv venv
venv\Scripts\activate.bat
pip install -r requirements
- 没有 Virtualenv
git clone https://github.com/klezVirus/CVE-2021-40444
cd CVE-2021-40444
pip install -r requirements
用法
生成器使用起来很简单,即使它已经用许多不同的payloads和 Windows 版本进行了测试,它也不是万无一失的。我在不同的 Windows 版本中遇到了不同的行为。一旦我有更多细节要分享,我会在这里发布。
用法: generator.py [-h] -P PAYLOAD -u URL [-o OUTPUT] [--host] [-c COPY_TO] [-nc] [-t]
[%] CVE-2021-40444 - MS Office Word RCE Exploit [%]
可选参数:
-h, --help 显示此帮助信息并退出
-P PAYLOAD, --payload PAYLOAD
用于利用的DLL有效负载
-u URL, --url URL 恶意引用的服务器URL (CAB->INF)
-o OUTPUT, --output OUTPUT
输出文件basename(没有扩展名)
--host 如果设置,将在创建后托管有效负载
-c COPY_TO, --copy-to COPY_TO
将有效载荷复制到备用路径
-nc, --no-cab 使用该漏洞的无cab版本
-t, --test 打开ie来测试最终的HTML文件
例子
- 生成原始漏洞并在本地测试
python generator.py -u http://127.0.0.1 -P test\calc.dll --host
注:端口由URL选择,漏洞利用根据payload文件扩展名生成
- 使用 RAR 生成 CABless 漏洞并通过 IE 在本地进行测试
python generator.py -u http://127.0.0.1 -P test\job-jscript.wsf --no-cab --host -t
- 使用 HTML 走私生成 CABless 漏洞(仅限 IE)并通过 IE 在本地进行测试
python generator.py -u http://127.0.0.1 -P test\calc.js --no-cab --host -t