🟠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:
CypherIP:
10.10.11.57Sistema operativo:
LinuxDificultad:
🟡 MediaFecha:
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.
Normaliza la URL (añade
https://si no está presente).Construye un comando con concatenación de strings:
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/basha /tmpCon
chmod u+s /tmp/bashestablecemos 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?