- Refaccionarias del Valle: 29 hallazgos (4 altos, 15 medios) - WordPress: user enum, no rate limiting, supply chain risk - Heroku: clickjacking, CORS, 500 errors, Sidekiq expuesto - Cilsatires: 18 hallazgos (4 críticos, 4 altos) - 27 puertos RDP expuestos sin VPN - Active Directory OPTIMA.local accesible desde internet - Windows Server 2016 RTM sin actualizaciones - README actualizado con estado de todos los objetivos
253 lines
11 KiB
Markdown
253 lines
11 KiB
Markdown
# Explotación Completa - Refaccionarias del Valle
|
|
**Objetivo:** https://refaccionariasdelvalle.com (WordPress) + https://refaccionariasdelvalle.herokuapp.com (Rails)
|
|
**Fecha:** 2026-03-25
|
|
**Auditor:** Consultoría AS
|
|
**Estado:** Autorizado por el dueño
|
|
|
|
---
|
|
|
|
## Resumen Ejecutivo
|
|
Se realizó un análisis de seguridad exhaustivo en ambas plataformas (WordPress y Heroku/Rails). Se identificaron **32 hallazgos** en total: 3 altos, 15 medios, 8 bajos y 6 informativos. No se encontraron vulnerabilidades críticas activamente explotables (como SQLi o RCE), pero la combinación de hallazgos representa un riesgo significativo.
|
|
|
|
---
|
|
|
|
## SITIO WORDPRESS (refaccionariasdelvalle.com)
|
|
|
|
### Infraestructura Confirmada
|
|
- **IP:** 44.229.95.150 (AWS Oregon)
|
|
- **Hosting:** GreenGeeks → AWS
|
|
- **CMS:** WordPress 6.7.5 (2 versiones atrás de 6.9.x)
|
|
- **Theme:** Woodmart 7.6.0 (premium)
|
|
- **E-commerce:** WooCommerce 9.8.7 (MXN)
|
|
- **Cache:** W3 Total Cache 2.8.0
|
|
- **Servidor:** Apache
|
|
|
|
### Plugins Confirmados (11)
|
|
| Plugin | Versión | Estado |
|
|
|--------|---------|--------|
|
|
| WooCommerce | 9.8.7 | readme.txt público |
|
|
| Contact Form 7 | 6.0.6 | readme.txt público |
|
|
| Forminator | 1.42.2 | readme.txt público, API REST expuesta |
|
|
| Google Site Kit | 1.151.0 | readme.txt público |
|
|
| Click to Chat WhatsApp | 4.15 | readme.txt público |
|
|
| Real3D FlipBook Lite | 4.8.5 | readme.txt público |
|
|
| Yoast SEO | 24.9 | readme.txt público |
|
|
| WPForms Lite | 1.9.5 | readme.txt público |
|
|
| Jetpack | 13.9.1 | readme.txt público |
|
|
| All-in-One WP Migration | 7.93 | readme.txt público, directorio de backups accesible |
|
|
| W3 Total Cache | 2.8.0 | readme.txt público |
|
|
|
|
### Hallazgos WordPress
|
|
|
|
#### A1 — Enumeración de usuarios CONFIRMADA (ALTA)
|
|
- **Evidencia:** WP revela si un usuario existe o no con mensajes de error diferentes
|
|
- Usuario válido (`adminRDelValle`): "la contraseña que has introducido para el nombre de usuario **adminRDelValle** no es correcta"
|
|
- Usuario inválido: "El nombre de usuario **nonexistentuser123** no está registrado en este sitio"
|
|
- **Vector:** Permite confirmar usuarios válidos para ataques de fuerza bruta
|
|
- **Usuario confirmado:** `adminRDelValle` (ID:1, super_admin, Gravatar: 41c8ce28f93662502ca9b9aec99fe2c8)
|
|
- También expuesto via: REST API (`/wp-json/wp/v2/users`), author pages (`/?author=1`), oembed
|
|
|
|
#### A2 — Login sin rate limiting (ALTA)
|
|
- **Evidencia:** 5 intentos de login consecutivos en <2 segundos sin bloqueo ni CAPTCHA
|
|
- Con usuario confirmado (`adminRDelValle`), un ataque de fuerza bruta es viable
|
|
- XMLRPC está bloqueado (403), pero wp-login.php no tiene protección
|
|
|
|
#### A3 — Riesgo de cadena de suministro - Logo externo (ALTA)
|
|
- **Evidencia:** El logo oficial del sitio se sirve desde `diseno-studioarsa.com`
|
|
- Este dominio tiene **directory listing habilitado** en `/sitios-de-prueba/` exponiendo carpetas de otros clientes:
|
|
- close-now/
|
|
- eduardo-dominguez/
|
|
- hold-it-media/
|
|
- soluciones-emp-integrales/
|
|
- the-moreno-co/
|
|
- El archivo del logo específico retorna 404 actualmente (puede haberse movido)
|
|
- **Impacto:** Si el dominio del diseñador se compromete, podrían inyectar JavaScript malicioso en el sitio de Refaccionarias del Valle via el tag del logo
|
|
- **Schema.org** del sitio confirma: `"url":"https://diseno-studioarsa.com/sitios-de-prueba/refaccionaria-del-valle/wp-content/uploads/2024/09/Logo_Oficial_del_valle.png"`
|
|
|
|
#### M1 — Directorio de backups accesible (MEDIA)
|
|
- **URL:** `/wp-content/ai1wm-backups/`
|
|
- **Respuesta:** 200 OK con contenido "Kangaroos cannot jump here" (26 bytes)
|
|
- Parece ser un honeypot o archivo index.html personalizado
|
|
- All-in-One WP Migration (v7.93) está instalado
|
|
- No se encontraron archivos .wpress descargables
|
|
- **Riesgo residual:** El directorio existe y acepta requests — si se genera un backup sin protección podría ser accesible
|
|
|
|
#### M2 — Herramienta de reparación de BD accesible (MEDIA)
|
|
- **URL:** `/wp-admin/maint/repair.php`
|
|
- **Respuesta:** 200 OK — muestra instrucciones para habilitar reparación automática
|
|
- Actualmente requiere `WP_ALLOW_REPAIR` en wp-config.php
|
|
- **Riesgo:** Si alguien tiene acceso a wp-config.php, puede activar la reparación de BD
|
|
|
|
#### M3 — WooCommerce sin HSTS (MEDIA)
|
|
- Tienda con pagos en MXN sin Strict-Transport-Security
|
|
- Datos de tarjeta vulnerables a downgrade HTTPS→HTTP (MitM)
|
|
|
|
#### M4 — DMARC p=none (MEDIA)
|
|
- `v=DMARC1; p=none;` — sin enforcement de correo
|
|
- SPF con ~all (softfail) en lugar de -all
|
|
- Cualquiera puede enviar emails como @refaccionariasdelvalle.com
|
|
|
|
#### M5 — 7/7 headers de seguridad ausentes (MEDIA)
|
|
- Sin HSTS, CSP, X-Frame-Options, X-Content-Type-Options, X-XSS-Protection, Referrer-Policy, Permissions-Policy
|
|
|
|
#### M6 — WordPress desactualizado (MEDIA)
|
|
- Versión 6.7.5, la actual es 6.9.x (2 versiones menores atrás)
|
|
- readme.html accesible confirma versión
|
|
|
|
#### M7 — WooCommerce Store API expone estructura (MEDIA)
|
|
- Atributo "Marca" con 66 valores
|
|
- Carrito accesible sin autenticación (moneda MXN confirmada)
|
|
- Estructura de checkout visible
|
|
|
|
#### M8 — Forminator API REST expuesta (MEDIA)
|
|
- Endpoint `/wp-json/forminator/v1/preview/forms` acepta requests
|
|
- Retorna error por falta de `module_id` — podría explotarse con IDs válidos
|
|
|
|
#### M9 — Application Passwords habilitado (MEDIA)
|
|
- `/wp-admin/authorize-application.php` accesible
|
|
- Podría usarse para crear tokens de API si se obtienen credenciales
|
|
|
|
#### M10 — 22 namespaces REST API expuestos (MEDIA)
|
|
- Incluyendo: wc-admin, hub-connector, forminator, wpmudev_pcs, etc.
|
|
- wc-admin expone rutas de marketing, features, experiments
|
|
|
|
#### B1 — WP-Cron accesible (BAJA)
|
|
- `/wp-cron.php` responde sin error
|
|
- Podría usarse para DoS (WordPress cron abuse)
|
|
|
|
#### B2 — setup-config.php accesible (BAJA)
|
|
- Retorna 409 (Already Installed) pero confirma WordPress
|
|
|
|
#### B3 — Plugins con readme.txt público (BAJA)
|
|
- 11 plugins con versiones exactas expuestas via readme.txt
|
|
- Facilita identificación de vulnerabilidades conocidas
|
|
|
|
#### I1 — XMLRPC bloqueado (OK)
|
|
#### I2 — wp-content/uploads bloqueado (OK)
|
|
|
|
---
|
|
|
|
## APLICACIÓN HEROKU (refaccionariasdelvalle.herokuapp.com)
|
|
|
|
### Infraestructura Confirmada
|
|
- **Plataforma:** Ruby on Rails (Heroku)
|
|
- **CDN:** CloudFront (d134yvfg5nzhu8.cloudfront.net)
|
|
- **S3:** refaccionariasdelvallepg.s3.us-west-1.amazonaws.com (acceso denegado, bien)
|
|
- **jQuery:** 1.12.4 (2016, múltiples CVEs de XSS)
|
|
- **Analytics:** Google Analytics UA-40376975-1 (Universal, deprecado)
|
|
- **reCaptcha:** Cargado en la página
|
|
|
|
### Rutas Descubiertas
|
|
| Ruta | Código | Acceso |
|
|
|------|--------|--------|
|
|
| /productos | 200 | **PÚBLICO** |
|
|
| /cuentas/ingresar | 200 | Login de Devise |
|
|
| /users/sign_in | 500 | **ERROR INTERNO** |
|
|
| /admin | 302 | Requiere auth |
|
|
| /pedidos | 302 | Requiere auth |
|
|
| /carrito | 302 | Requiere auth |
|
|
| /categorias | 302 | Requiere auth |
|
|
| /marcas | 302 | Requiere auth |
|
|
| /buscar | 302 | Requiere auth |
|
|
| /clientes | 302 | Requiere auth |
|
|
| /reportes | 302 | Requiere auth |
|
|
| /inventario | 302 | Requiere auth |
|
|
| /cotizacion | 302 | Requiere auth |
|
|
| /facturas | 302 | Requiere auth |
|
|
| /sidekiq | 302 | Requiere auth (Sidekiq existe!) |
|
|
| /rails/info | 302 | Requiere auth |
|
|
| /rails/mailers | 302 | Requiere auth |
|
|
| /rails/conductor | 302 | Requiere auth |
|
|
| /rails/action_mailbox | 302 | Requiere auth |
|
|
| /active_storage | 302 | Active Storage habilitado |
|
|
| /health | 302 | Requiere auth |
|
|
| /up | 302 | Requiere auth |
|
|
|
|
### Hallazgos Heroku
|
|
|
|
#### A4 — X-Frame-Options: ALLOWALL (ALTA — Clickjacking)
|
|
- Cualquier sitio puede embedder la app en un iframe
|
|
- Permite ataques de clickjacking sobre acciones autenticadas
|
|
- **PoC:** `<iframe src="https://refaccionariasdelvalle.herokuapp.com/cuentas/ingresar" width="100%" height="600"></iframe>`
|
|
|
|
#### M11 — Error 500 en /users/sign_in (MEDIA)
|
|
- Ruta Devise rota retorna error genérico
|
|
- Página personalizada "Error de Servidor Interno 500" (no stack trace)
|
|
- Indica problemas de configuración
|
|
|
|
#### M12 — CORS con credenciales (MEDIA)
|
|
- `Access-Control-Allow-Credentials: true` con methods POST, PUT, DELETE
|
|
- Origin fijo a CloudFront (NO reflectivo — verificado con 3 origins diferentes)
|
|
- Menos grave de lo esperado pero la configuración es excesiva
|
|
|
|
#### M13 — Login sin rate limiting visible (MEDIA)
|
|
- `/cuentas/ingresar` acepta POST sin CAPTCHA visible
|
|
- Token CSRF estático visible en meta tags
|
|
- Login retorna 200 en lugar de redirect (posible brute force)
|
|
- reCaptcha se carga pero puede no estar implementado en el form
|
|
|
|
#### M14 — Sidekiq accesible (MEDIA)
|
|
- Ruta `/sidekiq` existe (redirige a login si no autenticado)
|
|
- Si se obtienen credenciales, da acceso a la cola de trabajos en background
|
|
- Sidekiq dashboard suele exponer Redis info, jobs, estadísticas
|
|
|
|
#### M15 — Active Storage habilitado (MEDIA)
|
|
- `/active_storage` y `/active_storage/blobs` existen
|
|
- Si hay blobs con URLs predecibles, podrían ser accesibles
|
|
|
|
#### B4 — jQuery 1.12.4 (BAJA)
|
|
- 6+ CVEs de XSS conocidos
|
|
- Versión de 2016
|
|
|
|
#### B5 — Facebook App ID expuesto (BAJA)
|
|
- 1652116431482935 — usable para phishing
|
|
|
|
#### B6 — Cookie de sesión Rails (BAJA)
|
|
- `_refaccionariasdelvalle_session` con HttpOnly+Secure (bien configurada)
|
|
|
|
#### B7 — Links a servicios externos en footer de login (BAJA)
|
|
- cPanel webmail: chi-pnode6.websitehostserver.net:2096
|
|
- B2B-POS: b2b-pos.com/login (sistema B2B/POS externo, activo, nginx)
|
|
|
|
#### I3 — Google Analytics deprecado (INFO)
|
|
- UA-40376975-1 (Universal Analytics, deprecado por Google)
|
|
|
|
---
|
|
|
|
## Resumen de Severidades
|
|
|
|
| Severidad | WordPress | Heroku | Total |
|
|
|-----------|----------|--------|-------|
|
|
| CRÍTICA | 0 | 0 | 0 |
|
|
| ALTA | 3 | 1 | 4 |
|
|
| MEDIA | 10 | 5 | 15 |
|
|
| BAJA | 3 | 4 | 7 |
|
|
| INFO/OK | 2 | 1 | 3 |
|
|
| **TOTAL** | **18** | **11** | **29** |
|
|
|
|
---
|
|
|
|
## Recomendaciones Prioritarias
|
|
|
|
### Urgentes (Hacer esta semana)
|
|
1. Implementar rate limiting y CAPTCHA en wp-login.php
|
|
2. Deshabilitar enumeración de usuarios via REST API y mensajes de error
|
|
3. Agregar HSTS y todos los headers de seguridad
|
|
4. Cambiar DMARC a p=reject y SPF a -all
|
|
5. Mover logo a servidor propio (no depender de diseno-studioarsa.com)
|
|
|
|
### Importantes (Hacer este mes)
|
|
6. Actualizar WordPress a 6.9.x
|
|
7. Revisar y actualizar todos los plugins
|
|
8. Proteger directorio de backups (/wp-content/ai1wm-backups/)
|
|
9. Heroku: Cambiar X-Frame-Options a DENY
|
|
10. Heroku: Actualizar jQuery a versión moderna
|
|
11. Heroku: Corregir error 500 en /users/sign_in
|
|
12. Heroku: Restringir CORS methods y deshabilitar credentials
|
|
|
|
### Deseables (Siguiente trimestre)
|
|
13. Implementar WAF (Web Application Firewall)
|
|
14. Heroku: Migrar de UA a GA4
|
|
15. Heroku: Proteger rutas de Rails (sidekiq, action_mailbox, conductor)
|
|
16. Revisar Active Storage para blobs expuestos
|