Easy File Sharing Web Server 7.2 中的基于 SEH 的缓冲区溢出,演示经过身份验证的 HTTP POST 参数如何破坏异常处理程序链。
这个仓库是我在讲授内存损坏漏洞利用时使用的教学材料的一部分(除了日常工作外,我还在不同的网络安全课程中授课,帮助培养下一代逆向工程师)。
CVE-2018-18912 是我用来让学生从普通的 EIP 覆盖过渡到基于 SEH 的漏洞利用的案例。一旦学生理解了直接覆盖返回地址的工作原理,下一步就是理解当栈被破坏到程序在返回之前触发异常时会发生什么,以及异常处理程序链如何取而代之成为攻击面。这个 CVE 清晰地展示了这一转变:溢出深度足以触及 SEH 链,利用路径遵循经典的 POP POP RETN 技术,这是每个漏洞利用开发人员都需要理解的。通过 ROP 绕过 DEP 是可选的扩展内容,供想更进一步的学生学习——相同的溢出、不同的 gadget 策略、一个难得多的问题。
该漏洞影响 Easy File Sharing Web Server 7.2,这是一个轻量级的 Windows Web 服务器应用程序,广泛用于简单的文件共享。该软件在编写时没有考虑现代安全缓解措施。从教学角度来看,这个案例特别有趣的原因在于它所涉及的多种因素组合:
这种组合使 CVE-2018-18912 成为教授基础之外的漏洞利用开发技术的绝佳案例。
Easy File Sharing Web Server 7.2 是一个 Windows 应用程序,允许用户通过 HTTP 共享文件。它包含文件浏览、用户身份验证和内置论坛系统等功能。
论坛功能接受 POST 请求来创建新主题。该端点处理的表单字段之一是 author 参数。在内部,应用程序将此用户可控的值复制到固定大小的栈缓冲区中,而不验证其长度。
该漏洞于 2018 年被发现并报告。原始 PoC 在不久后发布,同时演示了崩溃和一条可用的利用链,其中包括来自捆绑的 ImageLoad.dll 模块的 ROP gadget。
关键技术细节:
当用户创建新的论坛主题时,Easy File Sharing Web Server 会处理指向 /forum.ghp 的 HTTP POST 请求。接受的参数之一是 author,它会被复制到本地栈缓冲区中,而没有任何长度检查。
在逆向该二进制文件时,可以观察到这个表单字段的处理程序使用了固定大小的缓冲区和不安全的复制操作。易受攻击逻辑的简化版本如下:
char author_buffer[64];
strcpy(author_buffer, user_input);
由于目标缓冲区大小固定且输入长度未经验证,在 author 字段中发送足够长的字符串会导致复制操作越过缓冲区末尾写入数据。
随着写入的数据越来越多,栈布局遭到破坏。与简单的返回地址覆盖不同,溢出会触及存储在栈上的结构化异常处理程序(SEH)链。当损坏的栈触发异常时,操作系统会遍历 SEH 链,并将控制权转移到攻击者控制的处理程序地址。
因此,利用流程遵循 SEH 覆盖技术:
这使得该漏洞比基本的 EIP 覆盖更难利用,但也更贴近现实世界的场景。
可以通过在向 /forum.ghp 发送的 POST 请求的 author 参数中发送长字符串来复现崩溃,前提是先用有效凭据进行身份验证。使用 Python 的示例:
import socket
HOST = '127.0.0.1'
PORT = 80
payload = b"A" * 500
request = (
b"POST /forum.ghp?forumid=1 HTTP/1.1\r\n"
b"Host: 127.0.0.1\r\n"
b"Content-Type: application/x-www-form-urlencoded\r\n"
b"Cookie: UserID=test; PassWD=test; SESSIONID=1234\r\n"
b"Connection: close\r\n"
b"\r\n"
b"author=" + payload + b"&passwd=test&title=test&content=test&Submit=Submit\r\n"
)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send(request)
s.close()
在调试器下执行时,崩溃会显示损坏的 SEH 链和访问冲突,确认用户可控的数据已覆盖异常处理程序指针。
这个仓库的目标不仅是演示崩溃,还要按照开发真实 SEH 漏洞利用时使用的方法论,逐步走完完整的利用过程。
为了保持主 README 的简洁,详细的利用笔记、脚本和调试器步骤放在本仓库的 Vulnerability 📂 文件夹中。
在那里你会找到用于利用此 CVE 的完整工作流程,包括: