【Python】pcap抓MySQL网络包
pcap
# -*- coding:utf-8 -*-
# yum install libpcap-devel python-devel
# pip install pypcap hexdump -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
import pcap, hexdump, zlib
import re, threading, requests
INFO = """## SRC %s:%s
## DST %s:%s
## TYPE %d
## QUERY:
%s
"""
class Pkt:
def __init__(self, pkt, dloff):
"""
:param pkt:
:param dloff: IP层数据开始位置,成员函数的offset以此为准
"""
self.pkt = pkt
self.dloff = dloff
self.src = self.__addr__()
self.dst = self.__addr__(src=False)
self.ipv, self.ip_header_length = self.__l3_base_info__()
self.l4type, self.l4_header_length = self.__l4__()
def __l4__(self):
"""
4层协议类型 1:ICMP 6:TCP 7:UDP
TCP Header 长度位置 = dloff + ip_header_length + 12 的高四位
:return: ICMP/TCP/UDP
"""
d = {1: "ICMP", 6: "TCP", 7: "UDP"}
l, null = self.__split_bin__(bin(ord(self.pkt[self.dloff + self.ip_header_length + 12])))
# print "tcp length", ord(self.pkt[self.dloff + self.ip_header_length + 12])
# print "tcp length", bin(ord(self.pkt[self.dloff + self.ip_header_length + 12]))
# print "tcp length", l * 4, null, self.ip_header_length
return d[ord(self.pkt[self.dloff + 9])], l * 4
def __port__(self, src=True):
offset, s = 0 if src else 2, ""
for h in [hex(ord(self.pkt[self.dloff + self.ip_header_length + offset])), hex(ord(self.pkt[self.dloff + self.ip_header_length + 1 + offset]))]:
s = s + h[2:]
return int(s, 16)
def __split_bin__(self, s):
"""
:param s: 8位bit,例如'0b1000101'
:return: 高位(0-15),低位(0-15)
"""
pass
if not s.startswith("0b"):
raise TypeError
if len(s[2:]) < 8:
s = (8-len(s[2:])) * "0" + s[2:]
else:
s = s[2:]
return int(s[0:4], 2), int(s[4:], 2)
def __addr__(self, src=True):
"""
src addr offset 12
dst addr offset 16
:param src: True 源,False 目的
:return: ip
"""
if src:
return '.'.join(str(ord(self.pkt[i])) for i in range(self.dloff + 12, self.dloff + 16))
else:
return '.'.join(str(ord(self.pkt[i])) for i in range(self.dloff + 16, self.dloff + 20))
def __l3_base_info__(self):
"""
ip协议信息(协议版本和头长度) offset 0
:return: 协议版本号(4,6),头部长度
"""
s = bin(ord(self.pkt[self.dloff]))
v, l = self.__split_bin__(s)
return v, l * 4
def __mysql_protocol__(self):
"""
mysql protocol offset: ip_header_length + l4_header_length - 1
5层内容,包含:
Packet Length 3字节
Packet Number 1字节
Command Type 1字节 https://dev.mysql.com/doc/internals/en/command-phase.html
3 -> query
22 -> Prepare DML 预编译语句
23 -> Execute DML 预编译的Value
25 -> Close
5字节后是实际内容
:return:
"""
offset = self.dloff + self.ip_header_length + self.l4_header_length
# length = self.pkt[offset: offset+3]
if not self.pkt[offset: offset+3]:
return None, None
command = ord(self.pkt[offset+4])
# print type(self.pkt[self.dloff + self.ip_header_length + self.l4_header_length:])
# print dir(self.pkt[self.dloff + self.ip_header_length + self.l4_header_length:])
return command, self.pkt[offset+5:]
# print zlib.decompress(self.pkt[self.dloff + self.ip_header_length + self.l4_header_length:])
# print zlib.decompress(self.pkt[self.dloff + self.ip_header_length + self.l4_header_length+6:])
# return hexdump.hexdump(self.pkt[self.dloff + self.ip_header_length + self.l4_header_length:])
def format(self):
src_port, dst_port = self.__port__(), self.__port__(False)
command, query = self.__mysql_protocol__()
if not command:
return None
global INFO
# return self.dloff, self.src, self.dst, "IPv%s" % str(self.ipv), self.__l4__()
return INFO % (self.src, src_port, self.dst, dst_port, command, query)
if __name__ == "__main__":
# catch_pack("eth0", 1)
sniffer = pcap.pcap(name="en0", immediate=True, timeout_ms=10)
sniffer.setfilter("dst port 3306") # 只抓取TCP包
# addr = lambda pkt, offset: '.'.join(str(ord(pkt[i])) for i in range(offset, offset + 4))
for ts, pkt in sniffer:
# print ts, sniffer.dloff
# print '%d\tSRC %-16s\tDST %-16s' % (ts, addr(pkt, sniffer.dloff + 12), addr(pkt, sniffer.dloff + 16))
msg = Pkt(pkt, sniffer.dloff).format()
if msg:
print msg
查询请求
payload_length -> Packet length: 3字节
sequence_id -> Packet Number:1字节
payload -> Command:1字节
Packet Data:4字节后的所有内容
包的基础结构
https://dev.mysql.com/doc/internals/en/mysql-packet.html
Packet length: 3字节
Packet Number:1字节
Packet Data:4字节后的所有内容
解压缩 https://dev.mysql.com/doc/internals/en/uncompressed-payload.html
不压缩的情况:
set length of payload before compression to 0
the compressed payload contains the uncompressed payload instead.
【Python】pcap抓MySQL网络包的更多相关文章
- 【Azure 环境】在Windows环境中抓取网络包(netsh trace)后,如何转换为Wireshark格式以便进行分析
问题描述 如何在Windows环境中,不安装第三方软件的情况下(使用Windows内置指令),如何抓取网络包呢?并且如何转换为Wireshark 格式呢? 操作步骤 1) 以管理员模式打开CMD,使用 ...
- 使用tcpdump抓Android网络包
1 抓包原理 tcpdump(需Root用户运行)拦截和显示发送或收到过网络连接到该机器的TCP/IP和其他数据包.简单说就监控手机进出网络数据. 2 方法优劣 2.1优点 1.手机数据包无遗漏 2. ...
- 利用tcpdump抓取网络包
1.下载并安装tcpdump 下载地址:tcpdump 安装tcpdump,连接adb adb push tcpdump /data/local/tcpdump adb shell chmod 675 ...
- 如何同时在Isilon的所有网卡上抓取网络包?
命令行如下: cd /ifs/data/Isilon_Support/ mkdir $(date +%m%d%Y) isi_for_array 'for i in `ifconfig | grep - ...
- 【Azure 应用服务】App Service For Linux 如何在 Web 应用实例上住抓取网络日志
问题描述 在App Service For Windows的环境中,我们可以通过ArmClient 工具发送POST请求在Web应用的实例中抓取网络日志,但是在App Service For Linu ...
- 【应用服务 App Service】App Service中抓取网络日志
问题描述 众所周知,Azure App Service是一种PaaS服务,也就是说,IaaS层面的所有内容都由平台维护,所以使用App Service的我们根本无法触碰到远行程序的虚拟机(VM), 所 ...
- python+pcap+dpkt 抓包小实例
#!/usr/bin/env python # -*- coding: utf-8 -*- """ 网络数据包捕获与分析程序 """ imp ...
- PCAP 抓包
PCAP是一个数据包抓取库, 很多软件都是用它来作为数据包抓取工具的. WireShark也是用PCAP库来抓取数据包的.PCAP抓取出来的数据包并不是原始的网络字节流,而是对其进行从新组装,形成一种 ...
- Android利用tcpdump和wireshark抓取网络数据包
Android利用tcpdump和wireshark抓取网络数据包 主要介绍如何利用tcpdump抓取andorid手机上网络数据请求,利用Wireshark可以清晰的查看到网络请求的各个过程包括三次 ...
- Android移动网络如何抓取数据包
1)下载tcpdump工具 tcpdump(dump the traffic on a network)是Linux中强大的网络数据采集分析工具之一,可以将网络中传送的数据包头完全截获下来提供分析.它 ...
随机推荐
- maridb数据库表及字段增删改
mariadb数据类型 mariadb数据类型分为数字.日期.时间以及字符串值. 适用类型原则:够用就行,尽量使用范围小的,而不用大的 常用数据类型: 1.整数 int,bit #例如 年纪 适用 ...
- 01、kafka常用命令
001.kafka版本 kafka_2.13-3.0.0 kafka_2.12-2.8.0 002.模拟给topic名称是 yikuang 的发一条数据(hello world) ./kafka-co ...
- React脚手架的使用
初始化项目 npx create-react-app my-app // 或 npm init react-app my-app // 或 yarn create react-app my-app 启 ...
- Mac怎么创建加密文件夹
对于一些使用Mac工作生活有特殊要求以及职业要求有限制的用户来说,加密自己的工作内容以及隐私是非常重要的一件事情.往往用户需要加密的内容项目很多,这个时候我们就需要一个加密文件夹来包含这些内容.那么M ...
- 在linux环境中安装node,npm,express
linux安装node 连接运程命令: 进入usr/local 文件夹 cd /usr/local 1.下载 wget https://nodejs.org/dist/v14.17.6/node-v1 ...
- List进行分隔,分批插入数据库
背景,当数据集合超过一定数据量时,则会插入失败,需要将集合进行分隔,分批插入 /** * 分批插入-公共方法 * @param objects:数据集合 * @param subSize:单次插入的条 ...
- Ribbit Mq 实现延迟消息
--------------------好记性不如烂笔头--------------------------- windows 环境,使用 rabbit Mq 需要安装, erl 和 rabbi ...
- HDFS 内部工作机制
HDFS 内部工作机制 HDFS集群分为两大角色:NameNode.DataNode (Secondary Namenode) NameNode 负责管理整个文件系统的元数据 DataNode 负责管 ...
- 关于html中元素和布局的笔记
一.元素类型 css标准文档流:默认的网页从左到右,从上到下的排列方式显示出网页效果 类型: 1.块级元素:(div,p,table--) a.独占一行 b.可以设置宽度和高度 c.可以设置左右居中( ...
- 【python】界面学习
最近开始要用python做界面了,又是在百度的洪流中不断呛水.下面列举了很多我在过程中查询的内容以及我认为相对对我的认知有益的链接. 1.python有哪些做界面的工具 三个:python gui 中 ...