Saturn
Autore: Lord Shiva • Aggiornamento: 08.12.2023 • Tempo di lettura: 01 min.Una Challenges piuttosto semplice. Aprendo il sito internet si vede una semplice pagina che richiede un URL.
Successivamente ho scaricato lo zip per analizzare il codice.
def secret():
if request.remote_addr == '127.0.0.1':
flag = ""
with open('./flag.txt') as f:
flag = f.readline()
return render_template('secret.html', SECRET=flag)
else:
return render_template('forbidden.html'), 403
Il servizio proxy utilizza una libreria chiamata safeurl-python: https://github.com/IncludeSecurity/safeurl-python per proteggersi dagli attacchi SSRF. Anche se ho identificato diverse vulnerabilità note in questa libreria tramite Snyk: https://security.snyk.io/package/pip/safeurl-python, la versione presente è già stata corretta per risolvere questi problemi.
gunicorn==21.2.0
requests==2.31.0
SafeURL-Python==1.3
Werkzeug==3.0.1
Con le mie conoscenze di base SSRF rese inutilizzabili, devo essere creativo nel catturare la flag utilizzando la conoscenza acquisita dall'analisi del software.
Sapendo che il servizio proxy è protetto da SSRF, devo verificare gli indirizzi bloccati e consentiti. Per farla breve, blocca gli indirizzi IP privati ma consente indirizzi come https://www.google.com/ e altri. Quindi, ho controllato come è configurato safeurl. Risulta che le configurazioni predefinite sono piuttosto rigide.
"whitelist": {
"ip": [],
"port": ["80", "443", "8080"],
"domain": [],
"scheme": ["http", "https"]},
"blacklist": {
"ip": ["0.0.0.0/8", "10.0.0.0/8", "100.64.0.0/10", "127.0.0.0/8", "169.254.0.0/16",
"172.16.0.0/12", "192.0.0.0/29", "192.0.2.0/24", "192.88.99.0/24", "192.168.0.0/16",
"198.18.0.0/15", "198.51.100.0/24", "203.0.113.0/24", "224.0.0.0/4", "240.0.0.0/4"],
Ovviamente, provando a inviare l'URL: http://127.0.0.1:1337/secret il sistema bloccava la richiesta. Di conseguenza, sono andato su https://www.shorturl.at/ e ho abbreviato l'indirizzo http://127.0.0.1:1337/secret. Inserisco lo short link eed ecco la flag: HTB{Exp..................fun}