2020年05/23~24に実施されたSECCON Beginners CTF 2020に参加してきました。
結果としては、250位ほどでしたが僕は一個も正解できませんでした…
これからはセキュリティについても学んでいくので、ネットに公開されたWrite Upを参考に解いていきます。
ちなみに問題数が多いのでちょくちょく更新していきます
更新
- 2020/05/27 Misk問題
readme
の解法を追加しました
Web問題
Spy
問題文
As a spy, you are spying on the "ctf4b company".
You got the name-list of employees and the URL to the in-house web tool used by some of them.
Your task is to enumerate the employees who use this tool in order to make it available for social engineering.
てっきり僕はパケット監視でもするのかとか勘違いして、OWASP ZAP
使ったのは内緒
解いていく
添付されているapp.py
を見てみるとこんなのが
# auth.calc_password_hash(salt, password) adds salt and performs stretching so many times.
# You know, it's really secure... isn't it? :-)
とりあえず、意味は
ソルトを何回も追加して何度もストレッチしてます。本当に安全だと思いませんか?:-)
とのこと。どうやら実在するユーザはソルトを何回もかけるため処理が遅くなるらしい。
存在するユーザ名を入力して、適当なパスワードを入力してLogin
をしてみると、それぞれのユーザのログイン処理の時間が表示される。
その中で、時間が遅いユーザを洗い出してGo to challenge page
でそのユーザを選択してみると、見事フラグが入手できます。
感想
こういった処理時間によって、どういったユーザが利用しているのかがわかってしまう、、、、コワイ
あと、ちゃんとソースコードは見ましょう(重要)
Misk 問題
emoemoencode
問題文
Do you know emo-emo-encode?
いやしらんがな。
そんなことはさておき、emoemoencode.txt
を見てみると
🍣🍴🍦🌴🍢🍻🍳🍴🍥🍧🍡🍮🌰🍧🍲🍡🍰🍨🍹🍟🍢🍹🍟🍥🍭🌰🌰🌰🌰🌰🌰🍪🍩🍽
楽しそう()
余談ですが、この問題は友人が解いていたのですが、CyberChefというサイトを知らなかったので、一個一個調べてやってました(笑)
解いていく
こういった絵文字というのはunicode
というやつらしく、Charcodeを調べるとできるらしい。
Charcode:大文字・小文字が存在しない場合の、Unicodeにおける符号位置を示す。
引用:https://ja.wikipedia.org/wiki/Template:CharCode
CyberChefのInput
に先ほどの絵文字の羅列、Operations
より、To Charcode
を選択。すると、Outputに
01f363 01f374 01f366 01f334 01f362 01f37b 01f373 01f374 01f365 01f367 01f361
01f36e 01f330 01f367 01f372 01f361 01f370 01f368 01f379 01f35f 01f362 01f379
01f35f 01f365 01f36d 01f330 01f330 01f330 01f330 01f330 01f330 01f36a 01f369 01f37d
これで、絵文字がCharcodeになりました。
これだけではなにもわからないので、ためしに答え方であるctf4b{}
を入れてみると、
63 74 66 34 62 7b 7d
絵文字のCharcodeと比較すると、文末2文字が一致しているのがありますね。
文末2文字を抽出する
63 74 66 34 62 7b 73 74 65 67 61 6e 30 67 72 61 70 68 79 5f 62 79 5f 65 6d 30 30 30 30 30 30 6a 69 7d
これを逆にOperations
をFrom Charcode
に設定してみると、フラグが入手できます。
感想
こういった暗号系で、解答方法にも着目するのは頭がいいなーと思いました。
僕のチームはそれに気づけば答えまで行けましたね… 惜しい
readme
最初はただ.txtファイルを見るだけかと思ったら全然違くて萎えました
問題文
nc readme.quals.beginners.seccon.jp 9712
???
と思いました。
ncとは何ぞ?と思い調べてみると
nc:サーバのプロセスを起動するコマンド
とのこと。とりあえず実行してみると、
File:
と出力された。文字を入力できるので適当に入れても何も応答なし。
添付されているreadme
ファイルを解凍すると、server.py
というPythonのソースコードが
import os
assert os.path.isfile('server.py') # 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")
とりあえず、パスを入力してフラグを入手するんだろうなーという意図はわかりました。
あと、ctf
がパスに入っていると怒られるっぽい
解いていく
この問題では。プロセスについての知識がいるみたいです。プロセスに関する情報が入っているディレクトリは/prop/{PID}
というところ
今回は/proc/self/
というディレクトリの中にあるのを使う
僕はこの辺が無知なので、どういったことができるかを確認。
$ cat /proc/self/cmdline
cat/proc/self/cmdline
cmdline
というのはプロセスを開始するときに発行されるコマンドを含むもの、とのこと
そのほかに
cwd
:そのプロセスで現在稼働しているディレクトリへのシンボリックリンク
environ
:プロセスの環境変数の一覧。環境変数は大文字、値は小文字
exe
:このプロセスの実行可能ファイルのシンボリックリンク
と、数が多いのでこのへんにしますが、結構何でもできそう…
まず、環境変数を確認しましょう
$ nc readme.quals.beginners.seccon.jp 9712
File: /proc/self/environ
HOSTNAME=b2a8444bdc32PYTHON_PIP_VERSION=20.1SHLVL=1HOME=/home/ctfGPG_KEY=0D96DF4D4110E5C43FBFB17F2D347EA6AA65421DPYTHON_GET_PIP_URL=https://github.com/pypa/get-pip/raw/1fe530e9e3d800be94e04f6428460fc4fb94f5a9/get-pip.pyPATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binLANG=C.UTF-8PYTHON_VERSION=3.7.7PWD=/home/ctf/serverPYTHON_GET_PIP_SHA256=ce486cddac44e99496a702aa5c06c5028414ef48fdfd5242cd2fe559b13d4348SOCAT_PID=13113SOCAT_PPID=1SOCAT_VERSION=1.7.3.3SOCAT_SOCKADDR=172.21.0.2SOCAT_SOCKPORT=9712SOCAT_PEERADDR=126.140.175.84SOCAT_PEERPORT=49718
ここにある
PWD=/home/ctf/server
この環境変数PWD
にはカレントディレクトリの情報があります。よってカレントディレクトリは/home/ctf/server
となります。
つまり、/proc/self/cwd
というのは、/home/ctf/server
と同じ意味になります。
で、問題のフラグの場所なんですが、とりあえず/ctf
にあるのかなーという予想はできます。答えなんですが、これはCTF上の雰囲気的なものなんでしょうか、、、/ctf/flag
というのがあり、そこをたたけばフラグが取得できます。
これはほぼ勘で指定している人がいたので、そうゆうことかと
感想
プロセスを用いてこんなことができるとは思ってもいませんでした。
なんかctfっぽい問題が解けたので個人的にはすごく気持ちがいいです。