SECCON Beginners CTF2019に参加したのでWritesupを記載します
スコアサーバー
https://score.beginners.seccon.jp/challenges
[warmup] Welcome
問題文に記載がある通り、https://webchat.freenode.net/?channels=seccon-beginners-ctfにアクセスするとフラグがある。
FLAG:ctf4b{welcome_to_seccon_beginners_ctf}
containers
ファイルをダウンロードし、fileコマンドで判定すると、dataと表示される。
バイナリエディタ等で確認するとPNGファイルが連結されたファイルだとわかる。
(赤枠部分がPNGファイルのマジックナンバーである)
そのため、ファイルが埋め込まれていると判断し、ファイル抽出するコマンドforemostで抽出すると以下のPNGファイルを得ることができるので、フラグがある。
FLAG:ctf4b{e52df60c058746a66e4ac4f3fdb6fc81}
[warmup] Seccompare
ファイルがダウンロードされるので、fileコマンドで確認するとELFと表示される。
単に実行すると、使い方が表示される。
# ./seccompare
usage: ./seccompare flag
誤ったフラグを引数に渡すと、以下の表示がされる。
./seccompare 888
wrong
該当ファイルをIDAで解析するとs1が引数で渡した文字列、S2がプログラム内で定義しているフラグの文字列を比較した結果、合っている場合にはCorrect、間違っている場合には、wrongを表示する。
S2の文字列部分をASCIIコードに当てはめてるとフラグが得られる。
FLAG:ctf4b{5tr1ngs_1s_n0t_en0ugh}
以下は、途中まで行ったものと最終的に回答が得られなかった
[warmup]Ramen
ラーメン屋のWebサイトが表示される。真ん中のSeachで店員が検索できるようだ。
一部の文字でも検索できるため、LIKE句を用いたSQLを発行しているようだ。
;を入力すると、エラーが出力されるため、SQLInjectionを行うことを試みる。
SQLInjectionを調査するツールsqlmapで確認するとテーブル内にflagという名前のテーブルがあることを確認できた。ただ、columnが取得できなかったため、回答が行えず。
おそらく、UNION SELECT~で結合して出力する回答だと思われる。
[warmup] So Tired
回答すると長い文が出力される。一番最後が==のため、base64でエンコードされているものと判断し、デコードしたものを保存すると、zlib compressed dataと表示される。
解凍処理を行ったが、うまく解凍されなかったため、回答できず。
Dump
ファイルをダウンロードして、fileコマンドで確認すると、tcpdumpファイルと表示される。
解析すると、以下のURLが発行されていることがわかる。
/webshell.php?cmd=ls%20%2Dl%20%2Fhome%2Fctf4b%2Fflag
/webshell.php?cmd=hexdump%20%2De%20%2716%2F1%20%22%2502%2E3o%20%22%20%22%5Cn%22%27%20%2Fhome%2Fctf4b%2Fflag
デコード後、以下の文字列になることになる。
/webshell.php?cmd=ls -l /home/ctf4b/flag
/webshell.php?cmd=hexdump -e '16/1 "%02.3o " "\n"' /home/ctf4b/flag
Webサーバに対して、lsコマンドを発行後、その後、hexdumpで16バイトずつ 0詰め3文字表示 改行を行うこととなっている。
そのため、hexdumpの出力をバイナリに戻したのち、フラグが得られると思われるが、その部分の実装を行かった。
感想
久しぶりに行ったが、やはり最後までやり遂げる力が必要だと思われる。
特にhexdumpの逆部分はpython等で実装できると思われるので後程試してみたい。