誕生日おめでとうございました!!!!お疲れ様でした!!!!
以下writeup
Web
MiniBank
FlaskでかかれたWebサイトのコード。
app.pyの
@app.route("/")
def index():
token = request.cookies.get("account")
if token:
balance = decode_jwt(token)
if balance is not None:
status = determine_status(balance)
return render_template("index.html", balance=balance, status=status)
と
def determine_status(balance):
status = FLAG
if balance > 0:
status = "rich"
if balance <= 0:
status = "poor"
return f"You are a {status} person, aren't you?"
ここから、cookieにjwtでデータが保存されてそうなのでblanceの値を「0以下」かつ「0超」に書き換えることが出来れば良さそうと分かる。存在するのかそんな値.....?
一旦数学はおいて、jwt改ざんを考える。
KEY = str(random.randint(1, 10**6))
def encode_jwt(balance):
payload = {"balance": balance}
return jwt.encode(payload, KEY, algorithm="HS256")
より、keyは10^6程度の全探索で見つかるため
コードを書いて見つける。これでjwt改ざんの準備は整った。
一応https://jwt.io/ を利用して出来てるか確認する。
「0以下」かつ「0超」の値について、pythonではnanを利用すると比較を強制Falseに出来るらしい。試したらできた。
https://jwt.io/ さんでは、float('nan')を値にするのはエラーが起きた?のでpythonコードからペーロードを生成した。
生成したjwtをcookieにセットして「/」へリクエストを送るとflagゲット!
Misc
zzz
「SIGQUIT」信号を出すことが肝だそうです!
私の環境では、「ctrl+4」で出た。OSや設定にもよるのかも!
HBD
私のつたない理解。自分->apache->バックエンド(go)とリクエストとレスポンスが転々としてる感じ?
ヘッダー部分変更しても意味なくない?と思いつつ色々試してたら出来た。
func modify(r *http.Response) error {
body, err := io.ReadAll(r.Body)
if err != nil {
return err
}
var b []byte
if bytes.Contains(body, []byte("HBD!Satoki!")) {
b = []byte(getFlag())
} else {
b = body
}
r.Body = io.NopCloser(bytes.NewReader(b))
r.Header.Set("Content-Length", strconv.Itoa(len(b)))
return nil
}
HBD!Satoki! / HTTP/1.1
Host: 160.251.183.149:8848
Cache-Control: max-age=0
Accept-Language: ja
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.6533.100 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
If-None-Match: "2d-432a5e4a73a80"
If-Modified-Since: Mon, 11 Jun 2007 18:53:14 GMT
Connection: keep-alive