scapy 解析pcap数据包笔记

scapy 解析pcap数据包笔记

wireshark 抓的包,格式更新了,scapy不能直接解析
tcpdump -w 的包,scapy 可以直接解析

1

from scapy.all import *
 
def analyzePcap(filepath):
 
    s1 = PcapReader(filepath)
 
    # data 是以太网 数据包
    data = s1.read_packet()
    ip_packet = data.payload
    icmp_packet = ip_packet.payload
    payload = icmp_packet.payload 
    original_payload = payload.original
    hex_payload = original_payload.hex()
 
    print(type(payload))     # <class 'scapy.packet.Raw'>
    print(type(original_payload)) # <class 'bytes'>
    print(type(hex_payload))    # <class 'str'>
 
    #print(type(data.payload))  #==><class 'scapy.layers.inet.IP'>  可以使用 help(scapy.layers.inet.IP) 查看帮助文档
 
analyzePcap('weird_pcap/linux_icmp_with_timestamp.pcap')

2

这里有一个python解析器 https://github.com/xiaxiaocao/pcap-parser 其他解析器也存在(dpkt),但要注意通信量可能是加密的。

http://fivezh.github.io/2016/05/31/Python-http-packet-parsing/

https://www.xmanblog.net/python-pcap/
Python解析pcap数据包

3

https://scapy.readthedocs.io/en/latest/usage.html#first-steps
在这里插入图片描述
在这里插入图片描述

WireWhale

https://github.com/isCharlesChang/WireWhale

在这里插入图片描述在这里插入图片描述
基于Python3.6,Scapy2.4,可以侦听、解析、构造并发送数据包的多功能抓包软件。其中还包括的扩展功能有:流量监测及攻击检测(Land攻击,Ping of Death)。软件目前支持解析的协议有:IP, IPv6, ARP, TCP, UDP, ICMP, SSDP, ICMPv6主要协议及扩展头, TLS。
主要功能
对网络接口的数据包尽可能多的捕获,可以将网卡设置为混杂模式,然后进行数据包的采集;
对捕获的数据包进行一定的解析,将报文在网络层和传输层逐字段展开,对数据包的协议类型、源目的地址、数据包截获时间、数据包内容进行分析;
根据用户不同的要求能够依据特定指定地址、特定协议类型相关包等条件进行自定义监视;
针对应用进行流量监测,监测结果输出实时流量图显示,管理员可设置流量预警线,当应用流量超过预警线时自动报警;
系统提供了多种方式显示结果,如以饼状图的形式统计ARP报文、TCP报文、UDP报文ICMP报文进行统计,以柱状图的形式统计IPv4报文、IPv6报文进行统计,以折线图的形式实时显示具体应用流量;
实现数据包保存,便于日后分析,即将捕获到的数据包,可另存为一个文件,并能被本系统所读取和展示;
伪造报文实现网络反攻击或进行深入微调IP或传输层的域。
主要模块

数据报文采集模块:完成网络接口数据的捕获、解析,可以根据用户定义条件组合来进行捕获,如只监视采用TCP或UDP协议的数据包,也可以监视用户希望关注的相关IP地址的数据包,同时完成数据封包日志记录,提高了系统的灵活性。此外,对IP类型、ARP、TCP、UDP、ICMP的数量进行统计。
应用流量监测模块:获取当前正在运行的应用进程,用户可选择一个应用进行流量监测,获取应用中流量信息,同时对一些常见的入侵攻击特征进行判断,如根据源目的地址是否相同判断Land攻击、IP头部长度是否过长判断ping拒绝服务攻击,并发出预警。
报文伪造模块:可以自行构造Ether、IP、TCP、UDP、ICMP、ARP报文,并选择send()、sendp()、sr()、srl()、srloop()五种方式发送报文以实现简单攻击或对TCP/IP进行调试。
界面显示模块:设计系统主窗口即数据报文采集界面、应用流量监测界面、报文伪造界面。并完成报文统计图的显示,流量图的显示。
源代码结构
img 存放程序中使用的图标。
capture_core.py 抓包程序的后台文件,主要用来生成数据包的摘要信息、分析数据包的结构、程序状态处理、下载速度和上传速度的更新等。
flow_monitor.py 流量监控程序的后台服务代码,实时更新速度、应用流量的过滤及摘要信息的生成、更新应用的网络连接等。
forged_packet 用于构造数据包并发送,可自定义数据包的每个字段,实现网络攻击或网络欺骗等功能。
main_ui.py 抓包程序的GUI代码,包括了快捷键的绑定以及可自定义字体和背景图片、已抓到数据包的摘要信息的展示、显示某个数据包的详细信息和十六进制数据等功能。
main.py 程序的入口。
monitor_system.py 流量监控的GUI代码,用于查看网络连接速度等。
tools.py 工具代码,用于获取网卡的NIC、格式的转换、网络连接速度的获取。
data.json 用于存放程序的配置信息。
环境依赖
Linux & Windows:

pip install psutil scapy matplotlib pyqt5

在windows下,还需要
Linux & Windows:

pip install wmi pywin32

使用方法
进入项目目录

cd WireWhale

主程序

python main.py

单独打开伪造包程序

python forged_packet.py

单独打开流量监测程序

python monitor_system.py

部分功能介绍
主界面主要包括5个部分:

菜单栏
文件:文件保存、打开,软件退出。
编辑:可自行设置主窗体字体。
捕获:捕获数据包的流程。
分析:两大拓展功能,应用流量监测和伪造数据包。
统计:报文统计。
帮助:即使用手册和关于软件。
工具栏
界面初始时,根据程序运行状态转移图只有开始键可以响应。
设置了标志位:start_flag、pause_flag、stop_flag、save_flag,用于对程序中一些函数的使用添加限制。开始、暂停、停止、重新开始四个按钮全部按照下图逻辑设置在什么情况下可响应。
下面为部分状态截图
起始状态
运行状态
暂停状态
停止状态
过滤器以及网卡选择
页面初始化时网卡选择下拉框获取网卡信息进行显示,如下图所示,默认全选。
报文显示
根据报文类型显示不同颜色,以进行明显的区别。
报文解析以树状结构显示,层次结构清晰明了。
抓包简略信息显示框定时滑到最底部。
状态栏(显示当前网卡、实时收发包速度、上传下载速度)
数据统计模块:绘制图使用python下最流行的数据处理框架Matplotlib绘制要求的统计图。

IP地址类型统计,以柱状图显示:
ARP等协议报文数量饼状图统计:
部分截图
主程序

数据包伪造

流量监控

4

dot1q就是802.1q,是vlan的一种封装方式。vlan封装有2种协议DOT1Q和 ISL,DOT1Q和 ISL的区别:DOT1Q是各类产品的VLAN通用协议模式,Dot1q是一种普遍使用的标准,适用所有交换机与路由设备。ISL是CISCO设备的专用协议,适用于Cisco设备。

5

读文件

def test(filepath):
    pcaps = rdpcap(filepath)
    for p in pcaps:
        print p.show()
        break

在这里插入图片描述
在这里插入图片描述
muXTCP
Writing your own flexible Userland TCP/IP Stack - Ninja Style!!!
https://events.ccc.de/congress/2005/fahrplan/events/529.en.html
在这里插入图片描述

6

读文件
packet_consummer(pkt)这个参数指对抓到的每一个包进行packet_consumer()函数处理即协议分析函数处理。

攻击

流量监测和攻击检测(Land攻击,Ping of Death)

https://scapy.net/

http

https://scapy.readthedocs.io/en/latest/api/scapy.layers.html
https://scapy.readthedocs.io/en/latest/api/scapy.packet.html

https://scapy.readthedocs.io/en/stable/build_dissect.html

用scapy解析出pcap文件的http报文

用scapy解析出pcap文件的http报文
https://blog.csdn.net/Yuberhu/article/details/64123516

https://blog.csdn.net/jjonger/article/details/81275120

1

Python | 解析pcap文件分析HTTP Request/Response报文
http://fivezh.github.io/2016/05/31/Python-http-packet-parsing/

from scapy.all import *
import scapy_http.http as http
import requests
import json

pkts = rdpcap('test.pcap')
req_list = []
for pkt in pkts:
    if TCP in pkt and pkt[TCP].fields['dport']==80 and pkt.haslayer(http.HTTPRequest):
        http_header = pkt[http.HTTPRequest].fields
        if 'Host' in http_header and '/article/content/' in http_header['Path']:
            req_url = 'http://' + http_header['Host'] + http_header['Path']
            req_list.append(req_url)

#print req_list
print str(len(req_list)) + ' toutiao request url achieved.'
f = open('result.log', 'w+')
record = 'title' + '\t' + 'source' + '\t' + 'src_link' + '\t' + 'publish_time' + '\t' + 'req_link' + '\n'
f.write(record)
for url in req_list:
    res = requests.get(url).text
    res = json.loads(res)
    if 'data' not in res:
        continue
    if 'h5_extra' not in res['data']:
        continue
    h5_extra = res['data']['h5_extra']
    title = h5_extra['title']
    source = h5_extra['source']
    src_link = h5_extra['src_link']
    publish_time = h5_extra['publish_time']

    record = title + '\t' + source + '\t' + src_link + '\t' + publish_time + '\t' + url + '\n'
    f.write(record.encode('utf-8'))
f.close()

1

https://github.com/HatBoy/Pcap-Analyzer

1.展示数据包基本信息
2.分析数据包协议
3.分析数据包流量
4.绘制出访问IP经纬度地图
5.提取数据包中特定协议的会话连接(WEB,FTP,Telnet)
6.提取会话中的敏感数据(密码)
7.简单的分析数据包中的安全风险(WEB攻击,暴力破解)
8.提取数据报中的特定协议的传输文件或者所有的二进制文件

将项目从Python2.X移植到Python3.X
修复了多个Bug

在这里插入图片描述
在这里插入图片描述
我这个也不会,你自己再找找其他博文吧,你可以看看snort或是netflow,dpdk之类的处理流量相关的文章表情包我也是刚学的菜鸡

11

#! /usr/bin/env python
from scapy.all import *
def arp_monitor_callback(pkt):
    if ARP in pkt and pkt[ARP].op in (1,2): #who-has or is-at
        return pkt.sprintf("%ARP.hwsrc% %ARP.psrc%")

sniff(prn=arp_monitor_callback, filter="arp", store=0)

22

def pack_callback(packet):
    print('-' * 50)
    print('新包来了:'+nowTime(packet.time)+'\n')
    p=packet
    print("%s, dst: %s,  src: %s, type: %s" %(p.name,p.dst,p.src,hex(p.type)))
    if 'IP' in p:
        ip=p.getlayer(IP)
        print("%s,Version:%s,src:%s,dst:%s,proto:%s,TLL:%s" % (ip.name, ip.version, ip.src, ip.dst, str(ip.proto), str(ip.ttl)))

    if 'TCP' in p:
        tcp=p.getlayer(TCP)
        print("%s,sport: %s,dport: %s, seq: %s, ack: %s, flags: %s" %( \
            tcp.name,str(tcp.sport),str(tcp.dport),\
            str(tcp.seq),str(tcp.ack),str(tcp.flags)))

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页