ミニキャンプ沖縄・仮想化技術を用いたマルウェア解析-Revenge(環境構築編)

12/19~12/20にかけて開催された"セキュリティ・ミニキャンプ in 沖縄 2015"に参加してきました.

  

講義中には時間が足りずに出来なかった

"仮想化技術を用いたマルウェア解析"のリベンジをしてみたいと思います.

 

実はこの講義,一番難しかったけど,一番楽しかった.

もっと理解したら絶対楽しい.

 

前置きはこのくらいにして,環境構築に入っていきたいと思います.

Virtual Boxを使ってます.メモリは2GB.

ちなみにホストOSはメモリ4GBです.

VMUbuntuインストールするくらいは自分で調べてくださいw(めんどくさい)

$ uname -a
Linux tsun-ubuntu 3.16.0-30-generic #40~14.04.1-Ubuntu SMP Thu Jan 15 17:43:14 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

こんな感じです.

Ubuntu 14.04 LTS 64bitです.

 

これにDECAFを導入していきます.

HDDに十分に空き領域がある事に注意してください.

Windows XPのイメージなどで結構喰われる(10GB~あれば余裕かな)

What is DECAF??

DECAF(short for Dynamic Executable Code Analysis Framework) is a binary analysis platform based on QEMU. This is also the home of the DroidScope dynamic Android malware analysis platform.

簡単にいうと,QEMUをベースに開発されているマルウェア解析プラットフォーム.

ていう解釈であってるかな. 

DECAFのインストール

DECAFのビルド

$ sudo apt-get update
$ sudo apt-get install qemu binutils-dev libboost-all-dev
$ sudo apt-get build-dep qemu
$ git clone https://github.com/sycurelab/DECAF
$ cd DECAF/decaf $ ./configure $ make

 makeが終わるまで待ちます. 

 

 ゲストOSのインストール

https://az412801.vo.msecnd.net/vhd/VMBuild_20141027/VirtualBox/IE8/Windows/IE8.XP.For.Windows.VirtualBox.zip

ここからイメージをダウンロードしてください.

30日間だけ使えるやつを無料で配布しています.

あ,あと僕のユーザ名がtsunなので今から作業でPATH指定するときには

コピペしないで自分で適宜変更をお願いします.

$ pwd
/home/tsun/DECAF
$ mkdir VM
$ mv IE8.XP.For.Windows.VirtualBox.zip VM/
$ cd VM
$ unzip IE8.XP.For.Windows.VirtualBox.zip

unzipしてでてくる

なんちゃら.vmdkの名前が長かったのでwinxp.vmdkにしました.

$ qemu-img convert -f qcow2 winxp.vmdk -O qcow2 pre_ie8.qcow2
$ qemu-img convert -p -f qcow2 -O qcow2 compat=0.10 pre_ie8.qcow2 ie8.qcow2

 QEMUを立ち上げてWindows XPが起動するか確かめます.

$ cd ~/DECAF/decaf/i386-softemmu
$ ./qemu-system-i386 -monitor stdio -m 1024 ../../VM/ie8.qcow2
$ export SDL_VIDEO_X11_DGAMOUSE=0

 export SDL_VIDEO_X11_DGAMOUSE=0

はマウスポインタが暴走する時にやるといいです.

[CTRL + ALT + U]をすると画面が(たぶん)見やすくなると思います.

 

Windosが立ち上がったらターミナル上で[Enter]を押します.

すると,(qemu)というのが出てくるので

(qemu) quit 

で一旦Windowsを終了します.

 

問題のプログラムをWindowsにコピーしていきます.

$ cd ~/DECAF
$ git clone https://github.com/ntddk/blue.git $ sudo modprobe nbd $ sudo qemu-nbd -c /dev/nbd0 ie8.qcow2 $ sudo /sbin/fdisk -l /dev/nbd0 $ sudo mount -o loop,offset=$((63*512)) /dev/nbd0 /mnt $ sudo cp -r blue /mnt/Documents and Settings/All Users/Desktop $ sudo umount /mnt $ sudo qemu-nbd -d /dev/nbd0 $ sudo rmmod nbd

 

プラグインもコンパイルしておきます.

$ cd ../decaf/plugins
$ git clone https://github.com/ntddk/geteip
$ cd geteip
$ ./configure --decaf-path=/home/tsun/DECAF/decaf
$ make

 

pluginのload,unloadや使い方

 

(qemu) load_plugin /home/tsun/DECAF/geteip/geteip.so
(qemu) geteip blue.exe

編集したgeteip.cをに反映させたい場合はmakeしたあとにunloadします

この際,geteip.cを編集するターミナルとQEMUを起動しているターミナルは別にしておいてください.

編集ターミナルでmakeコマンドを実行した後にQEMUターミナルの方で次のコマンドを打ちます.

(qemu) unload_plugin
(qemu) load_plugin /home/tsun/DECAF/geteip/geteip.so
(qemu) geteip blue.exe

これでblue.exeに編集したのが反映されます.

おわり

これで環境構築はおわりました.

次はいよいよプラグイン開発です.

 

Ref:

ntddk.github.io

poppycompass.hatenablog.jp

ポート設定でコケた

sshのポート変更しようかな...って思い

躓いたところのメモ

 

 設定をいじります

#vim /etc/ssh/sshd_config

#vim /etc/sysconfig/iptables

 

楽勝だ~

#service sshd restart
Stopping sshd: [OK]
Starting sshd: [OK]

#service iptables restart
iptables: Setting chains to policy ACCEPT: filter [OK]
iptables: Flushing firewall rules: [OK]
iptables: Unloading modules: [OK]
iptables: Applying firewall rules: iptables-restore: line 14 failed


!!!!!???

 

iptablesでいじったのは,ここだけ↓

 

*filter
~~~(略)~~~
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT #ここ

 

無駄なスペースが入力されているわけでもなく,スペルミスしているわけでもない.

ふと思いついて,こんな感じに変更

 

*filter
~~~(略)~~~
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT #ここ
COMMIT


COMMITの前に入れるとでけた


調べてみると
設定ファイルを直接編集する際は、
行頭に「*(アスタリスク)」を付けて、最後は「COMMIT」で指定.
その間に書かれた設定がfilterテーブルのルールとなるらしいです.

 

~~参考~~

http://oxynotes.com/?p=6361
http://easyramble.com/change-ssh-port-number.html

int main()とint main(void)

ウソです。なんか寝る前に考えていて朝目覚めてすぐ行動したという感じ。

プログラミングのテストでint main()で書いていて点数が下がったので

えっ...と思っていた

らしいのでgdbの使い方も含めて確かめてみよう.

 

まず簡単にハローする

//hello.c

int main(){

printf("Hello World!\n");

return 0;
}

 

//hello_void.c
#include<stdio.h>

int main(void){

printf("Hello World!\n");

return 0;
}

 

次にコンパイル

 

gcc -g -o h1 hello.c

gcc -g -o h2 hello_void.c

 

-gオプションを付けることでデバッグ情報が付加されますね

次はいよいよgdbの出番です

 

お好みでintel記法かAT&T記法か選んでください。デフォルトだとAT&T

 

-ex 'set disassembly-flavor intel' -ex 'disp/i $pc'

intel記法に修正したい時はコレ from ももテク

gdbの使い方のメモ - ももいろテクノロジー

 

さて

 

gdb -q h1

Reading symbols from void...done.
(gdb)disas main

Dump of assembler code for function main:

0x000000000040052d <+0>: push %rbp
0x000000000040052e <+1>: mov %rsp,%rbp
0x0000000000400531 <+4>: mov $0x4005d4,%edi
0x0000000000400536 <+9>: callq 0x400410 <puts@plt>
0x000000000040053b <+14>: mov $0x0,%eax
0x0000000000400540 <+19>: pop %rbp
0x0000000000400541 <+20>: retq
End of assembler dump.

 

もう一方の(void)の方を見てみましょう

 

Reading symbols from void...done.
(gdb)disas main

Dump of assembler code for function main:

0x000000000040052d <+0>: push %rbp
0x000000000040052e <+1>: mov %rsp,%rbp
0x0000000000400531 <+4>: mov $0x4005d4,%edi
0x0000000000400536 <+9>: callq 0x400410 <puts@plt>
0x000000000040053b <+14>: mov $0x0,%eax
0x0000000000400540 <+19>: pop %rbp
0x0000000000400541 <+20>: retq
End of assembler dump.

 

なんと同じなんですねーww

先生に反論できる!できるぞ!!

 

つ[ http://qiita.com/raccy/items/b59bd7fa9f4eacabca79 ]

 

なんとc++だと上の二つは一緒ということなのですが

cだと違うそうなんです.(死)

テストの点数が上がらないことがわかったのでジ・エンド

 

-参考-

inaz2.hatenablog.com

qiita.com

コマンドラインからpdfを見る

今までクリックしてpdfをdocument viewerで見ていたけど

コマンドないのかググったところあったのでメモ.

 

tsun@ubuntu:~$ evince foo.pdf

 

evinceのオプション色々...

フルスクリーンモード

--fullscreen hoge.pdf

 

プレゼンテーションモード

--presentation huga.pdf

 

プレビューモード

--preview bar.pdf

 

でも

tsun@ubuntu:~$ evince http://example.jp/sample.pdf

のようにURL指定したら出来なかった...

調べたらできるらしいんだけど...

そこら辺はもう少し詳しく調べてみよう