SECCON Begineers CTF 2020にMIS.Wとして参加、主にリモートお茶汲みをしていました。
Scoreboard見る限り、スコアボードに載ってるチーム(登録して問題を1問以上解いたチーム)としては、1009チームあったみたいです。結果としては、700点獲得で144位でした。
Writeupとしては上位陣のものを参照してもらうほうがいいので、僕が関わった問題だけ簡単にまとめておきます。
[crypto] R&B
エンコード後のテキストと、エンコードを行うPythonスクリプトが渡されます。ここからFLAGを求めろという問題。
見たところ、FORMATという文字列に従って、base64かrot13をかけてるだけみたいです。
FORMATはわかりませんが、FORMATの情報はエンコードされたテキストの先頭文字に残ってるので、ここをみて逆順でたどっていくだけみたいです。
雑に方針だけ伝えたら競プロerの後輩がマッハで実装してくれました。ありがてえ…
[misc] readme
スクリプトがリモートで動いていて、パスを指定すると対象のファイルの内容を出力してくれる。
/home/ctf/flag
にフラッグがあるが、ctf
という文字が入力に含まれていると弾くようになっている。
/etc/passwd
を見ると、一般ユーザはctf
しかなさそう。
さらに、./server.py
や../flag
を入力すると、ファイルの存在チェックは通るため、ディレクトリの構造は大まかに以下の通りになっている。
/home/ctf/flag /home/ctf/server/server.py
ここから、リモートで動いているserver.pyのプロセス情報から辿れないか?と考える。
Linux環境の場合、実行中のプロセスに関する情報は、/proc/[PID]
以下に展開される。 みんな大好きmanページを参照。
後輩がリモート環境のOSを調べてくれていたので、動作環境がAlpineということはわかっていた。Alpineを動かしている環境なんてDockerくらいしかありえないので、server.pyは普通にPID 1で動いていそう。
試しに/proc/1/cmdline
を入力すると、ファイル内容が出力された。どうやらこれっぽい。
さらに、/proc/[PID]
以下には、プロセスが実行されているディレクトリへのシンボリックリンクが格納されている。ここからflag
を参照しにいけばいけそう。
結論としては、/proc/1/cwd/../flag
を入力すると、FLAGが得られた。
[web] Spy
うーんSQLiじゃないしパスワードリスト攻撃とかかな…?いや違うし全探索するしかなくないか?とか考えてたんですが、難しく考えすぎてました。
ページのロード時間が親切に表示されているのに着目します。あとは、ソースコードの処理順序がキモです。
このページは、入力されたusernameが存在しない時点でreturnしています。そのため、ユーザが存在しない場合は最速でページが表示されます。
対して、入力されたusernameが存在する場合は、入力されたパスワードのハッシュを計算して、DBの内容と突き合わせます。
コメントに、「パスワードハッシュは、saltを加えて何度もストレッチを加えているから安全だぜへっへー」と書いてありますね。bcrypt的なやつだと思います。
ちなみにbcryptっていうアルゴリズムはめちゃくちゃ重いです。長いパスワードを適当に入力すれば、ローディング時間が見違えるほど延びます。今回は、これを利用します。
与えられた従業員リストを全て試して、ページのローディング時間が長いものが答えです。自動化スクリプトを組むより手を動かしたほうが早いと判断し、地道に全部確かめました。
その後、Challengeページに飛んで答えを入力し、FLAGゲットです。