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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2023-24329-lab — CVE-2023-24329を実演する自己完結型Dockerラボ。Python urllibパーサーの差分によりURLスキームとホストフィルターをバイパスし、脆弱性環境とパッチ適用済み環境を備えた実践的なセキュリティ教育用です。 | Kitploit
ツール/GitHubGitHub/jithinodattu/cve-2023-24329-lab
脆弱性分析エクスプロイトウェブセキュリティCTFペネトレーションテスト学習と教育ラボと実践
GitHubjithinodattu/cve-2023-24329-lab

CVE-2023-24329-lab

CVE-2023-24329を実演する自己完結型Dockerラボ。Python urllibパーサーの差分によりURLスキームとホストフィルターをバイパスし、脆弱性環境とパッチ適用済み環境を備えた実践的なセキュリティ教育用です。

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

人気

すべて見る →

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

すべてのツールを探索

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

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

CVE-2023-24329 — パーサーの差異を学ぶラボ

教育目的のみ。 このラボは、安全で隔離された環境で実際の脆弱性を示すために存在します。自分が所有していないシステムに対して実行しないでください。意図的に壊れたフィルターコードを本番システムで再利用しないでください。

CVE-2023-24329 の自己完結型 Docker ラボです。この脆弱性は Python の urllib.parse.urlparse() におけるパーサーの差異であり、Python < 3.11.4 で URL スキームやホストのフィルターをバイパスすることを可能にします。

このラボでは、file:// URL と内部ホスト名を明示的にブロックする API が、先頭にスペースを付けることで騙されて自身のコンテナ内の /etc/passwd を読み取ったり、プライベートな内部サービスにアクセスしたりする様子を示します。さらに、同じエクスプロイトが修正済みの Python では失敗することを確認します。


脆弱性

Python の urlparse() と、その背後にある HTTP/ファイル取得関数は、先頭に空白を含む URL の扱いに関して一致していません。影響を受けるバージョンでは:

root@kitploit:~
from urllib.parse import urlparse

urlparse(" file:///etc/passwd").scheme   # → ""   (空 — フィルターを通過)
urlparse(" file:///etc/passwd").hostname # → None (空 — フィルターを通過)

しかし、urllib.request.urlopen(" file:///etc/passwd") はスペースを取り除き、 をそのまま取得します。

file:///etc/passwd

パーサーが見るものとフェッチャーが行うものの間のそのギャップ — それが脆弱性です。

Python 3.11.4 では、解析前に先頭の空白や制御文字を取り除くことでこの問題を修正し、ギャップを解消しました。


デモ — 3 つのステップ

ステップ何が表示されるか何を学ぶか
1 — ベースラインfile:///etc/passwd → 403 blocked schemeフィルターは一見妥当に見える
2 — エクスプロイト同じ URL にスペースを追加 → 200 + /etc/passwd の内容と内部シークレット1 つのスペースでフィルター全体が無効になる
3 — パッチ同じペイロードを Python 3.11.4 に送信 → 403 blocked修正済みの urlparse は先に空白を取り除くため、フィルターが正しく機能する

アーキテクチャ

隔離された Docker ブリッジネットワーク cve-lab-net 上の 4 つのサービス:

サービスPython バージョン役割ホストポート
vulnerable-api3.11.3単純な URL フィルターを持つターゲット API8000
fixed-api3.11.4同じコード、修正済みインタプリタ8000
internal-service3.12偽の内部メタデータエンドポイントなし
attacker3.12エクスプロイト実行ドライバなし

internal-service にはホストポートのマッピングがありません。Docker ネットワーク内部からのみ到達可能で、実際の信頼境界を模擬しています。


前提条件

  • Docker Desktop(または Docker Engine + Compose プラグイン)
  • イメージ用の約 500 MB のディスク空き容量

クイックスタート

root@kitploit:~
git clone <repo-url>
cd CVE-2023-24329-lab

ステップ 1 — ベースライン:フィルターが機能することを確認

root@kitploit:~
docker compose -f docker-compose.vulnerable.yml up --build -d
docker compose -f docker-compose.vulnerable.yml exec attacker python exploit.py baseline

ステップ 1 — ベースラインフィルターが保持される

ステップ 2 — エクスプロイト:フィルターをバイパス

root@kitploit:~
docker compose -f docker-compose.vulnerable.yml exec attacker python exploit.py exploit

ステップ 2 — バイパス成功、/etc/passwd と内部シークレットが露出

ステップ 3 — パッチ:同じペイロード、修正済み Python

root@kitploit:~
docker compose -f docker-compose.vulnerable.yml down
docker compose -f docker-compose.fixed.yml up --build -d
docker compose -f docker-compose.fixed.yml exec attacker python exploit.py verify

ステップ 3 — Python 3.11.4 でパッチが機能

後片付け

root@kitploit:~
docker compose -f docker-compose.fixed.yml down

ディレクトリ構成

root@kitploit:~
CVE-2023-24329-lab/
├── docker-compose.vulnerable.yml   # Python 3.11.3(影響あり)
├── docker-compose.fixed.yml        # Python 3.11.4(修正済み)
├── vulnerable-api/
│   ├── app.py                      # 単純なフィルターを持つ Flask API
│   ├── requirements.txt
│   └── Dockerfile
├── internal-service/
│   ├── app.py                      # 偽の内部メタデータエンドポイント
│   ├── requirements.txt
│   └── Dockerfile
└── attacker/
    ├── exploit.py                  # デモドライバ(baseline / exploit / verify)
    ├── requirements.txt
    └── Dockerfile

脆弱な API と修正済みの API は同一のソースコードを共有しており、ベースイメージの Python バージョンだけが異なります。これがこのラボの重要な科学的対照特性です。


バイパスの仕組み

脆弱な API のフィルター(簡略化):

root@kitploit:~
parsed = urllib.parse.urlparse(url)

if parsed.scheme.lower() in {"file", "gopher", "ftp", "data"}:
    return 403  # ブロック

if parsed.hostname in {"localhost", "127.0.0.1", "internal-service"}:
    return 403  # ブロック

urllib.request.urlopen(url)  # 元の未変更の文字列を取得

バイパスペイロードは先頭の 1 つのスペースです:

root@kitploit:~
 file:///etc/passwd
^
スペース(0x20)

Python ≤ 3.11.3 では、urlparse は空のスキームとホスト名なしと解釈するため、フィルターを通過します。urlopen はスペースを取り除き、file:///etc/passwd を取得します。

Python ≥ 3.11.4 では、urlparse が先にスペースを取り除くため、正しく scheme=file と認識し、フィルターが 403 でブロックします。


修正内容(修正済み Python の動作)

CPython issue #102153 — 修正では、解析前に URL の先頭から C0 制御文字とスペースを取り除きます。パッチ適用後はパーサーとフェッチャーの両方が同じ URL を認識するため、この方法ではフィルターをバイパスできなくなります。

Python のバージョンにかかわらず正しい防御パターン:

root@kitploit:~
# 解析 → 各部分から再構築 → 再構築した URL を後続に渡す。
# フィルターとフェッチャーの両方が同じ文字列に対して動作する。
parsed = urllib.parse.urlparse(url)
safe_url = parsed.geturl()  # 構成要素から再構築
urllib.request.urlopen(safe_url)

主要な学習ポイント

  1. パーサーの差異は脆弱性の一種であり、一回限りのバグではない。 同じアイデアが HTTP リクエストスマグリング、SAML 混乱攻撃、log4j の ${jndi:...} バイパスなどに応用されています。
  2. ブロックリストは、パーサーが嘘をつくと機能しない。 悪質な入力を列挙するのは負け戦です。
  3. 再構築された URL を検証する — 生の入力文字列ではありません。
  4. マイナーバージョン 1 つ、小さなパッチ 1 つ、大きな影響。 CPython の修正はわずか数行です。

参考文献

  • NVD: CVE-2023-24329
  • CPython issue: github.com/python/cpython/issues/102153
  • 最初の報告: Yebo Cao — 検索 "CVE-2023-24329 Yebo Cao"
  • より広い分類: PortSwigger — SSRF フィルターバイパス手法
  • より広い分類: James Kettle — HTTP Desync Attacks

ガードレール

  • internal-service のポートをホストに公開しないでください。
  • このラボを本番ネットワークに接続されたマシンで実行しないでください。
  • vulnerable-api/app.py のフィルターコードは教育目的で意図的に壊されています — 実際のシステムにコピーしないでください。

ライセンス

MIT — 教育目的での使用、共有、改変は自由です。クレジットを明記してください。

ツールをダウンロード