John笔记

简述

一款免费、开源的暴力密码破解器,它有多平台版本,支持目前大多数的加密算法,如DES、MD4、MD5等。该软件破解密码方式简单而粗暴,理论上只要时间上面允许,该软件可以破译绝大多数用户密码。John the Ripper免费的开源软件,支持目前大多数的加密算法,如DES、MD4、MD5等。它支持多种不同类型的系统架构,包括Unix、Linux、Windows、DOS模式、BeOS和OpenVMS,主要目的是破解不够牢固的Unix/Linux系统密码。

在 Debian 系的 Linux 中可以使用 apt install john 获取。

同时也可以在官网中获取原代码版本和发行版。

需要注意的是,john 时常需要与 *2john 软件配合使用,一般是将密码转换为 hash 值,而这类软件需要从官网中的发行版中获取。

安装

在官网 https://www.openwall.com/john/ 中,我们可以选择 Windows 二进制版,里面已经包含了 *2johnjohn 的二进制构建或者 python 脚本。

如果是选择了下载源码,可能需要使用 make 指令自动化编译。

一个小建议,将下载的 Windows 二进制版本文件夹中的 run 文件夹(存放 *2johnjohn 的二进制构建或者 python 脚本的文件夹)加入环境变量中,这样可以随时随地调用。

使用

破解模式

John 支持四种密码破解模式:

  1. 字典模式 → 在这种模式下,用户只需要提供字典和密码列表用于破解。
  2. 单一破解模式 → 这是john作者推荐的首选模式。John会使用登录名、全名和家庭通讯录作为候选密码。
  3. 递增模式 → 在该模式下john会尝试所有可能的密码组合。这是最具威力的一种。
  4. 外部模式 → 在这种模式下,用户可以使用 john 的外部破解模式。使用之前,需要创建一个名为 (list.external:mode) 的配置文件,其中 mode 由用户分配。

命令参数

参数 作用
–single single crack 模式,使用配置文件中的规则进行破解
–wordlist=FILE–stdin 字典模式,从 FILE或标准输入中读取词汇
–rules 打开字典模式的词汇表切分规则
–incremental[=MODE] 使用增量模式
–external=MODE 打开外部模式或单词过滤,使用 [List.External:MODE] 节中定义的外部函数
–stdout[=LENGTH] 不进行破解,仅仅把生成的、要测试是否为口令的词汇输出到标准输出上
–restore[=NAME] 恢复被中断的破解过程,从指定文件或默认为 $JOHN/john.rec 的文件中读取破解过程的状态信息
–session=NAME 将新的破解会话命名为 NAME,该选项用于会话中断恢复和同时运行多个破解实例的情况
–status[=NAME] 显示会话状态
–make-charset=FILE 生成一个字符集文件,覆盖 FILE 文件,用于增量模式
–show 显示已破解口令
–test 进行基准测试
–users=[-]LOGIN UID[,…]
–groups=[-]GID[,…] 对指定用户组的账户进行破解,减号表示反向操作,说明对列出组之外的账户进行破解。
–shells=[-]SHELL[,…] 对使用指定 shell 的账户进行操作,减号表示反向操作
–salts=[-]COUNT 至少对 COUNT 口令加载加盐,减号表示反向操作
–format=NAME 指定密文格式名称,为 DES/BSDI/MD5/BF/AFS/LM 之一
–save-memory=LEVEL 设置内存节省模式,当内存不多时选用这个选项。 LEVEL取值在 1~3 之间

实例

一般来说,我们使用 John 自带的脚本将加密文件转换为哈希值后再进行爆破

使用字典爆破密码

1
john --wordlist=password.lst hash.txt

OSFP

使用嗅探工具获取 net-md5 哈希值

1
ettercap -Tqr ospf.pcapng

随后进行指定爆破

1
john hash.txt --format=net-md5 --wordlist=password_dict.txt --force

注意

Python 3.9 版本 xml 库将生成迭代器的函数删去,改为 iter 获取,故一部分 John 脚本运行时会出现错误,故需要进行代码更改。

office2john.py 错误

这是一个旧版本错误,在最新版本的 John 中已经修改。

在第 2857 行中,office2john.py 使用 xml.etree.ElementTree 对象进行读取操作,需要注意的是在 Python3.9 版本以前,使用 getiterator 获取迭代器,而 Python3.9 版本删去了这一函数,改为了使用 iter 函数获取迭代器,故需要将此行进行变更。

旧代码如下:

1
2
# old code
for node in tree.getiterator('{http://schemas.microsoft.com/office/2006/keyEncryptor/password}encryptedKey')

需要更改为:

1
2
# new code
for node in tree.iter('{http://schemas.microsoft.com/office/2006/keyEncryptor/password}encryptedKey')