print("Hello World")

ガジェットとかIT技術とかセキュリティとかctfとかいろいろ

CTF for beginners in tokyo 2016 write up

さて、日付が変わってしまい、なんとなく細かい事が薄れてってますが、覚えてる範囲でwrite upを書いていきたいと思います。

問題一覧と解けた問題はこんな感じ f:id:wh1tecat:20161023085228p:plain

さて、それじゃ解けた問題からwrite upを書いてきます。

Warmup

  • Welcome(10)

回答方法のサンプル。まぁいつも通り書いてあるの入れるだけ

Web

  • Fix it(100)

Webの演習でやったのとほぼおなじで開いたページのレスポンスヘッダにLocationかなんかでページが書いてあるからそれ踏んだら表示されるとかだったはず。

  • Can You login as admin?(200)

正直あんまり覚えてない・・・けど確かIDとパス打ち込むログイン画面があって、問題名どおりにadminでログインできればflagが出たはず。
演習と変わらないSQLi(a' or '1=1)やるだけで良かった気がする・・・かな?

  • 1M4G3 V13W3R(200)

URLを開くとpngまたはjpgをアップロードするとアップロードした画像が表示できるページがあって、そこからflagを探せという問題だった。

画像表示部分が

[/web200-2/view.php?file=hogehoge.png or jpg]

というURLで表示するようになってたので、最初開いた際に表示されるページ

[/web200-2/index.php]

ディレクトリトラバーサル掛けて

[/web200-2/view.php?file=../index.php]

っていう形で表示してあげるとphpのソースが見えて、ソースの中にflagが書いてました。

一通り弄ってて最初は普通に画像アップして表示できたのに途中からなぜか表示できなくなって運営の方に相談とかしてた。
結果的に一回画像表示のURL踏んでれば解ける問題だったので運営の方々をお騒がせしてしまい、申し訳なかったなぁと思いました。

  • Login(300)

Can You login as admin?と同じような感じで、IDとパスを入力してログインするページがある。
けど今回はユーザ名の指定が無い上、演習レベルのSQLiとかは対策されてて、解らないようになってた。
まぁとりあえず適当に入力してログインを押すと、

[/web300/index.php?error=invalid_user.txt]

といった感じにerror~から始まるパラメータがついて、ID入力欄の上に

ユーザー名かパスワードが間違っています。

とメッセージが表示されるのでここから想定するとログインに失敗した時はinvalid_user.txtの中身を表示してるのだろうと想定できた。
んで、index.phpのソース見るとどうやら入力した情報をlogin.phpに投げてるようなので

[/web300/index.php?error=../login.php]

ディレクトリトラバーサルを掛けてあげてソース見ると

<!--?php

error_reporting(0);

function err($file) {
  header('Location: http://' . $_SERVER["HTTP_HOST"] . dirname($_SERVER["REQUEST_URI"]) . '/index.php?error=' . $file);
  exit;
}

if (!isset($_POST['username']) || !isset($_POST['password'])) {
  err('null.txt');
}


$username = $_POST['username'];
$password = $_POST['password'];

$db = new SQLite3('./123b1e28f3cb6d62ab1aa47d1e0e787b.sqlite');
$sql = "SELECT username, password FROM users WHERE username = ('{$username}') AND password = ('{$password}');";
$result = $db--->

って感じにコメントアウトされてるphpのソースが見えて、これを見る感じ、アカウントのdbとして

123b1e28f3cb6d62ab1aa47d1e0e787b.sqlite

を参照してるようなので

[/web300/index.php?error=../123b1e28f3cb6d62ab1aa47d1e0e787b.sqlite]

として、もう一回ディレクトリトラバーサルをかけると

SQLite format 3@  -�

��GotableusersusersCREATE TABLE users (username text, password text)
��(Madmin197d99cc36a89a55c2508d87a5979bbd

という感じにdbの中身がなんとなく見えるので2行目の内容から判断して

ID:admin
Pass:197d99cc36a89a55c2508d87a5979bbd

を入力してログイン成功からのflag入手できた。

ただ、作問者の意図的にはphpのソースからSQLiのエスケープ方法をみて、合わせて欲しかったようなのでそっちのほうがいいかも。

Forensics

  • Find Key1(100)

pcapファイルが渡されるのでWireSharkで追跡→TCPストリーム開いて、ストリームの番号を押してったら14番だけbodyタグの中のflagに中身があったのでそれ入れておわり!

  • Find Key2(200)

1と同じくpcapファイルが渡されるので、これまた同じくWireSharkで追跡・・・するまでもなく、No.8とNo.28でGETでtransfer.zipを取ってくるのに成功しているようなので、
メニューバーからファイル→オブジェクトをエクスポート→HTTPを開くとtransfer.zipをエクスポートできるの保存。
transfer.zipの中に2.pcapファイルがあるので、それをまたまたWireSharkで開くとFTPで何やらやり取りしてるのが見えるので追跡→TCPストリームするとどうやらFTPでsecret.zipを落としてるみたいなので、
ストリームの2を開いて見るとPKから始まるzipのバイナリデータをASCII化したものが見えるので、これをzipとして復元します。
WireSharkでは初期設定だとASCIIで表示するようになってるので、ウィンドウの下のリストからRawで復元を選択して上げるとバイナリデータになるので、これをSave as...からsecret.zipとかとして保存してあげればzipの中にflag.pngがあるので、そこに書いてあるflag入力して終了です。

Binary

  • Plain(100)

感想で書いたとおり、rev、binary問は大苦手なのでとりあえずstrings掛けたらフラグがあった。おわり。

とりあえず解けた問題の解説的にはこんなもんです。
こっからは解けなかったけど終わってから聞いて解った問題とか。ただしBinaryに関しては全く解らんというかこれから見直すので解説無しです。

Misc

  • CountUp Game(200)

1,2,3のいずれかの数字をお互いに言い合い、相手が言った数字+自分の選んだ数字を繰り返して21を踏んだほうが負けというゲームで勝てという問題。
内容的にはncコマンドでサーバーと接続すると向こうが選んだ一つ目の数字が表示されるので、こちらがその数字からいくつ増やすかを入力して送信。すると向こうが同じく・・・  といった感じで進みました。

正直解いてるときは全く解らなかった(´・ω・`)
でも終わってから改めて考えると、このタイプのゲームって(踏んではいけない数(今回は21)-1)=20 から (一度に言える数の最大数(今回は3)+1)=4 を0<答えの間、繰り返し引いていって出た最後の数字(今回だと4)が最大数+1(今回だと4)と同じだった場合、後手が勝ち、それ意外だった場合は先手が勝てるゲームで、
今回は後手で数字も決まってるので絶対に勝てるやつで簡単でしたね・・・めんどくさがらずにちゃんとやるべきだったなと後悔

今回の例だと
踏んではいけない数=21 21-1=20
一度に言える最大数=3 3+1=4
20-4=16
16-4=12
12-4=8
8-4=4 よって最後の数字=4
最後の数字=4,最大数+1=4
よって後手が勝つ
  • てけいさん for ビギナーズ(200)

これは普通にゴリ押しで解いた人が多かったのかなぁ。という印象。 設問者の方が言ってたPythonでDOM取って計算させてPOSTで投げるのは解ってたし技術的には似たようなことをやったことがあるので、正直やろうと思えばできたけど結構前にやったからモジュール名を覚えてなかったのと使い方をすぐに思い出せる自身がなくて解くのを放置してたら忘れててギリギリになって思い出してゴリ押しでやろうとしたけどタイプミスして1問目からやり直しになって吹っ飛んで死にました。 悲しみ。

とりあえず覚えてる限りだとこんな感じです。
CTFの感想としてはホント、時間かかってもとりあえず取れるところから取ってくべき。めんどくさがったら負け!なのかな。と思いました。
まぁでもホント、最近色々あってだいぶ気が死んでたけど、やる気がおきるいいきっかけになったので良かったです。
運営の方々、協賛企業の方々。本当にありがとうございました!

追記 2016/10/24 下書きになってて公開できてなかったorz