322 lines
15 KiB
Markdown
322 lines
15 KiB
Markdown
# Explotación Completa - Refaccionarias del Valle
|
|
**Objetivo:** https://refaccionariasdelvalle.com (WordPress/WooCommerce) + https://refaccionariasdelvalle.herokuapp.com (Ruby on 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. Se identificaron **35 hallazgos** en total: 1 alta especial (supply chain), 4 altos, 16 medios, 9 bajos y 5 informativos. La infraestructura principal (WordPress) tiene buenas protecciones base (XMLRPC bloqueado, uploads protegidos, WooCommerce API v3 requiere auth), pero presenta debilidades significativas en enumeración de usuarios, falta de rate limiting, y dependencia de terceros. La aplicación Heroku (legacy) tiene problemas de clickjacking y CORS.
|
|
|
|
---
|
|
|
|
## SITIO WORDPRESS (refaccionariasdelvalle.com)
|
|
|
|
### Infraestructura Confirmada
|
|
- **IP:** 44.229.95.150 (AWS Oregon)
|
|
- **Hosting:** GreenGeeks → AWS
|
|
- **CMS:** WordPress 6.7.5 (2 versiones menores atrás de 6.9.x)
|
|
- **Theme:** Woodmart 7.6.0 (premium, con WPBakery 7.9 integrado)
|
|
- **E-commerce:** WooCommerce 9.8.7 (MXN, 66 marcas de refacciones)
|
|
- **Cache:** W3 Total Cache 2.8.0
|
|
- **Servidor:** Apache
|
|
|
|
### Plugins Confirmados (11)
|
|
| Plugin | Versión | Readme público |
|
|
|--------|---------|---------------|
|
|
| WooCommerce | 9.8.7 | Sí |
|
|
| WPBakery (js_composer) | 7.9 | Sí (changelog.txt) |
|
|
| Contact Form 7 | 6.0.6 | Sí |
|
|
| Forminator | 1.42.2 | Sí |
|
|
| Google Site Kit | 1.151.0 | Sí |
|
|
| Click to Chat WhatsApp | 4.15 | Sí |
|
|
| Real3D FlipBook Lite | 4.8.5 | Sí |
|
|
| Yoast SEO | 24.9 | Sí |
|
|
| WPForms Lite | 1.9.5 | Sí |
|
|
| Jetpack | 13.9.1 | Sí |
|
|
| All-in-One WP Migration | 7.93 | Sí |
|
|
| W3 Total Cache | 2.8.0 | Sí |
|
|
|
|
### 23 Namespaces REST API Expuestos
|
|
```
|
|
oembed/1.0, contact-form-7/v1, wc/v3, yoast/v1, jetpack/v4, wc-admin,
|
|
wc-analytics, wc/store, wc/store/v1, wc/private, wc/v2, google-site-kit/v1,
|
|
hub-connector/v1, forminator/v1, wc/v1, wc-admin-email, wc-telemetry,
|
|
wccom-site/v3, wpmudev_pcs/v1, wpforms/v1, wp/v2, wp-site-health/v1,
|
|
wp-block-editor/v1
|
|
```
|
|
|
|
### Datos Accesibles SIN Autenticación
|
|
| Recurso | Endpoint | Accesible |
|
|
|---------|----------|-----------|
|
|
| Usuarios | /wp-json/wp/v2/users | ✅ (1 usuario: adminRDelValle) |
|
|
| Páginas | /wp-json/wp/v2/pages | ✅ (17 páginas) |
|
|
| Posts | /wp-json/wp/v2/posts | ✅ |
|
|
| Media | /wp-json/wp/v2/media | ✅ (imágenes con URLs) |
|
|
| Comentarios | /wp-json/wp/v2/comments | ✅ |
|
|
| Búsqueda | /wp-json/wp/v2/search | ✅ |
|
|
| Productos (Store) | /wp-json/wc/store/v1/products | ✅ (0 productos públicos actualmente) |
|
|
| Atributos | /wp-json/wc/store/v1/products/attributes | ✅ (66 marcas) |
|
|
| Carrito | /wp-json/wc/store/v1/cart | ✅ |
|
|
| Jetpack estado | /wp-json/jetpack/v4/connection | ✅ (desconectado) |
|
|
| Woodmart AJAX search | admin-ajax.php?action=woodmart_ajax_search | ✅ |
|
|
|
|
### Datos Protegidos (requieren autenticación) ✅
|
|
- WooCommerce API v3 (products, orders, customers) → 401
|
|
- WC-Analytics (reports, revenue, orders) → 401
|
|
- WC-Admin (features, options, plugins) → 401
|
|
- Google Site Kit (connection, auth) → 401
|
|
- Yoast (statistics) → 401
|
|
- WP Site Health (tests, directory-sizes) → 401
|
|
- Hub Connector (sync) → 404 (GET, requiere POST)
|
|
- Jetpack data → 401
|
|
|
|
---
|
|
|
|
### Hallazgos WordPress
|
|
|
|
#### A1 — Riesgo de Cadena de Suministro via Diseñador (ALTA — CVSS 7.5)
|
|
- **Evidencia:** El logo oficial del sitio se sirve desde `diseno-studioarsa.com`
|
|
- El dominio del diseñador tiene **directory listing habilitado** en `/sitios-de-prueba/`
|
|
- Carpetas de 5 OTROS clientes expuestas:
|
|
- close-now/
|
|
- eduardo-dominguez/
|
|
- hold-it-media/
|
|
- soluciones-emp-integrales/
|
|
- the-moreno-co/
|
|
- **Schema.org** del sitio confirma la dependencia: `"url":"https://diseno-studioarsa.com/sitios-de-prueba/refaccionaria-del-valle/wp-content/uploads/..."`
|
|
- **Impacto:** Si diseno-studioarsa.com se compromete → XSS/JavaScript injection en Refaccionarias del Valle y todos los otros clientes del diseñador
|
|
|
|
#### A2 — Enumeración de Usuarios CONFIRMADA (ALTA — CVSS 6.5)
|
|
- **Evidencia:** WordPress revela si un usuario existe o no con mensajes de error diferentes:
|
|
- Usuario válido: "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"
|
|
- **Usuario confirmado:** `adminRDelValle` (ID:1, super_admin)
|
|
- Expuesto por 4 vías: REST API, author pages, oembed, mensajes de error de login
|
|
- **Gravatar hash:** 41c8ce28f93662502ca9b9aec99fe2c8
|
|
|
|
#### A3 — wp-login.php sin Rate Limiting (ALTA — CVSS 7.0)
|
|
- **Evidencia:** 5+ intentos consecutivos en <2 segundos sin bloqueo ni CAPTCHA
|
|
- Con usuario conocido (`adminRDelValle`), fuerza bruta es completamente viable
|
|
- XMLRPC está bloqueado (403), pero wp-login.php no tiene protección
|
|
|
|
#### A4 — WooCommerce sin HSTS (ALTA — CVSS 6.0)
|
|
- Tienda con pagos en MXN sin Strict-Transport-Security
|
|
- Datos de tarjeta vulnerables a downgrade HTTPS→HTTP (MitM)
|
|
|
|
#### M1 — DMARC p=none + SPF ~all (MEDIA — CVSS 5.5)
|
|
- `v=DMARC1; p=none;` — sin enforcement
|
|
- SPF con ~all (softfail) en lugar de -all
|
|
- **Impacto:** Cualquiera puede enviar emails como @refaccionariasdelvalle.com (phishing)
|
|
|
|
#### M2 — 7/7 Headers de Seguridad Ausentes (MEDIA — CVSS 5.0)
|
|
- Sin: HSTS, CSP, X-Frame-Options, X-Content-Type-Options, X-XSS-Protection, Referrer-Policy, Permissions-Policy
|
|
|
|
#### M3 — Jetpack Instalado pero NO Conectado (MEDIA — CVSS 4.5)
|
|
- isActive: false, isRegistered: false, isUserConnected: false
|
|
- Endpoints de registro expuestos: `/remote_authorize`, `/remote_provision`, `/remote_register`, `/remote_connect`
|
|
- **Riesgo:** Un atacante podría intentar conectar una cuenta Jetpack rogue si obtiene acceso al admin
|
|
|
|
#### M4 — WordPress 6.7.5 Desactualizado (MEDIA — CVSS 4.5)
|
|
- 2 versiones menores atrás de 6.9.x
|
|
- readme.html confirma versión
|
|
|
|
#### M5 — WPBakery 7.9 con changelog.txt público (MEDIA — CVSS 4.0)
|
|
- Historial completo de versiones y fixes de seguridad visible
|
|
- CVE-2024-6457 (XSS) fue corregido en 7.8, versión 7.9 está parcheada para ese CVE específico
|
|
|
|
#### M6 — Directorio de Backups Accesible (MEDIA — CVSS 4.5)
|
|
- `/wp-content/ai1wm-backups/` retorna 200 OK
|
|
- Contenido: "Kangaroos cannot jump here" (honey pot o index personalizado)
|
|
- All-in-One WP Migration v7.93 instalado
|
|
- **Riesgo residual:** Si se genera un backup sin protección, sería accesible
|
|
|
|
#### M7 — Herramienta de Reparación de BD Accesible (MEDIA — CVSS 3.5)
|
|
- `/wp-admin/maint/repair.php` retorna 200
|
|
- Requiere `WP_ALLOW_REPAIR` en wp-config.php para activarse
|
|
|
|
#### M8 — Búsqueda Refleja Input sin XSS (MEDIA — CVSS 3.5)
|
|
- El término de búsqueda se refleja en 11 ubicaciones (título, og:title, twitter:title, breadcrumbs, JSON-LD)
|
|
- HTML está correctamente escapado (< → <, > → >, " → ")
|
|
- **No es explotable como XSS**, pero revela información de estructura del sitio
|
|
|
|
#### M9 — 12 Plugins con readme.txt Público (MEDIA — CVSS 3.0)
|
|
- Versiones exactas de todos los plugins visibles
|
|
- Facilita identificación de CVEs conocidos
|
|
|
|
#### M10 — WooCommerce Store API Expone Estructura (MEDIA — CVSS 3.5)
|
|
- 66 marcas de refacciones enumerables via atributos
|
|
- Carrito accesible sin auth (moneda MXN confirmada)
|
|
- Actualmente 0 productos públicos en la tienda
|
|
|
|
#### M11 — Application Passwords Habilitado (MEDIA — CVSS 3.0)
|
|
- `/wp-admin/authorize-application.php` accesible
|
|
- Si se obtienen credenciales, se pueden crear API tokens persistentes
|
|
|
|
#### M12 — Forminator API REST Expuesta (MEDIA — CVSS 3.0)
|
|
- `/wp-json/forminator/v1/preview/forms` acepta requests (requiere module_id)
|
|
- Con IDs válidos podría revelar estructura de formularios
|
|
|
|
#### M13 — WC-Admin Revela Estructura de Error (MEDIA — CVSS 2.5)
|
|
- `/wp-json/wc-admin/options` retorna error 500 con mensaje detallado: "Debes proporcionar un array de opciones"
|
|
- Revela estructura interna del API
|
|
|
|
#### B1 — WP-Cron Accesible (BAJA — CVSS 2.5)
|
|
- `/wp-cron.php?doing_wp_cron=1` responde sin error
|
|
- Podría usarse para DoS (WordPress cron abuse)
|
|
|
|
#### B2 — Sitemap Revela Estructura Interna (BAJA — CVSS 2.0)
|
|
- Sitemaps: page-sitemap.xml, r3d-sitemap.xml, cms_block_cat-sitemap.xml, woodmart_slider-sitemap.xml
|
|
- Revelan: flipbooks, bloques CMS (header, footer, home, sucursales), sliders
|
|
|
|
#### B3 — setup-config.php y install.php Accesibles (BAJA — CVSS 2.0)
|
|
- Retornan 409/200 "Ya Instalado" pero confirman WordPress
|
|
|
|
#### B4 — WC-Logs Directory Accesible (BAJA — CVSS 2.5)
|
|
- `/wp-content/uploads/wc-logs/` retorna 200 OK
|
|
- Actualmente sin contenido visible, pero si se generan logs serían accesibles
|
|
|
|
#### I1 — Redes Sociales Confirmadas (INFO)
|
|
- Facebook: facebook.com/refaccionarias.delvalle
|
|
- Instagram: instagram.com/refaccionariasdelvalle
|
|
- TikTok: tiktok.com/@refaccionariasdelvallebc
|
|
- YouTube: youtube.com/@refaccionariasdelvalle
|
|
- Email: contacto@refaccionariasdelvalle.com (expuesto en Heroku)
|
|
- Dirección: Rio Colorado 9408, Col. Marron, Tijuana, C.P. 22015
|
|
- Teléfono: (664) 622-4243
|
|
- 69 sucursales confirmadas
|
|
|
|
#### I2 — XMLRPC Bloqueado (OK)
|
|
#### I3 — wp-content/uploads Bloqueado (OK)
|
|
|
|
---
|
|
|
|
## APLICACIÓN HEROKU (refaccionariasdelvalle.herokuapp.com)
|
|
|
|
### Infraestructura Confirmada
|
|
- **Plataforma:** Ruby on Rails (Heroku)
|
|
- **CDN:** CloudFront (d134yvfg5nzhu8.cloudfront.net) — S3 denegado correctamente
|
|
- **S3:** refaccionariasdelvallepg.s3.us-west-1.amazonaws.com (403 Access Denied, bien)
|
|
- **jQuery:** 1.12.4 (2016, múltiples CVEs)
|
|
- **Google reCaptcha:** Cargado (implementación parcial)
|
|
- **Analytics:** UA-40376975-1 (Universal, deprecado)
|
|
- **Facebook Pixel:** 1787289541577328
|
|
|
|
### Rutas Descubiertas
|
|
| Ruta | Código | Notas |
|
|
|------|--------|-------|
|
|
| /productos | 200 | Público — catálogo de productos |
|
|
| /sucursales | 200 | Público — 69 sucursales con direcciones y teléfonos |
|
|
| /acerca | 200 | Público — información corporativa |
|
|
| /contactanos | 200 | Público — formulario de contacto |
|
|
| /cuentas/ingresar | 200 | Login de Devise |
|
|
| /cuentas/contrasenia/nueva | — | Reset de password (no accesible) |
|
|
| /cuentas/registro | — | Registro (no accesible) |
|
|
| /users/sign_in | 500 | ERROR INTERNO — Devise roto |
|
|
| /admin | 302 → login | Panel admin |
|
|
| /sidekiq | 302 → login | Cola de trabajos (Sidekiq!) |
|
|
| /graphql | 302 → login | GraphQL endpoint existe |
|
|
| /active_storage/blobs/1-3 | 302 | Active Storage — blobs existen |
|
|
| /pedidos, /carrito, /categorias | 302 | Requieren auth |
|
|
| /marcas, /buscar, /clientes | 302 | Requieren auth |
|
|
| /reportes, /inventario | 302 | Requieren auth |
|
|
| /cotizacion, /facturas | 302 | Requieren auth |
|
|
| /rails/info/routes | 302 | Rails routes (detrás de auth) |
|
|
| /api | 302 | API endpoint (detrás de auth) |
|
|
|
|
### Hallazgos Heroku
|
|
|
|
#### A5 — X-Frame-Options: ALLOWALL (ALTA — Clickjacking — CVSS 6.5)
|
|
- **Evidencia:** Header `X-Frame-Options: ALLOWALL`
|
|
- Cualquier sitio puede embedder la app en un iframe
|
|
- **PoC:** `<iframe src="https://refaccionariasdelvalle.herokuapp.com/cuentas/ingresar" width="100%" height="600"></iframe>`
|
|
- **Impacto:** Un atacante puede crear un sitio de phishing que embebe el login real y captura las credenciales via overlay invisible
|
|
|
|
#### M14 — CORS con Credenciales (MEDIA — CVSS 4.5)
|
|
- `Access-Control-Allow-Credentials: true`
|
|
- Methods: POST, PUT, DELETE, GET, OPTIONS
|
|
- Origin fijo a CloudFront (NO reflectivo — verificado con 3 origins)
|
|
- Menos grave que un CORS reflectivo pero la configuración es excesiva
|
|
|
|
#### M15 — Login sin Protección Efectiva (MEDIA — CVSS 5.0)
|
|
- `/cuentas/ingresar` acepta POST sin bloqueo
|
|
- Todos los intentos retornan 200 (no distingue usuarios válidos de inválidos — esto es BUENO)
|
|
- reCaptcha se carga pero puede no estar activamente validando
|
|
- Token CSRF visible en meta tags (normal en Rails)
|
|
|
|
#### M16 — Sidekiq + GraphQL + API Detrás de Auth (MEDIA — CVSS 3.5)
|
|
- Estos servicios existen y son accesibles si se obtienen credenciales
|
|
- Sidekiq dashboard expondría Redis, jobs, estadísticas
|
|
- GraphQL permitiría consultas arbitrarias a la BD
|
|
|
|
#### B5 — Error 500 en /users/sign_in (BAJA — CVSS 3.0)
|
|
- Ruta Devise rota — error interno del servidor
|
|
- No expone stack trace (página personalizada)
|
|
|
|
#### B6 — Active Storage Blobs Existen (BAJA — CVSS 2.5)
|
|
- Blobs 1, 2, 3 retornan 302 (redirect al login)
|
|
- Bien protegidos detrás de autenticación
|
|
|
|
#### B7 — jQuery 1.12.4 (BAJA — CVSS 2.5)
|
|
- 6+ CVEs de XSS conocidos (versión de 2016)
|
|
|
|
#### B8 — Facebook Pixel + App ID Expuestos (BAJA — CVSS 2.0)
|
|
- Facebook Pixel: 1787289541577328
|
|
- Facebook App ID: 1652116431482935
|
|
- Usables para ingeniería social/phishing
|
|
|
|
#### B9 — Links a Servicios Externos en Login (BAJA — CVSS 2.0)
|
|
- cPanel webmail: chi-pnode6.websitehostserver.net:2096
|
|
- B2B-POS: b2b-pos.com/login (sistema B2B/POS externo activo)
|
|
|
|
#### I4 — Google Analytics Deprecado (INFO)
|
|
#### I5 — S3 y CloudFront Correctamente Protegidos (OK)
|
|
|
|
---
|
|
|
|
## Resumen de Severidades
|
|
|
|
| Severidad | WordPress | Heroku | Total |
|
|
|-----------|----------|--------|-------|
|
|
| CRÍTICA | 0 | 0 | **0** |
|
|
| ALTA | 4 | 1 | **5** |
|
|
| MEDIA | 13 | 3 | **16** |
|
|
| BAJA | 4 | 5 | **9** |
|
|
| INFO/OK | 3 | 2 | **5** |
|
|
| **TOTAL** | **24** | **11** | **35** |
|
|
|
|
---
|
|
|
|
## Recomendaciones Prioritarias
|
|
|
|
### Urgentes (Esta Semana)
|
|
1. **Implementar rate limiting y CAPTCHA en wp-login.php** — Plugin como Wordfence o Limit Login Attempts
|
|
2. **Deshabilitar enumeración de usuarios** — Bloquear REST API users, author pages, y mensajes de error diferenciados
|
|
3. **Mover logo a servidor propio** — No depender de diseno-studioarsa.com
|
|
4. **Agregar HSTS** en ambas plataformas (especialmente WooCommerce con pagos)
|
|
5. **Cambiar DMARC a p=reject y SPF a -all**
|
|
|
|
### Importantes (Este Mes)
|
|
6. Actualizar WordPress a 6.9.x
|
|
7. Revisar y actualizar todos los plugins
|
|
8. Agregar todos los headers de seguridad (CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy)
|
|
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. Proteger directorio /wp-content/ai1wm-backups/ con .htaccess deny
|
|
13. Proteger /wp-content/uploads/wc-logs/
|
|
|
|
### Deseables (Próximo Trimestre)
|
|
14. Implementar WAF (Web Application Firewall)
|
|
15. Heroku: Migrar de UA a GA4
|
|
16. Heroku: Restringir CORS methods y deshabilitar credentials
|
|
17. Notificar a diseno-studioarsa.com sobre su directory listing (afecta a 5+ clientes)
|
|
18. Revisar Active Storage blobs para acceso no autorizado
|
|
19. Considerar consolidar plataformas (WordPress + Heroku → una sola)
|
|
|
|
---
|
|
|
|
## Nota Legal
|
|
Este análisis fue realizado con autorización explícita del propietario. No se realizaron ataques activos de fuerza bruta ni explotación de vulnerabilidades. Todos los hallazgos se basan en reconocimiento y análisis de respuestas del servidor.
|