Forensics入門（CTF）


社会人になってからCTFにちょくちょく出るようになったのですが、先日出たCSAW CTF 2016であまりにもForensicsが解けなかったので、どんなテクニックがあるか自分のためにまとめておこうと思います。

最早実務のフォレンジックとはかけ離れているような気がしますが、ツールの使い方などを知っておくことは勉強になるのかなと思います。

有識者の方はこんなツールとかもあるよ、とか教えていただけると嬉しいです。
基本的にCSAW CTF 2016の問題で得た知識を基に書いてます。

# 画像ファイルが渡された場合
問題でPNGやJPEGが渡された場合に、下調べとしてまずどんなことをするか知ってる範囲でまとめてみました。

## exiftool
画像のExif情報を	確認します。
画像だけかと思ってましたがmp4とかでもExif見れるのですね。

インストール方法

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

読み込むだけではなくて書き込みなどもできるみたいです。
以下はWatchword（CSAW CTF 2016）の問題です。

```shell-session 
$ 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）の問題です。

```shell-session 
$ 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）の問題です。

```shell-session 
$ 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）の問題です。

```shell-session 
$ sudo apt-get install foremost
$ foremost MrFusion.gpjb
Processing: MrFusion.gpjb
|*|
```
下で書くようにイメージファイルなどにも使えます。
ただこの問題ではビットマップが上手く取り出せていなかったので、foremostだけでは解けないようです。

## Stepic
Steganography用のツールです。
http://domnit.org/stepic/doc/

PNGなどの画像に文字やファイルを隠したり出来ます。
PNGにJPEGを隠したりとかも出来るようです。

```shell-session
$ 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/

パスワードなどをつけてファイルを隠すことが出来ます。

```console
$ 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に隠されていました。

```shell-session 
$ 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の間に入ってますね。
常に変な値が入っていないかを見るのが大事ですね。

###参考
- https://github.com/73696e65/ctf-notes/blob/master/2016-ctf.csaw.io/forensics-100-evidence_zip.md

## PkCrack
zipに対する既知平文攻撃を実行するツールです。
色々なCTFで出題されている気がします。
詳しくは1つ目の参考ページを見て欲しいですが、暗号化前の平文の一部が分かっている場合に、それを手掛かりに暗号文を復号する攻撃方法のことです。

```console
$ 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）の問題です。

```shell-session 
# mount out.img /mnt/test/
# ls /mnt/test
dance.mp4
```

マウントしたら中にMP4ファイルが入っていました。


## fdisk
特定のパーティションをマウントしたい場合もあるかと思います。
その場合はfdiskで調べてからoffsetをmountコマンドで指定すれば良いです。
マウントしたいパーティションのstartとなっている数値にセクタサイズ（通常512）をかけた数がoffsetとなるようです。

```shell-session 
# fdisk -lu out.img
# mount -o loop,offset=[start*512] out.img /mnt/test
```


### 参考
- https://webcache.googleusercontent.com/search?q=cache:5SkLGMJO_zYJ:https://fish.minidns.net/projects/a-painter-and-a-black-cat/wiki/CTF_Forensic+&cd=3&hl=ja&ct=clnk&gl=jp


## TestDisk
パーティション情報を修復するソフトウェアです。
削除されたファイルを復元してくれるツールかと思っていたのですが、パーティション情報が壊れて取り出せなくなっていたデータをパーティション情報の修復によりアクセスできるようにしてくれているみたいです。

```shell-session 
# 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とは違うのですが、どっちでもファイル復元できること多いしなぁと思っていたりします。

```console
# photorec /dev/loop0
```
コマンドや対話式で聞かれることも基本的にはTestDiskと同じです。



## foremost
今まではイメージからファイルを復元したいときはマウントして、デバイスファイルから復元して〜と頑張っていたのですが、foremostでも出来るみたいです。

```shell-session 
$ 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内に入っているコマンドの一つです。
ディスクイメージ内のファイルとディレクトリの名前を列挙してくれます。

```shell-session
$ 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と分かったので抜き出してみます。

```shell-session
$ 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
あまり詳しくないですが、メモリダンプの操作で一番使われている気がします。
メモリダンプを取った時点での

- プロセス一覧
- 通信の接続状況
- プロセスのダンプ
- レジストリ

など色々取得できます。
使い方は参考サイトを見ていただけると。

### 参考
- http://www.volatilityfoundation.org/
- https://cyberarms.wordpress.com/2011/11/04/memory-forensics-how-to-pull-passwords-from-a-memory-dump/
- http://dev.classmethod.jp/study_meeting/volatility-framework/