Có được quyền truy cập mới là một nửa công việc; nửa còn lại là không đánh mất nó. Vì thế gần như mọi phần mềm độc hại tự động đều lo việc tự khởi chạy lại trước tiên: sau khi khởi động lại, sau khi tệp bị xóa, sau khi đổi mật khẩu. Và từ đó mà có câu chuyện quen thuộc — «dọn sạch rồi hai ngày sau nó lại về».

Những nơi diễn ra việc sắp đặt đó không nhiều lắm, và tất cả đều kiểm tra được trong vài phút. Dưới đây là toàn bộ vòng theo thứ tự.

1. Khóa SSH

Con đường quay lại đơn giản nhất: một dòng trong authorized_keys sống sót qua việc đổi mật khẩu, cập nhật hệ thống và khởi động lại.

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

Mỗi dòng là quyền truy cập thường trực của một ai đó. Nếu không nói được là của ai thì hãy coi là của người lạ. Hãy để ý cả phần chú thích ở cuối dòng: đó là văn bản tùy ý, và việc nó trùng tên bạn chẳng chứng minh điều gì.

2. Tác vụ cron của mọi người dùng

Không phải chỉ kiểm tra crontab của riêng mình:

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

Những dấu hiệu đáng tìm: các dòng @reboot, các lệnh dài khó hiểu, các lời gọi curl hay wget đổ vào shell, và bất cứ thứ gì chạy từ /tmp, /dev/shm hay /var/tmp. Chẳng có gì chuẩn mực chạy từ những thư mục đó.

3. Timer và dịch vụ của systemd

Lựa chọn hiện đại thay cho cron, và nó bị kiểm tra ít hơn hẳn:

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

Và riêng ra là các dịch vụ của người dùng, vốn chạy không cần quyền root và không xuất hiện trong danh sách chung:

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

Một chi tiết nữa: lingering được bật cho một người dùng (loginctl enable-linger) cho phép các dịch vụ của họ chạy mà không cần phiên đang hoạt động. Hãy kiểm tra bằng loginctl list-users.

4. Các tệp khởi động của shell

Mã được thêm vào cuối tệp khởi động của shell sẽ chạy mỗi lần đăng nhập:

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

Hãy nhìn đúng vào cuối tệp — chính ở đó người ta thêm vào để không đập vào mắt khi lướt qua.

5. ld.so.preload

Một tệp buộc hệ thống nạp một thư viện chỉ định vào mọi tiến trình đang chạy. Và trong điều kiện bình thường nó không bao giờ được tạo ra:

ls -l /etc/ld.so.preload

Sự tồn tại của nó trên thực tế là dấu hiệu không thể nhầm lẫn của một vụ chiếm quyền nghiêm trọng, và một thư viện như vậy thường giấu luôn cả tệp, tiến trình lẫn kết nối mạng. Và sau đó những gì bạn thấy trên máy ấy đều không còn đáng tin.

6. Hook của trình quản lý gói

Cách ít được nhớ tới hơn: apt có thể chạy lệnh trước và sau mỗi thao tác với gói.

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

Một hook như vậy chạy mỗi lần cài cập nhật — tức là đều đặn và dưới quyền root.

7. Thông điệp trong ngày trên Ubuntu

Thư mục /etc/update-motd.d/ chứa các script thực thi chạy mỗi lần đăng nhập SSH và tạo ra văn bản chào mừng. Và chỗ này tiện lợi chính vì nó trông như một phần của hệ thống:

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

8. Các tác vụ at đã hẹn

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

Một cơ chế cũ và ít dùng, và vì thế bị kiểm tra ít nhất.

Nếu tìm thấy gì thì làm gì

Phản ứng đầu tiên là xóa ngay thứ vừa tìm thấy. Và đó là sai lầm: cùng với nó cũng biến mất thông tin về việc nó đã đến đó bằng cách nào, và thiếu câu trả lời cho câu hỏi ấy thì mọi thứ sẽ lặp lại.

  1. Hãy giữ một bản sao của tệp hoặc tác vụ cùng thời điểm nó được sửa đổi.
  2. Dùng thời điểm đó xem trong nhật ký máy chủ web và trong auth.log rằng phút ấy đã xảy ra chuyện gì. Điểm xâm nhập thường ở ngay đó.
  3. Hãy kiểm tra toàn bộ tám nơi trong danh sách, chứ không chỉ nơi tìm thấy gì đó. Cửa hậu gần như không bao giờ được để lại chỉ một bản.
  4. Và chỉ khi đó mới dọn dẹp và bịt chính lỗ hổng.

Biết bình thường là thế nào

Khó khăn thật sự của phép kiểm tra này không phải là các lệnh mà là ở chỗ một dòng lạ trong danh sách tác vụ chẳng có vẻ gì đáng ngờ nếu bạn không nhớ danh sách trước đây ra sao. Còn trên một máy chủ do người khác cấu hình, hoặc được cấu hình một năm trước, việc phân biệt của mình với của người khác gần như bất khả.

Từ đó rút ra kết luận thực tiễn: chụp một ảnh «như đang có» ngay hôm nay là có ý nghĩa, chừng nào máy chủ còn ổn. Danh sách các tác vụ cron, timer, khóa và dịch vụ trên một máy khỏe mạnh chính là chuẩn mực mà sau này mọi thứ sẽ được so với nó. Và khi được gom lại một chỗ cùng ngày tháng và được bảo vệ, nó biến cuộc săn cửa hậu từ một bài tập kéo dài nhiều giờ thành việc so sánh hai danh sách. Trông ra sao — xem ở các trang demo bên dưới.