John the Ripper 高级命令行选项

Kali LinuxBeginner
立即练习

引言

John the Ripper 是一个快速的密码破解工具,支持多种 Unix、macOS、Windows 和 DOS 系统。其主要目的是检测弱密码。除了最常见的几种 Unix 系统上的 crypt(3) 密码哈希类型外,开箱即用的还支持 Kerberos AFS 和 Windows LM 哈希,以及社区增强版本中的数百种其他哈希和加密类型。

在本实验中,你将通过探索 John the Ripper 的一些高级命令行选项来深入了解其功能。理解这些选项将使你能够微调密码破解尝试、管理长时间运行的会话以及重定向输出以进行进一步分析。你将学习如何指定哈希格式、应用自定义规则、管理破解会话以及使用 --stdout 选项生成字典。

深入探索 --format 选项

在此步骤中,你将学习如何在 John the Ripper 中使用 --format 选项。处理各种类型的密码哈希时,此选项至关重要,因为它会告知 John 期望的哈希类型以及如何处理它。John the Ripper 支持多种哈希格式,从传统的 Unix crypt 哈希到现代应用程序特定的哈希。

首先,让我们列出 John the Ripper 支持的可用哈希格式。这将让你了解该工具的多功能性。

john --list=formats

你将看到一个长长的格式列表。例如,crypt 用于传统的 Unix 哈希,raw-md5 用于纯 MD5 哈希,nt 用于 Windows NT 哈希,还有更多。

现在,让我们尝试破解 passwords.txt 文件中的密码,特别是针对一种已知格式。我们有一个用户 user1,其 SHA512 crypt 哈希。我们可以明确告诉 John 使用 sha512crypt 格式。

john --format=sha512crypt /home/labex/project/passwords.txt --wordlist=/home/labex/project/wordlist.txt

如果 user1 的密码(在我们的设置中是 password123)在字典中,John 将会破解它。

接下来,让我们尝试破解 passwords.txt 文件中的 LM 哈希(user5)和 NT 哈希(user6)。John 通常可以自动检测格式,但使用 --format 显式指定它们可能更快、更可靠,尤其是在处理混合哈希类型或不太常见的格式时。

john --format=lm /home/labex/project/passwords.txt --wordlist=/home/labex/project/wordlist.txt
john --format=nt /home/labex/project/passwords.txt --wordlist=/home/labex/project/wordlist.txt

你可能会看到类似以下的输出,表明破解过程:

Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2])
Press 'q' or Ctrl-C to abort, almost any other key for status
password123      (user1)
1g 0:00:00:00 DONE (2023-10-27 10:00) 100% (ETA: 10:00) 1.000g/s 1.000p/s 1.000c/s 1.000C/s password123
Session completed

此步骤展示了 --format 选项对于高效准确的密码破解的重要性。

使用 --rules 选项和自定义规则

在此步骤中,你将探索 --rules 选项,该选项允许 John the Ripper 将一组预定义或自定义规则应用于字典中的单词。规则是应用于单词的强大转换,例如附加数字、更改大小写或复制字符,这大大增加了破解常见单词变体的密码的机会。

John 自带了几个内置规则集,例如 Wordlist(默认)、SingleJumbo。你可以使用以下命令列出可用的规则集:

john --list=rules

此命令将输出一个规则集列表。

现在,让我们使用自定义规则文件。我们在设置中创建了一个名为 custom_rules.txt 的简单自定义规则文件,其中包含诸如 :$[0-9](附加一个数字)和 Az(大写第一个字母)之类的规则。

让我们再次尝试破解 user1,但这次使用我们的自定义规则。假设 user1 的密码是 Password123(大写 P,然后是 123)。我们的字典只包含 passwordAz 规则将大写第一个字母,:$[0-9] 将附加一个数字。

john --wordlist=/home/labex/project/wordlist.txt --rules=/home/labex/project/custom_rules.txt /home/labex/project/passwords.txt --format=sha512crypt

此命令将在尝试将规则应用于哈希之前,将 custom_rules.txt 中的规则应用于 wordlist.txt 中的每个单词。例如,password 可能会变成 Passwordpassword0password1 等,然后是 Password0Password1 等。

你还可以将规则与 --stdout 选项(我们将在下一步介绍)结合使用,以查看通过规则生成的单词:

john --wordlist=/home/labex/project/wordlist.txt --rules=/home/labex/project/custom_rules.txt --stdout

此命令会将应用 custom_rules.txtwordlist.txt 生成的所有单词打印到你的终端。这对于调试你的规则集很有用。

--rules 选项是通过生成常见密码变体来扩展字典攻击有效性的强大功能。

理解 --session--restore 选项

在此步骤中,你将了解 --session--restore 选项,它们对于管理长时间运行的密码破解任务至关重要。破解复杂密码可能需要数小时、数天甚至数周。这些选项允许你保存破解会话的当前状态并在以后恢复它,而不会丢失进度。

当 John the Ripper 运行时,它会自动创建一个会话文件(通常在运行目录中的 john.rec)来保存其状态。但是,使用 --session 选项允许你为该会话文件指定一个自定义名称,这在同时运行多个破解任务或需要保留特定会话日志时非常有用。

让我们为 user1 开始一个破解会话并指定一个会话名称:

john --session=my_cracking_session /home/labex/project/passwords.txt --wordlist=/home/labex/project/wordlist.txt --format=sha512crypt

让破解运行几秒钟,然后按 Ctrl+C 中断它。你将看到一条消息表明会话已保存。

现在,列出当前目录中的文件以查看会话文件:

ls -l /home/labex/project/

你应该会看到一个名为 my_cracking_session.rec 的文件(或类似名称,具体取决于 John 的版本和配置)。

要恢复中断的会话,请使用带有会话名称的 --restore 选项:

john --restore=my_cracking_session

John 将从中断的地方继续。这对于管理大规模破解操作或在需要重新启动系统时非常有用。

如果你不使用 --session 指定会话名称,John 将使用默认会话文件。不带会话名称使用 --restore 将尝试恢复默认会话。

john --restore

此步骤强调了如何有效地管理和恢复你的密码破解工作,确保不丢失任何进度。

实验 --stdout 进行输出重定向

在此步骤中,你将了解 --stdout 选项,该选项在不实际执行破解尝试的情况下,对于生成字典或测试规则集非常有用。当与 --stdout 结合使用时,John the Ripper 会将生成的候选密码输出到标准输出,然后可以将其重定向到文件或通过管道传递给其他工具。

当与字典和规则结合使用时,这尤其强大。你可以使用 John 根据现有字典和特定规则创建高度自定义的字典。

让我们通过将 custom_rules.txt 应用于 wordlist.txt 来生成一个字典,并将输出重定向到一个名为 generated_wordlist.txt 的新文件:

john --wordlist=/home/labex/project/wordlist.txt --rules=/home/labex/project/custom_rules.txt --stdout > /home/labex/project/generated_wordlist.txt

执行命令后,检查新创建文件的内容:

cat /home/labex/project/generated_wordlist.txt

你应该会看到像 passwordPasswordpassword0password1 等由规则生成的单词。

你还可以使用 --stdout 来生成单个单词的排列组合。例如,要生成单词 "test" 的变体:

echo "test" | john --pipe --rules=/home/labex/project/custom_rules.txt --stdout

在这里,echo "test" | john --pipe 将单词 "test" 通过管道输入到 John 的标准输入,而 --pipe 告诉 John 从标准输入读取。然后 --stdout 输出应用规则后的变体。

--stdout 选项是一个多功能的特性,可用于预处理字典、为其他破解工具创建自定义字典,或仅仅是理解你的规则如何转换单词。

发现其他有用的命令行标志

在最后这个步骤中,你将简要了解一些其他有用的命令行标志,它们可以增强你对 John the Ripper 的使用。虽然我们不会对每个标志进行详细介绍,但了解它们的存在可以在各种场景中帮助你。

  1. --show: 此选项显示先前会话中已破解的密码。破解密码后,John 会将其存储在 john.pot 文件中。你可以使用以下命令查看它们:

    john --show /home/labex/project/passwords.txt
    

    这将显示 John 已成功破解的 passwords.txt 文件中的任何密码。

  2. --incremental: 这是用于暴力破解的强大模式。John 将根据字符集和长度生成密码。你可以指定一种模式(例如 alnumdigitsall)。

    ## 此命令将运行很长时间,因此我们仅演示其用法。
    ## 请勿让其运行过长时间。几秒钟后按 Ctrl+C 停止它。
    john --incremental=digits /home/labex/project/passwords.txt --format=raw-md5
    

    此命令尝试通过生成数字组合来破解密码。

  3. --fork=<N>: 此选项允许 John 使用多个 CPU 核心或线程进行破解,其中 <N> 是要使用的 fork(进程)数量。这可以显著加快多核系统上的破解速度。

    john --fork=2 /home/labex/project/passwords.txt --wordlist=/home/labex/project/wordlist.txt --format=sha512crypt
    

    这将尝试使用 2 个 CPU 核心破解密码。

  4. --mask: 此选项允许你执行掩码攻击,在其中定义密码的特定模式。例如,?l?l?l?d?d 将尝试所有 3 个字母、2 个数字的组合。

    ## 此命令将运行很长时间,因此我们仅演示其用法。
    ## 请勿让其运行过长时间。几秒钟后按 Ctrl+C 停止它。
    john --mask=?l?l?l?d?d /home/labex/project/passwords.txt --format=raw-md5
    

    此命令尝试破解符合指定掩码的密码。

这些只是 John the Ripper 中提供的众多高级选项中的一小部分。浏览 man john 手册页或 john --help 将揭示更多用于专用密码审计和破解任务的可能性。

总结

在这个实验中,你获得了使用 John the Ripper 的几个高级命令行选项的实践经验。你学会了如何使用 --format 精确指定哈希格式,如何使用 --rules 和自定义规则文件对字典应用强大的转换,以及如何使用 --session--restore 管理长时间运行的破解会话。此外,你还探索了 --stdout 在生成自定义字典方面的多功能性,并简要介绍了 --show--incremental--fork--mask 等其他有用标志。

掌握这些选项将显著提高你执行有效密码审计和破解的能力,使你在各种安全任务中更熟练地使用 John the Ripper。继续探索 John 广泛的文档,以发现更多高级功能和技术。