Erişim elde etmek işin yarısıdır; öteki yarısı onu kaybetmemektir. Bu yüzden otomatikleştirilmiş zararlı yazılımların neredeyse tamamı her şeyden önce yeniden başlatılmayı ayarlar: bir yeniden başlatmadan sonra, dosya silindikten sonra, parola değiştikten sonra. Tanıdık hikâye buradan gelir — «temizledik, iki gün sonra geri geldi».

Bunun ayarlandığı yerler o kadar çok değildir ve hepsi birkaç dakikada kontrol edilebilir. Aşağıda sırasıyla tam tur var.

1. SSH anahtarları

En basit geri dönüş yolu: authorized_keys içindeki bir satır parola değişikliğinden, sistem güncellemesinden ve yeniden başlatmadan sağ çıkar.

sudo find /home /root -name authorized_keys -exec ls -l {} \; -exec cat {} \;

Her satır birinin kalıcı erişimidir. Kimin olduğunu söyleyemiyorsanız onu başkasınınki sayın. Satır sonundaki açıklamaya da dikkat edin: o keyfî bir metindir ve kendi adınızla eşleşmesi hiçbir şey kanıtlamaz.

2. Bütün kullanıcıların cron görevleri

Kontrol edilmesi gereken yalnızca kendi crontab dosyanız değildir:

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.hourly/ /etc/cron.daily/
sudo cat /etc/crontab

Aranmaya değer işaretler: @reboot satırları, uzun kodlanmış komutlar, bir kabuğa borulanmış curl ya da wget çağrıları, /tmp, /dev/shm ya da /var/tmp içinden başlatılan her şey. O dizinlerden standart hiçbir şey çalışmaz.

3. systemd zamanlayıcıları ve servisleri

cron’un çağdaş karşılığı ve gözle görülür biçimde daha seyrek kontrol edilir:

systemctl list-timers --all
systemctl list-units --type=service --state=running
sudo ls -la /etc/systemd/system/ /run/systemd/system/

Ayrıca, root ayrıcalıkları olmadan çalışan ve genel listede görünmeyen kullanıcı servisleri:

systemctl --user list-units --type=service
sudo ls -la /home/*/.config/systemd/user/

Bir ayrıntı daha: bir kullanıcı için etkinleştirilmiş lingering (loginctl enable-linger), o kullanıcının servislerinin etkin bir oturum olmadan çalışmasına izin verir. loginctl list-users ile kontrol edin.

4. Kabuk başlangıç dosyaları

Bir kabuk başlangıç dosyasının sonuna eklenmiş kod her oturum açmada çalışır:

sudo tail -5 /root/.bashrc /root/.profile /home/*/.bashrc /home/*/.profile
sudo ls -la /etc/profile.d/

Özellikle dosyanın sonuna bakın — hızlı bir bakışta göze çarpmasın diye eklemeler oraya yapılır.

5. ld.so.preload

Sistemin, başlatılan her sürece belirli bir kütüphaneyi yüklemesini sağlayan bir dosya. Normal koşullarda asla oluşturulmaz:

ls -l /etc/ld.so.preload

Varlığı pratikte ciddi bir ele geçirmenin kesin işaretidir ve böyle bir kütüphane genellikle dosyaları, süreçleri ve ağ bağlantılarını birlikte gizler. O makinede bundan sonra gördüğünüz hiçbir şey güvene layık değildir.

6. Paket yöneticisi kancaları

Ender hatırlanan bir yöntem: apt, her paket işleminden önce ve sonra komut çalıştırabilir.

sudo ls -la /etc/apt/apt.conf.d/
sudo grep -r 'DPkg::Pre-Invoke\|DPkg::Post-Invoke\|APT::Update' /etc/apt/apt.conf.d/

Böyle bir kanca her güncelleme kurulumunda tetiklenir — yani düzenli olarak ve root olarak.

7. Ubuntu’daki günün iletisi

/etc/update-motd.d/ dizini, her SSH oturum açmasında çalışan ve karşılama metnini oluşturan çalıştırılabilir betikleri barındırır. Bu yer tam da sistemin bir parçası gibi göründüğü için elverişlidir:

sudo ls -la /etc/update-motd.d/

8. Ertelenmiş at görevleri

sudo atq
sudo ls -la /var/spool/cron/atjobs/ 2>/dev/null

Eski ve ender kullanılan bir mekanizma; dolayısıyla en az kontrol edileni.

Bir şey bulursanız ne yapmalı

İlk dürtü bulguyu hemen silmektir. Bu bir hatadır: onunla birlikte oraya nasıl geldiğine dair bilgi de yok olur ve o sorunun yanıtı olmadan bütün bu iş yeniden yaşanır.

  1. Dosyanın ya da görevin ve değişiklik zamanının bir kopyasını saklayın.
  2. O zamanı kullanarak web sunucusu günlüklerinde ve auth.log içinde aynı dakikada ne olduğuna bakın. Giriş noktası genellikle oradadır.
  3. Yalnızca bir şeyin çıktığı yeri değil, listedeki sekiz yerin hepsini kontrol edin. Bir arka kapı neredeyse hiçbir zaman tek bir kopya olarak bırakılmaz.
  4. Ancak ondan sonra temizleyin ve açığın kendisini kapatın.

Normalin neye benzediğini bilmek

Bu kontroldeki asıl zorluk komutlar değil, bir görev listesindeki tanıdık olmayan bir satırın, listenin eskiden nasıl olduğunu hatırlamıyorsanız şüpheli görünmemesidir. Başkasının yapılandırdığı ya da bir yıl önce yapılandırılmış bir sunucuda sizinkini onunkinden ayırmak neredeyse imkânsızdır.

Buradan pratik sonuç çıkar: «olduğu gibi» bir anlık görüntü almak, sunucu düzgünken bugün mantıklıdır. Sağlıklı bir makinedeki cron görevlerinin, zamanlayıcıların, anahtarların ve servislerin listesi, sonradan her şeyin karşılaştırılacağı referanstır. Toplanmış ve geçmişiyle saklanmış haliyle bir arka kapı avını saatler süren bir uğraştan iki listenin karşılaştırılmasına dönüştürür. Bunun nasıl göründüğü aşağıdaki demo sayfalarında.