一个带有任意DLL注入的SEH溢出的概念验证
Kolibrì HTTP Server 2.0 受 基于栈的缓冲区溢出 影响。在发现时,该漏洞仅仅通过用 JMP ESP 指令覆盖指令指针来利用,其中 ESP 指向放置在栈上的 shellcode。随后发现,如果发送更大的有效载荷,SEH 链可以被覆盖。然而,该应用程序没有有效的 POP - POP - RET 指令来使 SE 处理程序指向下一个 SEH 记录。这是因为所有相关的内存地址都以 null 字节开头。

此利用方法提出通过 DLL 注入实现 SEH 溢出的代码执行。将任意 DLL 注入 Kolibrì 进程为用来自该 DLL 的不含 null 字节的地址覆盖 SE 处理程序提供了机会,该地址指向 POP - POP - RET 指令。显然,此方法仅可用于开发概念验证,如果利用是为了本地提升系统权限,则不能依赖于此。这是因为如果你想将 DLL 注入到目标进程中,你需要拥有与其相同的权限。除此之外,该利用方法是有效的!

当我最初上传此利用方法时,它只支持非常短的自定义 shellcode,并使用了硬编码的 WinExec 和 ExitProcess 地址。这是因为覆盖 SEH 后缓冲区空间很小。现在我刚刚更新了利用代码,在 SEH 之后部署了一个 egghunter shellcode,并将 egg + shellcode 放在 Web 服务器的 User-Agent 头中。因此,执行流将从被覆盖的 SEH 重定向到 egghunter,然后 egghunter 将搜索标记有 egg 'w00t' 的 shellcode。
此方法的功劳归于该原始仓库的 FULLSHADE。
https://github.com/FULLSHADE/POPPOPRET-nullbyte-bypass
我所做的只是将这个想法应用于这个特定的 CVE。