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:5 ICMP:0 Other:5>

从上面可以看到,我们抓取到了五个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()) #查看第一个数据包的详情 ######################################################################

>>> package=sniff(iface='',count=10)
>>> print(package)
<Sniffed: TCP:1 UDP:2 ICMP:0 Other:7>
>>> print(package[0])
WARNING: Calling str(pkt) on Python 3 makes no sense!
b'\x01\x80\xc2\x00\x00\nl\xeb\xb6\x16iP\x00.\xaa\xaa\x03\x00\x18\x82 \x04\x01\x00\x01\x00%\x02\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'
>>> print(package[0].show())###[ Ethernet ]###
  dst       = ff:ff:ff:ff:ff:ff
  src       = 6c:4b:90:8e:c4:54
  type      = ARP
###[ ARP ]###
     hwtype    = 0x1
     ptype     = IPv4
     hwlen     = 6
     plen      = 4
     op        = who-has
     hwsrc     = 6c:4b:90:8e:c4:54
     psrc      = 192.168.7.126
     hwdst     = 00:00:00:00:00:00
     pdst      = 169.254.71.186
###[ Padding ]###
        load      = '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

格式化输出

如果我们要对抓取到的数据包进行格式化输出,我们可以使用 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%}"))

>>> from scapy.all import *
>>> sniff(filter="icmp",count=5,prn=lambda x : x.sprintf("{IP:%IP.src%-> %IP.dst%}"))
123.58.182.249-> 192.168.6.56
192.168.6.56-> 110.242.68.3
110.242.68.3-> 192.168.6.56
192.168.6.56-> 110.242.68.3
110.242.68.3-> 192.168.6.56
<Sniffed: TCP:0 UDP:0 ICMP:5 Other:0>
>>>

示例:

from scapy.all import *

def Callback(packet):
    print('src:%s----->dst:%s'%(packet[IP].src, packet[IP].dst))
    print('TTL:%s'%packet[IP].ttl)
    print(packet.show())  #内置的show()函数打印数据包内容

sniff(filter='dst port 80', prn=Callback)

执行结果:python3 scapy_test.py

src:192.168.6.57----->dst:180.163.237.176
TTL:64
###[ Ethernet ]### 
  dst       = c4:b8:b4:64:20:77
  src       = 6c:4b:90:d4:17:e1
  type      = IPv4
###[ IP ]### 
     version   = 4
     ihl       = 5
     tos       = 0x0
     len       = 41
     id        = 16868
     flags     = DF
     frag      = 0
     ttl       = 64
     proto     = tcp
     chksum    = 0x8fb5
     src       = 192.168.6.57
     dst       = 180.163.237.176
     \options   \
###[ TCP ]### 
        sport     = 57790
        dport     = http
        seq       = 3384538577
        ack       = 2221061731
        dataofs   = 5
        reserved  = 0
        flags     = A
        window    = 1028
        chksum    = 0x6637
        urgptr    = 0
        options   = []
###[ Raw ]### 
           load      = '\x00'
###[ Padding ]### 
              load      = '\x00\x00\x00\x00\x00'

None

Python中Scapy模块使用方法相关推荐

  1. 【转】关于python中re模块split方法的使用

    注:最近在研究文本处理,需要用到正则切割文本,所以收索到了这篇文章,很有用,谢谢原作者. 原址:http://blog.sciencenet.cn/blog-314114-775285.html 关于 ...

  2. python中scapy模块的使用

    一.介绍 scapy是python中一个可用于网络嗅探的非常强大的第三方库,可以用它来做 packet 嗅探和伪造 packet. scapy已经在内部实现了大量的网络协议.如DNS.ARP.IP.T ...

  3. python中scapy模块的基础应用

    scapy是一个可用于网络嗅探的非常强大的第三方库 文章目录 安装Scapy 运行Scapy 嗅探流量包 sniff函数 Sniff的参数 filter过滤包 写入与读取 PCAP Hexdump H ...

  4. Python中os模块使用方法

    os模块提供了对系统环境.文件.目录等操作系统级的接口函数.本文主要描述os模块和os.path模块常用函数以及常用实例. os模块函数 os.getcwd() 获取当前工作的目录. os.listd ...

  5. Python中安装模块的方法

    1.*nix系统上有一个地方专门有一个地方来放置安装的Python模块 比如在Mac上,这个目录的路径为: /usr/lib/python2.7 将要安装的文件拷贝到这里即可 2.下载模块包,解压后, ...

  6. python添加自定义模块_Python中添加自定义模块的方法

    Python中添加自定义模块的方法 发布时间:2020-07-17 14:01:03 来源:亿速云 阅读:95 作者:小猪 这篇文章主要讲解了Python中添加自定义模块的方法,内容清晰明了,对此有兴 ...

  7. 关于python中requests模块导入问题-python中requests模块的使用方法

    本文实例讲述了python中requests模块的使用方法.分享给大家供大家参考.具体分析如下: 在HTTP相关处理中使用python是不必要的麻烦,这包括urllib2模块以巨大的复杂性代价获取综合 ...

  8. python中config方法作用,python中ConfigParse模块的用法

    本文实例讲述了python中ConfigParse模块的用法,分享给大家供大家参考.具体方法如下: 写配置一般用ConfigParse.RawConfigParse类 读配置用ConfigParse. ...

  9. Python中optionParser模块的使用方法实例教程

    Python中optionParser模块的使用方法实例教程 转载  2014-08-29   投稿:shichen2014    我要评论 这篇文章主要介绍了Python中optionParser模 ...

最新文章

  1. android 一维数组遍历,$.each()循环遍历一维数组、二维数组、JSON数据和DOM元素
  2. web签名验证程序【跨服务器、中文字符签名方法】-php为例
  3. 【Nginx】错误: [emerg] “proxy_set_header“ directive is not allowed here in D:\sde\phpstudy_pro\...
  4. 1001 A+B Format (20分)——12行代码AC
  5. 《那些年啊,那些事——一个程序员的奋斗史》——126
  6. bio java 例子_JAVA BIO 服务器与客户端实现示例
  7. ZYNQ学习心得梳理(一)
  8. 吴恩达机器学习练习2:optimset和fminunc函数
  9. HDU1213How Many Tables
  10. 云从科技宣布B+轮融资,多家国有基金入股,累计获资35亿元
  11. 写python脚本管理_Python 文件管理实例详解
  12. MP3音频文件格式(MPEG-1 audio layer 3)
  13. 怎么使用PDF编辑器在PDF中插入图片?PDF插入图片的教程
  14. 软件测试电脑内存适配,利用Memtest86 测试你电脑的内存
  15. MATLAB之牛顿插值法
  16. outlook2019配置QQ邮箱
  17. 21碳纤维山地车哪个牌子好全球最贵辐轮王土拨鼠自行车965万
  18. 首席架构师的领导力和管理能力
  19. 58同城一面【前端】
  20. 分部积分题型总结笔记(分部积分超强拓展)

热门文章

  1. virtio技术(1)简介
  2. Vue导出页面为word格式
  3. Java事务的ACID属性和四种隔离级别和传播机制
  4. 傅一平:一文讲透ERP的下一代架构!
  5. win7修改本计算机端口,教你如何修改win7旗舰版系统远程桌面端口
  6. TopFlash钓鱼
  7. 数字时代需要怎样的“安全基座”?首批零信任/SASE标准和评估成果即将揭晓
  8. 这就是OPPOr11为什么要出定制版的原因,粉丝们有福利了
  9. 微信小程序在苹果手机的New Date坑
  10. svg动画小熊盯着蜂蜜网页代码