引言
在本实验中,你将通过强大的密码破解工具 John the Ripper,深入了解字典攻击。你将学习如何有效地选择和组合字典,理解这种攻击方法的固有局限性,甚至可以生成自定义字典来增强你的破解能力。通过本实验的学习,你将能够分析字典攻击的成功率,并认识到它们在网络安全中的作用。
在本实验中,你将通过强大的密码破解工具 John the Ripper,深入了解字典攻击。你将学习如何有效地选择和组合字典,理解这种攻击方法的固有局限性,甚至可以生成自定义字典来增强你的破解能力。通过本实验的学习,你将能够分析字典攻击的成功率,并认识到它们在网络安全中的作用。
在此步骤中,你将学习如何为 John the Ripper 字典攻击选择和使用合适的字典文件。字典攻击通过尝试预定义列表(字典)中的每个单词来破解密码。此攻击的有效性在很大程度上取决于所用字典的质量和相关性。
首先,让我们验证 John the Ripper 是否已安装,并且 dummy password 文件 passwords.txt 和 dictionary 文件 rockyou.txt 是否存在于你的 ~/project 目录中。
john --version
ls -l ~/project/passwords.txt ~/project/rockyou.txt
你应该会看到类似以下的输出,确认文件的存在:
John the Ripper password cracker, version 1.9.0-jumbo-1 ...
-rw-r--r-- 1 labex labex XX Mar XX:XX /home/labex/project/passwords.txt
-rw-r--r-- 1 labex labex XX Mar XX:XX /home/labex/project/rockyou.txt
现在,让我们使用 rockyou.txt 字典对我们的 passwords.txt 文件执行一次基本的字典攻击。--wordlist 选项指定了要使用的字典文件。
john --wordlist=/home/labex/project/rockyou.txt /home/labex/project/passwords.txt
John the Ripper 将尝试破解密码。如果成功,它将显示破解出的密码。你可能会看到类似以下的输出:
Using default input encoding: UTF-8
Loaded 4 password hashes with no different salts (MD5 [MD5])
Will run till all hashes are cracked, or till a key is found for each (whichever comes first)
Press 'q' or Ctrl-C to abort, almost any other key for status
password (user1)
admin (user2)
123456 (user3)
labex (user4)
4g 0:00:00:00 DONE (2023-03-15 10:30) 100.0% (ETA: 2023-03-15 10:30) 4g/s 16.0p/s 16.0c/s 16.0C/s password...labex
Session completed.
要随时查看破解出的密码,你可以使用 --show 选项:
john --show /home/labex/project/passwords.txt
此命令将显示破解出的密码和相应的用户名。
user1:password (user1)
user2:admin (user2)
user3:123456 (user3)
user4:labex (user4)
4 password hashes cracked, 0 left
这演示了如何选择和使用字典进行基本攻击。rockyou.txt 文件是包含常用密码的字典的一个常见示例。
在此步骤中,你将学习如何组合多个字典,为 John the Ripper 创建一个更全面的密码列表。组合字典可以显著提高破解密码的成功率,特别是当目标密码在单个字典中找不到时。
首先,让我们在你的 ~/project 目录中创建一个名为 common_words.txt 的另一个小型字典文件。
echo "welcome" > ~/project/common_words.txt
echo "security" >> ~/project/common_words.txt
echo "network" >> ~/project/common_words.txt
现在,我们将 rockyou.txt 和 common_words.txt 组合成一个名为 combined_dictionary.txt 的新文件。我们可以使用 cat 命令来连接文件,然后对条目进行排序和去重,以移除重复项。
cat ~/project/rockyou.txt ~/project/common_words.txt | sort | uniq > ~/project/combined_dictionary.txt
让我们检查一下新的 combined_dictionary.txt 的内容,以确保它包含来自两个原始字典的单词,并且没有重复项。
cat ~/project/combined_dictionary.txt
你应该会看到一个来自 rockyou.txt 和 common_words.txt 的已排序的唯一单词列表。
123456
admin
labex
network
password
secret
security
test
welcome
现在,让我们使用这个 combined_dictionary.txt 进行字典攻击。为了演示,我们将首先清除 John 的先前破解会话,以确保一个全新的开始。
john --session=clear
然后,使用组合字典运行攻击:
john --wordlist=/home/labex/project/combined_dictionary.txt /home/labex/project/passwords.txt
John the Ripper 将尝试使用扩展的密码列表来破解密码。如果 passwords.txt 中添加了存在于 common_words.txt 中的新密码,它们现在将被破解。由于我们的 passwords.txt 只包含来自 rockyou.txt 的密码,输出将与上一步类似,但这演示了使用组合字典的过程。
Using default input encoding: UTF-8
Loaded 4 password hashes with no different salts (MD5 [MD5])
Will run till all hashes are cracked, or till a key is found for each (whichever comes first)
Press 'q' or Ctrl-C to abort, almost any other key for status
password (user1)
admin (user2)
123456 (user3)
labex (user4)
4g 0:00:00:00 DONE (2023-03-15 10:35) 100.0% (ETA: 2023-03-15 10:35) 4g/s 16.0p/s 16.0c/s 16.0C/s password...labex
Session completed.
这个过程突显了拥有一个多样化且全面的字典对于有效密码破解的重要性。
在此步骤中,你将探讨字典攻击的局限性。虽然字典攻击很强大,但它只对存在于字典中的密码有效。对于复杂、独特或随机生成的、不在密码列表中的密码,它无效。
为了演示这一局限性,让我们向 passwords.txt 文件添加一个具有强随机密码的新用户。我们将使用一个不太可能在标准字典中找到的密码,例如 P@ssw0rd!23AbC。我们将生成其 MD5 hash。
echo "user5:$(echo -n 'P@ssw0rd!23AbC' | md5sum | awk '{print $1}')" >> /home/labex/project/passwords.txt
现在,让我们清除 John 的先前会话,并使用我们的 combined_dictionary.txt 再次尝试破解密码。
john --session=clear
john --wordlist=/home/labex/project/combined_dictionary.txt /home/labex/project/passwords.txt
观察输出。John the Ripper 很可能会破解前四个密码(user1、user2、user3、user4),但无法破解 user5 的密码,因为 P@ssw0rd!23AbC 不在我们的字典中。
Using default input encoding: UTF-8
Loaded 5 password hashes with no different salts (MD5 [MD5])
Will run till all hashes are cracked, or till a key is found for each (whichever comes first)
Press 'q' or Ctrl-C to abort, almost any other key for status
password (user1)
admin (user2)
123456 (user3)
labex (user4)
4g 0:00:00:00 DONE (2023-03-15 10:40) 80.0% (ETA: 2023-03-15 10:40) 4g/s 16.0p/s 16.0c/s 16.0C/s password...labex
Session completed.
为了确认,请使用 --show 选项:
john --show /home/labex/project/passwords.txt
你将看到 user5 的密码仍未被破解。
user1:password (user1)
user2:admin (user2)
user3:123456 (user3)
user4:labex (user4)
4 password hashes cracked, 1 left
这表明字典攻击受限于字典的内容。不在字典中的密码,特别是强壮的、独特的密码,将无法通过此方法破解。这突显了使用强壮的、不可预测的密码的重要性。
在此步骤中,你将学习如何生成自定义字典。虽然像 rockyou.txt 这样的大型预制字典很有用,但有时你需要创建一个针对特定目标或场景量身定制的字典。这可能涉及使用关于目标的已知信息(例如,公司名称、常用短语、日期)来生成潜在密码。
我们将使用 crunch 工具,它非常适合根据指定的字符集和模式生成密码列表。crunch 默认未安装,所以我们先安装它。
sudo apt install -y crunch
现在,让我们生成一个简单的自定义字典。例如,我们可以生成特定长度的所有小写字母组合。让我们创建一个包含所有 4 个字符的小写单词的字典。
crunch 4 4 -o ~/project/custom_4char_dictionary.txt -t @@@@
4 4: 指定要生成的单词的最小和最大长度(此处均为 4)。-o ~/project/custom_4char_dictionary.txt: 指定输出文件。-t @@@@: 指定一个模式。@ 代表小写字母。此命令将生成一个大文件。出于演示目的,让我们生成一个更小、更易于管理的自定义字典。我们将生成长度为 3 到 4 的单词,仅使用小写字母,并以 'a' 开头。
crunch 3 4 abcdefghijklmnopqrstuvwxyz -o ~/project/custom_small_dictionary.txt -t a%@
3 4: 最小长度 3,最大长度 4。abcdefghijklmnopqrstuvwxyz: 指定要使用的字符集。-o ~/project/custom_small_dictionary.txt: 输出文件。-t a%@: 模式。a 是字面上的 'a',% 代表数字,@ 代表小写字母。让我们更正一下,使其仅生成小写字母。让我们尝试一个更相关的自定义字典示例:生成已知单词(如 "labex")的变体,并在其后附加数字。我们将为此使用 john 内置的密码列表规则,这对于常见的密码变体更实用。
首先,让我们创建一个只包含 "labex" 的基础密码列表。
echo "labex" > ~/project/base_word.txt
现在,我们将使用 John 的 --rules 选项和常见的规则集(如 Wordlist)来生成变体。这通常与基础密码列表一起使用。
john --wordlist=/home/labex/project/base_word.txt --rules=Wordlist --stdout > ~/project/labex_variations.txt
--wordlist: 基础密码列表。--rules=Wordlist: 应用默认的密码列表规则(例如,附加数字、更改大小写等)。--stdout: 将生成的单词打印到标准输出。> ~/project/labex_variations.txt: 将输出重定向到文件。让我们检查生成的变体:
head -n 10 ~/project/labex_variations.txt
你将看到类似 labex1、Labex、labex! 等变体。
labex
Labex
LABEX
labex1
labex2
labex3
labex4
labex5
labex6
labex7
这演示了如何生成自定义字典或单词的变体,这对于有针对性的攻击至关重要,在这些攻击中,目标具有特定的模式或已知信息。
在此步骤中,你将根据所使用的字典和目标密码的复杂性来分析字典攻击的成功率。了解成功率有助于评估你的破解工作的有效性以及系统的安全状况。
我们已经看到,简单的字典单词很容易被破解,而复杂的密码则不然。让我们通过查看已破解密码的数量与哈希总数来量化这一点。
首先,确保 John 的会话已清除。
john --session=clear
现在,让我们再次使用 combined_dictionary.txt 对 passwords.txt(现在包含具有强密码的 user5)运行攻击。
john --wordlist=/home/labex/project/combined_dictionary.txt /home/labex/project/passwords.txt
攻击完成后,使用 --show 选项查看结果。
john --show /home/labex/project/passwords.txt
输出将显示已破解的密码以及已破解的哈希数量与总数的对比。
user1:password (user1)
user2:admin (user2)
user3:123456 (user3)
user4:labex (user4)
4 password hashes cracked, 1 left
从此输出中,我们可以计算成功率:(已破解哈希数量 / 哈希总数)_ 100%。
在此示例中,(4 / 5) _ 100% = 80%。
此 80% 的成功率表明,虽然许多常用密码被破解了,但 user5 的强密码在此次字典攻击中仍然是安全的。这突显了字典攻击对于弱密码、常用密码或基于字典的密码非常有效,但对于强壮、独特的密码则无效。
为了进一步分析,你可以尝试使用不同的字典(例如,一个非常小、特定的字典与一个非常大、通用的字典)并观察成功率如何变化。字典越大、越相关,对常用密码的潜在成功率就越高。然而,对于真正随机和复杂的密码,字典攻击的成功率将始终很低,这强调了其他破解技术(如暴力破解)的必要性,或者更重要的是,强密码策略的重要性。
此分析强化了使用强壮、独特的密码的重要性,这些密码不易猜测或在常用字典中找不到,以防范此类攻击。
在此次实验中,你获得了使用 John the Ripper 和字典攻击的实践经验。你学会了如何选择和组合字典以增强破解效果。你也理解了字典攻击固有的局限性,尤其是在面对强壮、独特的密码时。此外,你还探索了生成自定义字典的方法并分析了这些攻击的成功率。本次实验为你提供了关于一种基本密码破解技术的实践见解,并强化了健全密码安全实践的重要性。