美文网首页
转 :聊聊Websocket协议与另类的抓包方法

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

作者: 牵手生活 | 来源:发表于2024-02-19 11:28 被阅读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

    相关文章

      网友评论

          本文标题:转 :聊聊Websocket协议与另类的抓包方法

          本文链接:https://www.haomeiwen.com/subject/fmhvadtx.html