
Analicé la vulnerabilidad conocida popularmente como Pwnkit con fines educativos y escribí un PoC para ella. Utilícese estrictamente con fines educativos.
AVISO LEGAL: Este material se proporciona exclusivamente con fines educativos. El uso del exploit sin el consentimiento por escrito del propietario del sistema objetivo es poco ético y puede ser perseguido por la ley.
chmod +x build.sh../build.sh../mls_envp. Obtendrá acceso root.En la versión vulnerable de polkit (0.105), el autor, David Zeuthen, asumía que pkexec siempre se invocaría desde la consola. Partía de la premisa de que argc (el número de argumentos) siempre es mayor que 1, ya que argv[0] es el nombre del propio programa. Sin embargo, pkexec puede invocarse mediante la llamada al sistema execve, pasando un array de argumentos vacío. Debido a esto, la lógica del programa se rompe.
En el código de pkexec está codificada de forma rígida la expectativa de que argv contiene al menos un elemento. Cuando argc es igual a 0, el programa aun así intenta acceder a argv[1]. Esto provoca un desbordamiento del array argv y la lectura del primer elemento del array envp (variables de entorno). En nuestro caso, allí se encuentra la cadena "exp_exe".
pkexec intenta encontrar el programa exp_exe mediante la función g_find_program_in_path. Para la búsqueda utiliza la variable PATH. Sustituimos PATH por GCONV_PATH=.. Como resultado, pkexec encuentra el archivo señuelo exp_exe en nuestra carpeta local y devuelve la ruta GCONV_PATH=./exp_exe. Debido al fallo con argc, esta ruta se escribe de vuelta en envp[0], «legalizando» la variable GCONV_PATH.
Antes de ejecutar el programa, pkexec comprueba las variables de entorno (incluida SHELL). Pasamos un shell inexistente (SHELL=xyz) para provocar un error. Al mostrar el error se invoca log_message, que utiliza los mecanismos de glibc. Glibc examina la variable CHARSET=bohemcavanna y, al no encontrar un convertidor estándar, recurre al directorio indicado en GCONV_PATH (el que hemos introducido). Allí lee el archivo gconv-modules, carga nuestra biblioteca exploit.so y ejecuta el código que contiene con privilegios de root.