Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/kanmu/gocon-2023-office-hour

Go Conference 2023 カンムオフィスアワーの CTF 問題
https://github.com/kanmu/gocon-2023-office-hour

Last synced: about 2 months ago
JSON representation

Go Conference 2023 カンムオフィスアワーの CTF 問題

Awesome Lists containing this project

README

        

# Standard library misconfiguration
標準ライブラリの利用ミスに関する脆弱性含むアプリケーションです。

## セットアップ
```
$ docker pull ghcr.io/kanmu/gocon2023-office-hour:latest
$ docker run -p 8080:8080 --rm ghcr.io/kanmu/gocon2023-office-hour:latest
```

## 達成条件
アカウントの残高が9,999,999より大きくなった状態で残高確認APIを呼び出すと正解のフラグが出力されます。

正解のフラグは、`kanmu_ctf_2023{xxxxx}`という形式です。

初期状態では、alice / bobの2つのアカウントがあり、残高はどちらも0です。

## アプリケーション説明
攻撃対象はGoで記述されたWeb APIです。
このアプリケーションでは、以下の操作が可能です。

**パスワードリセット ( `/password-reset` )**

指定したアカウントのパスワードがリセットされます。
```
$ curl http://localhost:8080/password-reset \
-d '{"id": "alice"}'
{"success": true}
```

**残高の確認 ( `/balance` )**

ヘッダで指定したアカウントの残高が返却されます。
```
$ curl http://localhost:8080/balance \
-H 'X-ID: alice' \
-H 'X-Password: xxxx'
{"balance": "0"}
```

**残高の送金 ( `/transfer` )**

指定したアカウントから残高が送金されます。
recipient_idには送金先のaccount_idを指定してください。
```
$ curl http://localhost:8080/transfer \
-H 'X-ID: alice' \
-H 'X-Password: xxxx' \
-d '{"recipient_id": "bob", "amount": "9999"}'
{"success": true}
```

## 注意事項
- 64bitプラットフォームを対象とした問題です

## 禁止事項
Dockerコンテナ内に正解のフラグが記述されたファイルがありますが、Dockerコンテナ内を確認してフラグをゲットすることは想定されていません。
curlと、同梱しているexploit.goを使って解けるように設定してあります。

## ヒント (1)

passwordReset関数 に注目!
`time.Now().Unix()` で初期化しているということは1秒以内に実行すると `rand.Intn` が同じ値になるかも?

## ヒント (2)

securego/gosec で何か分かるかも...?
`int32` と `int` が混在しているからオーバーフローの予感…? ためしに `/transfer` に `amount = -9999999999999` を投げてみたらなにやらエラーがおかしいぞ?

## ヒント (3)

TOCTOU で検索!
`transfer` で `time.Sleep` しているところがあるな…?これ同時に叩いたらバグるかも?