En este nivel tenemos un source code muy similar al anterior :
#include
#include
#include
#include
#include
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);
}
El programa es muy simple, realiza una llamada a /bin/echo e imprime por pantalla la información que recoge de las variables de entorno a través de «getenv», y en este caso USER, o lo que es lo mismo level02 que es nuestro usuario, por ahora.
Como vemos, si ejecutamos /bin/echo $USER is cool obtenemos el mismo resultado que al ejecutar el programa, cual es el truco aquí? Pipe !
Si seteamos nuestra variable de entorno a lo que queramos, y usamos tuberias ( | ) o ( && ) o (;) hacia otro comando, se ejecutará ( también ) en el contexto del usuario propietario del binario ( bad programming ), en este caso flag02, veamos un ejemplo:
Ilustrativo, pero lo que queremos es escalar privilegios de manera que ya sólo nos queda ejecutar una shell, o ejecutar el comando getflag para conseguir pasarnos este nivel, como a continuación:




Very interesting