# 海康萤石智能门锁的网关分析（1）

## **简介**

在本篇和接下来的篇章中分析海康萤石品牌的智能门锁。通过google和github等可以找到很多分析记录和分析工具。萤石是海康威视的一个子品牌，相比于海康威视，萤石的绝大部分产品侧重于家用领域，本文将要分析的智能门锁和网关也是萤石的产品。在本专题的前几篇文章中，我们都在分析门锁和相关的app，这篇我们打算对门锁配套的网关进行一些分析。刚刚看了看萤石的网上商城，最新的联网门锁已经没有外置网关了，我们在2019年分析的智能门锁还是有外置网关的款式，图片如下：

![图1-1 海康萤石智能门锁网关](https://3519990514-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mc9RUlvJLCDxdpf1zh2%2F-MdGutheg7c_2pW98JFc%2F-MdGuvL_Z9JCJxdk8LH0%2Fimage.png?alt=media\&token=e2f3212b-a4d4-4dc5-bb21-f210dcfe8cb1)

门锁和网关在拿到手之后，就已经是配对状态，我们不需要进行额外的配对操作。海康萤石智能门锁有一个配套使用的app，该app对服务端有证书校验，所以直接抓包是行不通的，由于我们这里是网关分析，所以就不讨论app的工作了，在本专题的后续文章中，还会遇到类似的问题，到那时我们在解决app的事。

## **网关分析**

### 2.1 通信分析

按照正常思路，肯定是先抓包看一下网关与服务器的通信内容，参考我们在本专题第6篇中的部署方法，通过交换机端口监控的方法抓取海康萤石网关的通信内容，如下图：

![图2-1 海康萤石网关通信内容](https://3519990514-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mc9RUlvJLCDxdpf1zh2%2F-MdGutheg7c_2pW98JFc%2F-MdGuyml4CQGFKF0__M8%2Fimage.png?alt=media\&token=9a8c4f84-eea5-401b-83fa-1562d02ef011)

通过上图中的通信内容，我们大体上可以分析出一些内容：&#x20;

A. 网关上电之后，与litedev.ys7.com进行通信。&#x20;

B. 与litedev.ys7.com通信中，获取了另一个ip，即101.71.30.172。此后，终止了与litedev.ys7.com通信，并一直保持与101.71.30.172的tcp连接。&#x20;

C. 通信内容看起来是加密的，通信内容中没有很多直接可见的明文。 既然如此，那么就要看看海康萤石网关里面的程序了，研究研究网关固件是如何处理这些通信数据的。&#x20;

### 2.2 电路分析&#x20;

首先我们需要获取海康萤石网关的固件，这次并没有像之前的果加智能门锁那样顺利：萤石配套的app不能获取固件的下载地址，在海康和萤石的官网仔细翻找，同样没有查到固件的下载地址。那我们只好直接提取Flash中的数据了。首先拆开门锁网关，看看里面用了什么芯片，留了什么接口，截图如下：

![图2-2 海康萤石门锁网关电路板](https://3519990514-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mc9RUlvJLCDxdpf1zh2%2F-MdGutheg7c_2pW98JFc%2F-MdGv65Aw7nd0ErPpwNJ%2Fimage.png?alt=media\&token=9618c71f-aeaf-4110-bce1-95a2f81fb501)

上图中，最明显的就是中间的MCU，仔细观察可以确认品牌和型号为MEDIATEK MT7688AN，联发科的芯片，先下载一份芯片手册看一看，下载地址是：[http://labs.mediatek.com/zh-cn/chipset/MT7688。](http://labs.mediatek.com/zh-cn/chipset/MT7688%E3%80%82) 通过阅读芯片手册，可以找到关于Flash的部分内容：

![图2-3 MT7688AN芯片的特点](https://3519990514-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mc9RUlvJLCDxdpf1zh2%2F-MdGutheg7c_2pW98JFc%2F-MdGv9nES_ZdszvDOSNP%2Fimage.png?alt=media\&token=6b16b304-165f-4d57-aca9-270c0d34b5c7)

上图可以看到该芯片并没有内置Flash，而是使用SPI通信的外置Flash。那么，就继续看看电路板上的其他芯片。&#x20;

在图2-2中，MCU的上方是Winbond W9751G6KB芯片，该芯片是DDR2 SDRAM存储器，简单说就是断电丢数据的内存，固件程序不可能在里面。在MCU的下方有两个芯片，分别是PCM5100A和GD25Q127CSIG芯片， PCM5100A是个音频立体声DAC芯片，而GD25Q127CSIG芯片则是128M-bit的Flash芯片，我们要提取的固件文件应该就是在此Flash中。&#x20;

要读取Flash芯片，一个简单的方法是直接用烧录夹提取，其优点是不用将芯片焊下来。不巧的是，烧录夹有点粗，海康萤石的门锁网关设计的很紧凑，我们的夹子夹不上去。如此一来，只好将芯片取下来，用热风枪和镊子就可以把Flash吹下来了，如下图所示：

![图2-4 热风枪吹取Flash芯片](https://3519990514-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mc9RUlvJLCDxdpf1zh2%2F-MdH4xg1ip5JZXBQtOt0%2F-MdH5-h6WsbrMWXovM9m%2Fimage.png?alt=media\&token=f6c155d0-186b-4fb7-aeed-ac3ee2dc1a36)

如果没有热风枪，用电烙铁也是可以的，注意手别抖就好。然后将摘下来的芯片放在编程器上，如下图：

![图2-5 将Flash芯片放置于编程器上](https://3519990514-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mc9RUlvJLCDxdpf1zh2%2F-MdH4xg1ip5JZXBQtOt0%2F-MdH5CylQfbFUXSP1-Fa%2Fimage.png?alt=media\&token=3a305c58-4342-48ef-8c3d-b0cd80ff1de4)

然后使用编程器的配套软件，通常情况下软件是可以自动识别出Flash品牌和型号的，但有时也需要我们手动选择。在GD官网查到该Flash的详细参数，网址如下：<https://www.gigadevice.com/zh-hans/flash-memory/gd25q127c/，截图如下：>

![图2-6 GD25Q127CSIG详细属性](https://3519990514-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mc9RUlvJLCDxdpf1zh2%2F-MdH4xg1ip5JZXBQtOt0%2F-MdH5NoVXEYNWxkfDpha%2Fimage.png?alt=media\&token=e57526b6-b02e-4c42-b3ce-b3165f48d9ac)

上图中，可以看到Flash大小为128Mb，即16MB，完成Flash芯片的配置工作之后，就可以读出Flash内容了，如下图所示：

![图2-7 使用编程器提取固件](https://3519990514-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mc9RUlvJLCDxdpf1zh2%2F-MdH4xg1ip5JZXBQtOt0%2F-MdH5QQPl3K6154DitQA%2Fimage.png?alt=media\&token=ac3e23c5-7468-4345-bded-1a8a554c7ad5)

读出完毕之后，即可将读出的数据保存为一个文件，我们将其命名为OriginFirmware.bin文件。由于我们买的编程器是很便宜的那种，提取时有时会出现一些错误，可以多提取几次。获得固件之后，就可以开始分析固件内容了。&#x20;

### 2.3 固件内容分析

在本专题的第6篇中，我们就展示过binwalk这款用于固件分析的工具。这里，我们直接用-Me参数提取固件内容，其中M参数表示递归提取：

![图2-8 binwalk提取固件内容](https://3519990514-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mc9RUlvJLCDxdpf1zh2%2F-MdH4xg1ip5JZXBQtOt0%2F-MdH5Vikfb0oCPVyzxpu%2Fimage.png?alt=media\&token=295a0203-11ba-4588-b40f-c9af1d9972e2)

根据binwalk的分析结果，我们可以判断固件应该包含一个嵌入式Linux操作系统，智能网关的主要功能逻辑应该由某个Linux可执行程序完成。待binwalk运行完毕之后，会生成几个文件夹，分别是2个squashfs文件系统，2个LZMA压缩的数据，以及1个jffs2文件系统，如下图所示：

![图2-9 海康萤石网关提取内容](https://3519990514-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mc9RUlvJLCDxdpf1zh2%2F-MdH4xg1ip5JZXBQtOt0%2F-MdH5grFJ2giIfmtdBoW%2Fimage.png?alt=media\&token=a01e9075-4ae0-4ad0-bdc9-f18797dbe4e2)

上图中，前2个文件夹即2个LZMA压缩的数据，解压之后会发现是cpio文件系统，binwalk会自动帮我们递归全部提取。&#x20;

逐个浏览这些文件系统中的内容，可以得出结论如下：&#x20;

A. jffs2文件系统保存着门锁和网关的相关信息，如id等；&#x20;

B. 两个cpio文件系统中，其中一个应该是恢复出厂设置时的备份文件系统，另一个是当前正在使用的文件系统；&#x20;

C. 两个squashfs文件系统中，一个保存的全部都是mp3文件，另一个保存着网关的主程序，该程序即为我们将要分析的主程序。 到此，我们已经将完整的固件提取出来，至于逆向分析的工作就先放一放，将目光重新聚焦于电路板上。&#x20;

### 2.4 UART接口分析&#x20;

UART接口是IoT设备中最常用的通信接口，一般MCU都会提供UART引脚。在MT7688AN的芯片手册中，我们可以看到该芯片UART0接口和UART1接口。其中UART0接口在30和31引脚，如下图：

![图2-10 MT7688AN芯片UART0引脚位置](https://3519990514-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mc9RUlvJLCDxdpf1zh2%2F-MdH4xg1ip5JZXBQtOt0%2F-MdH5pcWTLvCRZ2NF_VH%2Fimage.png?alt=media\&token=5606239e-6870-486c-945f-44468ca577d4)

上图中，我们仅展示了UART0的位置，UART1可以自行查询芯片手册。如果海康萤石的网关没有屏蔽对UART的输入和输出，那么通过这些UART也许可以实现一些操作。为此，先要确定这些UART引脚是否被引出。在图2-2中，左侧我们可以看到一个软排线接口。海康萤石设计的电路板确实很紧凑，其他厂家的门锁或者网关一般用1.27mm或者2.54mm间距的排针，海康萤石的板子用的是0.5mm间距的软排线，如下图：

![图2-11 海康萤石网关软排线接口](https://3519990514-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mc9RUlvJLCDxdpf1zh2%2F-MdH4xg1ip5JZXBQtOt0%2F-MdH5uBDRpvHwsp-wygL%2Fimage.png?alt=media\&token=c8ea3352-7c38-4a9f-b853-7bb1d9301afc)

通过万用表即可测量引脚与此软排线接口的连通情况，使用万用表的二极管档，然后一个测试笔触碰UART\_TXD0引脚，另一测试笔在软排线上滑动，听到万用表蜂鸣声时，即发现了接通的线路，如下图所示：

![图2-12 海康萤石网关软排线接口](https://3519990514-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mc9RUlvJLCDxdpf1zh2%2F-MdH4xg1ip5JZXBQtOt0%2F-MdH6TrNEByVM5tOQ1d3%2Fimage.png?alt=media\&token=96dd6523-4533-4582-ab64-caecb590f35d)

借由万用表的帮助，我们找到了与UART引脚连通在软排线接口。那么，可以想办法接上这个软排线，看一看固件在启动之后，UART口是否存在输出内容，不过这就留到下一篇中再详细讨论吧。

## **小结**

本篇是我们开始分析海康萤石门锁网关的第一篇。在本篇中，我们使用热风枪将网关的Flash芯片吹了下来，然后通过编程器提取出了Flash中的内容，最后通过binwalk工具提取出了固件内容。接下来我们又研究了一下电路板上的软排线接口和MCU的UART串口，在本专题的后续文章中，会继续研究UART串口以及其他的固件分析内容，希望大家有所收获。对了，吹下来的Flash不要扔，记得要吹回去啊。
