mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-12 06:12:55 +00:00
6.9 KiB
6.9 KiB
힘의 집
htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 영웅이 될 때까지 AWS 해킹을 배우세요!
HackTricks를 지원하는 다른 방법:
- 회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하고 싶다면 구독 요금제를 확인하세요!
- 공식 PEASS & HackTricks 스왜그를 구입하세요
- The PEASS Family를 발견하세요, 당사의 독점 NFTs 컬렉션
- 💬 Discord 그룹 또는 텔레그램 그룹에 가입하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud github 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
기본 정보
코드
목표
- 이 공격의 목표는 특정 주소에 청크를 할당할 수 있는 것입니다.
요구 사항
- 힙 할당의 크기를 제어할 수 있는 오버플로우가 필요합니다.
- 힙 할당의 크기를 제어할 수 있어야 합니다.
공격
공격자가 특정 주소 P에 청크를 할당하여 여기에 값을 덮어쓰려면 다음과 같이 시작합니다. 먼저 top 청크 크기를 -1
로 덮어쓰기(오버플로우를 사용할 수도 있음)하여 malloc이 Top 청크가 항상 충분한 공간을 가지고 있어서 mmap을 사용하지 않도록 합니다.
그런 다음 top 청크의 주소와 할당할 대상 공간 사이의 거리를 계산합니다. 이는 해당 크기로 malloc이 수행되어 top 청크가 해당 위치로 이동하도록 하기 위함입니다. 차이/크기를 쉽게 계산하는 방법은 다음과 같습니다:
// 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을 요청할 때s
포인터의 64B를 채울 수 있으며, 이는 스택에서 v2의 주소 뒤에 따르는 것이며, 그 후에 지정된 host name이 따릅니다. 그런 다음 strcpy가 s의 내용을 64B 크기의 청크로 복사하게 되므로 host name에 입력된 데이터로 상단 청크의 크기를 덮어쓸 수 있습니다. - 이제 임의 쓰기가 가능하므로
atoi
의 GOT가 printf의 주소로 덮어쓰였습니다. 그런 다음%24$p
로IO_2_1_stderr
의 주소를 누출할 수 있었으며, 이 libc 누출로atoi
의 GOT를 다시system
주소로 덮어쓰고/bin/sh
를 매개변수로 전달하여 호출할 수 있었습니다. - 이 다른 writeup에서 제안된 대체 방법은
free
를puts
로 덮어쓰고, 그런 다음 나중에 해제될 포인터에atoi@got
의 주소를 추가하여 누출하고 이 누출로 다시atoi@got
를system
으로 덮어쓰고/bin/sh
로 호출할 수 있습니다. - https://guyinatuxedo.github.io/41-house_of_force/bkp16_cookbook/index.html
- 포인터를 지우지 않고 해제된 청크를 재사용할 수 있는 UAF가 있습니다. 일부 읽기 방법이 있기 때문에 여기서 GOT에 free 함수를 가리키는 포인터를 쓰고 나중에 read 함수를 호출하여 libc 주소를 누출할 수 있습니다.
- 그런 다음 UAF를 악용하여 House of force를 사용하여 왼쪽 공간의 크기를 -1로 덮어쓰고, free 후크에 도달할 수 있는 충분히 큰 청크를 할당한 다음 free 후크를 포함하는 또 다른 청크를 할당합니다. 그런 다음 후크에
system
의 주소를 쓰고, 청크에"/bin/sh"
를 쓰고, 그 문자열 내용으로 청크를 해제합니다.