拾い物のコンパス

まともに書いたメモ

csawctf 2016 writeup(forensics)

書くことがないから,最近参加したCSAWCTF 2016のWriteupをメモしておく.分野はforensics.ExploitやWebに比べると日本では人気がない印象があるのが残念.

evidence

evidence.zipという壊れたZIPファイルが与えられる.

$ unzip -l evidence.zip
Archive:  evidence.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
1384576462406025012  1980-10-01 06:01   out/rxo802ayx4
1384576462406025012  1980-10-01 06:01   out/zhatnf5maf
1384576462406025012  1980-10-01 06:01   out/50lshu1ue6
1384576462406025012  1980-10-01 06:01   out/14o803swdq
1384576462406025012  1980-10-01 06:01   out/nppjdd2wdg
1384576462406025012  1980-10-01 06:01   out/e9ydsxwetg
1384576462406025012  1980-10-01 06:01   out/0eetjrxpdm
1384576462406025012  1980-10-01 06:01   out/otuj3jrezt
1384576462406025012  1980-10-01 06:01   out/m70ohrycax
1384576462406025012  1980-10-01 06:01   out/mpi3z4x5jt
1384576462406025012  1980-10-01 06:01   out/meoflsxv4v
1384576462406025012  1980-10-01 06:01   out/8y10tp04b2
1384576462406025012  1980-10-01 06:01   out/eui6ltoijl
---------                     -------
17999494011278325156                     13 files
以下,どうでも良い情報
1384576462406025012  -> 0x133700f4ee13ff34
17999494011278325156 -> 0xf9cb0c701703f5a4
全く意味のない数字のようだ.

作成日時も特に情報は見当たらない.
とりあえず
$ zip -FF evidence.zip --output fix.zip
で修復してみる.先に言っておく,これやった人はさようなら.
この後,
- unzip
- ファイル名がハッシュになっているかと検索
- base64で復号
- とりあえず,文字列を反対にしてみる
- 適当にXORしてみる
- コメントを期待して,unzip -z
- ..etc
をやってみたが,どうにも出てこない. 疲れて,基本に戻ってみようとZIP情報の詳細を見てみる.

$ unzip -vv ./evidence.zip
Archive:  ./evidence.zip
 Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
1384576462406025012  Unk:169     908 100% 1980-10-01 06:01 666c6167  out/rxo802ayx4
1384576462406025012  Unk:047     294 100% 1980-10-01 06:01 7b746833  out/zhatnf5maf
1384576462406025012  Unk:158     377 100% 1980-10-01 06:01 5f766931  out/50lshu1ue6
1384576462406025012  Unk:231     552 100% 1980-10-01 06:01 3169346e  out/14o803swdq
1384576462406025012  Unk:223     249 100% 1980-10-01 06:01 5f77335f  out/nppjdd2wdg
1384576462406025012  Unk:238     503 100% 1980-10-01 06:01 6e333364  out/e9ydsxwetg
1384576462406025012  Unk:045     150 100% 1980-10-01 06:01 5f236672  out/0eetjrxpdm
1384576462406025012  Unk:200     273 100% 1980-10-01 06:01 65656c65  out/otuj3jrezt
1384576462406025012  Unk:099     684 100% 1980-10-01 06:01 6666656e  out/m70ohrycax
1384576462406025012  Unk:205     112 100% 1980-10-01 06:01 7daaaaaa  out/mpi3z4x5jt
1384576462406025012  Unk:174     287 100% 1980-10-01 06:01 aaaaaaaa  out/meoflsxv4v
1384576462406025012  Unk:193     172 100% 1980-10-01 06:01 aaaaaaaa  out/8y10tp04b2
1384576462406025012  Unk:199     485 100% 1980-10-01 06:01 aaaaaaaa  out/eui6ltoijl
--------          -------  ---                            -------
17999494011278325156             5046 100%                            13 files

ああ,なるほどと気づいたときには笑った.こんなやり方もあるのか.CRCがASCIIだ. 666c61677b7468335f7669313169346e5f77335f6e3333645f23667265656c656666656e7d
-> flag{th3_vi11i4n_w3_n33d#freeleffen}
flag: flag{th3_vi11i4n_w3_n33d
#freeleffen}
復元して頑張っても無駄だという問題.よくCRCにねじこんだな・・・.

watchword

Canned epic hidden snek flavored cookies have shy gorilla.  
Hint: http://domnit.org/stepic/doc/
Hint: It's not base64, but it uses the Python 3 base64 module
password = password

問題文は知らない単語が多くて理解を投げた.ゴリラが何かしたらしい.
ヒントに沿って,http://domnit.org/stepic/doc/から,stepic-0.3.tar.gzをダウンロード.

$ tar xvf ./stepic-0.3.tar.gz
$ cd stepic-0.3
$ sudo ./setup.py install
動作するためにImageが必要だったため,
$ sudo pip install Image
Image関連でエラーを吐くため,
$ sudo vim /usr/bin/stepic
[-] import Image
[+] from PIL import Image

これで準備は完了.
動画ファイルをダンプしてみると,<data...>というbase64があった.
"aHR0cDovL3N0ZWdoaWRlLnNvdXJjZWZvcmdlLm5ldC8="
-> http://steghide.sourceforge.net/base64
どうやら,steghideが一枚噛んでいるようだ.
配られた動画ファイルを問答無用でforemost.動画は結局見なかった.
$ foremost powpow.mp4
PNGファイルが出てきた.
f:id:poppycompass:20160927151138p:plain
8月にひっそりと日本での販売が終了したオレオの写真.foremostしても何も出てこない.
また,PNGにはsteghideが使えない.よって,stepicの出番.
$ stepic -d -i output/png/00001069.png -o out.jpg --debug
out.jpgというJPG画像を取得する.画像は親子の微笑ましい会話.
f:id:poppycompass:20160927135920j:plain
以下,文章の訳.間違っていたら指摘してください.

> ねえ,お母さん.どうしていとこの名前はダイヤモンドなの?
< おばさんが好きだからよ
> 僕の名前は?
< 私が好きなゴリラよ,Harambe

Harambeは先日子供を助けるために仕方なく射殺されたゴリラの名前.
Harambeはまだ良いが,おばさん,いくら好きでもダイヤモンドはキラキラしすぎじゃないかな・・・
< 閑話休題 >
JPGファイルはsteghideでいける.パスワードが要求されるが,これは問題文で与えられたものを使う.

$ steghide extract -sf ./out.jpg
Enter passphrase:password
wrote extracted data to "base64.txt"
$ cat ./base64.txt
W^7?+dsk&3VRB_4W^-?2X=QYIEFgDfAYpQ4AZBT9VQg%9AZBu9Wh@|fWgua4Wgup0ZeeU}c_3kTVQXa}eE

base64.txtが得られる.文字列の途中に=が入っていたりと,問題通り普通のbase64ではないようだ.
ヒントにpython3のbase64のモジュールを使っているとあったため,
http://docs.python.jp/3/library/base64.html#module-base64
を参考に一通り試していった.結局,base85でエンコードされた文字列だった.

# decrypt.py, python3で実行推奨
# coding: utf-8

import base64
print(base64.b85decode("W^7?+dsk&3VRB_4W^-?2X=QYIEFgDfAYpQ4AZBT9VQg%9AZBu9Wh@|fWgua4Wgup0ZeeU}c_3kTVQXa}eE"))
$ python3 decrypt.py
b'flag{We are fsociety, we are finally free, we are finally awake!}'

base85はASCII内でprintableな文字を全部使って限界に挑戦した符号化のようだ.データ量の膨張が6/4(1.5倍)のbase64に対し,base85は5/4(1.25倍)と,効率が良い.現在ではgitで使われているらしい.

最後に

forensicsはPwnやWebのようにきらびやかなハッカー・クラッカーっぽいものを感じにくい分野だが,解析のためにコマンドの細かいオプションを知ることができるといった面がある.
セキュリティをやっている理由が,色んなことを知りたいからという自分にとってはやってて楽しい分野.
もう少しくらいなら闇が深くても構わない.
ふと思ったが,IT業界って光という単語をあまり使わない気がする.闇の言語(C++とか)は存在するが,光の言語は聞いたことがない(Haskellとか純粋なものがある).その内出るかもしれないが,キャッチコピーが胡散臭すぎて使う気が起きなさそうだ.
そう思ってしまう辺り,IT業界に毒されているのだろう.

参考文献

Stepic - Python image steganography

19.6. base64 — Base16, Base32, Base64, Base85 データの符号化 — Python 3.5.2 ドキュメント

base85について - StoryEdit 開発日誌