社会人になってからCTFにちょくちょく出るようになったのですが、先日出たCSAW CTF 2016であまりにもForensicsが解けなかったので、どんなテクニックがあるか自分のためにまとめておこうと思います。
最早実務のフォレンジックとはかけ離れているような気がしますが、ツールの使い方などを知っておくことは勉強になるのかなと思います。
有識者の方はこんなツールとかもあるよ、とか教えていただけると嬉しいです。
基本的にCSAW CTF 2016の問題で得た知識を基に書いてます。
画像ファイルが渡された場合
問題でPNGやJPEGが渡された場合に、下調べとしてまずどんなことをするか知ってる範囲でまとめてみました。
exiftool
画像のExif情報を 確認します。
画像だけかと思ってましたがmp4とかでもExif見れるのですね。
インストール方法
$ sudo apt-get install exiftool
読み込むだけではなくて書き込みなどもできるみたいです。
以下はWatchword(CSAW CTF 2016)の問題です。
$ exiftool powpow.mp4
ExifTool Version Number : 9.46
File Name : powpow.mp4
Directory : .
File Size : 944 kB
...(中略)...
Artist : Stefan Hetzl
Title : aHR0cDovL3N0ZWdoaWRlLnNvdXJjZWZvcmdlLm5ldC8=
Encoder : Lavf56.40.101
Movie Data Size : 538668
Movie Data Offset : 8873
Avg Bitrate : 378 kbps
Image Size : 640x360
Rotation : 0
この問題ではTitleに怪しい文字列が入っていました。
strings
Forensicsに限らずバイナリの問題などでも必ずみんな使うと思いますが、一応書いておきます。
strings
コマンドはバイナリファイルなどから表示可能な文字列を表示してくれます。
以下はKill(CSAW CTF 2016)の問題です。
$ strings kill.pcapng
Mac OS X 10.11.6, build 15G1004 (Darwin 15.6.0)
Dumpcap 1.12.4 (v1.12.4-0-gb4861da from master-1.12)
vmnet8
...(中略)...
=flag{roses_r_blue_violets_r_r3d_mayb3_harambae_is_not_kill}
...
この問題はstringsコマンド打っただけでflagが入ってました。
binwalk
中身に埋め込まれてるファイルがあるかなどを取り出すことが出来ます。
例えばただのPNGファイルかと思ったら、他にもJPEGなどファイルを幾つか連結している問題などが過去にありました。
動画内に画像が埋め込まれていることもあるので、とりあえずbinwalkで中に他のファイルが紛れ込んでいないかを確かめるのは良いかと思います。
以下はWhat you see is what you get(Pragyan CTF 2015)の問題です。
$ sudo apt-get install binwalk
$ binwalk -e stego_50.jpg
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 JPEG image data, JFIF standard 1.02
10541 0x292D Zip archive data, at least v1.0 to extract, compressed size: 37, uncompressed size: 37, name: "usethis"
10720 0x29E0 End of Zip archive
上の問題ではJPEGの中にzipが入っていたようです。
foremost
これはファイルのヘッダやフッタ、内部データ構造に基づいてファイルを復元してくれるツールらしいです。
ただbinwalkみたいに一つのファイルに連結されてるときとかにも使えるっぽいです。
以下はSteganography 1(SECCON 2015)の問題です。
$ sudo apt-get install foremost
$ foremost MrFusion.gpjb
Processing: MrFusion.gpjb
|*|
下で書くようにイメージファイルなどにも使えます。
ただこの問題ではビットマップが上手く取り出せていなかったので、foremostだけでは解けないようです。
Stepic
Steganography用のツールです。
http://domnit.org/stepic/doc/
PNGなどの画像に文字やファイルを隠したり出来ます。
PNGにJPEGを隠したりとかも出来るようです。
$ echo test > hidden.txt
$ stepic --encode --image-in=stepic-demo-before.png --data-in=hidden.txt --out=stepic-demo-after.png
$ stepic --decode --image-in=stepic-demo-after.png --out=output.txt
このbeforeとafterの画像はパッと見では全く違いが分かりません。
ですが実際にファイルを取り出すことが出来ます。
Steghide
これもStepic同様、Steganography用のツールです。
http://steghide.sourceforge.net/
パスワードなどをつけてファイルを隠すことが出来ます。
$ steghide embed -cf image.jpg -ef base64.txt
Enter passphrase:
Re-Enter passphrase:
embedding "base64.txt" in "image.jpg"... done
$ steghide info image.jpg
"image.jpg":
format: jpeg
capacity: 1.7 KB
Try to get information about embedded data ? (y/n) y
Enter passphrase:
embedded file "base64.txt":
size: 83.0 Byte
encrypted: rijndael-128, cbc
compressed: yes
$ steghide extract -sf image.jpg -p password
wrote extracted data to "base64.txt"
白文字
画像に白文字でFlagが隠されている場合もあります。
画像検索
意外と一番重要かもしれないのが画像検索です。
とりあえず投げておけば何か分かる事があったりします。
https://www.google.co.jp/imghp
実際にCSAW CTFではずっとQRコードのような画像が何かわからなかったのですが、画像検索したら実はMaxiCodeということがすぐ分かったりする問題もありました。
ZXing
QRコードとかバーコードを読むためのライブラリです。
プログラムで読み取りを行いたい場合はこちらを使うと良いです。
また、画像をアップロードすると読み取りを行ってくれるサイトもあります。
https://zxing.org/w/decode.jspx
上述したMaxiCodeもここに投げればすぐ読み取ってFlagが出ました。
zipが渡された場合
zipinfo/zipdetails
zipのメタ情報などにflagが隠されていることもあるようです。
evidence.zip(CSAW 2016)ではCRCに隠されていました。
$ zipinfo -v evidence.zip
Central directory entry #1:
---------------------------
out/rxo802ayx4
offset of local header from start of archive: 0 (00000000h) bytes
file system or operating system of origin: SMS/QDOS
version of encoding software: 4.5
minimum file system compatibility required: MS-DOS, OS/2 or NT FAT
minimum software version required to extract: 15.4
compression method: unknown (169)
file security status: not encrypted
extended local header: no
file last modified on (DOS date/time): 1980 Oct 1 06:01:04
32-bit CRC value (hex): 666c6167
compressed size: 4294967295 bytes
uncompressed size: 4294967295 bytes
length of filename: 14 characters
length of extra field: 20 bytes
length of file comment: 0 characters
disk number on which file begins: disk 1
apparent file type: binary
Unix file attributes (000600 octal): ?rw-------
MS-DOS file attributes (00 hex): none
The central-directory extra field contains:
- A subfield with ID 0x0001 (PKWARE 64-bit sizes) and 16 data bytes:
34 ff 13 ee f4 00 37 13 8c 03 00 00 00 00 00 00.
There is no file comment.
確かにCRCがASCIIの間に入ってますね。
常に変な値が入っていないかを見るのが大事ですね。
###参考
PkCrack
zipに対する既知平文攻撃を実行するツールです。
色々なCTFで出題されている気がします。
詳しくは1つ目の参考ページを見て欲しいですが、暗号化前の平文の一部が分かっている場合に、それを手掛かりに暗号文を復号する攻撃方法のことです。
$ pkcrack -C test.zip -c plaintext.txt -p plaintext.txt -P plaintext.zip -d target.zip
得た平文をzipにしてコマンドに渡すようですが、暗号化されたzipと同じ圧縮率じゃないと駄目らしく、MacとLinuxで圧縮率違って上手く行かなかったりすることもあるようです。
参考
- https://securitymemo.blogspot.jp/2014/10/blog-post.html
- http://kaworu.jpn.org/kaworu/2012-12-07-1.php
- http://takahoyo.hatenablog.com/entry/2015/08/31/031554
ディスクイメージが渡された場合
mount
とりあえずそのままマウントできるかもしれないのでマウントしてみます(root権限が必要)。
以下はClams Don't Dance(CSAW 2016)の問題です。
# mount out.img /mnt/test/
# ls /mnt/test
dance.mp4
マウントしたら中にMP4ファイルが入っていました。
fdisk
特定のパーティションをマウントしたい場合もあるかと思います。
その場合はfdiskで調べてからoffsetをmountコマンドで指定すれば良いです。
マウントしたいパーティションのstartとなっている数値にセクタサイズ(通常512)をかけた数がoffsetとなるようです。
# fdisk -lu out.img
# mount -o loop,offset=[start*512] out.img /mnt/test
参考
TestDisk
パーティション情報を修復するソフトウェアです。
削除されたファイルを復元してくれるツールかと思っていたのですが、パーティション情報が壊れて取り出せなくなっていたデータをパーティション情報の修復によりアクセスできるようにしてくれているみたいです。
# mount out.img /mnt/test/
# df -h | grep mnt
/dev/loop0 100M 1.3M 99M 2% /mnt/test
# testdisk /dev/loop0
testdiskコマンドを実行すると対話式で色々質問されるので答えていくとファイルを復元できたりします。
PhotoRec
ハードディスク上のパーティションを検査し、可能な限りファイルを復元することができるデータリカバリ用ソフトらしいです。
削除フラグが立てられたファイルを出来る限り復元してくれるとのことです。
TestDiskはパーティション情報の修復らしいのでPhotoRecとは違うのですが、どっちでもファイル復元できること多いしなぁと思っていたりします。
# photorec /dev/loop0
コマンドや対話式で聞かれることも基本的にはTestDiskと同じです。
foremost
今まではイメージからファイルを復元したいときはマウントして、デバイスファイルから復元して〜と頑張っていたのですが、foremostでも出来るみたいです。
$ foremost out.img
Processing: out.img
|foundat=docProps/UT
foundat=ppt/UT
...(中略)...
foundat=_rels/.relsUT
*|
しかもoutputディレクトリ内にきちんとファイル種類ごとにディレクトリ分けて出力してくれるし至れり尽くせりって感じです。root権限も要らないし。
ただ取り出したファイルが上手く開けなかったりすることもあるので、foremostだけ使っておけばOKというわけでもないようです。色々なツールを試すのが良さそうです。
The Sleuth Kit
The Sleuth Kitファイルシステム周りの調査を対象としたコマンド群らしいです。
フォレンジックに有用なツールですね。
いくつか便利そうなものを紹介します。
fls
flsコマンドはsleuthkit内に入っているコマンドの一つです。
ディスクイメージ内のファイルとディレクトリの名前を列挙してくれます。
$ fls out.img
r/r 3: USB (Volume Label Entry)
r/r 5: ._.Trashes
d/d 7: .Trashes
d/d 10: .Spotlight-V100
d/d 12: .fseventsd
r/r * 14: clam.pptx
r/r 16: dance.mp4
v/v 3270243: $MBR
v/v 3270244: $FAT1
v/v 3270245: $FAT2
d/d 3270246: $OrphanFiles
見やすいですね。
icat
inode番号を指定するとそのファイルを出力してくれるようです。
上のfls
で14がclam.pptxと分かったので抜き出してみます。
$ icat out.img 14 > clam.pptx
Autopsy
上述したThe Sleuth KitをGUIで使えるようにしてくれるツールのようです。
LinuxやOS Xでも使えるということで入れようとしたのですが、今のところ他のツールで事足りていたので使っていません。
なので特に書くことないのでいつか使ったら書きます。
http://www.sleuthkit.org/index.php
QRコードが渡された場合
もうForensicsの問題かよく分かりませんが一応書いておきます。
QRコードが頻繁に出されるのって某日本のCTFぐらいな気もしますが。。
ZXing
これは上に書きましたので省略。
strong-qr-decoder
QRコードで一部が読めないみたいな問題のときに使えます。
誤り訂正に失敗しても強引に読み出してくれるので、これ使わないと解けない問題とか結構ありました。
https://github.com/waidotto/strong-qr-decoder
メモリダンプが渡された場合
CTFではメモリのダンプを渡されることもあります。
実際マルウェアの解析などで必要な知識なので良いことだと思います。
Volatility
あまり詳しくないですが、メモリダンプの操作で一番使われている気がします。
メモリダンプを取った時点での
- プロセス一覧
- 通信の接続状況
- プロセスのダンプ
- レジストリ
など色々取得できます。
使い方は参考サイトを見ていただけると。