一文读懂UPNP常见漏洞
UPNP协议
UPnP简介
UPnP(Universal Plug and Play,通用即插即用)是一种网络协议集,旨在使网络设备(如计算机、打印机、智能家电、路由器等)能够在局域网内自动发现彼此并进行无缝通信,而无需复杂的配置。UPnP基于开放的互联网协议(如TCP/IP、HTTP、XML和SOAP),通过设备间的自动发现、控制和事件通知,实现设备间的互操作性。
UPnP的核心功能包括:
- 自动发现:设备接入网络后,可以通过SSDP(简单服务发现协议)广播自己的存在,其他设备或控制点可以检测到它。
- 自我描述:设备使用XML文件描述其功能和服务,控制点可以读取这些信息以了解设备能力。
- 动态配置:支持设备的即插即用,无需手动设置IP地址或端口映射。
- 事件通知:设备状态变化时,可以主动通知网络中的其他设备。
UPnP的应用场景
UPnP广泛应用于家庭网络和智能设备领域,以下是一些典型的应用场景:
- 端口映射(NAT穿越)
- 场景:在家庭路由器上,UPnP常用于自动配置端口映射。例如,游戏玩家使用P2P游戏(如《使命召唤》)或文件共享软件(如BitTorrent)时,UPnP可以自动打开所需的端口,简化网络设置。
- 优势:无需手动进入路由器界面配置,适合非技术用户。
- 智能家居设备互联
- 场景:智能灯泡、智能音箱(如Amazon Echo)、智能电视等设备通过UPnP发现彼此,用户可以用手机App控制这些设备。例如,手机检测到局域网内的智能电视并投屏播放视频。
- 优势:实现设备间的无缝协作,提升用户体验。
- 媒体共享与播放
- 场景:DLNA(数字生活网络联盟)基于UPnP实现媒体共享。例如,用户可以将电脑上的电影通过UPnP协议推送至支持DLNA的电视或播放器上。
- 优势:跨设备流媒体播放变得简单快捷。
- 网络打印与文件共享
- 场景:网络打印机通过UPnP被局域网内的电脑自动发现,用户无需手动安装驱动或配置IP即可打印。
- 优势:简化办公或家庭打印流程。
- 远程访问与监控
- 场景:家庭安防摄像头利用UPnP自动配置端口,用户可以通过互联网远程查看实时画面。
- 优势:便于非专业用户快速部署监控系统。
举例
假设你买了一台支持UPnP的智能音箱,接入Wi-Fi后:
- **它通过SSDP广播:“我是一个音箱,支持播放音乐,描述文件在 **http://192.168.1.10/desc.xml”。
- 你的手机(装有支持UPnP的App)听到广播,读取描述文件,发现可以控制音量和播放。
- 你用手机点“播放”,音箱开始工作。
- 如果手机不支持UPnP,你可能得用音箱自带的手动配置方式(比如输入IP地址)。
UpNP协议栈
UPnP 的工作流程
- 发现:SSDP广播 → 获取描述文件(HTTP + XML)。
- 控制:发送SOAP请求(HTTP + XML)→ 设备执行命令。
- 通知:设备通过GENA推送状态变化(HTTP)
端口
- 标准端口:1900
- 随机端口:1600-1900
常见漏洞点
SYN洪水攻击
假设我们已经通过一些方法(如在局域网广播等)获得了某些设备UPnP服务的eventSubURL,下面就可以向UPnP设备发起一项订阅服务,格式如下:
1 | SUBSCRIBE eventSubURLHTTP/1.1 |
若CALLBACL Value中定义了不止一个URL,则会按顺序尝试TCP连接,直到有一个连接成功。那么攻击者可在CALLBACK Value中精心构造多个URL,使每一个都无法连接成功,这样UPnP设备就会用多个SYN包依次对每个URL尝试TCP握手。假设攻击者可以操控很多个设备,就会导致受害设备遭受DDoS攻击。
数据逃逸
一般情况下,企业内部网络都有不同的安全等级划分。当攻击者渗透到企业内网时,若内网开启数据泄露防护系统,无法将获得的敏感数据传输出去,此时UPnP设备会是一个很好的跳板。
在RFC7230的3.1.1节[2]中,并没有对Request Line的长度做任何限制,这使得攻击者可以将数据通过Callback的URL值传输出去。如下图,某品牌智能电视一次请求就传输了2500KB的数据。
端口扫描
1. UPNP callstranger 漏洞 (CVE-2020-12695)
- 发现时间:2019年末由安全研究员Yunus Çadırcı发现,2020年6月公开。
- 漏洞描述:** **该漏洞存在于UPnP的SUBSCRIBE功能中,攻击者可以控制“Callback”头的值,导致类似于服务器端请求伪造(SSRF)的攻击。设备在处理SUBSCRIBE请求时,会根据Callback头发送数据到指定目标,而不对目标地址进行充分验证。
若CALLBACK定义了不止一个URL,则会按顺序尝试TCP连接,直到有一个成功,那么这个规则显然也可以用于端口扫描,如下图所示,假设攻击者需要扫描IP为192.168.1.13的555端口是否开启,那么攻击者只需要将某个可以监控的URL放置在后即可确认,若攻击者收到连接请求,则端口未开启,反之,则开启。
这里还是比较有意思,有点类web中的SSRF的利用了
SUBSCRIBE 是什么?
- 定义:** **SUBSCRIBE 是 UPnP 中用于订阅设备事件的 HTTP 请求方法。控制点通过发送 SUBSCRIBE 请求,告诉设备:“当你的状态发生变化时,请通过指定的回调地址通知我。”
- 作用:** **它实现了 UPnP 的“事件通知”功能,让控制点可以动态监控设备状态,而无需频繁轮询(即主动询问设备状态)。
- 所属机制:** **SUBSCRIBE 是 GENA 协议的一部分,而 GENA 是 UPnP 协议栈中负责事件通知的模块,与 SSDP(发现)、SOAP(控制)并列。
1. 测试目标与背景
- 目标:验证 UPnP 设备是否会接受外部 CALLBACK 并发送 NOTIFY 请求,从而确认是否存在 CallStranger 漏洞。
- 前提:需要一个支持 UPnP 的设备(例如路由器或智能设备),以及对其网络地址和服务的访问权限。
这里我已经发现了查询访问列表和upnp的端口
发送手动构造的 SUBSCRIBE 请求并检查设备响应。
1 | SUBSCRIBE /web/cms_event |
返回200说明服务端接收了我们的callback地址,这里的back地址为我虚拟机中的nginx服务,去看一下nginx的log文件有没有使用NOTIFY方法去请求我们的callback地址,
为什么收到 405?
- Nginx 默认行为
- Nginx 只支持常见 HTTP 方法(如 GET、POST、PUT 等),而 NOTIFY 是 UPnP 协议的特殊方法,默认未启用。
这里我们再用到CallStranger工具实操一下,
需要用到nginx+php,在网站根目录下把工具里的php文件放到下面来,
工具里的py文件需要换成我们搭建的nginx服务器的地址,
这样就说明成功了,
再去看一下log,
参考链接:
[1]https://openconnectivity.org/upnp-specs/UPnP-arch-DeviceArchitecture-v2.0-20200417.pdf
[2]https://tools.ietf.org/html/rfc7230#section-3.1.1
[3]https://delaat.net/rp/2008-2009/p26/report.pdf