교육용 힙 익스플로잇
이 저장소는 다양한 힙 익스플로잇 기법을 학습하기 위한 것입니다.
우리는 Ubuntu의 Libc 릴리스를 기준으로 삼습니다. 각 기법은 해당 Ubuntu 릴리스에서 동작하는 것을 검증했습니다.
Debian 계열 운영 체제에서 apt source libc6를 실행하여 사용 중인 Libc의 소스 코드를 다운로드할 수 있습니다. 또한 ▶️를 클릭하면 브라우저에서 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`을 참조하세요.
## Complete Setup
호스트 머신에서 컴파일된 바이너리에 `LD_PRELOAD`로 libc를 적용하려고 하면 심볼 버전 문제가 발생합니다 ([이 링크](https://github.com/shellphish/how2heap/issues/169) 참조).
이를 우회하는 방법은 두 가지입니다.
### 방법 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 힙을 검사할 수 있는 또 다른 훌륭한 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 팬진, 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 -->
- wilderness를 무력화하기 위한 set_head의 사용 (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) 및 이 계열의 다른 함수들에도 추적 지원이 있습니다.