沙箱是我们日常进行恶意攻击捕获、应急响应处置等工作时的常用工具。本文将通过几个实例介绍沙箱的基本概念,以Cuckoo为例介绍沙箱环境的搭建流程,最后以gonnacry勒索软件为例简单介绍Cuckoo linux沙箱检测能力增强及signature开发过程。
沙箱的基本概念
为了更好的理解沙箱的相关概念,下面剖析一下我们日常可能会用到的几个典型沙箱。
Windows沙箱
微软在Windows 10 18305版本之后的专业版和企业版中加入了沙箱功能,可以通过Windows功能界面开启沙箱。
Windows沙箱基于Windows下的容器技术,构建在Windows操作系统内核之上,是一种更轻量级的虚拟化方案,专门用于安全地隔离运行应用程序。其基本架构如下图所示:
Windows沙箱虽然与操作系统共享内核,但沙箱访问内核是受限制的,内核并未提供应用程序运行所需的全部API和服务。
Windows沙箱具备开箱即用的特性,我们可以直接开启一个Windows沙箱,像在本地一样运行应用程序,但是不用担心损坏操作系统。比如,我们在日常使用电脑的过程中难免遇到需要下载执行一些可信度不确定的应用程序,在电脑上直接运行担心中毒,虚拟机运行又太消耗资源,这时Windows沙箱便是一个很好的选择。
Adobe沙箱
如今,PDF 已经从静态页面发展到具有如交互式表单、多媒体内容、脚本以及其它功能的复合式文档。这些功能使得 PDF 容易受到恶意脚本或操作的攻击,这些攻击可以窃取数据甚至损坏您的计算机。使用增强的安全性,可以禁止或有选择性地允许来自信任位置和文件的操作,从而保护您的计算机免受这些威胁。Adobe Reader在X之后的版本中加入了沙箱功能,来缓解漏洞利用。我们可以从下面两个图片对比中了解加入沙箱前后漏洞利用的难度变化情况。
▲Adobe Reader 9未加入沙箱机制的漏洞利用流程▲
▲Adobe Reader X加入沙箱之后的漏洞利用流程▲
加入沙箱之后Adobe Reader不信任的代码可以运行,但是只给予较低的权限,请求高权限的操作时需要通过另外一个中介进程来完成,同时很多敏感的Windows API调用会被拦截,从而保证Adobe Reader不被轻易的漏洞利用。以文件操作为例,典型的文件操作流程为:(1)调用CreateFile(2)权限允许的情况下获取文件句柄(3)执行ReadFile/WriteFile进行读写操作。加入沙箱机制之后,程序是运行在沙箱进程中的:直接调用CreateFile被禁止。文件操作需要中介进程(Broker Process)进行中转,中介进程会进行一系列的校验,防止恶意操作。当全部校验通过后才会调用CreateFile并获取文件句柄。
通过这两个案例我们对沙箱是什么有了基本的了解。除此之外,还有一些其他类型的沙箱,基本原理类似,例如:杀毒软件沙箱(360沙箱等)、浏览器沙箱(Chrome沙箱等),这里就不一一介绍了。下面我们聊一聊专业级沙箱及恶意样本的自动化分析,本文以Cuckoo的linux沙箱为例进行介绍(注:Cuckoo的Windows沙箱不在本文讨论范围,感兴趣的朋友可以去网上搜索相关文章)。
Cuckoo沙箱
Cuckoo沙箱是一个自动化的恶意样本分析系统。通过web界面或者沙箱系统提供的web api提交可疑文件,沙箱系统即可自动分析,并在分析完毕后提供一个详细的报告,概述该文件在沙箱中执行时的行为。
架构与流程
Cuckoo由Cuckoo host、Analysis Guests、Virtual network构成。cuckoo host是调度中心,analysis guest是具体执行样本的沙箱环境,两者通过虚拟网卡连接。当提交样本到cuckoo host后,cuckoo host会调度一个空闲的analysis guest节点,同时将样本传递给所选择的沙箱节点进行自动化分析,分析结束之后将沙箱节点采集到的分析数据进行汇总,最后输出分析报告。
Cuckoo沙箱底层基于虚拟化技术,可以使用不同的虚拟化平台进行构建,目前支持的虚拟化平台包括:VirtualBox、KVM、VMware Workstation、XenServer。
Cuckoo搭建
以下安装流程基于VirtualBox虚拟化环境,分为Host和Guest两部分。所用实验环境配置为:
系统发行版 :Ubuntu 18.04
硬件配置 :16核 32G 600G
Host安装
– 依赖库安装
sudo apt-get install -y python python-pip python-dev libffi-dev libssl-dev
sudo apt-get install -y python-virtualenv python-setuptools
sudo apt-get install -y libjpeg-dev zlib1g-dev swig
<左右滑动以查看完整代码>
– 数据库安装
sudo apt-get install mongodb
<左右滑动以查看完整代码>
– 安装pydeep
apt-get install -y build-essential git libpcre3 libpcre3-dev libpcre++-dev python-dev libfuzzy-dev
git clone https://github.com/kbandla/pydeep.git
cd pydeep
python setup.py build
python setup.py install
<左右滑动以查看完整代码>
– 安装Virtualbox
echo deb http://download.virtualbox.org/virtualbox/debian bionic contrib | sudo tee -a /etc/apt/sources.list.d/virtualbox.list
wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -
sudo apt-get update
sudo apt-get install -y libpng16-16 libvpx5 libsdl-ttf2.0-0
sudo apt-get install virtualbox
<左右滑动以查看完整代码>
– 安装tcpdump
apt-get install -y libcap2-bin tcpdump
<左右滑动以查看完整代码>
– 安装 Volatility
wget https://downloads.volatilityfoundation.org//releases/2.6/volatility_2.6_lin64_standalone.zip
unzip volatility_2.6_lin64_standalone.zip
<左右滑动以查看完整代码>
– 安装M2Crypto
sudo apt-get install -y swig
sudo pip install m2crypto
<左右滑动以查看完整代码>
– 安装guacd
sudo apt install -y libguac-client-rdp0 libguac-client-vnc0 libguac-client-ssh0 guacd
<左右滑动以查看完整代码>
– 安装cuckoo
$ virtualenv venv
$ . venv/bin/activate
(venv)$ pip2 install -U pip setuptools
(venv)$ pip2 install -U cuckoo
<左右滑动以查看完整代码>
安装成功后如下图所示:
Guest安装
– 安装依赖库
sudo apt-get install systemtap gcc patch linux-headers-$(uname -r)
<左右滑动以查看完整代码>
– patch systemtap脚本
$ wget https://raw.githubusercontent.com/cuckoosandbox/cuckoo/master/stuff/systemtap/expand_execve_envp.patch
$ wget https://raw.githubusercontent.com/cuckoosandbox/cuckoo/master/stuff/systemtap/escape_delimiters.patch
$ sudo patch /usr/share/systemtap/tapset/linux/sysc_execve.stp < expand_execve_envp.patch
$ sudo patch /usr/share/systemtap/tapset/uconversions.stp < escape_delimiters.patch
<左右滑动以查看完整代码>
– 编译内核扩展
$ wget https://raw.githubusercontent.com/cuckoosandbox/cuckoo/master/stuff/systemtap/strace.stp
$ sudo stap -p4 -r $(uname -r) strace.stp -m stap_ -v
$ sudo staprun -v ./stap_.ko
$ sudo mkdir /root/.cuckoo
$ sudo mv stap_.ko /root/.cuckoo/
<左右滑动以查看完整代码>
– 关闭防火墙及ntp
sudo ufw disable
sudo timedatectl set-ntp off
<左右滑动以查看完整代码>
环境安装完成之后便可以启动cuckoo调度进程及web服务:
cuckoo -d
cuckoo web runserver 192.168.1.15:80
<左右滑动以查看完整代码>
使用Cuckoo进行恶意样本分析
Cuckoo的linux沙箱主要从三个维度进行样本分析:
syscall调用监控
通过systemtap监控系统调用。
内存分析
通过Volatility 和YARA对进程内存进行内存分析
网络行为分析
主要通过snort对网络流量进行分析
下面结合一个实际案例,详细介绍一下如何使用SystemTap监控系统调用并开发一条检测恶意样本的检测策略。
SystemTap是一个用来跟踪和探测的工具,它可以提供类似于netstat、ps、top和iostat等工具的输出信息,但是可以提供相比这些工具更加强大的跟踪和探测能力。
SystemTap是一个框架,具体的分析逻辑需要通过SystemTap脚本实现。SystemTap脚本由两部分组成:events和handlers,即事件和相应的处理程序。事件及其相应的处理程序统称为探针(probe),一个SystemTap脚本可以有多个探针。下图为cuckoo中用来监控系统调用的探针。
这段代码用来监控及获取恶意样本进程及其子进程调用的syscall,以及相关syscall的参数和返回值。
相对应的,SystemTap脚本的执行流程为:
1) SystemTap检查脚本的依赖库是否存在(通常位于/usr/share/systemtap/tapset/)。SystemTap将用tapset库中相应的定义替换脚本中的tapset。
2) SystemTap将脚本转换成C语言,并通过C编译器将其编译成内核模块。(systemtap安装包里面包含此步骤需要用到的工具)
3) SystemTap加载内核模块。在此之后脚本里面定义的全部probe(events和handlers)就生效了。这一步是通过systemtap-runtime中的staprun来实现的。
4) 事件触发时,相应的handlers(事件处理程序)被执行。
5) SystemTap会话结束时,探针自动失效,同时内核模块也被卸载掉。
至此,我们对Cuckoo通过SystemTap监控syscall的过程有了一个整体的了解,SystemTap会把采集到的syscall及其参数返回值以报告的形式返回给Cuckoo,Cuckoo的分析系统可以分析报告。使用者可以通过添加策略(signature)使对SystemTap采集的结果进行分析。
以勒索软件gonnacry的分析为例,下图是勒索软件gonnacry在执行加密操作前的一系列操作,因为他的加密依赖于系统上安装的加解密库libcrypto,所以会在libcrypto常见的安装位置搜索这个库。
我们可以添加一条策略用来记录SystemTap对该操作的记录,并标记该操作为具有一定恶意的行为。
当沙箱运行过程中本条策略被多次命中时,可以基本确定被分析的的样本在系统上搜索libcrypto.so,此时可以结合其他检测策略提升对恶意样本检测的准确率。
检测效果如下: