introduzione
(questo articolo è stato inviato a Google per la valutazione ed è protetto da copyright, quindi se vuoi inviare la tua soluzione... è finito ieri... devi essere registrato nel tabellone affinché il tuo articolo venga preso in considerazione)
MindReader è stata presumibilmente una delle sfide più facili su GoogleCTF e richiede qualche supposizione. Quindi iniziamo
Prima di tutto nella pagina della sfida vediamo una casella con un pulsante "leggi".
La prima cosa che mi viene in mente è provare a testare "XSS", quindi sono stati testati un paio di tentativi XSS tra cui i seguenti:
<script>alert(test)</script>
Purtroppo la risposta non è stata quella prevista
Sono state provate anche tecniche di iniezioni di comando con un paio di "ls", "cmd", ma anche senza fortuna.
Ora il passo successivo è provare l'attraversamento della directory e si scopre che l'host è vulnerabile. Sono state tentate le traversate successive, ma anche queste senza fortuna
../.././../etc/passwd
../../../../etc/ombra
../../../../etc/resolv.conf
../../../etc/hosts
Quindi, dopo un paio di impronte digitali, si scopre che l'ambiente sta eseguendo una finestra mobile, quindi la pagina principale è stata riaperta ed è stato digitato "main.py" e lo script principale è stato visualizzato
Lo script sopra utilizza il framework "flask" e utilizza la funzione "index()" per eseguire le attività di lettura dei valori immessi nella casella di sfida.
La riga 6 ci dice che esiste una variabile d'ambiente che viene affermata prima di eseguire la funzione e Google ci ha presentato un suggerimento che questa variabile d'ambiente è l'effettivo FLAG.
E fornire l'host è vulnerabile all'attraversamento delle directory, quindi è necessario accedere alla variabile di ambiente in questo modo.
Proviamo ogni combinazione usando /proc/self/environ ma sembra che non abbiamo i permessi di accesso
Entra in gioco una buona conoscenza dei sistemi linux, /proc/self/fd ha dei link simbolici a /dev/fd e questo significa che in linux ci sono relazioni tra variabili d'ambiente e descrittori di file per permetterci di accedere all'ambiente dai descrittori di file o da /dev/fd che inizia da 0,1,2 e così via.
Quindi provare /dev/fd/0 non ci dà altro che legare /dev/fd/8
Abbinato all'attraversamento delle directory
/dev/fd/../environ
E la bandiera è stata catturata