Skip to content

MageScan - Escáner de Vulnerabilidades para Magento

MageScan - Escáner de Vulnerabilidades para Magento

Section titled “MageScan - Escáner de Vulnerabilidades para Magento”

MageScan es una herramienta especializada en la detección de vulnerabilidades en sitios web que utilizan el CMS de comercio electrónico Magento. Esta herramienta automatiza el proceso de reconocimiento, identificación de versiones, detección de módulos vulnerables y análisis de configuraciones de seguridad específicas de Magento.

Magento es una plataforma de comercio electrónico de código abierto desarrollada en PHP, diseñada específicamente para tiendas online. Es conocida por:

  • Flexibilidad: Altamente personalizable y escalable
  • Funcionalidades avanzadas: Gestión de inventario, múltiples tiendas, SEO
  • Arquitectura modular: Sistema de extensiones y temas
  • Comunidad activa: Gran ecosistema de desarrolladores y plugins

MageScan es crucial para auditorías de tiendas online porque:

  • Datos sensibles: Información de clientes, tarjetas de crédito, pedidos
  • Superficie de ataque amplia: Múltiples módulos y extensiones
  • Configuraciones complejas: Muchas opciones de configuración de seguridad
  • Vulnerabilidades específicas: CVEs únicos de la plataforma Magento
Terminal window
# Clonar el repositorio oficial
git clone https://github.com/steverobbins/magescan.git
cd magescan
# Instalar dependencias con Composer
curl -sS https://getcomposer.org/installer | php
php composer.phar install
# Hacer ejecutable
chmod +x bin/magescan
Terminal window
# Instalar globalmente
composer global require steverobbins/magescan
# Agregar al PATH (si no está ya)
export PATH="$PATH:$HOME/.composer/vendor/bin"
# Verificar instalación
magescan --version
Terminal window
# Usar imagen Docker oficial
docker pull steverobbins/magescan
# Ejecutar con Docker
docker run --rm steverobbins/magescan scan:all http://ejemplo.com
Terminal window
# Descargar PHAR precompilado
wget https://github.com/steverobbins/magescan/releases/download/v1.12.9/magescan.phar
chmod +x magescan.phar
sudo mv magescan.phar /usr/local/bin/magescan
# Verificar instalación
magescan --version
Terminal window
# Sintaxis general
magescan [comando] [opciones] <URL>
# Escaneo completo
magescan scan:all http://ejemplo.com
# Escaneo específico
magescan scan:version http://ejemplo.com
magescan scan:modules http://ejemplo.com
magescan scan:catalog http://ejemplo.com
ComandoDescripciónUso
scan:allEscaneo completomagescan scan:all http://ejemplo.com
scan:versionDetectar versión de Magentomagescan scan:version http://ejemplo.com
scan:modulesEnumerar módulos instaladosmagescan scan:modules http://ejemplo.com
scan:catalogAnalizar catálogo de productosmagescan scan:catalog http://ejemplo.com
scan:patchVerificar parches de seguridadmagescan scan:patch http://ejemplo.com
scan:sitemapAnalizar sitemap.xmlmagescan scan:sitemap http://ejemplo.com
scan:techheaderVerificar headers técnicosmagescan scan:techheader http://ejemplo.com
scan:unreachableBuscar rutas inaccesiblesmagescan scan:unreachable http://ejemplo.com
OpciónDescripciónEjemplo
--formatFormato de salida (text, json, xml)--format=json
--show-modulesMostrar módulos en escaneo completo--show-modules
--insecureIgnorar certificados SSL--insecure
--user-agentUser-Agent personalizado--user-agent="Custom Agent"
Terminal window
# Escaneo básico para identificar Magento
magescan scan:version http://ejemplo.com
# Ejemplo de salida:
# +----------+------------------+
# | Key | Value |
# +----------+------------------+
# | Edition | Community |
# | Version | 2.4.3 |
# | Status | Up to date |
# +----------+------------------+
Terminal window
# Escaneo completo con todos los módulos
magescan scan:all http://ejemplo.com --show-modules
# Guardar resultados en JSON
magescan scan:all http://ejemplo.com --format=json > escaneo_magento.json
# Escaneo con User-Agent personalizado
magescan scan:all http://ejemplo.com --user-agent="Mozilla/5.0 (compatible; MageScan)"
Terminal window
# Verificar parches de seguridad aplicados
magescan scan:patch http://ejemplo.com
# Ejemplo de salida:
# +------------------+----------+
# | Patch | Status |
# +------------------+----------+
# | SUPEE-9767 | Applied |
# | SUPEE-10266 | Missing |
# | SUPEE-10570 | Applied |
# +------------------+----------+
#!/bin/bash
# Script de auditoría completa para Magento
# Uso: ./magento_audit.sh <URL>
URL=$1
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
OUTPUT_DIR="magento_audit_${TIMESTAMP}"
if [ -z "$URL" ]; then
echo "Uso: $0 <URL>"
exit 1
fi
echo "[+] Iniciando auditoría de Magento para: $URL"
mkdir -p $OUTPUT_DIR
# 1. Identificación de versión
echo "[+] Fase 1: Identificación de versión"
magescan scan:version $URL --format=json > $OUTPUT_DIR/01_version.json
# 2. Enumeración de módulos
echo "[+] Fase 2: Enumeración de módulos"
magescan scan:modules $URL --format=json > $OUTPUT_DIR/02_modules.json
# 3. Verificación de parches
echo "[+] Fase 3: Verificación de parches"
magescan scan:patch $URL --format=json > $OUTPUT_DIR/03_patches.json
# 4. Análisis de catálogo
echo "[+] Fase 4: Análisis de catálogo"
magescan scan:catalog $URL --format=json > $OUTPUT_DIR/04_catalog.json
# 5. Headers técnicos
echo "[+] Fase 5: Headers técnicos"
magescan scan:techheader $URL --format=json > $OUTPUT_DIR/05_headers.json
# 6. Rutas inaccesibles
echo "[+] Fase 6: Rutas inaccesibles"
magescan scan:unreachable $URL --format=json > $OUTPUT_DIR/06_unreachable.json
# 7. Sitemap
echo "[+] Fase 7: Análisis de sitemap"
magescan scan:sitemap $URL --format=json > $OUTPUT_DIR/07_sitemap.json
# 8. Escaneo completo
echo "[+] Fase 8: Escaneo completo"
magescan scan:all $URL --show-modules --format=json > $OUTPUT_DIR/08_full_scan.json
# 9. Verificaciones adicionales manuales
echo "[+] Fase 9: Verificaciones adicionales"
echo "=== Archivos sensibles ===" > $OUTPUT_DIR/09_additional_checks.txt
# Verificar archivos comunes de Magento
magento_files=(
"app/etc/local.xml"
"app/etc/config.xml"
"app/etc/enterprise.xml"
"var/log/system.log"
"var/log/exception.log"
"downloader/"
"shell/"
"dev/"
"errors/local.xml"
"api.php"
"cron.php"
"cron.sh"
)
for file in "${magento_files[@]}"; do
status=$(curl -s -o /dev/null -w "%{http_code}" "$URL/$file")
echo "$status - $file" >> $OUTPUT_DIR/09_additional_checks.txt
done
echo "[+] Auditoría completada. Resultados en: $OUTPUT_DIR"
# Generar resumen ejecutivo
echo "[+] Generando resumen ejecutivo..."
generate_executive_summary $OUTPUT_DIR
Terminal window
generate_executive_summary() {
local output_dir=$1
local summary_file="$output_dir/RESUMEN_EJECUTIVO.txt"
echo "=== RESUMEN EJECUTIVO DE AUDITORÍA MAGENTO ===" > $summary_file
echo "Fecha: $(date)" >> $summary_file
echo "URL: $URL" >> $summary_file
echo "" >> $summary_file
# Extraer información clave
if [ -f "$output_dir/01_version.json" ]; then
echo "=== VERSIÓN DETECTADA ===" >> $summary_file
jq -r '.version // "No detectada"' $output_dir/01_version.json >> $summary_file
jq -r '.edition // "No detectada"' $output_dir/01_version.json >> $summary_file
echo "" >> $summary_file
fi
# Parches faltantes
if [ -f "$output_dir/03_patches.json" ]; then
echo "=== PARCHES FALTANTES (CRÍTICO) ===" >> $summary_file
jq -r '.patches[] | select(.status == "Missing") | .name' $output_dir/03_patches.json >> $summary_file
echo "" >> $summary_file
fi
# Módulos vulnerables
if [ -f "$output_dir/02_modules.json" ]; then
echo "=== MÓDULOS DETECTADOS ===" >> $summary_file
jq -r '.modules[].name' $output_dir/02_modules.json | head -10 >> $summary_file
echo "" >> $summary_file
fi
# Archivos sensibles accesibles
echo "=== ARCHIVOS SENSIBLES ACCESIBLES ===" >> $summary_file
grep "200\|403" $output_dir/09_additional_checks.txt >> $summary_file
echo "[+] Resumen ejecutivo generado: $summary_file"
}

Análisis de Vulnerabilidades por Versión

Section titled “Análisis de Vulnerabilidades por Versión”
#!/bin/bash
check_magento_vulnerabilities() {
local url=$1
local version=$(magescan scan:version $url --format=json | jq -r '.version')
echo "[+] Analizando vulnerabilidades para Magento $version"
# Base de datos simplificada de vulnerabilidades por versión
case $version in
"1.9.0"*|"1.9.1"*|"1.9.2"*)
echo "[!] CRÍTICO: Versión con múltiples vulnerabilidades"
echo " - CVE-2016-4010: SQL Injection"
echo " - CVE-2016-4011: Remote Code Execution"
echo " - Recomendación: Actualizar a 1.9.4.5+"
;;
"1.9.3"*|"1.9.4.0"|"1.9.4.1"|"1.9.4.2"|"1.9.4.3"|"1.9.4.4")
echo "[!] ALTO: Versión con vulnerabilidades conocidas"
echo " - Múltiples CVEs de seguridad"
echo " - Recomendación: Actualizar a 1.9.4.5+"
;;
"2.0"*|"2.1"*|"2.2"*|"2.3.0"|"2.3.1"|"2.3.2")
echo "[!] ALTO: Versión Magento 2 con vulnerabilidades"
echo " - CVE-2019-7139: SQL Injection"
echo " - CVE-2019-7140: Remote Code Execution"
echo " - Recomendación: Actualizar a versión más reciente"
;;
"2.3.3"*|"2.3.4"*|"2.3.5"*|"2.3.6"*|"2.3.7"*)
echo "[!] MEDIO: Versión con vulnerabilidades menores"
echo " - Verificar parches de seguridad aplicados"
echo " - Recomendación: Actualizar a 2.4.x"
;;
"2.4"*)
echo "[+] Versión moderna - Verificar actualizaciones menores"
echo " - Mantener al día con parches de seguridad"
;;
*)
echo "[?] Versión no reconocida o no detectada: $version"
echo " - Verificar manualmente la versión"
;;
esac
}
# Uso
check_magento_vulnerabilities "http://ejemplo.com"
{
"edition": "Community",
"version": "2.4.3",
"status": "Up to date"
}

Análisis:

  • Edition: Community (gratuita) vs Enterprise (comercial)
  • Version: Versión específica para buscar CVEs
  • Status: Estado de actualización
{
"modules": [
{
"name": "Mage_Adminhtml",
"status": "enabled"
},
{
"name": "Mage_Catalog",
"status": "enabled"
},
{
"name": "Custom_Payment",
"status": "enabled",
"risk": "high"
}
]
}

Análisis:

  • Módulos core: Parte del núcleo de Magento
  • Módulos custom: Desarrollos personalizados (mayor riesgo)
  • Status: enabled/disabled
{
"patches": [
{
"name": "SUPEE-9767",
"status": "Applied",
"severity": "Critical"
},
{
"name": "SUPEE-10266",
"status": "Missing",
"severity": "High"
}
]
}

Análisis:

  • Applied: Parche instalado correctamente
  • Missing: Parche faltante (RIESGO)
  • Severity: Nivel de criticidad
Terminal window
# Directorios específicos de Magento
magento_dirs=(
"admin"
"adminhtml"
"app"
"downloader"
"shell"
"var"
"media"
"skin"
"js"
"errors"
"dev"
"api.php"
"cron.php"
"get.php"
"install.php"
)
echo "[+] Enumerando directorios de Magento"
for dir in "${magento_dirs[@]}"; do
status=$(curl -s -o /dev/null -w "%{http_code}" "http://ejemplo.com/$dir")
if [ "$status" = "200" ] || [ "$status" = "403" ]; then
echo "[!] Encontrado: $dir (HTTP $status)"
fi
done

Verificación de Archivos de Configuración

Section titled “Verificación de Archivos de Configuración”
#!/bin/bash
check_magento_config_files() {
local url=$1
local config_files=(
"app/etc/local.xml"
"app/etc/config.xml"
"app/etc/enterprise.xml"
"app/etc/modules/*.xml"
"errors/local.xml"
"var/log/system.log"
"var/log/exception.log"
"var/report/"
".htaccess"
"robots.txt"
"sitemap.xml"
)
echo "[+] Verificando archivos de configuración de Magento"
for file in "${config_files[@]}"; do
status=$(curl -s -o /dev/null -w "%{http_code}" "$url/$file")
case $status in
200)
echo "[!] CRÍTICO: $file accesible (HTTP $status)"
# Intentar obtener contenido si es XML
if [[ $file == *.xml ]]; then
content=$(curl -s "$url/$file" | head -5)
if [[ $content == *"<config>"* ]] || [[ $content == *"<xml"* ]]; then
echo " Contiene configuración XML sensible"
fi
fi
;;
403)
echo "[?] PROTEGIDO: $file (HTTP $status) - Existe pero inaccesible"
;;
404)
echo "[+] NO ENCONTRADO: $file (HTTP $status)"
;;
esac
done
}
check_magento_config_files "http://ejemplo.com"
#!/bin/bash
enumerate_magento_catalog() {
local url=$1
echo "[+] Enumerando catálogo de Magento"
# Intentar acceder al sitemap para obtener URLs
sitemap_content=$(curl -s "$url/sitemap.xml")
if [ ! -z "$sitemap_content" ]; then
echo "[+] Sitemap encontrado, extrayendo URLs de productos"
echo "$sitemap_content" | grep -oP '<loc>\K[^<]*' | grep -E "(product|category)" | head -20
fi
# Intentar enumeración directa de categorías
echo "[+] Probando categorías comunes"
common_categories=(
"electronics"
"clothing"
"books"
"home-garden"
"sports"
"toys"
"jewelry"
"automotive"
"health-beauty"
"computers"
)
for category in "${common_categories[@]}"; do
status=$(curl -s -o /dev/null -w "%{http_code}" "$url/$category.html")
if [ "$status" = "200" ]; then
echo "[+] Categoría encontrada: $category"
fi
done
# Intentar acceso a API REST
echo "[+] Verificando API REST de Magento"
api_endpoints=(
"rest/V1/products"
"rest/V1/categories"
"rest/V1/customers"
"api/rest/products"
"api/rest/categories"
)
for endpoint in "${api_endpoints[@]}"; do
status=$(curl -s -o /dev/null -w "%{http_code}" "$url/$endpoint")
if [ "$status" = "200" ] || [ "$status" = "401" ]; then
echo "[!] API endpoint accesible: $endpoint (HTTP $status)"
fi
done
}
enumerate_magento_catalog "http://ejemplo.com"
Terminal window
# Escaneo de puertos seguido de MageScan
nmap -sV -p 80,443 ejemplo.com
magescan scan:all http://ejemplo.com
Terminal window
# Análisis complementario con Nikto
nikto -h http://ejemplo.com
magescan scan:all http://ejemplo.com --show-modules
Terminal window
# Configurar proxy para capturar tráfico
export http_proxy=http://127.0.0.1:8080
export https_proxy=http://127.0.0.1:8080
magescan scan:all http://ejemplo.com
Terminal window
# Si se encuentran parámetros vulnerables
# Ejemplo: página de producto con parámetro id
sqlmap -u "http://ejemplo.com/catalog/product/view/id/1" --dbs
#!/bin/bash
ecommerce_security_audit() {
local url=$1
local output_dir="ecommerce_audit_$(date +%Y%m%d_%H%M%S)"
mkdir -p $output_dir
echo "[+] Iniciando auditoría de seguridad para e-commerce: $url"
# 1. Identificación de plataforma
echo "[+] Identificando plataforma de e-commerce"
magescan scan:version $url > $output_dir/platform_detection.txt
# 2. Análisis de seguridad específico
echo "[+] Análisis de seguridad específico de Magento"
magescan scan:all $url --show-modules --format=json > $output_dir/magento_security.json
# 3. Verificación de datos sensibles
echo "[+] Verificando exposición de datos sensibles"
check_sensitive_data_exposure $url > $output_dir/sensitive_data.txt
# 4. Análisis de formularios de pago
echo "[+] Analizando formularios de pago"
analyze_payment_forms $url > $output_dir/payment_analysis.txt
# 5. Verificación SSL/TLS
echo "[+] Verificando configuración SSL/TLS"
sslscan $url > $output_dir/ssl_analysis.txt
echo "[+] Auditoría de e-commerce completada: $output_dir"
}
check_sensitive_data_exposure() {
local url=$1
echo "=== VERIFICACIÓN DE EXPOSICIÓN DE DATOS SENSIBLES ==="
# Verificar logs accesibles
log_files=(
"var/log/system.log"
"var/log/exception.log"
"var/log/payment.log"
"var/report/"
)
for log in "${log_files[@]}"; do
status=$(curl -s -o /dev/null -w "%{http_code}" "$url/$log")
if [ "$status" = "200" ]; then
echo "[!] CRÍTICO: Log accesible - $log"
fi
done
# Verificar archivos de configuración con credenciales
config_files=(
"app/etc/local.xml"
"app/etc/config.xml"
)
for config in "${config_files[@]}"; do
content=$(curl -s "$url/$config")
if [[ $content == *"<password>"* ]] || [[ $content == *"<username>"* ]]; then
echo "[!] CRÍTICO: Credenciales expuestas en $config"
fi
done
}
analyze_payment_forms() {
local url=$1
echo "=== ANÁLISIS DE FORMULARIOS DE PAGO ==="
# Buscar páginas de checkout
checkout_pages=(
"checkout"
"onepage"
"payment"
"billing"
)
for page in "${checkout_pages[@]}"; do
status=$(curl -s -o /dev/null -w "%{http_code}" "$url/$page")
if [ "$status" = "200" ]; then
echo "[+] Página de pago encontrada: $page"
# Verificar si usa HTTPS
https_status=$(curl -s -o /dev/null -w "%{http_code}" "https://$(echo $url | sed 's/http:\/\///')/$page")
if [ "$https_status" = "200" ]; then
echo "[+] HTTPS disponible para $page"
else
echo "[!] RIESGO: HTTPS no disponible para $page"
fi
fi
done
}
Terminal window
# MageScan con User-Agent personalizado
magescan scan:all http://ejemplo.com --user-agent="Mozilla/5.0 (compatible; Googlebot/2.1)"
# Rotar User-Agents
user_agents=(
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36"
"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
)
for ua in "${user_agents[@]}"; do
echo "[+] Usando User-Agent: $ua"
magescan scan:version http://ejemplo.com --user-agent="$ua"
sleep 30
done
Terminal window
# Configurar proxy para MageScan (requiere configuración adicional)
export http_proxy=http://proxy.ejemplo.com:8080
export https_proxy=http://proxy.ejemplo.com:8080
magescan scan:all http://objetivo.com
#!/bin/bash
distributed_magento_scan() {
local url=$1
local proxy_list=$2
echo "[+] Iniciando escaneo distribuido de Magento"
# Dividir escaneos por proxy
commands=(
"scan:version"
"scan:modules"
"scan:patch"
"scan:catalog"
"scan:techheader"
)
proxy_index=0
for command in "${commands[@]}"; do
proxy=$(sed -n "${proxy_index}p" $proxy_list)
if [ ! -z "$proxy" ]; then
echo "[+] Ejecutando $command con proxy $proxy"
export http_proxy=http://$proxy
export https_proxy=http://$proxy
magescan $command $url --format=json > "${command}_result.json"
unset http_proxy https_proxy
sleep 60
fi
proxy_index=$((proxy_index + 1))
done
}
# Uso:
# echo "proxy1.com:8080" > proxies.txt
# echo "proxy2.com:8080" >> proxies.txt
# distributed_magento_scan "http://ejemplo.com" "proxies.txt"
  1. Detección de versión: Puede fallar en instalaciones muy personalizadas
  2. Módulos custom: No detecta todos los módulos de terceros
  3. Falsos positivos: Puede reportar módulos inexistentes
  4. Actualizaciones: Base de datos de parches puede estar desactualizada
  1. Combinar herramientas: Usar junto con Nmap, Nikto, etc.
  2. Verificación manual: Confirmar hallazgos importantes
  3. Actualizar regularmente: Mantener MageScan actualizado
  4. Documentar todo: Registrar todos los hallazgos
  • Autorización: Solo usar en tiendas propias o con autorización escrita
  • PCI DSS: Considerar requisitos de seguridad para datos de tarjetas
  • GDPR/CCPA: Cumplir con regulaciones de protección de datos
  • Responsible disclosure: Reportar vulnerabilidades de forma responsable
  • Magereport: Análisis online de seguridad para Magento
  • MageReport: Scanner web gratuito
  • n98-magerun: Herramienta CLI para Magento
  • Magento Security Scan Tool: Herramienta oficial de Magento

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

  • Tiendas online propias
  • 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 y violar regulaciones como PCI DSS. Los autores no se hacen responsables del mal uso de esta información.