サンドボックス解析によるマルウェア対策ツール「cuckoo」を使ってみよう
はじめに
今回からは、前回で解説したマルウェアの対処法「サンドボックス(Sandbox)解析」と「(オンライン/オフライン)マルチスキャナ」について、それぞれOSSの活用方法を解説していきます。
今回は、マルウェアを解析するサンドボックスツール「cuckoo(クックー) https://www.cuckoosandbox.org/」(図1)について、インストール手順とその使い方を紹介します。
サンドボックス解析とは
サンドボックス解析とは、サンドボックスと呼ばれる「砂場」で不審なファイル(プログラム)を動作させて、その挙動を動的に解析する技術のことです。この砂場は通常、仮想環境上に作成されます。不審なプログラムを動作させても砂場以外の環境には影響を与えません。
サンドボックス解析では、下記のような情報を取得します。
- 起動したプロセス
- 読み込まれたレジストリ、書き込まれたレジストリ
- 読み込まれたファイル(DLLなど)
- 変更されたファイル、作成されたファイル
- ダウンロードしたファイル
- アクセスを試みた IPアドレス、ホスト、URL
など
サンドボックスは、これらの情報を元にファイルの「善」「悪」を判断します。
cuckooのインストール
サンドボックスと聞くと動的解析のイメージが強いと思いますが、実際には静的な解析も行ってくれる製品/ソフトウェアが多いです。また、「セキュリティベンダが販売するサンドボックス製品は高そう」というイメージがあるかもしれませんが、cuckooなどOSSのサンドボックスもあります。
それでは、cuckooをインストールしてみましょう。最初にインストールするOSを選定します。筆者は一番馴染みのあるDebian系のKali Linux(https://www.kali.org/)を使用します(図2)。
なお、もちろんKali Linux以外のディストリビューションでもインストールは可能ですが、コマンドやcuckooインストールに必要なソフトウェアのバージョンが異なる場合があります。
早速、Kali Linuxをインストールします。詳細なインストール方法は割愛しますが、日本語ではなくEnglishでインストールすることをお勧めします。
今回のインストール環境は以下の通りです。
CPU数:2個
メモリ:8GB
HDD:1TB
OS:Kali Linux 2017.1 (64bit) English
また、あまりお勧めはできませんが、インストールが終了したらKali Linuxを起動してrootユーザでログインし、以下のコマンドを実行します(補足が必要な箇所については適宜コメントを記載していきます)。
# apt update
# apt upgrade
# apt dist-upgrade
(Kali Linuxを再起動)
# apt install linux-headers-`uname -r`
# apt install python python-pip python-dev libffi-dev libssl-dev
# apt install python-virtualenv python-setuptools
# apt install libjpeg-dev zlib1g-dev swig
# apt install mongodb
# apt install postgresql libpq-dev
# pip install -U cuckoo
# apt install tcpdump libcap2-bin
# setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump
# getcap /usr/sbin/tcpdump
# cd ..
# wget http://downloads.volatilityfoundation.org/releases/2.6/volatility-2.6.zip
# unzip volatility-2.6.zip
# cd volatility-master
# python setup.py build
# python setup.py install
# cd ..
# git clone https://github.com/gdabah/distorm
# cd distorm
# python setup.py install
# cd ..
# apt install autoconf libtool-bin
# git clone https://github.com/VirusTotal/yara
# cd yara
# ./bootstrap.sh
# ./configure
# make
# make install
# pip install yara-python
# cd ..
# wget https://pypi.python.org/packages/60/db/645aa9af249f059cc3a368b118de33889219e0362141e75d4eaf6f80f163/pycrypto-2.6.1.tar.gz
(pycrypto-2.6.1.tar.gzをダウンロード)
# tar xvzf pycrypto-2.6.1.tar.gz
# cd pycrypto-2.6.1
# python setup.py build
# python setup.py install
# cd ..
# pip install openpyxl
# pip install ujson
# pip install jupyter
# apt install python3-pip python3-dev libssl-dev libtiff5-dev libjpeg62-turbo-dev zlib1g-dev libwebp-dev
# pip3 install mitmproxy
# mitmproxy
([Ctrl]+[C]キーを押してmitmproxyを終了)
# cd ~/.mitmproxy
# mkdir -p /root/Downloads/cuckoo/analyzer/windows/bin
# cp mitmproxy-ca-cert.p12 /root/Downloads/cuckoo/analyzer/windows/bin/cert.p12
# cd
# apt install virtualbox
# ifconfig
# vboxmanage hostonlyif create
# vboxmanage hostonlyif ipconfig vboxnet0 --ip 192.168.56.1 --netmask 255.255.255.0
# ifconfig
(vboxnet0が作成されたことを確認)
# iptables -L
# 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
# iptables -L
(上記で設定した内容が反映されていることを確認)
# mkdir -p /opt/python_windows
# cd /opt/python_windows
# wget https://www.python.org/ftp/python/2.7.13/python-2.7.13.msi
# wget http://effbot.org/downloads/PIL-1.1.7.win32-py2.7.exe
# virtualbox &
(VirtualBox上にゲストOSのWindows 7 (32bit) Englishバージョンをインストール)
[NEW]→
Name: win7x32
Type: Microsoft Windows
Version: Windows 7 (32-bit)
[Next]→Memory size: 1024 MB→[Next]→[Create]→[Next]→[Next]→ファイルサイズを1.0TBに変更→[Create]→[Settings]→[Network]→Attached to: Host-only Adapter
Name: vboxnet0
→[Storage]→CDのアイコンをクリックし、Windows 7 (32bit)英語版CDメディアなどを選択(環境に依存)→[OK]→[Start]
これでWindows 7 (32bit) 英語版がインストールされます。詳細なインストール手順は割愛しますが、重要なポイントのみ書き出します。
●Windowsのインストール中
User name:任意の英字
Computer name:win7x32
●Windowsインストール後
- Help Protect your computer and improve Windows automatically
→[Ask me later]を選択 - Select your computer’s current location
→[Work network]を選択 - UAC(User Account Control)を無効(Never notify)にする
→Windows Firewallを無効(Turn off)にする - Folder optionを変更する
→[View]→[Show hidden files, folders, and drives]を選択
→[View]→[Hide extensions for known file types]のチェックを外す - TCP/IP設定
IP address:192.168.56.101
Subnet mask:255.255.255.0
Default gateway:192.168.56.1
Preferred DNS server:8.8.8.8
Alternate DNS server:8.8.4.4
これでWindowsのインストールは終了ですが、あとはcuckooで使用するために下記の作業などが必要です。
- Python、PIL(Python Imaging Library)のインストール
- agent.pyファイルのコピー
なお、「VirtualBox Guest Additions」をインストールすれば、これらを簡単に行うことができます。ただし、Windowsに余計なソフトウェアをインストールしたくない場合にはお勧めしません。インストールする場合は[Devices]→[Insert Guest Additions CD image...]を選択するとWizard形式で簡単に実行できます(インストール後はWindowsの再起動が必要)。
ここで、Kali Linux上の/opt/python_windowsにある「python-2.7.13.msi」と「PIL-1.1.7.win32-py2.7.exe」の2つのファイルをWindowsにコピーします(VirtualBox Guest Additionsのドラッグ&ドロップ機能を使う場合には[Devices]→[Drag and Drop]→[Host to Guest]を選択)。
python-2.7.13.msiをインストールする際は、[Add python.exe to Path]オプションを有効にします(デフォルトでは無効)。また、PIL-1.1.7.win32-py2.7.exeをインストールする際は、デフォルトインストールで問題ありません。
次に、Microsoft Office、Adobe Reader、Flash Player、Java、.NET frameworkなど、サンドボックス環境にインストールしたいソフトウェアをインストールします。ここで注意点が1点あります。ソフトウェアの初回起動時には約款の表示や初期設定などがあるので、それらをcuckooサンドボックスの初回起動前に表示・実行しておく必要があります。
先ほどと同様に、Kali Linux上の~/.cuckoo/agent/agent.pyファイルを、一旦WindowsのDesktopにコピーします。次に、Desktop上に保存したagent.pyファイルを下記フォルダに移動します。
C:\Users\USERNAME\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
※(USERNAMEはWindowsにログインするユーザ名)
ここで、Windowsを再起動してログインするとpython.exeのウインドウが開くので最小化します。スクリーンショットを撮る際に、このpython.exeウインドウが邪魔になるからです。
PythonとPIL等のインストールにVirtualBox Guest Additionsを使用した場合はDドライブにあるイメージをEjectした状態でスナップショットを撮ります。[Machine]→[Take Snapshot…] →Snapshot Name: Snapshot1(Snapshotと1の間にスペースは入れない)。
ここでWindowsをシャットダウンし、再度Kali Linux上で設定を続けます。
# service postgresql start
# service postgresql status
# systemctl enable postgresql
# service mongodb start
# service mongodb status
# systemctl enable mongodb
# cd /opt
# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.0.deb
# dpkg -i elasticsearch-5.6.0.deb
# gedit /etc/elasticsearch/elasticsearch.yml &
[変更前]
#network.host: 192.168.0.1
#http.port: 9200
[変更後]
network.host: 127.0.0.1
http.port: 9200
# service elasticsearch start
# service elasticsearch status
# systemctl enable elasticsearch
# su postgres
# psql
# CREATE USER cuckoo WITH PASSWORD 'password123';
(password123は任意)
# CREATE DATABASE cuckoo;
# GRANT ALL PRIVILEGES ON DATABASE cuckoo to cuckoo;
# \q -> Enter-key
([バックスラッシュ]キーと[q]キーを押して[enter]キーを押す)
# exit
# cd
# cuckoo
# cd .cuckoo/conf
# gedit auxiliary.conf &
[変更前]
[mitm]
# Enable man in the middle proxying (mitmdump) [yes/no].
enabled = no
[変更後]
enabled = yes
[変更前]
certificate = bin/cert.p12
[変更後]
certificate = /root/Downloads/cuckoo/analyzer/windows/bin/cert.p12
# gedit cuckoo.conf &
[変更前]
memory_dump = no
[変更後]
memory_dump = yes
[変更前]
connection =
[変更後]
connection = postgresql://cuckoo:password123@localhost:5432/cuckoo
# gedit memory.conf &
[変更前]
guest_profile = WinXPSP2x86
[変更後]
guest_profile = Win7SP1x86
# gedit processing.conf &
[変更前]
[memory]
(略)
enabled = no
[変更後]
enabled = yes
[変更前]
[virustotal]
enabled = no
[変更後]
enabled = yes
(VirusTotalを使用しない場合はnoのままにしておく)
# gedit reporting.conf &
[変更前]
[mongodb]
enabled = no
[変更後]
enabled = yes
[変更前]
[elasticsearch]
enabled = no
(略)
hosts = 127.0.0.1
[変更後]
enabled = yes
hosts = 127.0.0.1:9200
# gedit virtualbox.conf &
[変更前]
machines = cuckoo1
[cuckoo1]
(略)
label = cuckoo1
[変更後]
machines = win7x32
[win7x32]
label = win7x32
[変更前]
snapshot =
[変更後]
snapshot = Snapshot1
[変更前]
# Example (vboxnet0 is the interface name):
interface =
[変更後]
interface = vboxnet0
# cd
# cuckoo community
# cuckoo
■cuckooでランサムウェアを解析してみよう!
新規にTerminalを起動し、下記のコマンドを実行します。
# cuckoo web
Firefoxを起動してhttp://127.0.0.1:8000/にアクセスすると、図3のような画面が表示されます。ファイル、URL、HASHの解析を行うことができます。
ここで、WannaCryランサムウェアをcuckooで解析した結果を見てみます(図4)。スクリーンショットから判断しても、容易にWannaCryであることが判断できると思います。
また、VirusTotalを有効にしているので、その結果も確認できます(図5)。
他にも、各種VM Memory Dumpも確認できます(図6)。
余談ですが、最後にKali Linuxを再起動する手順を記載します。
- Terminalを起動し、下記コマンドを実行
# vboxmanage hostonlyif ipconfig vboxnet0 --ip 192.168.56.1 --netmask 255.255.255.0
# cuckoo - 新規にTerminalを起動し、下記コマンドを実行
# cuckoo web
- Firefoxを起動し、http://127.0.0.1:8000/にアクセス
さらに余談ですが、覚えておくと便利なコマンドがあります。解析したデータを全て削除するコマンドです。Terminalで下記のコマンドを実行するだけです。
# cuckoo clean
この他のコマンドは、cuckoo --helpコマンドで確認できます。
おわりに
今回は、サンドボックス「cuckoo」について解説しました。
サンドボックスでも、インターネットに接続しているオンライン環境では、VirusTotalなどを活用すればウイルスを識別可能です。しかし、オフライン環境では難しいのが実情です。そこで、次回は、オフラインでもウイルス検知が可能な下記のオフラインマルチ(ウイルス)スキャナのインストール手順と注意点を解説します。
- Malice
- IRMA