<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
→ lrwcewlxrwx 1 root root ... /bin/sh -> /bin/bash
env
env 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
echo
Comando che stampa i suoi argomenti sullo standard output