Scapy操作数据包的一些用法

Zss 发表于:

安装的是scapy2.4,pip install scapy,有时候安装失败什么的,似乎是因为网速的问题,所以直接下载了包来手动安装

文件:scapy-2.4.0

这个不是爬虫的框架,而是处理数据包的,因为两个名字实在太相似了,scapy和scrapy。。。

运行的方式:

(1)若在python中来使用则导入此模块

from scapy.all import *

(2)或者是在cmd中直接运行   scapy

则会进入到类似于ipython的交互界面,在这中间可以使用到scapy

一.数据包的读取,和写入

from scapy.all import *

pack = rdpcap('test.pcap')
print pack
for i in pack:
    print repr(i)
C:\Python27\python.exe C:/Users/Zss-pc/Desktop/Py/pcap/test.py
<test.pcap: TCP:0 UDP:11 ICMP:0 Other:0>
<Ether  dst=00:19:be:2c:12:0c src=00:18:be:27:42:0c type=0x800 |<IP  version=4 ihl=5 tos=0x0 len=46 id=0 flags=DF frag=0 ttl=64 proto=udp chksum=0xb8b2 src=192.168.0.100 dst=192.168.0.88 options=[] |<UDP  sport=0 dport=0 len=26 chksum=0x7dad |<Raw  load='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' |>>>>
<Ether  dst=00:19:be:2c:12:0c src=00:18:be:27:42:0c type=0x800 |<IP  version=4 ihl=5 tos=0x0 len=46 id=0 flags=DF frag=0 ttl=64 proto=udp chksum=0xb86e src=192.168.0.1 dst=192.168.0.255 options=[] |<UDP  sport=0 dport=0 len=26 chksum=0x7d69 |<Raw  load='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' |>>>>
<Ether  dst=00:19:be:2c:12:0c src=00:18:be:27:42:0c type=0x800 |<IP  version=4 ihl=5 tos=0x0 len=46 id=0 flags=DF frag=0 ttl=64 proto=udp chksum=0xb86e src=192.168.0.1 dst=192.168.0.255 options=[] |<UDP  sport=0 dport=0 len=26 chksum=0x7d69 |<Raw  load='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' |>>>>
<Ether  dst=00:19:be:2c:12:0c src=00:18:be:27:42:0c type=0x800 |<IP  version=4 ihl=5 tos=0x0 len=46 id=0 flags=DF frag=0 ttl=64 proto=udp chksum=0xb86e src=192.168.0.1 dst=192.168.0.255 options=[] |<UDP  sport=0 dport=0 len=26 chksum=0x7d69 |<Raw  load='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' |>>>>
<Ether  dst=00:19:be:2c:12:0c src=00:18:be:27:42:0c type=0x800 |<IP  version=4 ihl=5 tos=0x0 len=46 id=0 flags=DF frag=0 ttl=64 proto=udp chksum=0xb86e src=192.168.0.1 dst=192.168.0.255 options=[] |<UDP  sport=0 dport=0 len=26 chksum=0x7d69 |<Raw  load='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' |>>>>
<Ether  dst=00:19:be:2c:12:0c src=00:18:be:27:42:1c type=0x800 |<IP  version=4 ihl=5 tos=0x0 len=46 id=0 flags=DF frag=0 ttl=64 proto=udp chksum=0xb86e src=192.168.0.1 dst=192.168.0.255 options=[] |<UDP  sport=0 dport=0 len=26 chksum=0x7d69 |<Raw  load='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' |>>>>
<Ether  dst=00:19:be:2c:12:0c src=00:18:be:27:42:2c type=0x800 |<IP  version=4 ihl=5 tos=0x0 len=46 id=0 flags=DF frag=0 ttl=64 proto=udp chksum=0xb86e src=192.168.0.1 dst=192.168.0.255 options=[] |<UDP  sport=0 dport=0 len=26 chksum=0x7d69 |<Raw  load='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' |>>>>
<Ether  dst=00:19:be:2c:12:0c src=00:18:be:27:42:4c type=0x800 |<IP  version=4 ihl=5 tos=0x0 len=46 id=0 flags=DF frag=0 ttl=64 proto=udp chksum=0xb86e src=192.168.0.1 dst=192.168.0.255 options=[] |<UDP  sport=0 dport=0 len=26 chksum=0x7d69 |<Raw  load='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' |>>>>
<Ether  dst=00:19:be:2c:12:0c src=00:18:be:27:42:5c type=0x800 |<IP  version=4 ihl=5 tos=0x0 len=46 id=0 flags=DF frag=0 ttl=64 proto=udp chksum=0xb86e src=192.168.0.1 dst=192.168.0.255 options=[] |<UDP  sport=0 dport=0 len=26 chksum=0x7d69 |<Raw  load='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' |>>>>
<Ether  dst=00:19:be:2c:12:0c src=00:18:be:27:42:4f type=0x800 |<IP  version=4 ihl=5 tos=0x0 len=46 id=0 flags=DF frag=0 ttl=64 proto=udp chksum=0xb86e src=192.168.0.1 dst=192.168.0.255 options=[] |<UDP  sport=0 dport=0 len=26 chksum=0x7d69 |<Raw  load='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' |>>>>
<Ether  dst=00:19:be:2c:12:0c src=00:18:be:27:42:5f type=0x800 |<IP  version=4 ihl=5 tos=0x0 len=46 id=0 flags=DF frag=0 ttl=64 proto=udp chksum=0xb86e src=192.168.0.1 dst=192.168.0.255 options=[] |<UDP  sport=0 dport=0 len=26 chksum=0x7d69 |<Raw  load='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' |>>>>

打印整个数据包列表的数据包数量等信息

print pack

打印某个数据包的简单信息

print repr(i)

打印数据包详细情况

ls(数据包)

dst        : DestMACField                        = '00:19:be:2c:12:0c' (None)
src        : SourceMACField                      = '00:18:be:27:42:0c' (None)
type       : XShortEnumField                     = 2048            (36864)
--
version    : BitField (4 bits)                   = 4               (4)
ihl        : BitField (4 bits)                   = 5               (None)
tos        : XByteField                          = 0               (0)
len        : ShortField                          = 46              (None)
id         : ShortField                          = 0               (1)
flags      : FlagsField (3 bits)                 = <Flag 2 (DF)>   (<Flag 0 ()>)
frag       : BitField (13 bits)                  = 0               (0)
ttl        : ByteField                           = 64              (64)
proto      : ByteEnumField                       = 17              (0)
chksum     : XShortField                         = 47214           (None)
src        : SourceIPField                       = '192.168.0.1'   (None)
dst        : DestIPField                         = '192.168.0.255' (None)
options    : PacketListField                     = []              ([])
--
sport      : ShortEnumField                      = 0               (53)
dport      : ShortEnumField                      = 0               (53)
len        : ShortField                          = 26              (None)
chksum     : XShortField                         = 32105           (None)
--
load       : StrField                            = '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' ('')
None

数据包的写入

wrpcap("demo.pcap", pack_list)

将所有的数据包放到一个list,再将其写入到文件中

 

二.数据包的信息获取

物理层 –> 网络层 –> 传输层 –> 应用层   每一层的数据都可以根据相应层的协议名获取,然后再通过字段名获取具体层具体字段的信息

from scapy.all import *

pack = rdpcap('test.pcap')

for p in pack:
    print repr(p)
    print p['Ether'].name
    print p['Ether'].dst
    print p['Ether'].src

    print p['IP'].name
    print p['IP'].dst
    print p['IP'].src

    print p['UDP'].name
    print p['UDP'].sport
    print p['UDP'].dport


输出:
Ethernet
00:19:be:2c:12:0c
00:18:be:27:42:0c
IP
192.168.0.255
192.168.0.1
UDP
0
0

三.获取上层数据的信息  payload和查看时间戳

for p in pack:
    print repr(p)
    print p.name
    print p.payload.name
    print p.payload.payload.name
    print p.time

输出:
Ethernet
IP
UDP
1539930005.0

四.数据包的发送

sendp(pack_list,inter=float(packet_sleep), count=1,iface=interfa_name)

inter为间隔时间,count为发送的次数,iface为网卡的描述,在linux中为eth0,ifconfig所查看到的信息,在win中那么就是选择网卡,使用的是网卡的描述,也就是型号

send()函数将会在第3层发送数据包。也就是说它会为你处理路由和第2层的数据。sendp()函数将会工作在第2层

 

五.构造一个数据包

eth = Ether(dst=eth_dst, src=eth_src)
ip = IP(src=ip_src, dst=ip_dst)
udp = UDP(sport=int(port_src), dport=int(port_dst))
raw = Raw(data)
pack = eth / ip / udp / raw

不同层的数据包结构使用/来整合在一起pack = eth / ip / udp / raw

 

六.修改数据包内容

p['Ether'].dst='50:7b:9d:c7:e6:11'
p['Ether'].src='50:7b:9d:c7:e6:13'

p['IP'].dst='192.168.2.1'
p['IP'].src='192.168.3.1'

参考链接:https://www.jianshu.com/p/8eab70118fad

https://scapy.readthedocs.io/en/latest/