mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 20:53:37 +00:00
53 lines
5.7 KiB
Markdown
53 lines
5.7 KiB
Markdown
|
# Tcache Bin Attack
|
|||
|
|
|||
|
<details>
|
|||
|
|
|||
|
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
|||
|
|
|||
|
支持HackTricks的其他方式:
|
|||
|
|
|||
|
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
|||
|
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
|||
|
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
|||
|
* **加入** 💬 [**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>
|
|||
|
|
|||
|
## 基本信息
|
|||
|
|
|||
|
有关tcache bin是什么的更多信息,请查看此页面:
|
|||
|
|
|||
|
{% content-ref url="bins-and-memory-allocations.md" %}
|
|||
|
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
|||
|
{% endcontent-ref %}
|
|||
|
|
|||
|
首先,请注意Tcache是在glibc版本2.26中引入的。
|
|||
|
|
|||
|
[**guyinatuxido页面**](https://guyinatuxedo.github.io/29-tcache/tcache\_explanation/index.html)提出的**Tcache**攻击与快速bin攻击非常相似,目标是覆盖在释放的块中的bin内下一个块的指针到任意地址,以便稍后**分配该特定地址并潜在地覆盖指针**。
|
|||
|
|
|||
|
然而,现在,如果运行上述代码,将会收到错误:**`malloc(): unaligned tcache chunk detected`**。因此,需要在新指针中写入一个对齐的地址(或者执行足够多次二进制文件,以便写入的地址实际上是对齐的)。
|
|||
|
|
|||
|
### Tcache索引攻击
|
|||
|
|
|||
|
通常可以在堆的开头找到一个包含tcache中**每个索引的块数量**和**每个tcache索引的头块地址**的块。如果由于某种原因可以修改此信息,则可以**使某个索引的头块指向所需地址**(如malloc hook),然后分配一个与索引大小相同的块并覆盖此情况下的malloc hook内容。
|
|||
|
|
|||
|
## 示例
|
|||
|
|
|||
|
* CTF [https://guyinatuxedo.github.io/29-tcache/dcquals19\_babyheap/index.html](https://guyinatuxedo.github.io/29-tcache/dcquals19\_babyheap/index.html)
|
|||
|
* **Libc信息泄漏**:可以填充tcaches,将一个块添加到未排序列表中,清空tcache,然后**从未排序的bin中重新分配该块**,仅覆盖前8B,保留块的第二个地址到libc的地址,以便读取它。
|
|||
|
* **Tcache攻击**:二进制文件存在1B堆溢出漏洞。这将被利用来更改已分配块的**大小头部**,使其更大。然后,释放此块,将其添加到具有虚假大小的块的tcache中。然后,我们将分配一个具有伪造大小的块,并且先前的块将**返回,知道此块实际上更小**,这为**覆盖内存中的下一个块**提供了机会。\
|
|||
|
我们将利用此来**覆盖下一个块的FD指针**以指向**`malloc_hook`**,然后就可以分配2个指针:首先是我们刚修改的合法指针,然后第二次分配将返回一个在**`malloc_hook`**中的块,可以利用它来编写**一个gadget**。
|
|||
|
* CTF [https://guyinatuxedo.github.io/29-tcache/plaid19\_cpp/index.html](https://guyinatuxedo.github.io/29-tcache/plaid19\_cpp/index.html)
|
|||
|
* **Libc信息泄漏**:存在使用后释放和双重释放。在此解决方案中,作者通过读取放置在小bin中的块的地址泄漏了libc的地址(类似于从未排序的bin中泄漏,但是从小bin中泄漏)。
|
|||
|
* **Tcache攻击**:通过**双重释放**执行Tcache。同一块被释放两次,因此在Tcache内,该块将指向自身。然后,它被分配,其FD指针被修改为指向**free hook**,然后再次分配,因此列表中的下一个块将位于free hook中。然后,这也被分配,可以在此处写入`system`的地址,因此当包含`"/bin/sh"`的malloc被释放时,我们就可以获得shell。
|
|||
|
* 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)
|
|||
|
* 这里的主要漏洞是可以通过指定其偏移量来`free`堆中的任何地址
|
|||
|
* **Tcache索引攻击**:可以分配和释放一个大小的块,当存储在tcache块中(包含tcache bin信息的块)时,将生成一个值为0x100的地址。这是因为tcache在不同字节中存储每个bin中的块数量,因此一个特定索引中的一个块会生成值0x100。
|
|||
|
* 然后,此值看起来像是一个大小为0x100的块。通过`free`此地址,将**将该地址添加到tcache中大小为0x100的块的索引**。
|
|||
|
* 然后,**分配**一个大小为**0x100**的块,先前的地址将作为一个块返回,允许覆盖其他tcache索引。\
|
|||
|
例如,将malloc hook的地址放入其中一个索引中,并分配该索引大小的块,将授予在calloc hook中获得一个块的机会,从而可以编写一个gadget以获得shell。
|
|||
|
* 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)
|
|||
|
* 与之前相同的漏洞,但有一个额外的限制
|
|||
|
* **Tcache索引攻击**:类似于前一个攻击,但使用更少的步骤,通过**释放包含tcache信息的块**,使其地址添加到其大小的tcache索引中,因此可以分配该大小并将tcache块信息作为一个块,从而可以将free hook添加为一个索引的地址,分配它,并在其上编写一个gadget。
|