首页 > 编程语言 >盘点一款Python发包收包利器——scapy

盘点一款Python发包收包利器——scapy

时间:2023-04-23 15:34:01浏览次数:45  
标签:ARP 收包 pkt Python IP dst 发包 ff 数据包


潮平两岸阔,风正一帆悬。

    大家好,我是黄伟。今天跟大家讲的是Python 用于发送接受网络数据包的模块-------scapy。

前言

众所周知,我们每天上网都会有很多数据包需要发送,然后处理在接受在发送,这样一个循环往复的过程,

盘点一款Python发包收包利器——scapy_数据可视化

这里就显示了很多数据包的发送接收数据。那么,什么是包呢?下面一起看看。

包(packet)是网络通信传输中的数据单位,一般称之为数据包,其主要由源地址,目标地址,净载数据组成。包括包头和包体,包头是固定长度,包体长度不变。简单了解下包的定义,下面我们来看看发包利器scapy的用法吧。(参考资料来源:百度百科-数据包)

一、常用命令

1、ls():显示所有支持的数据包对象,可带参数也可不带,参数可以是任意具体的包。

盘点一款Python发包收包利器——scapy_数据挖掘_02

可以看出,它包含了全部的内容,如果我们想详细查看某个模块中的内容,比如说我想查看ARP ,tcp的话了,可以这样:

盘点一款Python发包收包利器——scapy_编程语言_03

在这里要告诉大家的是,我们必须要注意大小写,ls(ARP)这样才可以得出正确结果,ls(arp)是错误的。

2、lsc():列出所有函数

盘点一款Python发包收包利器——scapy_wireshark_04

满屏的英文,小编我头都是大的,不知道大家此时此刻是什么样的心情,哈哈哈哈。

3、hide_defaults():用来删除一些用户提供的那些和default value相同的项目

a=IP()
print(a.hide_defaults())

4.display():可以简单查看当前packet的各个参数的取值情况,

a=IP()
a.display()

5.更多命令

命令                                  作用
show_interfaces()                  显示网卡信息


str(pkt)                            组装数据包


hexdump(pkt)                        十六进制转储


ls(pkt)                          显示出字段值的列表


pkt.summary()                        一行摘要


pkt.show()                      针对数据包的展开视图


pkt.show2()             显示聚合的数据包(例如,计算好了的校验和)


pkt.sprintf()                   用数据包字段填充格式字符串


pkt.decode_payload_as()         改变payload的decode方式


pkt.psdump()                绘制一个解释说明的PostScript图表


pkt.pdfdump()                   绘制一个解释说明的PDF


pkt.command()               返回可以生成数据包的Scapy命令


nsummary()                      同上,但规定了数据包数量


conversations()                     显示一个会话图表


filter()                    返回一个lambda过滤后的数据包列表


hexdump()                       返回所有数据包的一个hexdump


import_hexcap()                 将hexdump重新导入到Scapy中


hexraw()                    返回所有数据包Raw layer的hexdump


padding()                   返回一个带填充的数据包的hexdump


nzpadding()                 返回一个具有非零填充的数据包的hexdump


plot()                      规划一个应用到数据包列表的lambda函数


make table()                    根据lambda函数来显示表格


traceroute("baidu.com")     查看IP路径的traceroute功能


export_object()             数据包转换成base64编码的Python数据结构


import_object()                     可以将输出重新导入


save_session()                  保存所有的session变量


load_session()                  读取保存的session


fuzz()      更改一些默认的不被计算的值(比如校验和checksums),更改的值是随机的,但是是符合字段的值的。

二、嗅探数据包

from scapy.all import *
pkt = sniff(iface = "Realtek PCIe GBE Family Controller",count = 3 ,filter='tcp',prn = lambda x: x.sprintf('{IP:%IP.src%->%IP.dst%\n}{Raw:%Raw.load%\n}'))


filter:过滤条件
iface:网卡接口名称
count:数据包数量
prn:回调函数,通常与lambda搭配使用
sprintf()函数控制输入信息


抓取源地址为192.168.3.3的端口为80的tcp报文:
sniff(filter="ip src 192.168.3.3 and tcp and tcp port 80", prn=lambda x:x.summary())


抓取目的地址网段为192.168.3.3/24的报文:
sniff(filter="dst net 192.168", prn=lambda x:x.summary())


抓取非ICMP的报文:
sniff(filter="not icmp", prn=lambda x:x.summary())




将抓取到的报文的summary打印出来:
sniff(filter="icmp", prn=lambda x:x.summary(), count=10)


将所有IP报文的源地址打印出来:
sniff(filter="icmp", prn=lambda x:x[IP].src, count=10)

三、构造数据包

pkt= Ether()/IP(dst='192.168.1.2')/TCP(dport=80)

提到数据包,不得不说各个协议了,提到协议,又自然而然想到了osi七层模型。

OSI七层网络模型

TCP/IP四层概念模型

对应网络协议

应用层(Application)

应用层

HTTP、TFTP, FTP, NFS, WAIS、SMTP

表示层(Presentation)

应用层

Telnet, Rlogin, SNMP, Gopher

会话层(Session)

应用层

SMTP, DNS

传输层(Transport)

传输层

TCP, UDP

网络层(Network)

网络层

IP, ICMP, ARP, RARP, AKP, UUCP

数据链路层(Data Link)

数据链路层

FDDI, Ethernet, Arpanet, PDN, SLIP, PPP,

物理层(Physical)

数据链路层

IEEE 802.1A, IEEE 802.2到IEEE 802.11

以上便是各个网络协议对应的osi模型,那么各个协议的用法是怎样的了,下面我们一起来看下。

四、各个协议用法

1、构造一个 IP 包,并传入一些参数

#构造一个 IP 包,并传入一些参数
pkt = IP(dst="192.168.1.2",ttl=10)
ls(pkt)  
version:版本号
ihl:头长度
tos:服务类型
len:IP数据包总长
id:标识符
flags:标记
flag:片偏移
ttl:生存时间
proto:协议类型
chksum:头部校验
src:源IP地址
dst:目的IP地址
options:可选项

2、构造ARP包

#构造ARP包
ARP(op=1, hwdst="ff:ff:ff:ff:ff:ff", pdst=ip_address)
#arp类的构造函数列表:
ls(ARP)
hwtype     : XShortField          = (1)  值为1表示以太网地址,其它还可能表示令牌环地址
ptype      : XShortEnumField      = (2048)  0x0800表示IP地址,其它还可能是ICMP/IGMP
hwlen      : ByteField            = (6)   ARP报文中,它的值为6
plen       : ByteField            = (4)  ARP报文中,它的值为4
op         : ShortEnumField       = (1) 取值为1或者2,代表ARP请求或者响应包。1.ARP请求,2.ARP应答,3.RARP请求,4.RARP应答
 
hwsrc      : ARPSourceMACField    = (None) 发送方Mac地址。
psrc       : SourceIPField        = (None) 发送方IP地址。
hwdst      : MACField             = ('00:00:00:00:00:00') 目标Mac地址。
pdst       : IPField              = ('0.0.0.0') 目标IP地址。

3、构造Ether

#构造Ether
Ether(dst="ff:ff:ff:ff:ff:ff")
ls(Ether)
dst        : DestMACField         = (None) 目的MAC
src        : SourceMACField       = (None) 源MAC
type       : XShortEnumField      = (36864)
构造一个以太网数据包通常需要指定目标和源MAC地址,如果不指定,默认发出的就是广播包ff:ff:ff:ff:ff:ff

4、构造TCP包

#构造TCP包
sport      : ShortEnumField                      = 20              (20) 目标端口
dport      : ShortEnumField                      = 80              (80)  源端口
seq        : IntField                            = 0               (0)
ack        : IntField                            = 0               (0)
dataofs    : BitField (4 bits)                   = None            (None)
reserved   : BitField (3 bits)                   = 0               (0)
flags      : FlagsField (9 bits)                 = <Flag 2 (S)>    (<Flag 2 (S)>)
window     : ShortField                          = 8192            (8192)
chksum     : XShortField                         = None            (None)
urgptr     : ShortField                          = 0               (0)
options    : TCPOptionsField                     = []              (b'')

五、发包,收包

可分为两种情况,用法如下:

1、只发不收

send(pkt, inter=0, loop=0, count=1, iface=N) 
pkt:数据包
inter:发包间隔时间
count:发包数量
iface:网卡接口名称


send(),在第三层发包,没有接收功能;send(IP(dst="www.baidu.com",ttl=2)/ICMP())


sendp(),在第二层发包,没有接收功能。sr(Ether()/IP(dst="www.baidu.com"))

2、发包且收包

sr()和sr1()都是在第三层发包,sr1表示只接收第一个回复。


sr(IP(dst="www.baidu.com",ttl=(1,4))/TCP(dport=[21,23,80],flags="S")) 返回两个值


sr1(IP(dst="www.baidu.com",ttl=(1,4))/ICMP()) 


srloop(IP(dst="www.baidu.com",ttl=1)/ICMP()) #不停的ping百度


srloop(IP(dst="www.baidu.com",ttl=1)/ICMP(),inter=3,count=2) #每隔3秒ping一次,一共执行两次


#inter表示间隔,count记录次数


srp()和srp1()都是根据第二层发包,srp1表示只接收第一个回复
srp(Ether()/IP(dst="www.baidu.com"))
srp1(Ether()/IP(dst="www.baidu.com"))

六、SYN半开式扫描

当TCP链接指定端口时,flags参数设为S时则为半开式扫描,若此时该端口处于监听状态,返回syn/ack,否则返回rst/ack.

sr1(IP(dst="192.168.1.2")/TCP(dport=80,flags="S"))

七、数据包序列化,反序列化

序列化:将数据包对象保存为pcap文件

反序列化:读取pcap文件中的内容

pkt= Ether()/IP(dst='192.168.1.2')/TCP(dport=80)
#将嗅探到的数据包内容写到pcap文件中 
wrpcap("hw.pcap",pkt)


#读取pcap文件。
read=rdpcap('hw.pcap')
print(read[1])#打印嗅探到的包的数据

八、数据包与字符串转换

更加直观清晰的分析数据。

zfc= str(pkts[0]) 
z= Ether(zfc)

九、导入导出base64编码

为了方便我们对数据进行加密而发明的一种方式。

export_object(str(pkts[0])) 导出数据包
new_Pkt = import_object() #将上一步导出的字符串填入

十、离线数据包的解析

如果我们捕获到数据包,未联网的情况下如何解析呢?

现在就可以使用我们的离线数据包分析数据了:

sniff(offline = "hw.pcap")#离线数据包

总结

通过上面的学习,我们对scapy算是有了一个基础性的认识了,scapy的确很强大,简单的几行命令就能实现发包收包,极大的节省了我们的开发时间。如果你深入学习它的每个命令,你会发现更多有趣的事情,当然这么强大的工具可不要拿来做坏事哦!!


标签:ARP,收包,pkt,Python,IP,dst,发包,ff,数据包
From: https://blog.51cto.com/u_13389043/6217760

相关文章

  • 说说Python集合的那些事儿
    大家好,我是IT共享者,人称皮皮。今天给大家来捋一捋Python集合。一、什么是集合?集合(set)和字典(dict)类似,它是一组key的集合,但不存储value。集合的特性就是:key不能重复。二、集合常用操作1.创建集合set的创建可以使用{}也可以使用set函数:s1={'a','b','c','a','d','b'}......
  • Cmd输入python会打开 Windows 应用商店 解决方法
    当我在CMD中输入Python时,它会打开Windows应用商店让我下载Python3.7。这个问题今天无缘无故地开始了。我没有更改或下载有关Python的任何内容,并且已经尝试重新安装Python,并且Path环境变量是正确的。Answers使用Windows搜索栏查找“管理应用执行别名”。Pytho......
  • python matplotlib 散点图的拟合直线的简单示例
     #samplepointsX=[0,5,10,15,20]Y=[0,7,10,13,20]#solveforaandbdefbest_fit(X,Y):xbar=sum(X)/len(X)ybar=sum(Y)/len(Y)n=len(X)#orlen(Y)numer=sum([xi*yiforxi,yiinzip(X,Y)])-n*xbar*y......
  • Jmeter调用Python脚本实现参数互传(OS进程取样器)
    1:新增取样器--->os进程取样器--》配置命令、命令行参数;2.os进程取样器命令行地址下的bat文件的内容:  3.py文件接收jmeter传递过来的值: 4.正则提取os进程提取器返回的值,也就是py文件返回的值:  ......
  • redis高级-day6——python操作哨兵、python操作集群、缓存优化
    目录一、python操作哨兵二、python操作集群三、缓存优化3.1redis缓存更新策略3.2缓存击穿,雪崩,穿透一、python操作哨兵#高可用架构后---》不能直接连某一个主库了---》主库可能会挂掉,后来它就不是主库了#之前学的连接redis的操作,就用不了了importredisconn=redis.Red......
  • Python partition使用技巧
    partition()方法用来根据指定的分隔符将字符串进行分割。如果字符串包含指定的分隔符,则返回一个3元的元组,第一个为分隔符左边的子串,第二个为分隔符本身,第三个为分隔符右边的子串。flask源代码的run模块中,出现的代码当做示例defrun():......_host='127.0.0.1'......
  • Python类变量和实例变量,傻傻分不清楚
    今日鸡汤坐看云卷云舒,静听花开花落。大家好,我是Python进阶者。一、前言前几天在Python最强王者交流群有个叫【Chloé】的粉丝问了一个关于Python类变量和实例变量的问题,这里拿出来给大家分享下,一起学习。这个粉丝在法国留学,所以提问是英文的,当然了英文看上去也不难,有点二级英文基......
  • 盘点一份JS逆向代码转换为Python代码的教程
    今日鸡汤云母屏风烛影深,长河渐落晓星沉。大家好,我是Python进阶者。前言前几天在Python星耀和最强王者交流群里边,好几个人都在问JS逆向的视频和相关代码,看来都在学习进阶的知识,真是卷不动了。正好这几天我也在看JS的部分学习资料,看到一个还不错的案例,这里拿出来给大家分享一下,也当记......
  • 每次记歌词——使用Python自动发邮件提醒你记歌词
    今日鸡汤八骏日行三万里,穆王何事不重来。大家好,我是Python进阶者。前言前几天在Python交流群里边,【冫马讠成】大佬分享了一个有趣的代码,用于定时发送歌词到邮箱,觉得挺有意思,这里拿出来给大家分享。实现思路实现思路倒是不难,其一是Python网络爬虫,将网页上的歌词信息抓取到,然后存起......
  • 盘点4种方法用Python批量提取[]括号内的第一个元素
    今日鸡汤葡萄美酒夜光杯,欲饮琵琶马上催。大家好,我是Python进阶者。前言前几天在才哥交流群里边遇到一个叫【上海-数据分析-小粒】的粉丝提了一个小问题,如下:数据如下:咋一看,这个题目倒是也确实不太难,群里提供思路的人也很多,一起来看看吧!思路和实现方法针对这个问题,群里的小伙伴纷纷......