物联网通信协议MQTT通信过程

MQTT,目前物联网的最主要的协议,基本所有收费的云平台都是基于MQTT协议,比如机智云,和所有的开放云平台比如中国移动的oneNet、百度的云平台也都支持MQTT的接入。虽然MQTT很火,但是目前对MQTT的很少,尤其是在如何移植到嵌入式上来。大部分的平台商的做法都是跟模块商合作把MQTT协议集成到WiFi模块跟GPRS模块里面,捆绑一销售,不让用户过多的了解物联网最核心的东西。

在还没有深入去了解MQTT协议之前,总以为是非常复杂的东西,毕竟之前一直想深入,但无奈在浩淼的网络里居然找不到太多实质的资料。随时自己对物联网的不断探索,越来越了解整个物联网的架构,对MQTT了解越来越深入。在这篇文章中将带大家先了解MQTT的协议,在后面的文章,再带大家怎么移植MQTT到STM32上,再到怎么搭建自己的MQTT服务器。

MQTT的基础知识这些大家通过百度知道都可以了解到,这里主要深入去剖析MQTT协议的整个通信流程。但是如果只是看文字话,大家很难理解。因此我们借助Windows下的MQTT客户端MQTT.fx跟网络抓包工具Wireshark来一步步分析MQTT。

名字 流向 描述
CONNECT 1 C->S 客户端请求与服务端建立连接
CONNACK 2 S->C 服务端确认连接建立
PUBLISH 3 CóS 发布消息
PUBACK 4 CóS 收到发布消息确认
PUBREC 5 CóS 发布消息收到
PUBREL 6 CóS 发布消息释放
PUBCOMP 7 CóS 发布消息完成
SUBSCRIBE 8 C->S 订阅请求
SUBACK 9 S->C 订阅确认
UNSUBSCRIBE 10 C->S 取消订阅
UNSUBACK 11 S->C 取消订阅确认
PING 12 C->S 客户端发送PING(连接保活)命令
PINGRSP 13 S->C PING命令回复
DISCONNECT 14 C->S 断开连接

上面是MQTT的主要的通信协议,MQTT是基于TCP长连接,首先是先跟MQTT服务器建立TCP连接,然后发送登录请求,要保持长连接,还要定时发心跳包跟服务保持连接。我们先用MQTT.fx来登录开源的MQTT服务看看。

 

安装好MQTT.fx(注意MQTT.fx是java开发的,电脑要安装JDK才能安装打开),一打开里面就默认有一个开源的MQTT服务M2M Eclipse。点开旁边的齿轮(设置按钮)可以看服务器的域名m2m.eclipse.org,端口号1833(MQTT的默认端口号),下面还有个Keep Alive Interval就是心跳的时间。再打开Wireshark,选择要捕获的网络接口,然后再过滤器输入tcp.port==1883后回车,只捕获1883这个端口号的数据包。再点下MQTT.fx的Connect连接服务器,就可以看到Wireshark捕到的数据

可以看到MQTT协议中本地给服务器发送了一个Connect登录请求,然后,服务器回应一个ACK,表示登录成功。再双击Connect Command这条数据包,我们可以看到详细的数据包数据

 

 

上面的解析出来的MQTT协议包的内部,下面是对应的二进制数据,这里我们可以对照附件上资料去了解协议的内容。看这里,大家想是不是如果自己用TCP,再封装发送下面的二进制数据就可以完成MQTT的登录了呢?拿出网络调试助手来,ping下m2m.eclipse.org得到IP地址,用端口号1883连接,然后发送Wireshark捕到的MQTT登录协议的二进制数据,可以看到到服务器回应了 20 02 00 00 表示登录成功。

 

再往下Wireshark捕到的数据包,可以看到每隔一定的时间,本地向服务器发送Ping Request心跳包,相应的服务器也会回应Ping Response。

 

接下来看MQTT最核心的传输协议 Subcribe(定阅)和Publish(推送)。简单来说就是客户端口(比如物联网硬件)Subcribe一个topic(主题)后,其它的客户端(比如手机)向服务器往这个topic 推送 Payload(有效数据),服务器就会把Payload转发给定阅这个topic的客户端(硬件)。

这样就实现了客户端(手机)通过服务器(MQTT)远程发送数据给客户端(物联网硬件)。一样用MQTT.fx来实验。先点Subscribe然后面下面输入led再点旁边的Subscribe按钮来定阅led这个topic。然后回到Publish,一样在输入框输入led这个topic,下面大框就是输入要推送的数据,输入on,再点Publish按钮,就把数据推送出去了。再回到Subcribe界面来可以看到右边已经收到有推送过来的数据。如果这是硬件收到这个指令,就可以去控制点亮LED,我们就实现远程控制LED灯。

 

想深入了解MQTT这一个过程的话,我们再回到Wireshark,来看看捕获到的数据

 

 

具体的就不详细的分析了,大家看附件的文档来对照就可以很容易了解到。

最后来了解下QoS(定阅等级),分0、1、2三个等级,简单来说是等级越高越可靠。QoS0,就是推送之后就完事了,至于对方有没有收到,收到是什么,数据有没有丢失,都不管。

QoS1的话就是你收到推送后,你还得返回一个puback给对方,告诉对方收到了,不然对方会以为你没收到,隔一段时间后重新给你推送,直到你给对方返回一个Puback为止。

 

 

    好了,基本的就写到这,剩下的大家可以根据这个方法对照文档去消化MQTT。

帝都国贸三期来过~

CVE-2014-6332 老洞

CVE-2014-6332,网上已经有过几篇分析报告 那些报告看得云里雾里,可谓“让懂的人懂让不懂的人不懂”

错位数组,修改类型

VBscript 代码开头定义了一些变量:

然后 Begin()–>Create()–>Over()

此时,aa 和 ab 的实际大小都是 a0,但 aa经过漏洞修改,可索引的范围大了 0x80000000h。

如果碰巧存在如上图所示的情况,aa 数组的实际大小到 a0为止,ab数组从 ab(0)开始,中间隔了 8h 大小的内存。
那么 ab(0)的 dataHigh 字段正好对应 aa(a1)的 varType 字段。
这是完全可以的,因为自 aa(a1-1)开始,aa数组的元素只有索引,没有实际内存。
为了满足这个“碰巧”,Create()要尝试最多 400次,直到满足。

实际上没几次尝试就成功了,多数情况一次即可。

什么事DVE?

题外话,啥是 DVE。Yuange 说了好几年 DVE,究竟什么是 DVE,即不劫持 EIP 而达到执行目的。
在 VB 虚拟机中,yuange 采用的具体办法是修改 GodMode,要修改 GodMode 就要修改 varType。
各种各样奇形怪状的漏洞,精心安排,都要达到这一目的——改 varType。
@romosied_lu 演示 DVE 的时候甚至直接 eb 08000020 200c
本例中,通过越界索引这个漏洞错位放置的数组可相互修改 varType。
这一整套的利用方式已经模块化了

mydata()

reate()结束,Begin()函数进入 setnotsafemode()。
setnotsafemode()先执行 mydata()

函数中
i=testaa
i=null
这两句话执行过后 i+0x8 的位置处恰好是一个 CScriptEntrypPoint 对象指针。
后面寻找标志位的时候有用处。
同样依靠上面说的方式,将内存弄成了如下的样子:

这样布置好数据,然后 mydata 返回 aa(a1)。

ReadMemo()

随后进入 ReadMemo()函数,这个函数很有技巧,用来获取指针的引用内容。
首先,再次利用错位修改属性:

这里将 aa(a1)的类型修改为 vbString,也就是 BSTR 结构,其内容也是个 BSTR 指针
BSTR 结构大名鼎鼎,已经在 IE 的攻防拉锯战中活跃已久,不服累述。

Lenb()函数用来获取 bstr 结构的长度,即 bstr 指针-4 处的内容,也就是说,Lenb()返回*(aa(a1)-4),yuange 用 add+4
来修正,那么 ReadMemo()函数返回值就是参数 add 指针所指的内容。

setnotsafemode()

此时,mydata()已准备好内存布局,setnotsafemode()要做的事情很简单了:
利用 ReadMemo()搜索内存,修改标志位。

经过这一轮反复索引寻址,i+&h134实际上已经“差不多”指向了 godmode flag。
因版本不同,地址可能会有微小差别,但总是在那一块。
地址找到了,如何修改内容呢?

还记得前面 aa(a1+2)被修改成 vbSafeArray 吗,与触发漏洞的时候数据类型一样的,也不再多说了。
修改为 vbSafeArray 后,aa(a1+2)可以索引到整个用户内存空间。
Yuange 搜索了那一块内存,找到 godmode flag 的确切位置

然后用 aa(a1+2)修改掉 flag,索引值 i+&h11c+k 也是 pvData+cbElements*4 修正 4个偏移得到的结果。
Myarray 在 BeginInit()函数中初始化过,符合 vbSafeArray 的结构

The end

至此,上帝模式已开启,runmuma 中能写什么,全靠各位想象力。
其实错位数组然后修改 varType 然后修改 flag 的这一套组合拳已经非常完善,之前大家的思路都是考虑一个 uaf 漏
洞之后怎么衔接上这个利用,如今再看 yuange 完整的代码,愚猜想可能 yuange 挖掘出这个 vb 的 redim 漏洞与这一
套利用方式应该是同时完成,这两方面都需要对 vbSafeArray 结构彻底的逆向理解。而且漏洞与利用一脉相承,顺
理成章,结合得非常紧密。当然,这只是八卦,真相只有 yuange 自己知道。
在感受大牛功力深厚,仙人指路的同时,学人以鱼不如学人以渔,vb 利用固然精妙,更应该看到的是对 vbscript.dll
的逆向分析,寻找软件内部的原理,了解其不想让我们知道的运作方式,找到别人找不到的弱点,完成大家不敢想
的 exploit,跳出惯性思维,不受框架束缚,享受过程,这才是黑客与黑客精神。

Cuckoo 的一些注意地方

Cuckoo 有些地方还是需要注意的,比如M2Crypto库德版本不能过高。

用xen或者qemu,增加syscall功能,压缩包解压.后期android 也加进来

不过沙箱的一个坏处就是样本能正常跑出30%就已经谢天谢地了。 大部分还是依赖的库等文件比较多的。

接下来把办公网的灰色部分跑起来。

新年快乐!

新年快乐!朋友们!