1. 核心免责
本文仅用于网络安全合法学习、个人实验、系统加固,所有操作仅限本人拥有所有权的虚拟机与设备。严禁用于未经授权的入侵、攻击、渗透行为,一切非法操作自行承担法律责任。
2. 实验环境声明
文中所有攻击、破解、渗透步骤均在本地虚拟机中完成,不对任何第三方服务器、网站、设备进行测试。
3. 安全立场
本文以防御、加固、安全意识为核心,旨在提升读者的网络安全防护能力,共建安全网络环境。
前言:
SSH 作为 Linux 服务器远程管理的核心协议,凭借加密传输的特性成为运维人员的首选工具,但这并不意味着它绝对安全。在实际的网络环境中,针对 SSH 服务的暴力破解攻击始终占据着服务器入侵事件的很大比例,攻击者通过穷举用户名与密码的组合,往往能轻易攻破使用弱口令的服务器。为了深入理解这类攻击的原理与防护手段,我们搭建了模拟环境,完成了从攻击渗透到安全加固的完整攻防实验,以此梳理 SSH 服务的安全防护体系。
一、实验环境:攻防双方的准备
本次实验我们搭建了一套小型的模拟网络环境,分别部署攻击机与靶机,以此还原真实的攻防场景。
1. 网络拓扑
攻击机:采用 Kali Linux 系统,IP 地址为
192.168.1.100,该系统集成了大量的渗透测试工具,我们将使用其中的 Metasploit 框架来发起针对 SSH 服务的攻击。靶机:采用 Ubuntu Linux 系统,IP 地址为
192.168.1.200,作为本次实验的攻击目标,运行标准的 OpenSSH 服务,模拟真实的生产服务器。
2. 环境配置
为了保证两台主机能够正常通信,我们将两台虚拟机的网络模式设置为桥接模式或 NAT 模式,确保彼此之间可以正常 Ping 通。 同时,我们需要在靶机 Ubuntu 上开启 SSH 服务,为攻击提供目标:
sudo apt update
sudo apt install openssh-server # 若系统未预装则执行安装
sudo systemctl start ssh
sudo systemctl enable ssh二、实验原理:暴力破解的底层逻辑
在开始攻防操作之前,我们需要先理解整个实验的核心原理,明白攻击与防护背后的逻辑。
1. SSH 协议基础
SSH(Secure Shell)是一种加密的网络传输协议,它能够在不安全的网络中为远程登录提供安全的传输通道,有效防止窃听、篡改等中间人攻击。SSH 服务默认监听 TCP 的 22 端口,这也是攻击者最常扫描的目标端口之一。
2. 暴力破解攻击原理
SSH 暴力破解是攻击者针对 SSH 服务最常用的入侵手段。由于 SSH 服务默认支持用户名 + 密码的认证方式,攻击者可以通过自动化工具,不断尝试不同的用户名和密码组合,直到猜测出正确的登录凭据。
字典攻击:攻击者会使用提前准备好的字典文件,其中包含了大量常见的用户名和密码,逐行进行尝试,这也是本次实验采用的攻击方式。
自动化攻击模块:我们使用的 Metasploit 框架中的
ssh_login模块,正是基于 Ruby 的 SSH 客户端库实现,它可以自动化地遍历字典中的用户名和密码组合,一旦认证成功,就会立刻建立与靶机的会话,完成入侵。
三、渗透攻击:暴力破解的完整流程
接下来我们将从攻击方的视角,完整复现针对 SSH 服务的暴力破解入侵过程。
1. 信息收集:确认目标服务状态
在发起攻击之前,我们首先需要确认靶机的 SSH 服务是否正常开启,这是攻击的前提。在 Kali 攻击机的终端中,我们使用 nmap 工具对靶机的 22 端口进行服务版本扫描:
nmap -sV -p 22 192.168.1.200扫描完成后,我们可以得到靶机 22 端口的开放状态,以及对应的 OpenSSH 服务版本,确认攻击目标可用。
2. 准备攻击字典
暴力破解的核心是用户名和密码的字典,Kali Linux 系统已经为我们预装了常用的字典文件,存放在/usr/share/metasploit-framework/data/wordlists/目录下。 本次实验我们使用系统自带的unix_users.txt作为用户名字典,unix_passwords.txt作为密码字典。为了保证实验能够顺利进行,我们需要提前在靶机上创建一个带有弱口令的测试账户,比如用户test,密码123456,确保这个组合存在于我们的字典中。
3. 启动 Metasploit 并加载攻击模块
接下来我们启动 Metasploit 框架,这是渗透测试中最常用的工具之一,它集成了大量的攻击模块。在终端中输入以下命令启动 MSF 控制台:
msfconsole进入控制台后,我们搜索并加载针对 SSH 的暴力破解模块:
search ssh_login
use auxiliary/scanner/ssh/ssh_login4. 配置攻击参数
加载模块后,我们需要配置攻击的相关参数,首先可以通过show options查看当前模块需要配置的参数,然后依次设置:
set RHOSTS 192.168.1.200 # 设置靶机的IP地址
set USER_FILE /usr/share/metasploit-framework/data/wordlists/unix_users.txt # 指定用户名字典
set PASS_FILE /usr/share/metasploit-framework/data/wordlists/unix_passwords.txt # 指定密码字典
set THREADS 5 # 设置并发线程数,提升攻击速度
set STOP_ON_SUCCESS true # 一旦破解成功就停止攻击,避免多余的尝试
set VERBOSE true # 显示详细的尝试过程,方便观察攻击进度5. 发起暴力破解攻击
完成参数配置后,我们输入run命令即可发起攻击:
run此时终端会开始滚动显示每一次的尝试记录,工具会逐个遍历字典中的用户名和密码组合,尝试登录靶机的 SSH 服务。当匹配到正确的凭据时,终端会显示绿色的Success提示,同时 Metasploit 会自动建立一个与靶机的 Shell 会话。
6. 验证入侵结果
攻击成功后,Metasploit 会提示我们新建立的会话 ID,比如Session 1。我们可以通过以下命令连接到这个会话,进入靶机的命令行环境:
sessions -i 1进入会话后,我们可以输入id或whoami命令来验证当前的权限,此时我们已经成功以测试用户的身份登录了靶机,完成了整个入侵过程。
id
# 输出示例: uid=1000(test) gid=1000(test) groups=1000(test)四、安全防护:构建 SSH 的防御体系
在了解了攻击的完整流程后,我们回到靶机的视角,针对这类暴力破解攻击,构建一套完整的安全防护体系。
1. 账号与密码加固:筑牢第一道防线
暴力破解的核心前提是存在弱口令,因此最基础的防护就是从账号本身入手,强化密码策略,大幅提升攻击者的穷举成本。 我们可以进行以下操作:
强制用户使用复杂密码,要求密码包含大小写字母、数字、特殊符号,并且长度不低于 8 位,避免使用生日、手机号等容易被猜测的内容。
修改现有用户的密码,将弱口令替换为高强度的复杂密码:
passwd test # 将密码修改为如 Test@2024!Secure 这类高强度密码锁定系统中不常用的默认账户,避免攻击者利用这些默认账户进行尝试:
sudo passwd daemon
sudo passwd -l bin2. SSH 配置文件加固:缩小攻击面
通过修改 SSH 的核心配置文件,我们可以调整 SSH 服务的运行参数,缩小攻击面,减少攻击者可利用的入口。 首先编辑 SSH 的配置文件:
sudo nano /etc/ssh/sshd_config在文件中进行以下修改:
修改默认端口:将默认的 22 端口修改为非标准端口,比如 2222,这样可以避开绝大多数自动化的批量扫描工具,因为这些工具默认只会扫描 22 端口。
Port 2222禁止 Root 远程登录:Root 账户是服务器的最高权限账户,禁止 Root 直接远程登录,可以避免攻击者一旦破解 Root 密码就直接获得服务器的完全控制权。
PermitRootLogin no禁止空密码登录:彻底杜绝空密码账户的登录可能,避免攻击者利用这类漏洞入侵。
PermitEmptyPasswords no限制允许登录的用户:仅允许指定的用户进行 SSH 远程登录,拒绝其他所有账户的登录请求,进一步缩小攻击范围。
AllowUsers user1修改完成后,重启 SSH 服务使配置生效:
sudo systemctl restart ssh3. 主动防御:Fail2Ban 的动态封禁
静态的配置无法完全应对自动化的攻击工具,我们可以借助 Fail2Ban 实现动态的主动防御。Fail2Ban 会实时监控系统的认证日志,当检测到同一个 IP 在短时间内多次登录失败时,会自动将该 IP 加入系统的黑名单,阻断其后续的连接请求,有效拦截自动化的暴力破解工具。
具体的配置步骤如下:
安装 Fail2Ban 工具:
sudo apt install fail2ban创建本地配置文件,配置 SSH 防护规则:
sudo nano /etc/fail2ban/jail.local在配置文件中写入以下内容:
[sshd]
enabled = true
port = ssh # 如果修改了SSH端口,这里需要改为对应的端口,比如2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3 # 最大尝试次数,超过就封禁
bantime = 600 # 封禁时长,单位为秒,这里设置为10分钟,-1代表永久封禁
findtime = 600 # 检测的时间窗口
ignoreip = 127.0.0.1/8 # 白名单IP,本地地址不会被封禁重启 Fail2Ban 服务,使配置生效:
sudo systemctl restart fail2ban4. 终极方案:公钥认证替代密码认证
无论密码设置得多么复杂,本质上还是存在被穷举的可能,而公钥认证则从根本上解决了这个问题。SSH 的密钥对认证机制中,用户需要持有私钥才能完成登录,而私钥的加密强度极高,几乎不可能被暴力破解,这是目前最安全的 SSH 登录方式。
配置步骤如下:
首先在客户端(也就是我们的 Kali 攻击机)上生成 SSH 密钥对:
ssh-keygen -t rsa执行命令后按照提示操作即可,也可以为私钥设置一个密码短语,进一步提升安全性。 2. 将生成的公钥发送到 Ubuntu 靶机上,完成授权:
ssh-copy-id -i ~/.ssh/id_rsa.pub user@192.168.1.200在 Ubuntu 靶机上关闭密码认证,只保留公钥认证: 编辑 SSH 配置文件
/etc/ssh/sshd_config,修改以下配置:
PasswordAuthentication no
PubkeyAuthentication yes重启 SSH 服务,使配置生效:
sudo systemctl restart ssh五、防御效果验证:确认防护的有效性
完成所有的防护配置后,我们再次回到攻击机,复现之前的攻击流程,以此验证我们的防护策略是否生效。
Fail2Ban 防护验证:我们在 Kali 攻击机上使用错误的密码多次尝试连接 SSH 服务,然后在靶机上查看 Fail2Ban 的状态:
sudo fail2ban-client status sshd此时我们可以看到,Kali 的 IP 地址已经被列入了封禁 IP 列表中,此时再尝试连接 SSH,会直接提示连接被拒绝,攻击已经被阻断。
端口修改验证:我们再次使用 nmap 扫描靶机的 22 端口:
nmap -sV -p 22 192.168.1.200此时会发现 22 端口已经关闭,Metasploit 的默认配置已经无法连接到 SSH 服务,除非攻击者手动指定新的端口,这就过滤掉了绝大多数的自动化扫描攻击。
公钥认证验证:此时即使攻击者拿到了正确的用户名和密码,尝试使用密码登录 SSH,也会直接提示
Permission denied,只有持有对应私钥的用户才能正常登录,暴力破解已经完全失去了作用。
六、实验总结
通过本次完整的攻防实验,我们清晰地还原了 SSH 暴力破解攻击的完整流程,也验证了各类防护手段的实际效果。实验结果表明,单纯依赖密码认证的 SSH 服务存在极大的安全隐患,弱口令账户很容易就会被攻击者攻破。
而通过多层防护体系的构建 —— 从基础的强密码策略,到 SSH 配置的加固,再到 Fail2Ban 的主动防御,最终升级到公钥认证,我们可以有效抵御绝大多数针对 SSH 服务的暴力破解攻击,为服务器的远程管理构建起足够坚固的安全防线,保障服务器的运行安全。
再次强调!!!仅用于合法授权环境
默认评论
Halo系统提供的评论