Ubuntu20.04配置CuckooSandbox环境

Ubuntu20.04配置CuckooSandbox环境

因为最近要做恶意软件分析,阅读论文发现动态分析的效果普遍比静态分析的效果要好一些,所以需要搭建一个动态分析的环境,查阅资料发现Cuckoo Sandbox是不错的自动化分析环境,但是搭建起来还是比较复杂的,主要是在配置虚拟机环境以及网络配置方面。

基础环境

文中的环境是Ubuntu 20.04 Server,也就是服务器版,后来为了配置虚拟机尝试过GNOME还有xfce4桌面环境,其实纯服务器环境即可完成配置,但是在配置虚拟机环境时可能会卡,所以还是有必要装一个桌面环境的。

在配置环境的时候建议配置一个新用户出来,Cuckoo官方不建议使用root权限搭建环境,最好是配置一个有sudo权限的用户,在本文中我配置的新用户名为Czy,注意要使用有sudo权限的用户创建,比如root等,对了别忘了在创建好新用户后在/etc/passwd将创建用户的默认的bash环境/bin/sh更改为/bin/bash,默认的/bin/sh在登陆后只有一个$不太好用。

bash 复制代码
sudo useradd -m Czy # 添加Czy用户并生成home目录
sudo usermod -aG sudo Czy # 添加到超级用户组即sudo权限
bash 复制代码
# /etc/passwd
Czy:x:1001:1001::/home/Czy:/bin/bash

SSH软件使用的是MobaXterm,可以直接在本地实现virtualbox的图形界面,不过还是比较卡,肯定是不如直接使用图形界面的快,但是也只是配置过程中需要使用,真正使用Cuckoo时就不需要手动启动虚拟机环境了,如果用Xbash的话需要配合Xmanager才能在本地拉起virtualbox的图形界面,此外建议安装WinSCP用来传输文件,这个为了方便可以用root登录,不过要注意用root登录后传输后的文件的所有者都是root,写文件的话需要更改权限。

安装Anaconda

首先来说明为什么要安装Anaconda ,首先在Cuckoo不建议直接使用主python环境进行配置,建议使用venv,还有一个更重要的原因,在Ubuntu 20.04已经不建议使用python2了,而到目前为止Cuckoo只支持python2,之前在16.04使用pyhton就能拉起的环境现在需要安装python2并且必须使用python2命令才能唤起,所以为了避免出现各种问题,还是选择使用Anaconda进行环境配置。

首先下载Anaconda安装包,我下载的版本为Anaconda3-2019.03-Linux-x86_64.sh,在清华的镜像站https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/下载即可,之后便是直接./运行该可执行文件,如果不能执行的话可能是没有x权限,直接sudo chmod 755 Anaconda3-2019.03-Linux-x86_64.sh运行即可安装,安装过程不再赘述,可以参考其他的文章 。

conda环境中安装python 2.7,然后这个虚拟环境我命名为python2,在下边的脚本要用到。

Conda安装的最后会提示你是否加入到环境变量,如果加入到环境变量的话那么每次ssh到服务器都会自动运行conda环境的,我个人不是很喜欢,于是我自行写了一个.sh文件,需要的时候我再去执行这个.sh文件即可唤醒环境,注意该文件的x执行权限,755一把梭就行。

其实这些都不算重点,能跑起来python 2.7的环境都是胜利。

bash 复制代码
#!/bin/bash

# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/home/Czy/application/conda/bin/conda' 'bash.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/home/Czy/application/conda/etc/profile.d/conda.sh" ]; then
        . "/home/Czy/application/conda/etc/profile.d/conda.sh"
    else
        export PATH="/home/Czy/application/conda/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda initialize <<<
conda activate python2
bash 复制代码
source ./python2-conda.sh

安装Cuckoo

安装python库

我是直接执行了sudo pip install -U cuckoo,然后执行过程中告诉我缺啥我都再装,虽然这样不太好但是也不是不行哈哈,文档对于这块说的还是比较清楚的,这里借鉴一下其他博客说明的安装环境,如果安装失败,搜索一下错误,我就遇到过一个编译image什么的错误,是在github issue中找到一个用apt安装的依赖才解决的,但是具体记不清了。

bash 复制代码
sudo apt-get install python python-pip python-dev libffi-dev libssl-dev
sudo apt-get install python-virtualenv python-setuptools
sudo apt-get install libjpeg-dev zlib1g-dev swig

安装MongoDB

为了使用基于DjangoWeb界面,需要使用MongoDB,也就是为了启动cuckoo web runserver 0.0.0.0:8000的环境依赖,之后还需要配置用户名密码与数据库信息,这个在下一节会细说。

bash 复制代码
sudo apt-get install mongodb

安装PostgreSQL

CuckooWeb服务需要一个数据库,在配置文件中可以看出sqlitepostgresqlmysql都是可以的,由于我比较熟悉Mysql的操作本来想指定Mysql作为选定数据库来着,但是由于装python_mysql的驱动一直出问题,我估计是因为我装的Mysql 8.0,而Python 2.7早已不再维护了,所以无法正常使用驱动了,所以最终还是选择PostgreSQL,当然这个也需要配置用户名密码等,这个下一节再说明。

bash 复制代码
sudo apt-get install postgresql libpq-dev

安装virtualbox

首先需要安装virtualbox,直接使用apt-get安装即可。

bash 复制代码
sudo apt-get install virtualbox

如果像我一样是使用的服务器而没有实体机,而且我的服务器在实体机上是使用VMware Workstation管理的,那么这个状态就相当于在虚拟机中安装虚拟机,那么就需要在主体实体机的VMware Workstation中修改虚拟机配置在,Processors中启用VT-XAMD-V,也就是启动虚拟化才可以。

安装tcpdump

为了在执行期间转储恶意软件执行的网络活动,需要正确配置网络嗅探器以捕获流量并将其转储到文件中。

bash 复制代码
sudo apt-get install tcpdump apparmor-utils
sudo aa-disable /usr/sbin/tcpdump

请注意,只有在使用默认目录时才需要apparmor禁用配置文件(aa-disable命令),CWD因为apparmor会阻止创建实际的PCAP文件(另请参阅tcpdump的权限被拒绝),对于禁用apparmorLinux平台(例如,Debian),以下命令就足以安装tcpdump

bash 复制代码
sudo apt-get install tcpdump

tcpdump需要root权限,但由于不希望Cuckooroot身份运行,因此必须为二进制文件设置特定的Linux功能。

bash 复制代码
sudo groupadd pcap
sudo usermod -a -G pcap Czy # 这里是用户名
sudo chgrp pcap /usr/sbin/tcpdump
sudo setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump

可以使用以下命令验证上一个命令的结果。

bash 复制代码
getcap /usr/sbin/tcpdump
# /usr/sbin/tcpdump = cap_net_admin,cap_net_raw+eip

如果没有安装setcap则安装。

bash 复制代码
sudo apt-get install libcap2-bin

或者以其他方式(不推荐)的做法。

bash 复制代码
sudo chmod +s /usr/sbin/tcpdump

安装Volatility

Volatility是一种可选工具,可对内存转储进行取证分析,与Cuckoo结合使用,它可以自动提供对操作系统深度修改的额外可视性,并检测逃脱Cuckoo分析器监控域的rootkit技术的存在。

bash 复制代码
git clone https://github.com/volatilityfoundation/volatility.git
cd volatility
sudo python setup.py build
sudo python setup.py install

安装M2Crypto

目前M2Crypto只有在安装SWIG时才支持该库,在Ubuntu /Debian的系统上,可以按如下方式完成。

bash 复制代码
sudo apt-get install swig
sudo pip install m2crypto==0.24.0

Cuckoo环境配置

cuckoo默认安装在当前用户目录下,即~/.cuckoo,我们可以使用cuckoo -d来启动cuckoo

配置virtualbox虚拟机

这是个比较大的工程,为了方便我们直接在图形界面上完成这个操作。

首先我们需要准备好一个XP镜像,镜像需要自行下载,可以去MSDN下载,之后还要准备一个密钥,这个可以自行百度,多试试总有能用的。

点击新建,这边的namecuckoo1,因为我有一个重名的了所以写了个2,这边一定要写好是cuckoo1,选择好windows XP 32-bit系统。

之后便是分配内存和硬盘存储等,可以一路next,接下来要启动安装镜像。

在此处选择下载好的xp系统镜像,接下来就跟随着系统进行安装,安装完成后将虚拟机关机,在Setting中的Storage中将光盘形状的这个位置的启动位置移除即可,否则每次开机都会提示你按任意键从光盘启动,那么便又会启动一次安装程序。

接下来需要配置网络环境,在启动的virtualbox中新建一个虚拟网卡,配置的ip地址等如下所示。

之后在我们新建的cuckoo1的虚拟机设置网络,如下所示,Host-only是代表只允许与宿主机通信,如果需要访问外网的话,请继续看下边的网络配置。

之后我们要配置一下虚拟机的外网网络环境,刚才我们新建了这个虚拟网卡,之后为了通信我们还需要将虚拟机里设置一个固定的ip地址,也就是刚才我们设置的虚拟网卡网关的子网,但是我们如果我们直接在xp系统里设置虚拟机的ip地址之后是无法上网的,所以我们需要在ubuntu中配置一个NAT网络转发,在这里我们直接使用iptables 进行网络转发,这里每次开机都会重置,如果想要开机自动可以使用systemctl进行开机自启动管理,需要编写UNIT,在这里就不赘述了,在这里我们还是写到一个sh文件中需要的时候再执行即可。

注意在下边这个ens160是我的网卡,可以使用ifconfig查看网卡名称,之后的192.168.56.0/24就是主机以及网络号划分的子网,如果上边的ip配置都是根据文章来的话,那就只需要修改这个网卡名称即可。

bash 复制代码
echo 1 | sudo tee -a /proc/sys/net/ipv4/ip_forward
sudo sysctl -w net.ipv4.ip_forward=1

sudo iptables -t nat -A POSTROUTING -o ens160 -s 192.168.56.0/24 -j MASQUERADE # 网卡名称 ens160 
sudo iptables -P FORWARD DROP
sudo iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -s 192.168.56.0/24 -j ACCEPT
sudo iptables -A FORWARD -s 192.168.56.0/24 -d 192.168.56.0/24 -j ACCEPT
sudo iptables -A FORWARD -j LOG
bash 复制代码
sudo ./network-transform.sh

接下来启动这个虚拟机,我们需要在这里关闭防火墙与自动更新,并且配置好ip地址。

另外还需要在虚拟机中进行网络配置以及启动一个agent.py,这个文件在~/.cuckoo/agent/agent.py,也就是说在虚拟机中也必须安装python 2.7环境,如果需要截图的话,还需要PIL包,在这里就不赘述安装过程了,无论是使用虚拟机共享磁盘还是搭建文件服务器环境等方式,或者是直接在xp虚拟机中下载python安装包并安装即可,使用python3启动简单的文件服务器命令如下。

python 复制代码
python3 -m http.server --bind 0.0.0.0 8088

之后我们可以直接双击启动agent.py,另外也可以在C:\Document and Settings\Administrator\start menu\program\start设置让其开机自启,当然这个也没要必要,因为我们只需要创建快照即可,在运行agent.py之后,我们可以使用netstat命令查看8000端口是否被占用,如果已经占用就说明agent.py成功启动。

等环境全部搭建完成之后,我们需要创建快照,务必注意名字要命名为snapshot1,默认的为Snapshot 1,注意是首字母大写以及1之前有个空格的,所以我们要命名为snapshot1

之后我们就关闭虚拟机即可,在运行cuckoo过程中不需要手动启动虚拟机。

创建数据库

之前我们安装了MongoDBPostgreSQL,接下来我们需要为其创建一个用户以及创建数据库,这里统一一下用户名都为cuckoo,密码都为1234567890-=,数据库名都为cuckoo,下边的配置文件要用得到,具体过程请参照各自的数据库命令。

配置文件

所有的配置文件都在~/.cuckoo/conf/目录下,cuckoo.conf配置文件,重要位置已标出。

[cuckoo]
version_check = yes
ignore_vulnerabilities = no
api_token = uIfx
web_secret = 
delete_original = no
delete_bin_copy = no
machinery = virtualbox
memory_dump = no
terminate_processes = no
reschedule = no
process_results = yes
max_analysis_count = 0
max_machines_count = 0
max_vmstartup_count = 10
freespace = 1024
tmppath = 
rooter = /tmp/cuckoo-rooter

[feedback]
enabled = no
name = 
company = 
email = 

[resultserver]
ip = 192.168.109.206 ### 主机地址
port = 2042 ### 端口
upload_max_size = 134217728

[processing].
analysis_size_limit = 134217728
resolve_dns = yes
sort_pcap = yes

[database]
connection = postgresql://cuckoo:1234567890-=@localhost:5432/cuckoo ### 数据库链接
timeout = 60

[timeouts]
default = 120
critical = 60
vm_state = 60

[remotecontrol]
enabled = no
guacd_host = localhost
guacd_port = 4822

virtualbox.conf配置文件,重要位置已标出。

[virtualbox]
mode = headless
path = /usr/bin/VBoxManage
interface = vboxnet0 ### 默认网卡
machines = cuckoo1 ### 虚拟机名称
controlports = 5000-5050

[cuckoo1]
label = cuckoo1 ### label
platform = windows
ip = 192.168.56.101 ### 虚拟机ip地址
snapshot = snapshot1 ### 快照名
interface = vboxnet0 ### 虚拟网卡
resultserver_ip = 
resultserver_port = 
tags = 
options = 
osprofile = 

[honeyd]
label = honeyd
platform = linux
ip = 192.168.56.102
tags = service, honeyd
options = nictrace noagent

reporting.conf配置文件,重要位置已标出。

[feedback]
enabled = no ### 启动

[jsondump]
enabled = yes
indent = 4
calls = yes

[singlefile]
enabled = no
html = no
pdf = no

[misp]
enabled = no
url = 
apikey = 
mode = maldoc ipaddr hashes url
distribution = 0
analysis = 0
threat_level = 4
min_malscore = 0
tag = Cuckoo
upload_sample = no

[mongodb]
enabled = yes ### 启用mongodb
host = 127.0.0.1
port = 27017
db = cuckoo ### 数据库名
store_memdump = yes
paginate = 100
username = cuckoo ### 账号
password = 1234567890-= ### 密码

[elasticsearch]
enabled = no
hosts =  127.0.0.1
timeout = 300
calls = no
index = cuckoo
index_time_pattern = yearly
cuckoo_node = 

[moloch]
enabled = no
host = 
insecure = no
moloch_capture = /data/moloch/bin/moloch-capture
conf = /data/moloch/etc/config.ini
instance = cuckoo

[notification]
enabled = no
url = 
identifier = 

[mattermost]
enabled = no
url = 
myurl = 
username = cuckoo
show_virustotal = no
show_signatures = no
show_urls = no
hash_filename = no
hash_url = no

启动Cuckoo

启动Cuckoo需要两个终端,一个终端启动cuckoo,另外一个终端启动cuckoo web runserver

bash 复制代码
cuckoo
bash 复制代码
cuckoo web runserver 0.0.0.0:8000


之后打开该web服务,在我的服务器的地址为http://192.168.109.206:8000/

在右上角的Submit提交文件,点击Analyze即可,现在就可以在执行cuckoo的终端查看到分析进度了,在Dashboard可以整体查看概览,也可以在Rencent中查看已经完成的任务。

另外在正常情况下在分析的时候$HOME/.cuckoo/storage/analyses会出现很多xxx.exe_xxx.dmp文件,可以使用crontab执行一些定时任务出来一下,例如我不需要则在存在时间大于6分钟的直接删除。

shell 复制代码
*/6 * * * * cd $HOME/.cuckoo/storage/analyses && find ./ -regex .*/memory/.*\.exe_  -mmin +6 -delete && find ./ -regex .*/memory/.*\.dmp  -mmin +6 -delete

Blog

参考