From a7e9810e1c3175d983e4f47489c423f4cec1337b Mon Sep 17 00:00:00 2001 From: Translator Date: Thu, 13 Jun 2024 21:22:44 +0000 Subject: [PATCH] Translated ['binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc --- .../aw2exec-__malloc_hook.md | 81 ++++++++++--------- binary-exploitation/heap/house-of-force.md | 48 +++++++++-- 2 files changed, 85 insertions(+), 44 deletions(-) diff --git a/binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md b/binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md index b781784f4..5882fcfe7 100644 --- a/binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md +++ b/binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md @@ -2,13 +2,13 @@
-从零开始学习AWS黑客技术 htARTE(HackTricks AWS红队专家) +从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS Red Team Expert) 支持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)收藏品 +* 探索[**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来分享您的黑客技巧。 @@ -16,9 +16,9 @@ ## **Malloc Hook** -正如您可以在[GNU官方网站](https://www.gnu.org/software/libc/manual/html\_node/Hooks-for-Malloc.html)中看到的,变量**`__malloc_hook`**是一个指针,指向**将在调用`malloc()`时调用的函数的地址**,存储在libc库的数据段中。因此,如果将此地址覆盖为例如**One Gadget**,并调用`malloc`,则将调用**One Gadget**。 +正如您可以在[GNU官方网站](https://www.gnu.org/software/libc/manual/html\_node/Hooks-for-Malloc.html)中看到的,变量**`__malloc_hook`**是一个指针,指向**每次调用`malloc()`时将被调用的函数的地址**,存储在libc库的数据段中。因此,如果将此地址覆盖为例如**One Gadget**,并调用`malloc`,则将调用**One Gadget**。 -要调用malloc,可以等待程序调用它,也可以通过**调用`printf("%10000$c")`**,这将分配太多字节,使`libc`调用malloc在堆中分配它们。 +要调用malloc,可以等待程序调用它,或者通过**调用`printf("%10000$c")`**,这将分配太多字节,使得`libc`调用malloc在堆中分配它们。 有关One Gadget的更多信息,请参见: @@ -27,49 +27,58 @@ {% endcontent-ref %} {% hint style="warning" %} -请注意,**GLIBC >= 2.34**已禁用挂钩。现代GLIBC版本可以使用其他技术。请参见:[https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md)。 +请注意,**GLIBC >= 2.34已禁用挂钩**。现代GLIBC版本可以使用其他技术。请参见:[https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md)。 {% endhint %} ## Free Hook -这在页面中滥用快速bin攻击之后滥用未排序bin攻击的示例中被滥用: +这在页面中滥用快速bin攻击之后滥用未排序bin攻击的一个示例中被滥用: {% content-ref url="../heap/unsorted-bin-attack.md" %} [unsorted-bin-attack.md](../heap/unsorted-bin-attack.md) {% endcontent-ref %} -现在执行**快速bin攻击**: +一个很好的技巧(来自[**这里**](https://guyinatuxedo.github.io/41-house\_of\_force/bkp16\_cookbook/index.html))是,如果二进制文件具有符号,可以**执行类似以下操作**来找到free hook的位置: +``` +gef➤ set __free_hook = 0xfacade +gef➤ search-pattern 0xfacade +``` +在同一篇文章中,您可以找到有关如何在没有符号的情况下定位`__free_hook`地址的逐步指南。总结一下,在`free`函数中: -* 首先发现可以在**`__free_hook`**位置使用大小为200的快速**块**: -*
gef➤  p &__free_hook
-$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
+```armasm
+gef➤  x/20i free
+0xf75dedc0 : push   ebx
+0xf75dedc1 : call   0xf768f625
+0xf75dedc6 : add    ebx,0x14323a
+0xf75dedcc :  sub    esp,0x8
+0xf75dedcf :  mov    eax,DWORD PTR [ebx-0x98]
+0xf75dedd5 :  mov    ecx,DWORD PTR [esp+0x10]
+0xf75dedd9 :  mov    eax,DWORD PTR [eax]
+0xf75deddb :  test   eax,eax ;<--- BREAK HERE
+0xf75deddd :  jne    0xf75dee50 
+```
+
+在前面代码中的断点处,`$eax`中将会是`free hook`的地址。
+
+现在执行**快速 bin 攻击**:
+
+- 首先发现可以在**`__free_hook`**位置使用大小为200的快速**块**:
+```c
+gef➤  p &__free_hook
+$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
 gef➤  x/60gx 0x7ff1e9e607a8 - 0x59
-0x7ff1e9e6074f: 0x0000000000000000      0x0000000000000200
-0x7ff1e9e6075f: 0x0000000000000000      0x0000000000000000
-0x7ff1e9e6076f <list_all_lock+15>:      0x0000000000000000      0x0000000000000000
-0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000      0x0000000000000000
-
-* 如果我们设法在此位置获得大小为0x200的快速块,则可以覆盖将执行的函数指针 -* 为此,创建一个大小为`0xfc`的新块,并使用该指针两次调用合并函数,这样我们就可以在快速bin中获得一个大小为`0xfc*2 = 0x1f8`的释放块的指针。 -* 然后,在此块中调用编辑函数,将这个快速bin的**`fd`**地址修改为指向先前的**`__free_hook`**函数。 -* 然后,创建一个大小为`0x1f8`的块,以从快速bin中检索先前无用的块,因此创建另一个大小为`0x1f8`的块,以在**`__free_hook`**中获取一个快速bin块,该块被覆盖为**`system`**函数的地址。 -* 最后,释放包含字符串`/bin/sh\x00`的块,调用删除函数,触发指向带有`/bin/sh\x00`参数的**`__free_hook`**函数。 +0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200 +0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000 +0x7ff1e9e6076f : 0x0000000000000000 0x0000000000000000 +0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000 +``` +- 如果我们成功在这个位置获得大小为0x200的快速块,就可以覆盖一个将要执行的函数指针 +- 为此,创建一个大小为`0xfc`的新块,并使用该指针两次调用合并函数,这样我们就可以获得一个大小为`0xfc*2 = 0x1f8`的已释放块的指针在快速 bin 中。 +- 然后,在这个块中调用编辑函数,将这个快速 bin 的**`fd`**地址修改为指向之前的**`__free_hook`**函数。 +- 接着,创建一个大小为`0x1f8`的块,从快速 bin 中检索之前无用的块,然后创建一个大小为`0x1f8`的块,以在**`__free_hook`**中获取一个快速 bin 块,该块被覆盖为**`system`**函数的地址。 +- 最后,释放一个包含字符串`/bin/sh\x00`的块,调用删除函数,触发指向带有`/bin/sh\x00`参数的**`__free_hook`**函数。 ## 参考资料 -* [https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook](https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook) -* [https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md). - -
- -从零开始学习AWS黑客技术 htARTE(HackTricks AWS红队专家) - -支持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来分享您的黑客技巧。 - -
+- [https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook](https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook) +- [https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md). diff --git a/binary-exploitation/heap/house-of-force.md b/binary-exploitation/heap/house-of-force.md index 655c1831e..7061b7fec 100644 --- a/binary-exploitation/heap/house-of-force.md +++ b/binary-exploitation/heap/house-of-force.md @@ -1,16 +1,16 @@ -# House of Force +# 强制之屋
-从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS红队专家) +从零开始学习AWS黑客技术,成为 htARTE(HackTricks AWS红队专家) 支持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) +* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[NFT收藏品](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来分享您的黑客技巧。 @@ -20,7 +20,8 @@ ### 代码 -* 这种技术已被修补([**这里**](https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=30a17d8c95fbfb15c52d1115803b63aaa73a285c)),并产生以下错误:`malloc(): corrupted top size` +* 这种技术已被修补([**在此处**](https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=30a17d8c95fbfb15c52d1115803b63aaa73a285c)),并产生此错误:`malloc(): corrupted top size` +* 您可以尝试[**这里的代码**](https://guyinatuxedo.github.io/41-house\_of\_force/house\_force\_exp/index.html)进行测试。 ### 目标 @@ -28,15 +29,46 @@ ### 要求 -* 允许覆盖顶部块头部大小的溢出(例如 -1)。 -* 能够控制堆分配的大小。 +* 允许覆盖顶部块头部大小(例如-1)的溢出。 +* 能够控制堆分配的大小 ### 攻击 -如果攻击者想要在地址P处拥有一个块,并已经用-1覆盖了顶部块的大小。首先需要malloc(\&top\_chunk - P)。请注意,此指针可以在top\_chunk之前或之后,因为任何大小都小于-1(0xFFFFFFFFFFFFFFFF)。然后,在分配此初始块后,顶部块将移动到所需的P地址,下一个块将从该地址开始。 +如果攻击者想要在地址P中分配一个块以覆盖这里的值。他首先通过覆盖顶部块大小为`-1`(可能通过溢出)来开始。这确保了malloc不会为任何分配使用mmap,因为顶部块始终有足够的空间。 -### 参考 +然后,计算顶部块地址和目标空间之间的距离以进行分配。这是因为将执行具有该大小的malloc以将顶部块移动到该位置。这就是如何轻松计算差异/大小的方法: +```c +// 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://github.com/shellphish/how2heap/tree/master?tab=readme-ov-file) * [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/) * [https://heap-exploitation.dhavalkapil.com/attacks/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://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://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](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](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`作为参数 +* 另一种方法[在这篇其他文章中提出](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/#2016-bctf-bcloud),是将`free`覆盖为`puts`,然后在稍后将被释放的指针中添加`atoi@got`的地址,以便泄漏,然后使用此泄漏再次覆盖`atoi@got`为`system`并调用它并传递`/bin/sh`。 +* [https://guyinatuxedo.github.io/41-house\_of\_force/bkp16\_cookbook/index.html](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"`,最后释放包含该字符串内容的块。