解决方法
>“无害”JavaScript
>恶意JavaScript
案例1:无害,“有用”,“开放”的JavaScript
OP提供了一个链接到PlanetPDF的JavaScript加载PDF示例:
> http://www.planetpdf.com/planetpdf/pdfs/ppjslc_commonex_3.pdf
那一个很容易处理.只需使用pdfinfo -js(但请确保使用最新的基于Poppler的版本之一 – 基于XPDF的pdfinfo不了解-js!)
结果如下:
$pdfinfo -js ppjslc_commonex_3.pdf Title: Planet PDF JavaScript Learning Center Example #2 Author: Chris Dahl,ARTS PDF Global Services Creator: PScript5.dll Version 5.2.2 Producer: Acrobat Distiller 6.0.1 (Windows) CreationDate: Thu Oct 28 18:13:38 2004 ModDate: Thu Oct 28 18:17:46 2004 Tagged: no UserProperties: no Suspects: no Form: AcroForm JavaScript: yes Pages: 1 Encrypted: no Page size: 612 x 792 pts (letter) Page rot: 0 File size: 84720 bytes Optimized: no PDF version: 1.5 Name Dictionary "docOpened": // variable to store whether document has been opened already or not var bAlreadyOpened; function docOpened() { if(bAlreadyOpened != "true") { // document has just been opened var d = new Date(); var sDate = util.printd("mm/dd/yyyy",d); // set date now app.alert("About to insert date into field now"); this.getField("todaysDate").value = sDate; // now set bAlreadyOpened to true so it doesn’t // run again bAlreadyOpened = "true"; } else { // document has already been opened } } // call the docOpened() function docOpened();
如您所见,-js尝试从PDF中自动提取所有JavaScript并将其打印到< stdout>.
这个是一个无害的JavaScript,没有试图隐藏自己,没有混淆,在弹出一个关于它将要做什么的信息消息后,将当前日期插入到表单字段中.
案例2:恶意,破坏性,隐藏和混淆的JavaScript
在包含JavaScripts的荒野中有许多PDF文件的例子,它们不像上面那样无害,是由追随你的钱的恶意软件作者写的,或者只是在他们成功后给予他们的“乐趣”之后.
在这些情况下,JavaScripts经常被隐藏和混淆.
例如,为了隐藏甚至包含JavaScript的事实,它们不在相应的PDF对象字典中使用“clear”/ JavaScript和/ JS名称.这些名称必须存在,以便PDF阅读器知道它们应该如何处理对象.
/#4Aava#53cript /J#61vaScrip#74 /#4a#61#76#61#53#63#72#69#70#74 [...]
不幸的是,这种方法甚至被官方的PDF规范文件“合法化”.它允许通过各自的ASCII十六进制数替换PDF名称标记中某些甚至所有字符的选择(结合每个替换字符的前导哈希符号).
这可以欺骗一些更天真的尝试在PDF中找到/ JavaScript字符串(例如使用简单的grep -a).
有一些免费软件工具可用于剖析和分析此类案例:
> Didier Stevens的Python脚本pdfid.py
and pdf-parser.py
对于这些案例的初看(甚至是完整的分析)非常有用.
> Jose Miguel Esparza的Python框架peepdf更加强大.它甚至可以对PDF中的任何混淆的JavaScript内容进行去混淆,美化和再次可读.
> Origami是基于Ruby的,也非常强大.还有一些……
但是所有这些工具仅在你已经拥有(至少一些基本的)knowledge about PDF syntax(当然还有JavaScript)时才有用.
以下是使用pdfid.py对三种不同PDF的三个简短示例:
>第一个不包含pdfid.py发现的任何JavaScript:
$pdfid.py nojavascript.pdf PDFiD 0.2.1 nojavascript.pdf PDF Header: %PDF-1.5 obj 193 endobj 193 stream 54 endstream 54 xref 1 trailer 1 startxref 1 /Page 1 /Encrypt 0 /ObjStm 0 /JS 0 /JavaScript 0 /AA 12 /OpenAction 0 /AcroForm 1 /JBIG2Decode 0 /RichMedia 0 /Launch 0 /EmbeddedFile 0 /XFA 0 /Colors > 2^24 0
>第二个包含JavaScript,名称/ JavaScript以明文形式显示在PDF中:
$pdfid.py javascript1.pdf | grep -E '(/JS|/JavaScript) /JS 30 /JavaScript 30
>最后一个包含JavaScript,名称tokens / JavaScript和/ JS都被混淆:
$pdfid.py javascript2.pdf | grep -E '(/JS|/JavaScript) /JS 30(30) /JavaScript 30(30)
pdfid.py在括号中列出第二个数字的事实表明,它发现了混淆. 30个/ JavaScript名称令牌中的30个被遮挡 – 这使得PDF文件高度可疑,这需要进一步调查.因为没有“普通”的PDF生成工具(我知道)使用这种混淆…
更新
>“Extract JavaScript from malicious PDF”
目前最好的工具是peepdf.py,因为它甚至可以处理严重混淆的JavaScript.这是一个Python框架,用于探索(和更改)PDF文件的源代码,专门用于分析恶意PDF.
它的作者最近添加了extract子命令,它提取并打印PDF中包含的JavaScripts的源代码:
简短的使用信息:
>从GitHub查看源代码:git clone https://github.com/jesparza/peepdf.git git.peepdf>在脚本中创建符号链接(在$PATH中):cd git.peepdf;ln -s $(pwd)/peepdf.py ${HOME} /bin/peepdf.py>使用PeePDF子命令创建脚本文件以提取javascript:echo’extract js> all-javascripts-from-my.pdf’> xtract.txt>运行PeePDF(设置松散解析模式,-l和强制模式忽略错误,-f)以非交互方式执行新创建的脚本文件中包含的子命令行-s:peepdf.py -l -f -sxtract.txt my.pdf>调查提取的JavaScript的内容:cat all-javascripts-from-my.pdf