Capture The Flag: alla ricerca di vulnerabilità in sistemi e software - Cyber Security 360

TECNICHE DI HACKING

Capture The Flag: alla ricerca di vulnerabilità in sistemi e software

Il Capture The Flag è una delle tecniche di hacking più utilizzate per ricercare vulnerabilità nei software e nei sistemi: una vera e propria competizione che ci vede impegnati nella conquista di tanti “regni virtuali” che rappresentano il nostro sistema bersaglio. Ecco le regole del gioco

25 Mag 2021
D
Vincenzo Digilio

ICT Security Manager & Co-founder of Cyber Division

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.

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:

[QUIZ] SECURITY/BACKUP
Protezione dei dati: sei sicuro di avere una strategia efficace? Scoprilo nel Quiz
Big Data
Sicurezza
  1. problems_in_the_north.txt
  2. 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

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).

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[..]”.

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.

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.

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).

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).

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.

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

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…

Digital event, 15 giugno
CyberSecurity360Summit: cyber risk, normative e strategie per vincere le sfide della sicurezza
Legal
Sicurezza
@RIPRODUZIONE RISERVATA

Articolo 1 di 5