House of Roman
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
이것은 가짜 패스트빈을 통한 RCE를 가능하게 하는 매우 흥미로운 기술이었으며, unsorted_bin 공격과 상대적 오버라이트를 사용했습니다. 그러나 이는 패치되었습니다.
상대 포인터를 악용하여 RCE
패스트빈 및 unsorted bin 포인터 편집
12비트의 무작위성이 강제로 시도되어야 함 (작동 확률 0.02%)
여러 개의 청크를 생성합니다:
fastbin_victim
(0x60, offset 0): 나중에 힙 포인터를 LibC 값으로 가리키도록 편집할 UAF 청크.
chunk2
(0x80, offset 0x70): 좋은 정렬을 위해
main_arena_use
(0x80, offset 0x100)
relative_offset_heap
(0x60, offset 0x190): 'main_arena_use' 청크의 상대 오프셋
그런 다음 free(main_arena_use)
를 호출하면 이 청크가 unsorted 리스트에 배치되고 fd
및 bk
포인터 모두에서 main_arena + 0x68
에 대한 포인터를 얻게 됩니다.
이제 fake_libc_chunk(0x60)
라는 새로운 청크가 할당되며, 이는 fd
및 bk
에서 main_arena + 0x68
에 대한 포인터를 포함하게 됩니다.
그런 다음 relative_offset_heap
과 fastbin_victim
이 해제됩니다.
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
로 시작하고 그 앞에 0이 있으므로, 이를 0x70
패스트 빈의 값으로 위조할 수 있습니다. 주소의 마지막 4비트는 무작위이므로, 우리가 관심 있는 곳을 가리키도록 값이 끝나는 경우의 수는 2^4=16
입니다. 따라서 여기서 BF 공격이 수행되어 청크가 다음과 같이 끝납니다: 0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)
.
(나머지 바이트에 대한 자세한 정보는 how2heap 예제에서 설명을 확인하세요). BF가 작동하지 않으면 프로그램이 그냥 충돌하므로 (작동할 때까지 다시 시작하세요).
그런 다음, 2개의 malloc이 수행되어 2개의 초기 패스트 빈 청크가 제거되고, 세 번째 malloc이 할당되어 **__malloc_hook:
**에서 청크를 얻습니다.
자세한 내용은 다음을 확인할 수 있습니다:
Unsorted Bin Attack기본적으로 이는 chunk->bk
에 지정된 위치에 main_arena + 0x68
을 쓸 수 있게 해줍니다. 공격을 위해 __malloc_hook
을 선택합니다. 그런 다음, 이를 덮어쓴 후 상대적 덮어쓰기를 사용하여 one_gadget
을 가리키게 됩니다.
이를 위해 우리는 청크를 가져와 unsorted bin에 넣기 시작합니다:
이 청크에서 UAF를 사용하여 unsorted_bin_ptr->bk
를 __malloc_hook
의 주소로 가리키게 합니다 (우리는 이전에 이를 무작위로 시도했습니다).
이 공격은 정렬되지 않은 빈을 손상시킵니다 (따라서 작은 것과 큰 것도 마찬가지입니다). 따라서 이제 빠른 빈에서 할당만 사용할 수 있습니다 (더 복잡한 프로그램은 다른 할당을 수행하고 충돌할 수 있습니다), 이를 트리거하기 위해서는 같은 크기로 할당해야 하며, 그렇지 않으면 프로그램이 충돌합니다.
따라서 __malloc_hook
에 main_arena + 0x68
의 쓰기를 트리거하기 위해 unsorted_bin_ptr->bk
에 __malloc_hook
을 설정한 후, 우리는 단순히 **malloc(0x80)
**을 수행해야 합니다.
1단계에서 우리는 __malloc_hook
를 포함하는 청크를 제어하게 되었고 (변수 malloc_hook_chunk
에서) 2단계에서는 여기에서 main_arena + 0x68
을 쓸 수 있었습니다.
이제 우리는 malloc_hook_chunk
에서 부분 덮어쓰기를 악용하여 우리가 쓴 libc 주소(main_arena + 0x68
)를 one_gadget
주소를 가리키게 합니다.
여기서 12비트의 무작위성을 무작위로 시도해야 합니다 (자세한 정보는 how2heap 예제에서 확인할 수 있습니다).
마지막으로, 올바른 주소가 덮어쓰여지면, malloc
을 호출하고 one_gadget
을 트리거합니다.
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE) GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)