mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-29 16:10:54 +00:00
139 lines
7.6 KiB
Markdown
139 lines
7.6 KiB
Markdown
# 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
|
||
*/
|
||
```
|
||
*  `fastbin_victim`有一个`fd`指向`relative_offset_heap`
|
||
*  `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 %}
|