Python3利用scapy局域网实现自动多线程arp扫描功能
简介
在网络安全领域,arp扫描是一种基础的扫描技术,它通过发送arp请求,获取设备的MAC地址,以及搜集局域网IP和MAC地址的对应关系,从而进行各种实际利用和攻击。在本文中,我们将讲述如何使用Python3和scapy库,实现自动多线程arp扫描功能。
环境
- Python 3.x
- Scapy 2.x
实现思路
自动arp扫描主要实现可以分为以下几个步骤:
- 获取本机IP和对应的子网掩码,在局域网内获取所有本网段IP
- 启动多线程,以每个IP地址发送arp请求
- 解析响应数据包,收集在线设备信息
代码实现
我们将会利用Python的多线程,并使用Scapy编写arp请求和解析响应包。
先从获取本机IP和子网掩码开始:
import socket
import struct
def get_local_ip():
ip = socket.gethostbyname(socket.gethostname())
subnet = socket.inet_ntoa(struct.pack("!I", socket.htonl(0xFFFFFF00 & struct.unpack("!I", socket.inet_aton(ip))[0])))
return (ip, subnet)
上述函数中,通过socket.gethostbyname和socket.gethostname函数在本机获取IP地址,接着将其传入socket.inet_aton函数中使用struct.unpack函数从容器中获取整形inet地址,对其与0xFFFFFF00相与,然后使用socket.inet_ntoa再次将整形inet地址转换为点分十进制表示的IP地址,并加上子网掩码,最后返回。
获取本机IP和子网掩码之后,就可以获取本网段的IP地址列表了:
def get_ip_list(subnet):
ip_list = []
for i in range(1,255):
try:
ip = subnet.split(".")
ip = ip[0] + "." + ip[1] + "." + ip[2] + "." + str(i)
ip_list.append(ip)
except:
pass
return ip_list
在该函数中,我们将传入的子网掩码分割出IP前三段,并将i加入到第四段末尾,之后生成符合网络规范的IP地址,加入到列表ip_list中。
接着是发送arp请求和解析响应的函数:
def send_arp_request(ip):
arp_packet = Ether(dst='ff:ff:ff:ff:ff:ff', type=2054)/ARP(hwtype=1, ptype=2048, hwlen=6, plen=4, op=1, hwsrc=get_mac(), psrc=get_local_ip()[0], hwdst='00:00:00:00:00:00', pdst=ip)
ans, unans = srp(arp_packet, timeout=1, verbose=False)
if ans:
return (ip, ans[0][1].hwsrc)
else:
return None
在该函数中,我们使用Scapy的srp
函数来发送和接收arp请求和响应。构造arp请求包,设置请求类型和源IP地址、源MAC地址等信息,并使用多线程执行函数并返回结果,如果收到arp响应数据包,则返回IP地址和MAC地址对应,并将对应关系存到字典中,否则返回None。
最后,我们将各个方法放到主函数中,完成对局域网的arp扫描,如下所示:
import threading
ip_mac_dict = {}
lock = threading.Lock()
def main():
subnet = get_local_ip()[1]
ip_list = get_ip_list(subnet)
for ip in ip_list:
t = threading.Thread(target=scan_thread, args=(ip,))
t.start()
for thread in threading.enumerate():
if thread != threading.current_thread():
thread.join()
for ip,mac in ip_mac_dict.items():
print(ip + " : " + mac)
def scan_thread(ip):
res = send_arp_request(ip)
if res:
with lock:
ip_mac_dict[res[0]] = res[1]
print(res[0] + " >>>>>>>>> " + res[1])
在本文中,我们介绍了如何利用Python和Scapy实现自动多线程arp扫描,其中主要使用了Python的多线程和Scapy的srp函数来实现数据包发送和接收,通过将各个方法结合实现了对局域网IP地址和MAC地址的快速扫描,有利于网络管理和安全管理。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python3利用scapy局域网实现自动多线程arp扫描功能 - Python技术站