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

# 🟩 NodeClimb

🧠Dificultad: Fácil | 🔓26/01/2026

## 🕵️ Reconocimiento

Realizamos un escaneo de puertos con nmap:

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2FSVDWTq9o0coQyeal8ncR%2Fimage.png?alt=media&amp;token=12de6233-3356-4455-8aef-4680d1745bad" alt=""><figcaption></figcaption></figure>

Vemos que se encuentra abierto el puerto FTP y SSH. En el servicio FTP nos permiten loguearnos anónimamente. Vamos a ver si encontramos algún archivo.

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2FnChXajRTfiqLoS9MtEgm%2Fimage.png?alt=media&amp;token=9c5a2275-cf1e-405e-b3a6-fbd0b469a794" alt=""><figcaption></figcaption></figure>

Hay un zip llamado `secretitopicaron.zip`. Nos lo llevamos a nuestra máquina para manipularlo.

## 🚪 Ganando acceso

El archivo zip tiene una contraseña, por lo que no podemos extraer su contenido. Usando `fcrackzip` podemos hacerle fuerza bruta. En mi caso, haré un ataque de diccionario con el `rockyou.txt`:

```bash
fcrackzip -u -D -p /usr/share/wordlists/rockyou.txt secretitopicaron.zip
```

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2FQkxD8ahIEwd0QgdcCpRb%2Fimage.png?alt=media&amp;token=8a5aee43-3676-4573-8100-e6ecf6ef941f" alt=""><figcaption></figcaption></figure>

Encontramos la contraseña: `password1`. Ahora sí podemos ver el contenido del zip:

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2FlyCOvtIVcrGrEg4pJvg8%2Fimage.png?alt=media&amp;token=3d443d19-b674-4b12-b889-d145ad3632f8" alt=""><figcaption></figcaption></figure>

Accedemos vía SSH con las credenciales encontradas:

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2Fml8shnBpfRt7EDXq8MdM%2Fimage.png?alt=media&amp;token=6e48cce3-4a25-4c7a-89b7-4d6418a249a2" alt=""><figcaption></figcaption></figure>

## 💥 Escalada de privilegios

Verificamos los permisos que tenemos con sudo en el sistema:

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2F4oxRggjGkhzIzd2UF9z7%2Fimage.png?alt=media&amp;token=cf316a5c-7f80-4b06-b926-a9fca54cffdc" alt=""><figcaption></figcaption></figure>

Podemos ejecutar `/usr/bin/node /home/mario/script.js` como cualquier usuario (nos interesa el root) sin necesidad de contraseña. El fichero script.js está vacío, y como tenemos permisos de escritura podemos modificarlo. En [gtfobins](https://gtfobins.github.io/) encontramos una manera de obtener una shell en node. Si ejecutamos el script con sudo, obtendríamos una shell como root:

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2FY91Gb4Uc0uJnO3KeA3jJ%2Fimage.png?alt=media&amp;token=fded311d-1317-4d2e-9d47-0a84c6f2ba3d" alt=""><figcaption></figcaption></figure>
