LV02-01-天猫精灵IOT-07-SmartConfig-02-SmartConfig抓包分析

本文主要是天猫精灵IOT Smart config—— SmartConfig抓包分析相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
Windows版本 windows11
Ubuntu版本 Ubuntu22.04的64位版本
VMware® Workstation 16 Pro 16.2.3 build-19376536
终端软件 MobaXterm(Professional Edition v23.0 Build 5042 (license))
点击查看本文参考资料
分类 网址 说明
官方网站 阿里云 阿里云官网主页
阿里生活物联平台 生活物联网平台(飞燕平台)主页
AliGenie 天猫精灵开放平台AliGenie主页
阿里物联网平台 阿里物联网平台主页
Bluetooth 技术网站 蓝牙协议规范什么的可以来这里找
Telink Telink | Chips for a Smarter IoT (telink-semi.com)
Telink中文官网
开发手册 AliOS Things开发指南 AliOS Things开发指南,这里是最新版本,可以直接从官网找到
AliOS Things开发指南 AliOS Things应用开发指南,这里应该是3.3版本的完整开发文档
AliOS Things开发指南(3.0) AliOS Things应用开发指南,这里应该是3.0版本的完整开发文档
生活物联网平台开发文档 生活物联网平台(飞燕平台)开发文档
《设备端开发指南》
Wi-Fi IoT品类定义与功能开发 天猫精灵IoT开放平台——Wi-Fi IoT品类定义与功能开发
硬件平台 mk3080 WiFi开发板 WiFi开发板使用指南-阿里云开发者社区
esp8266开发板 一个教程:ESP8266-NodeMCU开发板详解-太极创客 (taichi-maker.com)
TLSR8258 Datasheet Datasheet for Telink BLE + IEEE802.15.4 MultiStandard Wireless SoC TLSR8258
参考资料 AliOS Things 3.0 应用开发指南 这个只是一篇参考文章,里面是一些环境搭建相关的,可以参考
IP知识百科 - 华为 (huawei.com) IP的一些相关知识点
点击查看相关文件下载
分类 网址 说明
蓝牙规范相关文档 Core Specification 5.2 核心规格 5.2,该规范定义了创建可互操作的Bluetooth 设备所需的技术。
《Core_v5.2.pdf》
Mesh Model(v1.1) 本Bluetooth 规范定义了模型(以及它们所需的状态和消息),这些模型用于在mesh 网络中的节点上执行基本功能,超出了Bluetooth Mesh 配置文件 规范中定义的基础模型。
本规范包括定义跨设备类型标准功能的通用模型,以及支持关键mesh 场景的模型,如照明控制、传感器、时间和场景。
《MshMDL_v1.1.pdf》
Mesh Profile(v1.0.1) 该Bluetooth 规范定义了基本要求,以实现可互操作的mesh 网络解决方案,用于Bluetooth 低能量无线技术。
《MshPRFv1.0.1.pdf》
Mesh Device Properties 本规范包含Bluetooth Mesh 配置文件 和Bluetooth Mesh 模型规范所要求的设备属性的定义。
但是跟之前的有些区别,我主要看的之前的版本:《MMeshDeviceProperties_v1.2.pdf》
GATT Specification Supplement GATT Specification Supplement | Bluetooth® Technology Website。
好像可以在线看:《GATT Specification Supplement》
Assigned Numbers GATT的一些类型定义可以在这里找。
AliOS Things alios-things/AliOS-Things Gitee上的AliOSThings SDK源码仓库
alibaba/AliOS-Things GitHub上的AliOSThings SDK源码仓库
天猫精灵蓝牙Mesh协议栈 alibaba-archive/genie-bt-mesh-stack GitHub上的天猫精灵蓝牙Mesh协议栈源码仓库。
之前是在alibaba/genie-bt-mesh-stack这个仓库。
写笔记的时候最新提交为faf523618a6a2560090fc423222b9db80984bb7a
蓝牙Mesh设备开发指南 阿里云生活服务平台开发手册——蓝牙设备开发一节中的内容

为了有一个更加清晰的认识,我们这一节抓包分析一下。

一、WiFi不配置密码

我们先看一下WiFi不带密码的话,配网过程是怎样的,因为路由器不设置WiFi密码的话,传输过程中的数据包都是明文传输,我们都是可以通过抓包软件抓取并看到内容的。

1. 路由器配置

我们进入路由器的配置页面(一个IP地址),一般路由器机身或者说明书上都有:

image-20231219121752582

我们输入路由器的用户名和密码,就会进入路由器管理界面,我们打开无线设置:

image-20231219122208782

我们配置路由器的信道为6,无线名称(SSID)为dlink,由于路由器比较老,所以只支持802.11g。不配置加密,所以passwd就没有,长度就是0。

2. OmniPeek设置

2.1 channel配置

image-20231219122409555

我们这里只抓6信道就可以了,因为前面路由器已经配置了信道为6。

2.2 过滤器

我们要抓到自己需要的Smart Config报文,我们需要配置一下过滤器,怎么设置过滤器?我们要根据smart config报文的特点来抓。

  • 首先,报文是手机发送到路由器的,所以我们需要我们查一下手机的mac地址。手机的mac地址在手机的设置里面应该都有。

  • 然后我们知道手机发送的smart config报文数据是一个广播报文,它使用的是255.255.255.255广播地址,在下面,也会有mac广播地址,mac的广播地址为 FF:FF:FF:FF:FF:FF 。

  • smart config的数据报文是802.11的数据报文,所以过滤器的协议就可以选择802.11Data类型:

image-20231219123304844

综上所述,过滤器参数如下所示:

image-20231219123400149

然后我们使用这个过滤器,开始抓包即可。

3. 手机操作

首先,手机要接入WiFi,然后我们打开手机的天猫精灵,扫描我们物联网设备的配网二维码(产品管理 - 生活物联网平台 (aliyun.com)):

image-20231219123550964

然后OmniPeek中应该就会抓到手机和路由器之间的smart config相关的包了:

image-20231219123941127

像这种IP地址是255.255.255.255的包才是我们的smart config配网报文。

4. 数据包分析

我们准备一个表格来记录每次收到的数据:

image-20231219221635784

4.1 起始帧:1314

我们前面知道配网过程中的WiFi报文起始帧的Length=0x4E0=1248,这也就意味着,我们起始帧的总长度为1248字节,我们上面抓到的包似乎没有长度为1248的,我们知道WiFi报文发出去的时候肯定是不可能只有起始帧的,还要经过其他的一些封装过程,会增加以下头部之类的。我们点开那个最长的1314的看一下:

image-20231219124834992

我们会发现,报文里面有一个Application Layer,里面的数据长度刚好就是1248字节,所以这个就是我们的起始帧啦。在抓包过程中,数据包可能会抓到多次,数据包也可能没抓到,当不符合我们前面学习的规则的时候,就继续往后找就可以了。

4.2 数据帧:333

我们来看一下下面的这个长度为333的报文:

image-20231219125348899

可以看到这个数据长度为267字节,十六进制就是0x10B,比对数据帧的Index取值,那么Index=0x100,Value = 0x10B-0x100 = B。

image-20231219221726938

4.3 数据帧:465

image-20231219125930807

可以看到这个数据长度为399字节,十六进制就是0x18F,比对数据帧的Index取值,那么Index=0x180,Value = 0x18F-0x180 = F。

image-20231219221758836

4.4 数据帧:583

我们先看这个583的:

image-20231219130314255

可以看到这个数据长度为517字节,十六进制就是0x205,比对数据帧的Index取值,那么Index=0x200,Value = 0x205-0x200 = 5。可以看到这个对应的SSID名字,我们的WiFi名称为dlink,刚好就是5.

image-20231219221830583

4.5 数据帧:706

我们先看一下这个902数据包:

image-20231219130557461

可以看到这个数据长度为836字节,十六进制就是0x344,比对数据帧的Index取值,0x344-0x280的值已经超出了一个字节长度。下一个应该是0x280附近的才对,这里直接0x344,说明他的Index应该是0x300。这就说明中间我们可能少抓了一个包,那么我们就继续往下翻,找找看:

image-20231219131058393

可以看到这个数据长度为640字节,十六进制就是0x280,比对数据帧的Index取值,那么Index=0x280,Value = 0x280-0x280 = 0。可以看到这里表示的事Passwd Len字段,也就是密码的长度,我们得出为0,之前我们的路由器是不加密的,没有密码,所以这里也就对上了。

image-20231219221917411

4.6 数据帧:902

image-20231219131438036

可以看到这个数据长度为836字节,十六进制就是0x344,比对数据帧的Index取值,那么Index=0x300,Value = 0x344-0x300 = 44。

image-20231219222123867

这里其实是有问题的,我们看一下这个44,十进制是68,这里的Token Len长度为68字节嘛?我们看后面的Token,实际规定是8字节,68显然,这里的68并非指Token Len,其实前面学习数据结构的时候有一张图,上面其实也是没有这个Token Len的,具体为什么,暂时我也不知道,后面再补充吧。貌似是因为这个Flag字段的值,没有找到Flag字段的值的含义,这里先这样吧。

这个68不是Token Len的话,它是啥?我们继续往后看,假设它是SSID,那么根据规则,这个值需要加上32,那么就是100,我们看一下ASCII码表,100就表示字母d,我们WiFi的首字母刚好就是d,所以是这样对应的:

image-20231219222803843

4.7 数据帧:1038

再往下是这个581:

image-20231219223039760

对应的Length=517,其实跟前面重复了,接下来是704,但是其实一看就知道它是不对的,因为上面我们的索引是往下发,越来越大的,这个比上面的902还小,肯定是有问题的:

image-20231219223338720

可以看到,它的Length=640,跟前面还是重复了,接卸下来我们来看这个1038的:

image-20231219223503649

以看到这个数据长度为972字节,十六进制就是0x3CC,比对数据帧的Index取值,那么Index=0x380,Value = 0x3CC-0x380 = 0x4C=76。我们把这个76加上32,得到了108,它对应ASCII码的小写字母l,所以有:

image-20231219223952467

4.8 总结

前面分析到1038的包,我们大概就知道SSID是怎么得来的了。我们在寻找包的时候,由于索引是不断增大的,所以我们找的数据理论上也是不断增大才对,另外就是当索引达到0x480的时候会重新从0x100开始,这点需要注意,数据包其实都是有顺序的,我们抓的包可能有重复,也可能有丢包,我们发现异常的时候继续往后找就可以了。

需要注意的是,这里我们的WiFi是没有密码的,所以我们可以看到所有信息,那加密过的呢?我快慢看不到怎么办?我们后面就来尝试抓一下加密的WiFi在smart config配网过程中的包吧。

二、WiFi配置密码

1. 路由器设置

image-20231219225250321

还是和之前一样的配置方式,这里选择加密,并且配置好WiFi的密码。

2. OmniPeek设置

channel和过滤器与上面的配置一样,然后开始抓包即可。

3. 手机操作

与上面操作流程一样。

4. 数据包分析

这一次抓到的报文,全部都是加密数据了,这里只有mac地址,IP地址都不见了。

image-20231219225821054

这一次,我们其实什么有用的信息都看不到,那么怎么计算Length字段?我们根据前面的经验,我们的起始帧的Length长度为0x4E0,也就是1248。我们看前面呢么多的1334,我们猜测它是起始帧,我们用这个值减去1248,得到86,大概就可以得到前面一大堆的头部就是86字节,我们后面就直接计算差值来获取Length就可以啦。其实我们学过TCP/IP协议,WiFi协议的话,理论上来说,我们应该是可以根据每一层封装来计算头部长度的,但是,水平不到,这里直接减法,等于是拿着结果推起因,能理解这个过程就可以啦。

4.1 数据帧:362

image-20231219230719632

我们找一个短一些的,这里有个362,我们用362减去86,得到276,十六进制就是0x114,我们对应Index1可以得到Value=0x114-0x100=0x14:

image-20231219230941281

4.2 数据帧:485

image-20231219231201273

我们用485减去86,得到276,十六进制就是0x18F,我们对应Index1可以得到Value=0x18F-0x180=0x0F:

image-20231219231126893

4.3 数据帧:603

image-20231219231319816

我们用603减去86,得到517,十六进制就是0x205,我们对应Index1可以得到Value=0x205-0x200=0x05:

image-20231219231341838

4.4 数据帧:737

image-20231219231627171

我们用737减去86,得到651,十六进制就是0x28B,我们对应Index1可以得到Value=0x28B-0x280=0x0B:

image-20231219231558890

我们的密码不是12345678,这不才8个字节?怎么会是11?这是因为这里的WiFi密码是密文,是经过了8到6位格式转换的,后续我们还要对其进行解密才行。

4.5 数据帧:922

image-20231219232113359

我们用922减去86,得到836,十六进制就是0x344,我们对应Index1可以得到Value=0x344-0x300=0x44,这个数字很熟悉,上面我们解析过的,它转换后就代表字母d:

image-20231219232218345

4.6 数据帧:1058

image-20231219232322933

我们用1058减去86,得到972,十六进制就是0x3CC,我们对应Index1可以得到Value=0x3CC-0x380=0x4C,这个数字很熟悉,上面我们解析过的,它转换后就代表字母l:

image-20231219232444261

4.7 总结

按照上面的方式,我们就可以一步一步得到SSID和密码,具体怎么解析密码,后面代码会介绍。

我们来找个规律,我们看一下上面1058字节长度的这个包:

image-20231219232838960

前面一堆的头,然后是802.11加密数据(Encrypted Data),这个加密数据长度为1020字节,1058-1020=38。

我们再计算一个长度为922的包:

image-20231219233120730

这个加密数据长度为884字节,922-884=38。会发现都是38,我们用86减一下,可以得到86-38=48,这48字节其实就是加密数据的报文头。