🐧Linux - Bibliotecas compartidas
Es común que los programas Linux utilicen bibliotecas de objetos compartidos enlazados dinámicamente. Las bibliotecas contienen código compilado u otros datos que los desarrolladores utilizan para evitar tener que volver a escribir los mismos fragmentos de código en varios programas.
Existen dos tipos de bibliotecas en Linux:
Bibliotecas estáticas
(indicadas por la extensión de archivo.a
)Bibliotecas de objetos compartidos vinculados dinámicamente
(indicadas por la extensión de archivo.so
).
Cuando se compila un programa, las bibliotecas estáticas pasan a formar parte del programa y no se pueden modificar. Sin embargo, las bibliotecas dinámicas se pueden modificar para controlar la ejecución del programa que las llama.
Existen varios métodos para especificar la ubicación de las bibliotecas dinámicas, de modo que el sistema sepa dónde buscarlas durante la ejecución del programa. Esto incluye los indicadores -rpath
o -rpath-link
al compilar un programa, usar las variables de entorno LD_RUN_PATH
o LD_LIBRARY_PATH
, colocar las bibliotecas en los directorios predeterminados /lib
, /usr/lib
o especificar otro directorio que contenga las bibliotecas dentro del archivo de configuración /etc/ld.so.conf
.
Además, la variable de entorno LD_PRELOAD
puede cargar una biblioteca antes de ejecutar un binario. Las funciones de esta biblioteca tienen preferencia sobre las predeterminadas. Los objetos compartidos que requiere un binario se pueden ver mediante la utilidad ldd
.
La imagen de arriba enumera todas las bibliotecas requeridas por /bin/ls
, junto con sus rutas absolutas.
Escalada de privilegios LD_PRELOAD
Veamos un ejemplo de cómo podemos utilizar la variable de entorno LD_PRELOAD para escalar privilegios. Para ello, necesitamos un usuario con privilegios sudo
.
Este usuario tiene derechos para reiniciar el servicio Apache como root, pero como se trata de un derecho que no aparece en GTFOBin y la entrada /etc/sudoers
está escrita especificando la ruta absoluta, no se podría usar para escalar privilegios en circunstancias normales. Sin embargo, podemos aprovechar LD_PRELOAD
para ejecutar un archivo de biblioteca compartida personalizado.
Compilemos la siguiente biblioteca:
Podemos compilarlo de la siguiente manera:
Por último, podemos aumentar los privilegios con el siguiente comando. Asegúrate de especificar la ruta completa al archivo de biblioteca malicioso.
Caso práctico
Aumente los privilegios mediante la técnica LD_PRELOAD. Envíe el contenido del archivo flag.txt en el directorio /root/ld_preload
.
1. Comprobamos permisos sudo
Con sudo -l
observamos que tenemos una variable de entorno LD_PRELOAD
y que podemos ejecutar openssl como root:
2. Compilar librería en C
Vamos a compilar esta libreria en el objetivo, y la guardamos como root.c
:
Una vez que lo tenemos en la máquina objetivo lo compilamos con el siguiente comando:
3. Elevar privilegios
Por último podemos elevar nuestros privilegios con el siguiente comando:
Última actualización