如何在python使用scapy模块实现一个ARP扫描功能

  介绍

这篇文章给大家介绍如何在python使用scapy模块实现一个ARP扫描功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。


包的构造:

def  scapy_arp_one (ip_address,队列=None):=,Packet 醚(dst=& # 39; FF: FF: FF: FF: FF: FF # 39;),/, ARP (op=1, hwdst=& # 39; 00:00:00:00:00:00: & # 39;,, pdst=ip_address)

请求包的发送:

arp =, srp(包,超时=0.2,,verbose=False)

返回包的接收

试题:   reply_list 才能=,arp [0] r   if 才能;queue  is 没有:   ,,return  reply_list [0] [1] .getlayer (ARP) .fields [& # 39; hwsrc& # 39;】   其他的才能:   ,,queue.out (ip_address, reply_list [0] [1] .getlayer (ARP) .fields [& # 39; hwsrc& # 39;)))   ,除了:   返回才能

这里采用队列的模式,主要是为了后面多进程同时发送做准备,涉及到ARP包的接受。这里我简单描述一下ARP包接受的情况,当我们发送ARP广播包的之后,我们就会接受到一个返回包,所以正确的情况就是,一个发送包一个接收包,一个发送包一个接收包,所以这里采用队列的方式,一个一个IP地址的接收,并使用列表进行存储,然后过滤ARP把内容,接收ARP中的硬件MAC地址

完整代码:

# !/usr/bin/env  python3   #,- *安康;编码:utf-8  - *   #,作者:Ameng, jlx-love.com      得到scapy.all  import  *   import 系统         def  scapy_arp_one (ip_address,队列=None):=,Packet 醚(dst=& # 39; FF: FF: FF: FF: FF: FF # 39;),/, ARP (op=1, hwdst=& # 39; 00:00:00:00:00:00: & # 39;,, pdst=ip_address)=,,arp  srp(包,超时=0.2,,verbose=False)   ,试一试:   reply_list 才能=,arp [0] r   if 才能;queue  is 没有:   ,,return  reply_list [0] [1] .getlayer (ARP) .fields [& # 39; hwsrc& # 39;】   其他的才能:   ,,queue.out (ip_address, reply_list [0] [1] .getlayer (ARP) .fields [& # 39; hwsrc& # 39;)))   ,除了:   ,返回      if  __name__ ==, & # 39; __main__ # 39;:   ,scapy_arp_one (sys.argv [1])

进一步完善

那么既然我们已经了解了使用ARP进行基本的发包和收包,那么我们接下来就来编写一个能够扫描整个网段的ARP检测

理一下思路,首先,我们需要将ip地址编程一个网段中的所有ip,可以借助ipaddress模块实现,其次我们知道我们接收响应包是一对的,所以我们可以从一对一对的响应包中接收我们需要的目标ip和MAC源地址,其次就是优化代码,输出结果,这里我不再采用sys模块进行传参,而是采用一个新的模块optparse,具体使用方法可以百度百科

完整代码:

# !/usr/bin/env  python3   #,- *安康;编码:utf-8  - *   #,作者:Ameng, jlx-love.com      import 时间   得到scapy.all  import  *   import  ipaddress   import  optparse         def  scapy_arp_scan(网络,ifname):=,,net  ipaddress.ip_network(网络)=,ip_addr  []   ,for  ip 净拷贝:   ip 才能=,str (ip)   ip_addr.append才能(ip)   ,time . sleep (1)=,Packet 醚(dst=& # 39; FF: FF: FF: FF: FF: FF # 39;)/ARP (op=1, hwdst=& # 39; 00:00:00:00:00:00& # 39;,, pdst=ip_addr)=,,arp  srp(包,iface =, ifname,, timeout =, 1, verbose =,假)=,arp, arp_list  [0] r=,IP_MAC_LIST  []   ,for  n 拷贝范围(len (arp_list)):,,   时间=IP 才能;arp_list [n] [1] [1] .fields [& # 39; psrc& # 39;】   时间=MAC 才能;arp_list [n] [1] [1] .fields [& # 39; hwsrc& # 39;】   IP_MAC 才能=,(IP, MAC)   IP_MAC_LIST.append才能(IP_MAC)   return  IP_MAC_LIST         if  __name__ ==, & # 39; __main__ # 39;:=,,t1  time.time ()=,,parser  optparse.OptionParser(& # 39;用法:\ n  python3  scapy_arp_scan.py ——network 扫描网段,——ifname 网卡名称& # 39;)   ,parser.add_option(& # 39;——网络# 39;,,dest =, & # 39;网络# 39;,,type =, & # 39;字符串# 39;,,help =, & # 39;扫描网段& # 39;)   ,parser.add_option (& # 39;——ifname& # 39;,, dest =, & # 39; ifname& # 39;,, type =, & # 39;字符串# 39;,,help =, & # 39;网卡名称& # 39;)   ,(选项,,args),=, parser.parse_args ()=,network  options.network=,ifname  options.ifname   ,if  network ==, None 或是ifname ==,没有:   ,打印(parser.usage)   ,其他的:   active_ip_mac 才能=,scapy_arp_scan(网络,ifname)   打印才能(& # 39;存活的IP地址及对应麦克:& # 39;)   for 才能,ip, mac 拷贝active_ip_mac:   ,才能打印(ip, mac)=,,t2  time.time ()   ,print(& # 39;所用时间为:{}& # 39;.format (int (t2 ,安康,t1)))

如何在python使用scapy模块实现一个ARP扫描功能