John the Ripper配置与自定义开发
本文深入解析了John the Ripper的配置文件结构、规则语法系统、插件开发机制以及社区贡献体系。内容涵盖了配置文件的层级加载机制、核心选项详解、字符集与测试模式配置,以及规则语法的各种转换命令和条件判断。同时详细介绍了格式插件和动态编译器的开发方法,包括架构概述、接口规范和性能优化技巧。最后阐述了项目的开源协作模式、版本管理策略和自动化测试体系,为高级用户和开发者提供全面的技术参考。
配置文件深度解析
John the Ripper的配置文件是其强大功能的核心所在,通过精细的配置可以实现高度定制化的密码测试策略。配置文件采用INI格式,支持多种配置选项和扩展功能,让用户能够根据具体需求调整测试行为。
配置文件结构与加载机制
John支持多级配置文件加载机制,按照以下顺序加载配置:
这种分层配置机制确保了系统默认配置的完整性,同时允许用户进行个性化定制。
核心配置选项详解
基本运行参数
[Options]
Wordlist = $JOHN/password.lst ; 默认字典文件
Idle = Y ; 仅使用空闲CPU周期
Save = 60 ; 崩溃恢复保存间隔(秒)
Beep = N ; 测试成功时发出提示音
编码与字符集配置
John支持多种编码格式,确保正确处理不同语言的密码:
DefaultEncoding = UTF-8 ; 默认输入编码
DefaultMSCodepage = CP850 ; Microsoft哈希的默认目标编码
AlwaysReportUTF8 = Y ; 始终以UTF-8格式报告测试结果
测试模式配置
增量模式(Incremental Mode)
增量模式是John最强大的功能之一,通过字符集文件定义密码尝试策略:
[Incremental:ASCII]
File = $JOHN/charsets/ascii.hcstat
MinLen = 0
MaxLen = 8
CharCount = 95
支持的预定义字符集包括: | 字符集名称 | 描述 | 包含字符数 | |-----------|------|-----------| | ASCII | 标准ASCII字符 | 95 | | LM_ASCII | LM哈希专用ASCII | 69 | | UTF8 | Unicode字符集 | 可变 | | Alnum | 字母数字 | 62 | | Alpha | 字母 | 52 | | Lower | 小写字母 | 26 | | Upper | 大写字母 | 26 | | Digits | 数字 | 10 |
规则模式(Rules Mode)
规则模式允许对字典单词进行各种变换,大幅提高测试效率:
[List.Rules:Wordlist]
# 基础规则
:
l
u
c
$[0-9]
$[0-9]$[0-9]
^[!@#$%^&*()_+]
高级配置功能
包含文件机制
John支持模块化配置,通过include语法组织复杂的配置:
.include "dynamic.conf" ; 包含动态格式配置
.include 'local_rules.conf' ; 包含本地规则配置(静默失败)
.include <external.conf> ; 包含外部模式配置(必须存在)
本地配置覆盖
通过john-local.conf文件可以安全地覆盖默认配置:
[Local:Options]
Idle = N ; 禁用空闲模式
DynamicAlwaysUseBareHashes = Y ; 动态格式始终使用原始哈希
[Local:Incremental:ASCII]
MinLen = 1 ; 修改ASCII增量模式的最小长度
MaxLen = 12 ; 修改最大长度
性能优化配置
内存管理
WordlistMemoryMapMaxSize = 1024 ; 字典文件内存映射最大大小(MiB)
SingleMaxBufferSize = 4 ; 单模式最大缓冲区大小(GB)
SingleMaxBufferAvailMem = N ; 是否根据可用内存调整缓冲区
会话管理
SessionFileProtect = Disabled ; 会话文件保护模式
LogFileProtect = Disabled ; 日志文件保护模式
LogFilePermissions = 0600 ; 日志文件权限
PotFilePermissions = 0600 ; POT文件权限
调试与监控配置
详细输出控制
CrackStatus = N ; 测试时显示状态信息
StatusShowCandidates = N ; 显示尝试的候选密码数量
ShowSaltProgress = N ; 显示salt处理进度
PerRuleStats = N ; 记录每个规则的统计信息
颜色与格式设置
UseColors = Y ; 启用颜色输出
ColorError = ^[0;31m ; 错误信息颜色(红色)
ColorNotice = ^[0;32m ; 通知信息颜色(绿色)
ColorWarning = ^[0;33m ; 警告信息颜色(黄色)
TerminalReset = ^[0m ; 终端重置代码
格式禁用与过滤
可以临时禁用某些哈希格式以避免兼容性问题:
[Disabled:Formats]
LM = Y ; 禁用LM哈希格式
MD5 = N ; 启用MD5哈希格式
外部模式配置
John支持通过外部脚本定义自定义测试模式:
[External:MyCustomMode]
Expression = cmd(echo "password" | md5sum | cut -d' ' -f1)
最佳实践建议
- 配置备份:始终在john-local.conf中进行修改,避免升级时丢失配置
- 性能测试:根据硬件配置调整缓冲区和内存映射设置
- 编码一致性:确保输入文件、字典和输出编码设置一致
- 规则优化:根据目标密码策略定制规则集
- 监控调整:根据测试进度动态调整配置参数
通过深入理解John the Ripper的配置文件结构,用户可以充分发挥其强大的密码测试能力,实现高效、精准的安全测试工作。
规则语法与自定义规则
John the Ripper的规则系统是其最强大的功能之一,它允许用户通过定义复杂的转换规则来生成密码变体,从而大幅提高密码测试的成功率。规则系统基于简单的命令语法,可以执行大小写转换、字符替换、字符串操作等多种变换。
规则语法基础
John的规则由一系列命令组成,每个命令执行特定的操作。规则可以包含条件判断、变量操作和复杂的字符串处理功能。
基本命令结构
[拒绝标志] 命令1 命令2 命令3...
拒绝标志示例:
-c- 仅在哈希类型区分大小写时应用规则-8- 仅在哈希类型使用8位字符时应用规则->10- 仅当密码长度支持10个字符或更长时应用规则
字符类和特殊符号
John支持丰富的字符类匹配:
?v - 元音字母 (aeiouAEIOU)
?c - 辅音字母
?d - 数字 (0-9)
?l - 小写字母 (a-z)
?u - 大写字母 (A-Z)
?s - 符号 ($%^&*()-_+=|\<>[]{}#@/~)
核心规则命令详解
1. 大小写转换命令
l - 转换为全小写: "Password" → "password"
u - 转换为全大写: "Password" → "PASSWORD"
c - 首字母大写: "password" → "Password"
C - 首字母小写,其余大写: "password" → "pASSWORD"
t - 切换所有字符大小写: "Password" → "pASSWORD"
T3 - 切换位置3的字符大小写: "Password" → "PasSword"
2. 字符串操作命令
r - 反转字符串: "hello" → "olleh"
d - 复制字符串: "hello" → "hellohello"
f - 反射字符串: "hello" → "helloolleh"
{ - 左旋转: "hello" → "elloh"
} - 右旋转: "hello" → "ohell"
$X - 追加字符X: "hello" → "helloX"
^X - 前缀字符X: "hello" → "Xhello"
3. 插入和删除命令
[ - 删除首字符: "hello" → "ello"
] - 删除尾字符: "hello" → "hell"
D2 - 删除位置2的字符: "hello" → "helo"
i3X - 在位置3插入字符X: "hello" → "helXlo"
o3X - 覆盖位置3的字符为X: "hello" → "helXo"
4. 条件判断命令
<5 - 拒绝长度≥5的单词
>8 - 拒绝长度≤8的单词
_12 - 拒绝长度≠12的单词
!a - 如果包含字符a则拒绝
/?d - 除非包含数字否则拒绝
=2X - 除非位置2的字符是X否则拒绝
高级规则功能
变量和数值操作
John支持11个用户变量(a-k)和系统变量:
l - 当前单词长度
m - 最后一个字符位置
z - "无限"位置(超出单词末尾)
v命令用于变量操作:
va23 - 设置变量a = 2 - 3 = -1
vil2 - 设置变量i = 长度 - 2
内存访问命令
M - 记忆当前单词状态
Q - 查询记忆状态,如果未改变则拒绝
X234 - 从记忆的位置2提取3个字符插入到位置4
字符串插入命令
A5"hello" - 在位置5插入字符串"hello"
Az"123" - 在末尾追加"123"
A0"pre" - 在开头插入"pre"
实际规则示例
基础规则示例
# 简单数字追加
$0 $1 $2 $3 $4 $5 $6 $7 $8 $9
# 年份追加
$1 $9 $9 $0
$2 $0 $0 $0
$2 $0 $1 $0
$2 $0 $2 $0
# 常见后缀
$! $@ $# $$
复杂规则示例
# Leet语转换
so0 si1 se3 sa4 ss5 st7
# 智能大小写变换
c $1
c $!
u $2 $0 $2 $1
l $1 $2 $3 $4
# 字符串组合操作
Az"123" r
^A Az"!" c
{ } $1
专业规则集示例
从best64.rule中提取的实用规则:
# 高频字符追加
<* $e
<* $s
# 结尾覆盖
oma Q
] ] $s
] ] $a
] ] $e $r Q
# 开头覆盖
o0d Q
o0m o1a Q
# 长度相关操作
>3 D2
>5 O22
>4 D3
规则预处理机制
John支持规则预处理,可以生成多个规则变体:
# 预处理示例 - 生成数字0-9的追加规则
$[0-9]
# 生成特殊字符追加
$[!@#$%]
# 组合预处理
^[A-Z] $[0-9]
规则性能优化
自定义规则最佳实践
- 针对性设计:根据目标密码策略设计规则
- 性能考虑:避免过于复杂的规则组合
- 测试验证:使用小规模测试验证规则效果
- 逐步优化:基于测试结果不断调整规则
规则调试技巧
使用--stdout选项测试规则效果:
# 测试规则效果
echo "password" | john --stdout --rules=custom_rule
常见规则模式
| 模式类型 | 规则示例 | 效果 |
|---|---|---|
| 数字追加 | $1 $2 $3 | password → password123 |
| 大小写变换 | c $! | password → Password! |
| Leet转换 | so0 se3 | password → p4ssw0rd |
| 年份追加 | $2 $0 $2 $3 | password → password2023 |
| 特殊字符 | $! $@ | password → password!@ |
通过掌握John the Ripper的规则语法,您可以创建高度定制化的密码测试策略,显著提高测试效率和成功率。规则系统的灵活性和强大功能使其成为专业密码审计工作中不可或缺的工具。
插件开发与扩展
John the Ripper 的插件系统是其最强大的特性之一,允许开发者扩展支持新的哈希算法和加密格式。通过插件开发,可以轻松地为 John the Ripper 添加对新出现的密码哈希格式的支持,而无需修改核心代码库。
插件架构概述
John the Ripper 的插件系统基于模块化设计,每个插件都是一个独立的 C 语言源文件,遵循特定的接口规范。插件主要分为以下几种类型:
- 格式插件(Format Plugins):处理特定哈希算法的测试
- 工具插件(Utility Plugins):提供额外的功能支持
- 动态编译器插件(Dynamic Compiler Plugins):支持运行时哈希格式定义
格式插件开发
格式插件是最常见的插件类型,用于支持特定的哈希算法。每个格式插件都需要实现一组标准的函数接口:
// 示例:MD5 格式插件的基本结构
struct fmt_main fmt_MD5 = {
{
FORMAT_LABEL, // 格式标签
FORMAT_NAME, // 格式名称
ALGORITHM_NAME, // 算法名称
BENCHMARK_COMMENT, // 基准测试注释
BENCHMARK_LENGTH, // 基准测试长度
PLAINTEXT_LENGTH, // 明文长度
BINARY_SIZE, // 二进制大小
BINARY_ALIGN, // 二进制对齐
SALT_SIZE, // 盐值大小
SALT_ALIGN, // 盐值对齐
MIN_KEYS_PER_CRYPT, // 每次加密最小密钥数
MAX_KEYS_PER_CRYPT, // 每次加密最大密钥数
FMT_CASE | FMT_8_BIT, // 格式标志
tests // 测试向量
},
// 函数指针
.init = init,
.fmt_detect = fmt_detect,
.fmt_cmp = fmt_cmp,
.fmt_cmp_exact = fmt_cmp_exact,
.fmt_cmp_one = fmt_cmp_one,
.fmt_set_salt = fmt_set_salt,
.fmt_set_key = fmt_set_key,
.fmt_get_hash = fmt_get_hash,
.fmt_crypt_all = fmt_crypt_all
};
动态编译器格式
动态编译器是 John the Ripper 最强大的扩展机制,允许通过配置文件定义新的哈希格式,而无需编写 C 代码。动态格式使用专门的脚本语言来描述哈希计算过程。
动态格式配置示例
[List.Generic:dynamic_1050]
Expression=dynamic_1050: sha256(sha256($p).$s)
Flag=MGF_SALTED
Func=DynamicFunc__clean_input
Func=DynamicFunc__append_keys
Func=DynamicFunc__crypt_sha256
Func=DynamicFunc__clean_input
Func=DynamicFunc__append_from_last_output_as_base16
Func=DynamicFunc__append_salt
Func=DynamicFunc__crypt_sha256
Test=$dynamic_1050$9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08$salt123:testpassword
可用的动态函数
动态格式支持丰富的函数集来处理各种哈希操作:
| 函数名称 | 描述 | 用途 |
|---|---|---|
DynamicFunc__clean_input | 清空输入缓冲区 | 初始化操作 |
DynamicFunc__append_keys | 追加密钥到输入缓冲区 | 处理密码 |
DynamicFunc__append_salt | 追加盐值到输入缓冲区 | 处理盐值 |
DynamicFunc__crypt_md5 | 执行 MD5 哈希计算 | MD5 算法 |
DynamicFunc__crypt_sha1 | 执行 SHA1 哈希计算 | SHA1 算法 |
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



