- Vậy bot này đang “quét” cái gì?
- 1. Khai thác CVE-2017-9841 — PHPUnit Remote Code Execution
- 2. Tìm kiếm Stripe API Keys
- 3. Tìm kiếm File Môi Trường (.env)
- 4. WordPress Sensitive Files
- 5. Webmin CGI RCE
- 6. n8n Workflow Automation API
- 7. Next.js Internal Endpoints
- 8. Các Vector khác
- Phân tích hành vi bot
- Đặc điểm nhận dạng
- Thông tin nguồn tấn công
- Mối liên hệ với các chiến dịch Botnet
- Cách phòng thủ
- 1. Chặn IP tấn công
- 2. Chặn truy cập vendor/ và .env
- 3. Cấu hình Fail2Ban
- 4. Kiểm tra và cập nhật PHPUnit
- 5. Kiểm tra IOCs (Indicators of Compromise)
- 6. Sử dụng WAF
- Kết luận
- Tham khảo
Vậy bot này đang “quét” cái gì?
Nói đơn giản, đây là hình thức mass vulnerability scanning kết hợp credential harvesting. Bot này không biết website của bạn chạy gì, nó chỉ bắn hàng loạt payload vào mọi IP public và chờ xem cái nào trúng đích. Giống như một tên trộm đi thử chìa khóa từng ngôi nhà trong khu phố — không biết nhà nào mở cửa, nhưng thử đủ thì sẽ có nhà mở.
1. Khai thác CVE-2017-9841 — PHPUnit Remote Code Execution
Đây là vector tấn công chính. Bot đã thử truy cập file eval-stdin.php của PHPUnit qua nhiều đường dẫn khác nhau:
/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php/laravel/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php/yii/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php/zend/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php/lib/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php/vendor/phpunit/phpunit/Util/PHP/eval-stdin.php
CVE-2017-9841 là lỗ hổng RCE trong PHPUnit phiên bản trước 4.8.28 và 5.x trước 5.6.3. File eval-stdin.php chứa dòng code eval('?>'.file_get_contents('php://input')), cho phép attacker thực thi mã PHP tùy ý qua HTTP POST request. Đây là một trong những lỗ hổng được khai thác nhiều nhất trong lịch sử web application security, với CVSS 9.8 (Critical) và EPSS 94.2%.
Bot đã thử nhiều đường dẫn khác nhau để tìm PHPUnit trong các vị trí cài đặt không chuẩn, phản ánh chiến thuật path enumeration tinh vi của các công cụ mass-scanning hiện đại.
2. Tìm kiếm Stripe API Keys
Bot đã quét hàng loạt đường dẫn liên quan đến Stripe:
/stripe-keys.json/config/stripe.json/.stripe//stripe/.env/.well-known/stripe//stripe.yaml/stripe.env/payment/stripe.json/config/stripe.yaml
Đây là hình thức credential harvesting — tìm kiếm các file chứa API keys của Stripe để đánh cắp thông tin thanh toán, sau đó có thể sử dụng cho các giao dịch gian lận hoặc bán trên chợ đen.
3. Tìm kiếm File Môi Trường (.env)
Các request tìm kiếm file .env và .env.local nhằm thu thập thông tin nhạy cảm như database credentials, API keys, JWT secrets, và các biến môi trường khác.
4. WordPress Sensitive Files
Bot quét các file nhạy cảm của WordPress:
/wp-config.php— File cấu hình chứa DB credentials/wp-login.php— Trang đăng nhập admin/wp-admin/— Dashboard quản trị
5. Webmin CGI RCE
Nhiều request nhắm vào các script CGI của Webmin:
/software/install-updates.cgi/package-updates/download.cgi/package-updates/perform.cgi/package-updates/yum.cgi/servers/save.cgi/proc/index.cgi/package-updates/apt.cgi
Đây là các endpoint quản trị hệ thống của Webmin, thường bị khai thác để thực thi lệnh từ xa.
6. n8n Workflow Automation API
Nhiều request nhắm vào REST API của n8n:
/rest/variables/rest/settings/rest/credentials-for-node/rest/node-types/rest/logout/rest/oauth2-credential/auth
n8n là công cụ automation workflow phổ biến. Bot đang tìm cách truy cập các endpoint quản lý credentials và settings.
7. Next.js Internal Endpoints
Nhiều request nhắm vào các endpoint nội bộ của Next.js:
/_next/_next/image/_next/data/*/index.json/_next/data/*/about.json/_rsc/__rsc/__nextjs_action/.action
Các endpoint này có thể bị khai thác để lấy thông tin nội bộ của ứng dụng Next.js hoặc thực thi các server actions không được phép.
8. Các Vector khác
- GraphQL:
/graphql— Tìm kiếm introspection để lấy schema - SharePoint:
/_vti_bin/*,/_api/*,/_layouts/15/* - MongoDB:
/:27017— Quét cổng MongoDB mặc định - Wildcard scanning:
/*,/admin/*,/api/*,/dashboard/*,/cms/*,/media/*,/publish/*,/billing/*,/pages/*,/console/*,/manage/*,/chat/*,/webhook-waiting/*,/actions/*,/products,/docs,/signup,/[[...optional]]
Phân tích hành vi bot
Đặc điểm nhận dạng
- Tốc độ cực nhanh: Hàng chục ngàn request trong vài phút
- Đơn nguồn: Tất cả request từ một điểm xuất phát duy nhất
- Đa vector: Kết hợp RCE, credential harvesting, và reconnaissance
- Path enumeration: Thử nhiều đường dẫn cho cùng một lỗ hổng
- Không có User-Agent đặc trưng: Có thể sử dụng User-Agent phổ thông để tránh phát hiện
Thông tin nguồn tấn công
IP nguồn thuộc dải được đăng ký bởi một nhà cung cấp hosting tại châu Âu. Theo dữ liệu từ AbuseIPDB, IP này đã bị báo cáo hàng nghìn lần từ hàng trăm nguồn khác nhau. Đây là một IP đã bị gắn cờ rõ ràng trong cộng đồng bảo mật.
Mối liên hệ với các chiến dịch Botnet
Các mẫu quét này có đặc điểm rất giống với các chiến dịch của botnet Androxgh0st — một malware Python-based được FBI và CISA cảnh báo. Androxgh0st khai thác CVE-2017-9841 kết hợp với việc tìm kiếm file .env để đánh cắp credentials AWS, Office 365, Twilio, và Stripe. Ngoài ra, các botnet khác như Kinsing, KashmirBlack, Sysrv, và RondoDox cũng sử dụng chiến thuật tương tự.
Cách phòng thủ
1. Chặn IP tấn công
Thêm IP vào blacklist ngay lập tức tại tầng firewall hoặc WAF:
# Nginx
location / {
deny xxx.xxx.xxx.xxx;
# ...
}
# Apache
<RequireAll>
Require all granted
Require not ip xxx.xxx.xxx.xxx
</RequireAll>
# Cloudflare / WAF
Thêm rule block IP xxx.xxx.xxx.xxx
2. Chặn truy cập vendor/ và .env
# Nginx
location ~* /(vendor|\.env) {
deny all;
return 403;
}
# Apache
<DirectoryMatch "vendor|\.env">
Require all denied
</DirectoryMatch>
3. Cấu hình Fail2Ban
[phpunit-scan]
enabled = true
filter = phpunit-scan
logpath = /var/log/nginx/access.log
maxretry = 1
findtime = 60
bantime = 86400
# Filter: /etc/fail2ban/filter.d/phpunit-scan.conf
[Definition]
failregex = ^<HOST>.*(eval-stdin\.php|\.env|wp-config\.php).*
4. Kiểm tra và cập nhật PHPUnit
Nếu website sử dụng PHP, đảm bảo:
- Không đưa thư mục
vendor/lên production - Chạy
composer install --no-devkhi deploy - Cập nhật PHPUnit lên phiên bản 4.8.28+ hoặc 5.6.3+
5. Kiểm tra IOCs (Indicators of Compromise)
Nếu đã từng có file eval-stdin.php hoặc .env trên server:
- Kiểm tra access log cho các POST request đến
eval-stdin.php - Tìm kiếm webshell mới được upload
- Kiểm tra cron jobs và scheduled tasks bất thường
- Rà soát file hệ thống có dấu hiệu bị sửa đổi
6. Sử dụng WAF
Cấu hình WAF rules để chặn các pattern quét phổ biến:
- Block request đến
*/eval-stdin.php - Block request đến
*.env,.env.* - Block request đến
wp-config.php - Rate limiting cho các request bất thường
Kết luận
Đợt quét này là một ví dụ điển hình của automated mass vulnerability scanning trong thời đại hiện nay. Bot không cần biết website của bạn chạy gì — nó chỉ cần bắn hàng loạt payload vào mọi IP public, hy vọng một trong số đó sẽ trúng đích. Điều đáng lo ngại là CVE-2017-9841 đã gần 9 năm tuổi nhưng vẫn là một trong những lỗ hổng được khai thác nhiều nhất, với hơn 80,000 lần tấn công chỉ trong 30 ngày gần đây.
Thực tế cho thấy, chỉ cần một file eval-stdin.php bị quên xóa hoặc một file .env bị expose, attacker có thể chiếm quyền toàn bộ hệ thống trong vài giây. Việc duy trì hygiene cơ bản — không đưa dev dependencies lên production, chặn truy cập thư mục nhạy cảm, và giám sát log thường xuyên — là những biện pháp đơn giản nhưng hiệu quả nhất để bảo vệ website khỏi các đợt quét tự động như thế này.
Hãy kiểm tra log của bạn ngay hôm nay. Có thể bot đã ghé thăm mà bạn không hề hay biết.
Tham khảo
- CVE-2017-9841 — NVD National Vulnerability Database
- FBI/CISA Joint Advisory on Androxgh0st Malware
- VulnCheck Blog: “9 Year-Old PHP Vulnerability Keeps Swinging”
- AbuseIPDB — IP Reputation Database
- FortiGuard Labs — PHPUnit RCE Outbreak Alert
Bình luận