本文档记录,如何使用Wireshark抓包工具,抓取基于Websocket
的MQTT报文。
Wireshark是一个免费开源的网络抓包工具,新版的Wireshark是可以直接抓取基于TCP的MQTT报文,而基于Websocket
的报文,需要通过插件来实现。
下载,直接安装最新版本就好:
安装中有一步骤提示,使用nacp代替winnacp;勾选上,这样Wireshark才能解析127.0.0.1
这样的环回地址。
mqttws.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)
C:\Program Files\Wireshark\init.lua
文件(如果没有改默认安装目录),在文件的最后加一行代码:dofile("你保存的路径\\mqttws.lua")
Wireshark抓包分析,通常分为两步,第一步捕获, 第二步分析。二者有对应不同的选择器不要搞混了。
这里我选择了Adapter ....
环回地址的网卡,因为我的服务跑在本机上;使用的捕获工具port 8001
,因为mqtt服务的websocket工作在此端口上。
tcp
, websocket
包抓出来,这时候,使用mqtt
过滤器,直接可以过滤出我们想要的mqtt
报文情况:原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。