cubeSorcery



Enumeración:


Un puerto 443/HTTPS

Verificar el repositorio nos lleva a Después de agregar el archivo de hosts git.sorcery.htb, obtenemos el siguiente repositorio; y esto parece estar creado en RUST verificando las extensiones de los archivos dentro del repositoriohttps://git.sorcery.htb/nicole_sullivan/infrastructurearrow-up-right

  • Tal parece que podría haber más opciones; al buscar en git puedo ver referencias a esto; por lo que es posible que podamos intentar escalar a otro tipo de cuenta.

Inyección de Cypher, el lenguaje de consulta utilizado por la base de datos Neo4j


chevron-rightinyección de Cyphe - Neo4jhashtag

🧠 ¿Qué está pasando?

En la URL estás haciendo una petición tipo:

Cuando accedes a un producto, el backend probablemente ejecuta una consulta Cypher como esta:

El valor <ID> proviene directamente de la URL. El problema ocurre porque no hay sanitización ni validación de entrada, por lo que puedes modificar la consulta y hacer que el servidor ejecute código Cypher arbitrario.


🐍 ¿Por qué se produce la vulnerabilidad?

Esto es idéntico a una SQL Injection, pero en Neo4j. Ocurre por:

  • El backend interpolando directamente la entrada del usuario dentro de la consulta Cypher.

  • No se usa un parámetro seguro (como $id o params.id).

  • El input no está escapado, validado, ni restringido.

Por ejemplo, si inyectas:

La consulta completa se transforma en algo así:

Eso permite:

  • Leer nodos sensibles como Config, User, etc.

  • Cambiar contraseñas (SET u.password = ...)

  • Escalar privilegios.


📍 ¿Cómo explotarlo?

  1. Editar el ID de la URL o del campo vulnerable.

  2. Añadir payloads Cypher maliciosos.

  3. Capturar respuestas con datos confidenciales.


🛡️ ¿Cómo se mitiga?

  1. Usar consultas parametrizadas en Neo4j:

  2. Validar que id tenga formato UUID.

  3. Escapar correctamente los valores del usuario.


INFO
INFO

🕳️ Vulnerabilidad: Inyección de Cypher (Neo4j)

Durante el análisis de la máquina sorcery.htb, se detectó una vulnerabilidad de inyección de Cypher en el endpoint:

El parámetro <ID> del recurso está siendo inyectado directamente en una consulta Cypher sin ser saneado.

🧪 Payload usado:

ID original del producto (benigno):

ID malicioso con inyección:

chevron-right🔐 Explicación del payloadhashtag

  • OPTIONAL MATCH (c:Config) → Busca nodos de configuración.

  • RETURN result { .*, description: ... } → Devuelve los campos normales (result.*), pero sobrescribe el campo description con la clave de configuración si existe.

  • coalesce(c.registration_key, result.description) → Si existe c.registration_key, la usa; si no, deja el valor original.

  • // → Comenta el resto de la consulta original, para evitar errores de sintaxis.

Esto modifica la consulta en el backend para que devuelva no solo los datos del producto, sino también la clave de registro (registration_key) desde otro nodo (Config), sobrescribiendo el campo description si existe.


🔐 Payload URL-encoded

Codificado para insertar en la URL:

Esto permite inyectarlo directamente en el navegador o herramienta como Burp Suite, Postman, o cURL.

  • Y ahora parece que tengo la clave para crear una cuenta de vendedor, así que intentemos registrarnos con ella dd05d743-b560-45dc-9a09-43ab18c7a513


  • Tenemos un nuevo apartado:

  • Probaré alguna inyección XSS en los campos para ver si activa algo, lo cual parece ser posible..

  • Ahora intentaré con otro y veré si puedo lograr que se conecte nuevamente a mi host:

Se conecta de nuevo, así que funciona. Sin embargo, todavía no consigo un shell, pero he confirmado que está ejecutando los scripts. Desde aquí, podría ser posible usar XSS con la cuenta de administrador; sin embargo, lo intenté varias veces y no pude solucionarlo; puede que sea un error.


Escalar a Admin con Inyección de Cypher


Leer contraseña de admin

URL Encode it:

Cambiar la contraseña

DEPENDIENDO QUE TIPO SEA EL HASH DEL ADMIN <>

Lo cual resulta como el comando completo a continuación:


Payload Cypher que funcionó:

Corresponde a esta inyección decodificada: PASSWD: las


Entramos como admin:

Al verificar más, parece que ahora tengo incluso más opciones que cuando tenía una cuenta de "Vendedor", lo que puede haber sido un agujero de conejo; sin embargo, están bloqueadas detrás del requisito de una "Clave de acceso".

PASOS PARA SIMULAR UNA PASSKEY CON CHROME DEVTOOLS

Intentaré utilizar ChromeDev Tools para simular una clave de acceso a través de este método;

1) CTRL + SHIFT I

2) Click the 3 dots at the top and navigate to "More Tools" > WebAuth

Luego haga clic en "Inscribir clave de acceso" en la sección de perfil del usuario administrador

Entramos con esa llave que se genero

Ahora obtengo las opciones tanto para depuración como para DNS.

  • Por lo que puedo decir leyendo el GIT de antes, la depuración puede estar ejecutándose en " Kafka ", al puerto por defecto "9092" que puedo ver referenciado aquí en docker-compose.yml.

Ahora, utilizando este script de Python proporcionado por un miembro de Discord , podemos generar una carga útil HEX funcional para obtener un shell inverso a través del menú de depuración; (guardar como payload.py)

Ahora generamos la carga útil codificada HEX

Y enviamos a través del menú de depuración como se muestra a continuación:

Y en con el listener en escucha:


🔧 Paso 1: Preparación del entorno y resolución DNS:

¿Por qué? Esto permite que el nombre upn.sorcery.htb sea resuelto dentro del entorno del laboratorio, apuntando a nuestra IP (10.10.16.90), lo cual será clave para el ataque MITM.


🌐 Paso 2: Identificar servicios internos:

¿Por qué? Se identifican las direcciones IP internas de los servicios ftp y mail, necesarios para descargar certificados y realizar phishing.


🧠 Paso 3: Crear túnel SOCKS5 con Chisel:

Atacante (tu máquina):

Objetivo (contenedor comprometido):

¿Por qué? Creamos un túnel proxy SOCKS5 inverso para enrutar todo el tráfico del contenedor a través de nuestra máquina atacante. Así podremos usar proxychains para hacer requests internos.


📄 Paso 4: Descargar certificados con proxychains:

¿Por qué? Obtenemos los certificados raíz que luego usaremos para firmar certificados falsos y montar un servidor HTTPS malicioso.


🧾 Paso 5: Crear certificado falso para ataque MITM:

¿Por qué? Creamos un certificado TLS que nos permitirá suplantar a upn.sorcery.htb de forma legítima ante la víctima.


🕵️ Paso 6: Iniciar mitmproxy como servidor falso:

¿Por qué? Esto simula el dominio upn.sorcery.htb en nuestra máquina. Si la víctima cae en el phishing, capturamos sus credenciales HTTPS.


📧 Paso 7: Enviar correo de phishing:

¿Por qué? Se envía un correo fraudulento a un usuario válido para que acceda a nuestro servidor HTTPS falso, permitiendo capturar sus credenciales.


🔐 Paso 8: Acceso como tom_summers:

¿Por qué? Credenciales obtenidas vía phishing. Primer acceso al host principal.


🖼️ Paso 9: Recuperar archivo sensible desde Xvfb:

¿Por qué? Captura de pantalla del escritorio donde se ve la contraseña de tom_summers_admin: -----cesBjT-


👨‍💻 Paso 10: Ingresar como tom_summers_admin:


🧪 Paso 11: Ataque con strace al login Docker:

y en otra terminal ejecutamos el script:

  • La cual nos da como resultado las credenciales de rebecca_smith


🔑 Paso 12: Extracción de hash de ash_winter con pspy64:

¿Por qué? Vemos cómo se crea el usuario ash_winter y se le asigna contraseña.


Root

chevron-rightsystemctl con Sudo NOPASSWDhashtag

Escalada de Privilegios a Root mediante systemctl con Sudo NOPASSWD

Cuando un usuario tiene acceso sudo a systemctl sobre un servicio como sssd con la opción NOPASSWD, es posible escalar privilegios a root si se logra modificar el archivo .service correspondiente. Este ataque es viable por las siguientes razones:

  1. systemctl ejecuta procesos como root Al reiniciar un servicio mediante sudo systemctl restart <servicio>, el proceso definido en el archivo de unidad (.service) es ejecutado con privilegios de root. Si se puede modificar este archivo, se puede forzar a que ejecute cualquier comando como root.

  2. Archivos .service como vectores de ejecución Los archivos de unidad de systemd contienen directivas como ExecStart, las cuales indican qué comando ejecutar al iniciarse el servicio. Al sobrescribir esta directiva con un payload (por ejemplo, un shell inverso), se puede ejecutar código arbitrario como root.

  3. Falta de validación del contenido del .service systemctl no valida si el contenido del archivo .service ha sido modificado, ni si es malicioso. Por tanto, una vez que el archivo ha sido sobrescrito con una carga útil, simplemente reiniciando el servicio (sudo systemctl restart sssd) se ejecuta el payload.

  4. Privilegio suficiente para modificar el entorno Aunque el usuario no tenga permisos directos de escritura en /lib/systemd/system/sssd.service, puede aprovechar otras técnicas como SYSTEMD_EDITOR con systemctl edit para modificar la configuración temporal del servicio sin necesidad de acceso completo a la ruta protegida.


Ejemplo de escalada Dado que ash_winter tiene permitido ejecutar sin contraseña:

Se puede crear o modificar el archivo sssd.service para que su directiva ExecStart contenga algo como:

Entonces, con:

se ejecutará el shell inverso como root.

En tu consola donde escuchas con nc, deberías recibir una shell como root:


Last updated