转 :聊聊Websocket协议与另类的抓包方法

2024-02-19  本文已影响0人  牵手生活

聊聊Websocket协议与另类的抓包方法 - Curz0n's Blog

Websocket协议解析-CSDN博客

具体上上述文章,下面摘录 解析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
上一篇下一篇

猜你喜欢

热点阅读