SSH 枚举与基于密钥的访问

LinuxBeginner
立即练习

介绍

欢迎来到本次实操实验,专注于 SSH 枚举和利用弱密钥认证。安全外壳 (SSH) 是安全远程管理的基础协议,但配置不当会产生重大的安全漏洞。

在本次实验中,你将模拟一次针对目标系统的渗透测试。你将首先验证网络连接,然后使用强大的 nmap 工具来枚举 SSH 服务并收集信息。接下来,你将利用提供的私钥来利用一种常见的配置错误——不当的文件权限——以获得无需密码的 shell 访问权限。最后,你将探索目标系统以查找并检索隐藏的 flag。

完成实验后,你将了解如何:

  • 使用 ping 验证网络连接。
  • 使用 nmap 枚举 SSH 服务。
  • 理解 SSH 密钥认证的基础知识。
  • 利用弱密钥权限获得未经授权的访问。
  • 导航远程系统以查找敏感信息。

让我们开始吧。

使用 Ping 验证与目标的连通性

在此步骤中,你将首先确认你的机器可以与目标系统通信。ping 命令是一个标准的网络诊断工具,它向主机发送 ICMP 数据包以测试其可达性。这是任何网络侦察中的第一个也是最基本的一步。

你的环境中包含一个可以通过主机名 target 访问的目标系统。

在终端中执行以下命令,向 target 发送四个数据包并验证其是否在线:

ping -c 4 target

你应该会看到类似以下的响应,确认目标是可达的,并且网络连接是稳定的。IP 地址和响应时间可能会略有不同。

PING target (172.17.0.2) 56(84) bytes of data.
64 bytes from target (172.17.0.2): icmp_seq=1 ttl=64 time=0.091 ms
64 bytes from target (172.17.0.2): icmp_seq=2 ttl=64 time=0.068 ms
64 bytes from target (172.17.0.2): icmp_seq=3 ttl=64 time=0.065 ms
64 bytes from target (172.17.0.2): icmp_seq=4 ttl=64 time=0.067 ms

--- target ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3074ms
rtt min/avg/max/mdev = 0.065/0.072/0.091/0.011 ms

在确认连接后,你就可以进行下一阶段的枚举了。

使用 Nmap 扫描开放端口

在此步骤中,你将使用 nmap 扫描目标开放的端口,并识别其上运行的服务。Nmap (Network Mapper) 是安全专业人员的关键工具,用于网络发现和安全审计。

我们将对端口 22(SSH 的标准端口)进行有针对性的扫描,以收集版本信息和主机密钥。

在你的终端中执行以下命令:

nmap -sV -p 22 --script ssh-hostkey target
  • -sV: 启用服务和版本检测。
  • -p 22: 指定仅扫描端口 22。
  • --script ssh-hostkey: 一个 Nmap 脚本引擎 (NSE) 脚本,用于检索目标的 SSH 主机密钥。

输出将类似于:

Starting Nmap 7.80 ( https://nmap.org ) at 2025-09-19 11:56 CST
Nmap scan report for target (172.17.0.2)
Host is up (0.00020s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.13 (Ubuntu Linux; protocol 2.0)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 0.78 seconds

扫描确认端口 22/tcp 是开放的,并且运行着 OpenSSH 8.9p1。此信息对于下一步尝试连接至关重要。

通过 SSH 连接目标

在此步骤中,你将使用提供的 SSH 私钥连接到目标。SSH 基于密钥的身份验证通常比基于密码的身份验证更安全,但它依赖于私钥的保密性以及客户端和服务器上文件权限的正确配置。

一个私钥文件 id_rsa 已放置在你的 ~/project 目录中。为了让 SSH 使用私钥,其权限必须受到限制。使用 chmod 命令设置正确的权限:

chmod 600 id_rsa

此命令确保只有文件所有者拥有读写权限,这是大多数 SSH 客户端的要求。

如果你在拥有正确密钥的情况下仍遇到密码提示,问题很可能出在服务器端权限。SSH 要求用户的家目录不能对组或其他用户具有写权限。检查当前权限:

docker exec target-container ls -ld /home/testuser

如果你看到类似 drwxrwxrwx (777) 的权限,请修复它们:

docker exec target-container chmod 755 /home/testuser

现在,使用私钥以用户 testuser 连接到 target

ssh -i id_rsa testuser@target
  • -i id_rsa: 指定用于身份验证的身份文件(私钥)。

你可能会被提示确认主机的真实性。输入 yes 并按 Enter。

The authenticity of host 'target (172.17.0.2)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

由于服务器上的配置错误(用户家目录权限不安全),SSH 服务将接受该密钥,你将无需密码即可访问。你将被登录并看到目标的 shell 提示符。

Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-48-generic x86_64)
...
testuser@target:~$

你已成功获得对目标系统的 shell 访问权限。

探索目标系统并定位 Flag

在此步骤中,你的最终目标是找到并读取 flag 文件。既然你已经获得了目标系统的 shell,你就可以像在本地机器上一样探索其文件系统。这是后渗透阶段,攻击者在此阶段搜索有价值的数据。

你当前位于 testuser 的家目录(/home/testuser)。使用 ls 命令列出此位置的文件和目录。

ls

你将看到家目录的内容,其中应该包含 flag 文件。

testuser@target:~$ ls
flag.txt
testuser@target:~$

你已找到 flag.txt。现在,使用 cat 命令显示其内容并揭示 flag。

cat flag.txt

终端将打印 flag 的值。

testuser@target:~$ cat flag.txt
labex{ssh_k3y_b4s3d_acc3ss_fl4g}
testuser@target:~$

恭喜!你已成功枚举 SSH 服务,利用了基于密钥的身份验证漏洞,并捕获了 flag。复制 flag 值以完成实验。

要断开与目标的连接,请键入 exit 并按 Enter。

总结

在此实验中,你成功执行了一次针对配置错误的 SSH 服务的模拟攻击。你经历了渗透测试的关键阶段,从初步侦察到后渗透。

你学会了如何:

  • 使用 ping 验证目标是否在线。
  • 使用 nmap 对 SSH 端口进行详细扫描,识别服务版本。
  • 理解 SSH 基于密钥的身份验证的客户端要求,包括正确的私钥权限(chmod 600)。
  • 利用与不安全文件权限相关的服务器端漏洞来获得未经授权的 shell 访问。
  • 导航远程文件系统以定位和检索 flag。

本次练习展示了一个关键的安全原则:安全是一个链条,而一个薄弱环节——在这种情况下是目录权限不当——即使在使用 SSH 密钥等强大的身份验证机制时,也可能危及整个系统。请务必根据安全最佳实践,确保你的 SSH 配置和文件权限得到加固。