初心者がSECCON Beginners CTF 2020を解いていく+感想

2020年05/23~24に実施された[SECCON Beginners CTF 2020](https://score.beginners.seccon.jp/)に参加してきました。
結果としては、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](https://gchq.github.io/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のソースコードが

```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/`というディレクトリの中にあるのを使う

僕はこの辺が無知なので、どういったことができるかを確認。

```shell
$ cat /proc/self/cmdline
cat/proc/self/cmdline
```
`cmdline`というのはプロセスを開始するときに発行されるコマンドを含むもの、とのこと
そのほかに
`cwd`：そのプロセスで現在稼働しているディレクトリへのシンボリックリンク
`environ`：プロセスの環境変数の一覧。環境変数は大文字、値は小文字
`exe`：このプロセスの実行可能ファイルのシンボリックリンク
と、数が多いのでこのへんにしますが、結構何でもできそう…

まず、環境変数を確認しましょう

```sh
$ 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っぽい問題が解けたので個人的にはすごく気持ちがいいです。


# 参考にした記事
[SECCON Beginners CTF 2020 Write-Up](https://qiita.com/DyingFrog/items/24239a9a53b4f6091307#crypt-rb-beginner)　@DyingFrog様

[SECCON Beginners CTF 2020 作問者Writeup](https://ptr-yudai.hatenablog.com/entry/2020/05/24/174914#Misc-272pts-readme-71-solves)　@ptr-yudai様