WP-SHELLSTORM: 25.000 Site WordPress Bị Cài Webshell, Hướng Dẫn Kiểm Tra Và Dọn Sạch A-Z

Tuần trước, một nhóm nghiên cứu an ninh mạng tình cờ phát hiện một server hacker để hở suốt 22 ngày — bên trong là toàn bộ công cụ, log, và danh sách 1,4 triệu website bị nhắm. Campaign này có tên WP-SHELLSTORM, và nó đã backdoor thành công hơn 25.000 site WordPress.

Điều đáng sợ nhất: hacker không cần kỹ thuật gì cao siêu. Chúng chỉ quét lỗ hổng cũ trong plugin Breeze Cache (CVE-2026-3844), ném webshell vào, rồi bán access cho ai trả tiền. Trong bài này, mình sẽ hướng dẫn bạn kiểm tra site có bị nhiễm không, và cách dọn sạch từ A đến Z.

WP-SHELLSTORM WordPress webshell attack - server security monitoring dashboard showing infected files
WP-SHELLSTORM exploit 27 lỗ hổng plugin WordPress, cài webshell âm thầm và bán access trên thị trường chợ đen

WP-SHELLSTORM La Gi Va Tai Sao No Khac Cac Campaign Khac?

WP-SHELLSTORM không phải ransomware hay phishing. Nó là một webshell access brokerage — nhóm hack hàng loạt site, cài backdoor ẩn, rồi bán quyền truy cập cho bên thứ ba. Người mua có thể là ransomware gang, SEO spammer, hay hacker muốn lấy cắp dữ liệu.

Điều này nghĩa là nếu site bạn bị nhiễm, bạn không đối mặt với một kẻ thù. Backdoor đó có thể bị bán đi bán lại, và mỗi người mua có mục đích khác nhau. Một webshell giá 30 USD trên chợ đen có thể trở thành đòi chuộc 60.000 USD hai tháng sau.

Hacker Da Khac Nhau Nhu The Nao?

Nhóm này sử dụng server thuê ở Mỹ (IP 137.175.93[.]126), chạy Python SimpleHTTPServer không mật khẩu. Tổng cộng 800MB data gồm: webshell payloads, exploit scripts, scan results, và command history của chính hacker.

Theo SOCRadar và Ctrl-Alt-Intel (hai đội independently phát hiện), toolkit của chúng nhắm 27 lỗ hổng đã biết, nhưng phần lớn thành công đến từ một CVE duy nhất:

  • CVE-2026-3844 (CVSS 9.8): Lỗ hổng unauthenticated arbitrary file upload trong plugin Breeze Cache (by Cloudways), ảnh hưởng tất cả phiên bản đến 2.4.4. Hàm fetch_gravatar_from_remote cho phép upload file PHP mà không cần xác thực.
  • CVE-2026-48907: Lỗ hổng trong Joomla JCE Editor, đã vào danh sách KEV của CISA.
  • CVE-2026-1969: Lỗ hổng trong ThemeREX Addons WordPress plugin.

Lưu ý quan trọng: CVE-2026-3844 chỉ kích hoạt khi setting “Host Files Locally – Gravatars” được bật. Setting này mặc định tắt, nhưng rất nhiều site Cloudways đã bật nó lên. Hacker khai thác hơn 45.000 target và log hơn 17.000 thành công từ lỗ hổng này alone.

Cach Kiem Tra Site WordPress Co Bi Nhiem WP-SHELLSTORM Khong

Bước đầu tiên mình luôn làm là scan toàn bộ web root tìm webshell artifacts. Hacker sử dụng các filename đặc trưng, giúp phát hiện dễ dàng nếu bạn biết tìm gì.

Buoc 1: Scan webshell artifacts bang SSH

# SSH vào server, cd vào web root
cd /var/www/yoursite.com/public_html

# Tìm các filename đã biết
find . -name "down.php" -o -name ".bd.php" -o -name ".wp-log.php" -o -name ".brq-*.php" 2>/dev/null

# Tìm file PHP ẩn trong thư mục không nên có PHP
find ./wp-content/uploads/ -name "*.php" 2>/dev/null
find ./wp-content/cache/ -name "*.php" 2>/dev/null

# Tìm file PHP recently modified (7 ngày gần đây)
find . -name "*.php" -mtime -7 -not -path "./wp-admin/*" -not -path "./wp-includes/*" 2>/dev/null

Nếu tìm thấy bất kỳ file nào trong upload/cache directory, mở nội dung kiểm tra. Webshell thường bắt đầu bằng eval(gzinflate(base64_decode( hoặc eval(str_rot13( — đây là dấu hiệu obfuscation 4 lớp mà researcher đã phát hiện.

Buoc 2: Kiem Tra Breeze Cache Plugin

# Kiểm tra phiên bản Breeze Cache đang chạy
wp plugin list | grep breeze

# Kiểm tra setting "Host Files Locally - Gravatars"
wp option get breeze_options | grep gravatar

Nếu phiên bản dưới 2.4.5, cập nhật ngay lập tức. Nếu setting Gravatar local hosting đang bật, site bạn nằm trong danh sách target tiềm năng.

# Cập nhật Breeze Cache lên 2.4.5+
wp plugin update breeze

# Hoặc nếu không dùng, gỡ hẳn
wp plugin deactivate breeze && wp plugin uninstall breeze

Buoc 3: Quet Bang Wordfence Hoac Plugin Security

Mình luôn khuyên cài Wordfence (free version đủ dùng) để scan. Wordfence có signature database nhận diện các webshell variant phổ biến:

# Cài Wordfence qua WP-CLI
wp plugin install wordfence --activate

# Sau đó vào Wordfence > Scan > Start New Scan
# Wordfence sẽ flag mọi file nghi ngờ

Nếu không muốn cài plugin, dùng CLI scan thủ công:

# Tìm string đáng ngờ trong tất cả file PHP
grep -rl "eval(gzinflate" ./wp-content/ 2>/dev/null
grep -rl "base64_decode.*eval" ./wp-content/ 2>/dev/null
grep -rl "str_rot13.*eval" ./wp-content/ 2>/dev/null

# Tìm file PHP có kích thước bất thường (webshell thường < 50KB)
find ./wp-content/ -name "*.php" -size -50k -exec grep -l "eval\|exec\|system\|passthru" {} \; 2>/dev/null

Cach Don Sach Webshell Neu Site Da Bi Nhiem

Nếu phát hiện site bị nhiễm, đừng hoảng. Mình sẽ đi qua từng bước dọn sạch từ A đến Z. Nguyên tắc: xóa backdoor, patch lỗ hổng, và đảm bảo hacker không quay lại được.

Buoc 1: Backup trang thai hien tai

# Backup toàn bộ code và database TRƯỚC khi dọn
mkdir -p /tmp/wordpress-incident-$(date +%Y%m%d)

# Backup code
tar -czf /tmp/wordpress-incident-$(date +%Y%m%d)/code-backup.tar.gz \
  /var/www/yoursite.com/public_html/

# Backup database
wp db export /tmp/wordpress-incident-$(date +%Y%m%d)/db-backup.sql

Backup này phòng trường hợp dọn xong vẫn cần xem lại file bị infect để điều tra nguyên nhân.

Buoc 2: Xoa tat ca webshell artifacts

# Xóa các file webshell đã biết
cd /var/www/yoursite.com/public_html

# Liệt kê trước khi xóa để review
find . -name "down.php" -o -name ".bd.php" -o -name ".wp-log.php" -o -name ".brq-*.php" > /tmp/suspicious-files.txt
cat /tmp/suspicious-files.txt

# Xóa từng file sau khi đã confirm
while read file; do
    rm -f "$file"
    echo "Deleted: $file"
done < /tmp/suspicious-files.txt

# Xóa file PHP không thuộc WordPress core
find ./wp-content/uploads/ -name "*.php" -delete
find ./wp-content/cache/ -name "*.php" -delete

Buoc 3: Kiem tra admin user bat thuong

Hacker thường tạo admin user ẩn để giữ access ngay cả khi webshell bị xóa. Kiểm tra ngay:

# Liệt kê tất cả admin users
wp user list --role=administrator --fields=ID,user_login,user_email,user_registered

# Xóa admin user lạ
wp user delete <suspicious_user_id> --reassign=1

Mình từng thấy hacker tạo user với tên rất hợp lý như “wp_system”, “editor_backup”, “content_admin”. Kiểm tra kỹ ngày tạo và email. Nếu thấy user nào không phải bạn hoặc team tạo, xóa ngay.

Buoc 4: Reset password va API keys

# Reset password tất cả admin users
wp user update 1 --user_pass="$(openssl rand -base64 16)"

# Re-generate WordPress security keys
# Lấy key mới từ https://api.wordpress.org/secret-key/1.1/salt/
# Rồi thay toàn bộ block AUTH_KEY trong wp-config.php

# Revoke tất cả application passwords
wp user list --field=ID | xargs -I{} wp user application-password list {} --field=uuid | xargs -I{} wp user application-password delete <user_id> {}

Buoc 5: Cập nhật tat ca plugin va theme

# Cập nhật toàn bộ
wp core update
wp plugin update --all
wp theme update --all

# Kiểm tra plugin không còn maintained (nguy cơ cao)
wp plugin list --fields=name,version,update_version,last_updated --format=table

Nếu plugin nào last_updated hơn 1 năm, nghiêm túc xem xét thay thế. Plugin không được maintain là vector tấn công lớn nhất trong WordPress.

Cach Ngan Ngua Webshell Attack Về Lau Dai

Sau khi dọn sạch, đây là các bước phòng thủ mình áp dụng cho mọi site WordPress mà mình quản lý:

1. Bat WAF (Web Application Firewall)

Cloudflare miễn phí đã chặn được phần lớn exploit attempts. WP-SHELLSTORM nhắm 27 CVE, và Cloudflare đã chủ động block các pattern khai thác. Kích hoạt WAF ở级别 Medium trở lên.

# Nếu dùng Cloudflare, đảm bảo Bot Fight Mode bật
# Security > Bots > Bot Fight Mode: ON

# Nếu dùng Wordfence WAF
# Wordfence > Firewall > Basic Firewall Options: Enabled and Protecting

2. Vô hieu hoa PHP execution trong uploads

Đây là biện pháp hiệu quả nhất chống file upload attack. Tạo file .htaccess trong wp-content/uploads/:

# /var/www/yoursite.com/public_html/wp-content/uploads/.htaccess
<Files *.php>
    Require all denied
</Files>

Hoặc nếu dùng Nginx, thêm vào server block:

# Nginx config
location ~* /wp-content/uploads/.*\.php$ {
    deny all;
}

Nếu dùng OpenLiteSpeed, cấu hình tương tự qua .htaccess vì OLS đọc .htaccess.

3. Cai dat file integrity monitoring

Wordfence Premium (hoặc free với giới hạn) có tính năng scan định kỳ và email báo động khi file thay đổi. Nếu muốn giải pháp miễn phí hoàn toàn, tạo script monitor đơn giản:

#!/bin/bash
# /usr/local/bin/wp-file-monitor.sh
# Thêm vào crontab chạy mỗi giờ

WEB_ROOT="/var/www/yoursite.com/public_html"
HASH_FILE="/var/lib/wp-monitor/hashes.txt"

mkdir -p /var/lib/wp-monitor

# Tạo hash mới
find "$WEB_ROOT" -name "*.php" -exec md5sum {} \; > /tmp/hashes-new.txt

# So sánh với lần trước
if [ -f "$HASH_FILE" ]; then
    DIFF=$(diff "$HASH_FILE" /tmp/hashes-new.txt)
    if [ -n "$DIFF" ]; then
        echo "$DIFF" | mail -s "[ALERT] WordPress file changed" [email protected]
    fi
fi

mv /tmp/hashes-new.txt "$HASH_FILE"

4. Automate plugin updates

Plugin cũ là nguyên nhân số một. Mình luôn bật auto-update cho minor versions:

# Bật auto-update cho tất cả plugin
wp config set WP_AUTO_UPDATE_CORE minor --type=constant
wp plugin auto-updates enable --all
wp theme auto-updates enable --all

Bai Hoc Tu WP-SHELLSTORM Cho Moi Webmaster

WP-SHELLSTORM không dùng kỹ thuật gì mới. 27 lỗ hổng đều đã có patch. Hacker chỉ cần quét Internet tìm site chưa update. Phần lớn 25.000 site bị nhiễm chỉ vì chủ web quên cập nhật plugin hoặc không biết plugin Breeze Cache có setting nguy hiểm.

Server của hacker để hở 22 ngày là do sơ ý, nhưng damage đã done. 25.000 backdoor đang tồn tại trên Internet, và nhiều chủ site chưa biết mình đã bị nhiễm. Nếu bạn chạy WordPress, hôm nay là ngày kiểm tra.

Nhắc lại: update Breeze Cache lên 2.4.5+, vô hiệu hóa PHP execution trong uploads/, và scan webshell ngay. Ba bước này mất 30 phút nhưng có thể tiết kiệm hàng nghìn USD chi phí incident response.

Cho mình biết ở phần bình luận nếu bạn phát hiện file nào đáng ngờ trên site, mình sẽ giúp phân tích.

Thanh Tùng

Mình là Thanh Tùng. Bạn bè gọi mình là "bác sĩ máy tính" vì hễ máy nào có vấn đề là mình muốn mò vào xem sao. Mình viết hướng dẫn theo cách mà mình mong người khác đã viết cho mình ngày xưa — từng bước rõ ràng, không bỏ sót, và nói luôn cái gì hay bị lỗi. Ngoài giờ làm mình chơi guitar, nuôi mèo, và có một con VPS riêng dành riêng cho việc cài thử đủ thứ linh tinh.

Xem tất cả bài viết →

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *