智能插座实现了远程开启/关闭连入的设备,的确是一款懒人神器!其实现原理就是通过WiFi模块实现对继电器的开启或者关闭。EDUP智能插座通过用户提供的凭证连接家庭无线网络访问互联网。一切都设置完成之后,智能插座打开TCP/IP连接到位于中国的服务器(219.147.29.235:221)。
首先,我们准备了一些小螺丝刀和一把瑞士军刀,接着我们小心的打开智能插座,拆开图如下:
通过谷歌搜索我们了解到设备的主件:一些被动组件,一个5Mhz的晶体振荡器,一块没有打上印记的芯片(个人猜测为PIC16C770),一个2K数据存储器、继电器、WiFi板……
虽然我个人对于集成电路逆向工程的相关知识不够了解,但是我们所做的工作并非白做。至少我们对于这款智能插座设备更加了解,每一个细节都有助于我们全面的了解这个系统。
我们利用hostapd程序进行一些测试。为了阻止设备进入内部网络,我们添加了一些防火墙规则,并且在设备内存中设置访问凭证。
启动运行之后,我们可以通过EDUP提供的安卓App切换继电器,通过Nmap我们看到有两个开放的端口:TCP/23 (telnet) 和 TCP/80 (http)。
我们尝试连接telnet,这里有一个简单提示输入密码。我们谷歌搜索“AT + command Shell”,我们发现WiFi模块实际上是一块低成本的WIFI UART,编号为 TLG10UA03。然后我们通过默认的密码成功访问AT命令终端,并且我们还发现了一份技术文档,包括了我们在后面会有使用的AT命令清单。 链接: http://pan.baidu.com/s/1eQ6ezSI 密码:rbqn
如果你对这个点足够好奇,你可以使用一些AT命令来熟悉这个命令终端。
这里暴露了大量智能插座信息:
下面,我们将对设备如何进行工作以及其组成元素进行讨论。我们可以捕获网络访问点接口流量,并分析服务器和设备之间的数据传递。
协议很简单,大致如下:
一旦TCP信息交换完成,服务器会Push一个携带15字节有效载荷的TCP段并激活URG flags。
用户确认第一段之后,发送另外两个分别为28字节和22字节的数据包,同时PSH和URG也被激活。
此时此刻,已经成功建立连接,并且用户通过发送所谓的Keep-Alive包进行响应。
正如前面所述,客户发送这类段来提醒服务器设备依旧存活着。如果我们断开连接,或者设备休息的时候。每隔30秒就会发送一个Keep Alive包,且每个包中载荷都相同,这样服务器就承认其状态。如果没有,客户端就会被假定是失去联系,并尝试重新开始一个会话。
建立会话后,服务端确认客户端保持连接,然后服务端就可以发送命令给客户端,执行中继器的激活或者停止。
经过把玩一段时间,我了解到:
1、前两个字节(0xFF, 0xFF)可能为某种开始标记或者头,每个数据段都是由这两个字节作为开头。
2、接下来的这个字节(0×00)表明了协议版本
3、第四个字节(0×15)表明了有效载荷的长度。如图, 0×15 = 21,也就是总字节数
4、对于后面6个字节的含义我不太清楚,我猜测可能是编码的时间戳,或者是一个校验和
5、接下来的两个字节总是 0×09, 0×00。同样我也没搞明白是什么含义。
6、再后面的6个字节是客户端的MAC地址
7、接着后面两个字节固定为0×02, 0×80
8、最后一个自己似乎是命令本身:0×80代表ON命令,0×00代表Off命令。
*参考来源 n0wblog ,译者/鸢尾 转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)