P2P 网络核心技术:UPnP 和 SSDP 协议

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P2P 网络核心技术:UPnP 和 SSDP 协议相关的知识,希望对你有一定的参考价值。

参考技术A

UPnP, Universal Plug and Play,中文是 “通用即插即用”。在理解 UPnP 之前,我们先了解一下传统的 PnP 技术,因为 UPnP 是对于传统 PnP(即插即用)概念的扩展。

传统的 PnP “即插即用” 是指 PC 电脑在添加硬件设备时可以自动处理的一种标准。在 PnP 技术出现以前,当需要为 PC 电脑安装新的硬件(比如:声卡,CD-ROM,打印机)时,这些设备需要用到 PC 电脑的 DMA 和 IRQ 等资源,为了避免硬件设备对计算机这些资源使用上的冲突,我们就需要 手工为新添加的硬件设备设置中断和 I/O 端口 (比如,想要为添加的声卡占用中断 5,就找一个小跳线在卡上标着中断 5的针脚上一插)。这样的操作需要用户了解中断和 I/O 端口的知识,并且能够自己分配中断地址而不发生冲突,对普通用户提出这样的要求是不切实际的。

PnP “即插即用”技术出现以后,可以 自动为新添加的硬件分配中断和 I/O 端口,用户无须再做手工跳线,也不必使用软件配置程序 。唯一的要求就是操作系统需要支持 PnP 标准,同时所安装的新硬件也符合 PnP 规范的。

现在我们讲 UPnP,在网络世界里, 当一个主机加入网络时,其行为模式跟我们上述的添加和删除设备是类似的。 尤其是在私有网络和公网交互的时候,私有网络中的主机使用的是内网 IP 地址,是无法被外网的主机直接访问的。必须借助 NAT 网关设备(本地路由器)把内网地址映射到网关的公网地址上。

简单来说就是, NAT 网关设备拥有一个公网 IP 地址(比如 10.59.116.19),内网中的主机(比如 192.168.1.101)想要与外界通信的话,NAT 网关设备可以为其做一个端口映射(比如:180.59.116.19 :80 —> 192.168.1.101 :80),这样,外部的主机发往 NAT 网关的数据包都会被转发给内网的该主机,从而实现了内网中的主机与外部主机的通信。

当内网中的主机想要被外界主机直接访问(比如开放 80 端口,对外提供 HTTP 服务),我们就需要在 NAT 设备中为当前主机手工配置端口映射,如果内网中有多台主机都想要被外界主机直接访问的话,我们必须在同一个 NAT 设备上为这些主机分别做端口映射,它们之间不能使用有冲突的端口。这个过程需要用户手工一一配置,显然给用户带来了很大的麻烦。

UPnP 技术标准的出现就是为了解决这个问题,只要 NAT 设备(路由器)支持 UPnP,并开启。那么,当我们的主机(或主机上的应用程序)向 NAT 设备发出端口映射请求的时候, NAT 设备就可以自动为主机分配端口并进行端口映射 。这样,我们的主机就能够像公网主机一样被网络中任何主机访问了。

UPnP 典型的应用场景就是家庭智能设备的互联,还有,目前在网络应用比如 BitTorrent, eMule,IPFS,Ethereum 等使用 P2P 技术的软件,UPnP 功能为它们带来极大的便利。比如:利用 UPnP 能自动的把它们侦听的端口号映射到公网地址上,这样,公网上的用户也能对当前的 NAT 内网主机直接发起连接。

必须同时满足三个条件:

以上三个条件必须同时满足,缺一不可。

注: 大多数路由器都是支持 UPnP 的,有的是默认开启,有的需要手工开启。

非也,如果我们的电脑并不需要 UPnP 所提供的功能,比如,我们的电脑并不想要对外直接提供服务,也不运行上述 P2P 软件,那么我们就无需开启 UPnP。因为一旦开启 UPnP,就意味着我们把自己的主机暴露在公网环境中,任何主机都可以向我们的电脑发起连接,NAT 设备会对所有收到的数据包不进行任何 authentication 认证而转发给我们的主机,这样,路由防火墙就会完全失效,我们的主机就很容易受到恶意的网络窥探,感染病毒或者恶意程序的几率也大大增加。

注: 上述 NAT 设备通常就是指我们本地的路由器。

介绍完了 UPnP 的概况,为了完整性,现在再介绍一下 UPnP 规范下的 SSDP 协议,SSDP 全称是 Simple Service Discover Protocol 简单服务发现协议,这个协议是 UPnP 的核心,在 UPnP 中定义了一组协议框架,其中有控制点,根设备等概念,UPnP 设备通过 SSDP 协议与根设备(用户设备)进行交互。SSDP 是应用层协议,使用 HTTPU 和 HTTPMU 规范,基于 UDP 端口进行通信。

SSDP 使用一个固定的组播地址 239.255.255.250 和 UDP 端口号 1900 来监听其他设备的请求。

SSDP 协议的请求消息有两种类型,第一种是服务通知,设备和服务使用此类通知消息声明自己存在;第二种是查询请求,协议客户端用此请求查询某种类型的设备和服务。

当一个客户端接入网络的时候,它可以向一个特定的多播地址的 SSDP 端口使用 M-SEARCH 方法发送 “ssdp:discover” 消息。当设备监听到这个保留的多播地址上由控制点发送的消息的时候,设备将通过单播的方式直接响应控制点的请求。

典型的设备查询请求消息格式:

响应消息应该包含服务的位置信息(Location 或AL头),ST和USN头。响应消息应该包含cache控制信息(max-age 或者 Expires头)。

在设备加入网络时,它应当向一个特定的多播地址的 SSDP 端口使用 NOTIFY 方法发送 “ssdp:alive” 消息,以便宣布自己的存在,更新期限信息,更新位置信息。

由于 UDP 协议是不可信的,设备应该定期发送它的公告消息。在设备加入网络时,它必须用 NOTIFY 方法发送一个多播传送请求。NOTIFY 方法发送的请求没有回应消息。

典型的设备通知消息格式如下:

当一个设备计划从网络上卸载的时候,它也应当向一个特定的多播地址的 SSDP 端口使用 NOTIFY 方法发送 “ssdp:byebye” 消息。但是,即使没有发送 “ssdp:byebye” 消息,控制点也会根据 “ssdp:alive” 消息指定的超时值,将超时并且没有再次收到的 “ssdp:alive” 消息对应的设备认为是失效的设备。

典型的设备卸载消息格式如下:

全文完!

参考资料:
1、SSDP 协议原文: http://tools.ietf.org/html/draft-cai-ssdp-v1-03
2、UPnP协议框架: http://www.upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v1.0.pdf

ssdp安全-攻击和防御

ssdp 概念

ssdp 组播搜索
upnp协议和dlna源码理解与修改
ssdp与组播一
ssdp与组播二

    简单服务发现协议(SSDP,Simple Service Discovery Protocol)是一种应用层协议,是构成通用即插即用(UPnP)技术的核心协议之一。ssdp搜索是一种udp组播协议,在网络中发射协议内容后,所有设备按照协议会返回内容,包括我们常用的几种设备为方便都会使用ssdp协议,如

  1. 摄像头
  2. 打印机
  3. 大屏幕
  4. 网关

    这几种设备中最容易得到攻击的是大屏幕和打印机。例如《钢铁侠》电影中控制屏幕的协议,使用一个掌控设备就可以控制大屏,打印机也一样,会按照你的命令打印。对于摄像头也是很危险的,一旦摄像头或者NVR开启UPNP,路由器开启UPNP,我们就可以讲摄像头的图像向外网传递,这个安全性真的是很必要的。
在这里插入图片描述

ssdp攻击
    在正常情况下,用户使用SSDP 协议来让 UPnP 设备向网络上的其他设备广播,确切说是组播其存在。由于是特定的地址都会得到该地址和端口,例如,当 UPnP 大屏连接到典型网络时,在它从dhcp服务器得到 IP 地址之后,大屏通过将消息发送到称为多播地址的特殊 IP 地址 239.255.255.250,端口号为1900,以向网络上的计算机通告其服务。然后,多播地址将新打印机的存在告知网络上的所有计算机。一旦控制点收到有关屏幕的发现消息,它就可以向打印机发出请求,要求打印机完整描述其服务。然后,打印机将发出其提供的所有内容的完整列表来返回控制点机。这样说,有两种攻击,
1 SSDP 攻击通过要求设备响应目标受害者来进行DDOS。
2 擅自攻击控制

ddos

    对于1下面是典型的 SSDP DDoS 攻击的 6 个步骤:
1 攻击者进行扫描,寻找可以用作放大因子的即插即用设备。
2 攻击者发现联网设备后,创建所有发出响应的设备的列表。
3 攻击者使用目标受害者的欺骗性 IP 地址创建 UDP 数据包。
4 然后,攻击者使用僵尸网络通过设置某些标志(比如 ssdp:rootdevice 或 ssdp:all),向每个即插即用设备发送一个欺骗性发现数据包,并请求尽可能多的数据。
结果,每个设备都会向目标受害者发送回复,其数据量最多达到攻击者请求的 很多 倍。然后,目标从所有设备接收大量流量,因此不堪重负,可能导致对正常流量DDOS拒绝服务。

攻击控制

    控制者作为控制点dmc不断发送控制命令,使得其他人无法控制upnp设备,或干扰其设备,发送自己想要的内容,攻击者使用伪造的IP和MAC地址,使得统计无法实现,抓包得到的IP地址是假的,但是有一点是逃不了的,就是dms的地址,如果查出一个内容地址,至少能得到攻击者的意图。dms就是内容server,下面我们使用抓包来查看地址,upnp协议使用http协议发送控制信息,糟糕的是http协议是可以怎么样?

const char * post_set = "POST /AVTransport/control HTTP/1.1\\r\\n"
"User-Agent: qbupnp/0.1\\r\\n"
"Accept : */*\\r\\n"
"Content-Type: text/xml; charset=\\"utf-8\\"\\r\\n"
"HOST: %s:%d\\r\\n"
"Content-Length: %d\\r\\n"
"SOAPACTION: \\"urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI\\"\\r\\n"
"Connection: close\\r\\n\\r\\n";
"<?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:SetAVTransportURI xmlns:u=\\"urn:schemas-upnp-org:service:AVTransport:1\\">"
"<InstanceID>0</InstanceID><CurrentURIMetaData></CurrentURIMetaData><CurrentURI>http://abc.com/a.mp4</CurrentURI>"
"</u:SetAVTransportURI>"
"</s:Body>"
"</s:Envelope>";

soap协议
危险:
1 http协议明文发送
2 http协议使用tcp协议,三次握手如果打断,是可以使用双边断协议并且发送http 302重定向,使得协议重定向到我们想要的地址上,着就是危险的第2个地方,我们使用旁路打断tcp三次握手,重定向http mov 302 ,完全可以让用户的播放地址变成我们想要的地址,可怕吗?

如何防护 SSDP 攻击

对于网络管理员,一个关键的防护措施是在防火墙的 1900 端口阻止传入 UDP 流量。如果流量不足以使网络基础设施不堪重负,则从此端口筛选流量可能能够防护这种攻击。要深入了解 SSDP 攻击和更多缓解策略,请探索有关 SSDP 攻击的技术详情。
    1 经过关键网络的地方创建设备,如一个树莓派,过滤UDP组播流量,使用特征和模式来判断攻击行为,
    2 使用旁路嗅探的方式,如果要阻断服务,就必须得到网络中发包的地点,没有自己的设备情况下,使用联动防火墙方式来阻断。

其他基础文章

ssdp 组播搜索

upnp协议和dlna源码理解与修改

以上是关于P2P 网络核心技术:UPnP 和 SSDP 协议的主要内容,如果未能解决你的问题,请参考以下文章

UpnP Hacking

实现upnp ssdp来查找局域网内的其他节点

Android UPnP/DLNA 应用以及cling 2.1.1依赖库

1900端口问题

为啥在 SSDP 中需要 NOTIFY?

当我们有 UPnP 时为啥要拨号(发现和启动)?