mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 12:43:23 +00:00
7.7 KiB
7.7 KiB
フォースハウス
htARTE(HackTricks AWS Red Team Expert) を使って、ゼロからヒーローまでAWSハッキングを学ぶ!
HackTricks をサポートする他の方法:
- HackTricks で企業を宣伝したい または HackTricks をPDFでダウンロードしたい 場合は SUBSCRIPTION PLANS をチェックしてください!
- 公式PEASS&HackTricksスワッグを手に入れる
- The PEASS Family を発見し、独占的な NFTs のコレクションを見つける
- 💬 Discordグループ に参加するか、telegramグループ に参加するか、Twitter 🐦 @hacktricks_live をフォローする
- ハッキングテクニックを共有するために、 HackTricks と HackTricks Cloud のGitHubリポジトリにPRを提出する
基本情報
コード
- このテクニックはパッチされました(こちら) そしてこのエラーを生成します:
malloc(): corrupted top size
- テストしたい場合は、こちらからコードを取得 できます。
ゴール
- この攻撃の目標は、特定のアドレスにチャンクを割り当てることです。
必要条件
- ヘッダーのトップチャンクサイズを上書きできるオーバーフロー(例: -1)。
- ヒープ割り当てのサイズを制御できること
攻撃
攻撃者が特定のアドレスPにチャンクを割り当てて値を上書きしたい場合、まずトップチャンクサイズを -1
で上書きします(おそらくオーバーフローを使用)。これにより、malloc がトップチャンクをその位置に移動させるため、mmap を使用しないことが保証されます。
次に、トップチャンクのアドレスと割り当てるターゲットスペースの間の距離を計算します。このサイズでmallocが実行されるため、トップチャンクがその位置に移動されます。差分/サイズを簡単に計算できるのはこのためです:
// From https://github.com/shellphish/how2heap/blob/master/glibc_2.27/house_of_force.c#L59C2-L67C5
/*
* The evil_size is calulcated as (nb is the number of bytes requested + space for metadata):
* new_top = old_top + nb
* nb = new_top - old_top
* req + 2sizeof(long) = new_top - old_top
* req = new_top - old_top - 2sizeof(long)
* req = target - 2sizeof(long) - old_top - 2sizeof(long)
* req = target - old_top - 4*sizeof(long)
*/
したがって、target - old_top - 4*sizeof(long)
のサイズをアロケートすること(4つのlongは、トップチャンクと新しいチャンクのメタデータのためです)により、トップチャンクを上書きしたいアドレスに移動させることができます。
その後、データの先頭にあるチャンクを含むチャンクを取得するために別のmallocを行います。
参考文献と他の例
- https://github.com/shellphish/how2heap/tree/master
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_force/
- https://heap-exploitation.dhavalkapil.com/attacks/house_of_force
- https://github.com/shellphish/how2heap/blob/master/glibc_2.27/house_of_force.c
- https://guyinatuxedo.github.io/41-house_of_force/house_force_exp/index.html
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_force/#hitcon-training-lab-11
- このシナリオの目標は、ret2winであり、呼び出される関数のアドレスをret2win関数のアドレスに変更する必要があります
- バイナリには、トップチャンクのサイズを変更できるオーバーフローがあり、これを-1またはp64(0xffffffffffffffff)に変更します
- 次に、上書きするポインタが存在する場所へのアドレスが計算され、現在のトップチャンクの位置からそこまでの差が
malloc
でアロケートされます - 最後に、この望ましいターゲットを含む新しいチャンクがアロケートされ、ret2win関数によって上書きされます
- https://shift--crops-hatenablog-com.translate.goog/entry/2016/03/21/171249?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp
Input your name:
には、ヒープからアドレスをリークさせる初期の脆弱性があります- 次に、
Org:
およびHost:
機能では、org nameとして求められる64Bのs
ポインタを埋めることができ、スタック上ではv2
のアドレスが続き、その後に指定されたhost nameが続きます。その後、strcpyがsの内容をサイズ64Bのチャンクにコピーしようとするため、host nameに入れられたデータでトップチャンクのサイズを上書きすることができます。 - 今、任意の書き込みが可能になったので、
atoi
のGOTをprintfのアドレスに上書きしました。%24$p
でIO_2_1_stderr
のアドレスをリークさせることができ、このlibcリークを使用してatoi
のGOTを再度system
のアドレスに上書きし、パラメータとして/bin/sh
を渡して呼び出すことができました。 - この他の解説で提案されている代替方法は、
free
をputs
で上書きし、後で解放されるポインタにatoi@got
のアドレスを追加してリークさせ、このリークを使用して再度atoi@got
をsystem
で上書きし、/bin/sh
で呼び出すことができます。 - https://guyinatuxedo.github.io/41-house_of_force/bkp16_cookbook/index.html
- ポインタをクリアせずに解放されたチャンクを再利用できるUAFがあります。いくつかの読み取りメソッドがあるため、ここでGOTに解放関数へのポインタを書き込み、その後read関数を呼び出すことでlibcアドレスをリークさせることができます。
- 次に、UAFを悪用して、左側のスペースのサイズを-1で上書きし、解放フックに到達するのに十分な大きさのチャンクを割り当て、その後、解放フックを含む別のチャンクを割り当てます。その後、フックに
system
のアドレスを書き込み、チャンクに"/bin/sh"
を書き込み、最後にその文字列内容でチャンクを解放します。