原文:http://countuponsecurity.com/2014/09/22/malicious-documents-pdf-analysis-in-5-steps/
大多数企业网络边界都被保护。然而恶意pdf文件或MS office 软件可以成功通过防火墙,IPS,Anti-spam,杀毒软件以及其它保护措施。当到达受害邮箱后,通过使用社会工程技巧诱惑用户点击/打开文档。例如,如果用户打开一个恶意pdf文件,当Adobe处理一个精心制作的文件时它通常会执行含有漏洞的Javascript代码。它会破坏堆/栈内存导致它执行一个从网络下载的恶意程序。根据Didier Stevens的描述([url]http://blog.didierstevens.com/[/url]),在一些场合下,可以不用点击文件,只需下载文件就可以利用漏洞执行恶意程序。
整体来看,PDF有header,body,reference table以及trailer组成。其中最重要的是body,body可能含有各种content type object,所以漏洞研究者对于parser十分感兴趣。语言丰富复杂的意思是同样的信息可以使用很多种方法编码以及模糊处理。例如object中可以有存储任意类型,任意大小的流。这些流被压缩,PDF标准支持多种算法包括ASCIIHexDecode,ASCI85Decode,ASCI85Decode,FlateDecode, RunLengthDecode, CCITTFaxDecode, DCTCDecode,它们被称为filter。PDF文件可以支持多媒体内容以及通过Flash object支持Javascript和ActionScript。使用JavaScript是一个很流行的攻击向量,因为可以使用不同的技术把它藏到流中,从而很难被发现。当PDF文件含JavaScript代码时,恶意代码通过触发一个漏洞然后执行shellcode。所有这些特点和能力都将成为攻击目标。
[b]本文通过REMnux来分析步骤:
1. 找到提取JavaScript
2. 去模糊JavaScript
3. 提取shellcode
4. 创建一个可执行的shellcode
5. 分析shellcode,确定功能[/b]
使用REMnux小抄:[color=blue][b]http://zeltser.com/reverse-malware/analyzing-malicious-document-files.pdf[/b][/color]
[color=blue]1. 找到提取JavaScript[/color]
一种方法是使用Didier Stevens的工具集([url]http://blog.didierstevens.com/programs/pdf-tools/[/url])分析内容寻找可以代码。其中的一个工具是pdfid,可以显示一些pdf中可以被漏洞利用的关键字。通过工具集找到6个object和两个stream。没有JavaScript,但是有/AcroForm以及/XFA。这意味着pdf中的XFA可能包含恶意内容。
[img]http://dl2.iteye.com/upload/attachment/0101/6315/024b75cf-dcb5-3fd0-828f-5aa0a19bf25d.png[/img]
然后深入调查,使用pdf-parser.py来显示6个object是的内容。输出为了方便起见被简化了。但是object2使用了/XFA,它引用了Object 1,并且包含了一个压缩的stream,非常可疑。
[img]http://dl2.iteye.com/upload/attachment/0101/6317/48cd645b-b4c7-3d8b-b08c-1ddaf5993695.png[/img]
通过–filter选项,pdf-parser.py允许我们显示一个object的内容,以及传递stream到一个支持的filter(FlateDecode, ASCIIHexDecode, ASCII85Decode, LZWDecode and RunLengthDecode)。–raw使输出更易读。查看这个文件的内容,我们可以获得解压的stream。然后调查这个文件可以发现一些原PDF文件中没有的JavaScript代码。如果这个文件被受害者打开,那么/XFA将会执行恶意代码。
[img]http://dl2.iteye.com/upload/attachment/0101/6321/8d067552-08a7-3524-a73e-00c5ed7d2804.png[/img]
另一种快速查找pdf是否含有恶意代码以及其他恶意元素的方法是使用peepdf.py,peepdf可以用来分析pdf文件,显示objects/streams,编码/解码streams,修改它们,获得不同版本,显示修改元数据,执行JavaScript代码以及shellcode。当使用最新版本的工具运行pdf文件,可以显示pdf的文件结构,它的内容,甚至检查它触发的是哪个漏洞(如果有签名)。
[img]http://dl2.iteye.com/upload/attachment/0101/6323/3494ab70-362e-3313-ac10-02797b341d39.png[/img]
[color=blue]2. 去模糊JavaScript[/color]
JavaScript代码可能被模糊了多次。本例中object.raw在<script xxxx contentType=”application/x-javascript”> 和一个 base64格式的<image> 标签间包含4个JavaScript元素。这些JavaScript需要提取,放到一个文件中。使用js-didier.pl 来分析代码。它本质上上是一个可以从命令行运行的没有插件的JavaScript解释器。
[img]http://dl2.iteye.com/upload/attachment/0101/6325/2cb9b1bd-bb76-34c3-98bd-9ba3aa7d5ee5.png[/img]
[color=blue]3. 提取shellcode[/color]
eval.005.log包含去模糊的JavaScript代码,它里面包含两个Unicode编码的变量。通过他们隐藏/模糊shellcode。通常JavaScript代码编码如下:
[img]http://dl2.iteye.com/upload/attachment/0101/6327/ea361818-9a63-30f3-9621-29f9eafa1152.png[/img]
这些Unicode编码的字符串需要解码为二进制文件。需要使用Remnux中一个叫做unicode2hex-escaped的脚步来实现转换。
[img]http://dl2.iteye.com/upload/attachment/0101/6329/0623e52f-f162-3871-8710-4239a2edeaf4.png[/img]
[color=blue]4. 创建一个可执行的shellcode[/color]
使用shellcode2exe.py来把shellcode转换成Windows可执行的二进制文件
[img]http://dl2.iteye.com/upload/attachment/0101/6331/aff54d53-1479-3941-91f5-2cf686de6cbe.png[/img]
[color=blue]5. 分析shellcode,确定功能[/color]
加载调试器,分析二进制文件
[img]http://dl2.iteye.com/upload/attachment/0101/6333/bada5ba1-8f46-3e3e-8305-181e68935161.png[/img]
大多数企业网络边界都被保护。然而恶意pdf文件或MS office 软件可以成功通过防火墙,IPS,Anti-spam,杀毒软件以及其它保护措施。当到达受害邮箱后,通过使用社会工程技巧诱惑用户点击/打开文档。例如,如果用户打开一个恶意pdf文件,当Adobe处理一个精心制作的文件时它通常会执行含有漏洞的Javascript代码。它会破坏堆/栈内存导致它执行一个从网络下载的恶意程序。根据Didier Stevens的描述([url]http://blog.didierstevens.com/[/url]),在一些场合下,可以不用点击文件,只需下载文件就可以利用漏洞执行恶意程序。
整体来看,PDF有header,body,reference table以及trailer组成。其中最重要的是body,body可能含有各种content type object,所以漏洞研究者对于parser十分感兴趣。语言丰富复杂的意思是同样的信息可以使用很多种方法编码以及模糊处理。例如object中可以有存储任意类型,任意大小的流。这些流被压缩,PDF标准支持多种算法包括ASCIIHexDecode,ASCI85Decode,ASCI85Decode,FlateDecode, RunLengthDecode, CCITTFaxDecode, DCTCDecode,它们被称为filter。PDF文件可以支持多媒体内容以及通过Flash object支持Javascript和ActionScript。使用JavaScript是一个很流行的攻击向量,因为可以使用不同的技术把它藏到流中,从而很难被发现。当PDF文件含JavaScript代码时,恶意代码通过触发一个漏洞然后执行shellcode。所有这些特点和能力都将成为攻击目标。
[b]本文通过REMnux来分析步骤:
1. 找到提取JavaScript
2. 去模糊JavaScript
3. 提取shellcode
4. 创建一个可执行的shellcode
5. 分析shellcode,确定功能[/b]
使用REMnux小抄:[color=blue][b]http://zeltser.com/reverse-malware/analyzing-malicious-document-files.pdf[/b][/color]
[color=blue]1. 找到提取JavaScript[/color]
一种方法是使用Didier Stevens的工具集([url]http://blog.didierstevens.com/programs/pdf-tools/[/url])分析内容寻找可以代码。其中的一个工具是pdfid,可以显示一些pdf中可以被漏洞利用的关键字。通过工具集找到6个object和两个stream。没有JavaScript,但是有/AcroForm以及/XFA。这意味着pdf中的XFA可能包含恶意内容。
[img]http://dl2.iteye.com/upload/attachment/0101/6315/024b75cf-dcb5-3fd0-828f-5aa0a19bf25d.png[/img]
然后深入调查,使用pdf-parser.py来显示6个object是的内容。输出为了方便起见被简化了。但是object2使用了/XFA,它引用了Object 1,并且包含了一个压缩的stream,非常可疑。
[img]http://dl2.iteye.com/upload/attachment/0101/6317/48cd645b-b4c7-3d8b-b08c-1ddaf5993695.png[/img]
通过–filter选项,pdf-parser.py允许我们显示一个object的内容,以及传递stream到一个支持的filter(FlateDecode, ASCIIHexDecode, ASCII85Decode, LZWDecode and RunLengthDecode)。–raw使输出更易读。查看这个文件的内容,我们可以获得解压的stream。然后调查这个文件可以发现一些原PDF文件中没有的JavaScript代码。如果这个文件被受害者打开,那么/XFA将会执行恶意代码。
[img]http://dl2.iteye.com/upload/attachment/0101/6321/8d067552-08a7-3524-a73e-00c5ed7d2804.png[/img]
另一种快速查找pdf是否含有恶意代码以及其他恶意元素的方法是使用peepdf.py,peepdf可以用来分析pdf文件,显示objects/streams,编码/解码streams,修改它们,获得不同版本,显示修改元数据,执行JavaScript代码以及shellcode。当使用最新版本的工具运行pdf文件,可以显示pdf的文件结构,它的内容,甚至检查它触发的是哪个漏洞(如果有签名)。
[img]http://dl2.iteye.com/upload/attachment/0101/6323/3494ab70-362e-3313-ac10-02797b341d39.png[/img]
[color=blue]2. 去模糊JavaScript[/color]
JavaScript代码可能被模糊了多次。本例中object.raw在<script xxxx contentType=”application/x-javascript”> 和一个 base64格式的<image> 标签间包含4个JavaScript元素。这些JavaScript需要提取,放到一个文件中。使用js-didier.pl 来分析代码。它本质上上是一个可以从命令行运行的没有插件的JavaScript解释器。
[img]http://dl2.iteye.com/upload/attachment/0101/6325/2cb9b1bd-bb76-34c3-98bd-9ba3aa7d5ee5.png[/img]
[color=blue]3. 提取shellcode[/color]
eval.005.log包含去模糊的JavaScript代码,它里面包含两个Unicode编码的变量。通过他们隐藏/模糊shellcode。通常JavaScript代码编码如下:
[img]http://dl2.iteye.com/upload/attachment/0101/6327/ea361818-9a63-30f3-9621-29f9eafa1152.png[/img]
这些Unicode编码的字符串需要解码为二进制文件。需要使用Remnux中一个叫做unicode2hex-escaped的脚步来实现转换。
[img]http://dl2.iteye.com/upload/attachment/0101/6329/0623e52f-f162-3871-8710-4239a2edeaf4.png[/img]
[color=blue]4. 创建一个可执行的shellcode[/color]
使用shellcode2exe.py来把shellcode转换成Windows可执行的二进制文件
[img]http://dl2.iteye.com/upload/attachment/0101/6331/aff54d53-1479-3941-91f5-2cf686de6cbe.png[/img]
[color=blue]5. 分析shellcode,确定功能[/color]
加载调试器,分析二进制文件
[img]http://dl2.iteye.com/upload/attachment/0101/6333/bada5ba1-8f46-3e3e-8305-181e68935161.png[/img]