Rubrica Wargame: Imparare ad utilizzare il terminale con Bandit [Livello 1-13]

Tempo di lettura: 11 minuti
Data pubblicazione: May 31, 2016

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.

Livello 0

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

Livello 1

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.

Livello 2

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.

Livello 3

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.

Livello 4

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:

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

Livello 5

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

Livello 6

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

Livello 7

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

Livello 8

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"
lvl8
lvl8

Dove:

  • -r è ricorsivo;
  • -n esplicita il numero di linea nel file (17524 in questo caso);
  • -w specifica che bisogna trovare la parola esatta;
  • -e la parola da trovare.

La password è quindi cvX2JJa4CFALtqS87jk27qwqGhBM9plV.

Livello 9

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

Livello 10

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.

Livello 11

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ì:

lvl11
lvl11

Livello 12

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

Livello 13

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.

lvl13
lvl13
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!