Bối cảnh
Website chạy WP và bị tấn cổng kiểu “Random URL“.
Đặc điểm nhận diện:
- Sử dụng method GET
- URL random bộ charset “a-z” và “A-Z”, không chứa số, ký tự đặc biệt
- Độ dài từ 4-10 ký tự
- HTTP version 2.0
- IP phần lớn nước ngoài
- User-Agent, Referer đều random
- Số lượng khoảng hơn 5000 IP
Giải quyết
Có nhiều hướng tiếp cận để giải quyết:
- Chặn theo GeoIP
- Limit rate để lọc IP => chặn theo
- Limit rate IP quốc tế
- Challenge IP quốc tế
- Chặn Header Proxy
Tuy nhiên vì không có nhiều thời gian, nên ở đây mình chọn hướng tiếp cận nhanh gọn: parse log realtime và đẩy vào firewall. Mình chọn hướng này vì các bạn có xem stream của mình về DDoS sẽ dễ dàng nhận kiểu attack này thông qua proxy, số lượng IP là hữu hạn (vì không fake được IP). Chặn hết IP botnet là xong.
Vì số lượng IP lớn, nên mình dùng ipset:
Khởi tạo set
ipset create BLACKLIST hash:ip
Inject rule vào iptables (table filter – chain INPUT): match IP trong BLACKLIST thì DROP
iptables -A INPUT -p tcp -m set --match-set BLACKLIST src -j DROP
Câu lệnh quan trọng nhất và cũng là trick mình muốn chia sẻ hôm nay: tail log realtime kết hợp với grep để đẩy IP vào firewall
tail abc.com-access_log -f | egrep --line-buffered "GET (/[a-zA-Z]{4,10} HTTP/2.0)" | egrep --line-buffered -v "admin|login" | awk '{print $1}' | while read ip ; do echo "Blocking: $ip"; ipset -exist add BLACKLIST $ip; done
Giải thích:
- tail abc.com-access_log -f: theo dõi log realtime, cập nhật các dòng log mới
- egrep –line-buffered “GET (/[a-zA-Z]{4,10} HTTP/2.0)”: lọc ra các request có dấu hiệu giống với tấn công như mô tả ở trên. Tham số cần lưu ý là “line-buffered” để chạy realtime kết hợp với “tail -f”. Nếu ko có cái này, lệnh egrep chỉ chạy 1 lần và ko cập nhật entry mới
- egrep –line-buffered -v “admin|login”: whitelist các URL false positive
- awk ‘{print $1}’ | while read ip ; do echo “Blocking: $ip”; ipset -exist add BLACKLIST $ip; done: Lấy IP và cập nhật vào danh sách BLACKLIST
Trích: Nguyễn Hưng (Bo) – Admin Vietnix