Level 02

<aside> đźš©

Trovare una vulnerabilità che permette l’esecuzione di programmi arbitrari

</aside>

L’obiettivo della sfida è l’esecuzione del programma /bin/getflag con i privilegi dell’utente flag02

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <stdio.h>
int main(int argc, char **argv, char **envp)
{
	char *buffer;
	gid_t gid;
	uid_t uid;
	
	gid = getegid();
	uid = geteuid();
	setresgid(gid, gid, gid);
	setresuid(uid, uid, uid);
	
	buffer = NULL
	asprintf(&buffer, "/bin/echo %s is cool", getenv("USER"));
	printf("about to call system(\\"%s\\")\\n", buffer);
	
	system(buffer);
}

Strategia

L’utente può accedere alla directory /home/flag02 che contiene file di configurazione di bash e un eseguibile /home/flag02/flag02

Digitando ls -la /home/flag02/flag02 otteniamo -rwsr-x--- 1 flag02 level02

→ il file flag02 è di proprietà di flag02, è eseguibile dagli utenti del gruppo level02 ed è SETUID

Idea

Provocare l’esecuzione di /bin/getflag mediante iniezione in /home/flag02/flag02

Analisi del sorgente

Funzione asprintf()

Alloca un buffer di lunghezza adeguata, ci copia dentro una stringa utilizzando sprintf() e restituisce il numero di caratteri copiati o -1 in caso di errore

Idea

In bash è possibile concatenare due comandi con il carattere separatore ;

Inoltre è possibile commentare il resto di una riga con il carattere #

Attacco