雲妹導讀:
沙箱的英文為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腳本的執行流程為:
- SystemTap檢查腳本的依賴庫是否存在(通常位於/usr/share/systemtap/tapset/)。SystemTap將用tapset庫中相應的定義替換腳本中的tapset。
- SystemTap將腳本轉換成C語言,並通過C編譯器將其編譯成內核模塊。(systemtap安裝包里面包含此步驟需要用到的工具)
- SystemTap加載內核模塊。在此之后腳本里面定義的全部probe(events和handlers)就生效了。這一步是通過systemtap-runtime中的staprun來實現的。
- 事件觸發時,相應的handlers(事件處理程序)被執行。
- SystemTap會話結束時,探針自動失效,同時內核模塊也被卸載掉。
至此,我們對Cuckoo通過SystemTap監控syscall的過程有了一個整體的了解,SystemTap會把采集到的syscall及其參數返回值以報告的形式返回給Cuckoo,Cuckoo的分析系統可以分析報告。使用者可以通過添加策略(signature)使對SystemTap采集的結果進行分析。
以勒索軟件gonnacry的分析為例,下圖是勒索軟件gonnacry在執行加密操作前的一系列操作,因為他的加密依賴於系統上安裝的加解密庫libcrypto,所以會在libcrypto常見的安裝位置搜索這個庫。
我們可以添加一條策略用來記錄SystemTap對該操作的記錄,並標記該操作為具有一定惡意的行為。
當沙箱運行過程中本條策略被多次命中時,可以基本確定被分析的的樣本在系統上搜索libcrypto.so,此時可以結合其他檢測策略提升對惡意樣本檢測的准確率。
檢測效果如下:
[閱讀原文]