海康威视远程系统XXE漏洞分析:一次意外的发现
海康威视在视频处理与视频分析技术领域深耕多年,为全球提供领先的监控产品与解决方案。然而,物联网的发展常常伴随着安全威胁。两个月前,我原本计划研究网络摄像机,在亚马逊上购买了一台由海康威视代工的Elisa Live 720p HD IP Camera。在尝试破解并获取密码的过程中,意外发现了海康威视远程系统的一个XML外部实体注入(XXE)漏洞。
XXE Injection,即XML外部实体注入攻击,其根本原因在于对非安全的外部实体数据处理不当。在XML 1.0标准中,实体(entity)这一概念允许文档通过预定义标识符访问本地或远程内容。一旦引入恶意源,处理XML文档后便可能导致信息泄露等安全隐患。
1 研究开始
大多数网络摄像机需要将数据上传至后台系统,用户只能通过网页或App经由云服务平台访问。我将摄像机通过以太网接口连接到实验室环境,进行网络流量监听。这里需要特别提醒:由于部分设备内置了老旧或不安全的固件,进行物联网设备相关实验时,最好不要急于将设备接入互联网。
从Wireshark抓取的数据包中,发现了几个值得关注的流量:
(1) 两个未加密的请求调用:

(2) 向网站www.hik-online.com发起POST请求的base64加密数据包(后文分析)
(3) 从Amazon S3存储下载更新的Get请求:

2 尝试破解网络摄像机
使用Nmap扫描摄像机,发现了一些开放的端口服务,其中包括一个登录页面。尝试了海康威视常用的默认用户名和密码组合,均无法登录。后来发现,密码验证的控制器受HTTP摘要认证机制保护——这是该固件的特有之处。通过binwalk和hiktools分析固件,虽然没有找到任何摘要认证信息,但成功提取到了/etc/passwd文件和root密码hiklinux:
root:ToCOv8qxP13qs:0:0:root:/root/:/bin/sh

对固件进行升级后,摄像机的SSH端口关闭了,这条路无法继续,只能尝试其他途径。
3 发现XXE漏洞
回到那个向www.hik-online.com发起请求的数据包,它是一个Base64编码的POST字符串。解码后得到的是一堆乱码——摄像机用于验证服务器的密码很可能就存储在固件中,需要花费时间分析。不过,无意中在海康威视网站上发现了一个漏洞悬赏项目:
“如果发现任何漏洞,请联系HSRC@hikvision.com,请勿对外公开漏洞细节。”
好吧,那就来研究一下这个POST请求。由于这是一个XML POST请求,首先尝试使用SYSTEM entity方式让远程网站引用本地实体文件,例如:
但此方法未能奏效。于是,改用VPS远程传入引用实体,这次成功了!


图:成功加载外部实体
既然能够通过SYSTEM entity加载外部实体,就可以借助恶意DTD文件调用回传其他网站文件,例如/etc/hosts。整个过程可以使用自动化工具XXEinjector完成:

这样一来,便可以远程读取网站上的任意文件,包括/etc/shadow,自然也就获得了服务器的root权限。更严重的是,海康威视分布在全球的其他API服务器同样存在这个XXE漏洞。一旦这些远程服务器被攻破,连Shodan上可搜索到的大量网络摄像机都将面临严重的安全风险。
漏洞报告提交流程
2016年8月6日,向海康威视安全响应中心(HSRC)发送了第一封邮件。
2016年8月16日,HSRC未给予回应,随后又发送了一封邮件。
2016年9月6日,重新向海康威视市场和公关部门发送了一封邮件。
2016年9月7日,HSRC确认接收漏洞,并要求提供更多信息。
2016年9月8日,海康威视修复了漏洞,并要求重新测试。
2016年9月25日,作为奖励,收到一个价值69美元的网络摄像机。
