> For the complete documentation index, see [llms.txt](https://itszaiden.gitbook.io/pentesting/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://itszaiden.gitbook.io/pentesting/writeups/dockerlabs/easy/nodeclimb.md).

# NodeClimb

Anonymous FTP leak exposed a ZIP with SSH creds, and root was gained via writable Node.js script executed with sudo.

## 1 - Reconnaissance

We begin with a fast Nmap scan to identify open ports:

`nmap 172.17.0.2 -p- --open -sS -Pn --min-rate 5000 -T5`

**Result: ports 21 and 22 are open**

## 2 - Enumeration

Now we run a service/version detection scan, targeting only the open ports we found on the previous scan:

`nmap 172.17.0.2 -p 21,22 -sS -Pn -sCV`

<figure><img src="https://438683079-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FIbHEScEP34huXd5EXNdb%2Fuploads%2FWygvVXBkkmpT0QkOo1eH%2F(NodeClimb)%20Targeted%20Port%20Scan.png?alt=media&amp;token=49189e69-5f5d-4c3f-910c-ab1f01734ce6" alt=""><figcaption><p>(NodeClimb) Targeted Port Scan</p></figcaption></figure>

We tried to find exploits or shellcodes using `searchsploit` but there wasn't any. Our next step will be FTP enumeration. Our report shown that anonymous login is allowed, so we will try to gather as much data as possible.

<figure><img src="https://438683079-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FIbHEScEP34huXd5EXNdb%2Fuploads%2FOlijKeHwCXQBgkUlcAL7%2F(NodeClimb)%20SecretitoPicaron.zip.png?alt=media&amp;token=423d51a1-3447-4b94-8cdf-643d3c7acef0" alt=""><figcaption><p>(NodeClimb) SecretitoPicaron.zip</p></figcaption></figure>

## 3 - Exploitation

We got `secretitopicaron.zip`, which is protected by a password, so we will run:

```
zip2john secretitopicaron.zip > hash
john --wordlist=/usr/share/wordlists/rockyou.txt hash
unzip secretitopicaron.zip
password1
```

That will end up on valid credentials for SSH login:

<figure><img src="https://438683079-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FIbHEScEP34huXd5EXNdb%2Fuploads%2FWydV6b6gGMlzSW0YCBC9%2F(NodeClimb)%20Mario%20Credentials.png?alt=media&amp;token=77c2ff58-3294-490e-bb7a-3141a641c2ea" alt=""><figcaption><p>(NodeClimb) Mario Credentials</p></figcaption></figure>

## 4 - Privilege Escalation

After running `sudo -l` we checked `mario` has sudo permissions as root on `/usr/bin/node /home/mario/script.js`, which is empty and writeable by us.

Researching a bit about Node.js, we found the function `exec`, which will run system commands. After writing a malicious `script.js`, we can set SUID on `/bin/bash`, allowing us to spawn a root shell with `/bin/bash -p`

<figure><img src="https://438683079-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FIbHEScEP34huXd5EXNdb%2Fuploads%2FXwtcAUbUHAFIIqvlBCgX%2F(NodeClimb)%20Privilege%20Escalation.png?alt=media&amp;token=cb3302d7-a3cc-4cdc-9b54-ffdb4113f841" alt=""><figcaption><p>(NodeClimb) Privilege Escalation</p></figcaption></figure>

## 5 - Summary

**Initial Access:**\
Anonymous FTP access revealed `secretitopicaron.zip`. Cracking it with `zip2john` and John provided SSH credentials for `mario`.

**Exploitation:**\
Logged in via SSH as `mario` using the recovered credentials.

**Privilege Escalation:**\
`mario` had sudo rights on `/usr/bin/node /home/mario/script.js`, which was empty and writable. By injecting a malicious script using `exec` to set SUID on `/bin/bash`, we obtained a root shell.
