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)數量
0x4 參考
PDF格式詳解
http://blog.csdn.net/bobob/article/details/751381
PDF Tools
https://blog.didierstevens.com/programs/pdf-tools/
惡意PDF文件解析思路
https://wenku.baidu.com/view/0c05dd996529647d27285224.html