
Sfida CTF che sfrutta il bypass di autenticazione libSSH CVE-2018-10933. Include configurazione Docker, script di sfruttamento e guida per scoprire flag nascoste tramite collegamenti simbolici.
Basato su CVE-2018-10933
CVE-2018-10933 è una vulnerabilità scoperta in alcune versioni di libSSH, che può consentire l'accesso potenzialmente illimitato a una macchina. La vulnerabilità deriva da una gestione impropria delle intestazioni dei pacchetti durante il processo di autenticazione, dove l'invio di un pacchetto manipolato con il byte MSG_USERAUTH_SUCCESS può permettere a chiunque di bypassare l'autenticazione. Chi lo sfrutta ha quindi pieno accesso alla macchina.
La base di questa sfida, quindi, è richiedere ai concorrenti di esplorare l'immagine docker fornita, scoprire questa vulnerabilità, sfruttarla per ottenere l'accesso, e quindi trovare la chiave nascosta in un symlink sulla macchina.
Someone got into my machine via port 22...
It looks like they didnt even know my credentials.
Anyways, they made a file with an odd name, but it's gone now,
I wonder if there's still some trace of the filename -
it might be something symbolic of the attacker...
Can you figure out how they got in and help me find the filename?
Di seguito è riportato un dettagliato walkthrough della soluzione prevista:
Notate, dalla Descrizione della Sfida, che l'attaccante ha ottenuto l'accesso attraverso la porta 22, una porta tipicamente riservata a SSH. Notate anche che l'attaccante non ha usato credenziali per ottenere l'accesso.
Da questo, se cercate vulnerabilità passate per ottenere accesso a una macchina via SSH senza credenziali, il problema con il byte MSG_USERAUTH_SUCCESS è molto probabile. In alternativa, avviando una connessione alla porta 22, si può determinare la versione di libSSH in esecuzione, e poi cercare exploit comuni per quella versione.
Si può anche notare dalla Descrizione che il nome del file che cercano di trovare (la flag) esiste solo come destinazione di un link simbolico.
Sapendo ora che l'accesso può essere ottenuto sfruttando questa vulnerabilità, si può scrivere un proprio script, o copiare uno script di esempio che esegue questo exploit, e quindi eseguire un comando sulla macchina target. Ho adattato uno script di sfruttamento per questa soluzione, e l'ho chiamato libsshauthbypass.py.
Per eseguire questo script e ottenere la flag dalla macchina, nel caso dell'immagine demo, si può eseguire un comando simile al seguente:
./libsshauthbypass.py --host localhost -p 1337 -c 'find / -type l -exec stat {} + | grep "File:" | sed -E "s/.*\-> (.*)$/\1/g" | grep "definitelyarealCTF"'
che poi produce un output simile a
sspringer-fedora-CVE: ./libsshauthbypass.py --host localhost -p 1337 -c 'find / -type l -exec stat {} + | grep "File:" | sed -E "s/.*\-> (.*)$/\1/g" | grep "definitelyarealCTF"'
INFO:paramiko.transport:Connected (version 2.0, client libssh_0.8.1)
definitelyarealCTF{totally_a_REAL_flag}
Per utilizzare una versione di questa sfida per il tuo CTF, è altamente consigliato modificare il Dockerfile per utilizzare un percorso diverso da quello predefinito, cambiare la flag in flag.txt (anche se deve rimanere su una sola riga), e poi ricostruire l'immagine. Nota che potrebbe essere necessario ospitare un nuovo container per ogni tentativo di connessione per impedire che qualcuno esegua un comando distruttivo e influenzi tutti i concorrenti.
Per ricostruire l'immagine docker con una nuova flag (e testarla)
flag.txt con la nuova flag./build_run <image name>[:<version number] <port number>./libsshauthbypass.py o il proprio script per contattare il container con il payload corretto e un comando da eseguireexit) dalla shell fornita dallo script build_run, il container verrà arrestato ed eliminato, ma l'immagine rimarrà e sarà etichettata come <image name>Proof of Concept: https://youtu.be/ELrOBm02ANg
Walkthrough della sfida https://youtu.be/Ii121piSZR0