Page cover

🟠Cypher

En esta ocasión vamos a hacer el writeup de la máquina Cypher de Hack the Box, una máquina Linux de dificultad easy.

Información General

  • Nombre de la máquina: Cypher

  • IP: 10.10.11.57

  • Sistema operativo: Linux

  • Dificultad: 🟡 Media

  • Fecha: 01-06-2025


Reconocimiento Inicial

Añadimos la IP al /etc/hosts

Acceso Web

Accedemos a http://cypher.htb y observamos que parece ser una web que ofrece una solución de gestión de la superficie de ataque con IA:

Al darle a Free Demo nos redirige al login:


Escaneo de Puertos

Solo encontramos puertos comunes (22 y 80) abiertos. Nos centraremos en el servicio web.


Enumeración Web

Fuzzing de Directorios

Directorios interesantes encontrados:

  • /api (307)

  • /demo (307)

  • /testing (301) - Directorio curioso

Directorio Testing

Accedemos a testing y encontramos un snapshot.jar:

Nos lo descargamos y lo extraemos para analizarlo.

Lo decompilamos para ver el código. Podemos utilizar la siguiente web:

Vemos 2 archivos principales, un HelloWorld que no contiene nada relevante y CustomFunctions que contiene código muy interesante:

Este código confirma un command injection.

  1. Normaliza la URL (añade https:// si no está presente).

  2. Construye un comando con concatenación de strings:

  1. Lo ejecuta con:

Usar Runtime.getRuntime().exec(String[]) con entrada del usuario sin sanitizar permite Command Injection.

La siguiente línea:

pasa toda la entrada del usuario directamente a la shell (sh -c), lo cual es un patrón clásico de vulnerabilidad si no se escapan ni validan los parámetros.

✅ Ejemplo de payload malicioso:

Este payload ejecutaría:

Esto hace que se ejecute un segundo curl que envía la salida de whoami a un servidor controlado por el atacante.


Testing web

Capturamos el request de login con BurpSuite y vemos que los datos se envían como un JSON a través de la api:

Probando alguna inyección SQL nos devuelve un error en el front que nos indica la presencia de una base de datos cypher de neo4j:

Est confirma una inyección de Cypher (Neo4j) en el backend. El backend construye las consultas Cypher dinámicamente con los valores que le envíamos, y no está sanitizando correctamente las comillas.

Captura de login

Al capturar un intento de login con BurpSuite observamos que los datos se envían como JSON, por lo que podríamos probar ahí el Command Injection:

Sabemos por el traceback que el backend construye una query similar a esta:

Nuestro objetivo es cerrar correctamente la condición u.name = '...', romper el flujo original, e inyectar nuestro CALL a custom.getUrlStatusCode() con un payload de RCE.

Enumerar versión

Usaremos el siguiente payload:

Funciona! Obtenemos la versión de Neo4j y el tipo de Kernel community:

Enumerar los labels

Tenemos el label USER:

Enumerar la propiedad USER

Vamos a cambiar un poco el enfoque. Abriremos un listener de Netcat para recibir los resultados:

Y usaremos el siguiente payload:

Eso nos devuelve un nombre de usuario: graphasm

Extracción de hashes

Usaremos el payload definitivo:

Y nos devuelve el hash del usuario:

Este hash no se puede crackear fácilmente, por lo que modificaremos el payload para conseguir una reverse shell.

Reverse Shell

Abrimos un listener de Netcat por el puerto 4444

Payload

Recibimos la shell


Enumeración interna

Enumerando el objetivo no podemos acceder directamente a la user flag, ya que pertenece al usuario graphasm, pero en su directorio home encontramos unas credenciales:


User flag

Al probar las credenciales encontradas con el usuario graphasm por SSH conseguimos acceder!

Tenemos la user flag!


Escalada de Privilegios

Enumeración de Privilegios

Vemos que este usuario graphasm puede ejecutar la herramienta de bbot, una conocida herramienta de OSINT y enumeración.

Usaremos el bbot_preset.yml que tenemos en el directorio home para realizar el escaneo:

Se lo pasaremos a la herramienta de la siguiente manera:

En principio no obtenemos información relevante. La herramienta de Bbot permite construir módulos custom en python, con lo que podríamos modificarlo para convertirnos en root:

Crear exploit.yml

Necesitamos crear este archivo e incluir el nombre del módulo en python que modificaremos.

Debemos crear la ruta /tmp/bbot/modules donde crearemos el módulo python modificado.

Crear whois.py malicioso

Modificaremos el ejemplo que nos da la documentación de Bbot:

Concretamente modificaremos el método setup() para conseguir el root, añadiendo las líneas:

Lo que hacemos con esto es que:

  • Copiamos el binario /bin/bash a /tmp

  • Con chmod u+s /tmp/bash establecemos el bit SUID (Set User ID) en el archivo /tmp/bash

Ejecutamos el módulo malicioso

Comprobación de root

Accedemos a /tmp y observamos que se ha copiado correctamente el binario bash y se ejecuta como root:

Lo ejecutamos con ./bash -p y nos convertimos en root:

Root flag

Última actualización

¿Te fue útil?