scapy的粗略学习
scapy模块文件
scapy的基本操作
打开scapy:sudo scapy
IP数据包最重要的属性就是源地址和目的地址,这两个属性可以使用src和dst来设置。
- 例如,要构造一个发送“192.168.3.5”的IP数据包,可以使用下面语句
ip=IP(dst="192.168.3.5")
ip
就会跳出
dst表示目的地址,src表示源地址
【附】如何查看虚拟机本地的ip地址:先安装net-tools(sudo apt install net-tools)
输入ifconfig即可得到。
- 这个目标的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主要用来读取数据包
-