云妹导读:
沙箱的英文为sandbox,也被译作沙盒,通常用来为一些起源不可信、具破坏力或无奈断定其用意的程序提供一个隔离的运行环境,甚至很多专业级的沙箱,实质就是一个加强的虚拟机。沙箱通常能够严格控制沙箱中运行的程序所能拜访的各种资源,包含:限度、禁止、监控对网络的拜访、对实在零碎的拜访、对输出设施的读取等。总之,能够把沙箱了解为是虚拟化和监控伎俩的集合体。
沙箱是咱们日常进行歹意攻打捕捉、应急响应处理等工作时的常用工具。本文将通过几个实例介绍沙箱的基本概念,以Cuckoo为例介绍沙箱环境的搭建流程,最初以gonnacry勒索软件为例简略介绍Cuckoo linux沙箱检测能力加强及signature开发过程。
为了更好的了解沙箱的相干概念,上面分析一下咱们日常可能会用到的几个典型沙箱。
微软在Windows 10 18305版本之后的专业版和企业版中退出了沙箱性能,能够通过Windows性能界面开启沙箱。
Windows沙箱基于Windows下的容器技术,构建在Windows操作系统内核之上,是一种更轻量级的虚拟化计划,专门用于平安地隔离运行应用程序。其根本架构如下图所示:
Windows沙箱尽管与操作系统共享内核,但沙箱拜访内核是受限制的,内核并未提供利用程序运行所需的全副API和服务。
Windows沙箱具备开箱即用的个性,咱们能够间接开启一个Windows沙箱,像在本地一样运行应用程序,然而不必放心损坏操作系统。比方,咱们在日常应用电脑的过程中不免遇到须要下载执行一些可信度不确定的应用程序,在电脑上间接运行放心中毒,虚拟机运行又太耗费资源,这时Windows沙箱便是一个很好的抉择。
现在,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沙箱是一个自动化的歹意样本剖析零碎。通过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。
以下装置流程基于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的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,此时能够联合其余检测策略晋升对歹意样本检测的准确率。
检测成果如下:
[浏览原文]