mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 06:30:37 +00:00
6 KiB
6 KiB
强制之屋
{% hint style="success" %}
学习和实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE)
学习和实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)
支持 HackTricks
- 查看订阅计划!
- 加入 💬 Discord 群组 或 电报群组 或 关注我们的 Twitter 🐦 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud github 仓库提交 PR 来分享黑客技巧。
基本信息
代码
目标
- 此攻击的目标是能够在特定地址分配一个块。
要求
- 允许覆盖顶部块头部大小(例如 -1)的溢出。
- 能够控制堆分配的大小。
攻击
如果攻击者想要在地址 P 中分配一个块以覆盖这里的值。他首先通过将顶部块大小覆盖为 -1
(可能通过溢出)来开始。这确保了 malloc 不会为任何分配使用 mmap,因为顶部块始终有足够的空间。
然后,计算顶部块地址和目标空间之间的距离以进行分配。这是因为将执行具有该大小的 malloc 以将顶部块移动到该位置。这就是差异/大小可以轻松计算的方式:
// From https://github.com/shellphish/how2heap/blob/master/glibc_2.27/house_of_force.c#L59C2-L67C5
/*
* The evil_size is calulcated as (nb is the number of bytes requested + space for metadata):
* new_top = old_top + nb
* nb = new_top - old_top
* req + 2sizeof(long) = new_top - old_top
* req = new_top - old_top - 2sizeof(long)
* req = target - 2sizeof(long) - old_top - 2sizeof(long)
* req = target - old_top - 4*sizeof(long)
*/
因此,分配目标地址 - 旧top地址 - 4*sizeof(long)
的大小(4个long是因为顶部块的元数据和分配新块时的元数据)将把顶部块移动到我们想要覆盖的地址。
然后,再次执行malloc以在目标地址获取一个块。
参考资料和其他示例
- https://github.com/shellphish/how2heap/tree/master
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_force/
- https://heap-exploitation.dhavalkapil.com/attacks/house_of_force
- https://github.com/shellphish/how2heap/blob/master/glibc_2.27/house_of_force.c
- https://guyinatuxedo.github.io/41-house_of_force/house_force_exp/index.html
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_force/#hitcon-training-lab-11
- 该场景的目标是进行ret2win,需要修改将被调用的函数的地址为ret2win函数的地址
- 二进制文件存在一个溢出,可以被滥用以修改顶部块的大小,修改为-1或p64(0xffffffffffffffff)
- 然后,计算要覆盖的指针存在的位置的地址,并将当前顶部块的位置到那里的差异用
malloc
分配 - 最后分配一个新的块,其中包含将被ret2win函数覆盖的所需目标
- https://shift--crops-hatenablog-com.translate.goog/entry/2016/03/21/171249?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp
- 在
Input your name:
中存在一个初始漏洞,允许从堆中泄漏一个地址 - 然后在
Org:
和Host:
功能中,当要求org name时,可以填充s
指针的64B,堆栈中跟随v2地址,然后跟随指定的host name。然后,由于strcpy将把s的内容复制到大小为64B的块中,因此可以用host name中放入的数据覆盖顶部块的大小。 - 现在具有任意写入权限,
atoi
的GOT被覆盖为printf的地址。然后可以使用%24$p
泄漏IO_2_1_stderr
的地址。有了这个libc泄漏,就可以再次用system
的地址覆盖atoi
的GOT,并调用它并传递/bin/sh
作为参数 - 另一种方法在这篇其他文章中提出,是将
free
覆盖为puts
,然后将atoi@got
的地址添加到稍后将被释放的指针中,以便泄漏,然后使用此泄漏再次将atoi@got
覆盖为system
并调用它以/bin/sh
。 - https://guyinatuxedo.github.io/41-house_of_force/bkp16_cookbook/index.html
- 存在UAF允许重用未清除指针的已释放块。由于存在一些读取方法,因此可以在这里将指针写入GOT中的free函数以泄漏libc地址,然后调用读取函数。
- 然后,使用House of force(滥用UAF)覆盖左侧空间的大小为-1,分配足够大的块以到达free hook,然后分配另一个包含free hook的块。然后,在hook中写入
system
的地址,在一个块中写入"/bin/sh"
,最后释放包含该字符串内容的块。