tokyo western ctf 2018 warmup系 復習(若干WriteUp)
たまたま当日見つけてとりあえず参加してみたctfでした。もちろんビギナーズ以降何もしていなかったので、解けるはずもなく、、simpleAuthだけはなんとかって感じで笑
どちらかというと、参加目的はこれから行う復習のためって感じです。他のすごい方のwriteup見て勉強します。
SimpleAuth
問題文には別サイトへ飛ばすURLが貼ってあり、そこには以下のソースコード
<?php require_once 'flag.php'; if (!empty($_SERVER['QUERY_STRING'])) { $query = $_SERVER['QUERY_STRING']; $res = parse_str($query); if (!empty($res['action'])){ $action = $res['action']; } } if ($action === 'auth') { if (!empty($res['user'])) { $user = $res['user']; } if (!empty($res['pass'])) { $pass = $res['pass']; } if (!empty($user) && !empty($pass)) { $hashed_password = hash('md5', $user.$pass); } if (!empty($hashed_password) && $hashed_password === 'c019f6e5cd8aa0bbbcc6e994a54c757e') { echo $flag; } else { echo 'fail :('; } } else { highlight_file(__FILE__); }
僕は最初md5のハッシュを総当たりして、$userと$passを求めるのかと思ってプログラム組んだのですが、、笑 高速なプログラムとか組めなくて、めちゃ時間かかるなぁと思っていたのですが、これ、parse_str()を行うと既存の変数は全部上書きされるというやつでした。
なのでurlの末尾に変更加えます。
http://simpleauth.chal.ctf.westerns.tokyo/?action=auth&hashed_password=c019f6e5cd8aa0bbbcc6e994a54c757e
ちなみに、これ表示の上ではフラグも書き換えられちゃいますね。
mondai.zip
zipのなかに鍵付きのzipが入っていてみたいな、マトリョーシカみたいなやつ。最初のパスワードはファイルの名前通りy0k0s0だったのですが、最初これやっても通らなかったと勘違いして、0の部分が隠されているのかなと謎の思考を展開。0の部分総当たりするプログラム組んでみたら帰ってきたパスワードがy0k0s0..
ここからは他の方のwriteup参照です。。一番下に参考リンク貼りますので、基本的にそちらみた方がわかりやすいです。
次はpcapngファイルの中身を見るらしいです。Dataにa~zの文字列が並んでいて、それぞれ微妙に長さが違います。これらのData長をASCIIで読み直してあげるとパスワードになるそうです。
87 W 101 e 49 1 99 c 111 0 109 m 101 e
すると、次はlist.txtという奴が出てきました。
よはlist.txtのなかにパスワードが入っているよとのことらしい。全部答えみて写してるだけじゃ何にもならないので、ささっとパスワードをリストから総当たりするコードをpythonで作りました。
結果的にパスワードは
eVjbtTpvkU
まだまだ出てきます。
ファイル名がmd5っぽいので以下のサイトで復号できました。
http://www.jp.freemd5.com/sha1-decryption.php#.W4zR94vo3OR
happyhappyhappy
こう書かれたテキストがあったので、最後は上にあげたコードをいじって総当たりするプログラム書きました。(終了処理書いてないから自分で止めてね.なんと無責任な)
パスワードは
to
最後の記述には以下のようあった。
Congratulation! You got my secret! Please replace as follows: (1) = first password (2) = second password (3) = third password ... TWCTF{(2)_(5)_(1)_(4)_(3)}
TWCTF{We1come_to_y0k0s0_happyhappyhappy_eVjbtTpvkU}
scs7
暗号化されたフラグが投げられるので、それを元にフラグを推測する。1回の接続で100回の試行が可能となっており、投げた文字がその暗号化パターンによって暗号化されて帰ってくる。接続をし直すと、暗号パターンは変化するがもう一度100回の試行が可能となる。
文字を適当に打って行くといくつかパターンが見つかる。
・投げた文字によって暗号は影響を受ける
・暗号パターンは一文字前の文字に影響されて変化する
・暗号パターンは文字列全体の長さによって変化する
以上より、ある程度の総当たり攻撃で解読可能になりそう。
・はじめの文字はWTCTF{ 末尾は}
・暗号化されたフラグと暗号文字長を利用して最初の部分が一致する長さを考える。フラグそのものは47文字であることがわかる
・毎回47文字の文字列を生成し、左端から順番に投げられたフラグと一致する文字を探す。
・一度の接続では解けないため、一文字ずつ見つけて行くつもりでプログラムを組む。
・文字を増やしていって、暗号化された文字の一致する長さが前回よりも長いものを正解とする
・トライするたびに複数の候補が上がるが、例のサイトさんの通り、二文字ずつトライすることで回避する
以上を踏まえてとりあえず手動のプログラムをざっと組んでみた。正解の可能性がある二文字列が画面に表示されるので、それの一文字目を正解候補として、flag_find変数に手入力して行く。複数候補がある場合、とりあえず一つを選んで、次のステップに進み、一致長が増えない場合それは不正解として行く
作ってみて、もっといい回答手段がありそうと思い、別のWriteUpを拝見。
暗号文は、メッセージをHexエンコードしたものを59進法に変換したものである。 ただし、59進法で使われる 0-58 をどの記号に割り当てるかは毎回バラバラである。 したがって、はじめに 0-58 がどの記号に対応するか対応表を作ってしまえば、暗号化された FLAG を復号することができる。具体的には chr(59) から chr(117) までを試して、暗号文の最後の桁の文字を見ると、それが 0-58 の数字に対応する。
参考:
TokyoWesterns CTF 4th 2018 Write-up - Qiita
これでわかるんですね。私は多分気づかなかった笑 今度base59のアルゴリズムは組みながら勉強しようかなとは思いました。ちょうど上のサイトさんのコードは参考になりそうですね。後、余談ですが、sendの時に後ろに'¥n'つけるの忘れてたり、つけてもバックスペースじゃなかったから進まなかったりと、色々時間かけちゃったのは反省。毎回これやる。。
dec dec dec
あんまりまだ使い方わかってないgdb-pedaで頑張ろうとしたけど、実行がうまく追えませんでした。WriteUp見てたらradare2というものを使っていたので、入れて見たら、VVモードがとても見やすかったのですが、動的解析をしながらバイナリを追おうとするとどうしても肝心の部分をおってくれない。gdb-pedaと同じ部分が実行される。これどうしたらいいんですかね。初心者に教えてください。
使えれば良いやradare2(静的解析編) - 拾い物のコンパス
とりあえず、流れはつかめました。が、自分の技量だとデバッグできなかったので、今回は諦めます。。勉強して再チャレンジします。
以下はwriteup先より
@25-Q44E233=,>E-M34=,,$LS5VEQ45)M2S-),7-$/3T
がコマンドライン引数と比較される文字ようなので、プログラム内で実行されてる逆順にデコードをかけるようです。自分で解析できなかったので、詳しくは書かないです。。
load
全く手がつかなかったので誰かのWriteUpが上がったらそれみて勉強します。
まとめ
基本がわかってないです。もともとctfの勉強は全くしてないのですが、warm upぐらいはとりあえず解けるようにはなりたいので。。せめて解析ソフトの使い方ぐらいはわかるようにしておきます。次までに!!きっと。
参考サイト(もはやお手本)
hiziriai.hatenablog.com
qiita.com
https://github.com/ccowmu/ctf_2018/tree/master/writeups/TokyoCTF2018/dec-dec-decgithub.com