La máquina Code es una máquina fácil de HTB.

Resumen de conceptos trabajados:

Enumerate ports/services (nmap)
-Code Injection RCE
-Credential Dumping en base de datos
-Cracking Hashes
-Sudo misconfiguration / abuse of limited sudo
-Path Traversal
-Local File Extraction / Privilege Escalation

Si es tu primera máquina en Hack The Box y no sabes cómo conectarte a la máquina del laboratorio, te recomiendo que visites este post donde te cuento cómo introducirte en esta plataforma.

A continuación, para conectarte a la máquina, tendrás que establecer la conexión con la máquina víctima de HTB conectándote a la VPN desde la carpeta donde la tengas descargada, y desde ahí ejecutarás el comando «sudo openvpn NOMBRE_VPN.ovpn».

NUMERACIÓN -> ESCANEO DE PUERTOS

Comenzamos con la enumeración de puertos y conocimiento de versiones y servicios que corren sobre los mismos.

Antes, a mi me gusta asegurarme que efectivamente la máquina víctima está activa y ante qué sistema operativo (OS) nos enfrentamos. Para ello:

¿Está la máquina víctima activa y nos podemos comunicar con ella?

Aquí lo que haremos es ejecutar el siguiente comando y ver si el «host is up»:

El TTL es de 64 (63 en HTB por el nodo intermediario) por lo que estamos antes una máquina Linux.

Ahora que sabemos que la máquina víctima está activa, procedemos escanear la red lanzando un nmap para detectar qué puertos están abiertos con el siguiente comando:

sudo nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.129.125.105 -oG Escaneo

Sabemos por tanto que los puerto 22 SSH y 5000 upnp están abiertos.

El puerto 5000 UPnP (Universal Plug and Play) es un protocolo diseñado para permitir la comunicación sencilla y automática entre dispositivos en una red local (routers, impresoras, consolas, dispositivos multimedia, etc.), facilitando así la configuración dinámica y automática.

A continuación lo que voy a hacer es analizar los servicios y versiones que corren para esos puertos abiertos, de esta forma obtengo más detalle clave sobre posibles exploits que pueda encontrar, para ello lanzo este comando:

nmap -sCV -p22,5000 10.129.125.105

De lo investigado por searchsploit no se reporta ninguno para las versiones de openssh ya que se trata de una versión superior a la 7.7.

Gunicorn (Green Unicorn) es un servidor HTTP WSGI para aplicaciones Python. Es usado habitualmente para desplegar aplicaciones Python basadas en frameworks como Django o Flask. Tiene sentido sabiendo que además el tipo de contenido web detectado es un editor de código en Python.

En este punto vamos a analizar el punto 5000 desde el navegador para ver qué encontramos…

CODE INJECTION SCRIPT PYTHON

Efectivamente vemos un editor de código en Pyhton con varias opciones de registro, login, run, save, etc.

Probamos a incluir el siguiente código en Python el cual consultará a la base de datos para listar todos los usuarios registrados:

print([(user.id, user.username, user.password) for user in User.query.all()])

Efectivamente nos devuelve dos usuarios y los hashes de sus contraseñas:

'development', '759b74ce43947f5f4c91aeddc3e5bad3'
'martin', '3de6f30c4a09c27fc71932bfc68474be'

CRACK HASHING

Para poder probar sus accesos en ssh tenemos que crackear esos hashes, para lo cual vamos a crear un fichero de texto con el usuario y hash y vamos a usar john the ripper:

john --format=raw-md5 hashes.txt --wordlist=/usr/share/wordlists/rockyou.txt

Y de esta forma tenemos las contraseñas para ambos usuarios:

development:development
martin:nafeelswordsmaster

SSH ACCESS

Con estos usuarios y contraseñas, vamos a probar por ssh si podemos acceder al servidor:

y estamos dentro como usuario martin (no root).

A partir de aquí tenemos que analizar qué tipos de permisos tiene martin en el servidor, y vemos que puede ejecutar /usr/bin/backy.sh como root sin contraseña.

SUDO MISCONFIGURATION

Si accedemos al .sh vemos que se hace una llamada a un json, y se ejecuta como root, por lo que si modificamos ese fichero task.json con nano, por el siguiente código, tendremos la flag user.txt:

{
“destination”: “/home/martin/”,
“multiprocessing”: true,
“verbose_log”: false,
“directories_to_archive”: [
“/home/app-production/user.txt”
],
“exclude”: [
“.*”
]
}

después de modificarlo, lo ejecutamos:

sudo /usr/bin/backy.sh task.json

y si retrocedemos hasta la home, podemos ver la flag

PRIVILEGE ESCALATION

Ahora continuamos escalando hasta privilegios de root.

Para ello volvemos a modificar el fichero : nano task.json

{
“destination”: “/home/martin/”,
“multiprocessing”: true,
“verbose_log”: true,
“directories_to_archive”: [
“/var/….//root/”
]
}

Ejecutamos el json:

subimos de directorios hasta la home de martin, y tenemos acceso a la carpeta de root como martin:

y accedemos a la carpeta root y conseguimos la flag de root.txt

RESUMEN

RESUMEN

En la máquina Code, comenzamos escaneando los puertos abiertos y descubrimos una aplicación web en el puerto 5000, que permitía escribir y ejecutar código Python.

Aprovechando esta funcionalidad, se inyectó un pequeño script SQLi que accedía a la base de datos interna de usuarios, revelando nombres y contraseñas cifradas. Al descifrar esas contraseñas con una herramienta llamada john, conseguimos conectarnos por SSH como el usuario «martin».

Ya dentro del sistema, comprobamos qué comandos podía ejecutar con privilegios elevados (sudo), y descubrimos que podía lanzar un script llamado backy.sh, el cual hacía copias de seguridad a partir de un archivo de configuración (task.json).

Este archivo JSON nos permitía indicar qué carpetas o archivos queríamos respaldar, pero el sistema solo aceptaba rutas dentro de /home/ o /var/. Sin embargo, con una pequeña evasión usando /var/....//root/, logramos engañar al sistema para que copiara archivos del directorio protegido /root/.

Así conseguimos extraer el archivo root.txt, que contiene la flag final.

En resumen, explotamos la ejecución de código en la web para obtener credenciales, accedimos al sistema por SSH, y aprovechamos un script mal configurado para escalar privilegios y comprometer completamente la máquina.

Otros posts relacionados