引言
在本实验中,你将探索 John the Ripper 的高级功能,特别是如何利用自定义字符集。John the Ripper 是一个强大的开源密码破解工具。虽然它自带预定义的字符集,但定义自己的字符集可以显著提高破解效率,尤其是在处理特定的密码策略或非标准字符时。你将学习如何为各种场景创建、应用和优化这些自定义集,从而更深入地理解它们对破解过程的影响。
在本实验中,你将探索 John the Ripper 的高级功能,特别是如何利用自定义字符集。John the Ripper 是一个强大的开源密码破解工具。虽然它自带预定义的字符集,但定义自己的字符集可以显著提高破解效率,尤其是在处理特定的密码策略或非标准字符时。你将学习如何为各种场景创建、应用和优化这些自定义集,从而更深入地理解它们对破解过程的影响。
在本步骤中,你将学习如何为 John the Ripper 的增量模式定义自定义字符集。增量模式是一种强大的破解方法,它会尝试所有长度不超过特定值的可能字符组合。默认情况下,John 使用一个大型字符集,但如果你知道密码只包含有限的字符集(例如,仅小写字母和数字),使用自定义字符集可以提高破解效率。
首先,让我们创建一个简单的密码哈希,我们将使用自定义字符集来尝试破解它。我们将为密码 abc 创建一个哈希,并将其保存到名为 hash_to_crack.txt 的文件中。
echo "user1:\$6\$salt1\$y.g.a.hash.for.abc" > ~/project/hash_to_crack.txt
现在,让我们定义一个仅包含小写字母的自定义字符集。我们将把这个定义保存在 ~/project 目录下的一个名为 custom.chr 的文件中。这个文件将告诉 John the Ripper 在破解时使用哪些字符。
nano ~/project/custom.chr
向 custom.chr 文件添加以下内容:
[CharSet]
charset = abcdefghijklmnopqrstuvwxyz
按 Ctrl+X,然后按 Y,最后按 Enter 保存文件。
现在,让我们在增量模式下使用 John the Ripper 和这个自定义字符集来破解 hash_to_crack.txt 文件。--incremental 选项告诉 John 使用增量模式,而 --external=custom.chr 指定了我们的自定义字符集。
john --format=sha512crypt --incremental=custom --external=~/project/custom.chr ~/project/hash_to_crack.txt
你应该会看到 John 正在尝试破解哈希。一旦找到密码,它就会显示出来。
Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2])
Will run till completion
Press 'q' or Ctrl-C to abort, almost any other key for status
abc (user1)
1g 0:00:00:00 DONE (2023-10-27 10:00) 100.0g/s 100p/s 100c/s 100C/s abc
Use the "--show" option to display all of the cracked passwords reliably
Session completed
要显示破解的密码,请使用 --show 选项:
john --show ~/project/hash_to_crack.txt
user1:abc
1 password hash cracked, 0 left
这演示了如何使用自定义字符集来缩小搜索范围,当你对密码的构成有所了解时,可以使破解过程更有效率。
在本步骤中,你将把自定义字符集应用于更具体的场景,以展示其灵活性。我们将创建一个新的哈希和一个更精细的自定义字符集。
假设我们有一个只包含数字的密码,例如 1234。首先,我们将为这个密码创建一个哈希。
echo "user2:\$6\$salt2\$y.g.a.hash.for.1234" > ~/project/numeric_hash.txt
现在,让我们定义一个仅包含数字(0-9)的自定义字符集。我们将这个文件命名为 digits.chr。
nano ~/project/digits.chr
向 digits.chr 添加以下内容:
[CharSet]
charset = 0123456789
保存文件(Ctrl+X,Y,Enter)。
接下来,我们将使用 John the Ripper 和这个新的字符集来破解 numeric_hash.txt 文件。
john --format=sha512crypt --incremental=digits --external=~/project/digits.chr ~/project/numeric_hash.txt
你应该会看到 John 快速破解了密码 1234。
Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2])
Will run till completion
Press 'q' or Ctrl-C to abort, almost any other key for status
1234 (user2)
1g 0:00:00:00 DONE (2023-10-27 10:05) 100.0g/s 100p/s 100c/s 100C/s 1234
Use the "--show" option to display all of the cracked passwords reliably
Session completed
要确认破解的密码:
john --show ~/project/numeric_hash.txt
user2:1234
1 password hash cracked, 0 left
这个场景突显了当你对密码的字符构成有精确信息时,自定义字符集可以非常有效,与使用通用字符集相比,可以显著缩短破解时间。
在本步骤中,你将观察字符集大小对破解过程的影响。更大的字符集意味着更多的可能组合,从而导致更长的破解时间。
让我们为使用小写字母和数字的密码创建一个新的哈希,例如 a1b2。
echo "user3:\$6\$salt3\$y.g.a.hash.for.a1b2" > ~/project/alphanum_hash.txt
现在,我们将定义一个包含小写字母和数字的自定义字符集。我们将这个文件命名为 alphanum.chr。
nano ~/project/alphanum.chr
向 alphanum.chr 添加以下内容:
[CharSet]
charset = abcdefghijklmnopqrstuvwxyz0123456789
保存文件(Ctrl+X,Y,Enter)。
现在,让我们使用 John the Ripper 和这个组合字符集。
john --format=sha512crypt --incremental=alphanum --external=~/project/alphanum.chr ~/project/alphanum_hash.txt
你会注意到,使用这个更大的字符集破解 a1b2 可能比使用各自较小字符集破解 abc 或 1234 所花费的时间稍长一些,即使密码长度相似。这是因为搜索空间(可能的组合数量)显著更大。
Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2])
Will run till completion
Press 'q' or Ctrl-C to abort, almost any other key for status
a1b2 (user3)
1g 0:00:00:00 DONE (2023-10-27 10:10) 100.0g/s 100p/s 100c/s 100C/s a1b2
Use the "--show" option to display all of the cracked passwords reliably
Session completed
要确认破解的密码:
john --show ~/project/alphanum_hash.txt
user3:a1b2
1 password hash cracked, 0 left
此步骤说明了你的字符集大小与破解所需时间之间的直接关系。根据可用信息,通过使字符集尽可能小且具体来优化你的字符集,对于高效的密码破解至关重要。
在本步骤中,你将学习如何通过组合不同的字符类型并使用 John 的内置字符类来进一步优化自定义字符集定义。John the Ripper 允许你使用预定义的类来定义字符集,例如 ?l 代表小写字母,?u 代表大写字母,?d 代表数字,以及 ?s 代表符号。
让我们为像 Pass123! 这样的密码创建一个哈希。
echo "user4:\$6\$salt4\$y.g.a.hash.for.Pass123!" > ~/project/complex_hash.txt
与其列出所有字符,不如使用 John 的字符类。让我们创建一个名为 complex.chr 的文件,它组合了这些类。
nano ~/project/complex.chr
向 complex.chr 添加以下内容:
[CharSet]
charset = ?l?u?d?s
保存文件(Ctrl+X,Y,Enter)。
这里,?l 代表小写字母,?u 代表大写字母,?d 代表数字,?s 代表符号。这是定义广泛字符集的一种更简洁的方式。
现在,让我们使用 John the Ripper 和这个优化的字符集。
john --format=sha512crypt --incremental=complex --external=~/project/complex.chr ~/project/complex_hash.txt
John 现在将尝试使用所有小写字母、大写字母、数字和符号的组合来破解密码。
Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2])
Will run till completion
Press 'q' or Ctrl-C to abort, almost any other key for status
Pass123! (user4)
1g 0:00:00:00 DONE (2023-10-27 10:15) 100.0g/s 100p/s 100c/s 100C/s Pass123!
Use the "--show" option to display all of the cracked passwords reliably
Session completed
要确认破解的密码:
john --show ~/project/complex_hash.txt
user4:Pass123!
1 password hash cracked, 0 left
这种方法对于定义常见的字符集非常有效,而无需手动列出每个字符。对于典型的密码构成,它是在具体性和易于定义之间取得了良好的平衡。
在本步骤中,你将学习如何为非英语密码创建自定义字符集,这些密码通常包含标准英语字符集中不存在的特殊字符。这对于破解不同语言的密码至关重要。
假设我们有一个包含常见德语变音字母的密码,例如 schön。首先,我们将为这个密码创建一个哈希。
echo "user5:\$6\$salt5\$y.g.a.hash.for.schön" > ~/project/german_hash.txt
现在,我们需要定义一个包含特定非英语字符的自定义字符集。对于 schön,我们需要 ö。
nano ~/project/german.chr
向 german.chr 添加以下内容。请确保包含 ö 字符。
[CharSet]
charset = abcdefghijklmnopqrstuvwxyzäöüß
保存文件(Ctrl+X,Y,Enter)。
现在,让我们使用 John the Ripper 和这个自定义字符集。如果字符不是标准的 ASCII 字符,指定编码很重要。John 通常能很好地处理 UTF-8,但有时显式指定编码是必要的。
john --format=sha512crypt --incremental=german --external=~/project/german.chr --input-encoding=UTF-8 ~/project/german_hash.txt
John 现在将尝试破解密码,包括特殊的德语字符。
Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2])
Will run till completion
Press 'q' or Ctrl-C to abort, almost any other key for status
schön (user5)
1g 0:00:00:00 DONE (2023-10-27 10:20) 100.0g/s 100p/s 100c/s 100C/s schön
Use the "--show" option to display all of the cracked passwords reliably
Session completed
要确认破解的密码:
john --show ~/project/german_hash.txt
user5:schön
1 password hash cracked, 0 left
此步骤展示了在处理国际密码时,在自定义字符集中包含特定的非英语字符的重要性。如果没有这些字符,John the Ripper 将无法在增量模式下破解此类密码。
在本实验中,你获得了使用 John the Ripper 定义和利用自定义字符集的实践经验。你学会了如何创建特定的字符集文件(.chr),在增量破解模式下应用它们,并理解了字符集大小对破解效率的显著影响。此外,你还探索了如何使用 John 的内置字符类来优化字符集定义,以及如何通过包含特殊字符来处理非英语密码。掌握自定义字符集是实现高效、有针对性密码破解的关键技能,它能让你根据已知的密码特征缩小搜索范围并加快破解过程。