Una delle tecniche più utilizzate dai team di hacking per ricercare vulnerabilità nei sistemi e nei software è la Capture the Flag (CTF), una vera e propria competizione in cui bisogna “catturare” tutte le bandiere disseminate nel sistema bersaglio.
L’articolo tratta la seconda parte della CTF (Capture The Flag) basata sull’universo di Game of Thrones, che ho avuto il piacere di svolgere come lezione per l’Università degli Studi di Perugia, in collaborazione con i Professori Stefano Bistarelli e Francesco Santini.
Indice degli argomenti
Ricomincia la caccia alle bandiere
Durante le fasi preparatorie della competizione, ci eravamo fermati a riposare in una locanda di Dorne, tentando di dirimere l’enigma dei due file trovati all’interno dell’FTP:
- problems_in_the_north.txt
- the_wall.txt.nc
Non rimaneva che scaricare in locale i due file per osservarli più da vicino, utilizzando il comando get:
get problems_in_the_north.txt
get the_wall.txt.nc
Dopo quest’ultimo esame, abbandonai definitivamente Dorne, digitando il comando exit.
Tramite il comando cat diedi subito un’occhiata al file .txt.
cat problems_in_the_north.txt
“Ci sono problemi al nord. Dobbiamo viaggiare velocemente. Una volta giunti lì difenderemo la barriera” – Jon Snow
“Che tipo di magia è questa?!? Non ho mai visto formule simili. Controlliamolo attentamente” – Maester Aemon Targaryen
md5(md5($s).$p)
nobody:6000e084bf18c302eae4559d48cb520c$2hY68a
Esaminai, quindi, anche il file the_wall.txt.nc,sempre tramite lo stesso comando.
Indizi nascosti con la crittografia
Già dalle prime righe dell’output si può notare il nome del famoso algoritmo di cifratura a blocchi a chiave simmetrica, conosciuto come Advanced Encryption Standard (AES) a.k.a. Rijndael. Vale a dire che il file era criptato. E senza la giusta key, non saremmo riusciti a decriptarlo.
Come primo passo, decisi quindi di analizzare l’hash fornitoci dal file problems_in_the_north.txt:
6000e084bf18c302eae4559d48cb520c$2hY68a
L’algoritmo di hashing con il quale era stato ottenuto era: md5(md5($s).$p), dove $s sta per salt e $p sta per password.
Un salt è una sequenza casuale di bit che viene utilizzata assieme ad una password in input. Solitamente, viene utilizzato per incrementare il livello di sicurezza con il quale le password vengono salvate.
Gli algoritmi di hash mappano una stringa di lunghezza arbitraria in una stringa di lunghezza predefinita. A differenza della codifica e della cifratura, sono processi irreversibili.
Ad esempio, la codifica MD5 della frase: “mi ritrovai per una selva oscura, ché la diritta via era smarrita” è: “cecd668227b837e56f326beffea802a3”.
Qualsiasi modifica alla frase (sia essa anche di un solo spazio o di una virgola) produrrebbe un hash completamente differente.
In teoria, se volessimo risalire da un hash alla password, potremmo ipotizzare di prendere un elenco di parole (wordlist) potenzialmente utilizzabili come password, tradurlo nel corrispondente hash e qualora l’hash della password fosse uguale a uno degli hash della wordlist, allora avremmo trovato la password.
Il tool per analizzare gli indizi trovati
Per lo svolgimento della CTF ho utilizzato hashcat, un tool scaricabile dal sito ufficiale.
La logica del comando che avremmo dovuto utilizzare è la seguente:
[comando] [modalità di attacco] [algoritmo di hash] [l’hash da craccare] [la wordlist di parole]
Il problema, a questo punto, riguardava la necessità di utilizzare lo stesso algoritmo di hashing con il quale la stringa era stata prodotta.
Invocando l’help di hashcat, l’algoritmo che ci serviva md5(md5($salt).$password) non appariva nella lista. Era presente invece, con il tag 20, l’algoritmo md5($salt.$pass) che avrei potuto utilizzare dopo aver sostituito il salt con md5($salt) nell’hash.
Tornando quindi al nostro hash 6000e084bf18c302eae4559d48cb520c$2hY68a, la parte che avrei dovuto convertire in formato md5 si trova dopo il simbolo $: 2hY68a.
Digitai allora il comando:
echo -n 2hY68a | md5sum
- echo: mostra a schermo (sulla standard output) il parametro passato
- -n : esclude nell’output una nuova riga finale
- 2hY68a : la parte che vogliamo convertire in md5
- | : il “pipe” ci consente di passare l’output del primo comando al comando successivo
- md5sum : converte in md5
A questo punto, non rimaneva che riscrivere interamente l’hash nel nuovo formato md5($salt.$pass) e salvarlo in un file di testo:
6000e084bf18c302eae4559d48cb520c:0cbb5be2c4504bed573802efbd909965
dove il segno “:” viene utilizzato per separare gli hash.
I comandi per decifrare la chiave di accesso
In questo modo, ho potuto utilizzare Hashcat tramite il seguente comando (nell’esempio ho utilizzato Hashcat sotto OS Windows):
hashcat-cli64.exe -m 20 -a 0 c:toolsHlegacyHASH_NORTH.txt c:toolswlistrockyou.txt
- hashcat-cli64.exe : è il comando per lanciare hashcat;
- -m 20 : identifica il tipo di hash da craccare. In accordo con le opzioni di hashcat il formato md5($salt.$pass) è identificato come “20”;
- -a 0: indica la modalità con cui voglio procedere nell’attacco dell’hash, nel mio caso tramite una wordlist;
- c:toolsHlegacyHASH_NORTH.txt: il file .txt che contiene il mio hash (Fig. 8);
- c:toolswlistrockyou.txt: la lista di parole con cui voglio effettuare il cracking (le mie possibili password).
Ecco finalmente la nostra key per decriptare il file cifrato: stark (figura 24).
NOTA: Sarebbe stato possibile anche utilizzare una vecchia versione di Hashcat nota come “Legacy” (la 2.0), scaricabile da GitHub. Questa versione ha direttamente l’ “Hash Type” md5(md5($salt).$password) necessario per craccare il nostro hash e viene identificata come: 3610.
Non rimaneva altro da fare che aprire il file the_wall.txt.nc utilizzando la key appena trovata. Per identificare il tool di decrypt da utilizzare, ci venne incontro il messaggio recatoci dal corvo (Parte I – Figura 19):
“Per passare attraverso il muro, l’incantesimo mcrypt, ti sarà utile[..]”.
NOTA: se mcrypt non è installato sulla nostra distro, ci basterà utilizzare “apt-get”:
sudo apt-get install mcrypt
Provai quindi ad aprire il file con il tool, digitando:
mcrypt -d the_wall.txt.nc
- mcrypt : tool per decriptare
- -d : opzione di decrypt
- the_wall.txt.nc : file da decriptare
Quando mi fu richiesta la password digitai quella della key: stark.
Il tool decriptò il file creandone un altro con la sola estensione .txt : the_wall.txt.
E nel momento in cui eseguii il cat sul nuovo file, comparve la nostra successiva destinazione.
“Abbiamo difeso la barriera! Ti ringrazio del tuo aiuto! Adesso puoi dirigerti verso Grande Inverno” – Jeor Mormont, Comandate dei Guardiani della Notte.
“Scriverò sulla mappa il seguente percorso, per giungere più velocemente a Grande Inverno. Un giorno sarò un grande maestro” – Samwell Tarly
Enter using this user/pass combination:
User: jonsnow
Pass: Ha1lt0th3k1ng1nth3n0rth!!!
Navigando all’indirizzo http appena ottenuto, non saremmo riusciti a raggiungere la pagina. E anche sostituendo al dominio l’indirizzo IP, il risultato che si otteneva era il medesimo o quasi:
http://192.168.178.80/——W1nt3rf3ll——/
Ma ispezionando la pagina riuscii a trovare un interessante indizio, visualizzabile analizzando il contenuto tramite il tasto F12.
“Non arriverai mai a Grande Inverno in quella direzione. Sembra che tu non abbia mai imparato a leggere” – Il Mastino
“Cosa stai dicendo? VirtualHost? Che diavolo è quello? Ti sei ubriacato di nuovo?” – Gregor (La Montagna) Clegane
La tecnica del VirtualHosting
Il VurtualHosting è una metodologia impiegata sui Web Server, dove più domini possono essere allocati sulla stessa macchina condividendo lo stesso IP.
Nel nostro caso significava che l’IP della macchina CTF: 192.168.178.80, ospitava il dominio http://winterfell.7kingdoms.ctf/——W1nt3rf3ll——.
Esiste un file, sui sistemi operativi, originariamente chiamato HOSTS.TXT, che consente di tradurre nomi host in indirizzi IP. Il file contiene righe di testo costituite dall’associazione “IP – nome host” e in maniera similare, assolve la stessa funzione del Domain Name System (DNS).
Dovevamo quindi indicargli la rotta! La prima cosa che feci fu individuare la cartella di default del mio file hosts. Il percorso al file, nel mio caso, era: /etc/hosts (avrei potuto anche utilizzare il comando locate per individuarlo).
NOTA: Il percorso del file su sistemi operativi differenti
Windows – C:WindowsSystem32driversetchosts
MAC OSX – /private/etc/hosts
Utilizzando l’editor di testo vim effettuai l’accesso al file:
vim /etc/hosts
Portandomi al termine del file, entrai in modalità di inserimento schiacciando il tasto “i” ed inserii la nuova riga costituita dall’IP della macchina GOT e il dominio del VirtualHost:
192.168.178.75 winterfell.7kingdoms.ctf
Uscii dalla modalità inserimento premendo il tasto Esc e salvai il file con :wq.
La rotta giusta per giungere a destinazione
Avevamo trovato la rotta per raggiungere la nostra destinazione. Riaprii il browser ed incollai, ancora una volta, l’indirizzo del VirtualHost: http://winterfell.7kingdoms.ctf/——W1nt3rf3ll——.
Questa volta apparve la schermata di login. E noi avevamo già username e password, reperiti all’interno del file decriptato the_wall.txt:
User: jonsnow
Pass: Ha1lt0th3k1ng1nth3n0rth!!!
Finalmente, ispezionando la nuova pagina (tramite il tasto F12), scoprimmo di aver catturato la bandiera del nostro secondo regno: Kingdom of The North (http) (Mappa Parte I – Figura 13).
Benvenuto a Grande Inverno
Hai conquistato il Regno del Nord. Questa è la tua seconda flag del regno!
639bae9ac6b3e1a84cebb7b403297b79
“Dobbiamo fare qualcosa qui prima di partire per le Isole di Ferro, mia signora ” – Podrick Payne
“Sì, posso sentire la magia su quello scudo. Le spade non servono più qui” – Brienne Tarth
Adesso, la nostra prossima destinazione sarebbe stata il terzo regno “Iron Islands” – DNS! (Mappa Parte I – Figura 13).
Il Domain Name Server (DNS) viene utilizzato per tradurre un nome di un dominio in un indirizzo IP. È un po’ come se invece di fornirci lunghe coordinate di longitudine e latitudine, per comodità, ci venisse fornito l’indirizzo del posto (nome della strada, numero civico, CAP ecc.).
Prima di proseguire, però, l’indizio appena trovato ci esortava a cercare nella pagina “la magia su quello scudo […]”.
Il simbolo degli Stark faceva bella mostra di sé al centro della pagina e lo stesso emblema veniva utilizzato anche sugli scudi della casata.
Decisi quindi di dargli un’occhiata più da vicino. Salvai l’immagine cliccando su di essa con il tasto destro del mouse “Save As” e, una volta nella nostra cartella (ctf_uni), utilizzai il comando strings.
Il suddetto comando legge i dati di uno o più file oppure i dati provenienti dallo standard input, ricercando in essi delle sequenze di byte che rappresentino stringhe di caratteri visibili e lista a schermo.
strings stark_shield.jpg
Fra le numerose stringhe che il comando estrasse, ve ne era una degna di nota.
“Timef0rconqu3rs TeXT andrebbe chiesto per entrare nella fortezza delle Isole di Ferro ” – Theon Greyjoy
Aveva tutta l’aria di essere un record TXT.
Un record TXT (o record di testo) è una tipologia di record DNS che permette di associare del testo ad un host sotto forma di informazioni leggibili (anche da fonti esterne al dominio). Solitamente, vengono utilizzati a scopi di conferma della proprietà del dominio, per garantire la sicurezza delle email o per registrare piccole quantità di dati leggibili dalla macchina nel DNS.
Quindi, se la supposizione era corretta, avremmo dovuto vedere il testo contenuto nel record DNS.
Per lo scopo utilizzai il comando nslookup. Tale comando, presente in tutti i sistemi operativi, utilizza il Transmission Control Protol / Internet Protocol (TCP/IP) e consente di effettuare interrogazioni ad un server DNS.
nslookup -type=TXT Timef0rconqu3rs.7Kingdoms.ctf 192.168.178.80
- nslookup : comando per interrogare il DNS
- -type= : specifichiamo la tipologia di record
- TXT : record di tipologia “testo”
- Timef0rconqu3rs.7Kingdoms.ctf : il nome del record DNS da interrogare composto da Timef0rconqu3rs.[dominio].ctf
- 192.168.178.80 : …appartenente all’IP della macchina
Timef0rconqu3rs.7kingdoms.ctf text = “Hai conquistato la flag del regno delle Isole di Ferro: 5e93de3efa544e85dcd6311732d28f95. Adesso dovresti recarti al regno delle Terre della Tempesta http://stormlands.7kingdoms.ctf:10000 . Entra usando queste credenziali: aryastark/N3ddl3_1s_a_g00d_sword#!”
Conclusioni
A questo punto, non solo avevamo conquistato il terzo regno delle Isole di Ferro, ma avevamo anche una nuova meta e delle credenziali di accesso.
E mentre ancora il fumo si levava alto dalla fortezza delle Isole di Ferro, eravamo già salpati verso le Terre della Tempesta dove un nuovo enigma ci attendeva.
To be continued…