Con questo articolo inizia un’altra rubrica del blog! Ho pensato di farlo sugli Wargame poiché possono essere un ottimo punto di partenza per chiunque voglia iniziare ad entrare nel campo della sicurezza informatica. Le soluzioni saranno sotto spoiler, e prima di controllarle, consiglio vivamente di provare, cercare sui motori di ricerca e documentarsi in modo da poter imparare autonomamente.
Il gioco che introdurrò e spiegherò livello per livello sarà Bandit. Esso è uno dei giochi più semplici in circolazione, adatto soprattutto a chi abbia poca capacità con il terminale e voglia capire come potersi destreggiare in esso.
In questo livello l’obbiettivo è quello di collegarsi tramite SSH al loro server. Il comando permetterà di creare una sessione remota cifrata al server e poter leggere (o scrivere) i file al suo interno.
Il comando è davvero semplice, su Linux
ssh bandit0@bandit.labs.overthewire.org
ed inserisco la password bandit0
In questo modo mi connetto al server con l’account bandit0
Anche qui il livello è davvero basilare, la richiesta è quella di leggere il file readme da terminale e utilizzare la password per collegarsi al livello successivo.
Sempre da terminale, utilizzando la sessione creata precedentemente
ls
cat readme
boJ9jbbUNNfktd78OOpsqOltutMc3MY1
Mi connetto quindi all’account bandit1 con la password trovata.
Come prima, bisogna leggere il file contenente la password, ma stavolta il file ha un nome particolare. Se non sapete come fare, una ricerca potrebbe aiutarvi.
Una delle tante può essere
cat ./-
CV1DtqXWVFXTvM2F0k09SHz0YwRINYA9
E mi connetto all’account bandit2 con la password trovata.
Il file da leggere ora contiene degli spazi, e contiene come al solito le credenziali per accedere al livello successivo.
Per leggerlo basta cliccare il tasto TAB, oppure digitare direttamente
ls
cat spaces\ in\ this\ filename
UmHadQclWmgdLOKQ3YNgjWxGoRMb5luK
Passo al livello successivo con l’account bandit3.
La password è ora in un file nascosto, quindi digitando
ls
non vediamo nulla. Ma in linux, i file nascosti come sono nominati? Le soluzioni possono essere due:
Digitare
ls -a ./ ../ .hidden cat .hidden
in modo che visualizzi tutti i file presenti 2. Digitare
cat
e premere TAB, in questo modo sarà selezionato l’unico file presente nella cartella
La password è quindi: pIwrPrtPN36QITSp3EQaw936yaFoFgAB
Passo al prossimo livello con l’account bandit4.
Ora ci sono 10 file, in uno dei quali è presente la password. La tecnica per aprirli è la stessa del livello 2, posso decidere se aprirli uno alla volta o con un unico comando.
Digito
ls
cat ./-file0*
In questo modo mi apre tutti i file che cominciano con _-file0 _e posso subito scovare la password che è koReBOKuIDDepwhWk7jZC0RTdopnAYKh
Con questo livello si inizia ad aumentare la difficoltà. La richiesta è la solita, trova il file con la password. Ma stavolta ci sono più di venti cartelle con altrettanti file, nei quali alcuni sono leggibili altri no; in sostanza non possiamo leggerli tutti, la password non la troveremo. Gli indizi datoci sono che:
Ci possono venire incontro diversi comandi, a partire da find, du e ls.
Il primo pensiero che ho avuto è stato: “Quanti file da 1033 byte ci saranno?” Ho quindi cercato subito solo con questa opzione
find maybehere*/ -size 1033c
maybehere07/.file2
cat maybehere07/.file2
DXjZPULLxYr17uwoI01bNLQbtFemEgo7
Ed ecco che senza fare molti giri l’ho trovato subito
Il file si trova ora da qualche parte sul server, è grande 33 bytes, di proprietà del gruppo _bandit6 _e dell’utente bandit7. Il comando find in questo caso è decisamente ciò che fa per noi.
find / -size 33c -group bandit6 -user bandit7
In questo modo trovo l’unico file con queste caratteristiche
cat /var/lib/dpkg/info/bandit7.password
HKBPTKQnIay4Fw76bEy8PVxKEDQRKTzs
Dopo averci introdotto all’utilizzo del comando find ora passiamo ad altri comandi, come grep e sort. La password si trova dopo la parola millionth nel file data.txt. Non so voi, ma qualche porcone mi è partito aprendo il file utilizzanto cat. Certo, si può imbrogliare e cercare direttamente dal terminale, ma provate ad utilizzare uno dei due comandi suggeriti qui sopra!
Io ho provato con grep. Il comando ti permette linee all’interno di file che corrispondono ai parametri passati. Digitando
grep -nrw data.txt -e "millionth"
Dove:
La password è quindi cvX2JJa4CFALtqS87jk27qwqGhBM9plV.
Devo ammettere che questa non la sapevo, ho dovuto leggere i manuali dei comandi. La richiesta è abbastanza semplice, la password si trova nella linea di testo che viene ripetuta solo una volta, quindi unica. Consiglio sort unito al comando uniq.
Con sort ordino il file data.txt, e contemporaneamente (comando | ) con uniq cerco la linea unica (opzione -u).
bandit8@melinda:~$ sort data.txt | uniq -u
UsvVyFSfZZWbi6wgC7dAFyFuR6jQQUhR
La richiesta è simile a quella precedente, ma stavolta il file contiene pochi caratteri ASCII e se viene utilizzato il comando precedente non si trova la stringa. L’unico indizio che abbiamo è che davanti a sè ha una serie di “=”.
Ho preso una via un pò più ostica, ma che ha funzionato. Come due livelli fa, uso il comando grep
grep -nrw data.txt -e "=" --text
Con l’opzione _–text _indico al comando che è un file di tipo testo. Stampa comunque un bel pò di linee a caso, ma salta subito all’occhio la password da trovare: truKLdjsbJ5g7yyJ2X2R0o3a5HQJFuLk.
Sempre un file contenente la password, ma stavolta è codificate in base64. Si può fare manualmente (ma non sarebbe la via giusta), oppure con un comando su linux.
Come al solito le modalità sono diverse, ecco ciò che ho fatto
bandit10@melinda:~$ strings data.txt | base64 --decode
The password is IFukwKGsFW8MOq3IRFqrxE1hxTNEbUPR
Con strings visualizza cosa c’è all’interno del file, e passa il dato al comando base64 per poterlo decodificare. Avrei anche potuto fare così:
Nel file data c’è una stringa, ma tutti i caratteri minuscoli e maiuscoli sono stati sostuiti con quelli posti 13 posizioni più avanti nell’alfabeto (secondo quindi il cifrario alfabetico ROTR13). Per chi non avesse idea di dove iniziare, consiglio il comando tr, e se proprio non riuscite, la pagina ROTR13 in inglese.
Il comando tr permette di rimpiazzare o rimuovere specifici caratteri passati come input. Quindi posso “dirgli” di traslare i caratteri maiuscoli (e minuscoli) ‘A-Z’ in ‘N-ZA-M’ (e ‘a-z’ in ‘n-za-m’), ossia di 13 caratteri.
bandit11@melinda:~$ strings data.txt | tr 'A-Za-z' 'N-ZA-Mn-za-m'
The password is 5Te8Y4drgCRfCx8ugdwuEX8KFC6k2EUu
Ed eccoci a metà del gioco! Per chiunque conosca i semplici comandi di linux fino a qui può esser stato decisamente semplice..vediamo come ve la cavate con i prossimi livelli!
La richiesta è ora decisamente più ostica rispetto alle precedenti. Nel file data.txt è presente un dump esadecimale, compresso più volte. Il sito consiglia (e come lui, anche io) di creare una cartella in /tmp/vostronome e copiare il file data.txt li dentro. I comandi per questo sono:
bandit12@melinda:~$ mkdir /tmp/hacktips
bandit12@melinda:~$ cp data.txt /tmp/hacktips
bandit12@melinda:~$ cd /tmp/hacktips
Per risolvere l’enigma, consiglio di partire da questa ricerca e utilizzare molto il comando file, il quale ci permetterà di capire con che tipo di file abbiamo a che fare. I passi in questo livello saranno molti e piuttosto ripetitivi.
Per prima cosa con il comando xxd inverto il dump e lo faccio tornare alla forma originale
xxd -r data.txt data
Se lo apro però sono ancora caratteri casuali. Per scoprire che tipo di file è
file data
Essendo un file gzip compresso, devo decomprimerlo, con il comando
mv data.out data.gz
gzip -d data.gz
Ora ho un file data che a sua volta è compresso. Che tipo di file è? Ripeto il comando file per scoprirlo, e a sua volta lo decomprimo. I passi sono molteplici, ma sempre gli stessi. Lascio lo screen e un’altro spoiler con il codice.
bandit12@melinda:/tmp/hacktips$ file data.out
data.out: gzip compressed data, was "data2.bin", from Unix, last modified: Fri Nov 14 10:32:20 2014, max compression
bandit12@melinda:/tmp/hacktips$ mv data.out data.gz
bandit12@melinda:/tmp/hacktips$ gzip -d data.gz
bandit12@melinda:/tmp/hacktips$ file data
data data.txt
bandit12@melinda:/tmp/hacktips$ file data
data: bzip2 compressed data, block size = 900k
bandit12@melinda:/tmp/hacktips$ bzip2 -d data
bzip2: Can't guess original name for data -- using data.out
bandit12@melinda:/tmp/hacktips$ file data.
data.out data.txt
bandit12@melinda:/tmp/hacktips$ file data.out
data.out: gzip compressed data, was "data4.bin", from Unix, last modified: Fri Nov 14 10:32:20 2014, max compression
bandit12@melinda:/tmp/hacktips$ mv data.out data.gz
bandit12@melinda:/tmp/hacktips$ gzip -d data.gz
bandit12@melinda:/tmp/hacktips$ file data
data: POSIX tar archive (GNU)
bandit12@melinda:/tmp/hacktips$ tar -xf data
bandit12@melinda:/tmp/hacktips$ file data
data data.txt data5.bin
bandit12@melinda:/tmp/hacktips$ file data5.bin
data5.bin: POSIX tar archive (GNU)
bandit12@melinda:/tmp/hacktips$ tar -xf data5.bin
bandit12@melinda:/tmp/hacktips$ file data
data data.txt data5.bin data6.bin
bandit12@melinda:/tmp/hacktips$ file data6.bin
data6.bin: bzip2 compressed data, block size = 900k
bandit12@melinda:/tmp/hacktips$ bzip2 -d data6.bin
bzip2: Can't guess original name for data6.bin -- using data6.bin.out
bandit12@melinda:/tmp/hacktips$ file data6.bin.out
data6.bin.out: POSIX tar archive (GNU)
bandit12@melinda:/tmp/hacktips$ tar -xf data6.bin.out
bandit12@melinda:/tmp/hacktips$ file data
data data.txt data5.bin data6.bin.out data8.bin
bandit12@melinda:/tmp/hacktips$ file data8.bin
data8.bin: gzip compressed data, was "data9.bin", from Unix, last modified: Fri Nov 14 10:32:20 2014, max compression
bandit12@melinda:/tmp/hacktips$ mv data8.bin data8.gz
bandit12@melinda:/tmp/hacktips$ gzip -d data8.gz
bandit12@melinda:/tmp/hacktips$ file data
data data.txt data5.bin data6.bin.out data8
bandit12@melinda:/tmp/hacktips$ file data8
data8: ASCII text
bandit12@melinda:/tmp/hacktips$ cat data8
The password is 8ZjyCRiBWFYkneahHwxCv3wb2a1ORpYL
Questo livello era decisamente macchinoso, ma tutto sommato il gioco calza davvero alla perfezione per chiunque voglia imparare linux e i comandi base. Nei prossimi livelli il livello di difficoltà aumenterà, per cui ho deciso di dividere la rubrica in due (invece che fare più pagine, come avevo pensato inizialmente). Tra pochi giorni pubblicherò il seguito!