scapy_arp扫描

0x00 ARP协议

  1. ARP协议:地址解析协议,用于局域网内将IP地址解析为MAC地址。
  2. 数据包结构:ARP请求分为两部分,请求包与响应包,其中请求包是通过ARP广播进行发送。
    请求包结构:
    scapy_arp扫描_第1张图片
    在请求包中,应为请求是通过广播发送的,目的MAC地址为FF:FF:FF:FF:FF:FF
    响应包结构:
    scapy_arp扫描_第2张图片

0x01 单个ARP扫描:

  1. 实现代码
import  logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)   #q清除报错信息
from scapy.all import *

def scapy_arp_scan(ip_address,queue=None,ifname="Intel(R) Dual Band Wireless-AC 3165"):
    result_raw=srp(Ether(dst="FF:FF:FF:FF:FF:FF")/
                   ARP(op=1,hwdst='00:00:00:00:00:00',pdst=ip_address),
                   timeout=3,
                   iface=ifname, #指定发包网卡
                   verbose=False)
    try:
        result_list=result_raw[0].res   #把响应的数据包对,产生为清单
        #[0]第一组响应数据包
        #[1]接收到的包,[0]为发送的数据包
        #[1]ARP头部字段中的['hwsrc']字段,作为返回值返回
        if queue==None:
            return result_list[0][1].getlayer(ARP).fields['hwsrc']
        else:
            queue.put((ip_address,result_list[0][1].getlayer(ARP).fields['hwsrc']))
    except:
        return
#show_interfaces()

if __name__ =="__main__":
    print(scapy_arp_scan("10.154.0.8"))

返回的结果存储在列表中,列表里面包含请求与响应的包信息:
(>, >>)

  1. 运行结果:scapy_arp扫描_第3张图片

0x01 开启多线程扫描

ps:python多线程的弊端,父线程结束时子线程还未结束,则结果无法及时返回父线程进行处理,导致结果出现错误,这在前面的ping扫描中也存在。

import  logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)   #q清除报错信息
from scapy.all import *
import ipaddress
from multiprocessing import Process,Queue

#多线程扫描
def scan_arp_scan(network):
    qyt_queue=Queue()   #用于进程间通信
    net=ipaddress.ip_network(network)
    for ip in net:
        ip_addr=str(ip) #转换为字符串类型
        print(ip_addr)
        arp_one=Process(target=scapy_arp_scan,args=(ip_addr,qyt_queue))
        arp_one.start()
        time.sleep(2)


    """
    Queue.qsize() 返回队列大小
    Queue.empty() 如果队列为空,返回true
    Queue.full()  如果队列满了,返回true
    """
    #print(qyt_queue.qsize())
    ip_mac_list=[]
    while True:
        if qyt_queue.empty(): #队列为空
            break
        else:
            ip,mac=qyt_queue.get()  #提取队列中的IP,和MAC
            ip_mac_list.append((ip,mac))
    return  ip_mac_list

#单个扫描函数
def scapy_arp_scan(ip_address,queue=None,ifname="Intel(R) Dual Band Wireless-AC 3165"):
    result_raw=srp(Ether(dst="FF:FF:FF:FF:FF:FF")/
                   ARP(op=1,hwdst='00:00:00:00:00:00',pdst=ip_address),
                   timeout=3,
                   iface=ifname, #指定发包网卡
                   verbose=False)
    try:
        result_list=result_raw[0].res   #把响应的数据包对,产生为清单
        #[0]第一组响应数据包
        #[1]接收到的包,[0]为发送的数据包
        #[1]ARP头部字段中的['hwsrc']字段,作为返回值返回
        if queue==None:
            return result_list[0][1].getlayer(ARP).fields['hwsrc']
        else:
            queue.put((ip_address,result_list[0][1].getlayer(ARP).fields['hwsrc']))
    except:
        return
#show_interfaces()

if __name__ =="__main__":
    #print(scapy_arp_scan("10.154.0.1"))
    active_ip_mac=scan_arp_scan("10.154.0.0/30")
    print('#'*25)
    for ip,mac in active_ip_mac:
        print(ip+":"+mac)

你可能感兴趣的:(scapy)