こんにちは.福岡では緊急事態宣言は解除されましたが授業もアルバイト,ゼミもリモートのため相変わらず外出しない生活を送っています.
ctf4b
ctf4bに大学の研究室のメンバーで参加してきました.昨年は全く手が出ませんでしたが今年は結構楽しくCTFができました.(解けたとは言ってない.)
得意分野と言える分野もないので雑食でいろいろな分野を覗いてました.
僕はreadme
,beginner's stack
,tweetstore
をときました.また,時間内にフラグは得られませんでしたが終了後に気づいたunzip
も記載します.
(その他の問題も解けたら追記しようかな)
では,
https://www.seccon.jp/2019/seccon_beginners/seccon_beginners_ctf_2020_5_23_1400.html
追記
pwnのelementary stackについてポストしました.
readme
Miscの問題です.問題サーバで動いているコードが配布されます.
#!/usr/bin/env python3
import os
assert os.path.isfile('/home/ctf/flag') # readme
if __name__ == '__main__':
path = input("File: ")
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")
ncコマンドでサーバに接続するとFile:
と出てきてパスを入力します./home/ctf/flag
を開くことができればフラグが得られそうです.
しかし.入力文字列にはいくつかの制限があります.
- 指定したパスが存在する
- 指定したパスがファイルである
- 指定したパスが絶対パスである
- 指定されたパスに
ctf
という文字列が存在しない - 指定したファイルが開ける
条件は以上です.
ctf
が許されないので/home/ctf/flag
は当然の如く失敗します.
ctfという文字列を使用せずにどの様にしてパスを取得するかがポイントです.
現在のプロセスが動いているカレントディレクトリを取得することができれば良さげです.
そこで登場するのが/proc
です.
/proc
ファイルシステムは特殊なディレクトリでシステムの情報や動作しているプロセスの情報を取得することができます.
あるプロセスに関する情報が欲しい場合は/proc/[pid]
を参照します.自身のプロセスの情報を得たい場合は/proc/self
です.
/proc
は面白いのでぜひいろいろ覗いてみてください.
さて,/proc/self/cwd
がプロセス自身のカレントディレクトリへのシンボリックリンクとなっています.が,ここで/proc/self/cwd
を入れてもファイルじゃないのでダメです.そこで,/proc/self/environ
を入力してみます.すると環境変数がいっぱい出てきます.その中にPWD=/home/ctf/server
が見つかりました.
このプロセスは/home/ctf/server
で動いてそうですね.