Bir sızma nadiren filmlerdeki gibi görünür. Kimse terminale bir şey yazmaz, ekranda kurukafalar belirmez. Alışıldık olan daha sıkıcıdır: sunucu yavaşlar, barındırma sağlayıcısı giden istenmeyen posta hakkında bir mektup gönderir ya da site ziyaretçileri yabancı bir adrese yönlendirmeye başlar.

Aşağıda, yapılması mantıklı olan sırayla yedi kontrol var. Hepsi birlikte yaklaşık on dakika sürer.

1. İşlemciyi ne yiyor

top -c
ps aux --sort=-%cpu | head -20

Aranan şey, anlamsız bir ada sahip olan ve işlemciyi neredeyse yüzde yüzde tutan bir süreçtir. Kripto madenciliği, sızmanın en sık görülen sonucudur; nedeni basit: başkasının sunucusunda para kazanmanın en hızlı yolu budur.

İki şey daha yakından bakmayı hak eder. /tmp, /dev/shm veya /var/tmp dizinlerinden çalışan süreçler — oralardan normalde hiçbir şey başlatılmaz. Ve sistem süreçlerine benzeyen ama tam oturmayan adlar: yanlış dizinden çalıştırılmış, yüksek işlemci yüküne sahip kswapd0 ya da büyük C ile crond.

sudo ls -l /proc/<pid>/exe
sudo ls -l /proc/<pid>/cwd

İlk komut çalıştırılabilir dosyanın gerçek yolunu, ikincisi sürecin çalıştığı dizini gösterir. Genellikle neyle karşı karşıya olduğunuzu anlamak için bu yeterlidir.

2. Giden bağlantılar

sudo ss -tupn
sudo ss -tupn state established

Sıradan bir web sunucusu dışarıya nadiren bağlanır: paket yöneticisinin aynalarına, ödeme geçidine, e-posta gönderim hizmetine. Yüksek portlarda bilinmeyen adreslere kurulan kalıcı bağlantılar ya bir madencilik havuzudur ya da bir komuta sunucusuyla iletişimdir.

Bu kontrolün tek başına zayıf olduğunu unutmayın: zararlı kod çoğu zaman yalnızca bir zamanlamaya göre bağlanır. Şu anda bir şey görmüyor olmanız, bir şey olmadığı anlamına gelmez.

3. Tüm kullanıcıların cron görevleri

Temizlediğiniz şeyin geri dönmesi için tam da burada yerleşilir.

for u in $(cut -f1 -d: /etc/passwd); do echo "== $u"; sudo crontab -u "$u" -l 2>/dev/null; done
sudo ls -la /etc/cron.d/ /etc/cron.daily/ /etc/cron.hourly/
sudo cat /etc/crontab

Şüphe uyandıranlar: @reboot içeren satırlar, uzun kodlanmış komutlar, bir kabuğa aktarılan curl ya da wget çağrıları, geçici dizinlerden başlatılan her şey.

4. SSH anahtarları ve kullanıcılar

sudo find /home /root -name authorized_keys -exec ls -l {} \; -exec cat {} \;
sudo awk -F: '$3 == 0 {print $1}' /etc/passwd
sudo lastlog | head -20

authorized_keys dosyasındaki her satır, birinin hem parola değişimini hem yeniden başlatmayı atlatan kalıcı erişimidir. Anahtarın kime ait olduğunu söyleyemiyorsanız yabancı sayın — satır sonundaki açıklama serbest metindir ve hiçbir şey kanıtlamaz.

İkinci komut uid değeri 0 olan tüm hesapları listeler. Orada yalnızca root olmalıdır.

5. Oturum açma günlükleri

sudo grep 'Accepted' /var/log/auth.log | tail -30
sudo last -20
who

Önemli olan başarılı oturum açmalardır, başarısız olanlar değil. Başarısız denemeler, internetteki her sunucuda bulunan arka plan gürültüsüdür. Kimsenin çalışmadığı bir saatte bilinmeyen bir adresten yapılan başarılı bir oturum açma ise somut bir yanıttır.

Debian 12 ve Ubuntu 24.04 üzerinde /var/log/auth.log dosyası çoğu zaman hiç yoktur — rsyslog artık varsayılan olarak kurulmuyor. Bunun yerine günlüğü okuyun:

sudo journalctl -u ssh --since '7 days ago' | grep Accepted

6. Değişmiş sistem dosyaları

Debian ve Ubuntu üzerinde hazır bir referans vardır: her paket kendi dosyalarının sağlama toplamlarını beraberinde taşır.

sudo apt install debsums
sudo debsums -c

/etc içindeki değişmiş yapılandırma dosyaları normaldir — onları siz değiştirdiniz. /usr/bin, /bin ya da /usr/sbin içindeki değişmiş çalıştırılabilir dosyalar tam da aradığınız şeydir.

7. Web kökünde alışılmadık dosyalar

sudo find /var/www -name '*.php' -mtime -7 -ls
sudo find /var/www/uploads -name '*.php'

İkinci komut birincisinden daha önemlidir. Yüklenen dosyaların dizinindeki bir PHP dosyasının orada olması için meşru hiçbir neden yoktur ve burası web kabuğu için en sık kullanılan yerdir.

Gerçekten bir şey bulunursa

İlk dürtü, bulguyu hemen silmektir. Bu bir hatadır: dosyayla birlikte oraya nasıl geldiği bilgisi de kaybolur ve bu sorunun yanıtı olmadan her şey birkaç gün içinde tekrarlanır.

  1. Dosyanın bir kopyasını ve değiştirilme zamanını saklayın.
  2. Web sunucusu günlüklerinde aynı anda ne olduğunu arayın — giriş noktası genellikle oradadır.
  3. Yalnızca bir şey bulduğunuz maddeyi değil, yedi maddenin hepsini gözden geçirin. Arka kapılar neredeyse hiçbir zaman tek nüsha bırakılmaz.
  4. Ancak bundan sonra temizleyin ve açığın kendisini kapatın.

Ve dürüst bir sınır: saldırgan root aldıysa, içeriden yapılan hiçbir kontrole tam güvenilemez — araçların kendisi değiştirilmiş olabilir. Derin bir sızmada tek güvenilir yol yeni bir sunucu ve gözden geçirilmiş bir yedekten geri yüklemedir.

Kontrolü zorlaştıran şey

Buradaki asıl zorluk komutlar değil, listenin geçen hafta nasıl göründüğünü hatırlamayan biri için bilinmeyen bir satırın şüpheli görünmemesidir. Başkasının kurduğu bir sunucuda kendine ait olanı yabancı olandan ayırmak neredeyse imkânsızdır.

Buradan pratik sonuç çıkar: sunucu düzgün çalışırken durumun anlık görüntüsünü alın. Sağlıklı bir makinedeki süreç, port, cron görevi ve anahtar listesi, daha sonra karşılaştıracağınız referanstır — ve o zaman saatler süren arama, iki listenin karşılaştırılmasına dönüşür. Bunun tek bir sayfada toplanmış hâli nasıl görünüyor, aşağıdaki gösterimde görebilirsiniz.