恶意PDF文档分析记录

0x1 PDF是什么

PDF(便携式文件格式,Portable Document Format)是由Adobe Systems在1993年用於文件交换所发展出的文件格式。

因为PDF的文件格式性质广泛用于商业办公,引起众多攻击者对其开展技术研究,在一些APT(Advanced Persistent Threat)攻击中。针对特定目标投递含有恶意代码的PDF文档,安全意识薄弱的用户只要打开PDF文档就会中招。

0x2 PDF解析工具

PdfStreamDumper : 这是一款可以对恶意的PDF文档进行分析的免费工具

以下是利用漏洞【CVE-2010-0188】的恶意PDF文档样本,文档中的Payload为异或加密。

图1

pdfid.py : 这个工具不是PDF解析器,但是它会扫描一个文件来寻找特定的PDF关键字,让我们识别包含JavaScript的PDF文件。

复制代码
pdfid.py xxx.pdf

图2

0x3 PDF格式解析

使用pdfid.py解析之后会列出PDF当前的格式字段。

复制代码
C:\>python pdfid.py xx.pdf

PDFiD 0.2.1 93c803.pdf

 PDF Header: %PDF-1.7
 obj                   60
 endobj                60
 stream                30
 endstream             30
 xref                   1
 trailer                1
 startxref              1
 /Page                  3
 /Encrypt               0
 /ObjStm                0
 /JS                    0
 /JavaScript            0
 /AA                    0
 /OpenAction            0
 /AcroForm              0
 /JBIG2Decode           3
 /RichMedia             0
 /Launch                0
 /EmbeddedFile          0
 /XFA                   0
 /Colors > 2^24         0

每一个PDF文件都包含有前7个字段,也有可能不包含strea和endstream。据说有一些ODF文件没有xref或则trailer,但是这种情况比较少见。如果一个PDF文件没有xref或者trailer关键字段,那么可以确定它不是恶意的PDF文件。

/xref 交叉引用表,描述每个间接对象的编号、版本和绝对的文件位置。PDF文档中的第一个索引必须从版本65535的0号对象开始,标识符/xref后面的第一个数字是第一个间接对象(即0号对象)的编号,第二个数字是/xref(交叉引用表)的大小。

/Page指明PDF文件的页数,大多数恶意PDF文件仅仅只有一页

/Encrypt指明PDF文件有数字水印或者是被加密过的。

/ObjStm是object streams的数量。object streams是一个可以包含其他Object对象的数据流对象。

/JS与/JavaScript指明PDF文件中含嵌有JavaScript代码。通常恶意的PDF文件都嵌套有JavaScript代码,这里一般都是利用JavaScript的解析漏洞或者使用JavaScript来实现堆喷射(heap spray),也有很多正常的PDF文件里会含有JavaScript代码

/AA、/OpenAction和/AcroForm指明当查看PDF文件或者PDF的某页时会有动作随其执行,几乎所有嵌有JavaScript代码的恶意PDF文件都有自动执行JavaScript代码的动作(action)。如果一个PDF文件包含有/AA或/OpenAction自动执行动作的关键字段,而且含有JavaScript代码,那么这个PDF文件就极有可能是恶意的PDF文件

/URI 如果你要在PDF文件中执行打开网页的动作就需要这个关键字段

/Filter 一般为FlateDecode则是使用了Zlib压缩解压缩算法。

/JBIG2Decode指明PDF文件使用了JBIG2压缩。虽然JBIG2压缩本身可能会有漏洞(CVE-2010-1297)。但/JBIG2Decode关键字段并不能说明PDF文件是否可疑

/RichMedia Flash文件

/Launch执行动作(action)数量

相关推荐
为自己_带盐1 小时前
安敢越雷池一步?浅尝雷池WAF社区版
运维·web安全
中微极客1 小时前
多智能体编排实战:CrewAI vs AutoGen(2026版)
大数据·网络·人工智能
小王C语言2 小时前
【3. 基于 Vibe Coding 的 OJ 平台】. 构建仓库、环境准备、需求梳理、安装依赖
网络·c++
BEOL贝尔科技2 小时前
样本安全存储中还有哪些重要因素需要考虑?如何设置样本安全?
人工智能·安全·数据分析
新手unity自用笔记2 小时前
unity网络基础_1
网络·unity·游戏引擎
卓豪终端管理2 小时前
零信任落地,终端是「最后一公里」也是「最难一公里」
安全
小王C语言2 小时前
【8.进行接口测试】:通过 curl 进行接口自动化测试 / 通过 python 程序进行接口自动化测试
网络·c++
一条大祥脚2 小时前
26杭电暑期第三场 DP|费用流|分解质因子|数论|贪心|图论|期望|无穷级数
网络·图论·网络流·无穷级数·费用流
早睡早起身体好1233 小时前
为什么 Network 中会出现两个同名请求?——CORS 预检请求学习笔记
网络·笔记·学习·网络安全
niaiheni3 小时前
红队实战:记一次Spring Cloud Gateway SpEL表达式注入到哥斯拉内存马(CVE-2022-22947)
web安全·spring cloud·网络安全