Rubrica Wargame: Superare le prime sfide con Hacker Test [Livello 1-20]

Tempo di lettura: 10 minuti
Data pubblicazione: April 26, 2017

Da qualche tempo sto stilando una lista di prove pratiche e sfide di hacking distinte per livello e mi sono imbattutto per puro caso in HackerTest.net, un sito che propone diversi livelli da superare e sfide di difficoltà crescente. Preso dalla curiosità, ho iniziato a farlo, fino a che non mi ha preso completamente e l’ho completato.

Una volta finito mi son reso conto della semplicità unica delle sfide, basate quasi sempre su inganni e sorte di caccie al tesoro. In certi livelli viene da pensare e ripensare a cosa possa essere, quando la soluzione sta sotto agli occhi. Sebbene semplice, ammetto di essermi divertito e in questo articolo troverete le soluzioni alle varie sfide.

Avessi una classifica “n00b” lo metterei categoricamente al primo posto, serve solamente un pò di voglia di sfidare se stessi e saper leggere il codice sorgente di pagine web. Happy hacking!

Livello 1

Livello 1
Livello 1

Pensate ci possa essere qualche tipo di vulnerabilità? Magari una SQLInjection da testare con sqlmap? No! In queste sfide tutto sta nel codice sorgente, tutto! Leggetelo sempre bene, riga per riga per trovare eventuali indizi e in poco arriverete alla fine del wargame prima di finire la lettura dell’articolo.

Come detto, guardo il codice, trovo la funzione cosi definita

<<span class="start-tag">script</span> <span class="attribute-name">language</span>=<a class="attribute-value">JavaScript</a>>
<span id="line50"></span>{
  <span id="line51"></span>var a="null";
  <span id="line52"></span>function check()
  <span id="line53"></span>{
    <span id="line54"></span>if (document.a.c.value == a)
    <span id="line55"></span>{
       <span id="line56"></span>document.location.href="http://www.hackertest.net/"+document.a.c.value+".htm";
       <span id="line57"></span>}
    <span id="line58"></span>else
   <span id="line59"></span>{
     <span id="line60"></span>alert ("Try again");
     <span id="line61"></span>}
  <span id="line62"></span>}
<span id="line63"></span>}
<span id="line64"></span></<span class="end-tag">script</span>>

La password è chiaramente null e passo al prossimo livello.

Livello 2

Livello 2
Livello 2

Sembra non sia possibile vedere il codice sorgente, ma basta digitare

view-source:www.hackertest.net/null.htm

Cerchiamo come prima la password, che risulta essere l3l.

Soluzione livello 2
Soluzione livello 2

Livello 3

Livello 3
Livello 3

Come prima, guardiamo il codice sorgente

<<span class="start-tag">body</span> <span class="attribute-name">onload</span>=<a class="attribute-value">javascript:pass();</a> <span class="attribute-name">alink</span>="<a class="attribute-value">#000000</a>">
<span id="line11"></span><<span class="start-tag">SCRIPT</span> <span class="attribute-name">LANGUAGE</span>="<a class="attribute-value">JavaScript</a>">
<span id="line12"></span>function pass() <span id="line13"></span>{
  <span id="line14"></span>var pw, Eingabe;
  <span id="line15"></span>pw=window.document.alinkColor;
  <span id="line16"></span>Eingabe=prompt ("Please enter password");
  <span id="line17"></span>if (Eingabe==pw) <span id="line18"></span>{
    <span id="line19"></span>window.location.href=String.fromCharCode(97,98,114,97,101)+".htm";
    <span id="line20"></span>}
  <span id="line21"></span>else  <span id="line22"></span>{
    <span id="line23"></span>alert("Try again");
  <span id="line24"></span>}
<span id="line25"></span>}
<span id="line26"></span></<span class="end-tag">SCRIPT</span>>

Si nota subito che pw è uguale ad aLinkColor, che possiamo vedere poco sopra (#000000)

Livello 4

Livello 4
Livello 4

Stesso procedimento di prima, la password è presente nel codice ed è SAvE-as hELpS a lOt.

Livello 6

Livello 6
Livello 6

Ora nel codice sorgente c’è un link ad uno script, che conterrà la nostra password (hackertestz).

Soluzione livello 6
Soluzione livello 6

Livello 7

Livello 7
Livello 7

In questo livello ammetto di essermi soffermato del tempo, troppo probabilmente. Più che altro perchè ancora non mi era chiara l’antifonia del gioco, e mi sono ostinato a trovare vulnerabilità (testando sia manualmente sia con sqlmap), provare bruteforce con hydra e mille altre vie.

In realtà, se guardiamo con attenzione il codice sorgente, c’è il tag body che rimanda ad una gif, quando lo sfondo è completamente nero. Una volta aperta l’immagine, guardando con attenzione si trovano i dati per il livello successivo.

Soluzione livello 7
Soluzione livello 7

Username: path Password: jerkybar3

Livello 8

Livello 8
Livello 8

Guardando nel codice sorgente, stavolta non c’è nulla. C’è solo uno strano commento

<span id="line6"></span><span class="comment"><!-- YOU'RE LOOKING IN THE WRONG PLACE... GO BACK! --></span>

No, indietro non c’è nulla. Possiamo però guardare avanti, ossia il codice sorgente di _http://www.hackertest.net/phat.php_, nel quale si trova un’altra immagine bianca con un indizio nel solito posto nascosto: “Look for a .PhotoShopDocument!"__.

Visto che non ci sono altri indizi, cambio il path dell’indirizzo e vado su _http://www.hackertest.net/phat.psd_. Scarico il file e lo apro con GIMP. Sotto una serie di layer si trovano le credenziali del livello.

Soluzione livello 8
Soluzione livello 8

Username: zadmin Password: stebbins

Livello 9

Livello 9
Livello 9

Sembra non ci sia nulla nel codice, ma guardando attentamente è lungo qualche migliaio di riga. Circa a metà, troviamo la password, codificata in base64.

Password codificata
Password codificata

Con base64 la decodifico e aggiungo l’estensione .php.

┌─[✗]─[mrtouch@parrot]─[~]
└──╼ $echo Z2F6ZWJydWg= | base64 -d
gazebruh

Livello 10

Livello 10
Livello 10

Questo è un altro livello su cui mi sono fissato non poco. L’indizio è in realtà nella descrizione del sito, bisogna prendere le lettere in corsivo, unirle ed utilizzarle come password. Chiaramente la prima è maiuscola ma è da inserire come minuscola…

Password: shackithalf

La pagina darà poi un errore. Guardando il codice sorgente, si trova l’indirizzo del livello 11 (rofl.php).

Livello 11

Livello 11
Livello 11

Si ritorna alle origini, l’indirizzo del livello successivo si trova tra le prima righe del codice sorgente

<span class="error" title="Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”."><<span class="start-tag">html</span>></span>
<span id="line2"></span><<span class="start-tag">head</span>>
<span id="line3"></span><<span class="start-tag">meta</span> <span class="attribute-name">http-equiv</span>="<a class="attribute-value">Content-Language</a>" <span class="attribute-name">content</span>="<a class="attribute-value">en-us</a>">
<span id="line4"></span><<span class="start-tag">meta</span> <span class="attribute-name">name</span>="<a class="attribute-value">robots</a>" <span class="attribute-name">content</span>="<a class="attribute-value">noindex</a>">
<span id="line5"></span><<span class="start-tag">meta</span> <span class="attribute-name">name</span>="<a class="attribute-value">robots</a>" <span class="attribute-name">content</span>="<a class="attribute-value">goto: clipart.php</a>">

Livello 12

Livello 12
Livello 12

Sempre nel codice sorgente, sempre nelle prime righe c’è un indizio: “use graphic software”. Andiamo quindi a visionare l’immagine logo.jpg nel quale si trova il percorso del nuovo livello (puta.php).

Soluzione livello 12
Soluzione livello 12

Livello 13

Livello 13
Livello 13

Stessa cosa, ma l’immagine è ora lvl13.gif. Senza usare software, basta zommarla.

Soluzione livello 13
Soluzione livello 13

Nella pagina xml troviamo un altro indirizzo (4xml.php), che ci porta al prossimo livello.

Livello 14

Livelo 14
Livelo 14

Questa volta non basta zommare, ma bisogna aprire l’immagine con un software di grafica (come GIMP) per trovare l’indirizzo (totally.php).

Soluzione livello 14
Soluzione livello 14

Livello 15 e 16

Livello 15
Livello 15

L’immagine indicata risulta rotta e non si apre con nessun software di grafica. Ma se andiamo ad aprirla con hexdump o cat, troviamo un piccolo indizio

Indizio: Unavailable
Indizio: Unavailable

Andando a visitare quella pagina, troviamo nel codice sorgente un altro indizio (_/images). _In hackertest.net/unavailable/images troviamo un’immagine di sfondo, anche questa corrotta.

Se osserviamo bene con hexdump si nota la nuova pagina di destinazione, ducky.php.

Secondo indizio del livello
Secondo indizio del livello

Con un paio di tentativi si trova l’url del prossimo livello _(http://www.hackertest.net/unavailable/Ducky.php_).

Livello 17

Livello 17
Livello 17

Nelle prime righe del codice sorgente si trova la password, che è il nostro indirizzo IP. Una volta inserito, viene ritornato un errore e l’url del prossimo livello.

Warning: Cannot modify header information - headers already sent by (output started at /home3/jskenned/public_html/hackertest/unavailable/Ducky.php:12) in /home3/jskenned/public_html/hackertest/unavailable/Ducky.php on line 58
../level18.shtml

Livello 18

Livello 18
Livello 18

E cosa penserà mai un noob? Inseriamo **_password _**e viene restituito il livello 19.

Livello 19

Livello 19
Livello 19

Guardando il codice sorgente, troviamo l’immagine level20_pass.gif. Aprendola con un softwaredi grafica, troviamo un indizio.

Soluzione livello 19: **gazebruh2.html**
Soluzione livello 19: **gazebruh2.html**

Livello 20

Livello 20
Livello 20

Ora troviamo due stringhe. Una è un’immagine, mentre l’altra è possibile copiarla in modo immediato. Visto che non ho trovato nessun software OCR che riconosceva la prima stringa, l’ho lasciata perdere e son passato direttamente alla seconda (sembrava molto una trollata il dover copiare tutto).

La seconda stringa è codificata in base64, dopo un paio di decodifiche si trovano i caratteri.

mrtouch@mrtouch:~$ echo VldwSk5Gb3lVa2hQUjJSclRUSlJlbFJITlU5TlIwNTBWbTE0YTFJelVqSlpNakF4WWtkT2NFNVlWbUZYUmtZeVYycEtTbG95U25SUFZFNU5Xbm93T1QwOT09 | base64 -d
VWpJNFoyUkhPR2RrTTJRelRHNU9NR050Vm14a1IzUjJZMjAxYkdOcE5YVmFXRkYyV2pKSloySnRPVE5NWnowOT09==
 
mrtouch@mrtouch:~$ echo VWpJNFoyUkhPR2RrTTJRelRHNU9NR050Vm14a1IzUjJZMjAxYkdOcE5YVmFXRkYyV2pKSloySnRPVE5NWnowOT09 | base64 -d
UjI4Z2RHOGdkM2QzTG5OMGNtVmxkR3R2Y201bGNpNXVaWFF2WjJJZ2JtOTNMZz09

mrtouch@mrtouch:~$ echo UjI4Z2RHOGdkM2QzTG5OMGNtVmxkR3R2Y201bGNpNXVaWFF2WjJJZ2JtOTNMZz09 | base64 -d
R28gdG8gd3d3LnN0cmVldGtvcm5lci5uZXQvZ2Igbm93Lg==

mrtouch@mrtouch:~$ echo R28gdG8gd3d3LnN0cmVldGtvcm5lci5uZXQvZ2Igbm93Lg | base64 -d
Go to www.streetkorner.net/gb now.

Il sito non esiste, infatti se guardiamo nel codice sorgente della precedente pagina viene dato un altro indizio: “Change domain, add “22332” at the end, reach it and then get hold of …”.

Quindi, come consigliato, cambiamo dominio e aggiungiamo 22332 alla fine, ottendendo http://www.hackertest.net/gb22332.

Errore 505 (?)
Errore 505 (?)

VIsto che l’errore 505 chiaramente non esiste, provo ad indovinare il nuovo indirizzo della nuova pagina, trovandola in _http://www.hackertest.net/505_.

Nuovo indizio
Nuovo indizio

Stesso pattern di prima, visitiamo la nuova pagina, trovando la frase

**What is the answer to life, the universe, and everything?**Chi non ha mai letto "Guida galattica per gli autostoppisti” non lo saprà, ma è 42 (e vi consiglio vivamente il libro!).

Con qualche altro tentativo si trova la nuova pagina, _http://www.hackertest.net/42.php_, nella quale c’è un link.

Soluzione livello 20
Soluzione livello 20

Ci ho messo un pò per raggiungere questa schermata, in quanto mi ha dato problemi a passare il refererr sia con Firefox che con Chrome. Con safari alla fine ha funzionato.

Conclusione

Come detto all’inizio, la sfida è tutt’altro che difficile, anzi. Il motivo per cui l’ho voluta pubblicare è che mi ha strappato qualche sorriso nel trovare le soluzioni alle volte cosi banali. Leggo in rete che potrebbero esistere altri livelli, lascio al lettore la possibilità di segnalare altri percorsi!