Python中Scapy网络嗅探模块的使用
目录
Scapy
scapy是python中一个可用于网络嗅探的非常强大的第三方库,可以用它来做 packet 嗅探和伪造 packet。 scapy已经在内部实现了大量的网络协议。如DNS、ARP、IP、TCP、UDP等等,可以用它来编写非常灵活实用的工具。
换言之,Scapy 是一个强大的操纵报文的交互程序。它可以伪造或者解析多种协议的报文,还具有发送、捕获、匹配请求和响应这些报文以及更多的功能。Scapy 可以轻松地做到像扫描(scanning)、路由跟踪(tracerouting)、探测(probing)、单元测试(unit tests)、攻击(attacks)和发现网络(network discorvery)这样的传统任务。它可以代替 hping 、arpspoof 、arp-sk、arping,p0f 甚至是部分的Namp、tcpdump 和 tshark 的功能。
最简单的一个发包
from scapy.all import *
data='hello,word!'
pkt=IP(src='10.96.10.208',dst='10.96.10.209')/TCP(sport=12345,dport=12345)/data
send(pkt,inter=1,count=5) #每隔一秒发包,发5次
scapy的安装和使用
scapy默认是不安装的,安装命令:pip install scapy
安装完后:
- ls() 命令可以查看所有支持的协议
- ls(IP) 命令列出ip协议头部字段格式,只要想查看哪个协议的参数,括号里就填哪个协议
- IP().show() 列出ip包的信息
- lsc() 命令列出scapy的所有命令
- conf 命令列出scapy 的配置参数
发包的包格式: 层的协议(参数)/上一层的协议(参数) /要发送的数据 ,比如如下
IP(src='10.96.10.208',dst='10.96.10.209')/TCP(sport=12345,dport=12345)/data
发包
发送三层包:send(pkt, inter=0, loop=0, count=1, iface=N)
发送二层包:sendp(pkt, inter=0, loop=0, count=1, iface=N)
使用tcpreplay在第二层以更快的速度发送数据包 :sendpfast(pkt, pps=N, mbps=N, loop=0, iface=N)
def send(x, inter=0, loop=0, count=None, verbose=None, realtime=None, return_packets=False, socket=None,*args,**kargs)
def sendp(x, inter=0, loop=0, iface=None, iface_hint=None, count=None, verbose=None, realtime=None,
return_packets=False, socket=None,*args,**kargs)
def sendpfast(x, pps=None, mbps=None, realtime=None, loop=0, file_cache=False, iface=None,*args,**kargs)
from scapy.all import *
send(IP(dst="202.99.96.68")/UDP(dport=53))
sendp(Ether()/IP(dst="202.99.96.68")/UDP(dport=53))
发包和收包
和上面发包不同的是,发包仅仅是发送包,而发包和收包是对发包的回复信息进行收集。
- 三层发包和收包:sr(pkt, filter=N, iface=N)
- 二层发包和收包:srp(pkt, filter=N, iface=N)
- 三层发包但是仅仅接受第一个回复:sr1(pkt, inter=0, loop=0, count=1, iface=N),
- 二层发包但是仅仅接受第一个回复:srp1(pkt, filter=N, iface=N)
- 在环回口发包并且打印出所有的回复:srloop(pkt, timeout=N, count=N), srploop(…)
def sr(x, promisc=None, filter=None, iface=None, nofilter=0,*args,**kargs)
def srp(x, promisc=None, iface=None, iface_hint=None, filter=None, nofilter=0, type=ETH_P_ALL,*args,**kargs)
def sr1(x, promisc=None, filter=None, iface=None, nofilter=0,*args,**kargs)
def srp1(*args,**kargs)
以上所有的发包和收包都是接收到两个参数,第一个参数是回复的包,第二个参数是没回复的包
举例,我们利用arp协议获得指定ip的mac地址
>>ans,unans=srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="10.96.10.197"))
>>print(ans)
>>print(unans)
<Results: TCP:0 UDP:0 ICMP:0 Other:1>
<Unanswered: TCP:0 UDP:0 ICMP:0 Other:0>
可知,ans是回复我们的包,如果我们想获得ans回复的数据,我们可以查看ans的第一个包
>>print(ans[0])
(<Ether dst=ff:ff:ff:ff:ff:ff type=0x806 |<ARP pdst=10.96.10.197 |>>, <Ether dst=50:7b:9d:12:b2:ca src=e4:35:c8:7a:58:a6 type=0x806 |<ARP hwtype=0x1 ptype=0x800 hwlen=6 plen=4 op=is-at hwsrc=e4:35:c8:7a:58:a6 psrc=10.96.10.197 hwdst=50:7b:9d:12:b2:ca pdst=10.96.10.208 |<Padding load='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' |>>>)
ans[0]包中是一个元组,第一部分是我们发的信息,第二部分是回复的信息。很明显,第二部分才是我们要的内容
>>for snd,rcv in ans:
>> list_mac=rcv.sprintf("%Ether.src% - %ARP.psrc%") #按照指定格式打印出我们的包
>> print(list_mac)
e4:35:c8:7a:58:a6 - 10.96.10.197
抓包
scapy抓包使用 sniff() 函数,这个函数有很多参数
def sniff(count=0, store=1, offline=None, prn=None,filter=None, L2socket=None, timeout=None, opened_socket=None, stop_filter=None, iface=None,*args,**kargs)
- count:抓包的数量,0表示无限制;
- store:保存抓取的数据包或者丢弃,1保存,0丢弃
- offline:从 pcap 文件读取数据包,而不进行嗅探,默认为None
- prn:为每一个数据包定义一个函数,如果返回了什么,则显示。例如:prn = lambda x: x.summary(); ( packct.summar()函数返回的是对包的统计性信息 )
- filter:过滤规则,使用wireshark里面的过滤语法
- L2socket:使用给定的 L2socket
- timeout:在给定的时间后停止嗅探,默认为 None
- opened_socket:对指定的对象使用 .recv() 进行读取;
- stop_filter:定义一个函数,决定在抓到指定数据包后停止抓包,如:stop_filter = lambda x: x.haslayer(TCP);
- iface:指定抓包的接口
将抓取到的数据包保存
from scapy.all import *
package=sniff(iface='eth0',count=10) #扫描eth0网卡的数据包,总数为10个
wrpcap("test.pcap",package) #将抓取到的包保存为test.pcap文件
如果我们以后想查看这个包的话,可以这样使用
package = sniff(offline='test.pcap') 或 package= rdpcap('test.pcap')
查看抓取到的数据包
>>from scapy.all import *
>>package=sniff(iface='eth0',count=10) #扫描eth0网卡的数据包,总数为10个
>>print(package)
<Sniffed: TCP:0 UDP:10 ICMP:0 Other:0>
从上面可以看到,我们抓取到了十个UDP的数据包,然后我们可以查看第一个数据包:package[0]是查看第一个数据包的数据,package[0].show()是查看第一个数据包的详细信息,scapy是按照按照 TCP/IP 四层参考模型显示详细包信息的,即:链路层 [Ethernet]、网络层[IP]、传输层[TCP/UDP]、应用层[RAW] 。我们还可以通过协议来查看指定的包:
package[UDP][0].show() ,因为我们这里只有UDP的数据包,所以就没有这样使用。,而我们也可以直接只获取指定层的数据,如: pcap[UDP][1][Ether].dst 这个包里面是等于ff:ff:ff:ff:ff:ff
from scapy.all import *
package=sniff(iface='eth0',count=10) #扫描eth0网卡的数据包,总数为10个
print(package)
print(package[0]) #查看第一个数据包的数据
print(package[0].show()) #查看第一个数据包的详情
######################################################################
<Sniffed: TCP:0 UDP:9 ICMP:0 Other:1>
b"\xff\xff\xff\xff\xff\xff\xc8[v\xec5\xed\x08\x00E\x00\x01#8G\x00\x00@\x11\x17=\n`\n\x88\n`\n\xff\xd6\x83\xd6\x83\x01\x0fN\xa0\x00qu-PC\x00\x00H\xb6\x1d\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x1dF\x02\x00\x00\x00\x00\xd0\xb5\x1d\x07\x00\x00\x00\x003'\x00\x00\x00\x00\x00\x00\xd0\x1dF\x02\x00\x00\x00\x00\xc02\xc5\x05\x00\x00\x00\x00|j\x85`\x00\x00\x00\x00p\xa4/a\x00\x00\x00\x00\xf9\xb9\x1d\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\xfe\xcc\x05\x00\x00\x00\x00D\xb6\x1d\x07\x00\x00\x00\x00`\xb6\x1d\x07\x00\x00\x00\x00H\xaa {efdced0c-1ada-40e0-a13e-2968030599d4}\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00@\xb6\x1d\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00n\x00\xc5\xac"
###[ Ethernet ]###
dst = ff:ff:ff:ff:ff:ff
src = c8:5b:76:ec:35:ed
type = 0x800
###[ IP ]###
version = 4
ihl = 5
tos = 0x0
len = 291
id = 14407
flags =
frag = 0
ttl = 64
proto = udp
chksum = 0x173d
src = 10.96.10.136
dst = 10.96.10.255
\options \
###[ UDP ]###
sport = 54915
dport = 54915
len = 271
chksum = 0x4ea0
###[ Raw ]###
load = "\x00qu-PC\x00\x00H\xb6\x1d\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x1dF\x02\x00\x00\x00\x00\xd0\xb5\x1d\x07\x00\x00\x00\x003'\x00\x00\x00\x00\x00\x00\xd0\x1dF\x02\x00\x00\x00\x00\xc02\xc5\x05\x00\x00\x00\x00|j\x85`\x00\x00\x00\x00p\xa4/a\x00\x00\x00\x00\xf9\xb9\x1d\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\xfe\xcc\x05\x00\x00\x00\x00D\xb6\x1d\x07\x00\x00\x00\x00`\xb6\x1d\x07\x00\x00\x00\x00H\xaa {efdced0c-1ada-40e0-a13e-2968030599d4}\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00@\xb6\x1d\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00n\x00\xc5\xac"
格式化输出
如果我们要对抓取到的数据包进行格式化输出,我们可以使用 packet.sprintf()
函数进行格式化输出
sprintf()读数据格式:IP:%IP.src% 代表读取的是IP字段的源地址
比如要读取IP包的源地址和目的地址: IP:%IP.src% -> %IP.dst%
要读取UDP中的源端口和目的端口: UDP:%UDP.sport% -> %UDP.sport%
过滤抓包
如果我们想抓指定类型的数据包,就需要使用 filter 进行过滤,而 filter 使用的是 Berkeley Packet Filter (BPF)语法,也就是我们在 wireshark 中可以使用的过滤语法
比如说我们只抓取 icmp 的包,并且按照 源ip-> 目的ip 的格式打印出来 。我在一直ping百度,下面是抓包的
sniff(filter="icmp",count=5,prn=lambda x : x.sprintf("{IP:%IP.src%-> %IP.dst%}"))
相关文章:Python脚本扫描给定网段的MAC地址表(scapy或 python-nmap)
Python中Scapy网络嗅探模块的使用的更多相关文章
- Python中的网络扫描大杀器Scapy初探
Python中的网络扫描大杀器Scapy初探 最近经历了Twisted的打击,这个网络编程实在看不懂,都摸不透它的内在逻辑,看来网络编程不是那么好弄的.还好,看到了scapy,这种网络的大杀器 ...
- python中的logging日志模块
日志是程序不可或缺的一部分.它可以记录程序的运行情况,帮助我们更便捷地发现问题,而python中的logging日志模块给我们提供了这个机会. logging给我们提供了五种函数用来输出日志:debu ...
- Python中os和shutil模块实用方法集…
Python中os和shutil模块实用方法集锦 类型:转载 时间:2014-05-13 这篇文章主要介绍了Python中os和shutil模块实用方法集锦,需要的朋友可以参考下 复制代码代码如下: ...
- Python中os和shutil模块实用方法集锦
Python中os和shutil模块实用方法集锦 类型:转载 时间:2014-05-13 这篇文章主要介绍了Python中os和shutil模块实用方法集锦,需要的朋友可以参考下 复制代码代码如下: ...
- python中根据字符串导入模块module
python中根据字符串导入模块module 需要导入importlib,使用其中的import_module方法 import importlib modname = 'datetime' date ...
- python中的第三方日志模块logging
基本上每个系统都有自己的日志系统,可以使自己写的,也可以是第三方的.下面来简单介绍一下python中第三方的日志模块,入手还是比较简单的,但是也很容易给自己埋雷. 下面是我参考的资料链接 入手demo ...
- Python中xlrd和xlwt模块使用方法 (python对excel文件的操作)
本文主要介绍可操作excel文件的xlrd.xlwt模块.其中xlrd模块实现对excel文件内容读取,xlwt模块实现对excel文件的写入. 安装xlrd和xlwt模块 xlrd和xlwt模块不是 ...
- python中time、datetime模块的使用
目录 python中time.datetime模块的使用 1.前言 2.time模块 1.时间格式转换图 2.常用方法 3.datetime模块 python中time.datetime模块的使用 1 ...
- Python中好用的模块们
目录 Python中好用的模块们 datetime模块 subprocess模块 matplotlib折线图 importlib模块 Python中好用的模块们 datetime模块 相信我们都使 ...
随机推荐
- layui数据表格-通过点击按钮使数据表格中的字段值增加
通过点击右侧相对应的操作按钮,对迟到.休假次数实现自增效果 jsp页面代码 //监听行工具事件 table.on('tool(test)', function(obj){ var data = obj ...
- root 登录 lightdm freebsd下
root 登录 lightdm freebsd下方法 pkg install lightdm-gtk-greeter lightdm 写入lightdm_enable="YES"到 ...
- Mysql被黑客攻击了?一定要注意一点,不要关闭mysql服务
因为mysql没有关闭的情况,可以从缓存里面获取到数据,如果关闭了只能从文件里面去获取数据了,会大大加大恢复难度
- Python编程中可能经常用到的函数
1.os.walk() 一般用法为 import os ph=r'D:\temp\build' for root,dirs,files in os.walk(ph): print(root,dirs, ...
- 攻防世界 reverse EasyRE
EasyRE 主函数 int sub_401080() { unsigned int lens; // kr00_4 signed int i; // edx char *v2; // esi cha ...
- juc下Condition类解析
在使用Lock之前,我们使用的最多的同步方式应该是synchronized关键字来实现同步方式了.配合Object的wait().notify()系列方法可以实现等待/通知模式. Condition接 ...
- 使用C# (.NET Core) 实现装饰模式 (Decorator Pattern) 并介绍 .NET/Core的Stream
该文章综合了几本书的内容. 某咖啡店项目的解决方案 某咖啡店供应咖啡, 客户买咖啡的时候可以添加若干调味料, 最后要求算出总价钱. Beverage是所有咖啡饮料的抽象类, 里面的cost方法是抽象的 ...
- 【2020.8.23NOIP模拟赛】失落
[ 2020.8.23 N O I P 模 拟 赛 ] 失 落 [2020.8.23NOIP模拟赛]失落 [2020.8.23NOIP模拟赛]失落 题目描述 出题人心情很失落,于是他直接告诉你让你求出 ...
- python基础(补充):列表生成器
列表推导式是Python构建列表(list)的一种快捷方式,可以使用简洁的代码就创建出一个列表. 举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list ...
- Python基础之:struct和格式化字符
目录 简介 struct中的方法 格式字符串 字节顺序,大小和对齐方式 格式字符 格式数字 格式字符 格式字符串 填充的影响 复杂应用 简介 文件的存储内容有两种方式,一种是二进制,一种是文本的形式. ...