mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 22:52:06 +00:00
6.1 KiB
6.1 KiB
强制之屋
从零开始学习AWS黑客技术,成为 htARTE(HackTricks AWS红队专家)!
支持HackTricks的其他方式:
- 如果您想看到您的公司在HackTricks中做广告或下载PDF格式的HackTricks,请查看订阅计划!
- 获取官方PEASS & HackTricks周边产品
- 探索PEASS家族,我们的独家NFT收藏品
- 加入 💬 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)
*/
因此,分配大小为target - old_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"
,最后释放包含该字符串内容的块。