漏洞描述

CVE-2021-4045 是一个命令注入漏洞,允许在 TP-Link Tapo c200 IP 摄像机中远程执行代码。它影响 1.1.16 Build 211209 Rel 之前的所有固件版本。37726N 由于对用户输入的检查不足uhttpd,这是设备的主要二进制文件之一
 
 

影响版本

1.1.16 Build 211209 Rel 之前的所有固件版本
 
 

漏洞分析

函数exec_and_read_json用于popen执行命令:



xec_and_read_json由 2 个未命名的函数使用,我将其命名为set_language和wifi_connect。他们分别处理语言和wifi配置(显然)。wifi_connect似乎解析单引号('),但是,set_language没有。这意味着如果我们可以控制set_language函数的输入,我们就可以成功地注入我们自己的命令。





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





要解析用户数据,uh_slp_proto_request请检查它是否是有效的 JSON 对象。然后,它得到一个由 key 标识的字符串值"method"和一个由 key 标识的字典值"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是否是常规 POST 数据。/因此,如果我们使用先前的有效负载发送 POST 请求,uh_slp_proto_request将处理此数据,调用set_language并且我们的有效负载将被注入到执行的命令中exec_and_get_result。

如您所见,我没有提及任何有关身份验证的内容,因为setLanguage无需登录即可调用方法。这允许任何用户只需一个未经验证的请求即可完全控制相机。
 
 

漏洞利用

POC
https://github.com/hacefresko/CVE-2021-4045-PoC