深入研究Word加密及加密宏绕过思路及原理

admin 2026-01-04 01:46:53 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文通过CTF样题详解Word文档及VBA宏加密绕过思路。首先利用office2john和John工具爆破文档打开密码,接着用msoffcrypto解密文档。文章深入剖析了VBA工程加密原理,演示了手动修改vbaProject.bin中DPB标记或使用olevba工具提取代码的技巧。最后通过分析VBA脚本逻辑,修改代码直接输出解密线索,推导出最终Flag,展示了完整的Office文档安全分析与取证实战过程。 综合评分: 88 文章分类: CTF,办公安全,逆向分析,安全工具,实战经验


cover_image

深入研究 Word 加密及加密宏绕过思路及原理

马哥网络安全

2026年1月2日 17:01 河南

本文参考样题如下:

解压缩有三个文件

首先是 hint.txt

The length of docm 's password is 6The Regular Expression of the password is:[a-z] [a-z] q [a-z] b [a-z]

得知 password.docm 密码全小写字母,且满足 ??q?b?,使用 john 爆破

将文档中的哈希提取出来,保存为 hash.txt

office2john password.docm > word.hash

使用掩码攻击尝试爆破 hash.txt 中的密码哈希

john --mask='?l?lq?lb?l' word.hash# ?l 表示 小写字母(a-z)# q 和 b 是固定字符

打开文档发现有宏

启用要输入密码

什么是宏加密?

当你打开一个带宏的 Word/Excel(比如 .docm / .xlsm),进入 VBA 编辑器时,如果作者设置了“VBA 工程密码”,你会看到一个弹窗让你输入密码

这会让新手以为:

宏被加密了,我不输入密码就永远看不到宏代码

但事实是:

  1. 宏代码大多仍然原样存在文件里

  2. 密码保护主要是“阻止你在 VBA 编辑器里查看/编辑”,不是把内容真的加密到不可恢复

你可以把它理解成:

  • 像给抽屉门贴了一个“禁止打开”的封条(提示你别开)

  • 但抽屉里面东西没锁死,只要你把封条撕掉,抽屉还是能开

docm 文件解析

docm/xlsm 文件其实是一个“压缩包”

你只要把文件后缀改一下,就能看到

或者可以直接使用压缩文件看

普通文件的宏位置

一般解压能看到

word/_rels/[Content_Types].xml

宏在

word/vbaProject.bin

vbaProject.bin 解析

vbaProject.bin 不是普通文本,它是一种叫:

OLE 复合文档(可以理解成“一个文件里套了很多小文件”)

里面包含宏代码

加密宏格式

在很多版本里,“是否设置了宏密码”会在 vbaProject.bin 的某处出现一段可读的英文标记,例如:

DPB="xxxxxx"

DPB 可以理解成:“这份 VBA 工程被加了密码保护”的标记

当 Office 发现这个标记“看起来正常”,就会弹窗要密码

如果这个标记“不正常/不存在”,Office 可能就不会再弹窗(等于“绕过”)

因为 DPB 是 ASCII 文本,所以你在十六进制编辑器里一般可以:

  • 直接用“搜索文本/查找字符串”功能搜索:DPB

  • 或者查找十六进制:44 50 42

加密文件的宏位置

像上面的就是做了加密

EncryptedPackage    被加密的 Word 内容整体压缩包EncryptionInfo   加密说明书,存的是加密算法、模式等等DataSpaces             Office 加密规范的一部分,描述“哪些内容被哪些密钥保护”

绕过原理

1、解除Word文档的密码保护

因为加密文件中没有 vbaProject.bin文件

所以第一步必须是用密码 ulqsbt 把 EncryptedPackage 解密成真实的压缩包

msoffcrypto: 专门处理 Microsoft Office 文件加密的 Python 库

pip install msoffcrypto-tool
import msoffcrypto# Path:从pathlib模块导入,用于处理文件路径,提供跨平台的文件操作支持from pathlib import Path
# 定义输入和输出文件的路径对象# in_file:指向当前目录下名为"password.docm"的加密文件in_file = Path("password.docm")# out_file:输出文件,解密后保存为"decrypted.docm"out_file = Path("decrypted.docm")
# 打开加密的输入文件(以二进制只读模式)# 使用with语句确保文件正确打开和关闭with in_file.open("rb") as f:    # 创建OfficeFile对象,表示要处理的Office文档    office = msoffcrypto.OfficeFile(f)
    # 加载解密所需的密码    # 这里使用密码"ulqsbt"来解锁文档    office.load_key(password="ulqsbt")
    # 打开输出文件(以二进制写入模式)    # 如果文件不存在则创建,存在则覆盖    with out_file.open("wb") as out:        # 执行解密操作,将解密后的内容写入输出文件        office.decrypt(out)
# 解密完成后,打印成功信息# 显示输出文件的路径,确认解密完成print("OK ->", out_file)

运行脚本可以看到

2、绕过加密宏

2.1、手动绕过

找到 DPB将其修改为其他值如 DPA, 让 Office 找不到合法的 DPB 标志

在这个目录下将所有文件重名打包成 ZIP 并重命名

2.2、脚本绕过

用专门查看 VBA 的工具

pip install oletoolsolevba word/vbaProject.bin

关键分支如下:

t = ChrW(21152) & ChrW(27833) & ChrW(21543) & ChrW(65292) & ChrW(21516) & ChrW(23398) & ChrW(20204) & ChrW(65281)' t = "加油吧,同学们!"
strusout = Encode(strusrinput, t)
If (strusout =&nbsp;"©È©Y¨¯q£ø~") Then&nbsp; &nbsp; strdec = Decode(Dialog.Label_ls.Caption, sinput)ElseIf (strusout =&nbsp;"£ëGJE£ç£ñ") Then&nbsp; &nbsp; strdec = Decode(Dialog.Label_ls1.Caption, sinput)ElseIf (strusout =&nbsp;"§À¦¯opz+") Then&nbsp; &nbsp; strdec = Decode(Dialog.Label_ls2.Caption, sinput) &nbsp;' <-- 8位口令对应这条ElseIf (strusout =&nbsp;"£ú¦ªjr§º¦Õ¦Å¤¢") Then&nbsp; &nbsp; strdec = Decode(Dialog.Label_ls4.Caption, sinput)ElseIf (strusout =&nbsp;"¨¤¨µt£Õ£÷©Ë£è¨¨") Then&nbsp; &nbsp; strdec = Decode(Dialog.Label_ls3.Caption, sinput)Else&nbsp; &nbsp; strdec =&nbsp;"密码不正确,别泄气再来!"End If
Label_CLUE.Caption = strdec

观察脚本发现 strusout = Encode(strusrinput, t)在和  5 个常量比较

If&nbsp;strusout&nbsp;=&nbsp;A&nbsp;Then&nbsp; &nbsp;&nbsp;strdec&nbsp;=&nbsp;Decode(Label_ls.Caption, sinput)ElseIf&nbsp;strusout&nbsp;=&nbsp;B&nbsp;Then&nbsp; &nbsp;&nbsp;strdec&nbsp;=&nbsp;Decode(Label_ls1.Caption, sinput)&nbsp; &nbsp; ...End IfLabel_CLUE.Caption = strdec

但我们不需要搞清楚 Encode() 到底怎么加密,只要让 Decode() 把那些 Label_lsX.Caption 的密文解出来就行

Label_CLUE.Caption = strdec改成Label_CLUE.Caption = Decode(xxx, t)

其中 xxx 分别替换成五个分支里对应的:

Dialog.Label_ls.CaptionDialog.Label_ls1.CaptionDialog.Label_ls2.CaptionDialog.Label_ls3.CaptionDialog.Label_ls4.Caption

然后回到 Word 运行 AutoOpen,随便输入字符点确定,就能在 label 里看到 Decode 输出的明文

依次得到:

  • 123456

  • aaaaaa

  • 000000

  • 墙角数枝

  • iloveyou

最后回到正常流程:用明文去测试发现 墙角数枝 回显解压密码:两只黄鹂鸣翠柳,一行白鹭上青天!

结合题面 hint 推断 RAR 密码(16位,含字母数字符号)

你把它按“拼音首字母 + 数字 + 符号”的常见 CTF 口令格式压缩:

  • 两只黄鹂鸣翠柳 → 2zhlmcl

  • 一行白鹭上青天 → 1hblsqt

  • 保留逗号、句号(符号) → 得到 16 位复杂口令: 2zhlmcl,1hblsqt.

最后得到 flag

&nbsp;Dest0g3{VBScr1pt_And_Hashc4t_1s_g00d}

文章转自先知社区,原作者:用户wRXYxrAEhl,侵删

原文链接:https://xz.aliyun.com/news/90908


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:马哥网络安全 《深入研究 Word 加密及加密宏绕过思路及原理》

企业SRC如何月入过万 网络安全文章

企业SRC如何月入过万

文章总结: 本文分享企业SRC实战经验。信息收集建议利用搜索引擎语法及域名变体发现隐藏资产。挖掘方面提出关注排序注入、使用CaA插件Fuzz参数、被动扫描高危接
评论:0   参与:  0