9.2 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を提出してハッキングテクニックを共有してください。
基本情報
これは、フェイクなfastbins、unsorted_bin攻撃、および相対的な上書きを介してリークなしでRCEを可能にする非常に興味深いテクニックでした。ただし、これはパッチされています。
コード
ゴール
- 相対ポインタを悪用してRCEを達成する
必要条件
- fastbinとunsorted binのポインタを編集する
- 12ビットのランダム性をブルートフォースする必要がある(0.02%の確率で動作)
攻撃手順
パート1: Fastbinチャンクが__malloc_hookを指す
複数のチャンクを作成します:
fastbin_victim
(0x60、オフセット0):後でヒープポインタを編集してLibCの値を指すようにするUAFチャンクchunk2
(0x80、オフセット0x70):適切なアライメントのためmain_arena_use
(0x80、オフセット0x100)relative_offset_heap
(0x60、オフセット0x190):'main_arena_use'チャンク上の相対オフセット
次に、free(main_arena_use)
を実行して、このチャンクをunsortedリストに配置し、fd
とbk
ポインタの両方でmain_arena + 0x68
へのポインタを取得します。
次に、fd
とbk
にmain_arena + 0x68
へのポインタを含む新しいチャンクfake_libc_chunk(0x60)
が割り当てられます。
その後、relative_offset_heap
とfastbin_victim
を解放します。
/*
Current heap layout:
0x0: fastbin_victim - size 0x70
0x70: alignment_filler - size 0x90
0x100: fake_libc_chunk - size 0x70 (contains a fd ptr to main_arena + 0x68)
0x170: leftover_main - size 0x20
0x190: relative_offset_heap - size 0x70
bin layout:
fastbin: fastbin_victim -> relative_offset_heap
unsorted: leftover_main
*/
-
fastbin_victim
はrelative_offset_heap
を指すfd
を持っています。 -
relative_offset_heap
はfake_libc_chunk
からの距離オフセットであり、main_arena + 0x68
を指すポインタを含んでいます。 fastbin_victim.fd
の最後のバイトを変更するだけで、fastbin_victim
をmain_arena + 0x68
を指すようにすることが可能です。
前述のアクションを行うためには、攻撃者はfastbin_victim
のfd
ポインタを変更できる必要があります。
その後、main_arena + 0x68
はあまり興味深くないので、ポインタが**__malloc_hook
**を指すように変更します。
__memalign_hook
は通常0x7f
で始まり、その前にゼロが続くため、0x70
ファストビンの値として偽装することが可能です。アドレスの最後の4ビットはランダムであるため、興味のある場所を指す値として終わる可能性が2^4=16
あります。したがって、ここではBF攻撃が実行され、チャンクが次のように終了するようにします:0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)
。
(残りのバイトに関する詳細は、how2heapの説明を参照してください。BFが機能しない場合、プログラムはクラッシュします(機能するまで再試行してください)。
その後、最初の2つのファストビンチャンクを削除するために2つのmallocが実行され、3番目のmallocが実行されて、**__malloc_hook:
**内のチャンクを取得します。
malloc(0x60);
malloc(0x60);
uint8_t* malloc_hook_chunk = malloc(0x60);
パート2: Unsorted_bin attack
詳細については、以下をチェックしてください:
{% content-ref url="unsorted-bin-attack.md" %} unsorted-bin-attack.md {% endcontent-ref %}
基本的には、chunk->bk
で指定された場所に main_arena + 0x68
を書き込むことができます。そして、攻撃では __malloc_hook
を選択します。その後、それを上書きして one_gadget
を指す相対的な上書きを使用します。
これには、チャンクを取得してそれを unsorted bin に入れることから始めます:
uint8_t* unsorted_bin_ptr = malloc(0x80);
malloc(0x30); // Don't want to consolidate
puts("Put chunk into unsorted_bin\n");
// Free the chunk to create the UAF
free(unsorted_bin_ptr);
UAFを使用して、unsorted_bin_ptr->bk
を__malloc_hook
のアドレスにポイントするようにします(以前にこれをブルートフォースしました)。
{% hint style="danger" %} この攻撃はunsorted binを破壊します(したがってsmallとlargeも)。そのため、今後はfast binからの割り当てのみを使用できます(より複雑なプログラムは他の割り当てを行い、クラッシュする可能性があります)、そしてこれをトリガーするには同じサイズを割り当てる必要があります。さもないとプログラムはクラッシュします。 {% endhint %}
したがって、__malloc_hook
にmain_arena + 0x68
を書き込むトリガーとして、単に**malloc(0x80)
**を実行する必要があります。
ステップ3: __malloc_hookをsystemに設定する
ステップ1では、__malloc_hook
を含むチャンクを制御することができました(変数malloc_hook_chunk
に)。ステップ2では、ここにmain_arena + 0x68
を書き込むことに成功しました。
今、malloc_hook_chunk
での部分的な上書きを悪用して、そこに書き込んだlibcアドレス(main_arena + 0x68
)を使用して**one_gadget
アドレスを指す**ことができます。
ここで、12ビットのランダム性をブルートフォースする必要があります(詳細はhow2heapの例にあります)。
最後に、正しいアドレスが上書きされたら、malloc
を呼び出してone_gadget
をトリガーします。
参考文献
- https://github.com/shellphish/how2heap
- https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_roman/
{% 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](https://twitter.com/hacktricks_live)をフォローしてください。
- ハッキングトリックを共有するには、HackTricksとHackTricks CloudのGitHubリポジトリにPRを提出してください。