hacktricks/binary-exploitation/libc-heap/house-of-roman.md

139 lines
7.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Roman之家
{% hint style="success" %}
学习并练习AWS黑客技术<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家ARTE**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
学习并练习GCP黑客技术<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家GRTE**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>支持HackTricks</summary>
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注**我们的 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享黑客技巧。
</details>
{% endhint %}
## 基本信息
这是一种非常有趣的技术通过伪造的fastbins、unsorted_bin攻击和相对覆写实现RCE而不泄漏信息。然而这已经被[**修复**](https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b90ddd08f6dd688e651df9ee89ca3a69ff88cd0c)。
### 代码
* 您可以在[https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)找到一个示例。
### 目标
* 通过滥用相对指针实现RCE
### 要求
* 编辑fastbin和unsorted bin指针
* 必须暴力破解12位随机数0.02%的成功几率)
## 攻击步骤
### 第一部分Fastbin块指向\_\_malloc\_hook
创建几个块:
* `fastbin_victim`0x60偏移0稍后用于编辑堆指针使其指向LibC值。
* `chunk2`0x80偏移0x70用于良好的对齐
* `main_arena_use`0x80偏移0x100
* `relative_offset_heap`0x60偏移0x190在'main\_arena\_use'块上的相对偏移
然后释放`main_arena_use`,这将将此块放入未排序列表,并在`fd`和`bk`指针中获取指向`main_arena + 0x68`的指针。
现在分配一个新的块`fake_libc_chunk(0x60)`,因为它将包含`fd`和`bk`中指向`main_arena + 0x68`的指针。
然后释放`relative_offset_heap`和`fastbin_victim`。
```c
/*
Current heap layout:
0x0: fastbin_victim - size 0x70
0x70: alignment_filler - size 0x90
0x100: fake_libc_chunk - size 0x70 (contains a fd ptr to main_arena + 0x68)
0x170: leftover_main - size 0x20
0x190: relative_offset_heap - size 0x70
bin layout:
fastbin: fastbin_victim -> relative_offset_heap
unsorted: leftover_main
*/
```
* &#x20;`fastbin_victim`有一个`fd`指向`relative_offset_heap`
* &#x20;`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`开头,然后是零,因此可以将其伪装成`0x70`快速分配块中的一个值。由于地址的最后4位是**随机**的,有`2^4=16`种可能性使得值最终指向我们感兴趣的位置。因此在这里执行BF攻击使得块最终如下**`0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)`。**
(有关其余字节的更多信息,请查看[how2heap](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)中的解释。如果BF攻击不起作用程序将崩溃因此请重新开始直到成功
然后执行2次malloc以移除前两个初始快速分配块然后分配第三个以获得一个位于**`__malloc_hook:`**的块。
```c
malloc(0x60);
malloc(0x60);
uint8_t* malloc_hook_chunk = malloc(0x60);
```
### 第2部分未排序块攻击
有关更多信息,请查看:
{% content-ref url="unsorted-bin-attack.md" %}
[unsorted-bin-attack.md](unsorted-bin-attack.md)
{% endcontent-ref %}
但基本上它允许通过在`chunk->bk`中指定的位置写入`main_arena + 0x68`。对于攻击,我们选择`__malloc_hook`。然后,在覆盖它之后,我们将使用相对覆盖来指向一个`one_gadget`。
为此,我们开始获取一个块并将其放入**未排序块**中:
```c
uint8_t* unsorted_bin_ptr = malloc(0x80);
malloc(0x30); // Don't want to consolidate
puts("Put chunk into unsorted_bin\n");
// Free the chunk to create the UAF
free(unsorted_bin_ptr);
```
利用此块中的UAF指向`unsorted_bin_ptr->bk`到`__malloc_hook`的地址(我们之前进行了暴力破解)。
{% hint style="danger" %}
请注意,此攻击会破坏未排序的 bin因此也会影响 small 和 large。因此我们现在只能**使用来自 fast bin 的分配**(更复杂的程序可能会进行其他分配并崩溃),要触发此操作,我们必须**分配相同大小,否则程序会崩溃**。
{% endhint %}
因此,要触发在 `__malloc_hook` 中执行 `main_arena + 0x68` 的写入,我们在将 `__malloc_hook` 设置为 `unsorted_bin_ptr->bk` 后,只需要执行:**`malloc(0x80)`**
### 步骤 3将 \_\_malloc\_hook 设置为 system
在第一步中,我们控制了一个包含 `__malloc_hook` 的块(在变量 `malloc_hook_chunk` 中),在第二步中,我们成功将 `main_arena + 0x68` 写入其中。
现在,我们利用 `malloc_hook_chunk` 中的部分覆盖,使用我们在那里写入的 libc 地址(`main_arena + 0x68`)来**指向一个 `one_gadget` 地址**。
这就是需要**暴力破解 12 位随机性**(更多信息请参考 [how2heap](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c) 的[示例](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c))。
最后,一旦正确的地址被覆盖,**调用 `malloc` 并触发 `one_gadget`**。
## 参考资料
* [https://github.com/shellphish/how2heap](https://github.com/shellphish/how2heap)
* [https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_roman/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_roman/)
{% hint style="success" %}
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>支持 HackTricks</summary>
* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注** 我们的 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享黑客技巧。
</details>
{% endhint %}