使用python抓包并分析后存入数据库,或直接分析tcpdump和wireshark抓到的包,并存入数据库

2023-11-19

准备工作

抓包首先要用到scapy包

安装scapy包

pip install scapy

在python代码中引用scapy包

from scapy.all import *
#为了省事,直接import *,你也可以根据你的需求去导入你想用到的

抓包

想要分析包,首先要有包,先从抓包开始说起

抓包使用的是scapy中的sniff()方法

pcaps = sniff(filter="",iface="any", prn=function, count="")

#filter的规则使用 Berkeley Packet Filter (BPF)语法
#iface用来指定要在哪个网络接口上进行抓包(通常不指定即所有网络接口)
#prn指定回调函数,每当一个符合filter的报文被探测到时,就会执行回调函数,通常使用lambda表达式来写回调函数
#count指定最多嗅探多少个报文(是指符合filter条件的报文,而非所有报文)

其中

filter为过滤规则,参照BPF语法填入过滤规则

例如:filter="ip src www.baidu.com"  获取源地址为www.baidu.com的报文

iface为从哪个网卡上抓包,后面填上网卡名

例如:iface="WLAN"   或   iface="eth0"

prn则为回调函数,简单用法例如:prn=lambda x:x.summary()  或  prn=lambda x:x[IP].src

prn=lambda x:x.summary()  为打印出来报文的简要信息

效果:Ether / IP / TCP 192.168.2.204:4963 > 180.97.162.191:8202 A

prn=lambda x:x[IP].src为打印出来报文的源地址

效果:192.168.1.1

count为抓多少个报文

保存包

若抓到包想要保存下来,以便下次慢慢分析,可以使用如下方法保存

wrpcap("pc2.pcap", pcaps)

若不想保存,则直接下一步

分析包

抓到包以后,刚刚我们用回调函数的方法summary,展示了每个包的简要信息,还有很多花样打印出抓到包的信息的方式,具体参考下列代码

from scapy.all import *
dpkt = sniff(iface="WLAN", count=10)



print(dpkt)  
# 打印出包的总信息,打印效果:
#<Sniffed: TCP:2 UDP:0 ICMP:0 Other:0>

print(dpkt[0])
#打印第一个包,其实这样打印是没什么用的,看不到什么,因为都是16进制,那个警告的意思也是这样打印没有任何意义的意思,打印效果
#WARNING: Calling str(pkt) on Python 3 makes no sense!
#b'X\x00\xe3Df\xfbh\xa8(/\xd7\t\x08\x00E\x00\x01{\xa6)@\x005\x11 \xef=\x97\xb4\xa2\xac\x1c\xdf\x03\x1f@\x0f\xb1\x01g\x06>\x02:-\x00\x17\xab\r2\xc2o\n\x00\x00\nF.v\x8e+\x80\x0e\x14\xa3/\'\x7f+_\xba%\xd86\xb8\x00\xda\n\x7f\xff\xc16\x13
-#\x15\t\xe4\xb6[U\xdcT\xfb\xf6\xfb\xc5!%~\x92U\xdd\x96\x88\xf6\x12\xc8.\xda9\xd0\x85\x9d{\xd7/,\xf6\xb2\x9a\xe9\xbcg\x1bw\xec-\xab9\xab\x8e\xc0\x94\xef\xdbneT\x8f\xe3c\xa0h=\xc0\n+\xec\xdf\xa2x\xb3\x03\xc7GR\x90~D\xa4\xbe\x8a\xf8\xa
#d\xb9I\x05\x16&%\xa6B\xabM\xd1\x1bh\xa8\xb1\xe8=\xc7HG\x11Qv\xa3\x11\x14\xf0\x98\xb2\x9c\xd3\x94\xd1\xa1&\x99;\x86\xa6.\x10\x1e\x1d\xf5\xa3H(\xa7I\x84\xf9\xa8k\x9f\r\x86\x05\xf9p\x0b\xc0\x8e\xda\xcer\x0e<\xaf\x16\xccT|\xae\xack\x1a\
#xd1\xae\\1\xc9\x98\xb4\xc4Um\xb6\xa1\xdfAoa\xc5\xa6N\xe9\xbd\x9fB\xed\x94\xf2\xe2\xb4\xa4O\xa46,\xbc\xe8\x86h,\x19\x0e\x01\x93\xa9*\\\xd0mW\x03\xb2r\xc6\x8cN\xf8#8\x8e\t\xfc\x08O.\x13\x9er2\x86\x81*[\xb1\xfb\xaaD\xc8\x83\xab\xc9\xda
#`\xac:\x02\xaf\x1a\xf9\xfb\x08\x93,\xd7q\x8b\xaev/\xd3}\xf3t*\xcf\xebUt\xe5[\x06\xe7\xab\x03eg\xe6hd\x81\xe3EH\\\x99MZW\x1c\xb9\x87"\xa4\xff\x03y\xf9Q#\x00B9qK\xbf\x99a"\n75\xc8Z\xa2\x03'

print(dpkt[0].show())
#展示包的详细信息,因为各个包有所不同,所以打印出来的效果可能会不同,我只展示了这一种包的打印效果,效果如下:
# ###[ Ethernet ]###
# dst = 68:a8: 28:2
# f: d7:0
# 9
# src = 58:00: e3:44: 66:fb
# type = IPv4
# ###[ IP ]###
# version = 4
# ihl = 5
# tos = 0x4
# len = 58
# id = 19004
# flags = DF
# frag = 0
# ttl = 200
# proto = tcp
# chksum = 0x6875
# src = 172.28.223.3
# dst = 172.31.200.200
# \options \
#     ###[ TCP ]###
# sport = 49688
# dport = 9988
# seq = 2674031876
# ack = 3838184596
# dataofs = 5
# reserved = 0
# flags = PA
# window = 513
# chksum = 0xbe17
# urgptr = 0
# options = []
# ###[ Raw ]###
# load = "\x01LVSIs'\\x9e0\n\x00\x00\x00\x00\x00\x00\x00\x00"
# 
# 
# None


print(dpkt[0].time)
# 打印时间,打印效果如下:
# 1639643824.65736


print(dpkt[0].fields)
# {'dst': '01:00:5e:7f:ff:fa', 'src': '58:00:e3:44:66:fb', 'type': 2048}

#打印dpkt[0].show()中的信息

#例如打印上述IP里的src
print(dpkt[0][IP].src)

#例如打印TCP中的sport
print(dpkt[0]["TCP"].sport)
#0是指第0个包,如果想看第二个包,可以将0改为1,如果想遍历所有包,可以用循环替代里面的数字
#注意,有的包里可能没有TCP,甚至没有IP,遍历时需要判断




插入数据库

这里就不讲了,参考其他资料

整体代码

capture.yp


import Database
from scapy.all import *


def get_all_pcap(ifs, size=10, filter=""):
    # 抓包
    pcaps = sniff(iface=ifs, count=size, filter=filter)
    # 保存数据包到文件
    # wrpcap("pc2.pcap", dpkt)
    data = []
    for item in pcaps:
        if item['Ethernet'].type == 2048:
            # ipv4
            ethernet_type = 'IPV4'
            # 判断tcp还是udp
            if item["IP"].proto == 6:
                sport = item['TCP'].sport
                dport = int(re.sub(r'[\(\)\,]', "", str(item['TCP'].dport)))
                tcp_udp = 'TCP'
                tcp_type = item['TCP'].flags
            else:
                sport = item['UDP'].sport
                dport = re.sub(r'[\(\)\,]', "", str(item['UDP'].dport))
                tcp_udp = 'UDP'
                tcp_type = 'null'
            src_ip = re.sub(r'[\(\)\,]', "", str(item['IP'].src))
            dst_ip = re.sub(r'[\(\)\,]', "", str(item['IP'].dst))
        elif item['Ethernet'].type == 2054:
            # ARP
            ethernet_type = 'ARP'
            src_ip = item['ARP'].psrc
            dst_ip = item['ARP'].pdst
            sport = 'null'
            dport = 'null'
            tcp_udp = 'null'
            tcp_type = 'null'
        else:
            # ipv6
            ethernet_type = 'IPV6'
            src_ip = item['IPv6'].src
            dst_ip = item['IPv6'].dst
            sport = 'null'
            dport = 'null'
            tcp_udp = 'null'
            tcp_type = 'null'
        time = item.time
        # 向数组中插入数据
        data.append([
            ethernet_type,
            src_ip,
            dst_ip,
            sport,
            dport,
            tcp_udp,
            str(tcp_type),
            int(time)
        ])
    return data


def insertToSQL(data):
    field = ['ethernet_type', 'src_ip', 'dst_ip', 'sport', 'dport', 'TCP_UDP', 'tcp_type', 'time']
    # 插入数据
    result = Database.Database().insert_all('pack_info', field, data)
    if result == 0:
        return 'success'
    else:
        return 'error'


def main():
    # 抓包
    # ifs = 'WLAN'  # 网卡
    data = get_all_pcap('WLAN', 100, 'tcp')
    # 插入数据库
    result = insertToSQL(data)
    print(result)


if __name__ == '__main__':
    main()

Datebase.py

import pymysql.cursors


class Database:

    connected = False
    __conn = None
    # 构造函数,初始化时直接连接数据库
    def __init__(self):
        conf = {
            'host': 'ip',
            'port': 3306,
            'user': '用户名',
            'pw': '密码',
            'db': '数据库'}
        if type(conf) is not dict:
            print('错误: 参数不是字典类型!')
        else:
            for key in ['host', 'port', 'user', 'pw', 'db']:
                if key not in conf.keys():
                    print('错误: 参数字典缺少 %s' % key)
            if 'charset' not in conf.keys():
                conf['charset'] = 'utf8'
        try:
            self.__conn = pymysql.connect(
                host=conf['host'],
                port=conf['port'],
                user=conf['user'],
                passwd=conf['pw'],
                db=conf['db'],
                charset=conf['charset'],
                cursorclass=pymysql.cursors.DictCursor)
            self.connected = True
        except pymysql.Error as e:
            print('数据库连接失败:', end='')

    # 插入一条数据到数据表
    def insert_one(self, table, val_obj):
        sql_top = 'INSERT INTO ' + table + ' ('
        sql_tail = ') VALUES ('
        try:
            for key, val in val_obj.items():
                sql_top += key + ','
                if isinstance(val,int):
                    sql_tail += str(val) + ','
                else:
                    sql_tail += '\'' + val + '\'' + ','
            sql = sql_top[:-1] + sql_tail[:-1] + ')'
            # 打印sql语句
            # print(sql)
            # exit()
            with self.__conn.cursor() as cursor:
                cursor.execute(sql)
            self.__conn.commit()
            return self.__conn.insert_id()
        except pymysql.Error as e:
            self.__conn.rollback()
            return False

    def insert_all(self,table,field,record):
        sql_top = 'INSERT INTO ' + table + ' ('
        sql_tail = ') VALUES ('
        try:
            for val in field:
                sql_top += val + ','
            for i in record:
                for j in i:
                    if isinstance(j, int):
                        sql_tail += str(j) + ','
                    else:
                        sql_tail += '\'' + j + '\'' + ','

                sql_tail = sql_tail[:-1] + '),('
            sql = sql_top[:-1] + sql_tail[:-2]
            # 打印sql语句
            # print(sql)
            # exit()
            with self.__conn.cursor() as cursor:
                cursor.execute(sql)
            self.__conn.commit()
            return self.__conn.insert_id()
        except pymysql.Error as e:
            self.__conn.rollback()
            return False

    # 销毁对象时关闭数据库连接
    def __del__(self):
        try:
            self.__conn.close()
        except pymysql.Error as e:
            pass

    # 关闭数据库连接
    def close(self):
        self.__del__()

纯属记录个人学习过程,我也是刚开始学python,我感觉上述代码肯定有错误的地方,若有不正确或不清晰的地方,欢迎指正。。

其中有些知识参考了如下连接,感谢大哥

python 抓包与解包_医然-CSDN博客_python抓包

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用python抓包并分析后存入数据库,或直接分析tcpdump和wireshark抓到的包,并存入数据库 的相关文章

  • Python 的键盘中断不会中止 Rust 函数 (PyO3)

    我有一个使用 PyO3 用 Rust 编写的 Python 库 它涉及一些昂贵的计算 单个函数调用最多需要 10 分钟 从 Python 调用时如何中止执行 Ctrl C 好像只有执行结束后才会处理 所以本质上没什么用 最小可重现示例 Ca
  • 将 saxon 与 python 结合使用

    我需要使用 python 处理 XSLT 目前我正在使用仅支持 XSLT 1 的 lxml 现在我需要处理 XSLT 2 有没有办法将 saxon XSLT 处理器与 python 一起使用 有两种可能的方法 设置一个 HTTP 服务 接受
  • 将 Matplotlib 误差线放置在不位于条形中心的位置

    我正在 Matplotlib 中生成带有错误栏的堆积条形图 不幸的是 某些层相对较小且数据多样 因此多个层的错误条可能重叠 从而使它们难以或无法读取 Example 有没有办法设置每个误差条的位置 即沿 x 轴移动它 以便重叠的线显示在彼此
  • 使 django 服务器可以在 LAN 中访问

    我已经安装了Django服务器 可以如下访问 http localhost 8000 get sms http 127 0 0 1 8000 get sms 假设我的IP是x x x x 当我这样做时 从同一网络下的另一台电脑 my ip
  • OpenCV Python cv2.mixChannels()

    我试图将其从 C 转换为 Python 但它给出了不同的色调结果 In C Transform it to HSV cvtColor src hsv CV BGR2HSV Use only the Hue value hue create
  • 从字符串中删除识别的日期

    作为输入 我有几个包含不同格式日期的字符串 例如 彼得在16 45 我的生日是1990年7月8日 On 7 月 11 日星期六我会回家 I use dateutil parser parse识别字符串中的日期 在下一步中 我想从字符串中删除
  • 如何在 Python 中检索 for 循环中的剩余项目?

    我有一个简单的 for 循环迭代项目列表 在某些时候 我知道它会破裂 我该如何退回剩余的物品 for i in a b c d e f g try some func i except return remaining items if s
  • 使用 on_bad_lines 将 pandas.read_csv 中的无效行写入文件

    我有一个 CSV 文件 我正在使用 Python 来解析该文件 我发现文件中的某些行具有不同的列数 001 Snow Jon 19801201 002 Crom Jake 19920103 003 Wise Frank 19880303 l
  • 根据列值突出显示数据框中的行?

    假设我有这样的数据框 col1 col2 col3 col4 0 A A 1 pass 2 1 A A 2 pass 4 2 A A 1 fail 4 3 A A 1 fail 5 4 A A 1 pass 3 5 A A 2 fail 2
  • 测试 python Counter 是否包含在另一个 Counter 中

    如何测试是否是pythonCounter https docs python org 2 library collections html collections Counter is 包含在另一个中使用以下定义 柜台a包含在计数器中b当且
  • 绘制方程

    我正在尝试创建一个函数 它将绘制我告诉它的任何公式 import numpy as np import matplotlib pyplot as plt def graph formula x range x np array x rang
  • 如何在Python中获取葡萄牙语字符?

    我正在研究葡萄牙语 角色看起来很奇怪 我怎样才能解决这个问题 代码 import feedparser import random Vou definir os feeds feeds conf feedurl http pplware s
  • 如何使用Python创建历史时间线

    So I ve seen a few answers on here that helped a bit but my dataset is larger than the ones that have been answered prev
  • Fabric env.roledefs 未按预期运行

    On the 面料网站 http docs fabfile org en 1 10 usage execution html 给出这个例子 from fabric api import env env roledefs web hosts
  • 如何在seaborn displot中使用hist_kws

    我想在同一图中用不同的颜色绘制直方图和 kde 线 我想为直方图设置绿色 为 kde 线设置蓝色 我设法弄清楚使用 line kws 来更改 kde 线条颜色 但 hist kws 不适用于显示 我尝试过使用 histplot 但我无法为
  • 每个 X 具有多个 Y 值的 Python 散点图

    我正在尝试使用 Python 创建一个散点图 其中包含两个 X 类别 cat1 cat2 每个类别都有多个 Y 值 如果每个 X 值的 Y 值的数量相同 我可以使用以下代码使其工作 import numpy as np import mat
  • 对年龄列进行分组/分类

    我有一个数据框说df有一个柱子 Ages gt gt gt df Age 0 22 1 38 2 26 3 35 4 35 5 1 6 54 我想对这个年龄段进行分组并创建一个像这样的新专栏 If age gt 0 age lt 2 the
  • 发送用户注册密码,django-allauth

    我在 django 应用程序上使用 django alluth 进行身份验证 注册 我需要创建一个自定义注册表单 其中只有一个字段 电子邮件 密码将在服务器上生成 这是我创建的表格 from django import forms from
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • 使用 Python 的 matplotlib 选择在屏幕上显示哪些图形以及将哪些图形保存到文件中

    我想用Python创建不同的图形matplotlib pyplot 然后 我想将其中一些保存到文件中 而另一些则应使用show 命令 然而 show 显示all创建的数字 我可以通过调用来避免这种情况close 创建我不想在屏幕上显示的绘图

随机推荐

  • ethercat foe字节对齐解决方案

    发现ecat从站的代码没实现字节对齐 头是3字节 在转换foe数据会丢数数据 修改前 brief Mailbox header typedef struct MBX STRUCT PACKED START UINT16 Length lt
  • web学习笔记

    常用属性 1 Html基础 3 常用快捷键 3 认识大前端
  • 大规模分布式消息中间件简介

    大规模分布式消息中间件简介 当前各种 RPC 中间件技术已经广泛应用于各个领域 其中 服务器之间消息通讯这种功能广泛应用于这些中间件中 于是 将这种面向消息的中间件 Message Oriented Middleware MOM 抽象出来
  • Unity Shader之——UV旋转动画

    Unity中通过Shader实现UV旋转动画 实现一个旋转效果 并且可以控制速度 方法是 以纹理中心为旋转中心 直接上代码如下 Shader Custom Simple Properties Color Color Color 1 1 1
  • How do I develop a service?

    CXF provides you with many options to build services This guide is meant to give you a quick overview of those options a
  • Failed to convert value of type ‘java.lang.String’ to required type ‘java.util.Date’

    springboot项目在接收时间类型的时候 报Failed to convert value of type java lang String to required type java util Date 的错误 这句话的意思是 把字符
  • matplotlib基础作图方法总结

    学习过程中稍微总结一下 有问题的话各位大佬可以指出来 用jupyter作图 代码如下 import numpy as np import matplotlib pyplot as plt 在jupyter中画图时 想要显示图需要 matpl
  • Java中的魔法值和解决方法

    目录 一 什么是魔法值 二 解决方法 一 什么是魔法值 魔法数值 魔法数字 魔法值 这是一个东西 不同的叫法 所谓魔法值 是指在代码中直接出现的数值 只有在这个数值记述的那部分代码中才能明确了解其含义 数字意义必须通过阅读其他代码才能推断出
  • “AI+算力”组合的潜力和机遇

    随着人工智能技术的飞速发展 AI 算力 的结合应用已成为科技行业的热点话题 甚至诞生出 AI 算力 最强龙头 的网络热门等式 这个结合不仅可以提高计算效率 还可以为各行各业带来更强大的数据处理和分析能力 从而推动创新和增长 在我看来 这个时
  • 【深度学习】yolov5 tag7.0 实例分割 从0到1的体会,从模型训练,到量化完成,bug避坑

    这里记录下yolov5 tag7 0的实例分割 因为也用过paddle家族的实例分割 能够训练出来 但是开放restiful api时遇到点小问题 还是yolov爽啊 通过这篇博文 您可以一步步的搭建自己的分割网络 文章目录 前言 一 小试
  • maxwell小白入门

    执行同步binlog数据命令路径 maxwell安装目录下执行启动命令 增量同步命令 bin maxwell config conf meituan 文件目录 具体配置文件名 properties daemon 采集历史数据 bin max
  • Thief in a Shop 【CodeForces - 632E】【背包】

    题目链接 给了N个物品 每个物品无限个 我们要的是求刚好我们拿了K个物品的时候 能组成哪几种数 我们可以想个办法去填充 那么就需要有一个所谓的0状态 然后假如不足K个的时候 就可以拿这个所谓的0状态来填充了 所以 我们把所有的数排序 然后都
  • @FeignClient注解属性

    FeignClient value run product fallback ProductClientServiceFallBack class FeignClient name runClient url localhost 8001
  • Python安装(MacOS )

    1 打开网址 Welcome to Python org 2 点击下载 downloads 2023年7月3日 最新版本 3 11 4 点击macOS 如图所示 点击会跳转到另一个界面 下滑至末尾 点击即可安装 64位的 3 得到一个pkg
  • GLSL常见函数[转]

    radians x 角度转弧度 degrees x 弧度转角度 sin x 正弦函数 传入值为弧度 三角函数与js相同 有cos余弦函数 tan正切函数 asin反正弦 acos反余弦 atan反正切等 pow x y xy exp x e
  • STM32F429通用定时器(TIM)

    目录 一 通用定时器是什么 1 计数模式 2 工作过程 编辑 3 内部时钟选择 二 通用定时器HAL库函数流程 三 小实验程序要求 四 代码实现 1 TIM h 2 TIM c 3 main c 一 通用定时器是什么 通用定时器包含一个 1
  • nginx 处理header 全攻略

    公司的网站要加入动态加速 一个直接的问题是经过转发 客户端请求的头被改了一部分 remote addr这个被改成了自定义的True Client IP 为了不改动已有的程序 需要在nginx那转发的时候把这个头重新打到Remote Addr
  • 代码随想录算法训练营第二十四天|理论基础 77. 组合

    理论基础 其实在讲解二叉树的时候 就给大家介绍过回溯 这次正式开启回溯算法 大家可以先看视频 对回溯算法有一个整体的了解 题目链接 文章讲解 代码随想录 视频讲解 带你学透回溯算法 理论篇 回溯法精讲 哔哩哔哩 bilibili 77 组合
  • nvm安装(Windows篇)

    nvm node version manager node版本管理工具 通过将多个node 版本安装在指定路径 然后通过 nvm 命令切换时 就会切换我们环境变量中 node 命令指定的实际执行的软件路径 使用场景 比如我们手上同时在做好几
  • 使用python抓包并分析后存入数据库,或直接分析tcpdump和wireshark抓到的包,并存入数据库

    准备工作 抓包首先要用到scapy包 安装scapy包 pip install scapy 在python代码中引用scapy包 from scapy all import 为了省事 直接import 你也可以根据你的需求去导入你想用到的