当前位置: 首页 > news >正文

【详细】SSH公私钥认证与渗透测试攻击场景

SSH(Secure Shell)是一个用于远程登录和执行命令的网络协议,其认证方式通常有两种:基于密码的认证和基于公私钥的认证。本文将详细介绍SSH公私钥认证机制,并探讨在渗透测试场景中,如何利用对靶机具有读取和写入权限的情况下,进行公私钥认证攻击。


公私钥认证基础知识

SSH公私钥认证流程

SSH的公私钥认证机制基于非对称加密原理,旨在通过验证客户端的身份来确保远程访问的安全性。与传统的密码认证不同,公私钥认证不依赖于明文密码,因此具有更高的安全性。其认证流程可以分为以下几个关键步骤:

1. 客户端生成公私钥对

首先,客户端需要生成一对公私钥。公钥可以公开,而私钥则必须严格保密。生成密钥对的常用工具是 ssh-keygen,生成的私钥通常存储在客户端机器的 ~/.ssh/id_rsa 路径中,而公钥则存储在 ~/.ssh/id_rsa.pub 文件中。

生成命令如下:

ssh-keygen -t rsa -b 2048
  • -t rsa:指定使用RSA算法生成密钥对。
  • -b 2048:指定密钥长度为2048位,以提高加密强度。
2. 客户端将公钥添加到远程主机的 authorized_keys 文件

生成公私钥对后,客户端需要将公钥上传到远程主机的 authorized_keys 文件中。该文件通常位于远程主机的用户主目录下的 .ssh/authorized_keys 路径。

常用的上传方法是通过 ssh-copy-id 工具:

ssh-copy-id username@remote_host

此命令将客户端的公钥自动添加到目标主机的 authorized_keys 文件中。如果手动操作,客户端可以将 id_rsa.pub 中的内容复制到远程主机的 authorized_keys 文件。

3. 客户端发起SSH连接

当客户端准备登录远程主机时,会通过 ssh 命令发起连接,并指定使用私钥进行身份验证。此时,客户端会向远程主机提供自己的私钥,启动身份验证过程。

ssh -i ~/.ssh/id_rsa username@remote_host
4. SSH连接的身份验证过程

身份验证是SSH公私钥认证的核心步骤,包含以下几个阶段:

  • 远程主机发送挑战消息:当客户端连接到远程主机时,远程主机会向客户端发送一个随机生成的“挑战消息”。

  • 客户端使用私钥签名:客户端使用私钥对挑战消息进行签名。由于私钥是唯一的,只有客户端持有私钥,其他人无法伪造签名。

  • 客户端发送签名结果:客户端将签名结果发送回远程主机。

  • 服务器验证签名:远程主机使用客户端事先上传的公钥验证签名。如果签名验证成功,表示客户端的身份是合法的,SSH连接被允许建立。若公钥不匹配,则连接会被拒绝。

5. 私钥加密保护与密码输入

如果客户端的私钥设置了密码保护,系统会在使用该私钥进行身份验证时要求输入密码。密码保护增强了安全性,即使私钥泄露,未经授权的人也无法使用私钥登录。

6. 登录成功

一旦签名验证成功,且(如果有)私钥密码输入正确,远程主机会建立SSH会话,允许客户端访问远程主机。客户端即可执行命令、传输文件等。

公钥和私钥的信任关系

  • 私钥:私钥用于身份验证,保存在客户端,必须严格保密。私钥的安全性至关重要,一旦私钥泄露,攻击者可以伪装成客户端进行登录。

  • 公钥:公钥是用来授权的,存放在远程主机的 authorized_keys 文件中。公钥允许服务器确认客户端身份,服务器根据客户端提供的签名验证公钥的合法性。

虽然公钥可以公开,但公钥本身并不提供认证功能,认证过程依赖于私钥和公钥的匹配关系。也就是说,公钥和私钥是一对匹配的密钥,只有拥有私钥的一方才能通过公钥认证成功。

信任链的建立

公私钥认证的安全性依赖于服务器是否信任已上传的公钥。一旦客户端的公钥被添加到远程主机的 authorized_keys 文件中,远程主机就会信任该公钥所对应的私钥,从而允许该私钥对应的客户端进行无密码登录。这种机制避免了密码明文传输,提升了安全性。

公私钥生成与关联

私钥可以生成公钥,但反过来,公钥无法直接生成私钥。若你只拥有私钥,可以通过以下命令从私钥中恢复对应的公钥:

ssh-keygen -y -f id_rsa > id_rsa.pub
  • -y:表示从已有的私钥生成公钥。
  • -f id_rsa:指定私钥文件的路径。
  • > id_rsa.pub:将生成的公钥输出到 id_rsa.pub 文件。

这种方法可以帮助恢复丢失的公钥,前提是你已拥有对应的私钥。

几个重要文件介绍

SSH的公私钥认证机制依赖于以下几个关键文件,通常位于用户的 ~/.ssh/ 目录下:

  • 私钥 (id_rsa):存储在客户端,必须严格保密。如果私钥泄露,攻击者可以使用该私钥登录目标主机。

  • 公钥 (id_rsa.pub):可以公开,通常用于授权其他系统进行无密码登录。公钥需要添加到远程主机的 authorized_keys 文件中。

  • 授权文件 (authorized_keys):存储了允许通过SSH登录的公钥列表。每个公钥对应一个客户端,服务器会根据该文件中的公钥来验证客户端身份。

对于这些文件,SSH对权限的要求如下:

  • authorized_keys 文件的权限通常设置为 600,即只有文件所有者可以读取和写入。
  • .ssh/ 目录的权限设置为 700,即只有文件所有者可以访问该目录。

配置要求

为了启用公钥认证,靶机的SSH服务需要进行相应配置。通常,这些配置位于 /etc/ssh/sshd_config 文件中。以下是必须启用的配置项:

PubkeyAuthentication yes
AuthorizedKeysFile     .ssh/authorized_keys
  • PubkeyAuthentication yes:启用公钥认证。
  • AuthorizedKeysFile .ssh/authorized_keys:指定公钥存放路径,通常为 ~/.ssh/authorized_keys

攻击场景一:获得靶机私钥进行登录

如果攻击者通过任意文件读取等漏洞获取了靶机用户的私钥,则攻击者可以使用该私钥直接登录。

为什么不需要依赖 authorized_keys 文件中的公钥?
当你持有对方的私钥时,服务器已经信任该私钥与对应的公钥是匹配的。因此,在进行SSH连接时,服务器会直接信任该私钥,不需要再验证是否有该公钥在 authorized_keys 文件中。因此,一旦你获得了对方的私钥,你就可以跳过公钥的验证过程,直接进行身份验证。

步骤

  1. 确保私钥权限正确:私钥文件的权限需要设置为 600,否则无法正常使用:

    chmod 600 id_rsa
    
  2. 尝试登录

    • 如果私钥没有设置密码保护,攻击者可以直接使用以下命令进行登录:
      ssh username@靶机IP -i id_rsa
      
    • 如果私钥加密(即设置了密码保护),攻击者需要知道私钥的密码。此时,可以尝试进行密码爆破。

爆破私钥密码

如果私钥加密且密码丢失,可以使用 john the ripper 工具进行密码爆破。以下是具体步骤:

  1. 转换私钥格式
    使用 ssh2john.py 脚本将私钥转换为 john 可以识别的格式:

    ssh2john id_rsa > ~/id_rsa.hash
    
  2. 进行密码爆破
    使用 john 工具进行爆破:

    john ~/id_rsa.hash --wordlist=/usr/share/wordlists/rockyou.txt
    
  3. 成功登录
    一旦密码爆破成功,攻击者就可以使用私钥登录:

    ssh username@靶机IP -i id_rsa
    

攻击场景二:通过公钥认证登录

如果攻击者对靶机具有目录写入权限,且靶机配置了公钥认证,那么攻击者可以将自己的公钥添加到靶机的 authorized_keys 文件中,从而实现无密码SSH登录。

步骤

  1. 生成SSH密钥对
    在攻击者的工作站(如Kali Linux)上生成一对新的SSH密钥对:

    ssh-keygen -t rsa
    
    • -t rsa:使用RSA算法生成密钥。
    • 按照提示完成生成过程,通常使用默认路径(如 /root/.ssh/id_rsa),并选择不设置密码保护(直接按回车跳过)。
  2. 查看公钥并复制
    查看并复制生成的公钥:

    cat /root/.ssh/id_rsa.pub
    
  3. 将公钥添加到靶机的 authorized_keys 文件
    如果攻击者具有写入靶机某些目录的权限,可以将自己的公钥添加到目标用户的 ~/.ssh/authorized_keys 文件中:

    echo "公钥内容" >> /home/username/.ssh/authorized_keys
    
  4. 无密码登录靶机
    完成上述步骤后,攻击者即可使用公钥进行无密码登录:

    ssh username@靶机IP
    

总结

在了解了SSH公私钥认证机制后,攻击者可以通过以下方式进一步扩大攻击面:

  • 获取SSH私钥:如果攻击者能够获取靶机的SSH私钥,并且目标系统配置了公钥认证,则可以直接通过私钥进行登录。
  • 写入公钥实现无密码登录:若攻击者能够访问靶机的 authorized_keys 文件,则可以通过将自己的公钥写入该文件,实现对靶机的无密码登录。

相关文章:

【详细】SSH公私钥认证与渗透测试攻击场景

SSH(Secure Shell)是一个用于远程登录和执行命令的网络协议,其认证方式通常有两种:基于密码的认证和基于公私钥的认证。本文将详细介绍SSH公私钥认证机制,并探讨在渗透测试场景中,如何利用对靶机具有读取和…...

常见的多媒体框架(FFmpeg GStreamer DirectShow AVFoundation OpenMax)

1.FFmpeg FFmpeg是一个非常强大的开源多媒体处理框架,它提供了一系列用于处理音频、视频和多媒体流的工具和库。它也是最流行且应用最广泛的框架! 官方网址:https://ffmpeg.org/ FFmpeg 的主要特点和功能: 编解码器支持: FFmpe…...

C++异步future

🌎 C11异步futrue 文章目录: C11异步futrue future介绍     应用场景     future操作       std::async函数模版       std::packaged_task类模版       std::promise类模版 🚀future介绍 std::future是C11标准库…...

Oracle 12c 中的 CDB和PDB的启动和关闭

一、简介 Oracle 12c引入了多租户架构,允许一个容器数据库(Container Database, CDB)托管多个独立的可插拔数据库(Pluggable Database, PDB)。本文档旨在详细描述如何启动和关闭CDB及PDB。 二、容器数据库 (CDB) 2.1…...

Vue组件开发-使用 html2canvas 和 jspdf 库实现PDF文件导出 设置页面大小及方向

在 Vue 项目中实现导出 PDF 文件、调整文件页面大小和页面方向的功能,使用 html2canvas 将 HTML 内容转换为图片,再使用 jspdf 把图片添加到 PDF 文件中。以下是详细的实现步骤和代码示例: 步骤 1:安装依赖 首先,在项…...

chrome插件:网页图片高清下载

前置条件: 安装有chrome谷歌浏览器的电脑 使用步骤: 1.打开chrome扩展插件 2.点击管理扩展程序 3.加载已解压的扩展程序 4.选择对应文件夹 5.成功后会出现一个扩展小程序 6.点击对应小程序 7.输入需要访问的网址,点击扩展插件即可进行图片…...

汽车定速巡航

配备定速巡航功能的车型,一般在方向盘附近设有4~6个按键(可能共用键位)。 要设置定速巡航,不仅需要方向盘上的按键,还要油门配合。 设置的一般流程: 开关:类似步枪上的“保险”,按…...

CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测(Matlab完整源码和数据)

CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测(Matlab完整源码和数据) 目录 CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测(Matlab完整源码和数据)预测效果基本介绍 CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测一…...

WPF基础 | WPF 布局系统深度剖析:从 Grid 到 StackPanel

WPF基础 | WPF 布局系统深度剖析:从 Grid 到 StackPanel 一、前言二、Grid 布局:万能的布局王者2.1 Grid 布局基础:构建网格世界2.2 子元素定位与跨行列:布局的精细操控2.3 自适应布局:灵活应变的秘诀 三、StackPanel…...

14-6-2C++STL的list

(一&#xff09;list对象的带参数构造 1.list&#xff08;elem);//构造函数将n个elem拷贝给本身 #include <iostream> #include <list> using namespace std; int main() { list<int> lst(3,7); list<int>::iterator it; for(itlst.begi…...

【AI论文】Sigma:对查询、键和值进行差分缩放,以实现高效语言模型

摘要&#xff1a;我们推出了Sigma&#xff0c;这是一个专为系统领域设计的高效大型语言模型&#xff0c;其独特之处在于采用了包括DiffQKV注意力机制在内的新型架构&#xff0c;并在我们精心收集的系统领域数据上进行了预训练。DiffQKV注意力机制通过根据查询&#xff08;Q&…...

私域流量池构建与转化策略:以开源链动2+1模式AI智能名片S2B2C商城小程序为例

摘要&#xff1a;随着互联网技术的快速发展&#xff0c;流量已成为企业竞争的关键资源。私域流量池&#xff0c;作为提升用户转化率和增强用户粘性的有效手段&#xff0c;正逐渐受到企业的广泛关注。本文旨在深入探讨私域流量池构建的目的、优势及其在实际应用中的策略&#xf…...

vofa++使用方法

控件区可以添加控件用来啊多样显示 点击一个控件然后右键可以选择要添加显示的数据&#xff0c;点all表全部显示&#xff0c; 点auto可以自动布局 要用控件需要选择协议&#xff0c;不知道协议具体格式可以点击问号看看&#xff0c;并且最好用printf重定义来实现 比如我要实现F…...

LogicFlow 一款流程图编辑框架

LogicFlow是什么 LogicFlow是一款流程图编辑框架&#xff0c;提供了一系列流程图交互、编辑所必需的功能和灵活的节点自定义、插件等拓展机制。LogicFlow支持前端自定义开发各种逻辑编排场景&#xff0c;如流程图、ER图、BPMN流程等。在工作审批流配置、机器人逻辑编排、无代码…...

HTML<kbd>标签

例子 在文档中将一些文本定义为键盘输入&#xff1a; <p>Press <kbd>Ctrl</kbd> <kbd>C</kbd> to copy text (Windows).</p> <p>Press <kbd>Cmd</kbd> <kbd>C</kbd> to copy text (Mac OS).</p>…...

PyQt6医疗多模态大语言模型(MLLM)实用系统框架构建初探(上.文章部分)

一、引言 1.1 研究背景与意义 在数字化时代,医疗行业正经历着深刻的变革,智能化技术的应用为其带来了前所未有的发展机遇。随着医疗数据的指数级增长,传统的医疗诊断和治疗方式逐渐难以满足现代医疗的需求。据统计,全球医疗数据量预计每年以 48% 的速度增长,到 2025 年将…...

150 Linux 网络编程6 ,从socket 到 epoll整理。listen函数参数再研究

一 . 只能被一个client 链接 socket例子 此例子用于socket 例子&#xff0c; 该例子只能用于一个客户端连接server。 不能用于多个client 连接 server socket_server_support_one_clientconnect.c /* 此例子用于socket 例子&#xff0c; 该例子只能用于一个客户端连接server。…...

深入浅出 SQLSugar:快速掌握高效 .NET ORM 框架

SQLSugar 是一个高效、易用的 .NET ORM 框架&#xff0c;支持多种数据库&#xff08;如 SQL Server、MySQL、PostgreSQL 等&#xff09;。它提供了丰富的功能&#xff0c;包括 CRUD 操作、事务管理、动态表名、多表联查等&#xff0c;开发者可以通过简单的链式操作实现复杂的数…...

ESP8266 NodeMCU与WS2812灯带:实现多种花样变换

在现代电子创意项目中&#xff0c;LED灯带的应用已经变得极为广泛。通过结合ESP8266 NodeMCU的强大处理能力和FastLED库的高效功能&#xff0c;我们可以轻松实现多达100种灯带变换效果。本文将详细介绍如何使用Arduino IDE编程&#xff0c;实现从基础到高级的灯光效果&#xff…...

MacOS安装Docker battery-historian

文章目录 需求安装battery-historian实测配置国内源相关文章 需求 分析Android电池耗电情况、唤醒、doze状态等都要用battery-historian&#xff0c; 在 MacOS 上安装 battery-historian&#xff0c;可以使用 Docker 进行安装runcare/battery-historian:latest。装完不需要做任…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

TCP/IP 网络编程 | 服务端 客户端的封装

设计模式 文章目录 设计模式一、socket.h 接口&#xff08;interface&#xff09;二、socket.cpp 实现&#xff08;implementation&#xff09;三、server.cpp 使用封装&#xff08;main 函数&#xff09;四、client.cpp 使用封装&#xff08;main 函数&#xff09;五、退出方法…...

Appium下载安装配置保姆教程(图文详解)

目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…...

欢乐熊大话蓝牙知识17:多连接 BLE 怎么设计服务不会乱?分层思维来救场!

多连接 BLE 怎么设计服务不会乱&#xff1f;分层思维来救场&#xff01; 作者按&#xff1a; 你是不是也遇到过 BLE 多连接时&#xff0c;调试现场像网吧“掉线风暴”&#xff1f; 温度传感器连上了&#xff0c;心率带丢了&#xff1b;一边 OTA 更新&#xff0c;一边通知卡壳。…...