沙盒(Sanbox) 是一种将未知、不可信的软件隔离执行的安全机制。恶意软件分析沙盒一般用来将不可信软件放在隔离环境中自动地动态执行,然后提取其运行过程中的进程行为、网络行为、文件行为等动态行为,安全研究员可以根据这些行为分析结果对恶意软件进行更深入地分析。
Cuckoo 是一款用 Python 编写的开源的自动化恶意软件分析系统,它的主要功能有:
- 跟踪记录恶意软件所有的调用状况;
- 恶意软件文件行为:恶意软件执行过程中创建新文件、修改文件、删除文件、读取文件或下载文件的行为;
- 获取恶意软件的内存镜像;
- 以 PCAP 格式记录恶意软件的网络流量;
- 获取恶意软件执行过程中的屏幕截图;
- 获取执行恶意软件的客户机的完整内存镜像
Cuckoo 可以分析的文件类型包括但不限于:
- Windows 可执行文件
- DLL 文件
- PDF 文件
- MS Office 文件
- URL 和 HTML 文件
- PHP 脚本文件
- CPL 文件
- VB 脚本文件
- ZIP 压缩包
- JAR 文件
- Python 脚本文件
- APK 文件
- ELF 文件
Cuckoo 的架构也比较简单,在 Host 机上运行 Cuckoo 主程序,多个 Guest 机通过虚拟网络与 Host 机相连,每个 Guest 机上有一个 Cuckoo Agent 程序,用来做 Cuckoo 的监控代理,结构图如下:
Host 机操作系统: Ubuntu14.04.01_amd64_desktop(官方推荐用 Ubuntu 最新的 LTS 版本),Python 版本 2.7.6。
先去 Cuckoo Sandbox 官网下载最新的发布版本(目前是 v2.0-RC1): https://cuckoosandbox.org/
先安装基本的依赖:
apt-get install python python-pip python-dev libffi-dev libssl-dev
如果要用 Cuckoo 自带的基于 Django 的 Web 管理系统,还要安装 MongoDB:
apt-get install mongodb
接下来需要批量安装 Cuckoo 的 Python 依赖包,Cuckoo 主目录里有一个 requirements.txt
文件,内容如下:
alembic==0.8.0
beautifulsoup4==4.4.1
cffi==1.2.1
chardet==2.3.0
cryptography==1.0
Django==1.8.4
dpkt==1.8.6.2
ecdsa==0.13
enum34==1.0.4
Flask==0.10.1
HTTPReplay==0.1.5
idna==2.0
ipaddress==1.0.14
itsdangerous==0.24
Jinja2==2.8
jsbeautifier==1.5.10
Mako==1.0.1
MarkupSafe==0.23
ndg-httpsclient==0.4.0
http://pefile.googlecode.com/files/pefile-1.2.10-139.tar.gz#egg=pefile
pyasn1==0.1.8
pycparser==2.14
pymongo==3.0.3
pyOpenSSL==0.15.1
python-dateutil==2.4.2
python-editor==0.3
python-magic==0.4.6
requests==2.7.0
six==1.9.0
SQLAlchemy==1.0.8
tlslite-ng==0.6.0-alpha3
wakeonlan==0.2.2
Werkzeug==0.10.4
其中的 pefile
需要从 Google Code 上下载,由于大陆网络限制,需要自备梯子,登上梯子后执行以下批量安装命令:
pip install -r requirements.txt
或者先在爬梯子的情况下手动安装
pefile
,再把pefile
这一项从requirements.txt
文件中剔除,然后在不的状态下批量安装其他不用的依赖包
Host 机需要可以嗅探网络数据包,需要安装 tcpdump
,如果本机没有,则执行以下命令安装 tcpdump
:
apt-get install tcpdump
如果系统没启用 root
账户,由于 tcpdump
的执行需要 root
权限,则需要以下配置:
$ sudo setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump
如果系统里没有setcap
命令,则需要安装 libpcap
包:
$ sudo apt-get install libcap2-bin
如果需要启用内存镜像分析,需要安装 volatility
:
apt-get install volatility
根据前文的 Cuckoo 架构图,前面准备好了宿主机,下面就该准备 Guest 机器了。Guest 机是一个或多个虚拟机,官方推荐的虚拟机管理软件是 VirtualBox
。
先去 VBox 官网下载最新的对应系统版本的 Deb 安装包: https://www.virtualbox.org/wiki/Linux_Downloads
安装好 VBox 之后,创建新的虚拟机(推荐用 Windows7
),需要对 Win7 客户机做一些基础配置。
Cuckoo Agent 是一个植入客户机的 Python 脚本,通过 XMLRPC Server 的方式来跟 Host 主机通信、交换数据。这个 Python 脚本是跨平台的,可以在 Windows/Linux/OS X 上运行。所以客户机上需要安装 Python 环境,如果需要截屏功能,还要安装 PIL
(Python Image Library)库:
pip instsall PIL
Cuckoo Agent 在 Window 系统上的安装方法很简单,只需要将 cuckoo/agent/agent.py
文件拷贝到 Win7 客户机里,并启动即可。
但是这样的运行方式并不够完美,我们需要这个 agent.py
开机启动,并且不能有运行窗口,这就需要另做一些处理:
agent.py
文件放到系统开机启动目录中,Win7 默认的路径是 C:\Users\[USER]\AppData\Roaming\MicroSoft\Windows\Start Menu\Programs\Startup\
;agent.py
后缀改成 agent.pyw
,这样程序启动就不会有 GUI 窗口了。Win7 客户机如果开机自动登录,可以方便 Cuckoo 控制。可以用管理员权限打开 CMD 窗口,依次执行以下命令:
reg add "hklm\software\Microsoft\Windows NT\CurrentVersion\WinLogon" /v DefaultUserName /d /t REG_SZ /f
reg add "hklm\software\Microsoft\Windows NT\CurrentVersion\WinLogon" /v DefaultPassword /d /t REG_SZ /f
reg add "hklm\software\Microsoft\Windows NT\CurrentVersion\WinLogon" /v AutoAdminLogon /d 1 /t REG_SZ /f
reg add "hklm\system\CurrentControlSet\Control\TerminalServer" /v AllowRemoteRPC /d 0x01 /t REG_DWORD /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v LocalAccountTokenFilterPolicy /d 0x01 /t REG_DWORD /f
注意修改前两条命令里的
和
为自己的账户和密码
为了方便恶意样本分析,最大程度保证恶意样本顺利执行,还需要关闭 Windows 系统的 Windows 防火墙 和 Windows 自动更新。
为了方便分析多种类型的恶意软件,还应该尽量在操作系统上安装 MS-Office 套装、PDF 阅读器、常用浏览器、Java 执行环境等等。并且,为了让客户机看起来更像普通人用的正常机器而不是一台沙盒客户机,尽量给操作系统安装其他常用的办公、娱乐、聊天软件,并访问一些网站、留下一些 Cookie 或其他数据。
客户机的网络配置是重中之重,配置不好 Cuckoo 几乎无法有效运行。
推荐的网络配置方法是通过 VirtualBox 的 Host-Only
模式,将一个或多个虚拟客户机部署在一个小的局域网中,与外界隔离开,通过 Host 机与外界交流。
首先,需要在 VirtualBox 上添加一块给 Host-Only
部署用的虚拟网卡,默认是 vboxnet0
,Host 机通过此虚拟网卡与同网段的虚拟客户机通信:
VBox 中默认可能没有此
vboxnet0
的Host-only
网卡,可以通过上图右上角的 添加 按钮手动添加
Cuckoo 默认的 Result Server
IP 地址为 192.168.56.1
(在配置文件 cuckoo/conf/cuckoo.conf
中),此 IP 要与上面的 vboxnet0
网卡的 IP 地址相对应,所以,还要手动修改 vboxnet0
的配置(DHCP 服务可不启用,手动配置客户机 IP 地址即可):
接下来手动配置 Win7 客户机的网络:
至此,Host 机和 Win7 客户机就可以互相通信了,互相 Ping 一下可以 Ping 通。但这还无法满足正常的自动化恶意软件分析的要求,因为这种初级的 Host-only
模式里面虚拟机无法访问互联网,而很多恶意软件都需要访问网络才可以正常运行。所以我们还需要 vboxnet0
这块网卡具有代理上网的功能,使这个小局域网里的虚拟客户机可以通过这块虚拟网卡访问互联网。如果要满足这个需求,需要在 Ubuntu Host 机上做两个操作:开启流量转发、用 iptables
做地址转换(NAT)规则。
开启 IP 转发,用下面两条命令之一皆可:
sysctl -w net.ipv4.ip_forward=1
echo 1 > /proc/sys/net/ipv4/ip_forward
但是上面的命令只能 临时开启 IP 转发功能,系统重启之后便失效。若想永久开启此功能,需要手动修改配置文件 /etc/sysctl.conf
,将里面 net.ipv4.ip_forward=1
前的注释取消,然后运行以下命令即可永久开启 IP 转发功能:
sysctl -p /etc/sysctl.conf
Ubuntu 系统中用 iptables
设置地址转换规则,Cuckoo 官方资料给出了参考命令:
iptables -A FORWARD -o eth0 -i vboxnet0 -s 192.168.56.0/24 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A POSTROUTING -t nat -j MASQUERADE
但是 Ubuntu 中的 iptables
这样设置也只是 临时 的,系统重启之后这些规则就会失效,如果想系统重启这些规则仍然可用,可以做以下处理:
编辑 Ubuntu 的网络配置文件 /etc/network/interfaces
,在文件末尾添加以下两行:
pre-up iptables-restore < /etc/iptables.rules #开机时启用 iptables 规则
post-down iptables-save > /etc/iptables.rules #关机前保存当前所有的 iptables 规则
这样一来,Ubuntu Host 主机每次关机前都会把已有的 iptables
规则备份到 /etc/iptables.rules
文件中、每次开机是都会从 /etc/iptables.rules
读取规则并启用。
配置好之后,Guest 虚拟机就可以通过 vboxnet0
来访问互联网了。
上面算是把客户机相关的配置都配置好了,接下来需要对配置好的客户机建立一个快照。每次 Cuckoo 调用客户机分析完一个恶意样本之后,会把虚拟机恢复到这个快照的状态。
保存系统快照的时候有一点需要注意:确保在系统正常运行、且 agent.py
无界面运行的时候,执行系统快照。
准备好 Host 机系统环境、配置好客户机之后, Cuckoo 还不能正常运行,还需要配置一下 Cuckoo 才能正常运行。 Cuckoo 有好多配置文件,都在 cuckoo/conf/
目录下,下面简要介绍几个主要配置文件的作用:
cuckoo.conf
: 主要的配置文件,最主要的是machinery
用于指定我们使用的虚拟机配置文件,默认是virtualbox
,该文件同样位于conf
目录下,名字是virtualbox.conf
。另外一个比较重要的配置项是[resultserver]
的ip
和port
,用于指定接收分析结果的服务器。该地址必须能够让虚拟机访问到,一般设置为虚拟网卡的地址,比如前面说过的Host-only
虚拟网卡vboxnet0
的 IP 地址192.168.56.1
(也可以自己改成其他的),端口默认即可;auxiliary.conf
: 辅助组件配置模块,可以配置tcpdump
/mitm
/sniffer
等;memory.conf
: 内存分析配置模块,主要用来配置Volatility
的行为;processing.conf
: 核心处理组件配置文件,可以开启/关闭行为分析、缓冲区分析、内存分析、截屏、Snort、字符串提取、VirusTotal
辅助分析等等功能;: 虚拟化配置文件,包括
.conf virtualbox
/vmware
/kvm
/qume
等。在实际的配置当中,根据自己试用的虚拟化环境,只需要配置其中一个即可,同时采用的这个配置文件也必须 在cuckoo.conf
的machinery
字段指定。这里的配置选项都是针对特定虚拟化平台的,很多选项只适用于某些平台。前面我们用的是virtualbox.conf
,其中mode
指定virtualbox
的运行模式,path
指定VBoxManage
的绝对路径,machines
指定我们使用的虚拟机的名字(多个虚拟机需要用半角逗号隔开),platform
指定虚拟客户机的系统类型,ip
指定虚拟机的ip
地址;reporting.conf
: 报告生成模块的配置文件,用来开启jsondump
或者HTML Report
,还可以配置MongoDB
存储分析结果(Web 控制台会用到)。
这里,我们需要修改的配置文件,可以修改 processing.conf
启用/关闭 自己想要的模块(比如 VT 模块),还需要修改 virtualbox.conf
。根绝前文所述,假设我的 Win7 客户机名称是 jiayu1
,IP 地址是 192.168.56.101
,virtualbox.conf
的内容示例如下(mode = headless
是指 VBox 的 无界面启动模式):
[virtualbox]
# Specify which VirtualBox mode you want to run your machines on.
# Can be "gui", "sdl" or "headless". Refer to VirtualBox's official
# documentation to understand the differences.
mode = headless
# Path to the local installation of the VBoxManage utility.
path = /usr/bin/vboxmanage
# Default network interface.
interface = vboxnet0
# Specify a comma-separated list of available machines to be used. For each
# specified ID you have to define a dedicated section containing the details
# on the respective machine. (E.g. cuckoo1,cuckoo2,cuckoo3)
machines = jiayu1
[jiayu1]
# Specify the label name of the current machine as specified in your
# VirtualBox configuration.
label = jiayu1
# Specify the operating system platform used by current machine
# [windows/darwin/linux].
platform = windows
# Specify the IP address of the current virtual machine. Make sure that the
# IP address is valid and that the host machine is able to reach it. If not,
# the analysis will fail.
ip = 192.168.56.101
[honeyd]
# For more information on this VM please refer to the "services" section of
# the conf/auxiliary.conf configuration file. This machine is a bit special
# in the way that its used as an additional VM for an analysis.
# *NOTE* that if this functionality is used, the VM should be registered in
# the "machines" list in the beginning of this file.
label = honeyd
platform = linux
ip = 192.168.56.102
tags = service, honeyd
options = nictrace noagent
至此,Cuckoo 自动化恶意软件分析环境的配置工作算是基本完成,接下来就是启动 Cuckoo 服务、上传样本进行自动化分析了。
在启动 Cuckoo 服务之前,还需要开启 MongoDB
服务,并根据 reporting.conf
中的关于 MongoDB
的配置创建一个新的数据集。比如我的 reporting.conf
关于数据库的 配置如下所示,我就需要手动创建一个名为 cuckoo
的数据集:
[mongodb]
enabled = yes
host = 127.0.0.1
port = 27017
db = cuckoo
store_memdump = yes
paginate = 100
启动 Cuckoo 的服务只需一条命令:
python cuckoo.py
但这样只能让该服务进程前台运行并且不能关闭中断,如果想让它后台运行,可以这样启动:
nohup python cuckoo.py &
启动 Cuckoo 服务进程之后,就可以提交样本进行分析了。提交样本可以用 cuckoo/utils/submit.py
来提交,具体方法见帮助:
usage: submit.py [-h] [-d] [--remote REMOTE] [--url] [--package PACKAGE]
[--custom CUSTOM] [--owner OWNER] [--timeout TIMEOUT]
[-o OPTIONS] [--priority PRIORITY] [--machine MACHINE]
[--platform PLATFORM] [--memory] [--enforce-timeout]
[--clock CLOCK] [--tags TAGS] [--baseline] [--max MAX]
[--pattern PATTERN] [--shuffle] [--unique] [--quiet]
[target]
positional arguments:
target URL, path to the file or folder to analyze
optional arguments:
-h, --help show this help message and exit
-d, --debug Enable debug logging
--remote REMOTE Specify IP:port to a Cuckoo API server to submit
remotely
--url Specify whether the target is an URL
--package PACKAGE Specify an analysis package
--custom CUSTOM Specify any custom value
--owner OWNER Specify the task owner
--timeout TIMEOUT Specify an analysis timeout
-o OPTIONS, --options OPTIONS
Specify options for the analysis package (e.g.
"name=value,name2=value2")
--priority PRIORITY Specify a priority for the analysis represented by an
integer
--machine MACHINE Specify the identifier of a machine you want to use
--platform PLATFORM Specify the operating system platform you want to use
(windows/darwin/linux)
--memory Enable to take a memory dump of the analysis machine
--enforce-timeout Enable to force the analysis to run for the full
timeout period
--clock CLOCK Set virtual machine clock
--tags TAGS Specify tags identifier of a machine you want to use
--baseline Run a baseline analysis
--max MAX Maximum samples to add in a row
--pattern PATTERN Pattern of files to submit
--shuffle Shuffle samples before submitting them
--unique Only submit new samples, ignore duplicates
--quiet Only print text on failure
但这种命令提交的方法体验不太好,Cuckoo 官方提供了一个基于 Django 的 Web 管理界面,在 cuckoo/web/
目录中,启动这个 Web 管理界面需要进入 cucoo/web/
目录,然后运行以下命令:
python manage.py runserver
如果需要对外开放该 Web 界面,则需要指定监听的 IP 地址 和端口:
python manage.py runserver 0.0.0.0:[PORT]
然后就可以通过浏览器访问 Ubuntu Host 机的 IP 地址和 Cuckoo Web 界面对应的端口了,界面如下所示:
点击导航栏上的 Submit
按钮,即可跳转到样本上传页面,上传时还可以选择一些高级的选项:
可以看到,Cuckoo 不仅可以直接分析上传的样本文件,还可以分析远程的 URL
上传完成后,Cuckoo 就会自动分析,分析完成后,可以在 Recent
页面里查看最近分析的样本以及结果:
Cuckoo 分析完的样本,可以点击查看分析报告,也可以重新分析已经完成的分析任务。
cuckoo/cukoo.py
启动时有一个特殊的参数选项 --clean
,官方的解释为 Remove all tasks and samples and their associated data
。即一旦运行python cuckoo.py --clean
,那么所有的分析任务、样本和分析结果相关的数据都会被清除,相当于对 Cuckoo 恢复出厂设置。
Cuckoo 自带了一个基于 flask
的轻量级 REST API 服务程序,即 cuckoo/utils/api.py
,默认启动此程序会绑定到 localhost:8090,也可以启动时指定监听地址和端口:
python utils/api.py --host 0.0.0.0 --port 1337
也可以用此 API 程序,通过
uWSGI
和Nginx
代理部署一个高性能的 REST API 服务。
通过这个 REST API,可以实现灵活的任务管理(甚至比前文提到的 Cuckoo 自带的 Web 管理界面还灵活) ,也可以基于此开发一套自己的 Cuckoo 管理程序。具体用法参考 Cuckoo 官方文档。
Cuckoo 还支持分布式部署,多 Host 机节点、多 Guest 机支持,部署方式详见 官方文档。
Cuckoo 部署完成后,通过自带的 Web 管理界面,如果某个样本完成分析但查看分析报告的时候出现如下模板渲染错误:
处理方式是修改 web/analysis/urls.py
文件:
- "/(?P<ip>[\d\.]+)?/(?P<host>[a-zA-Z0-9-\.]+)?"
+ "/(?P<ip>[\d\.]+)?/(?P<host>[a-zA-Z0-9-_\.]+)?"
最后,Cuckoo 官方虽然声称可以支持 Linux 样本的分析,但支持的并不好。在 Ubuntu 上安装 Systemtap
并用 stap
命令执行 cuckoo/data/strace.stp
脚本完美生成可用的 stap_xxxx.ko
,还要搞定官方并没有提供的 probelkm.ko
,会经历各种大坑小坑,足够另起一篇长文,此处不详述。