Article Learn

从零开始搭建Cuckoo Sandbox(1)

Post by XywCloud at 2018-06-12 15:32:51

       在今年3月份的时候,因为同事的一句话,我下定决心要搭一个Cuckoo Sandbox来帮助我减轻病毒分析的负担(只不过事实证明有了这玩意之后我比以前更累了)。正好去年12月换了新的笔记本,旧的笔记本闲置了下来,借此机会可以利用上。

       旧笔记本换下来之后被我顺手重装了Windows 10,其实在很早之前我就有过搭建这玩意的想法,可惜在网上苦苦搜寻,却没有什么有效的资料能够助我一臂之力,网上大多讲述的是Cuckoo Sandbox在Ubuntu下的搭建(官方的文档也是这种环境),而Windows平台下的搭建的相关资料却异常稀少(官方的文档里只是一句“To be documented”)。但是,在今年3月份我重新燃起欲望的时候,我在网上终于搜索到了一篇文章,当然还有不少的油管视频,文章就是这个:https://www.trustwave.com/Resources/SpiderLabs-Blog/Cuckoo--Linux-Subsystem--Some-Love-for-Windows-10/。整篇文章分为三大部分,第一部分主要讲Cuckoo Sandbox的搭建(也就是当前你看到的这篇),主要的内容几乎都来自于上面那篇文章,少量的地方有一些差异,而第二/三部分都是资料里所没有的。

        其实在我写这篇文章的时候,Cuckoo Sandbox已经更新到2.0.6了,只不过我这边安装的是2.0.5,同时我为了能让它的绝大多数功能在Windows上正常工作,改动了不少的源码,所以我并不是很乐意升级。我们这里所述的内容仍是针对Cuckoo Sandbox 2.0.5的,虽然我相信大部分内容仍对2.0.6适用。

       让我们开始吧

 

初期准备

1.     Windows 10 64-bit:怎么激活我不管,我们其实需要的是Windows 10开始有的Linux子系统(Windows Subsystem for Linux),它能帮我们节省大量的精力

2.     Python 2.7(主机和虚拟机都要安装,主机安装64位版本):Cuckoo Sandbox的官方文档内提及它支持Python 2.7,3的支持还在路上

3.     VirtualBox

4.     虚拟机硬件配置:个人建议是至少配备2核+1.5G内存+35G硬盘(分2个区),推荐安装Windows 7 32位系统

5.     如果安装了pip 10.0+,请先用python -m pip install pip=9.0.3进行降级,否则后面的部分操作会无法完成

 

安装前置组件(主机)

1.     Windows Subsystem for Linux:这个不是Windows 10安装后默认开启的功能,需要我们手工开启,这里我们不进行步骤阐述,微软官方有教程:https://docs.microsoft.com/zh-cn/windows/wsl/install-win10,推荐安装Ubuntu

2.     装好Ubuntu后,打开Bash,完成初始化设置后,按顺序进行如下操作:

a)       sudo apt-get update

b)       sudo apt-get upgrade

c)       sudo apt-get install lamp-server^

d)       sudo apt-get install mongodb

e)       sudo service apache2 start

f)        sudo service mysql start

g)       sudo service mongodb start

前两条拉取最新更新,中间两条装组件,后面三条开启服务。如果一切顺利,打开浏览器,输入http://localhost/,你可以看到Apache的默认页面。

你需要为Cuckoo在MySQL内预先创建一个数据库,此处过程省略。

此外,在Windows 10某次大更之后,WSL这玩意就出了个奇怪的bug,如果你是关机后在开机,然后开启WSL,会报错。这个时候你只需要做一件事:重启(看看,修电脑三大终极解决方案的第一条就对这个bug有效)

3.     Python各类依赖库的安装:

a)       pip install distorm3

b)       pip install pycrypto

c)       pip install volatility

d)       http://yara.readthedocs.io/en/v3.4.0/gettingstarted.html#installing-on-windows 访问这里以获取安装Yara的python插件的方式

e)       MySQL的python插件:https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysql-python 访问这里获取该插件的Wheel文件(.WHL),然后使用“pip install <WHEEL文件路径>”进行安装

 

安装Cuckoo Sandbox(主机)

1.     Cuckoo Sandbox

a)       pip install cuckoo,建议搭个梯子

2.     TcpDump

a)       本来应该放在前面的“安装前置组件(主机)”部分说的,由于安装这个需要根据安装路径修改Cuckoo Sandbox源码,所以将其放到这个部分来说了

b)       Cuckoo Sandbox需要调用TcpDump来截获网络流量,TcpDump的Windows版名字叫做WinDump,访问这里以获取WinDump:https://www.winpcap.org/windump/install/default.htm

c)       WinDump需要WinPcap支持,不如直接装个WireShark在主机吧(其实这里使用WireShark的命令行版本tshark也是可以的,只不过需要修改Cuckoo的源码,最后我还是放弃了)

d)       Cuckoo Sandbox对TcpDump的调用做了一层封装,对应的文件在[Python安装目录]\Lib\site-packages⧵cuckoo⧵auxiliary⧵sniffer.py,这个python脚本负责调用TcpDump并对其输出进行解析,由于Linux和Windows默认的换行符不同,所以我们需要对这个解析代码进行微调:

 i.

for line in err.split("\r\n"):
  if not line continue or line.startswith(err_whitelist_start):
    continue
# “\r”为我们添加的内容

 ii.

err_whitelist_start = (
  "tcpdump: listening on ",
  "[WinDump完整路径,记得斜杠需要2个哦~]: listening on ",
)

 

初始化Cuckoo Sandbox及基础配置

1.     命令行运行“cuckoo init”,这将创建一个Cuckoo的工作目录,路径是在C:\Users\<用户名>\.cuckoo,这将会用于存放cuckoo配置文件/文件分析记录/cuckoo行为签名等内容

2.     进入工作目录的conf子目录,对以下文件进行修改以确保Cuckoo可以正常运行

a)       cuckoo.conf

[database]
connection = mysql://[mysql用户名]:[mysql密码]@127.0.0.1/[之前创建的数据库名称]
[resultserver]
ip = 192.168.137.1[此处填写主机host-only网卡设置的静态IP,我这边推荐设置为192.168.137.1,稍后解释理由]
[cuckoo]
process_results = no[默认为yes,强烈建议修改,虽然会导致启动Cuckoo Sandbox需要多一个步骤。该设置将会让Cuckoo的主模块与处理报告的模块分离,大幅提升Cuckoo的稳定性,避免各种意外发生]

b)       auxillary.conf

[sniffer]
enabled = yes
tcpdump = [WinDump全路径]

c)       virtualbox.conf

[virtualbox] 
path = [VirtualBox的VBoxManage.exe的全路径,用于让Cuckoo Sandbox控制虚拟机]
interface = [VirtualBox创建的Host-only网卡的名称,使用之前的WinDump以-D参数运行可以获取,以“\Device\NPF_”开头。如无法分辨,WireShark就派上用场了,打开WireShark->捕获->选项->管理接口…,找到Interface Name以VirtualBox开头的那个,对应的Friendly Name就是你需要填写进这里的东西] 
machines = [任意名称]
[与上面的machines对应]
label = [你在VirtualBox里创建的虚拟机的名称,需要完全一致]
platform = windows
ip = [虚拟机内host-only网卡设置的静态IP,这个部分我们将在稍后提到。建议设置为192.168.137开头,稍后解释理由]
snapshot = [你在VirtualBox里创建的虚拟机的快照的名称,需要完全一致]

d)       reporting.conf

[mongodb]
enabled = yes

3.     命令行运行“cuckoo community”,下载Cuckoo提供的社区版行为签名库(大部分均由热心用户贡献)。这个行为签名的编写以及其中的一些坑,我会在第三部分提到,这篇文章暂不提及

 

配置虚拟机

1.     主机和虚拟机需要网络层面互通(Cuckoo Sandbox需要传输行为记录数据以及其他的信息),通过VirtualBox的host-only网卡可以轻松做到,只需要虚拟机和主机的两个host-only网卡均设置为静态IP且在同一个C段即可,为此,我们需要对主机和虚拟机的host-only网卡均进行配置:

a)       主机

如上图(是不是在想终于等到第一张图了?)进行配置

b)       虚拟机

这里就不上图了,配置好静态IP,对应的子网掩码,以及默认网关(填主机host-only网卡的静态IP:192.168.137.1)。此外,还需要配置DNS服务器地址,和主机能访问外网的网卡对应的DNS地址保持一致。还有,不要忘记关闭虚拟机内的防火墙

2.     大家有可能会注意到,这一小节我和一开始给的链接里提到的文章的内容出现了差异。在给的链接对应的文章里,作者创建了一个额外的NAT网络用于虚拟机的外网访问,我这边则没有这个东西。如果按照那篇文章的作者那样做(我一开始也是那样做的),虚拟机可以正常访问外网,但是怎么让windump正常拦截网络流量呢?所以我就在考虑,能不能像linux环境那样,host-only网卡既承担主机与虚拟机互通的任务,也承担虚拟机访问外网的任务?

答案当然是可以的,因为Windows系统有一个叫做“Internet 连接共享”的东西。将网络共享给host-only网卡,同时确保虚拟机内网卡的DNS地址与主机能访问外网的网卡对应的DNS地址保持一致,即可让host-only网卡同时办到两件事。而在设置这个连接共享的时候,Windows会提示需要共享的网卡会被设置静态IP,并且这个IP刚刚好是192.168.137.1,所以就有了我之前的那两个静态IP的设置

只不过我这边实测后发现,这个Internet连接共享,每次开机都需要重新设置,即使已经勾选(去除勾选->保存->重新勾选->再保存),不知道是不是因为共享的是无线网络的原因

3.     除了上面提到的网络相关的设置,我们还需要对虚拟机做其他的事情:

a)       虚拟机内也需要安装Python 2.7(我已经在“初期准备”中提到),然后命令行内运行pip install pillow,安装截图组件

b)       我们需要把Cuckoo的Agent拷贝进虚拟机,这个python脚本在[Cuckoo工作目录]\agent\agent.py,至于存放的位置,个人建议不要放在C盘,也不要放在盘符根目录,名字最好改一下

a)       确认各种基础软件安装完毕,然后命令行运行agent脚本,这个时候你就可以创建快照了。将这个快照的名称填入virtualbox.conf对应的位置(前文已经提及)

 

一切就绪

1.     让我们运行一下吧?

a)       启动多个命令行/powershell

b)       运行cuckoo -d启动核心模块

c)       运行cuckoo web runserver启动Cuckoo内置的Web服务器,你可以通过这个来在网页上提交样本进行分析

                  i.            不出意外的话,启动失败了

                  ii.            报错内容:d:\python27\python.exe: can't open file 'D:\Python27\Scripts\cuckoo': [Errno 2] No such file or directory

                  iii.            如果你搜索一下报错内容,你会发现Github上已有相关讨论:https://github.com/cuckoosandbox/cuckoo/issues/1424

                  iv.            解决方案:将[Python安装目录]\Scripts目录下的cuckoo-script.py拷贝一份,把副本重命名为cuckoo

                   v.            然后你就可以愉快地启动Web服务器了

d)       由于我们之前设置了主模块和处理报告模块相互分离,我们需要单独启动进程用于报告处理:cuckoo process [任意名称],建议启动两个,不可重名

2.     访问http://localhost:8000/,你就可以看到Cuckoo的Web端界面了

3.     随意提交一个样本,进入如下的界面

需要留意的是,左侧的package可以用于指定Cuckoo以什么样的方法来运行你提交的样本。正常情况下,如果保持default的话,Cuckoo会根据文件内容自动进行选择(即进行文件类型识别,根据文件类型选择合适的方式)。但是这里是有bug的,你会发现它根本无法自动选择,而且在命令行还会抛出错误信息。这个bug我们留到下一篇文章再解决。

 

—   联系我们   —

新浪微博

公众号