Cuckoo Sandbox on KVM（ホスト編）

マルウェアの動的解析を行おうとして[Cuckoo Sandbox](http://www.cuckoosandbox.org/)のセットアップを行おうと思ったのですが、壮大にハマったのでやり方をメモしておきます。

基本はVirtualBoxだと思いますが、今回はKVMについて書きます。
VirtualBoxは構築済みなので、暇な時に書きたいと思います。
とりあえずUbuntu 14.04上にKVMを構築し、Windows 7のVMをその上で動かし、Windows 7でマルウェアを動かす構成にしたいと思います。

このパッケージはこれ入れれば依存関係で勝手に入るよ、とかあるとは思いますが検証している暇がないので必要な物は片っ端から入れてあります。

#環境
- ホストOS
 - Ubuntu 14.04
- ゲストOS
 - Windows 7
- KVM
 - virsh 1.2.2
- cuckoo
 - 1.2-dev


#参考
- [Cuckoo Sandbox Book](http://docs.cuckoosandbox.org/en/latest/)
- [マルウェア解析システム(Cuckoo 説明編)](http://katana4kun.blogspot.jp/2013/11/cuckoo.html)

#Cuckoo Sandboxの設定
##ホストの設定
まずはホストOSの設定をしていきます。
基本は公式ドキュメントに従いますが、公式通りにやっても全くうまく行かなかったので、出来なかった部分を直したものを書いておきます。

###pythonのインストール
Ubuntuを普通に入れたらpythonは入っているとは思いますが、入っていない時のため。
python 2.7が推奨のようです。
同時にpythonのパッケージ管理ツールの`pip`もインストールしておきます。

```shell-session
$ sudo apt-get install python
$ python --version
Python 2.7.6
$ sudo apt-get install python-pip
```

###SQLAlchemyとPython BSONのインストール
必須のライブラリを入れます。
ここでpython-bsonを入れるように書いてありますが、入れるとcuckoo実行時にWarningが出てうまくMongoDBに保存できませんでした（[Cuckooでpymongoがimportできない](http://qiita.com/knqyf263/items/89913bb74aff9ba1ddb5)）。
`pymongo`を入れるときにインストールされる`bson`を使わないと駄目なようで、先にインストールしていると怒られます。
なのでここでは`python-bson`はインストールしないほうが恐らく良いです。
後で不具合が起きたら上記の記事の内容を試してみてください。


```console
$ sudo apt-get install python-sqlalchemy (python-bson)
```


###moduleで必要なライブラリ群のインストール
####apt-get
python-magic, python-dpkt and python-libvirtに関しては`apt-get`でインストールし、残りはpipでインストールします。

```console
$ sudo apt-get install python-magic python-dpkt python-libvirt
```

####pip
残りは`pip`でインストールしますが、ここで注意があります。
ドキュメントのようにmaecをインストールしようとするとエラーが出ます。
それに関しては以下に詳しく書きました。
[pipでmaec 4.0.1.0をインストールしようとするとエラーが出る](http://qiita.com/knqyf263/items/60083ef0e5ebd86bfc7b)
ここでは詳細は省いて`maec`のインストール手順だけ書いておきます。

```shell-session
#python-lxmlだけでいいかも
$ sudo apt-get install libxml2-dev libxslt1-dev zlib1g-dev python-lxml
#cyboxを入れる
$ wget https://github.com/CybOXProject/python-cybox/archive/v2.0.1.4.tar.gz
$ tar zxvf v2.0.1.4.tar.gz
$ cd python-cybox-2.0.1.4/
$ sudo python setup.py install
#maecを入れる
$ sudo pip install maec==4.0.1.0
```
これで`maec`がインストールされるので残りのライブラリをインストールします。

```console
$ sudo pip install jinja2 pymongo bottle pefile django chardet
```

###Pydeepのインストール
Pydeepをソースからコンパイルしてインストールしたら、cuckoo実行時に

```console
WARNING: Unable to import pydeep (install with `pip install pydeep`)
```
と言われて怒られたので、pipでインストールします。
予め必要そうなパッケージと他にも必要なパッケージをインストールします。

```shell-session
$ sudo apt-get install ssdeep python-pyrex libfuzzy-dev subversion
$ sudo pip install pydeep
```

###Yaraのインストール
yaraとyara-pythonもあったほうが良いのでインストールしますが、ここで盛大にハマりました。
[Cuckoo Sandboxの実行でYaraのエラーが出る](http://qiita.com/knqyf263/items/9354dc229b2b3d548460)
これも詳細は上記を参考にしてもらうとして、コマンドだけ記載しておきます。

```shell-session
#必要なライブラリなど
$ sudo apt-get install libtool automake libjansson-dev libmagic-dev
#yaraの最新版を入れてコンパイルする
$ wget https://github.com/plusvic/yara/archive/v3.1.0.tar.gz
$ tar zxvf v3.1.0.tar.gz
$ cd yara-3.1.0/
$ ./bootstrap.sh
$ ./configure --enable-cuckoo --enable-magic
$ make
$ sudo make install
#yara-pythonをコンパイルする
$ cd yara-python/
$ python setup.py build
$ sudo python setup.py install
#ldconfigする
$ sudo su
# echo "/usr/local/lib" >> /etc/ld.so.conf
# ldconfig
# exit
```

###tcpdumpのインストール
ネットワークをモニタリングするためにtcpdumpが必要です。

```console
$ sudo apt-get install tcpdump
```

tcpdumpは通常root権限が必要ですが、Cuckooをrootで動かしたくない場合は権限を変更します。

```console
$ sudo setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump
```

以下のコマンドで結果を確認します。

```console
$ getcap /usr/sbin/tcpdump
/usr/sbin/tcpdump = cap_net_admin,cap_net_raw+eip
```

###MongoDBのインストール
これはオプションなのですが、解析結果をMongoDBに入れることが出来ます。
便利なので、インストールしておくことにしておきます。
＃実はpymongoは既に上でpipで入れてたりします。

```console
$ sudo apt-get install mongodb
```


###Volatilityのインストール
詳細は[Volatilityのインストール](http://qiita.com/knqyf263/items/490ab1eb339b18b4a0e5)に書きましたので、ここではコマンドだけ書いておきます。

```shell-session
$ sudo apt-get install pcregrep libpcre++-dev

$ sudo pip install pycrypto

$ wget https://distorm.googlecode.com/files/distorm3.zip
$ unzip distorm3.zip
$ cd distorm3/
$ python setup.py build
$ sudo python setup.py build install

$ wget https://volatility.googlecode.com/files/volatility-2.3.1.tar.gz
$ tar zxvf volatility-2.3.1.tar.gz
$ cd volatility-2.3.1/
$ python setup.py build
$ sudo python setup.py build install
```

###Cuckoo用ユーザを作成
Cuckooでは`cuckoo`というユーザで実行するので、そのユーザを作成します。

```shell-session
$ sudo adduser cuckoo
$ sudo usermod -G libvirtd cuckoo
```

###Cuckooのインストール
ついに念願のCuckooをインストールします。

```console
$ sudo apt-get install git
$ git clone git://github.com/cuckoobox/cuckoo.git
```

##まとめ
これでホスト側の設定は終わりです。
ホスト側でもかなり大変なのですが、自分はこの手順で何回も構築に成功したので、今後は楽になりそうです。
ただ、Cuckooを使うためにはこれだけでは足りず、今度はゲスト側の設定が必要になります。
それは次回（[Cuckoo Sandbox on KVM（ゲスト編）](http://qiita.com/knqyf263/items/739a8ffd5907277a13de))とします。