【问题标题】:Extract mysql query from tcpdump从 tcpdump 中提取 mysql 查询
【发布时间】:2020-09-14 04:53:53
【问题描述】:

我使用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,如下所示 (在 docker 容器中运行 mysql 并通过 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

【问题讨论】:

    标签: mysql tcp packet tcpdump amazon-aurora


    【解决方案1】:

    看第一个字节,这看起来像两个原始 IP 数据包(45 => IP 版本 4,典型的 20 字节标头(5 * 4 字节)。维基百科有有关IP headers 的更多信息。

    转换为 pcap

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

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

    $ cat temp | grep -v 2020 | cut -c3-49 | sed 's/ \(\w\w\)/ \1 /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\)/ \1 /g':将 hexdump 从 2 字节然后空间转换为 1 字节然后空间 (09ab => 09 ab)
    • text2pcap -l 101 - temp.cap:从标准输入读取并作为原始 IP 数据包写入 temp.pcap(见下文)

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

    找出 text2pcap 的链接层编号

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

    数据包是什么意思?

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

    MySQL 协议用于 MySQL 客户端和 MySQL 服务器之间。

    【讨论】:

    • 感谢您的解释。但问题是该数据包是通过https协议发送的数据包的加密数据(我不是这个意思......哈哈......)
    • 您可以从https捕获中提取数据,但您需要事先在客户端/服务器上进行设置。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-03-08
      • 1970-01-01
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多