Il 14 dicembre 2021 si è tenuto grazie a Cerbeyra, la piattaforma cloud di cyber security (www.cerbeyra.com), una CTF di classe “facile” la cui simulazione prevedeva di sventare un attacco terroristico della cellula Aldebaran tramite OSINT e Web Analysis catturando 4 flag, una per livello. Il team che si è aggiudicato il primo posto ha catturato tutte e 4 le flag in circa una quarantina di minuti. Quella che seguirà sarà invece il metodo risolutivo che ho adottato chiudendo con il secondo posto. Tengo a sottolineare che ciò che seguirà sarà soltanto uno dei possibili metodi risolutivi, il più congeniale a me, e non escludo possano essere presenti altri metodi ancora più efficaci e immediati. Ogni red team ha il suo stile, no dimenticatelo mai.
Il primo livello prevedeva di ottenere utente e password per accedere nell’area privata del sito di logistica marittimo.
Il portale si presentava come una semplice pagina web con due campi compilabili a passaggio di parametri con metodo POST. Tra le indicazioni del primo livello ci viene detto che è stata utilizzata la crittografia o stenografia per nascondere le credenziali all’interno della pagina, in questo caso le informazioni erano racchiuse negli elementi multimediali del portale.
Osservando il codice sorgente della pagina notiamo subito che una delle tre immagini ha una risoluzione differente dalle altre, attirando la nostra attenzione. Le salvo tutte e tre localmente per analizzarle.
Probabilisticamente parlando, l’immagine da 72KB difficilmente nasconderà al suo interno informazioni interessanti aggiuntive, al contrario di quella più pesante da 413KB. Partiamo proprio da quest’ultima, che corrisponde anche all’unica immagine con risoluzione differente.
Per la decrittazione utilizzo CyberChef, da sempre il mio pannello di riferimento per quanto riguarda il decoding/encoding. Semplice, immediato, super efficiente, multiformato. In questo caso è bastato dare in pasto il file al portale per trovare al suo interno nascosto tramite stenografia, le credenziali di accesso al sito.
Nel nostro caso, le credenziali risultavano essere kalimba:deluna .
E siamo dentro.
Navigando le pagine interne notiamo un pulsante che richiama la classica notifica di posta elettronica, cliccandoci sopra arriviamo all’informazione da noi cercata.
La prima flag.
Siamo così al secondo livello. Anche questa volta dobbiamo forzare un portale d’accesso ottenendo la credenziale per accedere.
Il portale si presenta come una semplice pagina web con singolo campo a passaggio parametri con metodo POST, come il primo. La differenza è che questa volta non analizzeremo per stenografia, ma solo di manual coding sulla pagina web in questione, poiché andando a guardare il codice sorgente è stata lasciata dagli sviluppatori volutamente o per dimenticanza una funzione interessante.
La funzione infatti vede una variabile passare per la funzione GetPassInfo(). Analizziamo la funzione.
Super semplice, nella funzione c’è un metodo “if” che controlla il valore della variabile prima di procedere oltre. Apriamo i tools da sviluppatori di Firefox e inseriamo un breakpoint proprio su quell’if. Facciamo un refresh della pagina e otteniamo così il valore della variabile, corrispondente a “vval”.
La inseriamo nel campo password e siamo dentro. La seconda flag è nostra.
Terzo livello, altro sistema di login. Nessuna stenografia, nessuna funzione dimenticata dagli sviluppatori. Le indicazioni ci suggeriscono una vulnerabilità di tipo SQL Injection, ma prima di buttarmici sopra a testa bassa analizziamo il codice.
Questa è la pagina di login.
Guardando il codice vediamo che viene richiamato “./script.js” che serve per validare le credenziali immesse.
Sempre di manual analysis scopriamo che lo script, se la condizione è verificata, va a richiamare la pagina “auth563485.php”. Vediamo se la pagina è raggiungibile direttamente senza un controllo sui cookies di sessione attivo.
E infatti siamo dentro.
Questa volta proviamo la più semplice delle SQL injection, inserendo una condizionale sempre vera: [‘ OR ‘1’=’1’ — ]
Un post presente nel board ci suggerisce che le credenziali del mainframe sono inserite all’interno di un record TXT nel DNS dell’host. Facciamo un “dig any” proprio sull’host così da scaricare l’intero pool di record DNS presenti.
Otteniamo così la terza flag.
Livello 4. Dobbiamo accedere al mainframe, solo che il mainframe richiede un codice di accesso.
Questa volta scansioniamo l’indirizzo dell’host tramite NMAP, ottenendo la lista di porte libere con relativo servizio in ascolto. Ci concentriamo su una delle porte alte, in particolare la porta TCP 9000. Alla precedente scansione aggiungiamo il flag -sV per fare versioning del servizio, ottenendo ycosì dall’host un access code e un secure code.
Uso l’access code per entrare nel mainframe.
Dentro al mainframe guardo le funzioni disponibili, tra le quali spicca “GenerateCode”. La funzione restituisce un link a una pagina di decoding della crittografia di Alberti (https://it.wikipedia.org/wiki/Disco_cifrante). Diamo in pasto il secure code decriptandolo dopo aver calibrato la ruota come indicato dalla funzione.
Richiamiamo poi la funzione CryptoKey con il parametro appena decriptato e otteniamo la quarta e ultima flag.
Fine.
Grazie ancora una volta a Cerbeyra per questa CTF!