Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2021-4045 — 针对 TP-Link Tapo c200 IP 摄像头中 uhttpd 二进制文件存在的命令注入漏洞的利用程序 | Kitploit
工具/GitHubGitHub/hacefresko/cve-2021-4045
嵌入式系统安全物联网安全漏洞分析漏洞利用Web应用程序漏洞利用命令与控制硬件与物联网安全二进制分析远程访问工具
GitHubhacefresko/cve-2021-4045

CVE-2021-4045

针对 TP-Link Tapo c200 IP 摄像头中 uhttpd 二进制文件存在的命令注入漏洞的利用程序

1171781年前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
查看仓库

CVE-2021-4045

CVE-2021-4045 是一个命令注入漏洞,允许对 TP-Link Tapo c200 IP 摄像头进行远程代码执行。由于对 uhttpd(设备的主要二进制文件之一)中的用户输入检查不足,该漏洞影响所有早于 1.1.16 Build 211209 Rel. 37726N 的固件版本。完整分析文章可在此处找到。

漏洞利用 (pwnTapo.py)

这是为在 CryptoParty Madrid 2022 上演示该漏洞而制作的 PoC 的扩展版本。它有两种模式:

  • shell:在目标上生成一个 root shell

  • rtsp:通过 RTSP 提供实时视频流的访问

二进制分析

函数 exec_and_read_json 使用 popen 来执行命令:

exec_and_read_json

exec_and_read_json 被两个未命名的函数使用,我将其命名为 set_language 和 wifi_connect。它们分别处理语言和 Wi-Fi 配置(显然)。wifi_connect 似乎会解析单引号 ('),但 set_language 不会。这意味着如果我们能够控制 set_language 函数的输入,就可以成功注入我们自己的命令。

wifi_connect set_language

函数 set_language 被 uh_slp_proto_request 使用,即我之前提到的函数,它将从用户接收到的解析数据作为输入传递。

main_func_1 main_func_2

为了解析用户数据,uh_slp_proto_request 会检查是否为有效的 JSON 对象。然后,它获取由键 "method" 标识的字符串值和由 "params" 标识的字典值(至少我是这么认为的,因为函数调用无法被 Ghidra 解析,但看起来是这样工作的)。根据所选的方法,uh_slp_proto_request 选择将要调用的函数。

因此,通过发送 {"method": "setLanguage", "params":{}},我们成功调用了 set_language 函数,并将 {} 作为 language_json 参数传递。然后,在 set_language 内部,language_json 对象被转换为字符串,并直接插入到 "ubus call system_state_audio set_language \'%s\'" 中执行。

通过提交 {"method": "setLanguage", "params": {"payload": "'; touch poc;'"}},将执行 ubus call system_state_audio set_language '{"payload": "'; touch poc;'"}',该命令实际上包含 3 条命令:ubus call system_state_audio set_language '{"payload": "'、touch poc 和 '"}'。第二条命令赋予我们完全的代码执行能力。

现在,uh_slp_proto_request 被另一个管理所有请求的未命名函数使用,我将其命名为 main_server_function。如果请求有效(不超过最大长度,根据服务器配置使用 http 或 https 等),main_server_function 会检查 URL 是否包含 /cgi-bin/luci 或 /web-static。如果不包含,则调用 uh_slp_proto_request。

uh_slp_proto_request_entrypoint

通过猜测并向摄像头发送几个请求,我们可以确认 uh_slp_proto_request 使用的数据是普通的 POST 数据。因此,如果我们使用之前的 payload 向 / 发送 POST 请求,uh_slp_proto_request 将处理这些数据,调用 set_language,我们的 payload 将被注入到 exec_and_get_result 执行的命令中。

正如你所见,我没有提及任何关于身份验证的内容,因为 setLanguage 方法可以在无需登录的情况下调用。这使得任何用户只需一个未经身份验证的请求即可完全控制摄像头。

下载工具