教育用ヒープ悪用
このリポジトリは、さまざまなヒープ悪用テクニックを学習するためのものです。
Ubuntu の Libc リリースをゴールドスタンダードとして使用しています。各テクニックは、対応する Ubuntu リリースで動作することが検証されています。
Debian ベースのオペレーティングシステムで使用している Libc のソースコードをダウンロードするには、apt source libc6 を実行できます。また、▶️ をクリックすると、gdb を使用してブラウザ内でテクニックをデバッグすることもできます。
私たちはハックミーティング中にこのアイデアを思いつき、以下のテクニックを実装しました。
GnuLibc は常に開発が進められており、上記のテクニックのいくつかは、malloc/free ロジックに導入された整合性チェックにつながっています。
その結果、これらのチェックは定期的に一部のテクニックを壊すため、それらをバイパスするための調整(可能な場合)が必要になります。
この問題に対処するため、調整が必要だった Glibc リリースごとに、同じテクニックの複数バージョンを維持しています。
構造は glibc_<version>/technique.c です。
良い例がありますか?
ここに追加してください!
テクニック全体を単一の .c ファイルにインライン化してみてください。そのほうがずっと学びやすいです。
はじめに
クイックセットアップ
- 以下のパッケージ/ツールがインストールされていることを確認してください:
patchelf zstd wget (もちろん、コンパイラ用の build-essential または類似のもの、make なども)
- また、
/usr/bin/python は、あなたの python バイナリ(例: /usr/bin/python3)であるか、それを指している必要があります。```shell
git clone https://github.com/shellphish/how2heap
cd how2heap
make clean base
./malloc_playground
これにより、バイナリはシステムのlibcとリンクされることに注意してください。他のlibcバージョンで試したい場合は、`Complete Setup`を参照してください。
## 完全なセットアップ
ホストマシンでコンパイルされたバイナリに対して `LD_PRELOAD` でlibcを使おうとすると、シンボルのバージョニング問題に遭遇します([こちら](https://github.com/shellphish/how2heap/issues/169) を参照)。
これを回避する方法は2つあります。
### 方法1: 古いlibcにリンクする
これは、リンカにターゲットバイナリをターゲットlibcとリンクするよう指示します。```shell
git clone https://github.com/shellphish/how2heap
cd how2heap
H2H_USE_SYSTEM_LIBC=N make v2.23
これにより、すべてのバイナリが対応するlibcにリンクされます。さらに良いことに、デバッグシンボルが付属しています。これで、ホストマシン上で任意のlibcバージョンを試すことができます。
この例では、すべてのglibc-2.23バイナリをコンパイルし、libc-2.23にリンクします。数字を変更することで、他のlibcバージョンでも試せます。
方法2: dockerを使う
これはDockerベースのアプローチを使用して、古いUbuntuコンテナ内でバイナリをコンパイルし、対象のlibcバージョンで実行可能にします。```shell
git clone https://github.com/shellphish/how2heap
cd how2heap
the next command will prepare the target binary so it runs with
the expected libc version
make base
./glibc_run.sh 2.30 ./malloc_playground -d -p
now you can play with the binary with glibc-2.30
and even debug it with the correct symbols
readelf -d -W malloc_playground | grep RUNPATH # or use checksec
readelf -l -W malloc_playground | grep interpreter
gdb -q -ex "start" ./malloc_playground
# ヒープエクスプロイトツール
ヒープエクスプロイトに関連するツールがいくつか出回っています。
## Malloc Playground
提供されている `malloc_playground.c` ファイルは、ユーザーにコマンドを入力させ、対話的にメモリを割り当て・解放するプログラムのソースコードです。
## Pwngdb
gdb で glibc ヒープを調査します: https://github.com/scwuaptx/Pwngdb
## pwndbg
glibc ヒープの表示/改変を可能にするエクスプロイト中心の gdb プラグイン: https://github.com/pwndbg/pwndbg
## gef
glibc ヒープを調査できるもう1つの優れた gdb プラグイン: https://github.com/hugsy/gef
## heap-viewer
IDA Pro で glibc ヒープを調査します: https://github.com/danigargu/heap-viewer
## heaptrace
アドレスをシンボルに置き換えて、ヒープ操作を可視化するのに役立ちます: https://github.com/Arinerron/heaptrace
# その他のリソース
優れたヒープエクスプロイト関連リソースを、公開時期のほぼ逆順に並べています:
## 便利なヒープエクスプロイトチュートリアル
- GLIBC ヒープエクスプロイト技術の概要 (https://0x434b.dev/overview-of-glibc-heap-exploitation-techniques/) <!-- 2022 -->
- glibc 詳細チュートリアル (https://heap-exploitation.dhavalkapil.com/) - 書籍とエクスプロイトサンプル <!-- 2022 -->
- glibc-2.31 で動作するヒープエクスプロイト技術 (https://github.com/StarCross-Tech/heap_exploit_2.31) <!-- 2020 -->
- Linux ユーザーランドヒープへのやさしい入門 (https://sensepost.com/blog/2017/painless-intro-to-the-linux-userland-heap/) <!-- 2017 -->
- ptmalloc fanzine、ptmalloc のメタデータ攻撃に関連するリソースとサンプルのセット (http://tukan.farm/2016/07/26/ptmalloc-fanzine/) <!-- 2016 -->
- Glibc Adventures: The Forgotten Chunk (https://github.com/bash-c/slides/blob/master/pwn_heap/Glibc%20Adventures:%20The%20forgotten%20chunks.pdf) - 高度なヒープエクスプロイト <!-- 2015 -->
## 過去のヒープエクスプロイト(歴史)
- Pseudomonarchia jemallocum (http://www.phrack.org/issues/68/10.html) <!-- 2012 -->
- The House Of Lore: Reloaded (http://phrack.org/issues/67/8.html) <!-- 2010 -->
- Malloc Des-Maleficarum (http://phrack.org/issues/66/10.html) - いくつかの malloc エクスプロイト技術 <!-- 2009 -->
- もう一つの free() エクスプロイト技術 (http://phrack.org/issues/66/6.html) <!-- 2009 -->
- set_head を使用して wilderness を攻略する (http://phrack.org/issues/64/9.html) <!-- 2007 -->
- ヒープを壊して理解する (https://www.blackhat.com/presentations/bh-usa-07/Ferguson/Whitepaper/bh-usa-07-ferguson-WP.pdf) - ヒープの実装と少数のエクスプロイトを解説 <!-- 2007 -->
- OS X ヒープエクスプロイト技術 (http://phrack.org/issues/63/5.html) <!-- 2005 -->
- The Malloc Maleficarum (http://seclists.org/bugtraq/2005/Oct/118) <!-- 2005 -->
- Exploiting The Wilderness (http://seclists.org/vuln-dev/2004/Feb/25) <!-- 2004 -->
- Doug lea の高度な malloc エクスプロイト (http://phrack.org/issues/61/6.html) <!-- 2003 -->
# ハードニング
glibc にはいくつかの「ハードニング」対策が組み込まれています。例: `export MALLOC_CHECK_=1`(一部のチェックを有効にする)、`export MALLOC_PERTURB_=1`(データが上書きされる)、`export MALLOC_MMAP_THRESHOLD_=1`(常に mmap() を使用する)、...
詳細: [mcheck()](http://www.gnu.org/software/libc/manual/html_node/Heap-Consistency-Checking.html), [mallopt()](http://www.gnu.org/software/libc/manual/html_node/Malloc-Tunable-Parameters.html).
また、トレースサポートとして [mtrace()](http://manpages.ubuntu.com/mtrace), [malloc_stats()](http://manpages.ubuntu.com/malloc_stats), [malloc_info()](http://manpages.ubuntu.com/malloc_info), [memusage](http://manpages.ubuntu.com/memusage)、およびこのファミリーの他の関数にも同様のサポートがあります。