scapy的粗略学习

scapy模块文件

scapy的基本操作

打开scapy:sudo scapy

IP数据包最重要的属性就是源地址和目的地址,这两个属性可以使用src和dst来设置。

  1. 例如,要构造一个发送“192.168.3.5”的IP数据包,可以使用下面语句

ip=IP(dst="192.168.3.5")

ip

就会跳出

dst表示目的地址,src表示源地址

【附】如何查看虚拟机本地的ip地址:先安装net-tools(sudo apt install net-tools)

​ 输入ifconfig即可得到。

  1. 这个目标的dst的值可以是一个IP地址,也可以是一个IP范围,例如192.168.3.0/24,这时产生的就不是1个数据包,而是256个数据

target="192.168.3.0/24"
ip=IP(dst=target)
ip
<IP dst=Net('192.168.3.0/24') |>

如果想要查看其中每一个数据包,可以使用命令[p for p in ip]

  • scapy采用分层的形式来构造数据包。通常最下面的一个协议为Ether,然后是IP,再之后是TCP或者UDP。IP()函数无法用来构造ARP请求和应答数据包,所以这时可以使用Ether( )。命令如下:

    Ether(dst="ff:ff:ff:ff:ff:ff")

  • scapy中的分层通过符号“/”来实现,一个数据包是由多层协议构成,那么这些协议之间就可以使用“/”分开,安装协议由底层而上的顺序从左向右排列。

    • 例如,可以使用Ether()/IP()/TCP()来完成一个TCP数据包

    • 由例如,如果想构造一个HTTP数据包,也可以使用IP()/TCP()/"GET/HTTP/1.0/r/n/r/n"

      (“r/n”相当于一个换行)

    scapy中的Ether类中需要有源地址、目的地址和类型。

    IP类除了源地址和目的地址之外,还有版本、长度、协议类型、校验等。

    TCP类中需要有源端口和目的端口。

  • 可以使用ls( )函数来查看一个类所拥有的属性。

可以对这里面对应的属性进行设置。例如:将ttl的值设置为32,可以使用如下方法:

IP(src="192.168.3.12",dst="192.168.3.5",ttl=32)

scapy中的函数

  • 发送产生的报文
    • send():用来发送IP数据包
    • sendp():用来发送Ether数据包

例如:构造一个目的地址为“192.168.3.12”的ICMP的数据包,并将其发送出去

​ 使用语句:send(IP(dst="192.168.3.12")/ICMP())

​ sendp(Ether(dst="00:0c:29:70:3f:b0"))

  • 发送一个内容是随机填充的数据包,又要保证这个数据包的正确性,那么可以使用fuzz()函数。

    • 例如,可以使用如下命令来创建一个发往192.168.3.12的TCP数据包

      IP(dst="192.168.3.12")/fuzz(TCP())

以上这些函数都只能用来发送数据包,但是无法用来接收数据包

  • 发送和接收数据包的函数

    • 比较sr( )和send( )的区别

      sr(IP(dst="192.168.3.14")/ICMP())

    • src( )函数是scapy的核心,它的返回值是两个列表,第一个列表是收到了应答的包和对应的应答,第二个列表是未收到应答的包。所以可以使用两个列表来保存sr( )的返回值。

      ans,unans=sr(IP(dst="192.168.3.14")/ICMP())

    • 这里面使用了ans和uans来保存cr( )的返回值,因为发出去的是一个ICMP的请求数据包,而且也收到了一个应答包,所以这个发送的数据包和收到的应答包都被保存到了ans列表中,使用ans.summary( )可以查看两个数据包的内容,而unans列表为空。

    • sr1( )函数和sr( )函数作用基本一样,但是只返回一个应答的包。只需要使用一个列表就可以保存这个函数的返回值。例如如下代码:

      p=sr1(IP(dst="192.168.3.14")/ICMP())

    • sniff( )函数

      通过此函数可以在自己的程序中捕获经过本机网卡的数据包。

      使用sniff( )开始监听,但是捕获的数据包不会即时显示,只有当使用Ctrl+C停止监听时,才会显示捕获的数据包。如图:捕获到了1161个TCP类型的数据包,232个UDP类型的数据包,0个ICMP型的数据包,0个其他类型的数据包。

    ​ 而count则用来指定监听到数据包的数量,达到指定的数量就会停止监听。例如,只希望监听三个数据包就停止:sniff(count=3)

    ​ 那我们设计一个综合性的监听器,它会在网卡eth0上监听源地址或者目的地址为192.168.3.14的icmp数据包,当收到了三个这样的数据包后,就会停止监听。首先在scapy中创建如下监听器:

    ​ sniff(filter="host 192.168.3.14 and icmp",count=3,iface="eth0")

    rdpcap函数

    scapy中的rdpcap主要用来读取数据包

posted @ 2021-02-10 10:19  小滢小滢考第一名  阅读(455)  评论(0编辑  收藏  举报