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!
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.
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.
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)
Stesso procedimento di prima, la password è presente nel codice ed è SAvE-as hELpS a lOt.
Ora nel codice sorgente c’è un link ad uno script, che conterrà la nostra password (hackertestz).
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.
Username: path Password: jerkybar3
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.
Username: zadmin Password: stebbins
Sembra non ci sia nulla nel codice, ma guardando attentamente è lungo qualche migliaio di riga. Circa a metà, troviamo la password, codificata in base64.
Con base64 la decodifico e aggiungo l’estensione .php.
┌─[✗]─[mrtouch@parrot]─[~]
└──╼ $echo Z2F6ZWJydWg= | base64 -d
gazebruh
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).
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>">
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).
Stessa cosa, ma l’immagine è ora lvl13.gif. Senza usare software, basta zommarla.
Nella pagina xml troviamo un altro indirizzo (4xml.php), che ci porta al prossimo livello.
Questa volta non basta zommare, ma bisogna aprire l’immagine con un software di grafica (come GIMP) per trovare l’indirizzo (totally.php).
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
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.
Con un paio di tentativi si trova l’url del prossimo livello _(http://www.hackertest.net/unavailable/Ducky.php_).
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
E cosa penserà mai un noob? Inseriamo **_password _**e viene restituito il livello 19.
Guardando il codice sorgente, troviamo l’immagine level20_pass.gif. Aprendola con un softwaredi grafica, troviamo un indizio.
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.
VIsto che l’errore 505 chiaramente non esiste, provo ad indovinare il nuovo indirizzo della nuova pagina, trovandola in _http://www.hackertest.net/505_.
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.
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.
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!