[HTB] Falafel writeup

Falafel è stata una delle mie macchine di Hack The Box preferite, che mi ha permesso di imparare tantissimi nuovi tricks, soprattutto nella parte web. La parte di privilege escalation è stata invece fuori dal normale, soprattutto il primo step, a dir poco esoterico! Ora vi propongo la mia soluzione a questa macchina, buona lettura :D.

Il primo step, come sempre, è stata una bella scansione delle porte:

Copy to Clipboard

Ecco qui di seguito il risultato della scansione:

Copy to Clipboard

Come si può notare ci sono due porte aperte, la porta 22 del servizio ssh e la porta 80 di un probabile servizio web.

Andiamo quindi a vedere sul browser cosa c’è sulla porta 80.

Come si può vedere dall’immagine, la scritta che salta subito all’occhio è quella di login.

Ecco qui la pagina di login, la prima cosa che possiamo provare a fare è vedere se il form è vulnerabile a SQL injection, inserendo nel login questa stringa:

Copy to Clipboard

e come password roba a caso. Notiamo subito che la pagina risponde con: Wrong identification: admin, wait a moment, ma non abbiamo scritto admin, ergo è vulnerabile :D.

Le strade da prendere ora sono due, o almeno quelle che conosco io:

  • La prima è usare sqlmap per ottenere informazioni dal db e quindi prendere le password degli utenti, ma non fa per noi, non si impara nulla con questo 😀
  • La seconda è scrivere uno script che fa il dump delle password!

Prima di vedere lo script, cerchiamo di capire brevemente come funziona quel login.

In condizioni normali, l’utente digita il suo username e la password. Quando la richiesta arriva al server, il php verifica prima che l’utente inserito esista con una query SQL, se esiste verifica che la password sia corretta (con un’altra query SQL).

Ma cosa succede se noi inseriamo “ ‘or 1 = 1 –”? La query diventa simile alla seguente:

Copy to Clipboard

ossia prende tutti gli utenti, perché la query è sempre vera! Quindi il server, vedendo che sono stati trovati utenti, prova a vedere se la password è corretta, ma ovviamente non lo è e ci dice che la password di admin non è corretta. Perché proprio admin? Perché probabilmente è il primo utente della tabella users.

Per scoprire la password possiamo inserire una stringa di questo tipo nel campo username: “admin’ and password like ‘X%’ — ”, in questo modo la query diventa una cosa del genere:

Copy to Clipboard
  

Facendo così prendiamo dal db l’utente admin se ha una password che inizia con X. Se la pagina risponde con “wrong identification: admin” vuol dire che nel db la query ha trovato una corrispondenza di un utente admin e password che inizia con X, in alternativa, se non trova niente, ci risponde “try again”, vuol dire che non c’è un utente admin con quella password.

Ecco qui di seguito lo script che fa esattamente questo:

Copy to Clipboard

Bene una volta fatto partire lo script, scopriamo che la password di admin è codificata con un hash ed è la seguente:

Copy to Clipboard

Ora che abbiamo l’hash possiamo provare a craccarla su crackstation.net, ma li scopriamo che non c’è una corrispondenza, quindi niente password. Proviamo allora ad usare la tecnica di poco fa per vedere se ci sono altri utenti (modificando la logica della query). In questo modo scopriamo che c’è un altro utente di nome chris. Possiamo quindi usare di nuovo lo script di prima per prendere la sua password e bingooo:

Copy to Clipboard

passando l’hash al sito crackstation.net ci restituisce la seguente password:

Copy to Clipboard

Bene, ora abbiamo l’accesso come utente chris al sito. Una volta loggati ci ritroviamo davanti a questa schermata:

L’unica cosa interessante che troviamo qui è la scritta nella pagina profilo di chris. Da come si può leggere nell’immagine sopra, ci sta dicendo che il suo lavoro (juggler) a volte si avvicina al suo hobby (hacking), non ci sarà mica una vulnerabilità collegata al juggling? Ovviamente sì e si chiama PHP juggling type! Qui di seguito un link di Owasp dove viene spiegata bene: https://www.owasp.org/images/6/6b/PHPMagicTricks-TypeJuggling.pdf.

Tornando a noi, probabilmente ci sarà un valore che avrà lo stesso match dell’hash di admin, infatti, cercando type juggling su Google, troviamo questo link Github: e guarda a caso la nostra hash di admin corrisponde al valore: 240610708.

Perfetto, ora possiamo entrare come admin sul sito!

La prima cosa che ci troviamo davanti è un form di upload di immagini, facendo varie prove non c’è stato modo di passargli un’immagine con un payload da eseguire, nemmeno un file php poiché viene fatto il controllo sull’estensione del file, quindi accetta solo file jpeg o png.

Il nostro obiettivo quindi è cercare di caricare uno script php sul server ed eseguirlo per aprire una shell, però ovviamente apache esegue codice php se e solo se questo è contenuto in un file che ha estensione php. Come bypassare il controllo sull’estensione del file in modo da poter caricare un file .php? Esaminando attentamente la richiesta con Burp notiamo subito che il caricamento dell’immagine viene fatta tramite wget sul link passato nel form di upload:

Il comando wget ottiene un file da un indirizzo web e lo salva in locale, chiamandolo esattamente con il nome del link. In un sistema operativo, però, c’è una lunghezza massima al nome del file, cosa succede quindi se proviamo a caricare un file con un nome troppo grande??

Yeah, da come si può vedere nell’immagine sopra, wget non ha potuto salvare l’immagine con il nome intero, poiché per il sistema operativo era troppo lungo e quindi ci ha tagliato l’ultima parte .jpg, salvando finalmente il nostro script php!

Lo script utilizzato è stato preso da questo sito, http://pentestmonkey.net/tools/web-shells/php-reverse-shell, una semplice reverse shell in php. Quindi non ci resta che richiamare lo script e aprire una reverse shell:

Perfetto siamo dentro il server come utenti www-data. Ora procediamo con la privilege escalation e proviamo a prendere il primo utente. Come prima cosa notiamo che nel sistema ci sono altri due utenti: moshe e yossi. Esaminando anche i file del sito web, ne troviamo uno interessante “connection.php” dove dentro ci sono le credenziali di moshe per il database, proviamo a vedere se siamo fortunati usando queste credenziali con ssh:

e si, siamo riusciti ad entrare con l’utente moshe! Prendiamo subito la flag dal file user.txt e andiamo avanti, cercando di prendere l’utente yossi!

Dopo aver esaminato il sistema con lo script Linenum.sh (https://github.com/rebootuser/LinEnum/blob/master/LinEnum.sh), è saltato fuori questo particolare:

Copy to Clipboard

ossia l’utente moshe appartiene a gruppi differenti rispetto all’utente yossi, questo vuol dire che ha permessi diversi nel sistema rispetto a yossi!

Tra i gruppi di moshe, dopo averli esaminati tutti e aver visto i file che sono coinvolti con quei gruppi, si può giungere alla conclusione che il gruppo interessante è video, che da’ i permessi di leggere il file “/dev/fb0”. Questo file è una rappresentazione dello schermo. Forse, catturando l’immagine di questo file compare qualcosa. Ci scarichiamo quindi il file “/dev/fb0” per poterlo aprire in un qualche modo. Cercando su Google ho trovato uno script da questo sito:

Copy to Clipboard

che non fa altro che aprire l’immagine raw (ossia il file fb0) e convertirlo in png. L’unico problema è che vuole una risoluzione, ma qual’è la risoluzione di falafel? Semplice, basta vedere il contenuto di questo file:

Copy to Clipboard

prendiamo questa risoluzione e diamola allo script insieme al file raw:

Copy to Clipboard

dove video2.data è il file fb0 scaricato dal server. Ed ecco il risultato:

Cool! Ora possiamo entrare come utente yossi, e prendere finalmente l’utente root! La strada da qui in poi è più semplice, poiché abbiamo già scoperto che dobbiamo guardare i gruppi dell’utente yossi per scoprire come prendere l’utente root. Tra i gruppo dell’utente yossi c’è “disk” che è il gruppo collegato ai dischi della macchina, ossia chi è in questo gruppo può leggere l’intero hard disk, quindi potenzialmente può leggere anche tutti i file di root! In aiuto ci viene il comando debugfs che ci permette di lanciare comandi sull’intero file system del disco senza doverlo montare! Quindi per prendere la flag di root ci basta dare il seguente comando:

Copy to Clipboard

o se vogliamo essere più fini, possiamo prendere un’eventuale chiave ssh per accedere come root:

Copy to Clipboard

Ovviamente la chiave c’è e quindi sono entrato come utente root:

Adesso siamo amministratori del sistema;)

IMMAGINI: LINK1 LINK2

Commenti recenti

    Recent Tweets

    For privacy reasons Twitter needs your permission to be loaded.
    I Accept
    2018-06-26T07:03:08+00:00

    About the Author:

    Dottore in Informatica. Da sempre appassionato di Linux, reti informatiche, sicurezza e, in modo amatoriale, all’elettronica. Il mio intento è quello di trasmettere le mie conoscenze ad altri appassionati.

    Leave A Comment

    Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.