IHC CTF 2018

Avete ancora dei dubbi? Ecco le soluzioni ad alcune sfide della CTF ufficiale

Posted by MrMoDDoM

Da giovedì 2 a domenica 5 Agosto 2018 si è tenuta la prima edizione dell'Italian Hacker Camp presso il Parco Fenice di Padova, durante il quale MuHack ha organizzato e tenuto la sifda CTF in stile Jeopardy ufficiale dell'evento.

Per chi non ne fosse pratico, una CTF ( acronimo per Capture The Flag ) è una sfida di hacking dove gli sfidanti hanno lo scopo di reperire una stringa di caratteri (detta appunto flag) mediante tecniche di attacco a sistemi informatici.

Noi pensiamo che lo scopo di una CTF non sia solo il divertimento dei partecipanti (e degli organizzatori che li guardano arrovellarsi :D ), ma anche e sopratutto avere la possibilità di imparare qualcosa di nuovo, provando con mano a trovare e sfruttare i bug di sicurezza nascosti nelle varie sfide.

Viste le numerose richieste di chiarimenti, abbiamo deciso di scrivere questo post per dare spiegazioni riguardo ai bug e alle loro implicazioni di sicurezza, lasciando spazio alle soluzione dei concorrenti.

Il seguente post è ancora in fase di aggiornamento, aspettatevi numerose modifiche e integrazioni..!

Inutile dire che saranno presenti spiegazioni solo alle sifde che sono state risolte da almeno una squadra partecipante, per quelle lasciante ancora irrisolte vi aspettiamo ai prossimi eventi!

The Lore of SAFE

La CTF è stata creata attorno all'idea di questa azienda enterprise chiamata SAFE (acronimo ricorsivo per Safe As Fuck Engineering) che produce soluzioni cloud-based per l'azienda 5.0 che vuole un olistica e cibernetica sitemazione dei servizi ..

Ecco che quindi tutti i servizi e le soluzioni sono Certified 100% bug free, pronte per essere testate dai partecipanti.

Scoreboard e il sistema dinamico

Abbiamo utilizzato CTFd per la gestione della scoreboard, scelta fatta per due principali motivi: in primo luogo la facilità di installazione e configurazione della piattaforma; e secondo la possibilità di scoring dinamico dei punti.

Il sistema di scoring prevedeva che ogni sfida partisse da un valore di 500 punti, andando a decrementare sino a 50 una volta che fossero giunte 10 submission corrette.

I punteggi dunque calavano non solo per giocatori che inviavano la risposta corrette, ma anche per chi aveva già risolto la sfida, rendendo il gameplay molto più dinamico e competitivo.

Le sfide

Anzitutto congratulazioni ai vincitori di questa CTF:

| Posizione | Team | Punteggio | |:---------:|:---------------------:|:---------:| | 1° posto | spritzini | 0000 | | 2° posto | The Annoning Baboons | 0000 | | 3° posto | AAAAAAA | 0000 |

A seguito trovate spiegate le varie sfide suddivise per categoria, con segnato il punteggio finale.

Web

Enter the IHC

Con una veloce scansione tramite un tool per enumerare url, si veniva a conoscenza di una pagina chiamata "cmd.php" che presentava un form buggato, tramite il quale era possibile ottenere command execution. Una volta in possesso di una webshell, era possibile leggere il file flag.txt

Crypto

Sticky Note - 50 punti

Questa sfida era abbastanza semplice, con un pizzico di spirito di osservazione era abbastanza facile accorgersi che si trattava di una serie di byte scritti in binario che rappresentavano una stringa Base64 della flag stessa.

Flag Bit Counter

Al giocatore venivano forniti due file: un file di testo contenente uno pseudo codice di un sistema di cryptazione e un CSV dei consumi elettrici del circuito che esegue quel codice: una volta disegnato in un grafico i valori, i picchi di assorbimento rappresentavano i singoli bit che encodavano la flag.

Pwnable

Access Code v1

Il programma eseguiva un contronto tra due stringe: una harcodata e una sopperita dall'utente e in caso concidessero, stampava la flag.

Non andando mai a buon fine il conronto a causa di un off-by-one, per risolvere la sfida bisognava sfruttare una vulnerabilità di buffer overflow, potendo sovrascrivere il codice hardcodato.

Access Code v2

Anche in questo caso, il programma eseguiva la verifica di un codice inserito dall'utente e uno harcodato, ma per un "errore di programmazione", il confronto era eseguito non con l'input dell'utente, ma con il puntatore alla funzione che leggeva tale input.

Tale funzione per presentava una vulnerabilità di buffer overflow che consentiva di sovrascrivere il return pointer così da redirezionare l'eseguzione alla funzione che permetteva di stampare la flag.

Virtual Curriculum - 500 punti

In questo caso la vulnerabilità era di tipo format string, ma ben nascosta all'interno della chiamata all fprintf sulla scrittura file: quello che traeva in inganno era la chiamata a snprintf che avveniva poco prima, la quale scriveva dentro un buffer l'input dell'utente opportunamente formattato, ma ovviamente senza modificare eventuali format string presenti.

Artificial Life Mainframe - 500 punti

Il bug qui presente era un semplicissimo stack-based buffer overflow, raggiungibile con la richiesta di una grande matrice di gioco, dando quindi la possibilità di sovrascrivere il return pointer della funzione se richiesti 0 cicli di gioco.

Il vero problema stava nello sfruttare questa vulnerabilità: essendo la sfida un forking server compilato a 64 bit, era possibile avvalersi del metodo ret-to-csu **per constrastare la presenza dell'ASLR, potendo fare il leaking di un indirizzo dell GOT, dando quindi la possibilità di calcoalre il base address delle librerie.

Fatto ciò era possibile riconettersi e sfruttare nuovamente il buffer overflow, essendo che il forking di un nuovo processo non modifica gli offset del programma, avendo quindi la possibilità di eseguire una ROP-chain volta ad ottenere una shell di comando.

The Lollipop Service (and The Falloc) - 500

Questa era probabilemte la sfida più difficile tra tutte.

Basata su un memory allocator custom che reimplementava le funzioni di malloc(),free(), etc.; l'obiettivo era quello di fornire una sfida che forzasse i partecipanti a non affidarsi troppo alle loro conoscenze pregresse in termini di heap exploitation.

La challenge presentava all'utente una semplice utility per ordinare caramelle: come prima difficoltà era necessario reversarsi il sistema di login, il quale chiedeva una sequenza di numeri randomici di 4 cifre, il cui seed di generazione era basato sulla somma dell'ID fornito dall'utente (anchesso di 4 cifre) e sull'ora in cui si effettuava la connessione (in formato h24).

Fatto ciò la sfida di per sè non presentava vulnerabilità sfruttabili, ma solo in congiunzione con il Falloc (Fast allocator) era possibile giungere ad un Heap-overflow dovuto ad un bug di calcolo di dimensioni durante la procedura di coalising delle free chunck gestite dal memory allocator.

Inserendo 4 ordini di caramelle e cancellandonli in sequenza 2-3-1, era possibile ottenere un'area di memoria libera con dimensione più grande dell'effettivo spazio, permettendo così con il successivo ordine di sovrascrivere l'header sia del chunk successivo, sia della double linked list del programma stesso.

In questo modo si aveva a disposizione una primitiva di "write-what-where" così da poter andare a sovrascrivere con un valore non-nullo la variabile che identificava un utente come reseller e sbloccando quindi la possibilità di stampare la flag.

Misc

The Super Artist

La sfida prevedeva di caricare tramite l'apposito sito internet una immagine png che rappresentava il codice sorgente di un programma scritto in Piet, il cui output entrava direttamente come comando ad una shell bash.

I possibili modi per risolvere questa sfida erano molti, tra cui eseguire un cat sul file flag.txt.

Physical

Door Selection

L'unica sfida fisica di quest'anno prevedeva la forzatura di una "serratura" a banda magnetica mediante la creazione di un magspoof.

Fatto ciò, bisognava inviare il codice di accesso codificato mediante il protocollo Wiegand della tessera 1337 e edificio 1.

Forensic

Language Barrier

Veniva fornita al giocatore una immagine che conteneva IV e key che, utilizzate per criptare l'immagine stessa tramite AES, permettevano di estrapolare un file pdf: esso conteneva a sua volte un file rar nascosto protetto da password, la quale poteva essere trovata in una precedente revisione del pdf stesso. Aperto l'archivio rar si poteva leggere il file flag.txt

Repo & writeups

A breve aggiorneremo questo post con il link al repository GitHub su cui potrete trovare i codici sorgenti delle sfide e i link ai writeups gentilmente concessi dai partecipanti!

Vogliamo quindi concludere questo post con un grazie a tutti partecipanti e agli organizzatori dell'IHC che hanno permesso di organizzare e rendere grande questo evento!

Stay tuned and have a SAFE day!