UPNP协议

UPnP简介

UPnP(Universal Plug and Play,通用即插即用)是一种网络协议集,旨在使网络设备(如计算机、打印机、智能家电、路由器等)能够在局域网内自动发现彼此并进行无缝通信,而无需复杂的配置。UPnP基于开放的互联网协议(如TCP/IP、HTTP、XML和SOAP),通过设备间的自动发现、控制和事件通知,实现设备间的互操作性。

UPnP的核心功能包括:

  1. 自动发现:设备接入网络后,可以通过SSDP(简单服务发现协议)广播自己的存在,其他设备或控制点可以检测到它。
  2. 自我描述:设备使用XML文件描述其功能和服务,控制点可以读取这些信息以了解设备能力。
  3. 动态配置:支持设备的即插即用,无需手动设置IP地址或端口映射。
  4. 事件通知:设备状态变化时,可以主动通知网络中的其他设备。

UPnP的应用场景

UPnP广泛应用于家庭网络和智能设备领域,以下是一些典型的应用场景:

  1. 端口映射(NAT穿越)
    • 场景:在家庭路由器上,UPnP常用于自动配置端口映射。例如,游戏玩家使用P2P游戏(如《使命召唤》)或文件共享软件(如BitTorrent)时,UPnP可以自动打开所需的端口,简化网络设置。
    • 优势:无需手动进入路由器界面配置,适合非技术用户。
  2. 智能家居设备互联
    • 场景:智能灯泡、智能音箱(如Amazon Echo)、智能电视等设备通过UPnP发现彼此,用户可以用手机App控制这些设备。例如,手机检测到局域网内的智能电视并投屏播放视频。
    • 优势:实现设备间的无缝协作,提升用户体验。
  3. 媒体共享与播放
    • 场景:DLNA(数字生活网络联盟)基于UPnP实现媒体共享。例如,用户可以将电脑上的电影通过UPnP协议推送至支持DLNA的电视或播放器上。
    • 优势:跨设备流媒体播放变得简单快捷。
  4. 网络打印与文件共享
    • 场景:网络打印机通过UPnP被局域网内的电脑自动发现,用户无需手动安装驱动或配置IP即可打印。
    • 优势:简化办公或家庭打印流程。
  5. 远程访问与监控
    • 场景:家庭安防摄像头利用UPnP自动配置端口,用户可以通过互联网远程查看实时画面。
    • 优势:便于非专业用户快速部署监控系统。

举例

假设你买了一台支持UPnP的智能音箱,接入Wi-Fi后:

  • **它通过SSDP广播:“我是一个音箱,支持播放音乐,描述文件在 **http://192.168.1.10/desc.xml”。
  • 你的手机(装有支持UPnP的App)听到广播,读取描述文件,发现可以控制音量和播放。
  • 你用手机点“播放”,音箱开始工作。
  • 如果手机不支持UPnP,你可能得用音箱自带的手动配置方式(比如输入IP地址)。

UpNP协议栈

image-20250317153029745

UPnP 的工作流程

  • 发现:SSDP广播 → 获取描述文件(HTTP + XML)。
  • 控制:发送SOAP请求(HTTP + XML)→ 设备执行命令。
  • 通知:设备通过GENA推送状态变化(HTTP)

端口

  • 标准端口:1900
  • 随机端口:1600-1900

常见漏洞点

SYN洪水攻击

假设我们已经通过一些方法(如在局域网广播等)获得了某些设备UPnP服务的eventSubURL,下面就可以向UPnP设备发起一项订阅服务,格式如下:

1
2
3
4
5
6
7
SUBSCRIBE eventSubURLHTTP/1.1

NT:upnp:enent

Callback: deliveryURL

Host: upnp设备:upnp服务端口

若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
2
3
4
5
6
SUBSCRIBE /web/cms_event HTTP/1.1
Host: 192.168.1.1 :52869
User-Agent: Callstranger Vulnerability Checker
CALLBACK: <http://192.168.1.105:8000>
NT: upnp:event
TIMEOUT: Second-300

返回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

[4]https://kb.cert.org/vuls/id/339275

[5]https://www.secrss.com/articles/23462