John the Ripper Cheat Sheet
Überblick
John the Ripper ist eines der leistungsfähigsten und vielseitigsten Passwort-Cracking-Tools zur Verfügung, entwickelt, um schwache Passwörter zu erkennen und umfassende Passwort-Sicherheits-Auditing über mehrere Plattformen und Hash-Formate durchzuführen. Ursprünglich von Solar Designer entwickelt, John the Ripper hat sich zu einer ausgeklügelten Passwort-Recovery-und Sicherheitstest-Plattform entwickelt, die Hunderte von Hash-und Chiffre-Typen unterstützt, so dass es ein wesentliches Werkzeug für Sicherheitsexperten, Penetration Tester und Systemadministratoren, die Passwort-Richtlinien-Bewertungen durchführen. Die modulare Architektur und die umfangreichen Anpassungsfähigkeiten des Tools ermöglichen sowohl eine automatisierte Passwortprüfung als auch erweiterte manuelle Passwortwiederherstellung.
Die Kernkraft von John the Ripper liegt in seinem umfassenden Ansatz zur Passwort-Cracking, kombiniert mehrere Angriffsmodi einschließlich Wörterbuch-Angriffe, brutale Kraftangriffe, Hybridangriffe und erweiterte regelbasierte Transformationen. Das intelligente Passwort-Kandidat-Generierungssystem des Tools kann Passwort-Räume effizient mithilfe von Wortlisten, Zeichensätzen und ausgeklügelten Mutationsregeln erkunden, die gemeinsame Passwort-Erstellungsmuster simulieren. Johns Multi-Format-Unterstützung umfasst traditionelle Unix-Krypt-Formate, moderne Bcrypt- und Scrypt-Hasen, Windows NTLM hashes, anwendungsspezifische Formate und verschlüsselte Dateiformate, so dass es für verschiedene Passwort-Recovery-Szenarien über verschiedene Systeme und Anwendungen geeignet.
John the Ripper's erweiterte Funktionen umfassen verteilte Computing-Unterstützung für großformatige Passwort-Recovery-Operationen, GPU-Beschleunigung für Hochleistungs-Cracking, benutzerdefinierte Regelentwicklung für gezielte Angriffe und umfassende Session-Management für langfristige Operationen. Die erweiterte Plug-in-Architektur des Tools ermöglicht benutzerdefinierte Hash-Format-Unterstützung und spezialisierte Angriffs-Implementierungen, während seine detaillierten Fortschrittsberichte und Statistiken Einblicke in Kennwortstärke Muster und Sicherheitspolitik Wirksamkeit bieten. Mit seiner aktiven Entwicklungsgemeinschaft, regelmäßigen Updates und bewährten Erfolgsbilanzen bei Sicherheitsbewertungen bleibt John the Ripper der Goldstandard für Passwortsicherheitstests und ein unverzichtbarer Bestandteil eines umfassenden Sicherheitstoolkits.
Installation
Ubuntu/Debian Installation
Installation von John the Ripper auf Ubuntu/Debian Systemen:
```bash
Update system packages
sudo apt update && sudo apt upgrade -y
Install John the Ripper from repositories
sudo apt install -y john
Install additional tools and dependencies
sudo apt install -y john-data hashcat-utils
Verify installation
john --version john --list=formats|head -20
Install development version (Jumbo)
sudo apt install -y git build-essential libssl-dev zlib1g-dev \ yasm libgmp-dev libpcap-dev pkg-config libbz2-dev
Clone and build John the Ripper Jumbo
cd /opt sudo git clone https://github.com/openwall/john.git cd john/src sudo ./configure sudo make -j$(nproc)
Create symlinks for system-wide access
sudo ln -sf /opt/john/run/john /usr/local/bin/john sudo ln -sf /opt/john/run/john /usr/local/bin/john-jumbo
Verify Jumbo installation
john --version john --list=formats|wc -l ```_
CentOS/RHEL Installation
```bash
Install EPEL repository
sudo yum install -y epel-release
Install John the Ripper
sudo yum install -y john
Install development tools for Jumbo version
sudo yum groupinstall -y "Development Tools" sudo yum install -y openssl-devel zlib-devel gmp-devel libpcap-devel \ bzip2-devel git
Build John the Ripper Jumbo
cd /opt sudo git clone https://github.com/openwall/john.git cd john/src sudo ./configure sudo make -j$(nproc)
Install system-wide
sudo make install
Alternative: Install from source with optimizations
sudo ./configure --enable-simd=avx2 --enable-openmp sudo make -j$(nproc) ```_
macOS Installation
```bash
Install using Homebrew
brew install john
Install Jumbo version
brew install john-jumbo
Alternative: Build from source
brew install openssl gmp libpcap git clone https://github.com/openwall/john.git cd john/src ./configure --with-openssl=$(brew --prefix openssl) make -j$(sysctl -n hw.ncpu)
Verify installation
john --version ```_
Windows Installation
```bash
Download pre-compiled binaries
https://www.openwall.com/john/
Extract to desired location
Example: C:\john
Add to PATH environment variable
System Properties > Environment Variables
Add C:\john\run to PATH
Verify installation
john.exe --version
Alternative: Build with Cygwin
Install Cygwin with development tools
Follow Unix build instructions
```_
Docker Installation
John the Ripper in Docker:
```bash
Create Dockerfile for John the Ripper
cat > Dockerfile.john << 'EOF' FROM ubuntu:22.04
Install dependencies
RUN apt-get update && apt-get install -y \ git \ build-essential \ libssl-dev \ zlib1g-dev \ yasm \ libgmp-dev \ libpcap-dev \ pkg-config \ libbz2-dev \ && rm -rf /var/lib/apt/lists/*
Clone and build John the Ripper Jumbo
RUN git clone https://github.com/openwall/john.git /opt/john WORKDIR /opt/john/src RUN ./configure && make -j$(nproc)
Create working directory
WORKDIR /work
Set PATH
ENV PATH="/opt/john/run:$\\{PATH\\}"
CMD ["john", "--help"] EOF
Build Docker image
docker build -f Dockerfile.john -t john-the-ripper .
Run John the Ripper in Docker
docker run -it --rm \ -v $(pwd):/work \ john-the-ripper john --version
Run with GPU support (NVIDIA)
docker run --gpus all -it --rm \ -v $(pwd):/work \ john-the-ripper john --list=opencl-devices ```_
Basisnutzung
Hashextraktion
Auszüge aus verschiedenen Quellen:
```bash
Extract hashes from /etc/passwd and /etc/shadow
sudo unshadow /etc/passwd /etc/shadow > hashes.txt
Extract Windows hashes from SAM
Use tools like pwdump, fgdump, or Metasploit
Example output format: username:RID:LM_hash:NTLM_hash:::
Extract hashes from various file formats
ZIP files
zip2john encrypted.zip > zip_hashes.txt
RAR files
rar2john encrypted.rar > rar_hashes.txt
PDF files
pdf2john encrypted.pdf > pdf_hashes.txt
SSH private keys
ssh2john id_rsa > ssh_hashes.txt
Office documents
office2john document.docx > office_hashes.txt
7-Zip files
7z2john encrypted.7z > 7z_hashes.txt
TrueCrypt/VeraCrypt volumes
truecrypt2john encrypted.tc > tc_hashes.txt
Bitcoin wallets
bitcoin2john wallet.dat > bitcoin_hashes.txt
Verify hash format
john --list=formats|grep -i ntlm john --list=formats|grep -i md5 ```_
Basic Cracking
Führen Sie grundlegende Passwort-Cracking:
```bash
Simple dictionary attack
john --wordlist=/usr/share/wordlists/rockyou.txt hashes.txt
Crack specific hash format
john --format=NT hashes.txt john --format=md5crypt hashes.txt john --format=bcrypt hashes.txt
Show cracked passwords
john --show hashes.txt
Show cracked passwords with specific format
john --show --format=NT hashes.txt
Resume interrupted session
john --restore
Crack with time limit
timeout 3600 john --wordlist=wordlist.txt hashes.txt
Crack single hash
echo "user:$1$salt$hash"|john --stdin --format=md5crypt
Incremental mode (brute force)
john --incremental hashes.txt
Incremental with specific charset
john --incremental=alpha hashes.txt john --incremental=digits hashes.txt john --incremental=alnum hashes.txt
Custom incremental mode
john --incremental=custom --min-length=6 --max-length=8 hashes.txt ```_
Wordlist Angriffe
Erweiterte Wortlisten-basierte Angriffe:
```bash
Basic wordlist attack
john --wordlist=rockyou.txt hashes.txt
Multiple wordlists
john --wordlist=wordlist1.txt,wordlist2.txt,wordlist3.txt hashes.txt
Wordlist with rules
john --wordlist=rockyou.txt --rules hashes.txt
Specific rule set
john --wordlist=rockyou.txt --rules=best64 hashes.txt john --wordlist=rockyou.txt --rules=wordlist hashes.txt
Custom rules
john --wordlist=rockyou.txt --rules=custom hashes.txt
Pipe wordlist from stdin
cat wordlist.txt|john --stdin hashes.txt
Generate wordlist variations
john --wordlist=base.txt --stdout --rules=best64 > expanded.txt
Mask attack (hybrid)
john --mask=?l?l?l?l?d?d?d?d hashes.txt
Mask with wordlist
john --wordlist=names.txt --mask=?w?d?d?d?d hashes.txt
External mode (custom algorithms)
john --external=double hashes.txt ```_
Erweiterte Funktionen
Regelbasierte Angriffe
Erstellen und Verwenden von benutzerdefinierten Regeln:
```bash
View available rules
john --list=rules
Create custom rule file
cat > custom.rule ``<< 'EOF'
Append numbers
$0 $1 $2 $3 $4 $5 $6 $7 $8 $9
Prepend numbers
^0 ^1 ^2 ^3 ^4 ^5 ^6 ^7 ^8 ^9
Capitalize first letter
c
Toggle case
t
Duplicate word
d
Reverse word
r
Leetspeak substitutions
sa@ se3 si1 so0 ss$ st7
Common substitutions
| sa4 se3 si! so0 su | _ | |
Append common suffixes
$! $@ $# $ $% $1 $2 $3 $01 $02 $03 $123
Prepend common prefixes
^! ^@ ^# ^$ ^% ^1 ^2 ^3
Complex rules
c $1 $2 $3 c $! $@ c $2 $0 $1 $9 EOF
Use custom rules
john --wordlist=wordlist.txt --rules=custom hashes.txt
Test rules without cracking
john --wordlist=test.txt --rules=custom --stdout
Rule debugging
john --wordlist=test.txt --rules=custom --stdout|head -20
Combine multiple rule sets
john --wordlist=wordlist.txt --rules=best64,custom hashes.txt ```_
Sitzungsmanagement
Langlaufende Sitzungen verwalten:
```bash
Start named session
john --session=mysession --wordlist=rockyou.txt hashes.txt
Resume named session
john --restore=mysession
List active sessions
john --list=sessions
Session status
john --status=mysession
Abort session
john --abort=mysession
Session configuration
cat >`` john.conf << 'EOF' [Options]
Session save interval (seconds)
Save = 600
Idle time before session save
Idle = 1800
Beep when password found
Beep = Y
Log file
LogFile = john.log EOF
Use custom configuration
john --config=john.conf --wordlist=wordlist.txt hashes.txt ```_
Leistungsoptimierung
Optimierung von John der Ripper-Leistung:
```bash
Multi-core processing
john --fork=4 --wordlist=rockyou.txt hashes.txt
OpenMP support (if compiled)
export OMP_NUM_THREADS=8 john --wordlist=rockyou.txt hashes.txt
GPU acceleration (OpenCL)
john --list=opencl-devices john --format=ntlm-opencl --wordlist=rockyou.txt hashes.txt
CUDA support
john --format=ntlm-cuda --wordlist=rockyou.txt hashes.txt
Memory optimization
john --mem-file-size=1024 --wordlist=rockyou.txt hashes.txt
Benchmark different formats
john --test john --test=60 # 60-second benchmark
Format-specific benchmark
john --test --format=md5crypt john --test --format=bcrypt
Node-specific optimization
john --node=1/4 --wordlist=rockyou.txt hashes.txt # Node 1 of 4 john --node=2/4 --wordlist=rockyou.txt hashes.txt # Node 2 of 4
Priority settings
nice -n 19 john --wordlist=rockyou.txt hashes.txt ```_
Verteilte Cracking
Einrichten von verteilten Passwort-Cracking:
```bash
Split wordlist for distribution
split -l 1000000 rockyou.txt wordlist_part_
Distribute across multiple machines
Machine 1:
john --node=1/4 --wordlist=rockyou.txt hashes.txt
Machine 2:
john --node=2/4 --wordlist=rockyou.txt hashes.txt
Machine 3:
john --node=3/4 --wordlist=rockyou.txt hashes.txt
Machine 4:
john --node=4/4 --wordlist=rockyou.txt hashes.txt
Combine results
john --show hashes.txt > results_machine1.txt
Copy results from all machines and combine
Network-based distribution script
cat > distribute_john.sh ``<< 'EOF'
!/bin/bash
HOSTS=("server1" "server2" "server3" "server4") WORDLIST="rockyou.txt" HASHES="hashes.txt" TOTAL_NODES=$\{#HOSTS[@]\}
for i in "$\{!HOSTS[@]\}"; do NODE=$((i + 1)) HOST="$\{HOSTS[$i]\}"
echo "Starting node $NODE on $HOST"
ssh $HOST "john --node=$NODE/$TOTAL_NODES --wordlist=$WORDLIST $HASHES" &
done
wait echo "All nodes completed" EOF
chmod +x distribute_john.sh ./distribute_john.sh ```_
Automatisierungsskripte
Umfassendes Passwort Audit Script
```python
!/usr/bin/env python3
Comprehensive password audit using John the Ripper
import subprocess import os import sys import time import json import argparse from datetime import datetime import threading import queue
class JohnTheRipperAuditor: def init(self, john_path="john"): self.john_path = john_path self.results = \{\} self.sessions = \{\}
def verify_john_installation(self):
"""Verify John the Ripper installation"""
try:
result = subprocess.run([self.john_path, "--version"],
capture_output=True, text=True)
if result.returncode == 0:
print(f"John the Ripper version: \\\{result.stdout.strip()\\\}")
return True
else:
print("John the Ripper not found or not working")
return False
except Exception as e:
print(f"Error checking John installation: \\\{e\\\}")
return False
def list_supported_formats(self):
"""List supported hash formats"""
try:
result = subprocess.run([self.john_path, "--list=formats"],
capture_output=True, text=True)
if result.returncode == 0:
formats = result.stdout.strip().split('\n')
return [f.strip() for f in formats if f.strip()]
return []
except Exception as e:
print(f"Error listing formats: \\\{e\\\}")
return []
def extract_hashes(self, source_type, source_path, output_file):
"""Extract hashes from various sources"""
extractors = \\\{
'zip': 'zip2john',
'rar': 'rar2john',
'pdf': 'pdf2john',
'ssh': 'ssh2john',
'office': 'office2john',
'7z': '7z2john',
'truecrypt': 'truecrypt2john',
'bitcoin': 'bitcoin2john'
\\\}
if source_type not in extractors:
print(f"Unsupported source type: \\\{source_type\\\}")
return False
extractor = extractors[source_type]
try:
with open(output_file, 'w') as f:
result = subprocess.run([extractor, source_path],
stdout=f, stderr=subprocess.PIPE, text=True)
if result.returncode == 0:
print(f"Hashes extracted to: \\\{output_file\\\}")
return True
else:
print(f"Hash extraction failed: \\\{result.stderr\\\}")
return False
except Exception as e:
print(f"Error extracting hashes: \\\{e\\\}")
return False
def crack_passwords(self, hash_file, attack_config):
"""Crack passwords with specified configuration"""
session_name = f"audit_\\\{int(time.time())\\\}"
cmd = [self.john_path, "--session=" + session_name]
# Add format if specified
if attack_config.get('format'):
cmd.extend(["--format=" + attack_config['format']])
# Add attack mode
if attack_config.get('mode') == 'wordlist':
if attack_config.get('wordlist'):
cmd.extend(["--wordlist=" + attack_config['wordlist']])
if attack_config.get('rules'):
cmd.extend(["--rules=" + attack_config['rules']])
elif attack_config.get('mode') == 'incremental':
cmd.extend(["--incremental"])
if attack_config.get('charset'):
cmd.extend(["--incremental=" + attack_config['charset']])
elif attack_config.get('mode') == 'mask':
if attack_config.get('mask'):
cmd.extend(["--mask=" + attack_config['mask']])
# Add performance options
if attack_config.get('fork'):
cmd.extend(["--fork=" + str(attack_config['fork'])])
# Add hash file
cmd.append(hash_file)
print(f"Starting password cracking: \\\{' '.join(cmd)\\\}")
try:
# Start cracking process
process = subprocess.Popen(cmd, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, text=True)
self.sessions[session_name] = \\\{
'process': process,
'start_time': time.time(),
'config': attack_config
\\\}
return session_name
except Exception as e:
print(f"Error starting crack: \\\{e\\\}")
return None
def monitor_session(self, session_name, timeout=None):
"""Monitor cracking session"""
if session_name not in self.sessions:
print(f"Session \\\{session_name\\\} not found")
return None
session = self.sessions[session_name]
process = session['process']
start_time = session['start_time']
try:
if timeout:
stdout, stderr = process.communicate(timeout=timeout)
else:
stdout, stderr = process.communicate()
end_time = time.time()
duration = end_time - start_time
result = \\\{
'session': session_name,
'duration': duration,
'returncode': process.returncode,
'stdout': stdout,
'stderr': stderr
\\\}
return result
except subprocess.TimeoutExpired:
print(f"Session \\\{session_name\\\} timed out")
process.kill()
return None
except Exception as e:
print(f"Error monitoring session: \\\{e\\\}")
return None
def get_cracked_passwords(self, hash_file, format_type=None):
"""Retrieve cracked passwords"""
cmd = [self.john_path, "--show"]
if format_type:
cmd.extend(["--format=" + format_type])
cmd.append(hash_file)
try:
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode == 0:
lines = result.stdout.strip().split('\n')
cracked = []
for line in lines:
if ':' in line and not line.startswith('0 password'):
parts = line.split(':')
if len(parts) >``= 2:
cracked.append(\\\\{
'username': parts[0],
'password': parts[1],
'full_line': line
\\\\})
return cracked
else:
print(f"Error getting cracked passwords: \\\\{result.stderr\\\\}")
return []
except Exception as e:
print(f"Error retrieving passwords: \\\\{e\\\\}")
return []
def analyze_password_patterns(self, cracked_passwords):
"""Analyze password patterns and weaknesses"""
analysis = \\\\{
'total_cracked': len(cracked_passwords),
'length_distribution': \\\\{\\\\},
'character_sets': \\\\{
'lowercase_only': 0,
'uppercase_only': 0,
'digits_only': 0,
'mixed_case': 0,
'with_digits': 0,
'with_symbols': 0
\\\\},
'common_patterns': \\\\{
'dictionary_words': 0,
'keyboard_patterns': 0,
'date_patterns': 0,
'name_patterns': 0
\\\\},
'weak_passwords': []
\\\\}
import re
for entry in cracked_passwords:
password = entry['password']
length = len(password)
# Length distribution
if length not in analysis['length_distribution']:
analysis['length_distribution'][length] = 0
analysis['length_distribution'][length] += 1
# Character set analysis
has_lower = bool(re.search(r'[a-z]', password))
has_upper = bool(re.search(r'[A-Z]', password))
has_digit = bool(re.search(r'[0-9]', password))
has_symbol = bool(re.search(r'[^a-zA-Z0-9]', password))
if password.islower():
analysis['character_sets']['lowercase_only'] += 1
elif password.isupper():
analysis['character_sets']['uppercase_only'] += 1
elif password.isdigit():
analysis['character_sets']['digits_only'] += 1
elif has_lower and has_upper:
analysis['character_sets']['mixed_case'] += 1
if has_digit:
analysis['character_sets']['with_digits'] += 1
if has_symbol:
analysis['character_sets']['with_symbols'] += 1
# Pattern analysis
| if re.search(r'(password | admin | user | test | guest)', password.lower()): | analysis['common_patterns']['dictionary_words'] += 1
| if re.search(r'(qwerty | asdf | zxcv | 1234)', password.lower()): | analysis['common_patterns']['keyboard_patterns'] += 1
if re.search(r'(19|20)\d\\\\{2\\\\}', password):
analysis['common_patterns']['date_patterns'] += 1
# Weak password identification
if (length < 8 or
password.lower() in ['password', '123456', 'admin', 'user'] or
password.isdigit() or
password.islower()):
analysis['weak_passwords'].append(entry)
return analysis
def generate_report(self, audit_results, output_file="password_audit_report.html"):
"""Generate comprehensive audit report"""
html_content = f"""
Password Security Audit Report
Generated: \\\\{datetime.now().isoformat()\\\\}
Executive Summary
- Total Passwords Analyzed: \\\\{audit_results.get('total_analyzed', 0)\\\\}
- Passwords Cracked: \\\\{audit_results.get('total_cracked', 0)\\\\}
- Crack Rate: \\\\{(audit_results.get('total_cracked', 0) / max(audit_results.get('total_analyzed', 1), 1) * 100):.2f\\\\}%
- Weak Passwords: \\\\{len(audit_results.get('weak_passwords', []))\\\\}
Critical Findings
Weak Passwords
Username | Password | Weakness |
---|---|---|
\\\\{weak['username']\\\\} | \\\\{weak['password']\\\\} | \\\\{weakness\\\\} |
Password Length Distribution
Length | Count | Percentage |
---|---|---|
\\\\{length\\\\} | \\\\{count\\\\} | \\\\{percentage:.2f\\\\}% |
Character Set Analysis
Character Set | Count | Percentage |
---|---|---|
\\\\{char_set.replace('_', ' ').title()\\\\} | \\\\{count\\\\} | \\\\{percentage:.2f\\\\}% |
Recommendations
- Implement minimum password length of 12 characters
- Require mixed case, numbers, and symbols
- Prohibit common dictionary words and patterns
- Implement account lockout policies
- Enable multi-factor authentication
- Regular password audits and user education
"""
with open(output_file, 'w') as f:
f.write(html_content)
print(f"Report generated: \\\\{output_file\\\\}")
return output_file
def run_comprehensive_audit(self, hash_file, wordlists, output_dir="/tmp/john_audit"):
"""Run comprehensive password audit"""
print("Starting comprehensive password audit...")
# Create output directory
os.makedirs(output_dir, exist_ok=True)
audit_results = \\\\{
'start_time': time.time(),
'hash_file': hash_file,
'wordlists': wordlists,
'sessions': [],
'total_analyzed': 0,
'total_cracked': 0
\\\\}
# Count total hashes
try:
with open(hash_file, 'r') as f:
audit_results['total_analyzed'] = len(f.readlines())
except Exception as e:
print(f"Error reading hash file: \\\\{e\\\\}")
return None
# Run multiple attack modes
attack_configs = [
\\\\{
'name': 'Quick Dictionary',
'mode': 'wordlist',
'wordlist': wordlists[0] if wordlists else '/usr/share/wordlists/rockyou.txt',
'rules': 'best64',
'timeout': 1800 # 30 minutes
\\\\},
\\\\{
'name': 'Extended Dictionary',
'mode': 'wordlist',
'wordlist': wordlists[0] if wordlists else '/usr/share/wordlists/rockyou.txt',
'rules': 'wordlist',
'timeout': 3600 # 1 hour
\\\\},
\\\\{
'name': 'Incremental Alpha',
'mode': 'incremental',
'charset': 'alpha',
'timeout': 1800 # 30 minutes
\\\\}
]
# Execute attacks
for config in attack_configs:
print(f"Running \\\\{config['name']\\\\} attack...")
session_name = self.crack_passwords(hash_file, config)
if session_name:
result = self.monitor_session(session_name, config.get('timeout'))
if result:
audit_results['sessions'].append(result)
# Get final results
cracked_passwords = self.get_cracked_passwords(hash_file)
audit_results['total_cracked'] = len(cracked_passwords)
# Analyze patterns
if cracked_passwords:
pattern_analysis = self.analyze_password_patterns(cracked_passwords)
audit_results.update(pattern_analysis)
# Generate report
report_file = os.path.join(output_dir, "password_audit_report.html")
self.generate_report(audit_results, report_file)
audit_results['end_time'] = time.time()
audit_results['duration'] = audit_results['end_time'] - audit_results['start_time']
print(f"Audit completed in \\\\{audit_results['duration']:.2f\\\\} seconds")
print(f"Cracked \\\\{audit_results['total_cracked']\\\\} of \\\\{audit_results['total_analyzed']\\\\} passwords")
return audit_results
def main(): parser = argparse.ArgumentParser(description='John the Ripper Password Audit') parser.add_argument('--hash-file', required=True, help='Hash file to crack') parser.add_argument('--wordlists', nargs='+', help='Wordlist files') parser.add_argument('--format', help='Hash format') parser.add_argument('--output', default='/tmp/john_audit', help='Output directory') parser.add_argument('--john-path', default='john', help='Path to John executable')
args = parser.parse_args()
# Initialize auditor
auditor = JohnTheRipperAuditor(args.john_path)
# Verify installation
if not auditor.verify_john_installation():
print("John the Ripper not properly installed")
sys.exit(1)
# Run audit
results = auditor.run_comprehensive_audit(
args.hash_file,
args.wordlists or [],
args.output
)
if results:
print("Password audit completed successfully")
else:
print("Password audit failed")
sys.exit(1)
if name == "main": main() ```_
Integrationsbeispiele
SIEM Integration
```bash
!/bin/bash
John the Ripper SIEM integration script
Configuration
HASH_DIR="/var/log/password_hashes" WORDLIST="/usr/share/wordlists/rockyou.txt" SPLUNK_HEC_URL="https://splunk.company.com:8088/services/collector/event" SPLUNK_TOKEN="your-hec-token" ELASTICSEARCH_URL="http://elasticsearch.company.com:9200"
Function to send events to Splunk
send_to_splunk() \\{ local event_data="$1"
curl -k -X POST "$SPLUNK_HEC_URL" \
-H "Authorization: Splunk $SPLUNK_TOKEN" \
-H "Content-Type: application/json" \
-d "$event_data"
\\}
Function to audit passwords and send results
audit_and_report() \\{ local hash_file="$1" local timestamp=$(date +%Y%m%d_%H%M%S) local session_name="audit_$timestamp"
echo "Starting password audit: $hash_file"
# Start John the Ripper
john --session=$session_name --wordlist=$WORDLIST --rules=best64 $hash_file &
JOHN_PID=$!
# Monitor for 30 minutes
sleep 1800
# Stop John if still running
if kill -0 $JOHN_PID 2>/dev/null; then
kill $JOHN_PID
fi
# Get results
cracked_passwords=$(john --show $hash_file)
# Parse results and send to SIEM
echo "$cracked_passwords"|while IFS=':' read -r username password rest; do
if [ -n "$username" ] && [ -n "$password" ]; then
event_json=$(cat << EOF
\\{ "time": "$(date -Iseconds)", "source": "john_the_ripper", "sourcetype": "password_audit", "event": \\{ "timestamp": "$(date -Iseconds)", "username": "$username", "password_cracked": true, "password_length": $\\{#password\\}, "hash_file": "$hash_file", "session": "$session_name", "event_type": "weak_password_detected" \\} \\} EOF )
send_to_splunk "$event_json"
fi
done
echo "Password audit completed: $hash_file"
\\}
Monitor hash directory for new files
inotifywait -m -e create -e moved_to "$HASH_DIR"| while read path action file; do if [[ "$file" == *.txt ]]; then audit_and_report "$path$file" fi done ```_
Fehlerbehebung
Gemeinsame Themen
Permissionsfragen: ```bash
Ensure proper permissions for hash files
chmod 600 hashes.txt
Run with appropriate privileges
sudo john --wordlist=rockyou.txt hashes.txt
Check file ownership
ls -la hashes.txt chown user:user hashes.txt ```_
Memory Issues: ```bash
Reduce memory usage
john --mem-file-size=100 --wordlist=wordlist.txt hashes.txt
Use external mode for large wordlists
john --external=wordlist --wordlist=huge_wordlist.txt hashes.txt
Split large hash files
split -l 1000 large_hashes.txt hash_part_ ```_
Leistungsfragen: ```bash
Check system resources
top htop free -h
Optimize for CPU
john --fork=$(nproc) --wordlist=wordlist.txt hashes.txt
Use GPU acceleration
john --list=opencl-devices john --format=ntlm-opencl --wordlist=wordlist.txt hashes.txt
Benchmark performance
john --test=60 ```_
Leistungsoptimierung
Optimierung von John der Ripper-Leistung:
```bash
CPU Optimization
export OMP_NUM_THREADS=$(nproc) john --fork=$(nproc) --wordlist=wordlist.txt hashes.txt
Memory Optimization
john --mem-file-size=1024 --wordlist=wordlist.txt hashes.txt
I/O Optimization
Use SSD for wordlists and hash files
Preload wordlists into memory
cat wordlist.txt > /dev/null
GPU Optimization
john --list=opencl-devices john --format=ntlm-opencl --wordlist=wordlist.txt hashes.txt
Network Optimization for distributed cracking
john --node=1/4 --wordlist=wordlist.txt hashes.txt ```_
Sicherheitsüberlegungen
Operationelle Sicherheit
Datenschutz: - Verschlüsseln von Hash-Dateien und geknackten Passwort-Datenbanken - Ergänzen Sie sichere Datensicherungsrichtlinien für Kennwortprüfungsergebnisse - Zugriff auf Passwort-Cracking-Tools und Ergebnisse steuern - Sichere Übertragung von Hash-Dateien und Audit-Berichten - Regelmäßige Reinigung von temporären Dateien und Sitzungsdaten
Rechtliche und ethische Überlegungen: - Nur Crack-Passwörter, die Sie besitzen oder haben ausdrückliche Erlaubnis zu testen - Rechtsanforderungen für Passwort-Sicherheitstests verstehen - Durchführung richtiger Datenverarbeitungsverfahren für sensible Informationen - Respektieren Sie Privatsphäre und Vertraulichkeit von Benutzerinformationen - Dokumente Passwörter Auditing Aktivitäten für Compliance Zwecke
Passwort vergessen?
Audit Best Practices: - Regelmäßige Kennwortstärkebewertungen - Umsetzung starker Passwortrichtlinien - Benutzerschulung auf Passwortsicherheit - Bereitstellung von Multi-Faktor-Authentifizierung - Begleitung von Kompromissen
Referenzen
- John the Ripper Official Documentation
- (John the Ripper Jumbo)(LINK_5)
- Passwort Cracking Techniques
- Hash Formats Referenz
- Password Security Best Practices