Săn lùng Web Shell trên Linux: Cẩm nang thực chiến về ứng phó sự cố

Security tutorial - IT technology blog
Security tutorial - IT technology blog

Cơn ác mộng mang tên Backdoor âm thầm

Thức dậy và phát hiện máy chủ bị xâm nhập là một trải nghiệm cực kỳ căng thẳng. Nhiều năm trước, sau khi máy chủ production đầu tiên của tôi bị tấn công brute-force vào lúc 3 giờ sáng, tôi đã trở nên ám ảnh với việc thắt chặt bảo mật SSH. Tuy nhiên, chúng ta thường bỏ qua điểm xâm nhập hiển nhiên nhất: chính ứng dụng web. Chỉ cần một plugin chưa được vá lỗi hoặc một form tải tệp (file upload) lỏng lẻo, kẻ tấn công có thể cài cắm một web shell chỉ trong vài giây.

Web shell là một đoạn mã độc được viết bằng các ngôn ngữ như PHP, Python, hoặc JSP. Nó cung cấp một giao diện quản trị từ xa, cho phép kẻ tấn công thực thi các lệnh và leo thang trong mạng lưới của bạn. Vì lưu lượng này chạy qua các cổng HTTP/HTTPS tiêu chuẩn, nó vượt qua hầu hết các tường lửa cơ bản. Hướng dẫn này sẽ bao gồm cách săn lùng các đoạn mã này, phân tích hành vi của chúng và dọn dẹp lây nhiễm một cách triệt để.

Tại sao Web Shell lại khó bị phát hiện

Web shell ẩn mình ngay trong lớp ứng dụng. Chúng không yêu cầu một trình lắng nghe (listener) đang mở hay một cổng mới. Nếu máy chủ của bạn có thể thực thi các tệp .php, nó có thể chạy một shell. Kẻ tấn công sử dụng nhiều thủ thuật để trở nên vô hình:

  • Làm xáo trộn mã (Obfuscation): Chúng sử dụng base64_encode hoặc str_rot13 để che giấu các chuỗi như “system” hoặc “exec”.
  • Giả mạo thời gian (Timestomping): Kẻ tấn công sử dụng lệnh touch để khớp ngày chỉnh sửa của shell với các tệp hợp lệ từ năm 2018.
  • Ngụy trang (Masquerading): Bạn có thể tìm thấy một shell có tên wp-includes.php hoặc thumb_823.php ẩn trong thư mục tải lên cùng với 5.000 hình ảnh khác.

Cài đặt: Trang bị bộ công cụ của bạn

Kiểm tra thủ công là rất quan trọng, nhưng các công cụ quét tự động sẽ giúp tìm ra những mục tiêu dễ dàng nhất một cách nhanh chóng. Chúng ta sẽ sử dụng Linux Malware Detect (LMD), thường được gọi là Maldet, cùng với các công cụ CLI có sẵn.

Cài đặt Linux Malware Detect (LMD)

LMD được tinh chỉnh đặc biệt cho các loại shell thường thấy trong môi trường shared hosting và web. Dưới đây là quy trình thiết lập cho hệ thống Ubuntu hoặc Debian tiêu chuẩn:

cd /tmp
wget http://www.rfxn.com/downloads/maldetect-current.tar.gz
tar -xvf maldetect-current.tar.gz
cd maldetect-*
sudo ./install.sh

Sau khi cài đặt xong, hãy cập nhật các dấu hiệu nhận dạng (signatures) mới nhất ngay lập tức. Các biến thể shell mới xuất hiện hàng ngày, và các chữ ký cũ sẽ trở nên vô dụng.

sudo maldet -u

Các tiện ích Linux có sẵn

Không phải lúc nào bạn cũng cần những phần mềm phức tạp. Tôi dựa vào grep, find, và awk cho 90% các cuộc điều tra của mình. Đảm bảo coreutils của bạn đã được cập nhật, vì chúng ta sẽ dựa vào siêu dữ liệu (metadata) chính xác của tệp để phát hiện các bất thường.

Cấu hình: Thiết lập cuộc săn lùng

Tìm kiếm một shell đòi hỏi phải tìm ra “mùi” của mã độc. Chúng ta kết hợp so khớp mẫu với phân tích dựa trên thời gian.

1. Tìm kiếm các mẫu mã độc

Hầu hết các shell dựa vào một bộ hàm PHP cụ thể để thực hiện hành vi xấu. Chạy tìm kiếm đệ quy trong thư mục gốc web của bạn—thường là /var/www/html—để đánh dấu các hàm này. Lệnh này sử dụng biểu thức chính quy tương thích Perl để tìm các chuỗi thực thi phổ biến:

grep -RPn "(passthru|shell_exec|system|base64_decode|eval|assert|fopen|gzuncompress)" /var/www/html/

Sẽ có những kết quả gây nhiễu. Các framework hiện đại như Laravel hay WordPress sử dụng base64fopen cho các tác vụ hợp lệ. Hãy tập trung sự chú ý vào các tệp mà các hàm này xuất hiện trong những dòng văn bản dài, loằng ngoằng và khó hiểu.

2. Tìm kiếm các tệp được chỉnh sửa gần đây

Nếu trang web của bạn bắt đầu hoạt động lạ lùng vào sáng nay, hãy kiểm tra các tệp đã được sửa đổi trong 24 giờ qua. Kẻ tấn công thường quên giả mạo thời gian (timestomp) cho mọi tệp chúng chạm vào.

find /var/www/html -type f -mtime -1 -ls

Nếu bạn thấy một tệp .php bên trong thư mục /wp-content/uploads/, gần như chắc chắn đó là mã độc. Các thư mục tải lên hợp lệ chỉ nên chứa tệp đa phương tiện, không phải mã thực thi.

3. Tự động hóa Maldet

Chỉnh sửa tệp /usr/local/maldetect/conf.maldet để tự động hóa việc phòng thủ. Tôi khuyên dùng các cài đặt này để cân bằng giữa bảo mật và hiệu suất hệ thống:

# Thiết lập là 1 để nhận cảnh báo
email_alert="1"
email_addr="[email protected]"

# Tự động đưa các tệp nghi ngờ vào vùng cách ly
quarantine_hits="1"

# Thử làm sạch mã độc chèn trong tệp
quarantine_clean="1"

Xác minh & Giám sát: Phân tích vụ xâm nhập

Tìm thấy một tệp khả nghi mới chỉ là một nửa trận chiến. Bạn cần biết kẻ tấn công đã làm gì khi chúng ở bên trong.

Bước 1: Cách ly

Đừng xóa tệp ngay lập tức. Bạn có thể cần nó để phục vụ điều tra số (forensics). Thay vào đó, hãy di chuyển nó đến một vùng an toàn và tước bỏ khả năng thực thi của nó.

mkdir /root/quarantine
mv /var/www/html/path/to/suspect.php /root/quarantine/
chmod 000 /root/quarantine/suspect.php

Bước 2: Giải mã Shell

Mở tệp bằng vim hoặc nano. Nếu bạn thấy eval(base64_decode('...')), kẻ tấn công đang che giấu mã của chúng. Bạn có thể giải mã nó một cách an toàn bằng dòng lệnh PHP để xem logic thực sự:

# Sử dụng sandbox nếu có thể
php -r "echo base64_decode('CHUỖI_ĐÃ_MÃ_HÓA_Ở_ĐÂY');" > decoded_output.txt

Bước 3: Kiểm tra các kết nối đang hoạt động

Web shell thường kết nối ngược về máy chủ Command & Control (C2). Sử dụng ss để xem liệu các tiến trình máy chủ web của bạn có đang giao tiếp với các địa chỉ IP bất thường hay không:

ss -antp | grep -E "(httpd|apache|nginx|php-fpm)"

Một kết nối hướng tâm (outbound) đến một IP ngẫu nhiên trên cổng 4444 hoặc 8080 là một dấu hiệu cảnh báo cực lớn. Nó thường cho thấy một reverse shell hiện đang hoạt động.

Bước 4: Đối soát nhật ký (Log Correlation)

Tìm chính xác giây mà shell được tạo ra. Sau đó, tìm kiếm trong access.log các yêu cầu POST tại thời điểm đó. Bạn đang tìm kiếm điểm xâm nhập:

grep "shell.php" /var/log/apache2/access.log

Một mục nhật ký điển hình có thể trông như thế này: 1.2.3.4 - - [10/Oct/2023:14:00:01] "POST /plugin/upload.php HTTP/1.1" 200. Điều này cho bạn biết chính xác plugin nào đang bị hổng. Nếu bạn không vá lỗi plugin đó, kẻ tấn công sẽ quay lại chỉ trong vòng vài phút.

Bước 5: Giám sát thời gian thực với Auditd

Để ngăn chặn các cuộc tấn công trong tương lai, hãy sử dụng Auditd để theo dõi thư mục web của bạn. Công cụ này ghi lại mọi thay đổi tệp trong thời gian thực.

sudo auditctl -w /var/www/html -p wa -k web_modification

Bất cứ khi nào một tệp được ghi hoặc thay đổi, nó sẽ xuất hiện trong /var/log/audit/audit.log. Điều này cung cấp một dấu vết bằng chứng không thể chối cãi cho các sự cố trong tương lai.

Danh sách kiểm tra tóm tắt

  • Lập lịch cho maldet chạy hàng ngày thông qua cron.
  • Kiểm tra thư mục gốc web để tìm các hàm PHP nguy hiểm hàng tuần.
  • Vô hiệu hóa việc thực thi trong các thư mục tải lên bằng .htaccess hoặc cấu hình Nginx.
  • Đối soát mốc thời gian của tệp với nhật ký máy chủ web để tìm lỗ hổng.
  • Luôn vá lỗi điểm xâm nhập trước khi đưa trang web hoạt động trở lại.

Quản trị máy chủ là một cuộc chiến của sự kiên trì. Bằng cách kết hợp các công cụ tự động với phân tích nhật ký thủ công, bạn có thể tóm gọn các web shell trước khi chúng leo thang thành một vụ vi phạm dữ liệu toàn diện. Hãy luôn cảnh giác, và đừng bao giờ giả định rằng một kết quả quét “sạch” nghĩa là bạn đã an toàn.

Share: