RITSEC CTF Writeup~後半~

# はじめに

後半戦です. 正直なところ, 時間を確保できればもう少し解けたと思うので他のWriteupを読んで精進します.

簡単なWiresharkの使い方なども載せているので参考になれば幸いです.

必要なファイルなどは[GitHub](https://github.com/taiyaki8926/RITSEC)にあげております.


## Take it to the Cleaners(Foren, 100pt)

> People hide things in images all the time! See if you can find what the artist forgot to take out in this one!

`.png`拡張子の画像を渡されます. 画像を渡された時は[Forensics入門（CTF）](https://qiita.com/knqyf263/items/6ebf06e27be7c48aab2e)をもとに, まずはひたすら下準備をしていきます. まずはexiftoolから. 

```
# インストール方法は, Macなら
$ brew install exiftool
# Linuxなら(うろ覚えですが)
$ sudo apt install libimage-exiftool-perl

# いざ実行
$ exiftool ritsec_logo2.png 
ExifTool Version Number         : 11.71
File Name                       : ritsec_logo2.png
Directory                       : .

…

User Comment                    : RVZHRlJQe1NCRVJBRlZQRl9TTlZZRl9KQkFHX1VSWUNfTEJIX1VSRVJ9

…

```

いきなり怪しすぎる1文を発見. さて, 困ったら前半にも登場した[CyberChef](https://gchq.github.io/CyberChef/)を利用します.

左のOperationからMagicを選択し, Recipeにドラッグ&ドロップ. すると
EVGFRP{SBERAFVPF_SNVYF_JBAG_URYC_LBH_URER}
が得られます. Base64エンコードのようです

あとは察しのいい人はお気づきでしょう. ROT13を使ってみます. このサイトからROT13を探してドラッグ&ドロップしてもいいですし, [ここ](https://rot13.com)でも構いません.

`RITSEC{FORENSICS_FAILS_WONT_HELP_YOU_HERE}`


## Shiny(Crypto, 100pt)
> .‡8]5);483‡5;
> You must wrap the flag in RITSEC{ }

これと, `.jfif`ファイルが渡されます. もしもMacOSユーザでこのファイルが開けない, なんて人がいたら, Finderで拡張子を`.jpg`に変換したらちゃんと見られます. 他のOSでも, `.jfif`を`.jpg`に変換してくれるサイトはある[^1]ので, 万が一見られない場合はそこに投げるといいでしょう. 

さて, 例の[CyberChef](https://gchq.github.io/CyberChef/)でMagicを利用してみます.
…特にいい情報は得られません. 

画像の`Gold-bug.jfif`は何を意味するのでしょうか？'gold bug'でググってみます. 
ミステリ好きの人はすぐ気付くでしょう. エドガー・アラン・ポー先生の黄金虫で用いられている暗号のようです[^2]. 

[Wikipedia](https://ja.wikipedia.org/wiki/黄金虫)を元に, 上の文字列を解読していきます.
…が, 唯一, `]`の文字だけが解読できません. 代わりに？を用いると
`poe?asthegoat`
となります. 'Poe as the goat'と解釈するなら, ？はコロンやアンダーバーのような気がしますが, いずれも入力しても正解とはなりません.

Wikipediaの英語版の方のページを見ても, それらしい情報は得られません.
思い切って, Wikipediaから離れて'the gold bug cryptogram'でググってみます. おそらく'the gold bug 'あたりで予測変換で出てくるはずです.

「[The Gold Bug Cryptogram by Robert Giordano - PoeStories.com](https://poestories.com/discuss/the-gold-bug-cryptogram)」
を見るとちょうどヒットしました. どうやら`]`は`w`に対応したようです. 'Poe was the goat'という訳ですね.

`RITSEC{poewasthegoat}`


## findme(Foren, 320pt)

`.pcap`ファイルが渡されます. この拡張子が渡されたらほぼ確実に[Wireshark](https://www.wireshark.org)を使います. これも経験ですね…. おそらく1年前の私なら無理でした. 

インストールなどはここでは割愛します. そんなに難しくないと思います.

さて, Wiresharkで開くとパケットが48個. 多くないので全部調べても問題なさそうです.

まずは, Statistics → IPv4 Statistics → IP Protocol Typesで統計をみてみます.

(なお, 今回の問題とは一切関係ない余談ですが, ここでIP Protocol TypesではなくSource and Destination Addressesを選択し, 1つだけ特異なIPアドレスとの通信がおこなわれている → 怪しいのでは？といった絞り込みもできたりします. )

![スクリーンショット 2019-11-18 22.58.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334637/a5d47c8a-cf59-cc6e-d30b-1b55957a61a1.png)

すると, TCPが44個, UDPが4個という統計に. 
まずはUDPから追跡してみましょう.
31パケット目を右クリックしてFollow → UDP Streamを選択.

![スクリーンショット 2019-11-18 23.02.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334637/2bba398b-76b7-4ff2-42bc-36c05b34fa4b.png)

特に有益な情報はありません. パケット一覧にもどると, 48個あったパケットが1個しか表示されていないと思います.
これは上の緑の部分の`udp.stream eq 0`により勝手にフィルタがかかっているせいです.
一覧に戻る時は, その右にある×ボタンをクリックします.
32〜34パケット目も検証したらわかりますが, UDPのパケットにflagはなさそうです.

では次にTCPを見ていきます. UDPと同様, 1〜30番のどれかのパケットを右クリックしてFollow → TCP Streamを選択.

![スクリーンショット 2019-11-18 23.11.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334637/919a3bfb-1cd8-a647-dc32-72374a6972be.png)

このような画面が出てきました. 一旦置いておいて, 違う通信も見てみましょう.
上の緑の部分は`tcp.stream eq 0`となっていると思います. これを`tcp.stream eq 1`に変えてみましょう. 35〜43パケット目のTCPが登場します. これら(どれでも良い)を再び追跡すると, 以下のようになります.
(ちなみに, `tcp.stream eq 2`と`tcp.stream eq 3`には何も有力な情報がありません. そして, `tcp.stream eq 4`以降はそもそもヒットしませんので追跡できません.)

![スクリーンショット 2019-11-18 23.14.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334637/21bbd30c-658a-8f63-3710-6c59b59a0629.png)

いかにも怪しげな文字列が出てきました.
勘のいい人は(というか慣れてくると), 赤い字の末尾に`=`があるのでBase64だとすぐ見抜けます.
もちろん, 例によって[CyberChef](https://gchq.github.io/CyberChef/)でMagicを使って解析してもOKです.

赤い字の方はYouTubeのリンクです. 曲名はNever Gonna Give You Up.
これはCTFではいわゆるハズレとして置かれる, ちょっとしたお遊びです(ここにたどり着いたら「してやられた！」くらいの気持ちで切り替えましょう).

本題は青い方です. これをCyberChefに投げてもflag...と表示されるだけです[^3].
さらにいうと, `File type: application/x-tar (tar)`との表示も.
つまり, これをBase64でデコードしてもflagが文字列そのものとして現れるわけではなく, `.tar`のバイナリデータが登場すると考えるべきでしょう.

ここからはPythonを使います. まずは空の`.tar`ファイルを作成しておきます.

```
$ touch flag.tar
```

さて, ここに先ほどのデコード結果を書き込みましょう.

```Python3
import base64

s = 'H4sIAFSZx10AA+3OMQuCQBiH8Zv9FPcFgrvUcw2kIWgydzG1EkQPvZui757S0lSTRPD8lmd43+F/6cqrWJmaGRMt1Ums3vtitkKHsdGJDqNtKJSeGwup1h628JMrRymFP/ve+Q9/X+5/Kjvkp316t1Vpp0KNReuKuq17V9x21jb9IwjSPDtuKukGWXXD1AS/XgwAAAAAAAAAAAAAAAAAWDwB38XEewAoAAA='

s = base64.b64decode(s)

# バイナリを書き込むので'w'ではなく'wb'であることに注意
with open('flag.tar', mode='wb') as f:
    f.write(s)

f.close()
```

さて, これを実行してできたファイルを見てみましょう.

```
$ file flag.tar
flag.tar: gzip compressed data, last modified: Sun Nov 10 05:00:04 2019, from Unix, original size 10240
```

どうやら`.tar`じゃなくて`.gz`っぽいですね. 拡張子を変えておきましょう.

```
$ mv flag.tar flag.gz
$ gzip -d flag.gz
```
解凍された`flag`を見てみます.

```
$ file flag
flag: POSIX tar archive (GNU)
```

今度こそ`.tar`ファイルですね. 拡張子を変更して解凍します.

```
$ mv flag flag.tar
$ tar -xzvf flag.tar
x flag
$ file flag
flag: ASCII text
$ cat flag
RITSEC{pcaps_0r_it_didnt_h@ppen}

CTRL-c to close
```

出ました.

`RITSEC{pcaps_0r_it_didnt_h@ppen}`


# 終わりに

ここまで読んでくださりありがとうございます.
次はパスワードクラック用ツールであるJohn the Ripperの使い方をマスターして記事にでもできたらと思っている次第です.









[^1]: [ここ](https://convertio.co/ja/jfif-jpeg/)など.
[^2]: 暗号を使ったミステリだとコナン・ドイル先生の[踊る人形](https://ja.wikipedia.org/wiki/踊る人形)なども有名ではないでしょうか？
[^3]: 何も表示されない場合は, おそらく途中で改行が入ってます. 除いてみてください.