Kỹ Thuật Phát Hiện Webshell Trên Server
Giới Thiệu
Webshell là một công cụ độc hại được kẻ tấn công cài đặt lên máy chủ web, cho phép chúng điều khiển server từ xa thông qua giao diện web. Webshell có thể được sử dụng để thực thi lệnh, truy cập cơ sở dữ liệu, tải lên/tải xuống tệp, hoặc thậm chí là biến server thành một phần của mạng botnet. Việc phát hiện và loại bỏ webshell kịp thời là vô cùng quan trọng để bảo vệ dữ liệu, duy trì tính toàn vẹn của hệ thống và ngăn chặn các cuộc tấn công tiếp theo.
📋 Thời gian: 30-60 phút | Độ khó: Trung bình
Yêu Cầu
Để thực hiện hướng dẫn này, bạn cần có:
- Quyền truy cập SSH (hoặc console) với quyền root/sudo vào máy chủ Linux.
- Hiểu biết cơ bản về các lệnh dòng lệnh Linux.
- Kiến thức cơ bản về cấu trúc tệp của máy chủ web (Apache, Nginx, PHP-FPM, v.v.).
Các Bước Thực Hiện
Bước 1: Kiểm Tra Các Tệp Mới và Thay Đổi Gần Đây
Webshell thường là các tệp mới được tải lên hoặc các tệp hiện có bị sửa đổi. Bắt đầu bằng cách tìm kiếm các tệp được tạo hoặc sửa đổi gần đây trong thư mục gốc của trang web (thường là /var/www/html, /home/user/public_html, hoặc tương tự).
# Thay thế /var/www/html bằng đường dẫn gốc của trang web của bạn
WEB_ROOT="/var/www/html"
# Tìm các tệp được sửa đổi trong 7 ngày gần đây
# -type f: chỉ tìm tệp
# -mtime -7: sửa đổi trong 7 ngày gần đây (hoặc -2 cho 2 ngày)
# -ls: hiển thị chi tiết
find "$WEB_ROOT" -type f -mtime -7 -ls
# Tìm các tệp được tạo (ctime) hoặc sửa đổi (mtime) trong 2 ngày gần đây
# và sắp xếp theo thời gian sửa đổi gần nhất
find "$WEB_ROOT" -type f -newermt "$(date -d '2 days ago' '+%Y-%m-%d %H:%M:%S')" -print0 | xargs -0 ls -ltr
💡 Mẹo: Chú ý đến các tệp có phần mở rộng đáng ngờ (ví dụ: .php, .asp, .jsp, .aspx) trong các thư mục không phải là nơi chứa mã nguồn thông thường, hoặc các tệp có tên lạ như shell.php, cmd.php, r57.php, c99.php.
Bước 2: Phân Tích Nội Dung Tệp Đáng Ngờ
Sau khi xác định được các tệp đáng ngờ, bước tiếp theo là kiểm tra nội dung của chúng để tìm các dấu hiệu của webshell. Webshell thường sử dụng các hàm PHP (hoặc ngôn ngữ khác) để thực thi lệnh, mã hóa hoặc giải mã dữ liệu.
# Thay thế /var/www/html bằng đường dẫn gốc của trang web của bạn
WEB_ROOT="/var/www/html"
# Tìm kiếm các hàm PHP nguy hiểm trong tất cả các tệp .php
# -r: đệ quy
# -i: bỏ qua chữ hoa/thường
# -E: sử dụng regex mở rộng
# Các hàm phổ biến trong webshell: eval, base64_decode, system, exec, shell_exec, passthru, assert, str_rot13, gzinflate
grep -riE "eval\(|base64_decode\(|system\(|exec\(|shell_exec\(|passthru\(|assert\(|str_rot13\(|gzinflate\(" "$WEB_ROOT" | less
⚠️ Cảnh báo: Một số hàm này có thể được sử dụng hợp pháp trong các ứng dụng web. Bạn cần phân tích ngữ cảnh để xác định xem đó có phải là webshell hay không. Các webshell thường có đoạn mã rất phức tạp, được mã hóa hoặc làm rối (obfuscated) để che giấu mục đích.
Bước 3: Kiểm Tra Các Tiến Trình Đang Chạy và Kết Nối Mạng
Webshell có thể khởi động các tiến trình mới hoặc tạo các kết nối mạng ra bên ngoài.
# Liệt kê tất cả các tiến trình đang chạy và hiển thị người dùng, CPU, bộ nhớ
ps aux
# Liệt kê các kết nối mạng đang hoạt động và các tiến trình liên quan
# -t: TCP, -u: UDP, -l: listening, -n: số, -p: tiến trình
netstat -tulnp
💡 Mẹo: Tìm kiếm các tiến trình không quen thuộc được chạy bởi người dùng của máy chủ web (ví dụ: www-data, nginx) hoặc các kết nối đi ra bên ngoài mà bạn không mong đợi.
Bước 4: Sử Dụng Công Cụ Quét Webshell Chuyên Dụng
Có nhiều công cụ được thiết kế đặc biệt để phát hiện webshell. Một trong số đó là Linux Malware Detect (LMD) hay còn gọi là Maldet.
# Cài đặt Maldet (ví dụ trên CentOS/RHEL)
# wget http://www.rfxn.com/downloads/maldetect-current.tar.gz
# tar -xzf maldetect-current.tar.gz
# cd maldetect-*/
# ./install.sh
# Cập nhật cơ sở dữ liệu dấu hiệu của Maldet
maldet -u
# Thực hiện quét thư mục gốc của trang web
# Thay thế /var/www/html bằng đường dẫn gốc của trang web của bạn
maldet -a /var/www/html
# Xem báo cáo quét sau khi quá trình quét hoàn tất
# maldet --report [ID báo cáo]
# Ví dụ: maldet --report 210824-1234.1234
✅ Thành công: Maldet sẽ cung cấp một báo cáo chi tiết về các tệp đáng ngờ, cho phép bạn kiểm tra và xử lý chúng.
Bước 5: Kiểm Tra Nhật Ký (Logs) của Máy Chủ Web và Hệ Thống
Nhật ký của máy chủ web (access logs, error logs) và nhật ký hệ thống có thể chứa bằng chứng về hoạt động của webshell hoặc các nỗ lực truy cập trái phép.
# Xem các yêu cầu gần đây trong access log của Apache/Nginx
# Thay thế đường dẫn bằng log file thực tế của bạn
tail -f /var/log/apache2/access.log
tail -f /var/log/nginx/access.log
# Tìm kiếm các yêu cầu POST bật thường hoặc các yêu cầu đến các tệp đáng ngờ
# Ví dụ: tìm kiếm các yêu cầu POST lớn (thường là tải lên webshell)
grep "POST /" /var/log/apache2/access.log | awk '{print $1, $7, $NF}' | sort | uniq -c | sort -nr | head -n 20
# Kiểm tra các lỗi trong error log
tail -f /var/log/apache2/error.log
tail -f /var/log/nginx/error.log
# Kiểm tra nhật ký xác thực để tìm các nỗ lực đăng nhập SSH thất bại
tail -f /var/log/auth.log
💡 Mẹo: Tìm kiếm các địa chỉ IP lạ, các yêu cầu đến các tệp không tồn tại, hoặc các yêu cầu POST với kích thước dữ liệu lớn bất thường.
Troubleshooting
-
Lỗi thường gặp: Phát hiện sai (False Positives)
- Cách xử lý: Các công cụ quét hoặc các lệnh
grepcó thể gắn cờ các tệp hợp pháp vì chúng chứa các chuỗi hoặc hàm tương tự như webshell. Luôn luôn kiểm tra thủ công các tệp được gắn cờ. Đọc mã nguồn, hiểu chức năng của nó trước khi xóa. Nếu bạn không chắc chắn, hãy tìm kiếm thông tin về tệp đó trên mạng hoặc tham khảo ý kiến chuyên gia bảo mật.
- Cách xử lý: Các công cụ quét hoặc các lệnh
-
Lỗi thường gặp: Webshell bị mã hóa hoặc làm rối (Obfuscated)
- Cách xử lý: Kẻ tấn công thường mã hóa webshell để tránh bị phát hiện. Các lệnh
grepđơn giản có thể không tìm thấy chúng. Trong trường hợp này, các công cụ quét chuyên dụng như Maldet với cơ sở dữ liệu dấu hiệu cập nhật sẽ hiệu quả hơn. Bạn cũng có thể sử dụng các công cụ giải mã trực tuyến hoặc viết script PHP để giải mã thủ công nếu bạn có thể xác định phương pháp mã hóa.
- Cách xử lý: Kẻ tấn công thường mã hóa webshell để tránh bị phát hiện. Các lệnh
-
Lỗi thường gặp: Không có quyền truy cập tệp/thư mục
- Cách xử lý: Đảm bảo bạn đang chạy các lệnh với quyền
sudohoặc là người dùngroot. Nếu bạn chỉ có quyền truy cập FTP, bạn cần yêu cầu quản trị viên hệ thống hỗ trợ.
- Cách xử lý: Đảm bảo bạn đang chạy các lệnh với quyền
Kết Luận
Phát hiện webshell là một quá trình liên tục đòi hỏi sự cảnh giác và kết hợp nhiều kỹ thuật khác nhau. Bằng cách áp dụng các bước trên, bạn có thể tăng cường khả năng phát hiện và loại bỏ các mối đe dọa webshell khỏi máy chủ của mình.
Best practices:
- Cập nhật thường xuyên: Luôn giữ hệ điều hành, máy chủ web, và ứng dụng web (CMS, framework) của bạn được cập nhật lên phiên bản mới nhất.
- Kim soát quyền: Áp dụng nguyên tắc đặc quyền tối thiểu (least privilege). Đảm bảo các tệp và thư mục web có quyền hạn đúng đắn, không cho phép quyền ghi không cần thiết.
- Tường lửa ứng dụng web (WAF): Triển khai WAF để lọc và chặn các yêu cầu độc hại trước khi chúng đến ứng dụng web của bạn.
- Giám sát nhật ký: Thường xuyên kiểm tra nhật ký của máy chủ web và hệ thống để tìm kiếm các hoạt động bất thường.
- Sao lưu định kỳ: Thực hiện sao lưu đầy đủ và định kỳ để có thể khôi phục hệ thống trong trường hợp bị tấn công.
Xem thêm: