当前位置:   article > 正文

1.3交互式数据包处理工具Scapy使用介绍_scapy实验执行ls()命令,显示scapy支持的所有协议

scapy实验执行ls()命令,显示scapy支持的所有协议
任务内容

1、 学习Scapy的基本功能和优势,做好充足的理论学习准备。
2、 学习使用Scapy的基本命令,主要包括ls()、lsc()、help()等。
3、 学习使用Scapy定义数据包、发送接收数据包,在实验过程中对比几种不同方法之间的异同点。

实验原理

一、 概述

Scapy是一个基于Python编写的交互式数据包处理程序,使用Python解释器作为命令面板。可以用来发送、嗅探、解析和伪造网络数据包,常常被用于网络攻击和测试。Scapy可以实现扫描、路由跟踪、探测、单元测试、攻击和发现网络等传统功能,也可以代替hping、arpspoof、arp-sk、arping、p0f,实现了部分Namp、Tcpdump和tshark的功能。它能够伪造或者解码大量的网络协议数据包,能够发送、捕捉、匹配请求和回复包等等。它可以很容易地处理一些典型操作,比如端口扫描,tracerouting,探测,单元测试,攻击或网络发现(可替代hping,NMAP,arpspoof,ARP-SK,arping,tcpdump,tethereal,P0F等)。最重要的他还有很多更优秀的特性——发送无效数据帧、注入修改的802.11数据帧、在WEP上解码加密通道(VOIP)、ARP缓存攻击(VLAN)等,这也是其他工具无法处理完成的。
Scapy有其他网络工具无法匹敌的优势,在大多数工具无法完成的任务中也有出色表现,比如发送无效帧、添加自定义的802.11帧、多技术结合等。其实,Scapy的理念非常简单,主要负责定义、发送和接收报文。用户利用Scapy定义一系列报文,接着发送这些报文,然后会收到回应,Scapy将收到的回应与请求匹配,返回到存放报文对(请求,回应)的列表和没有匹配报文的列表。
Scapy不仅可以进行交互式数据包处理,还可以作为Python模块在Python程序中使用。需要注意的是,无论是交互式数据处理还是在Python代码中使用,都需要基于root权限。

二、 安装使用

Scapy既然是第三方库,系统上默认是没有安装的。在Ubuntu下,我们可以直接使用命令sudo apt-get install scapy进行安装,安装完成以后,只需要在终端下执行sudo scapy就可以进入Scapy的命令行模式。
Scapy常用功能如下:
1、 conf:查看配置信息

  1. >>> conf
  2. ASN1_default_codec = <ASN1Codec BER[1]>
  3. AS_resolver = <scapy.as_resolvers.AS_resolver_multi instance at 0x13c1dd0>
  4. ( 此处省略 N 行 )
  5. verb = 2
  6. version = '2.3.2'
  7. warning_threshold = 5
  8. wepkey = ''

2、 lsc():查看支持的指令集

  1. >>> lsc()
  2. arpcachepoison : Poison target's cache with (your MAC,victim's IP) couple
  3. arping : Send ARP who-has requests to determine which hosts are up
  4. bind_layers : Bind 2 layers on some specific fields' values
  5. corrupt_bits : Flip a given percentage or number of bits from a string
  6. ( 此处省略 N 行 )
  7. wireshark : Run wireshark on a list of packets
  8. wrpcap : Write a list of packets to a pcap file

比如这里的arping,得到所在局域网内所有可用的ip与mac的对应关系,我们可以这样来使用:

  1. >>> arping("172.16.2.79/80")
  2. Begin emission:
  3. Finished to send 1 packets.
  4. *
  5. Received 1 packets, got 1 answers, remaining 0 packets
  6. 30:5a:3a:45:1a:28 172.16.2.79
  7. (<ARPing: TCP:0 UDP:0 ICMP:0 Other:1>, <Unanswered: TCP:0 UDP:0 ICMP:0 Other:0>)

3、 ls():查看实现的网络协议。ls()中携带的参数可以是任何的一个具体的包,常用的有ARP、Ether、ICMP、IP、UDP、TCP,也支持SNMP、DHCP、STP等。
缺省参数模式:

  1. >>> ls()
  2. AH : AH
  3. ARP : ARP
  4. ASN1_Packet : None
  5. ATT_Error_Response : Error Response
  6. ATT_Exchange_MTU_Request : Exchange MTU Request
  7. ( 此处省略 N 行 )
  8. _IPv6ExtHdr : Abstract IPV6 Option Header
  9. _MobilityHeader : Dummy IPv6 Mobility Header

携带参数模式:

  1. >>> ls(UDP)
  2. sport : ShortEnumField = (53)
  3. dport : ShortEnumField = (53)
  4. len : ShortField = (None)
  5. chksum : XShortField = (None)

4、 IP模块的使用
我们可以像在Python中一样实例化一个IP 对象。

  1. >>> data = IP()
  2. >>> data
  3. <IP >

也可以传入需要自定义的参数

  1. >>> data = IP(dst="172.16.2.79")
  2. >>> data
  3. <IP dst=172.16.2.79 >

查看 IP 模块对象的所有信息

  1. >>> data = IP()
  2. >>> data.show()
  3. ###[ IP ]###
  4. version= 4
  5. ihl= None
  6. tos= 0x0
  7. len= None
  8. id= 1
  9. flags=
  10. frag= 0
  11. ttl= 64
  12. proto= ip
  13. chksum= None
  14. src= 127.0.0.1
  15. dst= 127.0.0.1
  16. \options\

5、 发送和接收报文
可以将上面的 IP 对象封装成一个数据包发送出去。
send:在第三层发送数据包,但没有接收功能。

  1. >>> send(data, iface="eth0")
  2. .
  3. Sent 1 packets.

sendp:在第二层发送数据包,同样没有接收功能。
sr:在第三层发送数据包,有接收功能。
sr1:在第三层发送数据包,有接收功能,但只接收第一个包。
srp:在第二层发送数据包,有接收功能。
srp1:在第二层发送数据包,有接收功能,但只接收第一个包。

实验步骤

一、 检查实验环境

步骤1 以root用户登录交换机,执行如下命令初始化OVS。

  1. #cd /home/fnic
  2. #./ovs_init

步骤2 以root用户登录主机1,执行ifconfig命令查看主机1的IP地址,如下图所示。

步骤3 以root用户登录主机2,执行ifconfig命令查看主机2的IP地址,如下图所示。

二、 学习Scapy基本命令

步骤1 以root用户登录主机1,执行scapy命令登入Scapy环境进行实验操作,如下图所示。

说明:如果没有安装所有可选包,会弹出提示消息,不过并不影响发送、接收数据包等基本功能。

步骤2 执行ls()命令,显示Scapy支持的所有协议。

步骤3 执行lsc()命令,显示Scapy支持的所有命令。

步骤4 执行help()命令,显示某一命令的使用帮助。在括号中加上想要查询的命令,例如:help(send),send命令相关的用法就会显示在屏幕中,如下图所示。


说明:按“q”键退出help()命令。

步骤5 用show()命令查询指定数据包的详细信息。例如定义一个名为mypacket的IP数据包,查询该数据包详细信息的具体命令如下:

  1. >>> mypacket = IP()
  2. >>> mypacket.show()

三、 创建数据包

Scapy的数据包创建是按照TCP/IP协议的四层参考模型:网络接入层、网络互联层、传输层、应用层。Scapy为每一层都写了相应的类,创建数据包时只要将这些类实例化,然后调用类的方法或改变类的参数值即可。各个层的协议都有各自的创建函数,如IP()、TCP()、UDP()等,不同层之间通过”/”来连接。

步骤1 执行以下命令,创建IP层,将主机2的IP设为目的IP,并查看设置后的结果,如下图所示。

  1. >>> my_ip = IP(dst="10.0.0.2")
  2. >>> my_ip.dst

步骤2 执行以下命令,查看默认的ttl字段,并修改ttl为27,如下图所示。

  1. >>> my_ip.ttl
  2. >>> my_ip.ttl=27

步骤3 执行以下命令,创建TCP层,查看默认的flags字段,修改flags为SA,查看修改后的flags字段,如下图所示。

  1. >>> my_tcp=TCP()
  2. >>> my_tcp.flags
  3. >>> my_tcp.flags="SA"
  4. >>> my_tcp.flags

步骤4 显示整个数据包,不同层之间用/连接。执行以下命令:

>>> [p for p in my_ip/my_tcp]

四、 发送接收数据包

步骤1 执行如下命令发送数据包,但并不接收响应。其中send()在第三层发送数据包,而sendp()在第二层发送,如下图所示。

  1. >>>send(IP(dst="10.0.0.2",ttl=15)/ICMP())
  2. >>>sendp(Ether()/IP(dst="10.0.0.2",ttl=15)/ICMP())

步骤2 执行以下命令,使用sr1()发送数据包发送数据包,并接收响应,如下图所示。

  1. >>> result,unanswered=sr(IP(dst="10.0.0.2",ttl=(3,10))/ICMP())
  2. >>> result.show()
  3. >>> unanswered.show()


由上图可知,利用sr()在第三层发送数据包,向10.0.0.2发送ttl分别为3-10的8个ICMP数据包。其中有8个获得响应,0个没有响应。

步骤3 执行如下命令,使用sr1()发送数据包,并查看响应数据包,如下图所示。

  1. >>> result=sr1(IP(dst="10.0.0.2",ttl=(22,35))/ICMP())
  2. >>> result.show()


由上图可知,虽然sr1()也用于发送数据包并接收响应,但是sr1()只接收第一个数据包。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/156981
推荐阅读
相关标签
  

闽ICP备14008679号