wiresharks抓包分析(tcpdump抓包并还原请求体)

 前言:先说下今天遇到的一个问题。和外部门同学对接消息记录拉取,采用的是pb协议,接口机的L5暴露给对方用以拉取。对方请求后表示IO超时没有收到对应回包,于是对方质疑我方有问题。现需要排查原因,更准确说如何找证据打脸对方。

分析:我方业务是相对成熟的,这种问题大概率是对方发过来的请求不对,例如缺少某些字段导致接口机无法将请求转发给后方业务机。注:经过沟通发现对方不能打印请求体(具体原因也不管了)。思路无非如下(其中第二点是此次研究的重点):

①首先tcpdump抓包看看我方究竟有没有收到对方的请求;

②如果收到请求尝试将抓包的数据反解得到对方实际发送过来的结构体,打脸对方。

已知数据组包格式如下,关于head和body的pb结构体这里不做详述。下面重点演示第二个问题。

STX_C_0x5B = 0x5b  #这个就是'['的16进制ascii码
ETX_C_0x5D = 0x5d  #这个就是']'的16进制ascii码
STX_C_0x5B+cmd(4)+seq(4)+headlen(4)+bodylen(4)+Head(pb)+Body(pb)+ETX_C_0x5D

1、tcpdump在接口机上抓取数据包(对方发过来的请求),并输出为.cap文件。

对应cap文件参见   这里

tcpdump -i eth1 host 9.138.238.218 -X -w aa.cap

 2、将.cap文件用wiresharks打开进行分析如下:

 此时祭出如下这张图(将TCP Head换成此处的UDP Head),一毛一样。观察上图可以看到各个方面都符合预期,接下来要做的事情就是把其中的数据部分转换解析并打印出来。

 

 3、解析并打印data部分

(0)选中date域→右键→copy→  总共有如下选项,各个选项对应的数据如下:

注:这里是在 是在实际传输数据处copy,如果在 阴影处 复制的话实际上赋值的是完整的数据包(这种情况你要自己截取data域)。

#as Hex Dump
0000   5b 00 04 a0 73 c0 71 1f 14 00 00 00 16 00 00 00
0010   11 08 02 12 12 08 01 18 f3 c0 12 20 94 be c4 83
0020   0c 42 04 08 00 20 00 9a 87 94 01 0c 08 00 10 00
0030   18 00 20 00 28 0f 30 01 5d

#as Printable text
[ sÀqóÀ ¾ÄB  (0]

#as a Hex Stream
5b0004a073c0711f14000000160000001108021212080118f3c0122094bec4830c4204080020009a8794010c0800100018002000280f30015d

#as a raw binary

#as a Escaped string
"\x5b\x00\x04\xa0\x73\xc0\x71\x1f\x14\x00\x00\x00\x16\x00\x00\x00" \
"\x11\x08\x02\x12\x12\x08\x01\x18\xf3\xc0\x12\x20\x94\xbe\xc4\x83" \
"\x0c\x42\x04\x08\x00\x20\x00\x9a\x87\x94\x01\x0c\x08\x00\x10\x00" \
"\x18\x00\x20\x00\x28\x0f\x30\x01\x5d"

显然其中的escaped string(转义字串)应该就是我们之前所说的二进制流了。

(1)将二进制流的换行、引号等去掉,赋值给buf

buf=b'\x5b\x00\x04\xa0\x73\xc0\x71\x1f\x14\x00\x00\x00\x16\x00\x00\x00\x11\x08\x02\x12\x12\x08\x01\x18\xf3\xc0\x12\x20\x94\xbe\xc4\x83\x0c\x42\x04\x08\x00\x20\x00\x9a\x87\x94\x01\x0c\x08\x00\x10\x00\x18\x00\x20\x00\x28\x0f\x30\x01\x5d'

(2)然后进入python交互模式进行解析

import struct
import com.tencent.epc.innerprocess.cloudcc_pb2 as cloudcc
import com.tencent.epc.innerprocess_pb2 as innerprocess

buf=b'\x5b\x00\x04\xa0\x73\xc0\x71\x1f\x14\x00\x00\x00\x16\x00\x00\x00\x11\x08\x02\x12\x12\x08\x01\x18\xf3\xc0\x12\x20\x94\xbe\xc4\x83\x0c\x42\x04\x08\x00\x20\x00\x9a\x87\x94\x01\x0c\x08\x00\x10\x00\x18\x00\x20\x00\x28\x0f\x30\x01\x5d'

prefix_len = 1 + 4 + 4 + 4 + 4
suffix_len = 1
str_cmd_seq_len = buf[1:17]
(cmd, seq, head_len, body_len) = struct.unpack('!IIII', str_cmd_seq_len)

如下图(cmd,seq,head_len,body_len)都是可以正确解析出来的。

接下来解析head和body。

head = innerprocess.Head()
reqbody = cloudcc.ReqBody()
str_head = buf[prefix_len:prefix_len + head_len]
head.ParseFromString(str_head)
str_body = buf[prefix_len + head_len:prefix_len + head_len + body_len]
reqbody.ParseFromString(str_body)

如下图可以看到head、reqbody也都被解析出来了。 

显然字段乱填,成功打脸对方!!!!

猜你喜欢

转载自blog.csdn.net/mijichui2153/article/details/121940510
今日推荐