KNT Global Medya, 52 WordPress sitesinden oluşan bir haber/içerik ağıdır. Devraldığımızda üç sitede aktif backdoor, sıfır yedek, eski geliştirici elinde 60+ canlı erişim ve dokümante edilmemiş bir merkezi içerik dağıtım sistemi vardı. 48 saatte temizledik, yedekledik, custom yönetim paneli yazdık.
KNT Global Medya 52 WordPress sitesinden oluşan büyük bir içerik ağı. Tek bir Ubuntu sunucu üzerinde, merkezi bir CMS hub ve onu besleyen "Content Subscriber" eklentisi mantığıyla otomatik içerik dağıtımı yapan, ciddi bir yayıncılık altyapısı. Ama yıllardır tek bir geliştirici elinde dönmüş ve hiçbir şey dokümante edilmemiş.
Bizden istenen ilk şey basitti: "Eski geliştiriciyi sistemden çıkarın." Bunu yapmak için önce ne olduğunu anlamamız gerekiyordu. Aşağıdakileri devraldığımız sırada keşfettik:
İki günde tamamlanması gereken bir iş listesi çıkardık: (1) mevcut zararlıyı tespit ve temizle, (2) tüm erişimleri sıfırla, (3) her şeyin yedeğini al, (4) tekrar olmaması için izleme katmanı kur.
Saat saat olan bitenin özeti. Acil müdahale modunda, müşterinin yayın akışını bir saniye bile kesmeden.
wp-includes/functions.php dosyasına iki ayrı add_action enjekte etmişti: birincisi belirli bir GET parametresiyle otomatik admin login, ikincisi anasayfaya uzak sunucudan SEO spam basıyordu. Saldırı vektörü Endonezya menşeli bir botnet IP bloğundan geliyordu./add.php POST denemesi (recon), sadece 3'ünde başarı. Bu üçünde tek seferde 302 redirect — yani brute force değil, doğru parolayı biliyordu. Eski admin parolası daha önce sızmıştı.authorized_keys içindeki public key kaldırıldı.wp-content dosya yedekleri (~31 GB), Nginx vhost konfigleri (113 adet), SSL sertifikaları, SSH ayarları, aaPanel DB, PHP konfig, Redis konfig ve UFW kuralları. Hepsi sunucu üzerinde + yerel kopya.functions.php dosyaları sağlıklı sürümleriyle değiştirildi (MD5 ile doğrulandı). Üç compromised sitenin wp-config.php'sindeki tüm 8 security key rotate edildi → mevcut tüm WP session'ları geçersiz kılındı. Saldırgan IP'si /24 alt ağı ile UFW'de bloklandı.PermitRootLogin prohibit-password, IP whitelist (sadece müşteri IP'si + Tailscale CGNAT). MariaDB için sadece tek bir IP'den ve sadece tek porta yönlenebilen Match bloğu eklendi.v0.2.0'ı ile birlikte panele entegre 6 modüllü kapsamlı tarama: WordPress core checksum, dosya bütünlüğü, webshell pattern, plugin blacklist, drop-in tespiti, options anomalisi. Sonuçlar 15 dakika cache'le tüm fleet için tek ekranda.Tek seferlik bir temizlik değildi bu — bir daha aynı durumla karşılaşmamak için sistemi bir bütün olarak yeniden tasarladık. Üç ayrı katmandan oluşan bir mimari kurduk.
Eski geliştiricinin tüm erişimleri kesildi. Backdoor'lar tespit edilip temizlendi. SSH, UFW, Cloudflare WAF ve security key'ler en sıkı modda yeniden yapılandırıldı. Saldırgan IP /24 alt ağı kalıcı olarak bloklandı.
52 site için tam DB + dosya + sistem konfigürasyon yedekleri. 113 Nginx vhost dosyası, SSL sertifikaları, aaPanel DB, PHP/Redis konfigleri arşivlendi. Yerel + sunucu kopyalı, periyodik tetiklenen yedekleme rutini kuruldu.
Sunucuya SSH ile değil, panele bir tarayıcıdan giren bir operatör 52 sitenin sağlığını, güvenlik durumunu ve aktivitesini tek ekranda görebiliyor. Her site içine yerleştirilen Bridge plugin REST üzerinden veri besliyor.
Panel içinde paralel çalışan 6 modüllü güvenlik tarama. Her sitenin core dosyaları WordPress.org checksum API'si ile karşılaştırılır, webshell pattern'leri taranır, beklenmedik plugin/drop-in ve options değişiklikleri raporlanır.
Bir saldırının hangi vektörden geleceğini önceden bilmediğimiz için, bilinen tüm WordPress saldırı kalıplarını paralel olarak tarayan modüler bir audit sistemi yazdık.
Her sitenin wp-includes ve wp-admin dosyaları, WordPress.org'un resmi checksum API'si ile karşılaştırılır. Tek bir byte fark dahi critical olarak raporlanır.
Site root'unda whitelist dışı PHP, uploads klasöründe çalıştırılabilir dosya, son 30 günde değişmiş core dosyaları — saldırı sonrası klasik artefaktlar tek bir taramada raporlanır.
Bilinen webshell imzaları: eval(base64_decode()), gzinflate, preg_replace /e, sha1+md5 auth bypass, FilesMan/c99/r57 imzaları, ve bizim devraldığımız vakadaki spesifik backdoor pattern'i.
Bilinen kötü amaçlı plugin adlarına (saldırganların favorisi olan dosya yöneticisi türevleri, CVE'li eklentiler) ve son 30 günde yüklenmiş ama haberimiz olmayan plugin'lere karşı kontrol.
Beklenmedik mu-plugins, object-cache.php, db.php, sunrise.php drop-in dosyaları — meşru kullanım dışı bu dosyalar genelde kalıcı erişim için kullanılır.
Autoload edilen 100KB+ devasa option'lar, siteurl/home host uyumsuzluğu, açık kullanıcı kaydı + yüksek varsayılan rol, şüpheli option_name kalıpları (serialize edilmiş action_ isimleri).
KNT Global Medya yayın ağı, dört ayrı vertikalde toplam 49 WordPress sitesinden oluşuyor: haber, ekonomi, spor ve kadın yaşam. Her sitenin kendi okuyucu kitlesi, kendi editöryal kimliği var; ama hepsi tek bir sunucu üzerinde, tek bir yedekleme havuzunda, tek bir tarayıcı paneli üzerinden izleniyor. Aşağıda ağın tam dökümü — site adları ve domainler eksiksiz, kategoriye göre gruplanmış olarak.
Listede yer alan her site, KNT Global Medya'nın knt-bridge v0.2 WordPress eklentisini barındırıyor. Eklenti, panel'imize REST üzerinden site sağlık verisi (HTTP yanıt kodu, gecikme, çekirdek dosya bütünlüğü, plugin sürümleri, son güvenlik tarama sonucu) besliyor. Yukarıdaki Devir tamam, Altyapı kuruldu, İçe aktarım, Geçiş yapılıyor, Askıda ve İçerik akış sorunu etiketleri gerçek operasyonel durumu yansıtıyor — pazarlama metni değil, paneldeki haldir.
Türkiye dijital yayıncılık tarafında "haber sitesi sahibi olmak" çoğu zaman üç farklı senaryoyu barındırır: tek başına çalışan tek bir kurumsal yayın, küçük bir aile (3-5 site) ya da KNT Global Medya gibi gerçek bir yayın ağı. KNT, dördüncü vertikalle birlikte 49 ayrı domain üzerinde, dört ayrı editöryal hat üzerinden günlük yayın yapıyor. Her vertikal kendi okuyucu profilini taşıyor: haber sitelerinde Türkiye genelinde son dakika takipçisi, ekonomi sitelerinde piyasa ve KOBİ profesyoneli, spor sitelerinde Süper Lig ve transfer takipçisi, kadın yaşam sitelerinde moda ve lifestyle okuru.
Editöryal tarafta bu çeşitlilik bir avantaj — ama operasyonel tarafta bir 49 misli yüktür. Tek bir CVE çıktığında 49 sitenin sürümünü kontrol etmek gerekir; tek bir Cloudflare politikası değişimi 50 zone üzerinde uygulanmalıdır; tek bir backdoor üç sitede aktifse 46 temiz sitenin de aynı anda kontrol edilmesi gerekir. Devraldığımızda KNT'nin elinde bunu yapacak ne süreç ne araç vardı — sadece tek bir geliştiricinin SSH oturumu vardı.
Bu vakanın asıl değeri 48 saatte yapılan acil müdahale değil; sonrasında kurulan disipline dayanıyor. Müşteriye "tek bir ekran açın, 49 sitenin tamamını görün" diyebildiğimiz andan itibaren altyapı, geliştirici bağımlılığından çıkıp operasyona geçti. Yeni bir sitenin ağa eklenmesi (Bridge plugin'in deploy edilmesi, Cloudflare zone'unun kurulması, panele kayıt) bugün yarım günde tamamlanan otomatik bir akış. Bir CVE yayınlandığında etkilenen siteler 15 dakika içinde panele düşüyor. Bu, "bir geliştiricinin elinde" değil, "bir çatı altında" yönetiliyor olmak demek.
Vakanın teknik tarafı dört katmanda özetlenebilir:
49 ayrı WordPress 6.9 kurulumu, Nginx + PHP 8.1 + MariaDB 10.11 + Redis üzerinde çalışıyor. Tüm siteler tek bir Ubuntu sunucu üzerinde, ancak her biri kendi vhost'unda izole. 113 Nginx vhost dosyası (her domain için www ve non-www varyantı + SSL endpointleri).
BubiSoft tarafından yazılan, MIT lisanslı dahili eklenti. REST API üzerinden panel ile haberleşiyor, 6 modüllü güvenlik tarayıcısını barındırıyor (core checksum, dosya bütünlüğü, webshell pattern, plugin blacklist, drop-in tespiti, options anomalisi). 49/49 sitede paralel deploy edildi. Versiyon güncellemeleri tek seferde tüm filoya iletiliyor.
Tüm 60+ canlı erişim sıfırlandı. SSH non-standard porta taşındı, key-only auth + IP whitelist (müşteri + Tailscale CGNAT). UFW reverse proxy kuralları, MariaDB sadece tek bir source IP'den erişilebiliyor. Cloudflare 50 zone üzerinde TLS 1.2+ minimum, security level "high", Always HTTPS, HTTP/3, Brotli aktif. Saldırgan IP /24 alt ağı kalıcı bloklu.
32 GB tam yedek (DB dump 1.1 GB + wp-content ~31 GB + sistem konfigleri) yerel + sunucu kopyalı, periyodik tetiklenen rutinle yenileniyor. Bridge plugin dağıtımı tek bir orchestrator komutuyla 49 site'a paralel basılıyor; başarısız deploy panel üzerinden manuel müdahale edilebiliyor. Yeni site ekleme süreci yarım günlük standart bir runbook'a indirildi.
Hem panel tarafında hem de sunucu tarafında kullandığımız araçlar. Her birinin seçimi spesifik bir gereksinime karşılık veriyor.
Acil müdahale 48 saatte tamamlandı, ama gerçek değer sonrasında ortaya çıkıyor. Devralma sonrası KNT Global Medya altyapısını retainer modelinde yönetmeye devam ediyoruz. Aylık bakım ve büyüme sözleşmesi kapsamında:
Sözümüz baştan netti: "Sistemi sadece teslim etmiyoruz, gerçekten arkasındayız." Bunu söylemek kolay; her gün 52 sitenin nabzını tutmak zor.
Mevcut altyapınız için 1 haftalık dürüst teknik audit yapıyoruz: güvenlik, yedek durumu, kod sağlığı, mimari borç ve devralma riski raporu. İlk görüşme ücretsiz.