【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中强大的网络数据采集分析工具之一,可以将网络中传送的数据包头完全截获下来提供分析.它 ...
随机推荐
- 如何利用python的xlrd模块读取日期格式的Excel
经常使用python操作Excel,就会遇到各种坑,比如,有时候你读取到的某一单元格的数据,你预想的结果本来应该是这样的,但是它却是这样的,真是很蛋疼.于是你会找各种解决办法,去解决这个问题!所以鄙人 ...
- js - console
js - console 参考资料 JavaScript Console 对象 Node.js console.debug()用法及代码示例 nodejs.org console.log输出字体颜色 ...
- 多个git账户ssh密钥配置
假设两git网站:A.com和B.com,在这两个网站上使用的邮箱和用户名分别为a@mail, userA和b@mail, userB. 清除全局配置 git config --global --li ...
- java发送短信验证码带倒计时
分享一个完整的java发送短信验证码的完整实例,这是一个官方的使用demo,带有60秒倒计时功能. 效果: 我使用的是榛子云短信平台, 官网地址:http://smsow.zhenzikj.com 我 ...
- python 安装步骤
1.这个安装方法不需要配置环境变量 2. 3. 4.进入cmd,输入python -v
- Python基础数据类型-Tuple(元组)
a = () b = (1) # 不是元组类型,是int型 c = (1,) # 只有一个元素的时候,要加逗号才能表示是元组 d = (1, 2, 3, 4, 5, 6, 1) print(type( ...
- vue父子组件,子组件调用父组件方法
问题描述:在table页面修改数据后,想刷新页面.修改页面以子组件的形式写的,现在想在子组件里面调用父组件的方法实现页面刷新! 将问题google后,以下两种方法都尝试过了,但是不起作用......大 ...
- scottrade 手机应用中英文翻译
Dashboard Watch List 自选股 MARKET & NEWS 市场 & 新闻 ALERTS 警告 MONEY MOVEMENT BRANCH LOCAT ...
- java Comparator和Comparable的区别?
参考:https://blog.csdn.net/m0_71087031/article/details/124850080 Comparable是一个内比较器,可以和自己比较的 Comparator ...
- 操作系统|02.Linux基础(1)
Linux基础 1.Linux系统安装.密码的破解 1.1常见的系统 unix:性能稳定,价格高昂,命令与Linux相通.多为大型政府单位.大型企业.金融机构使用. Linux:开源.自由 Linux ...