前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Wireshark抓取Websocket的mqtt报文

Wireshark抓取Websocket的mqtt报文

原创
作者头像
yield9tk
发布2022-03-05 13:49:17
2.4K0
发布2022-03-05 13:49:17
举报
文章被收录于专栏:小叶的coding记录

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 Files\Wireshark\init.lua文件(如果没有改默认安装目录),在文件的最后加一行代码:
代码语言:lua
复制
dofile("你保存的路径\\mqttws.lua")
  1. 重启Wireshark

3. 使用指南

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

3.1 捕获

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

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

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

3.2 分析

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 概述
  • 2. 安装
    • 2.1 安装Wireshark
      • 2.2 安装插件
      • 3. 使用指南
        • 3.1 捕获
          • 3.2 分析
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档