John the Ripper 与密码策略执行

Kali LinuxBeginner
立即练习

引言

在当今的数字环境中,强大的密码策略对于保护敏感信息至关重要。然而,即使有策略在执行,漏洞依然可能存在。本实验将指导你使用强大的密码破解工具 John the Ripper 来评估现有密码策略的有效性。你将学会如何识别弱点,推荐更强的策略,并了解如何实施自动化的合规性检查以增强整体安全性。这次实践经验将为你提供密码安全审计和强制执行方面的实用技能。

分析现有密码策略

在此步骤中,你将开始了解如何在 Linux 系统上分析现有的密码策略。虽然在本实验中我们不会直接修改系统范围的策略,但了解这些策略的配置位置对于审计至关重要。我们将重点检查用于规定密码复杂度、有效期和锁定设置的常见配置文件。

首先,让我们检查 /etc/login.defs 文件,该文件包含 shadow password suite 的全局配置设置。此文件定义了密码老化、最小密码长度和最大密码年龄等参数。

使用 grep 命令在 /etc/login.defs 中查找与密码相关的设置:

grep -E "PASS_MAX_DAYS|PASS_MIN_DAYS|PASS_WARN_AGE|ENCRYPT_METHOD" /etc/login.defs

你应该会看到类似以下的输出,尽管具体数值可能有所不同:

PASS_MAX_DAYS	99999
PASS_MIN_DAYS	0
PASS_WARN_AGE	7
ENCRYPT_METHOD SHA512

接下来,我们将查看 /etc/pam.d/common-password,这是一个 PAM (Pluggable Authentication Modules) 配置文件,用于控制密码复杂度规则。此文件通常包含 pam_cracklib.sopam_pwquality.so 等模块,这些模块强制执行诸如要求大小写混合、数字和特殊字符等规则。

使用 cat 查看 /etc/pam.d/common-password 的内容:

cat /etc/pam.d/common-password

你将看到很多行,但请注意包含 pam_pwquality.sopam_cracklib.so 及其参数(例如 minlendifokucreditlcreditdcreditocredit)的行。

password        [success=1 default=ignore]      pam_unix.so obscure sha512 shadow
password        requisite                       pam_pwquality.so retry=3 minlen=8 difok=3 reject_username enforce_for_root
password        optional                        pam_gnome_keyring.so
password        optional                        pam_kwallet.so
password        optional                        pam_systemd.so

最后,让我们检查 /etc/security/pwquality.conf 文件,当使用 pam_pwquality.so 时,该文件提供了对密码质量设置更精细化的控制。

cat /etc/security/pwquality.conf

你可能会看到诸如 minlendcreditucreditlcreditocreditmaxrepeat 等设置。

## Configuration for the pam_pwquality module
#
## The setting of the PAM module is usually in /etc/pam.d/common-password
#
## minlen = 8
## difok = 3
## dcredit = -1
## ucredit = -1
## lcredit = -1
## ocredit = -1
## minclass = 0
## maxrepeat = 0
## maxsequence = 0
## gecoscheck = 0
## dictcheck = 1
## usercheck = 1
## enforce_for_root

通过检查这些文件,你可以很好地了解系统上当前的密码策略设置。

使用 John the Ripper 测试策略有效性

在此步骤中,你将使用 John the Ripper (JtR) 来测试密码策略的有效性。我们将模拟一个场景,你拥有一个密码哈希文件,并尝试破解弱密码。

首先,我们创建一个用于演示的虚拟密码文件。我们将创建一个名为 passwords.txt 的文件,其中包含一些弱密码。

echo "user1:password123" > ~/project/passwords.txt
echo "user2:welcome" >> ~/project/passwords.txt
echo "user3:labexrocks" >> ~/project/passwords.txt

现在,我们需要将这些明文密码转换为 John the Ripper 可以理解的格式。我们将使用 unshadow(JtR 的一个组件)来合并一个虚拟的 /etc/passwd/etc/shadow 文件。为简单起见,我们将直接使用 passwords.txt 文件与 JtR 的 stdin 模式进行破解。

让我们创建一个名为 wordlist.txt 的简单字典文件,John the Ripper 将使用它来尝试破解密码。

echo "password123" > ~/project/wordlist.txt
echo "welcome" >> ~/project/wordlist.txt
echo "labexrocks" >> ~/project/wordlist.txt
echo "secret" >> ~/project/wordlist.txt
echo "123456" >> ~/project/wordlist.txt

现在,使用 John the Ripper 使用 wordlist.txt 来破解 passwords.txt 中的密码。

john --format=raw-md5 --wordlist=~/project/wordlist.txt ~/project/passwords.txt

你可能会看到类似以下的输出,表明密码已被破解:

Using default input encoding: UTF-8
Loaded 3 password hashes with no different salts (Raw-MD5 [MD5])
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
password123 (user1)
welcome (user2)
labexrocks (user3)
3g 0:00:00:00 DONE (2023-10-27 08:30) 100.0% 3g/s 100.0p/s 100.0c/s 100.0C/s password123 welcome labexrocks
Session completed.

要查看已破解的密码,你可以使用 --show 选项:

john --show ~/project/passwords.txt

输出:

user1:password123

user2:welcome

user3:labexrocks

3 password hashes cracked, 0 left

这演示了使用简单的字典文件可以多么容易地破解弱密码。

识别密码策略中的漏洞

在此步骤中,你将根据上一步的破解结果,识别模拟密码策略中的漏洞。John the Ripper 能够轻松破解密码这一事实表明存在明显的弱点。

根据破解出的密码(password123welcomelabexrocks),以下是一些允许它们被破解的常见漏洞:

  1. 缺乏复杂度要求:密码 welcomelabexrocks 是简单的字典词或易于猜测的短语。password123 是一种常见模式。一个强大的策略应该强制要求混合使用大写字母、小写字母、数字和特殊字符。
  2. 长度不足:虽然 password123labexrocks 分别有 11 和 10 个字符长,但由于其简单性,它们仍然容易受到攻击。策略应强制执行最小长度,通常为 12 个字符或更多,以增加攻击者的搜索空间。
  3. 未进行字典词检查:策略未能阻止用户选择常见的字典词或简单变体。
  4. 未进行常见模式检查:像 password123 这样的密码遵循可预测的模式,这些模式通常包含在破解字典中。
  5. 缺乏密码历史/重复使用预防:如果允许用户重复使用旧密码,即使它们曾经很强大,一旦这些旧密码泄露,它们就会变得脆弱。

为了模拟识别这些漏洞,让我们考虑一下更强的密码策略可能是什么样的。例如,如果我们的当前策略允许 minlen=8 且没有特定的字符类别要求,那么 welcome(7 个字符)将不符合要求,但 password123(11 个字符,无特殊字符)将通过。破解结果突出表明,即使密码满足了基本的长度要求,如果未强制执行复杂度检查和字典检查,它仍然可能很弱。

思考 pam_pwquality.so 模块的参数(如 minlendcreditucreditlcreditocreditdictcheck)如何调整才能防止此类弱密码。例如,设置 dcredit=-1 将要求至少包含一个数字,ucredit=-1 要求包含大写字母,依此类推。

此步骤主要是概念性的,侧重于分析先前破解练习的结果以理解策略的不足之处。

推荐更强的密码策略

在此步骤中,你将根据已识别的漏洞制定更强密码策略的建议。有效的密码策略需要在安全性和可用性之间取得平衡。

以下是关于更健壮密码策略的一些建议:

  1. 最小长度:将最小密码长度增加到至少 12-14 个字符。更长的密码在破解时呈指数级难度增加。
    • PAM 设置示例:在 /etc/security/pwquality.conf 中设置 minlen=12 或在 /etc/pam.d/common-password 中设置 pam_pwquality.so minlen=12
  2. 复杂度要求:强制要求混合使用以下字符类型:
    • 大写字母 (A-Z)
    • 小写字母 (a-z)
    • 数字 (0-9)
    • 特殊字符 (!@#$%^&*()_+-=[]{}|;':",./<>?)
    • PAM 设置示例:在 /etc/security/pwquality.conf 中设置 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1 或在 /etc/pam.d/common-password 中设置 pam_pwquality.so dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1
  3. 字典词和常见模式检查:阻止使用常见的字典词、常用姓名和易于猜测的模式(如 password123qwerty123456)。
    • PAM 设置示例:在 /etc/security/pwquality.conf 中设置 dictcheck=1 usercheck=1 或在 /etc/pam.d/common-password 中设置 pam_pwquality.so dictcheck=1 usercheck=1
  4. 密码历史/重复使用预防:阻止用户重复使用其先前密码的特定数量。这可以降低旧密码泄露的风险。
    • PAM 设置示例:在 /etc/pam.d/common-password 中使用 pam_unix.so 设置 remember=5(例如,password required pam_unix.so obscure sha512 shadow remember=5)。
  5. 账户锁定策略:在一定数量的登录失败尝试后实施账户锁定策略,以阻止暴力破解攻击。
    • PAM 设置示例:在 /etc/pam.d/common-auth 中使用 pam_tally2.sopam_faillock.so(例如,auth required pam_faillock.so deny=3 unlock_time=600)。
  6. 定期更改密码(谨慎):虽然传统上推荐,但频繁强制更改密码可能导致用户选择更简单、更可预测的密码。更好的方法是强制执行高复杂度要求和长度,并且仅在怀疑发生泄露时才要求更改。

为了演示概念性的更改,让我们设想我们正在更新一项策略。我们实际上不会修改系统文件,但你可以看到 pwquality.conf 文件可以如何被编辑。

打开一个虚拟文件来模拟策略建议:

nano ~/project/recommended_policy.txt

向文件中添加以下内容:

## Recommended Password Policy Settings
minlen = 14
dcredit = -1
ucredit = -1
lcredit = -1
ocredit = -1
dictcheck = 1
usercheck = 1
maxrepeat = 3
maxsequence = 3

保存并退出 nano(Ctrl+S,Ctrl+X)。

这些设置将强制要求最小长度为 14 个字符,要求至少包含一个数字、一个大写字母、一个小写字母和一个特殊字符,并阻止使用字典词和用户名。

实现自动化策略合规性检查

在此步骤中,你将了解如何实现自动化策略合规性检查。虽然直接的系统范围策略执行通过 PAM 和其他配置文件完成,但自动化检查可用于根据定义的策略定期审计用户密码或系统配置。

在此实验中,我们将使用一个 shell 脚本来模拟一个简单的合规性检查。该脚本将检查一个虚拟用户的密码是否满足基本的长度要求。在实际场景中,此类脚本会更复杂,可能会与 OpenSCAP 等工具或自定义脚本集成,以审计实际的密码哈希(如果允许且符合道德规范)或配置文件。

首先,让我们创建一个虚拟用户和一个虚拟密码哈希文件来模拟系统状态。我们不会创建实际的系统用户。

echo "testuser:\$6\$salt\$hashedpassword" > ~/project/dummy_shadow.txt

现在,创建一个名为 check_password_compliance.sh 的简单 shell 脚本,该脚本检查 dummy_shadow.txttestuser 的密码长度是否大于某个值(例如,10 个字符)。

nano ~/project/check_password_compliance.sh

向脚本中添加以下内容:

#!/bin/bash

## This script simulates a basic password length compliance check.
## In a real scenario, you would parse actual shadow file entries
## or use more sophisticated tools.

MIN_LENGTH=10
PASSWORD_HASH=$(grep "testuser" ~/project/dummy_shadow.txt | cut -d':' -f2)

## For demonstration, we'll just check the length of a placeholder hash.
## In reality, you'd need to crack or analyze the actual hash.
## Here, we're just checking if the hash string itself is long enough,
## which is NOT how real password length checks work, but serves as a
## placeholder for a compliance check.

if [ ${#PASSWORD_HASH} -ge $MIN_LENGTH ]; then
  echo "Compliance Check: testuser password hash length meets minimum requirement ($MIN_LENGTH characters)."
  exit 0
else
  echo "Compliance Check: testuser password hash length DOES NOT meet minimum requirement ($MIN_LENGTH characters)."
  exit 1
fi

保存并退出 nano(Ctrl+S,Ctrl+X)。

使脚本可执行:

chmod +x ~/project/check_password_compliance.sh

现在,运行合规性检查脚本:

~/project/check_password_compliance.sh

你应该会看到指示基于虚拟哈希长度的合规性输出:

Compliance Check: testuser password hash length meets minimum requirement (10 characters).

这个简单的例子说明了自动化合规性检查的概念。在生产环境中,可以使用 cron 定期运行此类脚本,以确保持续遵守密码策略。更高级的检查将涉及解析实际的密码哈希(如果允许且有适当的安全考虑)、与字典列表进行比对,或与安全合规框架集成。

总结

在此实验中,你获得了审计和执行密码策略的实践经验。你通过检查 /etc/login.defs/etc/pam.d/common-password/etc/security/pwquality.conf 等关键文件,学习了如何在 Linux 系统上分析现有的密码策略配置。然后,你使用 John the Ripper 演示了弱密码被破解的容易程度,突显了强策略的重要性。基于这些发现,你制定了更强密码策略的建议,重点关注长度、复杂度与字典检查。最后,你通过创建一个简单的脚本来验证密码策略的遵守情况,探索了自动化合规性检查的概念。此实验提供了密码安全审计的基础理解,使你具备识别和缓解与密码相关的漏洞的技能。