<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);
}
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
Provocare l’esecuzione di /bin/getflag
mediante iniezione in /home/flag02/flag02
USER
system
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
In bash è possibile concatenare due comandi con il carattere separatore ;
Inoltre è possibile commentare il resto di una riga con il carattere #