admin管理员组

文章数量:1581058

剧情回顾

《单片机—ESP8266Wifi SmartConfig一键配置(一)》

本章重点

根据前一章的做法,其实ESP8266的一键联网我们已经用起来了,但是我们并不清楚里面的细节,究竟SSID和密码是如何广播出来的?

通过百度其他资料,其中包含了确定SSID,信道,接收数据,分离里面的长度,从长度中截取出密码和SSID。

抓包

我们想用无线网卡抓取802.1x的wifi报文,看一下广播出来的数据是什么样子,这里就需要在linux下进行抓包了,因为windows上无法抓取wifi报文。
这里用的系统是kali,因为这个系统的驱动都安装好了,只需要外置一个网卡,就可以抓取。
不过这里首先要配置一下网卡,需要用到下面两个重要的命令

iw dev wlan0 interface add mon0 type monitor
ifconfig mon0 up

想理解为什么可以参考下面一段话

因為工作的緣故,需要去監聽無線網路的封包,特別是IEEE802.11的管理控制訊框(frame … 其實我還是比較喜歡直接叫作封包)。同事直接打開 wireshark 卻擷取 wifi 介面,卻發現聽到了一堆 ethernet 的訊框而聽不到 wifi 的訊框。為什麼呢?來看看 wireshark 的官網怎麼說:
If you’re trying to capture network traffic that’s not being sent to or from the machine running Wireshark or TShark, i.e. traffic between two or more other machines on an Ethernet segment, or are interested in 802.11 management or control packets, or are interested in radio-layer information about packets, you will probably have to capture in “monitor mode”. This is discussed below.
Without any interaction, capturing on WLAN’s may capture only user data packets with “fake” Ethernet headers. In this case, you won’t see any 802.11 management or control packets at all, and the 802.11 packet headers are"translated" by the network driver to “fake” Ethernet packet headers.
答案揭曉,原來這是因為 wifi driver 會自動把 wireless frame 轉成 ethernet frame 後再給 kernel,這樣 kernel 裏面的 protocol stack 會比較好處理。
問題是,如果我想要聽到 wifi frame 的話,要怎麼做呢?答案很簡單,將 wifi adapter 設成 monitor mode。在 wifi adapter 中,通常都有 SSID/ESSID filter,所以就算把 wifi adapter 設定成為 promiscuous mode 也沒有用,因為還是無法收到非自己加入的 SSID 的 frame。那 monitor mode 呢?我們可以看看下面這句話:
In monitor mode the SSID filter mentioned above is disabled and all packets of all SSID’s from the currently selected channel are captured.

这样就会增加出一个网卡,可以在上面抓到wifi的报文。
然后打开wireshark,就可以愉快的抓包了。

可是抓了过程,还是没从数据长度中发现点什么。

嗅探

ESP8266有一个功能,就是嗅探模式,可以继续以嗅探的方式,来接收一下smartconfig的报文,看看都是什么内容。
工作路径重新配置为下图

重新编译,然后烧写固件
这样一来,倒是抓取到了一部分帧,和wireshark抓到的类似

分析协议

经过两种抓包,得到了下面一些信息。

起止消息

这种广播出来的消息,开头和结尾总是有循环的一组数据在发送,wireshark中看到的是在
625~622之间循环,


sniff抓到的是599~596之间循环

中间的长度数据

应该是加密的,发送相同密码的时候,内容是基本一样的,更换了密码,长度就都变化了。看来是经过加密的数据。

其他有价值的信息就猜不到了。

网上找到了这篇文章《airkiss技术原理》

里面有这么一段话

为解决这两个问题,在发送链路层数据(见下节)之前,需要先发送 400ms 的前导域(400ms = 8*50ms,即如果设备端以 50ms 的频率切换信道, 则可以覆盖 8 个信道,因为一般用户环境不用监听 14 个信道,所以覆盖 8 个 信道足已)。前导域由 4 个字节组成,其值固定为{1,2,3,4}。接收方在接收到这 些前导域数据包后,利用 SNAP 包中的 Length 字段与之相减,从而获取到这 个差异值。 举个例子,接受方通过监听,在链路层截获 802.2 SNAP 格式的前导数据 包,其 Length 字段的值分别为 53,54,55,56,那差异值就能确定为 53- 1=52。之后接收方接收到数据之后都用 SNAP 包的 Length 字段值减去 52,即能 得到实际的信息数据。

这个前导域,目前还不知道怎么获得,怕不是在驱动中做的吧。或者这是个专利。别人拿不到。

另外它们用的这个格式,从报文中也看不出来

还有一篇文章
《Wifi SmartConfig 一键配置》,其中介绍了一些TICC3000的东西。

看来想做一个类似的功能,还是很麻烦,并不是一个简单的应用。后续再研究一下。

结束语

折腾了一天,没有什么实质性的突破,不过也学了一些技术,例如抓取802.1x的报文,到处收集smartconfig的资料,发现了网上的相关内容,也都是出自一两个人的手。

今天是周五了,不知道隔壁的战争还要打多久,希望平民不再伤亡吧。
也许不久的将来,人们忘记了当年的惨烈,恶魔就会降临。

本文标签: 单片机一键ESP8266WiFismartconfig