Subdomain Envanteri: Unuttuğunuz Saldırı Yüzeyini Nasıl Bulursunuz?
Ortalama bir kurumun aktif altyapısı 30-50 subdomain — gerçekte DNS'te kayıtlı sayısı 200-500. Aradaki 400 fark saldırı yüzeyiniz. Pasif keşif teknikleri, hangi araç ne döker, prod'da nasıl uygulanır.
Bir Aegis müşterimiz daha geçen ay "biz 12 subdomain'iz" dedi — taradık, 187 tane bulduk. 7 tanesi sertifikası süresi geçmiş, 3 tanesi dangling CNAME (takeover'a açık), 1 tanesi 2 yıl önce kapatılmış ama hala canlı bir Heroku app'i içeriyordu. Çoğu kurumda durum buna benzer.
Bu yazıda subdomain envanteri çıkarmanın 4 pasif yöntemini ve hangi araçların ne döktüğünü paylaşıyorum.
Neden bu kadar fazla subdomain var?
- Eski geliştirici/ajans: "kampanya2019.sirket.com" — kimsenin haberi yok, hala canlı
- SaaS subdomain'leri: Mailchimp, Hubspot, Zendesk, vb. CNAME ile bağlanır
- CDN edge node'ları: CloudFront, Fastly otomatik subdomain açar
- Test/staging ortamları: "dev-api.sirket.com", "staging.sirket.com"
- Mobil app backend: "api-mobile.sirket.com" — IOS+Android bunu kullanır
- E-posta servisleri: SendGrid, Mailgun custom domain ile entegre
1. Sertifika Şeffaflığı (CT Logs) — En güçlü kaynak
Letsencrypt, DigiCert ve diğer CA'lar her sertifika veriliyor public log'a düşürür. crt.sh + censys.io oradan okur.
$ curl -s "https://crt.sh/?q=%25.sirket.com&output=json" | jq -r '.[].name_value' | sort -u *.sirket.com api.sirket.com api-mobile.sirket.com campaign2019.sirket.com dev.sirket.com mail.sirket.com staging-eski.sirket.com ...
Bu tek komut çoğu kurumda 100-300 satır döker — büyük kısmı şirketin İT ekibinin haberi olmayan altyapı.
2. DNS brute-force (subfinder + sözlük)
CT log'larda olmayan ama yaygın subdomain isimleri (admin, dev, test, vpn, mail, ftp) için DNS'e doğrudan sormak. Projectdiscovery'nin subfinder + amass aracı çoklu kaynaktan toplar:
$ subfinder -d sirket.com -all -silent $ amass enum -d sirket.com -passive
3. Search engine + GitHub kodu
Google dork: site:*.sirket.com. Genelde indekslenmiş statik içerikten 50-100 tane döker. GitHub'da open-source kod commit'lerinde de hardcoded subdomain'ler bulunur:
$ gh search code "api.sirket.com" --extension=js --extension=py
4. WAF/CDN reverse lookup
Eğer kurum Cloudflare/Akamai arkasındaysa, eski A kaydı geçmişi SecurityTrails veya DNSDumpster'dan görünür. Origin IP buradan sızabilir → WAF bypass riski.
Bulduktan sonra — Aktif probe
200+ subdomain listesi elinizde. Sonraki adım her birinin hala canlı olup olmadığını + ne çalıştırdığını öğrenmek:
$ cat subs.txt | httpx -title -status-code -tech-detect -silent api.sirket.com [200] [Node.js] [Express] [Aegis Login] campaign2019.sirket.com [200] [WordPress 4.7] [PHP 5.6] # ⚠ KRİTİK CVE dev.sirket.com [403] [Forbidden] staging-eski.sirket.com [200] [DEBUG MODE] # ⚠ exposing stack mail.sirket.com [200] [Postfix admin] # ⚠ panel exposed
Hangi sinyaller alarm vermeli?
- Title'da "WordPress" / "phpMyAdmin" / "Jenkins" / "Grafana": Default kurulum kontrol et
- "DEBUG" / "Stacktrace" / "X-Debug-Token": Production'da kapalı olmalı
- Status 200 + boş response: Bucket / S3 misconfiguration olabilir
- CNAME → AWS S3 / Heroku / Azure Storage: Subdomain takeover kontrolü gerek
- Eski TLS sürümü (1.0/1.1): Browser'lar reject ediyor — patch lazım
Bunu sürekli yapmak şart
Subdomain envanteri tek seferlik bir iş değil — DevOps her hafta yeni endpoint açar, marketing kampanya domain'i alır, üçüncü taraf CNAME yapar. Aegis Scanner haftalık otomatik yapar; diff motoru "geçen hafta yoktu, bu hafta var" diye yeni eklenenleri alarmıyla bildirir.
Daha detaylı: Subdomain takeover nedir, nasıl çalışır →