Python3 slowloris安裝使用教程

2022-06-26 01:39:13 字數 3183 閱讀 7349

今天提到slowloris,這東西看著很眼熟,應該是以前局方打算用來刷競賽積分的工具。我總覺得dos沒什麼意思,但記不得怎麼用了所以還是研究一下。

slowloris就是乙個python庫直接用pip安裝就可以了。但要使用slowloris命令注意要麼切換到當前python環境的scripts目錄,要麼將該目錄加入到環境變數。

最簡單的,直接slowloris後加ip或網域名稱即可,如:

slowloris 192.168.1.1
但是預設是150個連線效果可能不明顯,可以使用-s引數指定連線數,如1000。具體引數說明如下:

slowloris本質就只是乙個簡短的python程式,要弄清原理直接看源**即可。

首先是隨便請求乙個不存在的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有什麼區別呢,為什麼很多人都誇他這不應該啊,不懂**出了問題)

昨天同事反映說建立不了連線,自己看了一下連線還是可以建的,但是一直都是幾個;這邊建不了更多連線資料報傳送很少很慢,但瀏覽器卻可以訪問頁面,這就很神奇了。

開始一直以為是目標**啟用了https,而該工具對ssl連線建立處理有問題。但一方面從**上看不出有什麼問題,另一方面從wireshark抓取到的資料報看,http內容是成功傳送了的,即上圖中的3個6個連線是成功建立了的。沒理由同樣的**,一些連線ssl處理有問題一些沒有問題,即問題不應該與是http還是https有關係。

繼續除錯發現在迴圈建立幾個連線之後就丟擲異常,丟擲異常之後就break,break之後就sleep。丟擲異常的原因是ssl連線建立過程中被伺服器rst掉了,建立一部分連線後就不允許新建,這種現像明顯是伺服器端設定了連線個數限制。問題分析到這就比較明白了。

建立連線的個數很少的原因是:迴圈建立連線過程中,只要出現異常,就不會繼續建了。

出現工具建不了新連線瀏覽器卻可以訪問的原因是:sleep時間段內工具建立的連線悉數被關閉,就騰出了連線使得瀏覽器能夠成功訪問;具體內言瀏覽器在工具出現except時間前後也是不能訪問的,只有在sleep一段時間後(連線被騰出後)瀏覽器才能成功訪問。

總而言之,「dos失效」這個問題有兩個成因,一是服務端做了連線個數限制,二是預設sleep 15秒太長了;前者我們做為客戶端無能為力,但可通過後者縮短休眼時間來解決(新版的有--sleeptime引數可直接配置休眼時間,舊版的沒有)。

參考:

python3 切片 python3 切片

取乙個list或tuple的部分元素是非常常見的操作。比如,乙個list如下 l michael sarah tracy bob jack 取前3個元素,應該怎麼做?笨辦法 l 0 l 1 l 2 michael sarah tracy 之所以是笨辦法是因為擴充套件一下,取前n個元素就沒轍了。取前n...

python3安裝 Python3的安裝

1.anaconda安裝 2.安裝包安裝 3.linux下的命令列安裝 centos red hat 1 sudo yum install y sudo yum update3 sudo yum install y python35u python35u libs python35u devel p...

python3異常例項 Python3 錯誤和異常

錯誤和異常 程式執行時有兩種可以分辨的錯誤 syntax error 和 exception 按中文來說,就是語法錯誤和異常。語法錯誤 語法錯誤也就是解析錯誤,是我們最優可能遇到的錯誤。while true print hello world file line 1,in?while true pr...