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ファイルが出てきた.
8月にひっそりと日本での販売が終了したオレオの写真.foremost
しても何も出てこない.
また,PNGにはsteghide
が使えない.よって,stepicの出番.
$ stepic -d -i output/png/00001069.png -o out.jpg --debug
out.jpg
というJPG画像を取得する.画像は親子の微笑ましい会話.
以下,文章の訳.間違っていたら指摘してください.
> ねえ,お母さん.どうしていとこの名前はダイヤモンドなの? < おばさんが好きだからよ > 僕の名前は? < 私が好きなゴリラよ,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 ドキュメント