从 tcpdump 中提取 mysql 查询

Extract mysql query from tcpdump

我正在使用 tcpdump 从端口 3306 捕获 TCP 数据包并转发到 MySQL 服务器

sudo tcpdump -X -i ens5 -s 0 -tttt dst port 3306

并从 MySQL 客户端

执行 SQL select * from user_trading_volume limit 1

抓取结果如下

2020-05-27 07:46:44.330084 IP ip-10-0-1-33.ap-northeast-2.compute.internal.59750 > ip-10-30-1-179.ap-northeast-2.compute.internal.mysql: Flags [P.], seq 1945:2020, ack 16715, win 512, options [nop,nop,TS val 3790143765 ecr 4258512397], length 75
0x0000:  4500 007f 54fb 4000 4006 ce8c 0a00 0121  E...T.@.@......!
0x0010:  0a1e 01b3 e966 0cea 76a0 9245 c975 2466  .....f..v..E.u$f
0x0020:  8018 0200 1763 0000 0101 080a e1e9 0115  .....c..........
0x0030:  fdd3 be0d 1703 0300 46f5 525d 17c9 20ac  ........F.R]....
0x0040:  62e6 fcdc ba82 11fc 91c2 c187 7ca8 a542  b...........|..B
0x0050:  6ed8 a1fa b1d8 01bd 1240 61d9 686e 183d  n........@a.hn.=
0x0060:  f2fc 9b9a a62d c212 8d4d e1c6 e67a 4bdc  .....-...M...zK.
0x0070:  ea2e 75dc 68cf 5c45 1721 2ced c511 ca    ..u.h.\E.!,....

2020-05-27 07:46:44.331029 IP ip-10-0-1-33.ap-northeast-2.compute.internal.59750 > ip-10-30-1-179.ap-northeast-2.compute.internal.mysql: Flags [.], ack 17677, win 505, options [nop,nop,TS val 3790143766 ecr 4258513778], length 0
0x0000:  4500 0034 54fc 4000 4006 ced6 0a00 0121  E..4T.@.@......!
0x0010:  0a1e 01b3 e966 0cea 76a0 9290 c975 2828  .....f..v....u((
0x0020:  8010 01f9 1718 0000 0101 080a e1e9 0116  ................
0x0030:  fdd3 c372        

但捕获的数据包不可读(这意味着不是 ASCII)

我正在使用 AWS aurora (mysql 5.7)

有人知道这个数据包是什么意思吗?

PS。 我也在我的本地环境中尝试过它并且可以从数据包中检索匹配的 SQL 如下 (运行 mysql 在 docker 容器内并通过 mysql workbench 执行查询)

16:59:46.628631 IP (tos 0x0, ttl 64, id 59587, offset 0, flags [DF], proto TCP (6), length 98)
    view-localhost.52652 > view-localhost.3318: Flags [P.], cksum 0xfe56 (incorrect -> 0x1538), seq 61:107, ack 899, win 512, options [nop,nop,TS val 632447157 ecr 632447154], length 46
E..b..@.@.S...............@....=.....V.....
%.`.%.`.*....select * from user_trading_volume limit 1

您可以使用 tcpdump 捕获数据,然后使用选项 -w 将其重定向到文件。 然后使用 wireshark 加载它。

https://www.wireshark.org/docs/wsug_html_chunked/AppToolstcpdump.html

看第一个字节,这看起来像两个原始 IP 数据包 (45 => IP 版本 4,典型的 20 字节 header (5 * 4 字节)。维基百科在 IP headers.

上有更多信息

正在转换为 pcap

因此,我们应该能够将其转换回 pcap。我们可以使用 text2pcap 将此文本转储转换为数据包捕获,这是 Wireshark 附带的命令行实用程序。

将给定的文本作为文件 temp,我们可以将其转换为 pcap

$ cat temp | grep -v 2020 | cut -c3-49 | sed 's/ \(\w\w\)/  /g' \
 | text2pcap -l 101 - temp.pcap
Input from: Standard input
Output to: temp.pcap
Output format: pcap
Wrote packet of 127 bytes.
Wrote packet of 52 bytes.
Read 2 potential packets, wrote 2 packets (235 bytes).

正在清理 text2pcap 输入

在这里,我们清理输入,使 text2pcap 不会失败:

  • grev -v 2020:删除 2020... 信息行
  • cut -c3-49:去掉前面的0x和ASCII表示
  • sed 's/ \(\w\w\)/ /g':将 hexdump 从 2 个字节然后 space 转换为 1 个字节然后 space (09ab => 09 ab)
  • text2pcap -l 101 - temp.cap:从标准输入读取并作为原始 IP 数据包写入 temp.pcap(见下文)

您现在可以在 Wireshark 中查看此捕获以查看字段是什么。

找出 text2pcap 的 link 层数

回到初始字节,当正常情况下像以太网这样的 link 层开始数据包时,该字节开始 IP 层。这意味着我们不能使用 1(以太网)的典型 link 层。原始 IP 的 link 层是 101,因此我们需要使用 text2pcap 将其指定为 -l 101-是标准输入,然后我们把文件写成temp.pcap.

数据包是什么意思?

在 Wireshark 中加载时,数据包 1 的有效负载为 75 字节,并且不是 ASCII。您可能希望使用 MySQL protocol 引用手动解码这些字节。因为根据文档,

The MySQL protocol is used between MySQL Clients and a MySQL Server.