HackTheBox - Conversor
Writeup de la máquina Conversor de HackTheBox
Dificultad
easyTiempo aprox.
~1.5hDatos Iniciales:
10.129.4.131
Nmap Scan
Tras realizar un escaneo nmap completo, se encuentran los siguientes puertos abiertos:
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.13 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 01:74:26:39:47:bc:6a:e2:cb:12:8b:71:84:9c:f8:5a (ECDSA)
|_ 256 3a:16:90:dc:74:d8:e3:c4:51:36:e2:08:06:26:17:ee (ED25519)
80/tcp open http Apache httpd 2.4.52
|_http-title: Did not follow redirect to http://conversor.htb/
|_http-server-header: Apache/2.4.52 (Ubuntu)
Service Info: Host: conversor.htb; OS: Linux; CPE: cpe:/o:linux:linux_kernel
# Nada en UDPAñadimos conversor.htb a /etc/hosts
Como la versión de SSH no es vulnerable y no hay nada más expuesto, vamos a http directos.
HTTP - 80
Si entramos a http://conversor.htb veremos un panel de login.

Al analizar con whatweb no vemos nada de info nueva:
Como podemos registrarnos, lo hacemos. P.ej, con credenciales username:password. Ahora encontraremos un panel que nos permite subir archivos XML que sean output de análisis nmap, y una plantilla XSLT, y la página procesará ambos y nos devolverá un archivo más estético. P.ej, si subimos el análisis del propio servidor y la plantilla que nos dan:

XSLT es un lenguaje diseñado para transformar documentos XML. Si tienes datos en crudo en xml, y quieres presentarlos como página web (p.ej HTML, como Conversor), el archivo XSLT contiene las instrucciones de las transformaciones que han de hacerse al formato XML. El problema de XSLT es que es Turing completo, es decir, no es solo un lenguaje de "formato", sino que, teóricamente, puede hacer tanto como Python o C. Que Conversor permita subir archivos xslt propios abre la puerta a una potencial inyección XSLT.
Reverse Shell - XSLT Injection
Subimos un archivo de reverse shell XSLT:
Y mientras tanto, con un puerto en escucha:
Al entrar, lo primero que encuentro relevante es un archivo:
Parece un archivo que puede contener credenciales. Tras una búsqueda, descubro que es bytecode de Python que puede descompilarse fácilmente, así que lo copio a mi máquina y lo descompilo:
De nuevo, encontramos la contraseña, confirmando que estaba completa. Probamos a cambiar de usuario con su fismathack y su root, pero no da resultado.
Ahora nos copiamos instance/users.db y lo analizamos con sqlite3:
Dado que sabemos que mi contraseña es password, probamos a ver qué hash será:
Efectivamente, coincide con la de la DB, confirmando que la otra también estará en MD5 (Y sin salt). Probamos a meter el hash en crackstation:

Confirmando que la contraseña de fismathack es Keepmesafeandwarm. Probamos a hacer SSH:
SSH - Privesc
Al entrar con SSH, lo primero que comprobamos son los privilegios sudo:
Mirando info sobre needrestart:
needrestart is a tool that probes your system to see if either the system itself or some of its services should be restarted. That last part is the one of interest in this document. Notably, a service is considered as needing to be restarted if one of its processes is using a shared library whose initial file isn't on the system anymore (for instance, if it has been overwritten by a new version as part of a package update).
Y comprobamos versión:
Encontramos rápidamente varios CVE relacionados a needrestart:
CVE-2024-48990: Qualys discovered that needrestart, before version 3.8, allows local attackers to execute arbitrary code as root by tricking needrestart into running the Python interpreter with an attacker-controlled PYTHONPATH environment variable.
Probamos a ejecutar un exploit formado por 3 elementos: e.py, lib.c y start.sh:
Como gcc no está instalado, no podemos usarlo directamente, pero sí podemos modificarlo para que funcione solo con python, quitando el .c. Antes de modificarlo, algunos datos relevantes:
importlibes la librería de python que permite importar otras librerías. Normalmente, esta librería Python la carga desde las librerías del sistema (/usr/lib/...).Si nosotros especificamos una variable de entorno
PYTHONPATH, python irá primero a buscar las librerías ahí, y luego, si no las encuentra, seguirá su orden de búsqueda habitual.Al importar una carpeta como librería en Python, este busca dentro de la carpeta un archivo
__init__.py. Si el archivo existe, Python ejecuta todo su contenido automáticamente antes de hacer nada.Un proceso de python puede estar ejecutándose en un
venv, usando librerías del sistema, con unPYTHONPATHcustom, etc. Y comoneedrestart, para poder comprobar de forma fiable las librerías del proceso, necesita "ver lo mismo" que este, lo que hace por defecto es copiar algunas las variables de entorno de tal proceso. El problema llega cuando copia algunas (comoPYTHONPATH) sin sanitizar.
Con todo esto, podemos especificar PYTHONPATH=., crear un directorio local importlib y, dentro de este, un __init__.py malicioso. Entonces:
Ya no necesitamos los archivos
lib.cystart.shdel exploit__init__.pyse encarga de copiarbasha/tmp/pocy darle permisos SUID.e.pyse encarga de borrar trazas anteriores y de mantenerse en escucha hasta que exista el archivo/tmp/pocCuando ejecutemos
sudo needrestart, este, por cada proceso del sistema, irá mirando si las librerías son "viejas" y copiaando las variables de entorno. Cuando llegue a nuestroe.pyen ejecución, tomará las variables, entre las que estaráPYTHONPATH=., que también copiará.Al copiar la librería, cargará el
__init__.pyde dentro, que contiene el código malicioso que creará/tmp/poc(copia de bash). Cuando lo cree,e.pylo detectará y saldrá del bucle, dándonos un shell como root.
Desde otra sesión SSH:
Y de vuelta a la sesión anterior:
Y tenemos root.
Última actualización