Mendapatkan akses barulah separuh pekerjaan; separuh sisanya adalah tidak kehilangannya. Karena itu hampir setiap perangkat lunak berbahaya yang otomatis lebih dulu mengurus agar dirinya bisa berjalan lagi: setelah penyalaan ulang, setelah berkasnya dihapus, setelah kata sandinya diganti. Dan dari sinilah muncul cerita yang sudah akrab — «sudah dibersihkan lalu dua hari kemudian ia kembali lagi».

Tempat-tempat yang dipakai untuk pengaturan itu tidak terlalu banyak, dan semuanya bisa diperiksa dalam beberapa menit. Berikut seluruh lingkarannya secara berurutan.

1. Kunci SSH

Jalan kembali yang paling sederhana: satu baris di authorized_keys bertahan melewati penggantian kata sandi, pembaruan sistem dan penyalaan ulang.

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

Setiap baris adalah akses permanen milik seseorang. Kalau tidak bisa menyebut milik siapa, anggap milik orang lain. Perhatikan juga komentar di ujung baris: itu teks bebas, dan kecocokannya dengan nama Anda tidak membuktikan apa pun.

2. Tugas cron semua pengguna

Bukan cuma memeriksa crontab Anda sendiri:

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

Tanda yang perlu dicari: baris @reboot, perintah panjang yang tak terbaca, pemanggilan curl atau wget yang dialirkan ke shell, dan apa pun yang berjalan dari /tmp, /dev/shm atau /var/tmp. Tidak ada yang standar berjalan dari direktori itu.

3. Timer dan layanan systemd

Alternatif modern untuk cron, dan ia jauh lebih jarang diperiksa:

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

Dan terpisah lagi, layanan milik pengguna, yang berjalan tanpa hak root dan tidak muncul di daftar umum:

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

Satu detail lagi: lingering yang dinyalakan untuk seorang pengguna (loginctl enable-linger) membuat layanannya bisa berjalan tanpa sesi yang aktif. Periksa dengan loginctl list-users.

4. Berkas awalan shell

Kode yang ditambahkan di ujung berkas awalan shell berjalan setiap kali login:

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

Lihatlah persis di ujung berkasnya — di situlah orang menambahkannya supaya tidak menyentak mata saat dilihat sekilas.

5. ld.so.preload

Sebuah berkas yang memaksa sistem memuat pustaka tertentu ke dalam setiap proses yang berjalan. Dan dalam keadaan normal ia tidak pernah dibuat:

ls -l /etc/ld.so.preload

Keberadaannya praktis merupakan tanda tak terbantah dari penguasaan yang serius, dan pustaka semacam itu biasanya sekaligus menyembunyikan berkas, proses maupun koneksi jaringan. Dan setelah itu apa pun yang Anda lihat di mesin tersebut tidak lagi layak dipercaya.

6. Hook pengelola paket

Cara yang lebih jarang diingat: apt bisa menjalankan perintah sebelum dan sesudah setiap operasi dengan paket.

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

Hook semacam itu berjalan setiap kali pembaruan dipasang — artinya secara berkala dan sebagai root.

7. Pesan hari ini di Ubuntu

Direktori /etc/update-motd.d/ berisi skrip eksekusi yang berjalan setiap kali login SSH dan menyusun teks sambutan. Dan tempat ini nyaman justru karena ia tampak sebagai bagian dari sistem:

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

8. Tugas at yang ditunda

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

Mekanisme lama yang jarang dipakai, dan karena itu paling jarang diperiksa.

Apa yang harus dilakukan kalau menemukan sesuatu

Reaksi pertama adalah langsung menghapus apa yang ditemukan. Dan itu keliru: bersamaan dengan itu hilang pula informasi bagaimana ia bisa sampai ke sana, dan tanpa jawaban atas pertanyaan itu semuanya akan terulang.

  1. Simpan salinan berkas atau tugas itu beserta waktu perubahannya.
  2. Dengan waktu itu lihat di log server web dan di auth.log apa yang terjadi pada menit yang sama. Titik masuknya biasanya ada di situ.
  3. Periksa seluruh delapan tempat dalam daftar, bukan hanya tempat di mana sesuatu ditemukan. Pintu belakang hampir tidak pernah ditinggalkan dalam satu salinan saja.
  4. Dan baru kemudian bersihkan serta tutup lubangnya sendiri.

Mengetahui yang normal itu seperti apa

Kesulitan sebenarnya dari pemeriksaan ini bukan perintahnya melainkan bahwa sebuah baris asing dalam daftar tugas tidak terlihat mencurigakan kalau Anda tidak ingat daftarnya dulu seperti apa. Dan pada server yang disetel orang lain, atau yang disetel setahun lalu, membedakan milik sendiri dari milik orang lain nyaris mustahil.

Dari sini muncul kesimpulan praktis: mengambil snapshot «apa adanya» hari ini itu bermakna, selagi servernya masih baik-baik saja. Daftar tugas cron, timer, kunci dan layanan pada mesin yang sehat adalah acuan yang nantinya dipakai membandingkan segalanya. Dan ketika dikumpulkan di satu tempat beserta tanggalnya dan dilindungi, ia mengubah perburuan pintu belakang dari latihan berjam-jam menjadi perbandingan dua daftar. Bagaimana tampilannya — lihat di halaman demo di bawah.