Python使用scapy模块发包收包

前言

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

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

包( packet )是网络通信传输中的数据单位,一般称之为数据包,其主要由源地址,目标地址,净载数据组成

它包括包头和包体,包头是固定长度,包体长度不变

简单了解下包的定义,下面我们来看看发包利器 scapy 的用法吧

一、常用命令

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

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

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

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

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

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 的确很强大,简单的几行命令就能实现发包收包,极大的节省了我们的开发时间

如果你深入学习它的每个命令,你会发现更多有趣的事情,当然这么强大的工具可不要拿来做坏事哦!

以上就是Python使用scapy模块发包收包的详细内容,更多关于Python用scapy模块发包收包的资料请关注我们其它相关文章!

(0)

相关推荐

  • python2.7使用scapy发送syn实例

    我就废话不多说了,大家看代码吧! from scapy.all import * def syn(): scrIP = '192.168.10.29' srcPort = 23345 desIP = '12.39.27.23' desPort = 8000 ip = IP(src=scrIP, dst=desIP) tcp = TCP(sport=srcPort, dport=desPort, seq=13131342, flags='S') pkg = ip/tcp # c->s syn re

  • Python中使用scapy模拟数据包实现arp攻击、dns放大攻击例子

    scapy是python写的一个功能强大的交互式数据包处理程序,可用来发送.嗅探.解析和伪造网络数据包,常常被用到网络攻击和测试中. 这里就直接用python的scapy搞. 这里是arp的攻击方式,你可以做成arp攻击. 复制代码 代码如下: #!/usr/bin/python """ ARP attack """ import sys, os from scapy.all import * if os.geteuid() != 0:    

  • Python3利用scapy局域网实现自动多线程arp扫描功能

    一.所需Python库 from scapy.all import * import threading 二.实现ip扫描 1.获取c段ip地址 在ARP()里面有ip地址,我们可以从里面提取出前3段出来 ARP().show() 然后通过从后查找最后一个.得到最后一段位数,然后总长度-最后一段长度就能取出前3段 tip=ARP().psrc print(tip[:(len(tip)-tip[::-1].find('.'))]) 2.arp扫描函数实现 然后就是建立函数实现扫描了,构造arp包-

  • 利用Python库Scapy解析pcap文件的方法

    每次写博客都是源于纳闷,python解析pcap这么常用的例子网上竟然没有,全是一堆命令行执行的python,能用吗?玩呢? pip安装scapy,然后解析pcap: import scapy from scapy.all import * from scapy.utils import PcapReader packets=rdpcap("./test.pcap") for data in packets: if 'UDP' in data: s = repr(data) print

  • Python Scapy随心所欲研究TCP协议栈

    1. 前言 如果只需要研究Linux的tcp协议栈行为,只需要使用packetdrill就能够满足我的所有需求.packetdrill才是让我随心所欲地撩tcp协议栈.packetdrill的简单使用手册. 然而悲剧的是,除了要研究Linux的TCP协议栈行为,还需要研究Windows的tcp协议栈的行为,Windows不开源,感觉里面应该有挺多未知的坑. 为了能够重现Windows的tcp协议栈的一些网络行为,这里使用python的scapy进行包构造撩撩Windows的tcp协议栈.scap

  • Python项目 基于Scapy实现SYN泛洪攻击的方法

    python3版本的Scapy--Scapy3k来实现一个简单的DDos. 首先实现SYN泛洪攻击(SYN Flood,是一直常用的DOS方式之一,通过发送大量伪造的TCP连接请求,使被攻击主机资源耗尽的攻击方式).TCP三次握手的过程在这里就不再赘述,SYN攻击则是客户端向服务器发送SYN报文之后就不再响应服务器回应的报文,由于服务器在处理TCP请求时,会在协议栈留一块缓冲区来存储握手的过程,如果超过一定的时间没有接收到客户端的报文,那么本次连接在协议栈中存储的数据就会被丢弃.攻击者如果利用这

  • python使用scapy模块实现ARP扫描的过程

    前言 上篇文章主要写了利用scapy实现ping扫描,这篇文章主要是利用scapy模块实现内网ARP扫描 实现过程 上篇文章中介绍了通过scapy来伪造包,那么ARP包的伪造过程这里不再详述,说一工具的简单整体流程 1.首先,实现单个IP的ARP包的发送和接收 2.其次,实现多进程同时多个ARP包的发送和接收 整体的实现流程与上个脚本的实现较为相似 单进程ARP包 包的构造: def scapy_arp_one(ip_address, queue=None): Packet = Ether(ds

  • Python利用scapy实现ARP欺骗的方法

    一.实验原理. 本次用代码实现的是ARP网关欺骗,通过发送错误的网关映射关系导致局域网内其他主机无法正常路由.使用scapy中scapy.all模块的ARP.sendp.Ether等函数完成包的封装与发送.一个简单的ARP响应报文发送: eth = Ether(src=src_mac, dst=dst_mac)#赋值src_mac时需要注意,参数为字符串类型 arp = ARP(hwsrc=src_mac, psrc=src_ip, hwdst=dst_mac, pdst=dst_ip, op=

  • Python基于scapy实现修改IP发送请求的方法示例

    本文实例讲述了Python基于scapy实现修改IP发送请求的方法.分享给大家供大家参考,具体如下: 今天同事想测试WAF的页面统计功能,所以需要模拟多个IP向多个域名发送请求,也就是需要修改源IP地址.这个如果使用socket库就比较麻烦了, 需要使用raw socket,相当麻烦.还好咱有scapy,轻松搞定. DOMAIN是我随机构造的域名库,SOURCE也是随机构造的源IP地址. #!/usr/bin/env python #-*-encoding:UTF-8-*- from scapy

  • python使用scapy模块实现ping扫描的过程详解

    关于scapy Scapy 是一个可以让用户发送.侦听和解析并伪装网络报文的Python程序.这些功能可以用于制作侦测.扫描和攻击网络的工具. 换言之, Scapy 是一个强大的操纵报文的交互程序.它可以伪造或者解析多种协议的报文,还具有发送.捕获.匹配请求和响应这些报文以及更多的功能. Scapy 可以轻松地做到像扫描(scanning).路由跟踪(tracerouting).探测(probing).单元测试(unit tests).攻击(attacks)和发现网络(network disco

  • python 的 scapy库,实现网卡收发包的例子

    问题: 测试时 收发流采用TestCenter.SmartBit等仪表来进行.如果仍采用其进行自动化冒烟,则会带来效率低.成本高的问题. 解决方案: 采用网卡来收发流,虽然有性能统计上的缺陷,但可以验证一些基本功能,且经济. 采用scapy模块, 1-获取计算机网卡的iface,并预先设计好用哪些iface进行收发流: 2-conf.L2listen对各个iface进行监听 3-subprocess.Popen来调用tShark.exe启动抓包,也可以调用ping.exe构造ping包 4-se

  • python通过scapy获取局域网所有主机mac地址示例

    python通过scapy获取局域网所有主机mac地址 复制代码 代码如下: #!/usr/bin/env python# -*- coding: utf-8 -*-from scapy.all import srp,Ether,ARP,confipscan='192.168.1.1/24'try:    ans,unans = srp(Ether(dst="FF:FF:FF:FF:FF:FF")/ARP(pdst=ipscan),timeout=2,verbose=False)exc

随机推荐