【THM】John the Ripper: The Basics(开膛手约翰:基础知识)-更新版

本文相关的TryHackMe实验房间链接:https://tryhackme.com/room/johntheripperbasics

本文相关内容:了解如何使用 John the Ripper,一款功能强大且适应性强的哈希破解工具。

image-20250107223033232

介绍

image-20250516195120089

John the Ripper 是一款广为人知、备受喜爱且功能多样的哈希破解工具,它不仅破解速度快,而且兼容的哈希类型范围也非常广泛。

前置学习条件

在学习本文的内容之前,我们建议你先完成以下三个有关密码学的TryHackMe实验房间:

除了基本的命令行能力之外,没有其他的前置学习条件。

学习目标

完成本文内容的学习之后,你将了解如何使用John进行以下工作:

  • 破解 Windows 身份验证中的哈希值;
  • 破解 /etc/shadow 哈希值;
  • 破解受密码保护的 Zip 文件;
  • 破解受密码保护的 RAR 文件;
  • 破解 SSH 密钥。

从本文的第四小节开始,你就需要使用TryHackMe提供的目标虚拟机 、AttackBox(攻击机) 或者你自己的本地攻击机系统。为了方便起见,你可以在与本文相关的实验房间页面中点击如下所示的 “Download Task Files-下载任务文件” 按钮,来下载完成本文实验所需的任务文件。

image-20250516195147337

image-20250516215548453

基础术语

在学习本文之前,你最好已经了解了与各种密码学术语相关的基础知识。为了方便起见,我们将在进入实际的哈希破解之前,先回顾一下与哈希破解相关的一些基础术语和基础概念。

什么是哈希?

哈希(Hash)是一种将一个任意长度的输入数据转换为另一个固定长度形式的输出的方法。这个过程会掩盖数据的原始值。哈希值是通过对原始数据进行哈希算法运算而得到的输出结果。目前有许多种流行的哈希算法,例如 MD4、 MD5 、SHA1 和 NTLM 等。

让我们来举个例子说明这一点:

如果我们取polo(一个由四个字符组成的字符串)并使用MD5哈希算法来处理它,我们最终会得到哈希输出 b53759f3ce692de7aff1b5779d3964da ,这是一个标准的 32 个字符的 MD5 哈希值。

同样,如果我们取polomints(一个 9 字符的字符串)并使用相同的MD5哈希算法处理它,我们最终会得到哈希输出584b6e4f4586e136bc280f27f9c64f3b ,这是另一个标准的 32 个字符的 MD5 哈希值。

什么让哈希变得安全?

哈希函数被设计为单向函数。换句话说,计算给定输入的哈希值很容易;然而,通过给定的哈希值找到其原始输入却是一个难题。简而言之,在计算机科学中,这样的一个难题会变得无法计算。这类计算问题源于数学中的 P vs NP 问题。

在计算机科学中,P 和 NP 是两类帮助我们理解算法效率的问题:

  • P(Polynomial Time-多项式时间) :P 类问题涵盖了可以在多项式时间内找到解的问题。例如,对一个列表进行升序排序。列表越长,排序所需的时间就越长;然而,排序时间的增长并非呈指数级增长。
  • NP(Non-deterministic Polynomial Time-非确定性多项式时间) :NP 类问题是指那些即使找到解本身可能很困难,但可以快速验证其解的问题。事实上,我们并不知道是否存在一种快速算法可以找到解。

虽然这是一个迷人的数学概念,并且是计算机和密码学的基础,但它完全超出了本文的讨论范围。抽象地说,哈希值的算法将是“P”类问题,因此可以合理计算。然而,“逆哈希”算法将会是“NP”类问题,难以解决,这意味着它无法使用标准计算机在合理的时间内计算出来。

John的用武之地

即使算法不可逆,但这并不意味着破解哈希值是不可能的。例如,如果你知道了一个密码的哈希值,并且还知道该值所对应的哈希算法,你就可以使用此哈希算法对大量单词(也被称为字典)进行哈希计算处理,然后,你再将这些得到的哈希值与想要破解的哈希值进行比较,看看它们是否能够匹配。如果可以成功匹配,你就知道了哪个单词能够与指定的哈希值相对应——你就破解成功了!

此过程被称为字典攻击(dictionary attack) ,而John the Ripper(通常缩写为 John)则是一种可以对各种哈希类型进行快速暴力猜解攻击的工具。

了解更多

关于加密和解密的更深入的学习,我们推荐完成TryHackMe上的 密码学基础知识公钥-密码学基础知识 实验房间;此外,对于哈希算法,我们推荐完成 哈希基础知识实验房间。

本文将集中讨论开膛手约翰最受欢迎的扩展版本:Jumbo John

答题

阅读本小节内容并完成以下问题。

开膛手约翰 (John the Ripper) 最受欢迎的扩展版本是什么?

Jumbo John

image-20250516200301006

实验环境设置

在本文的实验任务中,我们将使用以下内容:

  • 开膛手约翰(John the Ripper)的“Jumbo John-巨无霸约翰”版本;
  • RockYou 密码列表。

如果你使用TryHackMe提供的虚拟机或AttackBox,那么无需在系统上安装 John the Ripper 。因此,你可以跳过工具安装部分。如果你希望使用本地的计算机系统继续操作,那么就需要了解如何安装John the Ripper工具。需要注意的是,如果你使用的John the Ripper版本不是Jumbo John,那么你可能会缺少一些必需的工具内容,例如 zip2johnrar2john

工具安装

John the Ripper 在多种操作系统上都受支持,而不仅仅是在 Linux 发行版本上。在我们继续深入探讨之前,先来了解一下 John 的多个版本,包括标准的“核心”发行版和多个社区版本,这些版本扩展了原始的 John 发行版本的功能集。其中最受欢迎的发行版本是“ Jumbo John ”,我们稍后会用到它的具体功能。

AttackBox 和 Kali

Jumbo John已经被安装在本文所部署的目标虚拟机和AttackBox上,因此如果你打算使用这两者中的任何一个,则无需采取任何进一步的工具安装操作。此外,像 Kali这样的进攻性Linux发行版系统都会预装 Jumbo John。

你可以在机器的终端界面中输入 john 命令来检查它是否已经被安装。执行 john 命令后,你应该会看到 John 的使用指南,第一行会显示“ John the Ripper 1.9.0-jumbo-1”或其他类似的内容,实际的输出结果会因为工具的版本号而有所不同。

其他 Linux 发行版

许多 Linux 发行版系统都提供了 John the Ripper 的安装,可以从其官方仓库直接获取。例如,在 Fedora Linux 上,你可以使用sudo dnf install john 命令来安装 John the Ripper ;而在 Ubuntu 上,你可以使用 sudo apt install john 命令来进行安装。遗憾的是,在撰写本文时,这些版本的系统仅提供了关于此工具(John the Ripper)的核心功能的安装,而缺少了一些可通过 Jumbo John 提供的工具功能。

因此,你可能还需要考虑如何从源代码开始构建,以便访问 Jumbo John 可提供的所有工具功能。 John 官方安装指南提供了详细的安装和构建配置说明。

在 Windows 上安装

要在 Windows 上安装 Jumbo John the Ripper ,你需要在此处下载并安装适用于 64 位系统的压缩二进制文件 或在此处下载并安装适用于 32 位系统的压缩二进制文件。

Wordlists-单词列表(密码表/字典)

现在我们已经准备好了john ,我们还必须考虑另一个不可或缺的组成部分:单词列表(密码表/字典)。

正如我们之前提到的,要对哈希值进行字典攻击,你需要一个用于哈希计算并进行比较的单词列表(密码表);不出所料,它将被称为Wordlists。市面上有很多不同的单词列表,在 SecLists 代码库中可以找到一个不错的Wordlists集合。你也可以在其他几个地方找到用于攻击所选择的系统的单词列表;我们将快速介绍一下在哪里可以找到它们。

在 AttackBox 和 Kali Linux 发行版本的系统中,我们可以在 /usr/share/wordlists 目录中找到一系列很棒的单词列表(Wordlists)。

RockYou

对于本文中的所有实验任务,我们都将会使用臭名昭著的 rockyou.txt 单词列表文件,这是一个非常庞大的常用密码单词表,是在 2009 年 rockyou.com 网站的数据泄露事件中获取的。如果你没有使用上述任何Linux 发行版系统,那么你还可以从 SecLists 代码仓库的 /Passwords/Leaked-Databases 子目录下获取这个 rockyou.txt 单词列表文件,然后,你可能还需要使用 tar xvzf rockyou.txt.tar.gz 命令来将其从.tar.gz格式中提取出来。

现在我们已经配置好了哈希破解工具和单词列表,我们可以开始进行一些哈希破解工作了!

在开始执行实验操作之前,首先,让我们在与本文相关的TryHackMe实验房间页面中点击如下所示的启动机器按钮来部署目标虚拟机

image-20250516202925828

目标虚拟机将会以分屏视图启动。如果目标虚拟机不可见,请使用TryHackMe实验房间页面顶部的蓝色 “显示分屏视图” 按钮。

在必要的时候,你还可以使用以下凭据并基于目标 IP 地址 MACHINE_IP 来通过 SSH 访问目标虚拟机:

  • Username: user
  • Password: Tryhackme123!
ssh user@MACHINE_IP
Tryhackme123!

答题

rockyou.txt 单词列表是基于哪个网站的入侵事件而创建的?

rockyou.com

image-20250516210731098

破解基础的哈希值

使用 John the Ripper 破解简单哈希值的方法有很多种。在你尝试自己破解一些哈希值之前,我们先来介绍几种可用的方法。

John基础语法

John the Ripper 命令的基础语法如下所示,我们将介绍一些具体可以使用的选项和修饰符:

john [options] [file path]

  • john :调用 John the Ripper 程序
  • [options] :指定要使用的参数选项
  • [file path] :指定一个包含了你想要破解的哈希值的文件;如果它与John 位于同一目录中,则无需提供具体的文件路径,只需要提供文件名称即可。

自动破解

自动破解是John 内置的功能,它可以检测给定哈希值的类型,并且会选择合适的规则和格式来破解哈希;这并非总是最佳的选择,因为它可能不太可靠。但是如果你无法确定正在处理的哈希值的类型,又想尝试去破解它,那么使用 John 的自动破解功能或许会是一个不错的选择。为此,我们将使用以下语法:

john --wordlist=[path to wordlist] [path to file]

  • --wordlist= :指定使用单词列表模式(wordlist mode),从指定的路径中找到单词列表文件并进行读取;
  • [path to wordlist] :你正在使用的单词列表文件的路径,如前所述;
  • [path to file]:指定包含了你想要破解的哈希值的文件所对应的路径,如上文所述。
john --wordlist=/usr/share/wordlists/rockyou.txt hash_to_crack.txt

识别哈希

有时,John可能无法很好地自动识别和加载哈希值,不过没关系!我们可以使用其他工具来识别哈希值,然后再将John设置为使用特定的哈希格式。有很多方法可以做到这一点,例如使用像Hashes.com这样的在线哈希识别工具。此外,我们还可以使用一个名为hash-identifier的工具,这是一个非常易于使用的Python工具,它会告诉你 你所输入的哈希值最可能是哪些类型的哈希,如果第一个哈希类型错误,你还可以尝试它为你提供的更多选择。

要使用 hash-identifier,你可以使用 wgetcurl 指定的GitLab页面下载Python文件hash-id.py,然后,再使用 python3 hash-id.py启动该工具,并输入你想要进行识别的具体哈希值。hash-id.py会为你提供可能性较大的哈希格式的列表。如下面的终端示例界面所示:

user@TryHackMe$ wget https://gitlab.com/kalilinux/packages/hash-identifier/-/raw/kali/master/hash-id.py
user@TryHackMe$ python3 hash-id.py
   #########################################################################
   #     __  __                     __           ______    _____           #
   #    /\ \/\ \                   /\ \         /\__  _\  /\  _ `\         #
   #    \ \ \_\ \     __      ____ \ \ \___     \/_/\ \/  \ \ \/\ \        #
   #     \ \  _  \  /'__`\   / ,__\ \ \  _ `\      \ \ \   \ \ \ \ \       #
   #      \ \ \ \ \/\ \_\ \_/\__, `\ \ \ \ \ \      \_\ \__ \ \ \_\ \      #
   #       \ \_\ \_\ \___ \_\/\____/  \ \_\ \_\     /\_____\ \ \____/      #
   #        \/_/\/_/\/__/\/_/\/___/    \/_/\/_/     \/_____/  \/___/  v1.2 #
   #                                                             By Zion3R #
   #                                                    www.Blackploit.com #
   #                                                   Root@Blackploit.com #
   #########################################################################
--------------------------------------------------
 HASH: 2e728dd31fb5949bc39cac5a9f066498

Possible Hashs:
[+] MD5
[+] Domain Cached Credentials - MD4(MD4(($pass)).(strtolower($username)))

指定格式进行破解

一旦确定了想要处理的哈希值的类型,你就可以告诉 John 使用以下语法来破解给定的哈希值:

john --format=[format] --wordlist=[path to wordlist] [path to file]

  • --format= :这个参数标志会告诉 John 你将给它提供一个特定格式(类型)的哈希值,并且基于你所提供的具体格式来进行破解;
  • [format] :哈希的格式(即哈希类型);
  • --wordlist= :指定使用单词列表模式(wordlist mode),如上文所述;
  • [path to wordlist] :你正在使用的单词列表文件的路径,如上文所述;
  • [path to file]:指定包含了你想要破解的哈希值的文件所对应的路径,如上文所述。

示例用法:

john --format=raw-md5 --wordlist=/usr/share/wordlists/rockyou.txt hash_to_crack.txt

关于格式的说明

当你告诉 John 使用--format参数选项时,如果你处理的是标准哈希类型(例如上例中的 md5 ),则必须在其前面加上 raw- 前缀,以告诉 John 你处理的是标准哈希类型,但这并不总是适用。要检查是否需要添加前缀,你可以使用 john --list=formats命令来列出 John 支持的所有格式,然后手动检查,或者使用类似于 john --list=formats | grep -iF "md5" 的 grep 命令来查找你想要的哈希类型。

答题

现在你已经了解了如何破解基础的哈希值,请完成本小节的答题任务,相关的文件位于目标虚拟机的 ~/John-the-Ripper-The-Basics/Task04/目录下。

安装好hash-identifie工具之后,输入命令python3 hash-id.py执行,将需要进行识别的hash值复制粘贴输入,再按回车即可开始识别

使用hash-id.py 和在线网站https://hashes.com/en/tools/hash_identifier 两种方式都能识别hash值的类型,结合两种方式的识别结果:得出要破解的hash值的类型。

知道哈希类型之后,就可以运行john并使用参数指定hash类型进行hash破解 , 注意:表示hash类型的参数写法要符合john的语法

如果使用john破解哈希失败,还可以通过在线网站破解哈希:

https://hashes.com/en/decrypt/hash

https://crackstation.net/

我们可以下载包含hash文件的附件(参考第一小节)或者查看目标虚拟机~/John-the-Ripper-The-Basics/Task04/目录下的文件,然后回答下面的问题。

hash1.txt 是什么类型的哈希?

cd ~/John-the-Ripper-The-Basics/
ls -la
cd Task04
ls -la
cat hash1.txt #2e728dd31fb5949bc39cac5a9f066498
python3 hash-id.py

image-20250518111345837

image-20250518111450334

MD5

hash1.txt 破解后的值是多少?

john --format=raw-md5 --wordlist=/usr/share/wordlists/rockyou.txt hash1.txt
##或者使用在线网站进行破解:https://hashes.com/en/decrypt/hash or https://crackstation.net/

image-20250518111622164

biscuit

hash2.txt 是什么类型的哈希?

tips:书写名称时不要使用破折号“-”。

cat hash2.txt #1A732667F3917C0F4AA98BB13011B9090C6F8065
python3 hash-id.py
##或者使用在线网站识别哈希类型:https://hashes.com/en/tools/hash_identifier

image-20250518112012330

SHA1

hash2.txt 破解后的值是多少?

john --list=formats | grep -iF "sha1"
john --format=Raw-SHA1 --wordlist=/usr/share/wordlists/rockyou.txt hash2.txt
##或者使用在线网站进行破解:https://hashes.com/en/decrypt/hash or https://crackstation.net/

image-20250518112404752

kangeroo

hash3.txt 是什么类型的哈希?

tips:书写名称时不要使用破折号“-”。

cat hash3.txt #D7F4D3CCEE7ACD3DD7FAD3AC2BE2AAE9C44F4E9B7FB802D73136D4C53920140A
python3 hash-id.py
##或者使用在线网站识别哈希类型:https://hashes.com/en/tools/hash_identifier

image-20250518112646862

sha256

hash3.txt 破解后的值是多少?

john --list=formats | grep -iF "sha256"
john --format=Raw-SHA256 --wordlist=/usr/share/wordlists/rockyou.txt hash3.txt
##或者使用在线网站进行破解:https://hashes.com/en/decrypt/hash or https://crackstation.net/

image-20250518112758795

microphone

hash4.txt 是什么类型的哈希?

tips:它不是 SHA-512。

cat hash4.txt #c5a60cc6bbba781c601c5402755ae1044bbf45b78d1183cbf2ca1c865b6c792cf3c6b87791344986c8a832a0f9ca8d0b4afd3d9421a149d57075e1b4e93f90bf
python3 hash-id.py
##或者使用在线网站识别哈希类型:https://hashes.com/en/tools/hash_identifier

image-20250518113219641

Whirlpool

hash4.txt 破解后的值是多少?

tips:你不需要为它添加“raw”前缀。

john --list=formats | grep -iF "Whirlpool"
john --format=Whirlpool --wordlist=/usr/share/wordlists/rockyou.txt hash4.txt
##或者使用在线网站进行破解:https://hashes.com/en/decrypt/hash or https://crackstation.net/

image-20250518113244968

colossal

image-20250518113446084

破解 Windows 身份验证哈希值

现在我们了解了John the Ripper的基础语法和用法,接下来让我们来破解一些更复杂的内容,那些你正在进行渗透测试或红队对抗时,可能想要尝试去破解的内容。身份验证哈希是操作系统所存储的密码值的哈希版本;有时我们可以使用暴力猜解的方法来破解它们。要获取到这些哈希,你通常必须已经是特权用户,因此我们将在尝试破解它们之前先解释一些我们计划破解的哈希。

NTHash / NTLM

NThash 是现代Windows操作系统用于存储用户密码和服务密码的哈希格式。它通常也被称为 NTLM ,指的是 Windows 上一个版本的哈希密码格式 LM,因此也可称为 NT/LM。

回顾一下历史:Windows 产品的 NT 标识最初的含义为“新技术-New Technology”。从 Windows NT 开始,它被用来表示非基于 MS-DOS 操作系统而构建的产品。最终,“NT”系列成为微软发布的标准操作系统类型,这个名称现在已经被弃用,但是它仍然保留在一些微软技术的名称中。

在 Windows 系统中,SAM (Security Account Manager-安全帐户管理器) 被用于存储用户帐户信息,包括用户名和哈希密码。你可以通过转储 Windows 计算机上的 SAM 数据库、使用 Mimikatz 等工具或者使用 Active Directory 数据库 NTDS.dit 来获取到 NTHash/ NTLM 哈希。在实战情况下,你可能无需破解哈希值即可继续提升你的访问权限,因为你通常会尝试进行“哈希传递”攻击,但有时,如果密码策略较弱,直接进行哈希破解也是一个可行的选择项。

实例练习

现在你已经了解了NThash背后的理论基础,看看你是否能运用我们在上一个小节中所介绍的技巧,以及根据对哈希类型的了解,来破解 ntlm.txt 文件。用于完成本小节实验练习的相关文件被放置在目标机器的~/John-the-Ripper-The-Basics/Task05/ 目录下。

答题

为了破解这个哈希(相关文件在目标虚拟机的~/John-the-Ripper-The-Basics/Task05/目录下),我们需要将 --format 标志设置为什么?

tips:它只有两个字符。

cd ~/John-the-Ripper-The-Basics/Task05/
ls -la
cat ntlm.txt #5460C85BD858A11475115D2DD3A82333
##记得识别哈希类型
john --list=formats | grep -iF "ntlm"

image-20250518113928644

NT

这个密码的破解值是多少?

john --format=NT --wordlist=/usr/share/wordlists/rockyou.txt ntlm.txt

image-20250518114025450

mushroom

image-20250518114049380

破解/etc/shadow 哈希值

/etc/shadow文件是 Linux 系统中存储密码哈希值的文件。它还存储了其他信息,例如上次更改密码的日期和密码过期的时间。该文件每行包含一个条目,对应系统中每个用户或用户帐户。此文件通常只有 root 用户才能访问,因此你必须拥有足够的权限才能访问哈希值。但是,如果你拥有足够的权限,就有可能破解部分哈希值。

Unshadow处理

John 对数据格式的要求非常严格;因此,要破解 /etc/shadow 密码,必须先将其与 /etc/passwd 文件结合在一起,才能让 John 理解输入的数据。为此,我们可以使用 John 工具套件中内置的 unshadow 工具。unshadow 的基础语法如下所示:

unshadow [path to passwd] [path to shadow]
  • unshadow :调用 unshadow 工具;
  • [path to passwd] :包含从目标机器获取到的 /etc/passwd 文件副本的相关文件路径;
  • [path to shadow] :包含从目标机器获取到的 /etc/shadow 文件副本的相关文件路径。

示例用法:

unshadow local_passwd local_shadow > unshadowed.txt

注意事项

当你使用 unshadow 时,你可以使用整个/etc/passwd/etc/shadow 文件(假设你可以访问它们),或者使用每个文件内容中的相关行,例如:

文件 1 - local_passwd

包含 root 用户的 /etc/passwd文件的内容行:

root:x:0:0::/root:/bin/bash

文件 2 - local_shadow

包含 root 用户的 /etc/shadow文件的内容行:

root:$6$2nwjN454g.dv4HN/$m9Z/r2xVfweYVkrr.v5Ft8Ws3/YYksfNwq96UL1FX0OJjY1L6l.DS3KEVsZ9rOVLB/ldTeEL/OIhJZ4GMFMGA0:18576::::::

开始破解

然后,我们可以将 unshadow 的输出(在我们的示例中是unshadowed.txt)直接输入给 John。由于我们已经专门为 John 创建了输入,因此我们不需要在这里指定模式;但是,在某些情况下,你需要像我们之前一样使用 --format=sha512crypt 指定格式:

john --wordlist=/usr/share/wordlists/rockyou.txt --format=sha512crypt unshadowed.txt

实例练习

现在,看看你是否能按照上述步骤来破解 etchashes.txt文件中所提供的root用户的密码哈希值,此文件在~/John-the-Ripper-The-Basics/Task06/目录下。

答题

root 密码是什么(相关文件的目标虚拟机的~/John-the-Ripper-The-Basics/Task06/目录中)?

cd ~/John-the-Ripper-The-Basics/Task06/
ls -la
#unshadow local_passwd local_shadow > etc_hashes.txt.txt
cat etc_hashes.txt #
#由于我们已经专门为 John 创建了输入,因此我们一般不需要在这里指定模式(某些情况下除外)。
john --wordlist=/usr/share/wordlists/rockyou.txt etc_hashes.txt
john --show etc_hashes.txt

image-20250518115601804

`root:1234:18576::::::`

输出格式解读:

- `root`:目标用户名(这里是 Linux 超级用户)。
- `1234`:破解出的明文密码(非常弱,属于常见弱口令)。
- `18576`:可能是密码的最后修改日期(Unix 时间戳的天数形式)。
- 剩余的空字段 `::::::` 是 `/etc/shadow` 文件的默认占位符(如密码过期时间、警告周期等)。

密码为:1234

image-20250518115838988

John the Ripper的单破解模式

到目前为止,我们一直在使用 John 的单词列表模式来暴力猜解简单和不太简单的哈希值。但是 John 还有另一种使用模式,它被称为 “单破解” 模式。在此模式下,John 可以仅使用用户名中所提供的信息,并通过略微更改用户名中所包含的字母和数字,以启发式的方式来尝试找出可能的密码。

单词重整

解释单破解模式和单词重整的最好方法是通过一个例子来进行说明:

假如用户名是“Markus”,一些可能的密码是:

  • Markus1, Markus2, Markus3 (等等);
  • MArkus, MARkus, MARKus (等等);
  • Markus!, Markus$, Markus* (等等);

这种技术被称为“单词重整”。John 可以根据输入的信息来构建密码字典,并会使用一组名为“mangling rules-重整规则”的规则,这些规则定义了如何改变初始单词,从而根据与目标相关的因素来生成一个可能的单词列表(密码列表/字典)。这种方法利用了密码的强度设置,即根据用户名或将要登录的服务的信息来判断密码机制下所允许的密码强度。

GECOS字段

John 的单词重整的实现兼容了 UNIX 操作系统的 GECOS 字段,以及其他类 UNIX 操作系统,如 Linux 。GECOS 代表通用电气综合操作系统。在上一个小节中,我们查看了 /etc/shadow/etc/passwd 的条目。仔细观察,你会注意到这些字段之间以冒号 : 分隔。用户帐户记录中的第五个字段即是GECOS字段,它存储有关用户的一般信息,例如用户的全名、办公室电话号码和电话号码等。John 可以获取存储在这些记录中的信息,例如全名和主目录名称,并将它们添加到使用单破解模式来破解 /etc/shadow 哈希时所生成的单词列表中。

GECOS:General Electric Comprehensive Operating System-通用电气综合操作系统

使用单破解模式

要使用单破解模式,我们可以使用与之前大致相同的语法;例如,如果我们想使用单破解模式来破解用户名为“Mike”的用户的密码,我们可以使用以下语法:

john --single --format=[format] [path to file]
  • --single :此参数标志可以让 John 知道你想使用单哈希破解模式;
  • --format=[format] :与前述内容所提及的一样,识别正确的哈希格式至关重要;
  • [path to file]:包含哈希值的哈希文件的路径。

示例用法:

john --single --format=raw-sha256 hashes.txt

单破解模式下的文件格式说明

如果你在单破解模式下破解哈希值,你需要更改你提供给 John 的文件格式,以便 John 能够理解要基于哪些数据来创建单词列表。你可以在哈希值前面加上它所对应的用户名,以上面的例子来看,我们需要更改hashes.txt文件的内容:

From 1efee03cdcb96d90ad48ccc7b8666033To mike:1efee03cdcb96d90ad48ccc7b8666033

实例练习

现在你已经熟悉了 John 的单破解模式的基本语法,你可以访问本小节的练习所给定的哈希值并进行破解了,假设它所对应的用户名为“Joker”。目标哈希文件保存在目标虚拟机的 ~/John-the-Ripper-The-Basics/Task07/目录下。

答题

Joker的密码是什么?

tips:记得识别哈希类型。

cd ~/John-the-Ripper-The-Basics/Task07/
ls -la
cat hash07.txt #7bf6d9bb82bed1302f331fc6b816aada
#记得识别哈希类型:https://hashes.com/en/tools/hash_identifier
#john --list=formats | grep -iF "md5"
nano hash07.txt #在哈希值前面加上它所对应的用户名 "Joker:"
john --single --format=Raw-MD5 hash07.txt

image-20250518120133575

image-20250518120025960

image-20250518120426885

image-20250518120538037

Jok3r

image-20250518120619505

自定义规则

什么是自定义规则?

当我们探索 John 在单破解模式下能做什么时,你可能会对一些比较好的密码重整模式或者你常用的密码模式有一些想法,而这些模式可以通过特定的密码重整模式进行复制。好消息是,你可以定义你自己的规则,John将使用这些规则来动态创建密码以构建密码列表。当你对目标密码的结构有更深入的了解时,定义此类规则的能力将大有裨益。

通用的自定义规则

许多组织会要求一定程度的密码复杂度,以抵御字典攻击。换句话说,在创建新帐户或更改用户密码时,如果你尝试使用像 polopassword 这样的密码,那么它很可能无法被使用。原因可能是目标系统的密码机制会强制要求密码要有一定的密码复杂度。因此,你可能会收到一条提示,提示你在设置密码时密码必须至少包含以下每个字符中的一个:

  • Lowercase letter 小写字母
  • Uppercase letter 大写字母
  • Number 数字
  • Symbol 符号

密码复杂度固然重要!然而,我们可以利用一个可知的事实:大多数用户在密码中使用这些符号的位置是可以预测的。为了满足上述密码强度标准,许多用户会使用类似于下面的密码:

Polopassword1!

我们可以设想一个密码,其首部是大写字母,尾部是数字,最后的内容是符号。这种常见的密码模式,加上修饰符(例如大写字母或符号),易于记忆,人们在创建密码时可能会反复使用它。这种模式可以让我们对密码复杂度可预测性(password complexity predictability)进行利用。

现在,密码确实满足了密码复杂性的要求;但是,作为攻击者,我们可以利用这些被添加的元素的可能位置,在我们的单词列表中动态创建可能的密码单词。

如何创建自定义规则

自定义规则可以在 john.conf 文件中进行定义。在本文的实验环境中,这个文件可以在TryHackMe所提供的Attackbox的 /opt/john/john.conf路径中找到。如果你使用包管理器安装了John,或者使用 make 从源代码构建了John,那么此文件通常会位于/etc/john/john.conf

让我们以上面的示例作为目标模式,来回顾一下这些自定义规则的语法。请注意,你可以在这些规则中定义大量的精细控制。建议你查看一下相关的wiki,以全面了解你可以使用的修饰符以及更多关于规则实现的示例。

john.conf的第一行:

[List.Rules:THMRules] 将用于定义规则的名称,你可以把你的自定义规则定义为可被调用的一个 John 参数。

然后,我们使用正则表达式样式模式匹配来定义单词的修改位置;同样,我们将仅在这里介绍主要和最常见的修饰符:

  • Az :获取单词并在其后面添加你定义的字符;
  • A0 :获取单词并在其前面添加你定义的字符;
  • c :按位置将字符变成大写形式。

这些修饰符可以组合使用来定义你想要修改的单词的位置和内容。

最后,我们必须定义哪些字符应该被后置附加、前置添加或者以其他方式被包含。我们通过在方括号 [ ] 中指定字符集的位置来实现。这些字符集将遵循双引号 " " 内所设置的修饰符模式。

以下是一些常见示例:

  • [0-9] :将会包含数字 0-9;
  • [0] :仅包含数字 0;
  • [A-z] :将会包含大写字母和小写字母;
  • [A-Z] :仅包含大写字母;
  • [a-z] :仅包含小写字母。

请注意:

  • [a] :仅包含 a
  • [!£$%@] :将会包含符号!, £, $, %@

综合以上所有内容,为了根据规则生成与示例密码 Polopassword1!模式匹配的单词列表(即假定单词 polopassword 会被包含在我们的单词列表中),我们将创建一个如下所示的规则条目:

[List.Rules:PoloPassword]
cAz"[0-9] [!£$%@]"

上面的规则条目的相关解析如下所示:

  • c :将首字母大写;
  • Az :在单词的末尾添加你定义的字符;
  • [0-9] :0-9 范围内的数字;
  • [!£$%@] :在密码后面添加这些符号之一(!, £, $, %@)。

使用自定义规则

然后我们可以使用 --rule=PoloPassword 参数标志来将我们刚才所创建的自定义规则作为一个 John 参数调用。

完整的命令类似于: john --wordlist=[path to wordlist] --rule=PoloPassword [path to file]

值得注意的是,如果你正在编写John的自定义规则,那么你可以发现对模式进行讨论会很有帮助;如上所示,这同样适用于如何更好地编写 RegEx 模式。

Jumbo John 已经拥有一份详尽的自定义规则列表,其中包含了几乎所有情况下可用的修饰符。如果你遇到困难,请尝试查看这些规则(大约在john.conf文件内容的第678行),看看你的语法是否正确。

tips:/etc/john/john.conf

答题

自定义规则允许我们利用什么?

password complexity predictability-密码复杂度可预测性

我们应该使用什么规则将所有大写字母添加到单词末尾?

tips:请记住,Az 表示附加到单词的末尾,而 "[A-Z]" 指的是大写字母。

Az"[A-Z]"

我们使用什么参数标志来调用名为 THMRules 的自定义规则?

--rule=THMRules

image-20250518120640718

破解受密码保护的Zip文件

是的!你没看错。我们可以使用 John 来破解受密码保护的 Zip 文件的密码。同样,我们将使用 John 工具套件中的另一个组件来将 Zip 文件转换为 John 能够理解的格式,我们将基于之前就已经熟悉的John语法来构造命令。

Zip2John

与之前使用的 unshadow 工具类似,我们将使用 zip2john 工具来将 Zip 文件转换为 John 能够理解并有望破解的哈希格式。主要用法如下:

zip2john [options] [zip file] > [output file]
  • [options] :允许你将特定的校验和(checksum)选项传递给 zip2john ;这通常不是必要的;
  • [zip file] :与你所希望获取的哈希值相关的 Zip 文件的路径;
  • > :将此命令的输出重定向到另一个文件;
  • [output file] :这是存储哈希输出结果的文件。

示例用法

zip2john zipfile.zip > zip_hash.txt

开始破解

然后,我们可以获取上述示例中从 zip2john 输出得到的文件 zip_hash.txt ,并且像对 unshadow 所做的那样,将其直接提供给 John 命令,因为我们已经专门为其进行了输入处理。

john --wordlist=/usr/share/wordlists/rockyou.txt zip_hash.txt

实例练习

现在,我们可以尝试破解一个“安全”的 Zip 文件!该文件位于 ~/John-the-Ripper-The-Basics/Task09/目录下 。

答题

secure.zip 文件的密码是什么?

cd ~/John-the-Ripper-The-Basics/Task09/
ls -la
zip2john secure.zip > securezip_hash.txt
ls -la
john --wordlist=/usr/share/wordlists/rockyou.txt securezip_hash.txt

image-20250518121014697

pass123

zip 文件里面的flag内容是什么?

unzip secure.zip
#密码是:pass123
cat zippy/flag.txt

image-20250518121157093

THM{w3ll_d0n3_h4sh_r0y4l} 。

image-20250518121237929

破解受密码保护的RAR归档文件

我们可以使用与上一个小节中类似的过程来获取 RAR 归档文件的密码。如果你不熟悉此压缩格式,那么你所需要知道的是——RAR归档文件是由WinRAR归档文件管理器所创建的压缩文件。与 Zip 文件一样,它们会压缩文件夹和文件。

Rar2John

此工具与上面所介绍的 zip2john 工具的用法几乎相同,我们可以使用 rar2john 工具来将 RAR 文件转换为 John 可以理解的哈希格式。基本语法如下:

rar2john [rar file] > [output file]
  • rar2john :调用 rar2john 工具;
  • [rar file] :与你所希望获取的哈希值相关的 RAR 文件的路径;
  • > :将此命令的输出重定向到另一个文件;
  • [output file] :这是存储前面命令的哈希输出结果的文件。

示例用法

/opt/john/rar2john rarfile.rar > rar_hash.txt

开始破解

然后,我们可以获取上述示例中从 rar2john 输出得到的文件 rar_hash.txt ,并将其直接提供给John,就像我们对 zip2john 所做的那样。

john --wordlist=/usr/share/wordlists/rockyou.txt rar_hash.txt

实例练习

现在,我们可以尝试破解一个“安全”的 RAR 文件!该文件位于 ~/John-the-Ripper-The-Basics/Task10/目录下 。

答题

secure.rar 文件的密码是什么?

cd ~/John-the-Ripper-The-Basics/Task10/
ls -la
/opt/john/rar2john secure.rar > securerar_hash.txt
ls -la
john --wordlist=/usr/share/wordlists/rockyou.txt securerar_hash.txt

image-20250518121442655

password

压缩文件里面的flag内容是什么?

tips:你可能需要安装一个名为 unrar 的实用程序。

unrar e secure.rar
#密码是:password
ls -la
cat flag.txt

image-20250518121800095

THM{r4r_4rch1ve5_th15_t1m3} 。

image-20250518121847581

使用John破解SSH密钥

接下来让我们再探索一下 John 在 CTF 挑战中经常会出现的另一种用法——使用 John 破解 id_rsa 文件的 SSH 私钥密码。除非另有配置,否则你将使用密码来验证你的 SSH 登录操作。但是,你还可以对SSH配置基于密钥的身份验证,这将允许你使用私钥 id_rsa 作为身份验证密钥以通过 SSH 登录到远程计算机。然而,这样做通常还需要使用密码才能访问私钥;在这里,我们将使用 John 破解此密码,以允许我们使用密钥通过 SSH 进行身份验证。

SSH2John

谁能想到,这又是一个转换工具?顾名思义, ssh2john 能够将用于登录 SSH 会话的 id_rsa 私钥转换为 John 可以使用的哈希格式。这又是 John 多才多艺的绝佳例证。此工具的语法和你预期的差不多。请注意,如果你没有安装 ssh2john ,可以使用位于 /opt/john/ssh2john.py 中的 ssh2john.py 。如果你在 AttackBox 上执行此操作,可以将 ssh2john 命令替换为 python3 /opt/john/ssh2john.py ,或者如果你在Kali中执行此操作,可以将 ssh2john 命令替换为python /usr/share/john/ssh2john.py命令 。

ssh2john [id_rsa private key file] > [output file]
  • ssh2john :调用 ssh2john 工具;
  • [id_rsa private key file] :与你所希望获取的哈希值相关的 id_rsa 文件的路径;
  • > :这是输出目录。我们用它来将命令的输出重定向到另一个文件;
  • [output file] :这是存储哈希输出的文件。

示例用法

/opt/john/ssh2john.py id_rsa > id_rsa_hash.txt

开始破解

我们将向John 提供经过 ssh2john 处理而输出得到的文件,在我们上面的示例中该文件是 id_rsa_hash.txt ,并且像我们对 rar2john 所做的那样,我们可以将它与 John 命令无缝地一起使用:

john --wordlist=/usr/share/wordlists/rockyou.txt id_rsa_hash.txt

实例练习

现在,我们可以尝试破解与本小节答题任务相关的 id_rsa 文件的哈希值,该文件位于 ~/John-the-Ripper-The-Basics/Task11/目录中 。

答题

SSH 私钥的密码是什么?

cd ~/John-the-Ripper-The-Basics/Task11/
ls -la
/opt/john/ssh2john.py id_rsa > id_rsa_hash.txt
ls -la
john --wordlist=/usr/share/wordlists/rockyou.txt id_rsa_hash.txt

image-20250518122020046

mango

image-20250518122230777

本文小结

我们已经完成了关于John the Ripper的基础学习!我相信你现在已经理解了使用John的基本原理和模式。建议查看 Openwall Wiki 以了解更多关于使用John的信息,以及有关该工具的建议、更新或新闻。

posted @ 2025-05-18 12:28  Hekeatsll  阅读(947)  评论(0)    收藏  举报