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

blog.syfm

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

Aizu CTF #2 に参加してきました

先週土曜日に 会津Webセキュリティ勉強会 a.k.a Aizu CTF #2 に初心者 CTF チーム(仮)の wabisabi のバイナリ担当、暗号担当と共に参加してきました。
見て分かる通り、今回で 2 回目の開催らしいですが自分は初参加でした。

前半は Web セキュリティの基礎知識についての講義、後半は実践ということで Attack & Defense 型の CTF が行われました。
Web 講義については、SQLi や XSSCSRF などの基礎を解説していました。個人的には Time based SQLi や SSRF を初めて知ったので勉強になりました。
CTF については、なんと個人戦でした。(初めてなのに個人戦だったので不安になりました)
各チームにサーバが与えられていて、Web 特化の A&D だったので 80 番以外のポートへ攻撃することはできないという形式です。
それぞれの Web アプリケーションを稼働させながら脆弱な実装を探して攻撃、防御する…という流れでした。

とりあえず攻撃は厳しそうだから…という理由で、まずはソースコードリーディングと防御に回ることにしました。最重要な部分はデータベースと config ファイルだろう、と踏んで、MySQL のパスワードを変更し、config ファイルを修正しました。

#!/bin/usr/env python3


MYSQL_DATABASE_USER = 'root'
MYSQL_DATABASE_DB = 'aizuctf2'
MYSQL_DATABASE_PASSWORD = 'UfndLfo9'
MYSQL_DATABASE_HOST = 'localhost'
SECRET_KEY = 'secret_key'
SESSION_COOKIE_HTTPONLY=False

#APP_HOST = '0.0.0.0'
APP_HOST = '127.0.0.1'
APP_PORT = 8888
DEBUG = True

SALT = 'erutaso'

MySQL のパスワードは変更後ですが、それ以外はこんな感じでした。なので MySQL のパスワードと SECRET_KEY を変更し、SESSION_COOKIE_HTTPONLYTrue にしました。
ついでに salt がえるたそ~だったので、

SALT = 'makisekurisu'

に変更しました。 少しソースを読んでみると、Session にユーザ名とかパスワード、管理者権限なんかをそのまま入れている感じだったので、SECRET_KEY をデフォルトにしているチームのアプリケーションならば、Cookie 改竄してなりすませるのでは…と考えました。
そこで、一旦 SECRET_KEY をデフォルトに戻して自分のアプリケーションに管理者としてログインし、その Cookie を取得しました。
他のチームのアプリケーションに適当なアカウントでログインした後、その Cookie を改竄してみると期待通り管理者と見なされてたので、心で「シャァァッ!!!」と叫びました。
また、少し時間が経つと、SLA のテストとしてユーザ登録や投稿が自動で行われるのですが、その一部に FLAG が紛れていて管理者のみ見れるような状態だったので、この方法でほぼ全員の FLAG を持ってくることができました。 手動はめんどくさいな…と思い、ごく簡単なシェルスクリプトを書いたのですが、一部のチームが XSS に襲われていて、無限ループに陥っているアプリケーションへのアクセスを回避するいい方法が思い浮かばなくて半自動、半手動でスクリプトをうごかしていました。シェルスクリプト力がほしい…。
意外と結構なチームが SECRET_KEY を最後まで変更していなかったので、定期的に FLAG を収集できるような感じでした。

Defense の方は、ソースコードを改修しようと思っていたのですが、その変更によって気づかぬうちにアプリケーションがエラーを吐いて SLA が激減したことが度々合ったので、とりあえず SLA を保持するかということで保守(?)に回りました。
サーバに Git が入ってたので、アプリケーションをリポジトリ化してバックアップみたいに使っていたら結構はかどりました。

途中までは SLA も順調に稼げていていい感じだったのですが、後半くらいになぜか画像が表示されない(というかデータベースからレコードを取得できない)という謎のエラーに悩まされて、解決を試みていましたが結局わからずじまい…。
結果として、SLA を下げてしまい、最終的な順位は6位でした。
f:id:ktr_0731:20161003221346p:plain
攻撃と防御を同時にやろうとすると混乱してどっちも死ぬので、その切替が大変でした。
初めての A&D で、どこから手を付けていいかわからないような感じでしたが、それなりに振る舞えたので良かったです。
運営の皆様、楽しい場所を提供してくださり、ありがとうございました!