Article Learn

从零开始搭建Cuckoo Sandbox(2)

Post by XywCloud at 2018-07-11 15:15:43

       在上一篇文章的结尾,我留了个坑。在这篇文章,我们将会把这个坑连同我下面提到的几个问题,一并解决掉。

       如果你在提交样本时主动选择正确的文件类型让Cuckoo Sandbox进行分析并且成功拿到了分析报告的话,你会留意到以下几个问题:

·         “文件类型”一栏是空的

·         ssdeep值是空的

·         正常情况下提交包含数字签名的文件进行分析,在分析报告里会提到文件已被签名(如果你安装了社区版行为签名库),但是这里也是没有的

·         程序执行过程中弹出的提示有一部分无法自动点击

·         Office/PDF文档即使指明文件类型也无法分析(分析过程瞬间完成,分析报告里包含错误信息。仅特定情况下会出现)

实际上,上一篇文章留下的坑,和我上面提到的五条内的第一条是同一个问题。让我们逐个解决掉它们吧。

文件类型识别

       如果你有留意到运行“cuckoo -d”命令对应的命令行界面输出的信息,你会发现Cuckoo Sandbox会把[Cuckoo工作目录]\analyzer对应系统的整个文件夹拷贝到虚拟机然后才会开始分析流程。而文件类型识别的相关代码也的确在这里面,入口是[工作目录]\analyzer\windows\analyzer.py

       通过分析这个python脚本里run函数的代码,我们很容易得知在第543行(由于代码做过修改,实际的代码行数不见得是我这边实际提到的值,大家可以在相关行附近找下,后续提到的代码行数均适用此规则)的if语句便是开始了文件类型的判断,实际上这个if语句只是判断你是否有在提交样本时手工指定文件类型(这决定Cuckoo Sandbox启动并分析文件的方式),而在这里便出现了一个bug。

       如果你愿意修改代码把self.config.package的type打印出来,python会告诉你这是个string(不管你是否在提交样本时手工指定文件类型),那么这就意味着这个if语句是根本进不去的,也就永远无法触发Cuckoo自动判断文件类型。

       原因找到了,修复方案也就明了了:

if not self.config.package or self.config.package=="None" or self.config.package=="default"

或者

if self.config.package in [None, "None", "default"]

把需要Cuckoo进行文件类型识别的情况覆盖全即可。

但是事情还没完。把这一处问题修改之后再次提交样本,不指定文件类型,你会发现Cuckoo还是报错了。原因非常简单,找到[Python安装目录]\Lib\site-packages\cuckoo\compat\magic.py,第18行。Cuckoo需要pymagic这个库来进行文件类型识别,这玩意实际上只是去调用libmagic识别库,但是libmagic不支持64位版本的Python。

在Github上,我们找到了其他人编译出的64位版本的libmagic识别库(https://github.com/julian-r/file-windows),找到这个东西,问题就好解决了:

1.     把上面地址内的Release包拿下来,我们只需要里面的DLL和mgc特征库文件。将DLL改名为magic1.dll(为什么改成这个名字?请看[Python安装目录]\Lib\site-packages\magic.py,第157行),放入C:\Windows\System32目录下,mgc文件则覆盖到[Python安装目录]\Lib\site-packages\cuckoo\private\win32目录下

2.     修改[Python安装目录]\Lib\site-packages\magic.py,第157行,在之前的Github链接里,作者提到这个DLL的所有依赖库均为静态编译,我们不再需要cygwin的支持

windows_dlls = ['magic1.dll']

       就像这样,把cygmagic-1.dll从检测列表里去掉就好。

3.     修改[Python安装目录]\Lib\site-packages\cuckoo\compat\magic.py,第19行,我们已经找到了64位版本的libmagic库,就把supported置为True吧

全部处理完后,重启Cuckoo,再次提交文件,你会发现,Cuckoo可以自动进行文件类型识别了,同时在分析报告页面,文件类型一栏也不再是空的。

SSDeep计算

       试着去命令行运行“pip install pydeep”,你会发现即使安装相关编译器,最后仍然无法正常安装,编译时提示缺少一个头文件,就像这样:

       去网上搜索,有不少人也遇到了相关的麻烦,看来是pydeep并不支持在Windows机器上安装。但是天无绝人之路,我们发现有人“曲线救国”,把Windows版本的计算ssdeep值的工具用Python做了次封装(调用相关函数实际上时调用相关程序然后拉取其返回的内容):https://github.com/c0dist/ssdeep-ftw,问题迎刃而解:

1.     把上面提到的链接内的ssftw.py下载下来放到[Python安装目录]\Lib\site-packages目录下

2.     下载ssdeep:https://github.com/ssdeep-project/ssdeep/releases

3.     修改[Python安装目录]\Lib\site-packages\cuckoo\common\object.py,首先是开头,有检测pydeep是否存在的代码,把“import pydeep”改成“from ssftw import SSFTW”;找到get_ssdeep函数,如果你有留意ssftw.py的代码,我们在上一个步骤里并没有直接修改里面设置的ssdeep程序的路径,这里我们首先需要指定ssdeep程序的路径,然后再调用相关函数进行计算(部分函数名和pydeep略有区别,请务必注意)

try:
    pydeep=SSFTW("D:\\ssdeep-2.14.1\\ssdeep.exe") #pass ssdeep binary path to class constructor
    return pydeep.hash_from_file(self.file_path)

4.     还没完呢,还有个地方。找到[Cuckoo工作目录]\signatures\windows\packer_polymorphic.py,这个行为签名是用来识别被分析的样本是否生成了与自身极其相似的文件,同样调用了pydeep,这儿我就不再展示修改后的代码了

       全部处理完后,重启Cuckoo,提交文件,查看报告,ssdeep值也可以正常展示了。

数字签名提取

       如果你在之前提交了带有数字签名的样本,你会发现在用于处理结果的Cuckoo进程所在的命令行界面上会在处理结果时输出错误信息,告诉你缺了M2Crypto这个库。

       在64位Windows环境下,我们只能选择这个:https://pypi.org/project/M2CryptoWin64,如PyPI所在页面上提示你的,在部分情况下,直接使用“pip install M2CryptoWin64”是没法正常安装。这个时候我们需要使用“pip install --egg M2CryptoWin64”来完成安装。而在pip 10.0+版本,--egg这种安装模式已经被删掉了,这也就是为什么我上一篇文章的“初期准备”部分建议对pip进行降级。

       M2CryptoWin64并没有对M2Crypto进行修改,因此我们安装后无需为了适配而修改相关代码。

模拟点击

       如果你有留意你提交上去的样本在分析报告里的截图,你会发现Cuckoo在碰到部分弹窗时并没有进行点击(尤其是中文的弹窗)。

       Cuckoo有关模拟点击的模块也在Cuckoo工作目录的analyzer子目录下,具体位置在这儿:[Cuckoo工作目录]\analyzer\windows\modules\auxiliary\human.py,在foreach_child函数内进行适配就好,就像下图这样:

Office/PDF文档分析

       如果你和我一样,给虚拟机里安装Office时,一是用的精简版,二不把Office装在C盘,那么你就需要做一些额外的操作,毕竟Cuckoo并没有那么聪明。

       这里只介绍最简单粗暴的方法:找到[Cuckoo工作目录]\analyzer\windows\modules\packages,doc/xls/ppt这三个Python脚本分别控制三类Office文档的启动方式以及一些预处理,找到它们的start函数,直接指定一个程序路径就好,就像这样:

       PDF也是一样,Cuckoo Sandbox只对Acrobat Reader做了识别,也需要适配,步骤就不多阐述了。

 

到这里,绝大多数的坑都被排掉了,大家总算是可以愉快地在沙盒内跑样本了。下一章将会讲述行为签名编写相关的内容,也是整篇文章的最后一节。

 

—   联系我们   —

新浪微博

公众号