对 CVE-2019-17147(TP-Link TL-WR841N 路由器中的栈缓冲区溢出漏洞)的全面逆向工程与利用。包括固件分析、硬件调试以及用于未授权远程代码执行的分阶段 shellcode 注入利用程序。

本仓库记录了对 CVE-2019-17147 的全面逆向分析与利用过程,该漏洞是 TP-Link TL-WR841N 路由器(MIPSEL 架构)中的一个严重远程代码执行(RCE)漏洞。漏洞位于 httpd Web 服务器守护进程中,由于不正确的输入验证,通过自定义的 cstr_strncpy 函数导致基于栈的缓冲区溢出,从而在无需认证的情况下实现任意代码执行。
| 漏洞编号 | CVE-2019-17147 |
|---|---|
| CVSS v3.1 | 8.8(高危) |
| 攻击向量 | AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| 类型 | 基于栈的缓冲区溢出 |
| 组件 | /usr/bin/httpd |
分析环境使用以下组件搭建:
flashrom(内存转储)、binwalk(固件提取)、IDA Pro(静态分析)、GDB-Multiarch(远程调试)、QEMU(MIPSEL 仿真)。TL-WR841N(US)_V14_180319。该漏洞在 /usr/bin/httpd 二进制文件中被发现。通过 IDA Pro 的静态分析,发现了一个自定义字符串复制函数 cstr_strncpy,用于 HTTP 头部解析(特别是 Host 头部)。

函数 cstr_strncpy 接受一个 copy_len 参数,该参数来源于源字符串长度,而非目标缓冲区大小。当提供过长的头部时,会导致经典的基于栈的缓冲区溢出。此外,操作链表结构的 http_parser_argStrToList 函数也受到了此溢出的影响,从而可以控制 next 和 prev 指针。
使用 gdbserver 进行运行时调试,确认了崩溃并控制了执行流程。内存映射(vmmap)分析揭示了严重缺乏安全加固:

这种配置允许直接执行放置在堆上的 Shellcode,从而绕过了复杂的 ROP 链需求。
漏洞利用链利用由损坏的链表指针派生出的 Write-What-Where 原语来实现 RCE。
strcpy 中的空字节限制,通过多个请求发送有效载荷:
atol 函数条目被覆写为 Shellcode 的地址。atol(通过 Content-Length 头部),将执行重定向到注入的 Shellcode。
最终的 Python 脚本成功自动化了该攻击,在端口 31337 上生成了一个 root shell。

该漏洞源于不安全的缓冲区管理编码实践。
cstr_strncpy 的使用替换为严格强制目标缓冲区大小限制的安全替代方案(例如,基于 sizeof(dest) 进行显式边界检查的 strncpy)。有关整个过程的详细逐步指导,包括代码分析和环境设置,请参阅本仓库中的完整指南:
本项目仅用于教育和研究目的。所提供的信息旨在提高物联网设备的安全性。作者不对本文所含信息或代码的任何滥用负责。
基于原始研究与分析。