skip to content
← volver al catálogo
EN
EXPEDIENTE №002 · CLASIFICACIÓN DECLASSIFIED ·

Intentions

HTB HARD OBJETIVO: 10.10.11.220
#linux#sqli#api-manipulation#imagick#git#side-channel#capabilities

Intentions Banner

Detalles

  • IP Address: 10.10.11.220
  • Sistema Operativo: Linux
  • Dificultad: Hard
  • Autor: AETH3RON

Resumen

Intentions es una máquina Linux de dificultad Hard centrada en encadenar vulnerabilidades web. El acceso inicial se obtiene mediante una inyección SQL en la API para eludir la autenticación, lo que lleva a la Ejecución Remota de Código a través de un exploit de PHP ImageMagick. Tras ganar acceso, nos movemos lateralmente recuperando credenciales de un repositorio Git. La escalada de privilegios se logra abusando de un binario personalizado con la capacidad cap_dac_read_search para realizar un ataque de canal lateral y extraer la clave SSH de root.

Enumeración

Nmap

Comenzamos escaneando el objetivo en busca de puertos abiertos y servicios.

nmap -Pn -sS -sV -p- 10.10.11.220 -oN nmap-basic

Escaneo nmap básico mostrando los puertos 22 (SSH) y 80 (nginx) abiertos en Intentions

Realizamos un escaneo dirigido sobre los puertos descubiertos para obtener más detalles.

nmap -Pn -sS -sC -p22,80 10.10.11.220 -oN nmap-common

Escaneo nmap dirigido con scripts por defecto en los puertos 22 y 80

Los escaneos confirman dos servicios expuestos:

  • 22/tcp: SSH (OpenSSH)
  • 80/tcp: HTTP (nginx)

Enumeración Web

Visitando la aplicación web en el puerto 80, encontramos una plataforma estilo galería.

Para interactuar con toda la funcionalidad de la aplicación, registramos una nueva cuenta e iniciamos sesión exitosamente.

Registro de nueva cuenta en la plataforma de galería de Intentions

Inicio de sesión en la plataforma de galería con la cuenta recién registrada

Dentro del panel de usuario, la configuración del perfil nos permite actualizar los géneros favoritos. Interceptamos esta interacción con Burp Suite para analizar la comunicación con el backend.

Panel de usuario mostrando la configuración de actualización de géneros favoritos

Observamos que la aplicación usa una API de backend. Dos peticiones destacan como vectores potenciales de inyección:

  1. POST /api/v1/gallery/user/genres (Actualiza preferencias de usuario)
  2. GET /api/v1/gallery/user/feed (Obtiene datos basados en preferencias)

Burp Suite interceptando las peticiones API POST y GET con vectores de inyección potenciales

Análisis de API e Inyección SQL

Sospechamos que los inputs de estas peticiones podrían estar interactuando directamente con la base de datos. Guardamos las peticiones GET y POST en archivos para automatizar las pruebas.

Configuramos SQLMap para inyectar en la petición POST usando la GET como comprobación de segundo orden (--second-req), ya que los resultados de la inyección probablemente se reflejan en el feed.

sqlmap -r post_genres.req --second-req get_feed.req -p genres --level 5 --risk 3

SQLMap confirmando inyección SQL de tipo UNION en el parámetro genres

SQLMap confirma que el parámetro genres es vulnerable a una inyección SQL de tipo UNION.

Enumeración de Base de Datos

Con la inyección confirmada, procedemos a enumerar las tablas de la base de datos.

SQLMap enumerando las bases de datos disponibles mediante inyección SQL

La tabla users parece la más relevante. Volcamos su contenido para recuperar credenciales.

SQLMap volcando la tabla users y obteniendo los hashes bcrypt de steve y greg

Recuperamos exitosamente los hashes de los usuarios steve y greg. Sin embargo, las contraseñas están hasheadas con bcrypt, haciendo inviable el cracking offline. Necesitamos una forma alternativa de usar estas credenciales.

Bypass de Versión de API

Durante la enumeración adicional de la estructura de la API, descubrimos una estructura de endpoint v2. Enviando una petición POST vacía al endpoint de login v2 confirmamos que está activo:

Descubrimiento del endpoint activo API v2 mediante petición POST vacía

Esto sugiere que la aplicación tiene una segunda versión de API que podría manejar la autenticación de manera diferente.

Bypass de Autenticación vía Manipulación de API

Intentamos un ataque de Bypass de Autenticación (Pass-the-Hash). Capturamos una petición de login legítima para el admin steve y la modificamos:

  1. Cambiamos el path de /api/v1/ a /api/v2/.
  2. Reemplazamos la contraseña en texto plano con el hash bcrypt volcado anteriormente.

Bypass de autenticación pasando el hash bcrypt como contraseña al endpoint de login de API v2

El servidor acepta el hash como contraseña válida, concediéndonos acceso a la aplicación como administrador steve.

Acceso Inicial

Como administrador, accedemos al panel /admin.

Panel de administrador accesible tras el bypass de autenticación como steve

Explorando las funciones de admin, encontramos una sección de Imagen que permite edición y efectos.

Sección de edición y efectos de imagen del admin que procesa archivos mediante rutas absolutas

Observamos que la aplicación pasa rutas absolutas de archivos al backend para procesamiento. Un post de noticias en el sitio hace referencia a “PHP Imagick constructors”, insinuando una vulnerabilidad conocida en la clase Imagick de PHP que permite RCE mediante archivos MSL maliciosos.

Aplicación pasando rutas absolutas de archivos al procesador Imagick del backend

Creación del Payload Imagick

Creamos un archivo MSL malicioso llamado payload.msl. Este payload usa el esquema caption: para ejecutar código PHP y el esquema info: para escribir la salida en un directorio accesible por web.

Explotación

Para disparar la vulnerabilidad, debemos subir este archivo vía el endpoint de modificación de imágenes. Extraemos la petición legítima de las herramientas de desarrollador del navegador y la convertimos a un comando curl, inyectando nuestros esquemas maliciosos.

Comando curl subiendo el payload MSL malicioso para activar el RCE de PHP Imagick

El servidor procesa el archivo MSL y escribe nuestra webshell en el directorio storage. Verificamos la ejecución ejecutando ls desde el navegador:

Webshell escrita en el directorio storage por el exploit MSL de Imagick

Salida del comando ls confirmando la ejecución de código a través de la webshell de Imagick

Reverse Shell

Con la ejecución de código confirmada, servimos un script de bash reverse shell desde nuestra máquina atacante y lo ejecutamos en el objetivo para obtener una sesión interactiva.

Script de bash reverse shell servido desde la máquina atacante y ejecutado en Intentions

Capturamos la shell en nuestro listener, obteniendo acceso como www-data.

Listener Netcat recibiendo la conexión de reverse shell como www-data

Movimiento Lateral

Ahora estamos dentro como el usuario www-data. Enumerando el directorio web, identificamos un directorio .git, indicando que la aplicación tiene control de versiones.

ls -la del directorio web revelando un directorio .git propiedad de root

Intentamos leer los logs de git, pero la operación falla porque el repositorio es propiedad de root, activando la protección de directorio seguro de Git.

Para bypassear esto (CVE-2022-24765), podemos sobreescribir la variable HOME a un directorio que controlemos (como /tmp) y añadir el repositorio a la lista segura en un config global temporal.

Acceso al log de git fallando por la protección de directorio seguro en el repositorio propiedad de root

Bypass de la protección de directorio seguro de Git sobreescribiendo HOME y añadiendo el repo a la lista segura

Escaneando el historial de commits se revelan credenciales de desarrollador hardcodeadas en un commit anterior. Usamos estas credenciales para SSH a la máquina como el usuario greg.

Acceso SSH a la máquina como greg usando credenciales hardcodeadas del historial de commits de Git

Escalada de Privilegios

Como greg, exploramos el directorio home y encontramos un sistema de escáner de derechos de autor que consiste en un script (dmca_check.sh) y un binario (/opt/scanner/scanner).

El escáner compara archivos en /home/legal/uploads contra una lista de hashes en dmca_hashes.test. Aunque no podemos leer el directorio uploads directamente debido a los permisos, el binario del escáner sí puede.

Comprobamos las capacidades del binario:

getcap /opt/scanner/scanner

getcap mostrando la capacidad cap_dac_read_search establecida en el binario scanner de ndsudo

El binario tiene cap_dac_read_search establecido. Esta poderosa capacidad permite al proceso eludir las comprobaciones de permisos de lectura de archivos y directorios. Efectivamente, este binario puede leer cualquier archivo del sistema, incluido /root.

El Ataque de Canal Lateral

El escáner acepta un argumento -l, que define la longitud del contenido del archivo a hashear (p.ej., hashear solo los primeros 5 bytes). También nos dice si se encuentra una coincidencia con nuestra lista de hashes proporcionada.

Esto crea un oráculo de canal lateral. Podemos:

  1. Apuntar a un archivo sensible (p.ej., /root/.ssh/id_rsa).
  2. Generar hashes MD5 para cada carácter posible (A, B, C…).
  3. Pedirle al escáner que compruebe solo el 1er byte del archivo objetivo contra nuestra lista.
  4. Cuando el escáner reporta una coincidencia, sabemos el primer carácter.
  5. Repetir para el 2do byte, 3er byte, y así sucesivamente.

Automatizamos esta extracción usando un script Python.

Script Python de canal lateral extrayendo la clave SSH privada de root byte a byte

Ejecutar el script extrae exitosamente la clave SSH privada del usuario root.

Guardamos la clave recuperada, establecemos los permisos correctos e iniciamos sesión como root.

Inicio de sesión SSH como root usando la clave privada extraída, completando la escalada de privilegios

Impacto de Negocio

Esta cadena de ataque demuestra un compromiso multi-etapa sofisticado que comienza desde una vulnerabilidad web común. La inyección SQL que permite el bypass de autenticación API ilustra cómo un único fallo de validación de entrada puede socavar un sistema de autenticación completo. La posterior explotación de PHP Imagick para ejecución remota de código resalta el riesgo de bibliotecas de procesamiento de imágenes que soportan formatos de archivo peligrosos. El movimiento lateral mediante credenciales hardcodeadas en Git expone prácticas deficientes de gestión de secretos, mientras que el ataque de canal lateral final usando capabilities de archivos Linux revela cómo los controles de privilegios granulares pueden ser abusados para extraer datos sensibles — incluyendo claves SSH — sin activar alertas tradicionales de acceso a archivos.

Referencias

// DESPACHOS DE CAMPO

Nuevos archivos recuperados, directos a tu bandeja. Sin ruido.