John the Ripper ile Parola Güvenliği Testi

Şu an her zamankinden daha fazla parola saldırısı görüyoruz. Sistemlerinizin bu saldırılara ne kadar dayanıklı olduğunu öğrenmek istiyorsanız, bunu saldırganlardan önce kendiniz test etmeniz gerekiyor. John the Ripper (JtR), tam da bu iş için yıllardır sysadmin ve pentest dünyasının vazgeçilmezi olmuş bir araç. Ben de bu yazıda gerçek ortamlarda edindiğim deneyimlerle JtR’yi nasıl kullanıyorum, hangi senaryolarda işime yarıyor, anlatmaya çalışacağım.

John the Ripper Nedir, Neden Önemlidir

John the Ripper, açık kaynaklı bir parola kırma aracıdır. Orijinal projesi Openwall tarafından geliştirilen JtR, özellikle hash formatlarını otomatik tanıma yeteneği ve geniş platform desteğiyle öne çıkar. Jumbo versiyonu ise topluluk tarafından genişletilmiş olup yüzlerce farklı hash formatını destekler.

Peki neden bir sistem yöneticisi bu araca ihtiyaç duysun? Cevap basit: Kullanıcılarınızın seçtiği parolaların ne kadar zayıf olduğunu çoğunlukla siz fark etmezsiniz, saldırganlar fark eder. Bir hash dump’ı ele geçiren saldırgan JtR veya hashcat gibi araçları çalıştırdığında, zayıf parolalar dakikalar içinde kırılır. Bunu periyodik olarak kendiniz yaparsanız, hangi kullanıcıların riskli parolalar kullandığını önceden tespit edebilirsiniz.

Önemli Not: Bu araçları yalnızca yetkili olduğunuz sistemlerde ve yasal çerçevede kullanın. İzinsiz sistemlere karşı kullanmak Türkiye’de TCK kapsamında suçtur.

Kurulum

Debian/Ubuntu Tabanlı Sistemler

# Standart depo versiyonu (genellikle eski kalır)
sudo apt update
sudo apt install john

# Jumbo versiyonu için kaynak koddan derleme önerilir
sudo apt install build-essential libssl-dev yasm libgmp-dev libpcap-dev pkg-config libbz2-dev

git clone https://github.com/openwall/john.git
cd john/src
./configure && make -j$(nproc)

RHEL/CentOS/AlmaLinux Tabanlı Sistemler

# EPEL reposundan
sudo dnf install epel-release
sudo dnf install john

# Ya da Jumbo için kaynak koddan derleme
sudo dnf groupinstall "Development Tools"
sudo dnf install openssl-devel gmp-devel libpcap-devel bzip2-devel

git clone https://github.com/openwall/john.git
cd john/src
./configure && make -j$(nproc)

Derleme tamamlandıktan sonra binary ../run/ dizininde olur. Ben genellikle bu dizini PATH’e eklerim ya da /usr/local/bin/ altına symlink atarım.

sudo ln -s /opt/john/run/john /usr/local/bin/john
sudo ln -s /opt/john/run/unshadow /usr/local/bin/unshadow

Temel Kavramlar ve Hash Formatları

JtR ile çalışmadan önce birkaç temel kavramı netleştirmek gerekiyor.

Hash: Parolanın kriptografik özetidir. Sistemler parolaları düz metin olarak saklamaz, hash olarak saklar.

Salt: Hash’e eklenen rastgele değerdir. Aynı parola farklı salt değerleriyle farklı hash üretir, bu da rainbow table saldırılarını zorlaştırır.

Wordlist: Deneme yapılacak parola listesidir. En yaygın kullanılan rockyou.txt‘dir.

Kural (Rule): Wordlist kelimelerini manipüle eden dönüşüm kurallarıdır. Mesela “parola” kelimesinden “Parola1!”, “P@r0l@”, “parola123” gibi varyantlar üretir.

JtR desteklediği başlıca hash formatları:

  • md5crypt: Linux eski /etc/shadow formatı
  • sha512crypt: Modern Linux sistemlerde varsayılan
  • bcrypt: Özellikle web uygulamalarında yaygın
  • NT: Windows NTLM hash
  • md5: Ham MD5, eski web uygulamalarında çok görülür
  • sha1, sha256: Ham SHA varyantları

/etc/shadow Dosyasından Linux Parola Testi

Bu benim en sık kullandığım senaryo. Yeni bir sunucu kuruluyor ya da eski bir sistemi devralıyorsunuz, kullanıcı parolalarının güçlü olup olmadığını kontrol etmek istiyorsunuz.

Linux’ta parolalar /etc/passwd ve /etc/shadow dosyalarına dağılmış durumdadır. unshadow komutu bu iki dosyayı birleştirerek JtR’nin okuyabileceği formata getirir.

# Root yetkisi gereklidir
sudo unshadow /etc/passwd /etc/shadow > /tmp/test_hashes.txt

# Dosyanın içeriğine bakalım
head -5 /tmp/test_hashes.txt

Şimdi JtR’yi çalıştıralım:

# Varsayılan modda çalıştır (önce wordlist, sonra incremental dener)
john /tmp/test_hashes.txt

# Sadece belirli kullanıcıları test etmek için
john --users=ahmet,mehmet /tmp/test_hashes.txt

# Kırılan parolaları görüntüle
john --show /tmp/test_hashes.txt

Çıktı şu şekilde görünür:

ahmet:parola123:1001:1001:...
mehmet:Mehmet2023:1002:1002:...

2 password hashes cracked, 3 left

Bu çıktıyı gördüğünüzde, o kullanıcıları çağırıp parola değiştirmelerini istemeniz gerekir.

Wordlist Saldırısı

Varsayılan moddan çok daha etkili sonuçlar için wordlist kullanmak şarttır. Türkiye’deki kullanıcıların tercihlerine göre özelleştirilmiş listeler kullanmak kırma oranını ciddi artırır.

# Rockyou wordlist ile saldırı
john --wordlist=/usr/share/wordlists/rockyou.txt /tmp/test_hashes.txt

# Türkçe isimler ve yaygın kombinasyonlar içeren özel liste ile
john --wordlist=/opt/wordlists/turkish_common.txt /tmp/test_hashes.txt

# Sadece belirli bir format için
john --format=sha512crypt --wordlist=/usr/share/wordlists/rockyou.txt /tmp/test_hashes.txt

Türkiye özelinde wordlist oluşturmak için şunu yapabilirsiniz:

# Yaygın Türkçe parolaları bir araya getir
cat << 'EOF' > /opt/wordlists/turkish_base.txt
parola
sifre
1234567
istanbul
ankara
turkiye
admin123
qwerty
123456789
EOF

# Crunch ile kombinasyonlar oluştur
# crunch 8 10 -t @@@@1234 >> /opt/wordlists/turkish_base.txt

Kural Tabanlı Saldırı (Rules)

Wordlist’teki kelimeleri olduğu gibi denemek yerine, çeşitli kural setleri uygulayarak varyantlar üretebilirsiniz. Bu, gerçek dünyada kullanıcıların “parola” yerine “P@r0l@1” ya da “Parola!” yazdığı durumları kapsar.

# JtR'nin built-in kural setleri
# Jumbo: Jumbo versiyonuna özgü kapsamlı kurallar
# KoreLogic: Çok güçlü ama yavaş
# best64: Hız/başarı oranı dengesi en iyi

john --wordlist=/usr/share/wordlists/rockyou.txt 
     --rules=best64 
     /tmp/test_hashes.txt

# Tüm kural setlerini arka arkaya uygula
john --wordlist=/usr/share/wordlists/rockyou.txt 
     --rules=All 
     /tmp/test_hashes.txt

Özel kural tanımlamak için john.conf dosyasına ekleme yapabilirsiniz:

# /etc/john/john.conf veya ~/.john/john.conf dosyasını düzenle
# [List.Rules:TurkishRules] bölümü altına:

# Kelimenin başına yıl ekle
Az"[0-9][0-9][0-9][0-9]"

# Sonuna ! veya . ekle
$!
$.

# İlk harfi büyük yap
c

Bu kurallar gerçek hayatta çok işe yarıyor. Özellikle kurumsal ortamlarda “Parola2024!”, “Admin@2023” gibi parolalar alarmı hemen tetikliyor.

Incremental (Kaba Kuvvet) Modu

Wordlist ve kural tabanlı saldırılar yetersiz kaldığında kaba kuvvete geçilir. Bu yöntem çok daha yavaştır ama wordlist’te olmayan parolaları da bulabilir.

# Sadece rakamlardan oluşan parolalar (PIN'ler, basit kombinasyonlar)
john --incremental=Digits /tmp/test_hashes.txt

# Alfanümerik kombinasyonlar
john --incremental=Alnum /tmp/test_hashes.txt

# Tüm ASCII karakterleri (en kapsamlı, en yavaş)
john --incremental=ASCII /tmp/test_hashes.txt

# Minimum ve maksimum uzunluk sınırlaması
john --incremental=ASCII --min-length=6 --max-length=8 /tmp/test_hashes.txt

Incremental modu 8 karakterin üzerinde makul bir sürede sonuç vermez. GPU desteği olmadan modern hash’ler için gerçekçi değil. Bunu özellikle kısa ve basit parolaları yakalamak için kullanıyorum.

Oturum Yönetimi ve Süreç Kontrolü

Uzun süreli testlerde JtR’yi durdurup kaldığı yerden devam ettirebilmek çok önemli. Özellikle gece başlatıp sabah sonuçlara bakmak istediğinizde bu kritik.

# Oturuma isim vererek başlat
john --session=weekly_audit /tmp/test_hashes.txt --wordlist=/usr/share/wordlists/rockyou.txt

# İşlemi CTRL+C ile durdurduktan sonra kaldığı yerden devam et
john --restore=weekly_audit

# Arkaplanda çalıştır
john --session=bg_audit /tmp/test_hashes.txt &

# Çalışan bir JtR process'ine ilerleme durumu göster
kill -USR1 $(pidof john)
# ya da çalışan terminal'de 'q' veya Enter'a basarak anlık durum görürsünüz

# Mevcut kırılmış parolalara çalışırken bak
john --show /tmp/test_hashes.txt

Ben haftalık cron job’larla şu scripti çalıştırıyorum:

#!/bin/bash
# /opt/scripts/weekly_password_audit.sh

HASH_FILE="/tmp/shadow_audit_$(date +%Y%m%d).txt"
RESULT_FILE="/var/log/password_audit_$(date +%Y%m%d).log"
WORDLIST="/usr/share/wordlists/rockyou.txt"

# Hash'leri topla
unshadow /etc/passwd /etc/shadow > "$HASH_FILE"

# Sadece normal kullanıcı hesaplarını filtrele (UID 1000+)
awk -F: '$3 >= 1000 {print}' "$HASH_FILE" > "${HASH_FILE}.users"

# Wordlist + kurallarla test
john --session=weekly 
     --wordlist="$WORDLIST" 
     --rules=best64 
     "${HASH_FILE}.users"

# Sonuçları kaydet
echo "=== Parola Denetim Raporu $(date) ===" > "$RESULT_FILE"
john --show "${HASH_FILE}.users" >> "$RESULT_FILE"

# Zayıf parola bulunanları mail at
CRACKED=$(john --show "${HASH_FILE}.users" | grep -c ":")
if [ "$CRACKED" -gt 0 ]; then
    mail -s "UYARI: $CRACKED zayıf parola tespit edildi" [email protected] < "$RESULT_FILE"
fi

# Temizlik
rm -f "$HASH_FILE" "${HASH_FILE}.users"

Belirli Hash Formatlarıyla Çalışmak

Bazen bir web uygulaması veritabanından hash dump aldınız, ya da bir servisten hash topladınız. Bu durumda formatı manuel belirtmeniz gerekebilir.

# Desteklenen tüm formatları listele
john --list=formats

# Belirli bir formatı test et
# MD5 hash'leri
echo "5f4dcc3b5aa765d61d8327deb882cf99" > /tmp/md5hash.txt
john --format=raw-md5 /tmp/md5hash.txt --wordlist=/usr/share/wordlists/rockyou.txt

# SHA-256 hash
john --format=raw-sha256 /tmp/sha256hashes.txt --wordlist=/usr/share/wordlists/rockyou.txt

# Bcrypt (web uygulamaları için yaygın)
john --format=bcrypt /tmp/bcrypt_hashes.txt --wordlist=/usr/share/wordlists/rockyou.txt

# NTLM (Windows hash dump'larından)
john --format=nt /tmp/ntlm_hashes.txt --wordlist=/usr/share/wordlists/rockyou.txt

# Hash formatını otomatik tespit ettir
john --list=formats | grep -i sha

Bazen JtR hangi formatı kullanacağınızı bilemez ve yanlış tanımlar. Hash formatını şüpheleniyorsanız hash-identifier aracını veya hashid komutunu kullanın:

pip install hashid
hashid '5f4dcc3b5aa765d61d8327deb882cf99'

Çok Çekirdekli CPU Kullanımı

JtR varsayılan olarak tek çekirdek kullanır. Sunucularda bu ciddi bir darboğaz oluşturur.

# Mevcut fork desteği ile çoklu çekirdek
john --fork=8 --wordlist=/usr/share/wordlists/rockyou.txt /tmp/test_hashes.txt

# Kaç çekirdek kullanılabilir?
nproc

# CPU sayısına göre otomatik ayarla
CORES=$(nproc)
john --fork=$CORES --wordlist=/usr/share/wordlists/rockyou.txt /tmp/test_hashes.txt

# MPI desteği ile compile edildiyse (cluster ortamları)
mpirun -n 8 john --wordlist=/usr/share/wordlists/rockyou.txt /tmp/test_hashes.txt

Gerçek Dünya Senaryosu: Şirket Parola Denetimi

Birkaç yıl önce bir finans şirketinin güvenlik denetimine katıldım. 200’den fazla Linux kullanıcısının parolasını test etmemiz gerekiyordu. İşte o süreçte kullandığım yaklaşım:

#!/bin/bash
# Kapsamlı parola denetim scripti

AUDIT_DIR="/opt/security/audit_$(date +%Y%m%d_%H%M)"
mkdir -p "$AUDIT_DIR"

# 1. Hash toplama
sudo unshadow /etc/passwd /etc/shadow > "$AUDIT_DIR/full_hashes.txt"

# 2. Servis hesaplarını hariç tut (UID < 1000)
awk -F: '$3 >= 1000 && $3 < 65534' "$AUDIT_DIR/full_hashes.txt" > "$AUDIT_DIR/user_hashes.txt"

# 3. Hash sayısını kontrol et
TOTAL=$(wc -l < "$AUDIT_DIR/user_hashes.txt")
echo "Toplam test edilecek hesap: $TOTAL"

# 4. Kademeli saldırı - hızlıdan yavaşa
# Aşama 1: Sadece yaygın parolalar (5 dakika)
timeout 300 john --wordlist=/opt/wordlists/top1000.txt 
    "$AUDIT_DIR/user_hashes.txt" 
    --session="$AUDIT_DIR/phase1"

# Aşama 2: Rockyou + kurallar (2 saat)
timeout 7200 john --wordlist=/usr/share/wordlists/rockyou.txt 
    --rules=best64 
    "$AUDIT_DIR/user_hashes.txt" 
    --session="$AUDIT_DIR/phase2"

# 5. Sonuçları raporla
echo "=== ZAYIF PAROLA RAPORU ===" > "$AUDIT_DIR/report.txt"
echo "Tarih: $(date)" >> "$AUDIT_DIR/report.txt"
echo "Toplam hesap: $TOTAL" >> "$AUDIT_DIR/report.txt"
echo "" >> "$AUDIT_DIR/report.txt"

CRACKED=$(john --show "$AUDIT_DIR/user_hashes.txt" | tail -1)
echo "Sonuç: $CRACKED" >> "$AUDIT_DIR/report.txt"
echo "" >> "$AUDIT_DIR/report.txt"

# Sadece kullanıcı adlarını listele (parolalar raporda olmamalı!)
echo "Zayıf parola tespit edilen kullanıcılar:" >> "$AUDIT_DIR/report.txt"
john --show "$AUDIT_DIR/user_hashes.txt" | awk -F: '{print $1}' >> "$AUDIT_DIR/report.txt"

cat "$AUDIT_DIR/report.txt"

O denetimde 200 hesabın 47’sinde zayıf parola bulduk. Yüzde 23,5. Yöneticileri şok eden bir oran. Tüm bu hesaplar için hemen zorunlu parola değişimi tetiklendi ve minimum 12 karakter, karmaşıklık zorunluluğu içeren PAM politikası devreye alındı.

Sonuçların Raporlanması ve Aksiyon Planı

Parolayı kırdınız, peki sonra ne yapacaksınız? Bu aşama en az teknik kısım kadar önemli.

  • Kırılan parolaları asla saklamayın. Raporda sadece hangi kullanıcının zayıf parola kullandığını belirtin, parolanın kendisini değil.
  • Etkilenen kullanıcıları derhal bilgilendirin. IT destek kanalıyla parola sıfırlama isteği açın.
  • PAM politikasını güncelleyin. pam_pwquality veya pam_cracklib modüllerini yapılandırarak gelecekteki zayıf parolaları sisteme girişte engelleyin.
  • Periyodik denetimi otomatize edin. Anlık eylem yetmez, bu düzenli bir süreç olmalı.
  • İki faktörlü kimlik doğrulamayı değerlendirin. Parola ne kadar güçlü olursa olsun, 2FA olmadan yetersiz kalır.
# PAM ile minimum parola politikası örneği
# /etc/security/pwquality.conf
# minlen = 12
# dcredit = -1
# ucredit = -1
# lcredit = -1
# ocredit = -1
# maxrepeat = 3

sudo sed -i 's/# minlen = 8/minlen = 12/' /etc/security/pwquality.conf
sudo sed -i 's/# dcredit = 0/dcredit = -1/' /etc/security/pwquality.conf
sudo sed -i 's/# ucredit = 0/ucredit = -1/' /etc/security/pwquality.conf

Sonuç

John the Ripper, defensif güvenliğin en değerli araçlarından biri. Ama bir araç olarak değil, bir düşünce biçiminin parçası olarak kullanılmalı. “Saldırgan gibi düşün, savunmacı gibi davran” klişe ama doğru.

Deneyimlerime göre kurumların büyük çoğunluğu parola politikası tanımlamış ama hiç test etmemiş durumdadır. Kağıt üstünde “minimum 8 karakter, büyük harf, rakam zorunlu” yazıyor; ama sistem yöneticileri yıllarca bu politikanın uygulanıp uygulanmadığını kontrol etmemişler.

JtR’yi ayda bir çalıştırın. Sonuçları belgelendirin. Zayıf parola bulunan kullanıcılarla sistematik biçimde ilgilenin. Ve en önemlisi, bu bulguları bir ceza mekanizması olarak değil, bir güvenlik iyileştirme fırsatı olarak sunun. Kullanıcılar tehdidin farkında olmadan güçlü parola seçmez.

Güvenlik bir ürün değil, süreçtir. John the Ripper de o sürecin rutin ama kritik bir adımıdır.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir