【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中强大的网络数据采集分析工具之一,可以将网络中传送的数据包头完全截获下来提供分析.它 ...
随机推荐
- PyMySQL查询
title: PyMySQL查询 author: 杨晓东 permalink: PyMySQL查询 date: 2021-10-02 11:27:04 categories: - 投篮 tags: - ...
- Dapper.FastCRUD与Dapper中的CustomPropertyTypeMap冲突
在使用Dapper.NET时,由于生成的实体的属性与数据库表字段不同(如表字段叫USER_NAME,生成的对应的实体属性则为UserName). 这时需要使用Dapper中的CustomPropert ...
- 杭电oj 水仙花数
Problem Description 春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:"水仙花数"是指一个三位数,它的各位数字的立方和等于其本身 ...
- oracle常用知识随笔
1.创建表空间及用户赋权 create tablespace spaceone datafile '/dev/spaceone'size 80mextent management localsegme ...
- 在Tomcat中部署Web项目的操作方法(必看篇)
在这里介绍在Tomcat中部署web项目的三种方式: 1.部署解包的webapp目录 2.打包的war文件 3.Manager Web应用程序 一:部署解包的webapp目录 将Web项目部署到Tom ...
- 模态框:JavaScript+css
solution one: JavaScript,单个模态框展示: modal_tools.js window.onload = function () { //js默认加载页面方法 // get m ...
- 攻防世界Web进阶篇——NewsCenter
题目有一个搜索框,下面是搜索结果,最先考虑是sql注入 遇到sql注入,一般先用单引号,1,2尝试.先尝试构造输入为:sd' union select 1,2 #和sd' union select 1 ...
- 【STM32】TIM定时器
TIM定时器(TIM3为例) 初始化: A:结构体TIM_HandleTypeDef的成员: 1.*Instance:类型为TIM_TypeDef,即对TIM的寄存器的映射,通过这个成员可以操作寄存器 ...
- BASE64编码作业
BASE64编码作业 什么是BASE64编码 ase64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法.可查看RFC2045-RF ...
- php中self和$this还有parent的区别
1.self代表类,$this代表对象 2.能用$this的地方一定使用self,能用self的地方不一定能用$this 3.parent只能调用静态属性,并且可以调用父类中公有和受保护的方法 静态的 ...