Level 13

<aside> đźš©

C’è un controllo di sicurezza che impedisce al programma di continuare a eseguire codice se l’utente che lo invoca non matcha uno specifico user id

</aside>

Gli obiettivi della sfida sono:

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <string.h>

#define FAKEUID 1000
int main(int argc, char **argv, char **envp){
	int c;
	char token[256];
	if(getuid() != FAKEUID) {
		printf("Security failure detected. UID %d started us, we expect %d\\n", getuid(), FAKEUID);
		printf("The system administrators will be notified of this violation\\n");
		exit(EXIT_FAILURE);
	}
	// snip, sorry :)
	printf("your token is %s\\n", token);
}

Strategia

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

Digitando ls -la /home/flag13/flag13 otteniamo -rwsr-x--- 1 flag13 level13

→ il file flag13 è di proprietà di flag13, è eseguibile dagli utenti del gruppo level13 ed è SETUID

Analisi del sorgente

Variabili d’ambiente LD_*

Alcune variabili d’ambiente tra cui LD_LIBRARY_PATH e LD_PRELOAD possono influenzare il comportamento del linker dinamico → parte del SO che carica e linka le librerie condivise necessarie a un eseguibile a runtime

Variabile LD_PRELOAD

Contiene un elenco di librerie condivise (shared object) separato da : che sono collegate prima di tutte le altre richieste durante l’esecuzione di un eseguibile

Viene utilizzata per ridefinire dinamicamente alcune funzioni senza dover ricompilare i sorgenti