python数据包之利器scapy用法!
scapy介绍:
在python中可以通过scapy这个库轻松实现构造数据包、发送数据包、分析数据包,为网络编程之利器!
scapy安装:
pip install scapy ======> scapy不是内置模块,故需要额外安装
导入scapy方式:
from scapy.all import *
构造包:
a = Ether()/IP(dst='114.114.114.114')/TCP(dport=80)/应用层数据
print(a.show()) ======> 可以先通过a.show()函数查看数据包的构成部分,然后在构造包时就知道有哪些参数可以填了
发送包:
sr(IP(dst='192.168.1.0/24')/TCP(dport=(1,65535)), timeout=2) =====>发送三层数据包,等待接收一个或多个数据包的响应(注意:当依次向每个IP的65535个端口发送完才算执行完这个函数,而不是调用一次只发一个包,以下所有发包方式都与之一样)
sr1() ======> 发送三层数据包,并仅仅只等待接收一个数据包的响应
srp(Ether(dst='11:11:11:11:11:11')/IP(dst='1.1.1.1')/ICMP()) ======> 发送二层数据包,并且等待回应(这个函数可以编辑二层头部,sr()不能编辑二层头部)
send() =======> 仅仅发送三层数据包,不等待回包(发完就拉倒了)
sendp() =======> 仅仅发送二层数据包,不等待回包
解析回包:
1、sr
reply_packet = sr(IP(dst='114.114.114.114')/ICMP(), timeout=2)
print(reply_packet)
(<Results: TCP:0 UDP:0 ICMP:1 Other:0>, <Unanswered: TCP:0 UDP:0 ICMP:0 Other:0>) ====>第一个元素为接收到的包,第二个元素为没有收到的包
print(reply_packet[0].res)
[(<IP frag=0 proto=icmp dst=114.114.114.114 |<ICMP |>>, <IP version=4 ihl=5 tos=0x0 len=28 id=32921 flags= frag=0 ttl=75 proto=icmp chksum=0xbb37 src=114.114.114.114 dst=172.20.163.23options=[] |<ICMP type=echo-reply code=0 chksum=0xffff id=0x0 seq=0x0 |<Padding load='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' |>>>)] ====>列表里面为所有回包情况,一个元素(元组)为一个回包. 其元组中第一个元素为发送的包,第二个元素为返回的包
查看回包各项属性:
print(reply_packet[0].res[0][1].fields)
{'version': 4, 'ihl': 5, 'tos': 0, 'len': 28, 'id': 56445, 'flags': <Flag 0 ()>, 'frag': 0, 'ttl': 75, 'proto': 1, 'chksum': 24403, 'src': '114.114.114.114', 'dst': '172.20.163.23','options': []}
注意:这里默认只给出了三层头部,其实'reply_packet[0].res[0][1].fields' == 'reply_packet[0].res[0][1][0].fields',res的第三位[0]表示精确到第几层,这里[0]代表IP层,[1]进一层到传输层,[2]进一步到应用层。例:
print(reply_packet[0].res[0][1][1].fields)
{'type': 0, 'code': 0, 'chksum': 65535, 'id': 0, 'seq': 0}
print(reply_packet[0].res[0][1][2].fields)
{'load': b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'}
同时也可以直接用show方法查看包体内容,例:
print(reply_packet[0].res[0][1].show())
###[ IP ]###
version = 4
ihl = 5
tos = 0x0
len = 28
id = 34404
flags =
frag = 0
ttl = 79
proto = icmp
chksum = 0xb16c
src = 114.114.114.114
dst = 172.20.163.23
\options \
###[ ICMP ]###
type = echo-reply
code = 0
chksum = 0xffff
id = 0x0
seq = 0x0
###[ Padding ]###
load = '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
总结: 到reply_packet[0].res[0][1]这一层就相当于是真正的回包包体了,包体可以用fields属性(返回字典)和show方法(返回字符串)来查看其内容. 而前面几层都是对数据包的一些统计描述.
2、sr1
reply_packet = sr1(IP(dst='114.114.114.114')/ICMP(), timeout=2)
print(reply_packet) =====> b'E\x00\x00\x1c\xe0\xd8\x00\x00H\x01]\xf8rrrr\xac\x14\xa3\x17\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
sr1返回的对象没有太多复杂东西,直接相当于sr返回对象的reply_packet[0].res[0][1],可以理解为sr1返回的对象是sr返回对象的一个子集.
print(reply_packet.fields) ====> {'version': 4, 'ihl': 5, 'tos': 0, 'len': 28, 'id': 19164, 'flags': <Flag 0 ()>, 'frag': 0, 'ttl': 66, 'proto': 1, 'chksum': 63988, 'src': '114.114.114.114', 'dst': '172.20.163.23', 'options': []}
sr1的reply_packet == sr的reply_packet[0].res[0][1], 所以可以和sr一样直接用fields来读取其内容.
3、srp
reply_packet = srp(Ether(dst='00:23:89:bb:c7:85')/IP(dst='114.114.114.114')/ICMP())
print(reply_packet[0].res[0][1].fields) =====> {'dst': '00:0c:29:d9:3f:63', 'src': '00:23:89:bb:c7:85', 'type': 2048}
注意:这里默认只给出了二层头部,可以通过调节res后第三位的值来选择性查看每层信息,res的第三位[0]表示精确到第几层,[0]代表二层,[1]进一层到IP层,[2]进一步到传输层,[3]进一步到应用层
例:
print(reply_packet[0].res[0][1][1].fields) =====> {'version': 4, 'ihl': 5, 'tos': 0, 'len': 28, 'id': 62339, 'flags': <Flag 0 ()>, 'frag': 0, 'ttl': 67, 'proto': 1, 'chksum': 20557, 'src': '114.114.114.114', 'dst': '172.20.163.23', 'options': []}
print(reply_packet[0].res[0][1][2].fields) =====> {'type': 0, 'code': 0, 'chksum': 65535, 'id': 0, 'seq': 0}
print(reply_packet[0].res[0][1][3].fields) ======> {'load': b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'}
抓包、分析包:
# prn指向一个回调函数,意为将收到的包丢给prn指向的函数处理(注意:回调的意义!每收到一个包就丢到回调函数里执行一下,执行完了才再跑回来继续抓包)
# filter为包过滤规则(语法参照tcpdump过滤规则)
# store为是否要存储抓到的包(注意,如果没有存储则不会将抓到的包赋值给a,因为没有存下就没有东西可以赋,此参数默认开启)
# timeout为抓包时长,比如抓30秒就结束(注意:如果没有指定抓包时长则会一直抓下去,程序会一直卡在这里)
# iface为指定抓包的网卡
a = sniff(prn=abc, filter='tcp port 80 and ip 192.168.1.1', store=1, timeout=30, iface='eth0')
wrpcap('packet.cap', a) ======> 此函数可以将抓到的包存到本地(注意:将包写入本地不能使用open('packet.cap', 'r'),因为open函数只能写入字符串)。
bbb = rdpcap('/root/桌面/ftp_pcapng.cap') =======> 此函数可以将本地存储的数据包读取出来
for i in bbb: =======> 读取出来的对象是由N个数据包组成的可迭代对象,每次迭代一个包
try: ======> 有些包可能没有要提取的对象,当提取包里没有的属性时则会报错,所以捕获异常好让程序继续往下执行
print(i.getlayer('Raw').fields['load'].decode().strip()) ======> 输出数据包的应用层负载
except :
continue
python数据包之利器scapy用法!的更多相关文章
- 机器学习常用Python扩展包
		
在Ubuntu下安装Python模块通常有3种方法:1)使用apt-get:2)使用pip命令(推荐);3)easy_instal 可安装方法参考:[转]linux和windows下安装python集 ...
 - 快速学习 Python 数据分析包 之 pandas
		
最近在看时间序列分析的一些东西,中间普遍用到一个叫pandas的包,因此单独拿出时间来进行学习. 参见 pandas 官方文档 http://pandas.pydata.org/pandas-docs ...
 - scapy - 基于python的数据包操作库
		
简介 地址:https://github.com/secdev/scapy scapy是一个基于python的交互式数据包操作程序和库. 它能够伪造或者解码多种协议的数据包,通过使用pcap文件对他们 ...
 - 【python可视化系列】python数据可视化利器--pyecharts
		
学可视化就跟学弹吉他一样,刚开始你会觉得自己弹出来的是噪音,也就有了在使用python可视化的时候,总说,我擦,为啥别人画的图那么溜: [python可视化系列]python数据可视化利器--pyec ...
 - python自动化运维三:数据报表定制以及scapy模块介绍
		
p { margin-bottom: 0.25cm; line-height: 120% } a:link { } Excel也是报表的一个重要的工具.这里首先接受下excel的操作.先来看一个简单的 ...
 - 强大的数据包处理程序scapy
		
实验目的 利用scapy工具构造arp.icmp数据包,发送到目标主机,根据应答包推测出目标系统存活情况 实验原理 Scapy是Python写的一个功能强大的交互式数据包处理程序,可用来发送.嗅探.解 ...
 - python 脚本开发实战-当当亚马逊图书采集器转淘宝数据包
		
开发环境python2.7.9 os:win-xp exe打包工具pyinstaller 界面tkinter ============================================= ...
 - python的扩展包requests的高级用法
		
Python 标准库中的 urllib2 模块提供了你所需要的大多数 HTTP 功能,但是它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作,甚至包括各种方法覆盖,来完成最 ...
 - python解析pcap文件中的http数据包
		
使用scapy.scapy_http就可以方便的对pcap包中的http数据包进行解析 scapy_http可以在https://github.com/invernizzi/scapy-http下载, ...
 
随机推荐
- NOIP-接水问题
			
题目描述 学校里有一个水房,水房里一共装有m个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为1. 现在有n名同学准备接水,他们的初始接水顺序已经确定.将这些同学按接水顺序从1到n编号,i号同学 ...
 - TimesTen数据库的备份和恢复
			
建立不支持增量备份的全备份 做一个全备份,fileFull为不支持增量的全备份 $ ttbackup -type fileFull -dir /tmp/backupdir sampledb_1122( ...
 - Spring源码阅读 源码环境搭建(一)
			
ring 源码阅读的搭建(一) 一 下载spring源码 进入官方网页:https://spring.io/projects/spring-framework 进入相关的github位置,下载zip包 ...
 - 实验三:分别用for,while;do-while循坏语句以及递归的方法计算n!,并输出算式。
			
源代码: package jiecheng;import java.util.Scanner;public class JieCheng {public static void main(String ...
 - C++之几个最常
			
1.同类对象间的数据共享——静态成员 静态数据成员声明静态数据成员要采用关键字static:类静态数据成员的定义和初始化定义:static 数据类型 成员名:初始化:数据类型 类名::静态数据成员名= ...
 - js 中 的 BOM对象
			
BOM对象(浏览器对象模型 Browser Object Model) 01.页面的前进和后退 02.移动,调整和关闭浏览器窗口 03.创建新的浏览器窗口 01.window对象 ***** 核心对象 ...
 - idea Empty git --version output:解决
			
在使用idea下的git时候发现报错 但看了一下我的git-bas位置确实没有错啊,也可以启动 后来google了才下发现原来idea的这个地方不用引用的git-bash.exe的路径,而是git.e ...
 - 数据库索引使用数据结构及算法, 及MySQL不同引擎索引实现
			
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
 - [Swift]LeetCode144. 二叉树的前序遍历 | Binary Tree Preorder Traversal
			
Given a binary tree, return the preorder traversal of its nodes' values. Example: Input: [1,null,2,3 ...
 - [Swift]LeetCode672. 灯泡开关 Ⅱ | Bulb Switcher II
			
There is a room with n lights which are turned on initially and 4 buttons on the wall. After perform ...