読者です 読者をやめる 読者になる 読者になる

blog.syfm

徒然なるままに考えていることなどを書いていくブログ

Google Capture The Flag Write-up

4/30の午前2時から5/2の午前2時までの48時間でGoogle Capture The Flagが開催されていました。
今回はチームwabisabiのメンバーとして参加しました。全チーム中では318/2403、0点のチームを除いた中では318/911でした。
解けた問題は以下の4問です。

  • In Recorded Conversation
  • Spotted Quoll
  • Ernst Echidna
  • Purple Wombats

In Recorded Conversation(Forensics / 25 points)

IRCのパケットが配布される。
WiresharkTCPストリームで見てみると、
f:id:ktr_0731:20160502032128p:plain 会話の最後にそれぞれの人が順番にflagの文字列を喋っているのでそれを繋げる。

CTF{some_leaks_are_good_leaks_}

Spotted Quoll(Web / 50 points)

ゾンビに関する研究をまとめたブログらしい。 f:id:ktr_0731:20160502032637p:plain Adminボタンを押してみるとURLが`

https://spotted-quoll.ctfcompetition.com/#err=user_not_found

となる。
HTMLを覗いてみるとiframeがあって、getCookieでCookieを生成していることが分かる。

f:id:ktr_0731:20160502033053p:plain

Cookieを見ると文字の羅列が値になっているので、これをbase64でデコードしてみたらビンゴだった。

(dp1
S'python'
p2
S'pickles'
p3
sS'subtle'
p4
S'hint'
p5
sS'user'
p6
Ns.

全くわからなかったのでGoogle先生に助けてもらい、PythonのPickle.dumpというメソッドの出力であることが分かった。
これを元に以下のようなコードを書いて、出力をbase64エンコードした。

import pickle

f = open('dump.txt', 'w')
pickle.dump({'python': 'pickles', 'subtle': 'hint', 'user': 'admin'}, f)
f.close()

エンコードした文字列でCookieを改竄してAdminにアクセスするとflagが手に入った。

f:id:ktr_0731:20160502034234p:plain

Ernst Echidna(Web / 50 points)

サイトに登録してくれと言われる。

f:id:ktr_0731:20160502034506p:plain

問題文にrobots.txtがヒントだよって書いてあったので見てみると/adminが記載されていた。試しにアクセスしてみるも管理者じゃないから見れないと言われる。
ユーザ登録をするとCookieが生成された。また、色々試していると、ユーザ登録の際にPasswordを未記入にしてもエラーにならないことに気がついた。
それにもかかわらずCookieは更新されているのでユーザ名だけで認証されているのかなと思い、ユーザ名をaとした場合のCookieの値をググってみる。
するとmd5のハッシュであることが判明。adminという文字列をmd5でハッシュ化してCookieを改竄、/adminにアクセスしたらflagが手に入った。

f:id:ktr_0731:20160502035110p:plain

Purple Wombats(Web / 100 points)

f:id:ktr_0731:20160502035250p:plain

CTF開催しててWebサイトのペネトレーションテストをやってる暇がないから代わりにやっておいて、ということらしい。 HTMLを見てみるとコメントがあった。

f:id:ktr_0731:20160502035504p:plain

GitHubのこのリポジトリにアクセスしてみると、このWebサイトのソースと思われるファイル群があったのでcloneしてきた。
Pythonで書かれていて、簡単に見る感じだとGoogle App Engineを利用していることがわかった。

f:id:ktr_0731:20160502035849p:plain

Pythonはほとんどわからないけど、これを見る限りメンテナンス中だからsessionを作成せずに問答無用でreturnさせている感じ。
もう少しじっくり見ていくと、

f:id:ktr_0731:20160502040115p:plain

secret_keyが直書きされていた。 ググってみるとGoogle App Engineはこれを元にsessionとかを暗号化(?)しているらしい。
つまりこれを利用すればこのWebサイトで利用できるsessionを自由に作れるということなので、やってみた。
とはいえ、Google App Engineを使った時は一度もなかったので環境構築から始まって、結構時間を取られた。

先ほど見つけたメンテナンス用のreturn文をコメントアウトしてlocalhostでWebサイトにアクセスし、ユーザ登録をする。
するとCookieが生成されたのでそれで実際のWebサイトの方のCookieを作り、/flagsにアクセスすると認証されてflagが手に入った。

f:id:ktr_0731:20160502040848p:plain

感想

前回参加したPlaidCTFでは問題を1問しか解けなかったけど、今回はかなり調子が良くて今までで一番問題を解けた。
ただ、解けそうな分野が極端に限られているのでもう少し他の分野にも手を出したい…