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

140 lines
7.6 KiB
Markdown
Raw Normal View History

# 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 %}