Level 01

<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?");
}

Strategia

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

Idea

Provocare indirettamente l’esecuzione del binario /bin/getflag sfruttando il binario /home/flag01/flag01

Funzione 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

Comando 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

Comando echo

Comando che stampa i suoi argomenti sullo standard output