2024-06-16 09:01:21 +00:00
|
|
|
|
# Tcache Bin Attack
|
|
|
|
|
|
2024-07-18 17:33:27 +00:00
|
|
|
|
{% hint style="success" %}
|
|
|
|
|
学习并练习AWS Hacking:<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 Hacking: <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)
|
2024-06-16 09:01:21 +00:00
|
|
|
|
|
2024-07-18 17:33:27 +00:00
|
|
|
|
<details>
|
2024-06-16 09:01:21 +00:00
|
|
|
|
|
2024-07-18 17:33:27 +00:00
|
|
|
|
<summary>支持 HackTricks</summary>
|
2024-06-16 09:01:21 +00:00
|
|
|
|
|
2024-07-18 17:33:27 +00:00
|
|
|
|
* 检查 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
|
|
|
|
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注** 我们的 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|
|
|
|
* 通过向 **HackTricks** 和 **HackTricks Cloud** 的 github 仓库提交 PR 来分享黑客技巧。
|
2024-06-16 09:01:21 +00:00
|
|
|
|
|
|
|
|
|
</details>
|
2024-07-18 17:33:27 +00:00
|
|
|
|
{% endhint %}
|
2024-06-16 09:01:21 +00:00
|
|
|
|
|
|
|
|
|
## 基本信息
|
|
|
|
|
|
2024-07-18 17:33:27 +00:00
|
|
|
|
有关 Tcache bin 是什么,请查看此页面:
|
2024-06-16 09:01:21 +00:00
|
|
|
|
|
|
|
|
|
{% content-ref url="bins-and-memory-allocations.md" %}
|
|
|
|
|
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
|
|
|
|
{% endcontent-ref %}
|
|
|
|
|
|
2024-07-18 17:33:27 +00:00
|
|
|
|
首先,请注意 Tcache 是在 Glibc 版本 2.26 中引入的。
|
2024-06-16 09:01:21 +00:00
|
|
|
|
|
2024-07-18 17:33:27 +00:00
|
|
|
|
**Tcache 攻击**(也称为 **Tcache 毒化**)在 [**guyinatuxido 页面**](https://guyinatuxedo.github.io/29-tcache/tcache\_explanation/index.html) 中提出,与快速 bin 攻击非常相似,目标是覆盖已释放块内的 bin 中下一个块的指针到任意地址,以便稍后**分配该特定地址并潜在地覆盖指针**。
|
2024-06-16 09:01:21 +00:00
|
|
|
|
|
2024-07-18 17:33:27 +00:00
|
|
|
|
然而,现在,如果运行上述代码,将会收到错误:**`malloc(): unaligned tcache chunk detected`**。因此,需要在新指针中写入对齐的地址(或者执行足够多次二进制文件,以便实际对齐写入的地址)。
|
2024-06-16 09:01:21 +00:00
|
|
|
|
|
2024-07-18 17:33:27 +00:00
|
|
|
|
### Tcache 索引攻击
|
2024-06-16 09:01:21 +00:00
|
|
|
|
|
2024-07-18 17:33:27 +00:00
|
|
|
|
通常可以在堆的开头找到一个包含 Tcache 中**每个索引的块数量**和**每个 Tcache 索引的头块地址**的块。如果由于某种原因可以修改此信息,则可以**使某个索引的头块指向所需地址**(如 `__malloc_hook`),然后分配一个与索引大小相同的块并覆盖此处的 `__malloc_hook` 内容。
|
2024-06-16 09:01:21 +00:00
|
|
|
|
|
|
|
|
|
## 示例
|
|
|
|
|
|
|
|
|
|
* CTF [https://guyinatuxedo.github.io/29-tcache/dcquals19\_babyheap/index.html](https://guyinatuxedo.github.io/29-tcache/dcquals19\_babyheap/index.html)
|
2024-07-18 17:33:27 +00:00
|
|
|
|
* **Libc 信息泄漏**:可以填充 tcaches,将一个块添加到未排序列表中,清空 tcache 并**重新分配未排序 bin 中的块**,仅覆盖前 8B,保留块的第二个地址到 libc 的地址,以便读取它。
|
|
|
|
|
* **Tcache 攻击**:二进制文件存在 1B 堆溢出漏洞。这将被利用来更改已分配块的**大小标头**,使其更大。然后,释放此块,将其添加到具有虚假大小的块的 tcache 中。然后,我们将分配一个具有伪造大小的块,前一个块将**返回,知道此块实际上更小**,这为**覆盖内存中的下一个块**提供了机会。\
|
|
|
|
|
我们将利用此来**覆盖下一个块的 FD 指针**指向**`malloc_hook`**,然后可以分配 2 个指针:首先是我们刚修改的合法指针,然后第二次分配将返回一个在**`malloc_hook`**中的块,可以利用它来编写**一个 gadget**。
|
2024-06-16 09:01:21 +00:00
|
|
|
|
* CTF [https://guyinatuxedo.github.io/29-tcache/plaid19\_cpp/index.html](https://guyinatuxedo.github.io/29-tcache/plaid19\_cpp/index.html)
|
2024-07-18 17:33:27 +00:00
|
|
|
|
* **Libc 信息泄漏**:存在使用后释放和双重释放。在此解决方案中,作者通过读取放置在小 bin 中的块的地址泄漏了 libc 的地址(类似于从未排序 bin 中泄漏,但是从小 bin 中泄漏)。
|
|
|
|
|
* **Tcache 攻击**:通过**双重释放**执行 Tcache。同一块被释放两次,因此在 Tcache 中,该块将指向自身。然后,它被分配,其 FD 指针被修改为指向**free hook**,然后再次分配,因此列表中的下一个块将在 free hook 中。然后,这也被分配,可以在此处写入 `system` 的地址,因此当包含 `"/bin/sh"` 的 malloc 被释放时,我们就获得了 shell。
|
2024-06-16 09:01:21 +00:00
|
|
|
|
* CTF [https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps0/index.html](https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps0/index.html)
|
2024-07-17 18:06:18 +00:00
|
|
|
|
* 主要漏洞是可以通过指定其偏移量来`free`堆中的任何地址
|
2024-07-18 17:33:27 +00:00
|
|
|
|
* **Tcache 索引攻击**:可以分配和释放一个大小的块,当存储在 tcache 块中(包含 tcache bin 信息的块)时,将生成一个值为 0x100 的地址。这是因为 tcache 在不同字节中存储每个 bin 中的块数量,因此一个特定索引中的一个块会生成值 0x100。
|
|
|
|
|
* 然后,此值看起来像是一个大小为 0x100 的块。通过`free`此地址,将**将该地址添加到 tcache 中大小为 0x100 的块的索引**。
|
|
|
|
|
* 然后,**分配**一个大小为**0x100**的块,前一个地址将作为一个块返回,允许覆盖其他 tcache 索引。\
|
|
|
|
|
例如,将 malloc hook 的地址放入其中一个索引中,并分配该索引大小的块,将授予 calloc hook 中的一个块,从而允许编写一个 gadget 以获得 shell。
|
2024-06-16 09:01:21 +00:00
|
|
|
|
* CTF [https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps1/index.html](https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps1/index.html)
|
|
|
|
|
* 与之前相同的漏洞,但有一个额外的限制
|
2024-07-18 17:33:27 +00:00
|
|
|
|
* **Tcache 索引攻击**:类似于前一个攻击,但使用更少的步骤,通过**释放包含 tcache 信息的块**,使其地址添加到其大小的 tcache 索引中,因此可以分配该大小并将 tcache 块信息作为一个块,从而将 free hook 添加为一个索引的地址,分配它,并在其上编写一个 gadget。
|
2024-07-17 18:06:18 +00:00
|
|
|
|
* [**Math Door. HTB Cyber Apocalypse CTF 2023**](https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/math-door/)
|
2024-07-18 17:33:27 +00:00
|
|
|
|
* **Write After Free** 以将数字添加到 `fd` 指针。
|
|
|
|
|
* 在此挑战中需要大量的**堆 feng-shui**。解决方案展示了如何非常方便地**控制 Tcache 自由列表的头部**。
|
|
|
|
|
* 通过 `stdout`(FSOP)进行**Glibc 泄漏**。
|
|
|
|
|
* **Tcache 毒化** 以获得任意写入原语。
|
2024-07-17 18:06:18 +00:00
|
|
|
|
|
2024-07-18 17:33:27 +00:00
|
|
|
|
{% hint style="success" %}
|
|
|
|
|
学习并练习AWS Hacking:<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 Hacking: <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)
|
2024-07-17 18:06:18 +00:00
|
|
|
|
|
2024-07-18 17:33:27 +00:00
|
|
|
|
<details>
|
2024-07-17 18:06:18 +00:00
|
|
|
|
|
2024-07-18 17:33:27 +00:00
|
|
|
|
<summary>支持 HackTricks</summary>
|
2024-07-17 18:06:18 +00:00
|
|
|
|
|
2024-07-18 17:33:27 +00:00
|
|
|
|
* 检查 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
|
|
|
|
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或者 [**telegram 群组**](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 来分享黑客技巧。**
|