引言
SSH (Secure Shell) 密钥是一种安全地连接到远程服务器的身份验证方式,它提供了比基于密码的登录更强大的替代方案。为了增强安全性,SSH 私钥可以使用密码短语进行加密。如果攻击者获得了你的私钥文件访问权限,他们仍然需要密码短语才能使用它。
然而,一个弱密码短语可能是一个重大的安全漏洞。在本实验中,你将扮演一名安全分析师,来理解这一风险。你将学习如何使用 John the Ripper,一个强大的开源密码破解工具,来破解 SSH 私钥的密码短语。本次练习仅用于教育目的,以强调使用强密码短语的重要性。
生成带密码短语保护的 SSH 私钥
在此步骤中,你将生成一个新的 SSH 密钥对。私钥将使用一个简单、易于猜测的密码短语进行保护。此密钥将作为我们后续步骤中破解练习的目标。
我们将使用 ssh-keygen 命令来创建密钥。我们将指定密钥类型、比特数和文件名,以确保它在我们的项目目录中创建。
执行以下命令来生成一个 RSA SSH 密钥对。当提示输入密码短语时,请输入 labex。
ssh-keygen -t rsa -b 2048 -f ./my_ssh_key -C "labex@labex.io"
系统将提示你输入并确认密码短语。在两个提示处都输入 labex 并按 Enter。
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): labex
Enter same passphrase again: labex
Your identification has been saved in ./my_ssh_key
Your public key has been saved in ./my_ssh_key.pub
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx labex@labex.io
The key's randomart image is:
+---[RSA 2048]----+
| . |
| . . |
| . . |
| . . . . |
| . . S . |
| . . . o |
| . . . + . |
| . . . =.o.o |
|.. .oo*+E+ |
+----[SHA256]-----+
现在,列出当前目录中的文件,查看新创建的密钥对:私钥 my_ssh_key 和公钥 my_ssh_key.pub。
ls -l
total 12
-rw------- 1 labex labex 1823 Jan 01 12:00 my_ssh_key
-rw-r--r-- 1 labex labex 401 Jan 01 12:00 my_ssh_key.pub
-rw-r--r-- 1 labex labex 48 Jan 01 12:00 wordlist.txt
你已成功创建了一个带密码短语保护的 SSH 私钥。
使用 ssh2john 从 SSH 密钥中提取哈希
John the Ripper 无法直接处理 SSH 密钥文件格式。它需要一种特定的哈希格式来表示加密的密码短语。为了获取这个哈希,我们将使用一个名为 ssh2john 的实用工具,它包含在 John the Ripper 套件中。
在此步骤中,你将对你创建的私钥(my_ssh_key)运行 ssh2john,并将其输出保存到一个新文件中。这个文件将包含 john 随后可以尝试破解的哈希。
运行以下命令来提取哈希并将其保存到名为 ssh_hash.txt 的文件中:
ssh2john my_ssh_key > ssh_hash.txt
此命令在终端中不会产生任何输出,因为我们使用 > 操作符将其重定向到了 ssh_hash.txt 文件。
要查看生成的哈希文件的内容,请使用 cat 命令:
cat ssh_hash.txt
你将看到一长串文本,这就是你密钥密码短语的哈希表示。它看起来会像这样:
my_ssh_key:$ssh2$0$16$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx$1040$xxxxxxxx...
现在你已经准备好了用于破解过程的哈希文件。
使用 John the Ripper 破解 SSH 密钥哈希
在提取了哈希之后,是时候使用 John the Ripper 来破解它了。我们将执行一次“字典攻击”,即 john 会尝试使用给定列表中的每个单词作为潜在的密码短语。对于本次实验,我们将使用你的环境中预先创建的 wordlist.txt 文件。
在实际场景中,攻击者会使用包含数百万个常见密码、姓名和字典单词的庞大单词列表。我们的简单单词列表包含正确的密码短语 labex,这确保了本次演示的破解将是成功的。
运行 john 命令,指定单词列表和哈希文件:
john --wordlist=wordlist.txt ssh_hash.txt
John 将开始破解过程。由于密码短语在我们的短单词列表中,它几乎会立即被找到。
Using default input encoding: UTF-8
Loaded 1 password hash (SSH [RSA/DSA/EC/OPENSSH private keys ssh2john])
Cost 1 (KDF/cipher) is 0 for all loaded hashes
Cost 2 (iteration count) is 16 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
labex (my_ssh_key)
1g 0:00:00:00 DONE (2023-01-01 12:05) 12.50g/s 12.50p/s 12.50c/s 12.50C/s sunshine..labex
Use the "--show" option to display all of the cracked passwords reliably
Session completed
成功!输出行 labex (my_ssh_key) 表明密钥 my_ssh_key 的密码短语 labex 已成功恢复。
John the Ripper 将破解的密码保存在一个名为“pot 文件”(默认为 ~/.john/john.pot)的文件中。要查看已破解的密码而不重新运行攻击,你可以使用 --show 选项:
john --show ssh_hash.txt
my_ssh_key:labex
1 password hash cracked, 0 left
这证实了破解的密码短语。你现在已成功破解了一个 SSH 密钥的弱密码短语。
理解 SSH 密钥安全
本次实验展示了一个关键点:受密码短语保护的 SSH 密钥的安全性,仅取决于密码短语本身的强度。让我们来分解一下 SSH 密钥安全的组成部分。
密钥强度(Cryptography): 这指的是用于生成密钥的算法(例如,RSA、ECDSA、Ed25519)和密钥大小(例如,2048、4096 位)。更大的密钥大小使得攻击者通过暴力破解来攻破底层加密的难度呈指数级增长。这可以防止试图从公钥推导出私钥的攻击。
密码短语强度(Encryption): 这用于保护私钥文件本身。当你设置密码短语时,私钥文件会被加密。如果有人窃取了这个文件,他们必须先解密才能使用它。正如你所见,一个弱的、常见的或基于字典的密码短语很容易被破解。一个强的密码短语应该长、复杂且唯一,使得字典攻击或暴力破解在计算上不可行。
文件权限(Access Control): 你的操作系统的文件权限提供了第一道防线。私钥文件应始终具有仅限制所有者访问的权限(例如,
600或-rw-------)。这可以防止同一系统上的其他用户读取密钥文件。
在我们的实验中,密钥的加密强度是无关紧要的,因为攻击向量并非加密本身,而是用于加密文件的弱密码短语。
SSH 密钥管理最佳实践
了解风险是第一步。应用最佳实践是缓解风险的方法。以下是在实际环境中安全管理 SSH 密钥的基本规则。
使用强壮、唯一的密码短语:
- 切勿使用常见单词、姓名或简单模式。
- 一个强壮的密码短语应该足够长(15 个以上字符),并包含大小写字母、数字和符号的混合。
- 考虑使用密码管理器来生成和存储高度复杂的密码短语。
使用现代算法和足够的密钥大小:
- 优先选择 Ed25519 或 ECDSA 等现代算法,而不是较旧的 RSA。它们提供更好的安全性和性能。
- 如果使用 RSA,请确保密钥大小至少为 2048 位,建议使用 4096 位以获得长期安全性。
保护私钥文件:
- 始终确保你的私钥文件(例如
~/.ssh/id_rsa)具有严格的文件权限。使用chmod 600来仅允许你的用户进行读/写访问。
- 始终确保你的私钥文件(例如
使用 SSH Agent:
- SSH Agent (
ssh-agent) 是一个后台程序,它将你解密的私钥缓存在内存中。当你将密钥添加到 Agent 时,只需输入一次密码短语,在会话期间就无需再次输入。这既方便又安全,因为密码短语不会被重复输入或存储在磁盘上。
- SSH Agent (
定期轮换密钥:
- 定期生成新的 SSH 密钥对并弃用旧的。如果旧密钥遭到泄露,这可以限制攻击者的机会窗口。
切勿共享私钥:
- 私钥是私有的。它是你的唯一身份标识。切勿通过电子邮件、聊天或任何其他媒介发送它。如果其他人需要访问权限,他们应该生成自己的密钥对,并将他们的公钥提供给你。
总结
在本次实验中,你获得了对一项常见安全审计任务的实践经验。你已成功:
- 生成了一个受密码短语保护的新 SSH 密钥对。
- 使用
ssh2john工具从私钥文件中提取了一个可破解的哈希。 - 使用 John the Ripper 执行了字典攻击,以破解弱密码短语。
- 学习了 SSH 密钥安全的基本原理,包括加密强度和密码短语强度的不同作用。
- 回顾了安全管理 SSH 密钥的基本最佳实践。
本次练习表明,即使是强大的加密工具,也可能被薄弱的人为实践所破坏。请务必使用强壮、唯一的密码短语来保护你的 SSH 密钥,以确保你的数字身份的完整性。


