Wireshark抓取Websocket的mqtt报文

2022-03-05 13:49:17 浏览数 (1)

  • Wireshark抓取ws上的mqtt报文
    • 1. 概述
    • 2. 安装
      • 2.1 安装Wireshark
      • 2.2 安装插件
    • 3. 使用指南
      • 3.1 捕获
      • 3.2 分析

1. 概述

本文档记录,如何使用Wireshark抓包工具,抓取基于Websocket的MQTT报文。

Wireshark是一个免费开源的网络抓包工具,新版的Wireshark是可以直接抓取基于TCP的MQTT报文,而基于Websocket的报文,需要通过插件来实现。

2. 安装

2.1 安装Wireshark

下载,直接安装最新版本就好:

https://www.wireshark.org/#download

安装中有一步骤提示,使用nacp代替winnacp;勾选上,这样Wireshark才能解析127.0.0.1这样的环回地址。

2.2 安装插件

  1. 首先在电脑上新建一个mqttws.lua的文件,将以下代码添加进去:
代码语言:lua复制
local mqttws = Proto("mqttws", "MqttOnWebsocket");

local f_proto = ProtoField.uint8("mqttws.protocol", "Protocol", base.DEC, vs_protos)
local f_dir = ProtoField.uint8("mqttws.direction", "Direction", base.DEC, { [1] = "incoming", [0] = "outgoing"})
local f_text = ProtoField.string("mqttws.text", "Text")

mqttws.fields = { f_proto, f_dir, f_text }

wsField = Field.new("websocket")
wsDataField = Field.new("data.data")

pParsed = {}
pMqttMsgIndex = {}
mqttMsgTable = {}
mqttMsgIndex = 0

function mqttws.dissector(tvb, pinfo, tree)
	if wsField() ~= nil then
		local dataField = wsDataField()
		if dataField ~= nil then
			if pParsed[pinfo.number] == nil then
				pParsed[pinfo.number] = true
				local mqttData = mqttMsgTable[mqttMsgIndex]
				if mqttData == nil then
					mqttData = dataField.range:tvb():bytes()
				else
					mqttData:append(dataField.range:tvb():bytes())
				end
				mqttMsgTable[mqttMsgIndex] = mqttData
				if mqttData:len() >= 2 then
					local mqttMsgLength = tonumber(mqttData:get_index(1))   2
					if mqttMsgLength <= mqttData:len() then
						pMqttMsgIndex[pinfo.number] = mqttMsgIndex
						mqttMsgIndex = mqttMsgIndex   1
					end
				end
			end
			local msgIndex = pMqttMsgIndex[pinfo.number]
			if msgIndex ~= nil then
				local mqttData = mqttMsgTable[msgIndex]
				local mqttTvb = ByteArray.tvb(mqttData, "Reassembled mqtt data")
				local mqtt = Dissector.get("mqtt")
				mqtt:call(mqttTvb, pinfo, tree)
			end
		end
	end
end

register_postdissector(mqttws)
--local websocket = Dissector.get("websocket")
--local tcp_dissector_table = DissectorTable.get("tcp.port")
--tcp_dissector_table:add(9001, websocket)
--local ws_dissector_table = DissectorTable.get("ws.protocol")
--ws_dissector_table:add("mqtt", mqttws)
  1. 找到C:Program FilesWiresharkinit.lua文件(如果没有改默认安装目录),在文件的最后加一行代码:
代码语言:lua复制
dofile("你保存的路径\mqttws.lua")
  1. 重启Wireshark

3. 使用指南

Wireshark抓包分析,通常分为两步,第一步捕获, 第二步分析。二者有对应不同的选择器不要搞混了。

3.1 捕获

  1. 先选择数据流经的网卡,进行抓包:
Snipaste_2022-03-04_21-17-15.pngSnipaste_2022-03-04_21-17-15.png

这里我选择了Adapter ....环回地址的网卡,因为我的服务跑在本机上;使用的捕获工具port 8001,因为mqtt服务的websocket工作在此端口上。

  1. 选择开始,就进入捕获模式:
Snipaste_2022-03-04_21-20-41.pngSnipaste_2022-03-04_21-20-41.png

3.2 分析

  1. Wireshark会将多层次的tcpwebsocket包抓出来,这时候,使用mqtt过滤器,直接可以过滤出我们想要的mqtt报文情况:
Snipaste_2022-03-04_21-23-18.pngSnipaste_2022-03-04_21-23-18.png

0 人点赞