Skip to content

JoomScan - Escáner de Vulnerabilidades para Joomla

JoomScan - Escáner de Vulnerabilidades para Joomla

Section titled “JoomScan - Escáner de Vulnerabilidades para Joomla”

JoomScan es una herramienta de código abierto especializada en la detección de vulnerabilidades en sitios web que utilizan el CMS Joomla. Desarrollada en Perl, esta herramienta automatiza el proceso de reconocimiento y análisis de seguridad, identificando versiones, componentes vulnerables, archivos de configuración expuestos y posibles vectores de ataque.

Joomla es un sistema de gestión de contenidos (CMS) de código abierto utilizado para crear sitios web y aplicaciones online. Es el segundo CMS más popular después de WordPress, con características como:

  • Extensibilidad: Miles de extensiones, componentes y plantillas
  • Multiidioma: Soporte nativo para múltiples idiomas
  • Gestión de usuarios: Sistema robusto de roles y permisos
  • SEO-friendly: Herramientas integradas para optimización

JoomScan es crucial en auditorías de seguridad porque:

  • Fingerprinting: Identifica versiones específicas de Joomla
  • Detección de vulnerabilidades: Encuentra CVEs conocidos
  • Análisis de componentes: Enumera extensiones y sus versiones
  • Configuración insegura: Detecta archivos de backup y configuración expuestos
Terminal window
# JoomScan viene preinstalado en Kali Linux
joomscan --help
# Si no está instalado:
sudo apt update
sudo apt install joomscan
Terminal window
# Instalar dependencias
sudo apt update
sudo apt install git perl libwww-perl
# Clonar desde GitHub
git clone https://github.com/OWASP/joomscan.git
cd joomscan
chmod +x joomscan.pl
# Crear enlace simbólico (opcional)
sudo ln -s $(pwd)/joomscan.pl /usr/local/bin/joomscan
Terminal window
# Clonar repositorio oficial
git clone https://github.com/OWASP/joomscan.git
cd joomscan
# Instalar dependencias de Perl
sudo cpan install LWP::UserAgent
sudo cpan install HTTP::Request
sudo cpan install URI::URL
# Hacer ejecutable
chmod +x joomscan.pl
Terminal window
# Sintaxis general
joomscan [opciones] -u <URL>
# Escaneo básico
joomscan -u http://ejemplo.com
# Escaneo con todas las opciones
joomscan -u http://ejemplo.com -ec -at -ar -ah
ParámetroDescripciónEjemplo
-uURL objetivo-u http://ejemplo.com
-ecEnumerar componentes-ec
-epEnumerar plugins-ep
-etEnumerar templates-et
-elEnumerar idiomas-el
-atBuscar archivos de backup-at
-arBuscar robots.txt-ar
-ahBuscar archivos .htaccess-ah
-asBuscar archivos de configuración-as
ParámetroDescripciónEjemplo
-vModo verbose-v
-rGenerar reporte-r
--outputArchivo de salida--output reporte.txt
--no-colourSin colores--no-colour
Terminal window
# Escaneo básico de fingerprinting
joomscan -u http://ejemplo.com
# Ejemplo de salida:
# ____ _____ _____ __ __ ___ ___ _ _ _
# | _ \| _ || _ || \/ |/ __| / __| /_\ | \ | |
# | |_) | |_| || |_| || |\/| |\__ \| (__ //_\\ | \| |
# |____/|_____|_____|_| |_| |___/ \___|/_/ \_\_|\_|
#
# Target: http://ejemplo.com
# Joomla Version: 3.9.28
# Server: Apache/2.4.41
Terminal window
# Escaneo completo con todas las opciones
joomscan -u http://ejemplo.com -ec -ep -et -el -at -ar -ah -as -v
# Guardar resultados en archivo
joomscan -u http://ejemplo.com -ec -ep -et --output escaneo_completo.txt
Terminal window
# Crear lista de URLs
echo "http://sitio1.com" > urls.txt
echo "http://sitio2.com" >> urls.txt
echo "http://sitio3.com" >> urls.txt
# Escanear múltiples sitios
for url in $(cat urls.txt); do
echo "Escaneando: $url"
joomscan -u $url -ec -ep > "resultado_$(echo $url | sed 's/http:\/\///g' | sed 's/\//_/g').txt"
done
#!/bin/bash
# Script de auditoría automatizada para Joomla
# Uso: ./joomla_audit.sh <URL>
URL=$1
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
OUTPUT_DIR="joomla_audit_${TIMESTAMP}"
if [ -z "$URL" ]; then
echo "Uso: $0 <URL>"
exit 1
fi
echo "[+] Iniciando auditoría de Joomla para: $URL"
mkdir -p $OUTPUT_DIR
# 1. Escaneo básico de fingerprinting
echo "[+] Fase 1: Fingerprinting básico"
joomscan -u $URL > $OUTPUT_DIR/01_fingerprinting.txt
# 2. Enumeración de componentes
echo "[+] Fase 2: Enumeración de componentes"
joomscan -u $URL -ec > $OUTPUT_DIR/02_componentes.txt
# 3. Enumeración de plugins y templates
echo "[+] Fase 3: Enumeración de extensiones"
joomscan -u $URL -ep -et > $OUTPUT_DIR/03_extensiones.txt
# 4. Búsqueda de archivos sensibles
echo "[+] Fase 4: Archivos sensibles"
joomscan -u $URL -at -ar -ah -as > $OUTPUT_DIR/04_archivos_sensibles.txt
# 5. Escaneo completo con verbose
echo "[+] Fase 5: Escaneo completo"
joomscan -u $URL -ec -ep -et -el -at -ar -ah -as -v > $OUTPUT_DIR/05_escaneo_completo.txt
# 6. Verificaciones adicionales manuales
echo "[+] Fase 6: Verificaciones adicionales"
echo "=== Verificación de archivos comunes ===" > $OUTPUT_DIR/06_verificaciones_adicionales.txt
curl -s -o /dev/null -w "%{http_code}" $URL/configuration.php >> $OUTPUT_DIR/06_verificaciones_adicionales.txt
echo " - configuration.php" >> $OUTPUT_DIR/06_verificaciones_adicionales.txt
curl -s -o /dev/null -w "%{http_code}" $URL/configuration.php-dist >> $OUTPUT_DIR/06_verificaciones_adicionales.txt
echo " - configuration.php-dist" >> $OUTPUT_DIR/06_verificaciones_adicionales.txt
curl -s -o /dev/null -w "%{http_code}" $URL/htaccess.txt >> $OUTPUT_DIR/06_verificaciones_adicionales.txt
echo " - htaccess.txt" >> $OUTPUT_DIR/06_verificaciones_adicionales.txt
echo "[+] Auditoría completada. Resultados en: $OUTPUT_DIR"
#!/bin/bash
# Script para verificar versiones vulnerables de Joomla
check_joomla_vulnerabilities() {
local url=$1
local version=$(joomscan -u $url | grep "Joomla Version" | cut -d: -f2 | tr -d ' ')
echo "[+] Versión detectada: $version"
# Base de datos de versiones vulnerables (simplificada)
case $version in
"1.5."*|"1.6."*|"1.7."*|"2.5."*|"3.0."*|"3.1."*|"3.2."*|"3.3."*)
echo "[!] CRÍTICO: Versión muy antigua con múltiples vulnerabilidades"
echo " - Recomendación: Actualizar inmediatamente"
;;
"3.4."*|"3.5."*|"3.6."*|"3.7."*|"3.8."*)
echo "[!] ALTO: Versión con vulnerabilidades conocidas"
echo " - CVE-2018-6376: SQL Injection"
echo " - CVE-2018-6377: XSS"
;;
"3.9."*)
if [[ $version < "3.9.28" ]]; then
echo "[!] MEDIO: Versión con vulnerabilidades menores"
echo " - Recomendación: Actualizar a 3.9.28+"
else
echo "[+] Versión relativamente segura"
fi
;;
"4."*)
echo "[+] Versión moderna - Verificar actualizaciones menores"
;;
*)
echo "[?] Versión no reconocida: $version"
;;
esac
}
# Uso
check_joomla_vulnerabilities "http://ejemplo.com"
Terminal window
# Ejemplo de salida típica:
Target: http://ejemplo.com
Joomla Version: 3.9.28
Server: Apache/2.4.41 (Ubuntu)
X-Powered-By: PHP/7.4.3

Análisis:

  • Versión de Joomla: Identifica la versión exacta para buscar CVEs
  • Servidor web: Apache con versión específica
  • PHP: Versión del intérprete PHP
Terminal window
# Ejemplo de enumeración de componentes:
[+] Component: com_content (Core)
[+] Component: com_users (Core)
[+] Component: com_contact (Core)
[+] Component: com_akeeba (Third-party) - Version: 7.5.1
[+] Component: com_joomfish (Third-party) - VULNERABLE

Análisis:

  • Componentes core: Parte del núcleo de Joomla
  • Componentes third-party: Extensiones de terceros (mayor riesgo)
  • Versiones: Importante para verificar vulnerabilidades
Terminal window
# Archivos encontrados:
[+] configuration.php found (200)
[+] htaccess.txt found (200)
[+] robots.txt found (200)
[!] configuration.php-dist found (200) - SENSITIVE
[!] .htaccess backup found (200) - SENSITIVE

Análisis:

  • configuration.php: Contiene credenciales de base de datos
  • Archivos de backup: Pueden exponer información sensible
  • Códigos HTTP 200: Archivos accesibles públicamente
Terminal window
# Directorios comunes de Joomla
gobuster dir -u http://ejemplo.com -w /usr/share/wordlists/dirb/common.txt -x php,txt,xml
# Directorios específicos de Joomla
for dir in administrator components modules plugins templates cache logs tmp; do
echo "Verificando: /$dir"
curl -s -o /dev/null -w "%{http_code} - $dir\n" http://ejemplo.com/$dir/
done

Verificación de Archivos de Configuración

Section titled “Verificación de Archivos de Configuración”
# Script para verificar archivos sensibles
#!/bin/bash
check_sensitive_files() {
local url=$1
local files=(
"configuration.php"
"configuration.php-dist"
"configuration.php.bak"
"configuration.php.old"
"configuration.php~"
"htaccess.txt"
".htaccess.bak"
"web.config"
"web.config.txt"
"robots.txt"
"README.txt"
"LICENSE.txt"
"CHANGELOG.php"
)
echo "[+] Verificando archivos sensibles en: $url"
for file in "${files[@]}"; do
status=$(curl -s -o /dev/null -w "%{http_code}" "$url/$file")
if [ "$status" = "200" ]; then
echo "[!] ENCONTRADO: $file (HTTP $status)"
elif [ "$status" = "403" ]; then
echo "[?] PROHIBIDO: $file (HTTP $status) - Posiblemente existe"
fi
done
}
check_sensitive_files "http://ejemplo.com"
Terminal window
# Enumeración de usuarios a través de la API
curl -s "http://ejemplo.com/index.php?option=com_users&view=users&format=json" | jq '.'
# Enumeración a través de feeds RSS
curl -s "http://ejemplo.com/index.php?option=com_content&view=featured&format=feed" | grep -o "author.*" | head -10
# Enumeración a través de componentes
curl -s "http://ejemplo.com/index.php?option=com_contact&view=contacts&format=json" | jq '.[]'
Terminal window
# Escaneo de puertos seguido de JoomScan
nmap -sV -p 80,443 ejemplo.com
joomscan -u http://ejemplo.com -ec -ep
Terminal window
# Análisis complementario con Nikto
nikto -h http://ejemplo.com
joomscan -u http://ejemplo.com -at -ar -ah
Terminal window
# Configurar proxy para capturar tráfico de JoomScan
export http_proxy=http://127.0.0.1:8080
export https_proxy=http://127.0.0.1:8080
joomscan -u http://ejemplo.com -ec
Terminal window
# Si JoomScan encuentra parámetros vulnerables
# Ejemplo: com_content con parámetro id vulnerable
sqlmap -u "http://ejemplo.com/index.php?option=com_content&view=article&id=1" --dbs
#!/bin/bash
# Script de auditoría corporativa para múltiples sitios Joomla
corporate_audit() {
local company_name=$1
local urls_file=$2
local output_base="audit_${company_name}_$(date +%Y%m%d)"
mkdir -p $output_base
echo "[+] Iniciando auditoría corporativa para: $company_name"
while IFS= read -r url; do
site_name=$(echo $url | sed 's/https\?:\/\///g' | sed 's/\/.*//g')
echo "[+] Auditando: $site_name"
# Crear directorio para cada sitio
mkdir -p "$output_base/$site_name"
# JoomScan completo
joomscan -u $url -ec -ep -et -el -at -ar -ah -as -v > "$output_base/$site_name/joomscan_full.txt"
# Verificaciones adicionales
check_sensitive_files $url > "$output_base/$site_name/sensitive_files.txt"
# Resumen de vulnerabilidades
echo "=== RESUMEN DE $site_name ===" >> "$output_base/resumen_ejecutivo.txt"
grep -E "(VULNERABLE|CRITICAL|HIGH)" "$output_base/$site_name/joomscan_full.txt" >> "$output_base/resumen_ejecutivo.txt"
echo "" >> "$output_base/resumen_ejecutivo.txt"
done < $urls_file
echo "[+] Auditoría completada. Resultados en: $output_base"
}
# Uso:
# echo "http://sitio1.com" > sitios_empresa.txt
# echo "http://sitio2.com" >> sitios_empresa.txt
# corporate_audit "EmpresaXYZ" sitios_empresa.txt
#!/bin/bash
# Script de monitoreo continuo para cambios en Joomla
continuous_monitoring() {
local url=$1
local baseline_file="baseline_$(echo $url | sed 's/https\?:\/\///g' | sed 's/\//_/g').txt"
local current_file="current_$(date +%Y%m%d_%H%M%S).txt"
# Generar escaneo actual
joomscan -u $url -ec -ep -et > $current_file
if [ -f "$baseline_file" ]; then
echo "[+] Comparando con baseline..."
diff $baseline_file $current_file > changes.txt
if [ -s changes.txt ]; then
echo "[!] CAMBIOS DETECTADOS:"
cat changes.txt
# Enviar alerta (ejemplo con mail)
# mail -s "Cambios detectados en $url" admin@empresa.com < changes.txt
else
echo "[+] No se detectaron cambios"
fi
else
echo "[+] Creando baseline inicial..."
cp $current_file $baseline_file
fi
}
# Ejecutar cada 24 horas con cron:
# 0 2 * * * /path/to/continuous_monitoring.sh http://ejemplo.com
Terminal window
# JoomScan con User-Agent personalizado
# Nota: JoomScan no tiene opción nativa, usar proxy o modificar código
# Alternativa con curl para verificaciones manuales
curl -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" \
-s http://ejemplo.com/administrator/ | grep -i joomla
Terminal window
# Configurar proxy para JoomScan
export http_proxy=http://proxy.ejemplo.com:8080
export https_proxy=http://proxy.ejemplo.com:8080
joomscan -u http://objetivo.com -ec
# Rotar proxies (script personalizado)
#!/bin/bash
proxies=("proxy1:8080" "proxy2:8080" "proxy3:8080")
for proxy in "${proxies[@]}"; do
export http_proxy=http://$proxy
echo "[+] Usando proxy: $proxy"
joomscan -u http://objetivo.com -ec
sleep 60 # Delay entre escaneos
done
Terminal window
# Script con delays para evitar detección
slow_joomscan() {
local url=$1
echo "[+] Escaneo lento para evadir detección"
# Fingerprinting básico
joomscan -u $url
sleep 30
# Componentes
joomscan -u $url -ec
sleep 60
# Plugins
joomscan -u $url -ep
sleep 60
# Templates
joomscan -u $url -et
sleep 30
}
  1. Detección limitada: No detecta todas las extensiones
  2. Falsos positivos: Puede reportar componentes inexistentes
  3. Versiones desactualizadas: Base de datos de vulnerabilidades puede estar desactualizada
  4. Detección WAF: Puede ser bloqueado por firewalls de aplicación
  1. Combinar herramientas: Usar junto con Nikto, Nmap, etc.
  2. Verificación manual: Confirmar hallazgos manualmente
  3. Actualizar regularmente: Mantener JoomScan actualizado
  4. Documentar hallazgos: Registrar todos los resultados
  • Autorización: Solo usar en sitios propios o con autorización escrita
  • Términos de servicio: Respetar los términos de uso de los sitios
  • Legislación local: Cumplir con leyes locales de ciberseguridad
  • Responsible disclosure: Reportar vulnerabilidades de forma responsable
  • JoomlaVS: Scanner de vulnerabilidades específico
  • Joomla Security Scanner: Herramienta online
  • CMSmap: Scanner multi-CMS que incluye Joomla
  • WhatWeb: Identificación de tecnologías web

⚠️ IMPORTANTE: Esta documentación es únicamente para fines educativos y de investigación en ciberseguridad. El uso de JoomScan debe realizarse exclusivamente en:

  • Sistemas propios
  • Entornos de laboratorio
  • Sitios web con autorización explícita y por escrito

El uso no autorizado de estas técnicas puede constituir un delito en muchas jurisdicciones. Los autores no se hacen responsables del mal uso de esta información.