<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 flag01
#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?");
}
L’utente può accedere alla directory /home/flag01 che contiene file di configurazione di bash e un eseguibile /home/flag01/flag01
Digitando ls -la /home/flag01/flag01 otteniamo -rwsr-x--- 1 flag01 level01
→ il file flag01 è di proprietà di flag01, è eseguibile dagli utenti del gruppo level01 ed è SETUID
Provocare indirettamente l’esecuzione del binario /bin/getflag sfruttando il binario /home/flag01/flag01
system()Esegue un comando di shell passato come argomento e restituisce -1 in caso di errore
Non usare system() in programmi con SETUID o SETGID perché l’integrità del sistema potrebbe essere compromessa con strani valori per le variabili d’ambiente
Inoltre system() non funziona correttamente se /bin/sh è bash
Controlliamo se è così ls -l /bin/sh → lrwxrwlxrwx 1 root root ... /bin/sh -> /bin/bash
envenv name=value name2=value2 command
Comando di shell che se invocato da solo stampa la lista delle variabili d’ambiente, altrimenti esegue command nell’ambiente modificato ottenuto dopo aver settato le variabili ai valori specificati
echoComando che stampa i suoi argomenti sullo standard output