当前位置:   article > 正文

python|使用Scapy分析流量包_scapy抓包并解析

scapy抓包并解析

这次的作业要求是分析 ICMP 包的数量与比例,使用 Scapy 库一把梭了…

运行截图如下
在这里插入图片描述

Scapy

介绍

scapy 是 python 中能用于网络嗅探的非常强大的第三方库。可以用于构建、发送、解码和分析网络数据包。之前为了获取同一局域网下的其他主机的 IP 和 MAC,就使用了 “利用 scapy 伪造 arp 请求及解析回传数据包” 这种方法。

使用

Scapy 库可以直接在命令行使用,进入 Scapy 后显示如下页面就是安装成功了。
在这里插入图片描述

相关命令如下

# 查看所有支持的协议
ls()
# 列出ICMP协议头部字段格式 (只要想查看哪个协议的参数 括号里就填哪个协议
ls(ICMP)
# 列出ICMP包的信息
ICMP().show()
# 列出scapy的所有命令 
lsc()
# 列出scapy的配置参数
conf
# 退出scapy
exit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

编程实现

抓取一段时间的流量包,分析并输出其中 ICMP 包的数量及占比。

sniff 函数

使用 sniff 函数可以进行实时抓包和网络数据包分析,例如检测网络攻击、网络性能测试和协议分析等。函数返回值是一个流量包的列表。函数还有很多参数可以设置,函数定义如下

def sniff(count=0, store=1, offline=None, prn=None, filter=None, L2socket=None, timeout=None, opened_socket=None, stop_filter=None, iface=None, *args, **kargs)
  • 1

记录下部分参数的使用

filter:用于指定过滤条件,只有符合条件的数据包才会被抓取。使用wireshark里面的过滤语法。

iface:用于指定监听的网络接口,即写入要检测的网卡名。默认情况下将监听所有的网络接口。

prn:用于指定抓取到每个数据包后执行的函数。可以在该函数中对抓取到的数据包进行处理或分析。

count:用于指定抓取数据包的数量。默认值为0,表示持续监听。

timeout:用于指定抓取数据包的超时时间,即在给定的时间后停止嗅探。默认情况下将持续监听。

store:用于指定将抓取到的数据包保存或者丢弃,1保存,0丢弃。

实时抓包分析

监听 WLAN 接口的流量包(网卡名可以在 更改适配器选项 里面看),监听时间是 60s

from scapy.all import sniff


def count_packets(pkt):
    global icmp_count
    if pkt.haslayer('ICMP'):
        icmp_count += 1


icmp_count = 0
pkt = sniff(iface='Intel(R) Wi-Fi 6 AX200 160MHz', timeout=60, prn=count_packets)
print(pkt)
sum = len(pkt)
icmp_percent = (icmp_count / sum) * 100
print("一分钟内抓取到的流量包的总数: %d\nICMP包的数量: %d; 占比:%.2f%%" % (sum, icmp_count, icmp_percent))

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

监听所有接口的流量包,抓够100个包后结束

pkt = sniff(count=100, prn=count_packets)
  • 1

读取 pcap/pcapng 文件分析

在 wireshark 抓个包并导出 pcap/pcapng 文件,直接对此文件进行分析

import scapy.all as scapy


def count_packets(pkt):
    global icmp_count
    for packet in pkt:
        if packet.haslayer('ICMP'):
            icmp_count += 1


# pkt = scapy.rdpcap("./test.pcap")
pkt = scapy.rdpcap("./test.pcapng")
icmp_count = 0
count_packets(pkt)
print(pkt)
sum = len(pkt)
icmp_percent = (icmp_count / sum) * 100
print("流量包的总数: %d\nICMP包的数量: %d; 占比:%.2f%%" % (sum, icmp_count, icmp_percent))

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/156895
推荐阅读
相关标签
  

闽ICP备14008679号