聊聊Websocket协议与另类的抓包方法 - Curz0n's Blog
具体上上述文章,下面摘录 解析websocket部分
0x02 解析Websocket协议
要想搞清楚脚本嗅探的数据报文和burp抓取的报文为什么有差异,就需要先了解清楚Websocket协议的格式, 先看看Websocket数据帧格式:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len | Extended payload length |
|I|S|S|S| (4) |A| (7) | (16/63) |
|N|V|V|V| |S| | (if payload len==126/127) |
| |1|2|3| |K| | |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
| Extended payload length continued, if payload len == 127 |
+ - - - - - - - - - - - - - - - +-------------------------------+
| |Masking-key, if MASK set to 1 |
+-------------------------------+-------------------------------+
| Masking-key (continued) | Payload Data |
+-------------------------------- - - - - - - - - - - - - - - - +
: Payload Data continued ... :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Payload Data continued ... |
+---------------------------------------------------------------+
具体含义如下
域 说明
FIN 1bit,是否为信息的最后一帧
RSV 1-3 1bit,备用,默认为0
opcode 4bit,帧类型
MASK 1bit 掩码,是否加密数据。
客户端发送给服务端时,mask必须为1,否则断开连接。
服务端发送给客户端时,mask必须为0,否则断开连接。
payload length 7bit,传输数据长度,以字节为单位。
当7bit数字等于126时,其后的2个字节也表示数据长度。
当7bit数字等于127时,其后的8个字节也表示数据长度。
Masking-key 0或32 bit掩码值(Mask为1时才有)
Playload data 长度为Payload len的数据,如果有掩码,需要用Masking-Key来异或解密
根据Websocket协议格式,实现Websocket协议解析代码如下:
'''解析websocket协议'''
def parseWebsocket(tcpPayload):
#获取websocket数据段长度
payload_len = tcpPayload[1] & 0x7F
mask_flag = tcpPayload[1] & 0x80
#客户端发送给后端时,mask必须为1
if mask_flag:
if payload_len == 126:
extend_payload_len = tcpPayload[2:4]
mask = tcpPayload[4:8]
data = tcpPayload[8:]
elif payload_len == 127:
extend_payload_len = tcpPayload[2:10]
mask = tcpPayload[10:14]
data = tcpPayload[14:]
else:
extend_payload_len = None
mask = tcpPayload[2:6]
data = tcpPayload[6:]
decodeData = bytearray()
for i in range(len(data)):
chunk = data[i] ^ mask[i % 4]
decodeData.append(chunk)
return decodeData
#服务器发送给前端时,mask必须为0
else:
if payload_len == 126:
extend_payload_len = tcpPayload[2:4]
data = tcpPayload[4:]
elif payload_len == 127:
extend_payload_len = tcpPayload[2:10]
data = tcpPayload[10:]
else:
data = tcpPayload[2:]
return data
结合解析代码,运行脚本,效果如下,成功拿到了使用Websocket协议传输的数据报文:
image.png
网友评论