文章总结: 本文通过CTF样题详解Word文档及VBA宏加密绕过思路。首先利用office2john和John工具爆破文档打开密码,接着用msoffcrypto解密文档。文章深入剖析了VBA工程加密原理,演示了手动修改vbaProject.bin中DPB标记或使用olevba工具提取代码的技巧。最后通过分析VBA脚本逻辑,修改代码直接输出解密线索,推导出最终Flag,展示了完整的Office文档安全分析与取证实战过程。 综合评分: 88 文章分类: CTF,办公安全,逆向分析,安全工具,实战经验
深入研究 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 工程密码”,你会看到一个弹窗让你输入密码
这会让新手以为:
宏被加密了,我不输入密码就永远看不到宏代码
但事实是:
-
宏代码大多仍然原样存在文件里
-
密码保护主要是“阻止你在 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 = "©È©Y¨¯q£ø~") Then strdec = Decode(Dialog.Label_ls.Caption, sinput)ElseIf (strusout = "£ëGJE£ç£ñ") Then strdec = Decode(Dialog.Label_ls1.Caption, sinput)ElseIf (strusout = "§À¦¯opz+") Then strdec = Decode(Dialog.Label_ls2.Caption, sinput) ' <-- 8位口令对应这条ElseIf (strusout = "£ú¦ªjr§º¦Õ¦Å¤¢") Then strdec = Decode(Dialog.Label_ls4.Caption, sinput)ElseIf (strusout = "¨¤¨µt£Õ£÷©Ë£è¨¨") Then strdec = Decode(Dialog.Label_ls3.Caption, sinput)Else strdec = "密码不正确,别泄气再来!"End If
Label_CLUE.Caption = strdec
观察脚本发现 strusout = Encode(strusrinput, t)在和 5 个常量比较
If strusout = A Then strdec = Decode(Label_ls.Caption, sinput)ElseIf strusout = B Then strdec = Decode(Label_ls1.Caption, sinput) ...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
Dest0g3{VBScr1pt_And_Hashc4t_1s_g00d}
文章转自先知社区,原作者:用户wRXYxrAEhl,侵删
原文链接:https://xz.aliyun.com/news/90908
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:马哥网络安全 《深入研究 Word 加密及加密宏绕过思路及原理》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论