PackMyPayload - 容器化恶意软件的新兴威胁该工具接收文件或目录作为输入,并将其嵌入到充当归档/容器的输出文件中。它可作为概念验证,展示容器文件格式与嵌入恶意软件的新兴风险,同时作为专业红队操作员的助手,以优化其初始访问策略。
目前已知威胁行为者通过多种容器文件格式走私恶意软件,例如:
7zipzipISOIMG他们这样做是为了让有效载荷绕过文件内容扫描器,但更重要的是避免在其文件上留下“网络标记”标志。攻击者不希望在其文件上出现 MOTW 的原因有多种:Microsoft Office 中的受保护视图一直是其中之一。
如果他们向受害者提供容器文件,可能绕过针对源自 Internet 的 Office 文档禁用 VBA 宏的基础。
2022年2月7日,Microsoft 宣布默认配置更改,阻止源自 Internet 的 VBA 宏。这是朝着强化用户工作站基线配置及其中安装的客户端软件迈出的重要一步。虽然姗姗来迟,但这是一项重要举措,显著且积极地影响了典型的 Windows+Office 安装配置。
已实现的行为解释为:基于 MOTW(网络标记)标志来区分启用宏的 Office 文档。该标志充当一个“污染”标签,供软件客户端(浏览器、邮件客户端、文件归档器等)标记来自不受信任区域(如 Internet)的文件。
Outflank 在 2020 年更详细地阐述了 MOTW,指出了 MOTW 标志未统一传播的区域。这些区域起到了防御缺口的作用,多年来一直被威胁行为者普遍滥用。
他们的研究表明,一些容器文件格式——即 ISO、VHD/VHDX——在自动挂载或自动提取时不传播 MOTW 污染标志到内部文件。此外,Windows 8+ 能够通过双击自动打开这些格式,使其成为臭名昭著的感染载体,可能降低 MOTW 作为安全措施的作用。
让我们展示“网络标记”标志在实践中的样子:

下载文件后,右键单击并查看其属性。
您将看到一条提示消息,要求解除文件阻止,因为它源自不受信任的区域:

该信息存储在名为 Zone.Identifier 的 NTFS ADS(备用数据流)中,如下所示:

ZoneId=3 充当标记文件为“已污染”的作用。
使用 PackMyPayload.py 轻松将文件放入 ISO Joliet 光盘,命令如下:
PS> py PackMyPayload.py 7z2107-x64.exe 7z2107-x64.iso

创建 ISO 文件后,使用 Python 模拟 HTTP 服务器:
PS> py -m http.server 80
然后使用浏览器下载 ISO 文件。

当您查看该 ISO 文件的属性时,您会看到它带有 MOTW 标志。

但是,内部的 7zip 安装程序 EXE 文件没有 MOTW 标志!

借行业目光聚焦于 Microsoft 阻止 VBA 宏这一勇敢决定之际,我们专业安全研究人员,在最大程度上考虑提高世界技术对其滥用的抵御能力,希望就当前威胁行为者的 TTP 提出以下见解:
威胁行为者非常清楚 MOTW 对其钓鱼有效载荷的影响。他们早已适应,并正在容器内走私恶意程序。在常见观察到的容器类型中,我们可以突出 ISO、IMG、CAB。
我现在发布此工具,以借 Microsoft 立场所形成的势头,帮助加剧关于这些规避途径的讨论。
建议在适当的情况下,对源自不受信任区域且具有上述扩展名的文件进行遏制(和/或阻止):
发布的工具有望让更多红队模拟所讨论的风险,并帮助他们更容易地识别合作伙伴防御中的检测漏洞。
此脚本提供以下特性和好处:
支持的格式:
| 格式 | 是否可以剥离 MOTW? | 开箱即用的 Windows 支持? | 需要提权? | 备注 |
|---|---|---|---|---|
Zip | 否/是* | 是 | 否 | (利用 CVE-2022-41091 可剥离 MOTW) |
7zip | 部分 | 否 | 否 | 仅在手动提取文件时剥离 MOTW |
ISO | 是 | 是 | 否 | |
IMG | 是 | 是 | 否 | |
PDF | ? | 是 | 否 | 取决于 PDF 阅读器对 JavaScript 的支持 |
CAB | 否 | 是 | 否 | 需要在受害者端进行额外几次点击 |
VHD | 是 | 是 | 是 | 此脚本当前无法创建目录 |
VHDX | 是 | 是 | 是 | 此脚本当前无法创建目录 |
--zip-noreadonly。cmd> pip3 install -r requirements.txt
PS> py PackMyPayload.py C:\my\dir malicious.iso -v
+ o + o + o + o
+ o + + o + +
o + + + o + + o
-_-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-_-_-_-_-_-_-_,------, o
:: PACK MY PAYLOAD (1.2.0) -_-_-_-_-_-_-| /\_/\
for all your container cravings -_-_-_-_-_-~|__( ^ .^) + +
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-__-_-_-_-_-_-_-'' ''
+ o o + o + o o + o
+ o + o ~ Mariusz Banach / mgeeky o
o ~ + ~ <mb [at] binary-offensive.com>
o + o + +
[.] 正在将输入文件打包到输出 .iso (iso)...
Burning files onto ISO:
Adding file: //malicious.lnk
Adding file: //malicious.docm
[INFO] [+] 文件已打包到 ISO。
[INFO] 成功打包输入文件。
[+] 生成的文件已写入(大小:69632):malicious.iso
DISKPART 需要管理员权限访问物理设备对象/命名空间。最佳体验是在支持 ANSI 颜色的 Windows Terminal (wt) 或 ConEmu 上运行脚本。否则,如果输出看起来不佳,请使用 -N 标志禁用颜色:PS> py PackMyPayload.py .\evil.lnk .\evil.vhd -v -N
+ o + o + o + o
+ o + + o + +
o + + + o + + o
-_-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-_-_-_-_-_-_-_,------, o
:: PACK MY PAYLOAD (1.2.0) -_-_-_-_-_-_-| /\_/\
for all your container cravings -_-_-_-_-_-~|__( ^ .^) + +
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-__-_-_-_-_-_-_-'' ''
+ o o + o + o o + o
+ o + o ~ Mariusz Banach / mgeeky o
o ~ + ~ <mb [at] binary-offensive.com>
o + o + +
[.] 正在将输入文件打包到输出 .vhd (vhd)...
[INFO] 当前占用的驱动器盘符:
X
C
Z
D
[INFO] 将创建大小为 1024MB(动态扩展)的 VHD
[INFO] 将分配 VHD 盘符:V:
[INFO] 将使用 FAT32 格式化 VHD
[INFO] 正在创建 VHD 文件...
[+] 已创建并挂载 VHD 文件到 V:\
[.] 将文件打包到创建的 VHD 中...
[INFO] 已打包文件:
[INFO] evil.lnk => V:\
[.] 正在分离 VHD 文件...
[+] 已从 V:\ 分离 VHD 文件
[INFO] [+] 文件已打包到 VHD。
[INFO] 成功打包输入文件。
[+] 生成的文件已写入(大小:6311936):evil.vhd
usage:
+ o + o + o + o
+ o + + o + +
o + + + o + + o
-_-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-_-_-_-_-_-_-_,------, o
:: PACK MY PAYLOAD (1.3.0) -_-_-_-_-_-_-| /\_/\
for all your container cravings -_-_-_-_-_-~|__( ^ .^) + +
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-__-_-_-_-_-_-_-'' ''
+ o o + o + o o + o
+ o + o ~ Mariusz Banach / mgeeky o
o ~ + ~ <mb [at] binary-offensive.com>
o + o + +
Usage: PackMyPayload.py [options] <infile> <outfile>
options:
-h, --help show this help message and exit
Required arguments:
infile 要打包到输出归档/容器的输入文件/目录
outfile 输出文件,扩展名指向输出格式