Cosa è IO?

IO è una ctf, che per chi non lo sapesse le ctf (capture the flag) sono delle “sfide” in questo caso di reverse engineering e binary exploitation. Il tuo scopo in questo caso è quello di fare un privilege escalation ovvero cercare un modo per passare da un utente con meno privilegi amministrativi ad un utente con più privilegi amministrativi.

Come si gioca?

Per poter giocare bisogna collegarsi tramite ssh ( è un protocollo che permette di stabilire una sessione remota cifrata tramite interfaccia a riga di comando). Per collegarsi da un os Linux sarà sufficiente utilizzare il seguente comando:

ssh level1@io.netgarage.org

di cui la password sara: level1

oppure da windzozzo utilizzando Putty scaricabile da qui.

 

Ora dobbiamo spostarci nella directory contenete tutti i programmi da exploitare con il comando

cd /levels/

Ora se diamo ls -l noteremo che tutti i programmi eseguibili hanno il bit -s attivo.

Il bit -s, ovvero il bit suid è un particolare permesso (in linux) che ci permette di impersonificare un altro utente per eseguire un determinato programma, detto ciò se noi in qualche modo riusciamo ad exploitare i programmi con questo particolare bit potremmo far eseguire codice arbitrario ad un altro utente quindi effettuare un privilege escalation.

OK! detto ciò eseguiamo il programma level01, che poi e l’unico che possiamo eseguire con questo utente, da notarsi che per questo programmino non abbiamo a disposizione il codice sorgente.

Eseguendo il programma ci verrà richiesto di inserire 3 numeri per proseguire. Ora per superare questo muro potremmo semplicemente creare un brutforce in python e il gioco sarebbe fatto, ma oggi vorrei mostrarvi un altro metodo più complesso, ma più ingegnoso che mi fornirà la scusa per insegnarvi un po’ di reverse engineering.

Se ci fermiamo un attimo a pensare potremmo dire che al inizio c’era un codice sorgente dove c’era al suo interno un’istruzione IF che comparava l’input del utente con la password, poi il sorgente è passato dentro un compilatore che lo ha trasformato in codice macchina (uni e zeri). Pero in qualche modo l’eseguibile dovrà fare un controllo per vedere se la password e corretta.

Quindi potremmo andare a vedere il codice assembly con gdb (GNU debugger).

allora vediamo che le prime due istruzioni sono push e call queste due istruzioni le approfondiremo in seguito ora vi basti sapere che push mette qualcosa sulla memoria RAM e call prende qualcosa dalla memoria RAM.

la terza istruzione è un compare (cmp) che compara l’input precedentemente salvato sul registro eax con il valore esadecimale 10f (0x serve solo per dire che quello che viene dopo e in base 16).

Ora andiamo a tradurre 10f in ascii (potete farlo manualmente o con dei convertitori online) e otterremo un shell sh come level2 (questo livello è stato molto semplice, ma già dal prossimo saranno bestemmie).

Ora con cat /home/level2/.pass andiamo a catturare la prima flag ovvero la password di level2.

Categorie: CTF

0 commenti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *