Tóm tắt
Trong thế giới an ninh mạng, có những lỗ hổng cực kỳ nguy hiểm nhưng lại đi kèm một yêu cầu nhỏ bé: bạn phải đăng nhập trước đã! Bài viết này chia sẻ câu chuyện của tôi về việc phát hiện lỗi Remote Code Execution (RCE) ảnh hưởng đến hơn 56.000 host trên Nginx Proxy Manager. Lỗi này được ghi nhận với hai mã CVE là CVE-2024-46256 và CVE-2024-46257.
Bối cảnh
Lỗi RCE này tồn tại trong Nginx Proxy Manager, một ứng dụng web phổ biến dùng để quản lý proxy Nginx. Với số lượng host bị ảnh hưởng lên đến hơn 56.000, đây thực sự là một vấn đề nghiêm trọng mà người quản trị hệ thống cần chú ý.
Quá trình phát hiện lỗ hổng
Khi cố gắng tìm ra các CVE, tôi đã dành nhiều thời gian tìm kiếm lỗi trong các dự án mã mở nhưng không thành công. Một buổi chiều, trong lúc mày mò, tôi tình cờ tìm thấy một trang đăng nhập của Nginx Proxy Manager tại GitHub. Nghĩ rằng đây có thể là một cơ hội, tôi quyết định tiến hành điều tra.
Thiết lập hệ thống
May mắn thay, hệ thống này có sẵn Docker file để tạo container. Sau khi hoàn thành quá trình thiết lập đơn giản, tôi có thể truy cập hệ thống với thông tin đăng nhập mặc định: admin@example.com / changeme
. Tôi cũng tải luôn mã nguồn mới nhất để thực hiện nghiên cứu sâu hơn.
Xác định lỗi
Bước đầu tiên là nắm rõ chức năng của hệ thống. Sau khi nhanh chóng hiểu được cấu trúc mã và API, tôi tập trung vào thư mục /nginx-proxy-manager-2.11.3/backend/internal
, nơi có file certificate.js
thu hút được sự chú ý của tôi. Tôi nhận thấy một đoạn mã có vấn đề, đặc biệt là liên quan đến việc nối chuỗi, điều này có thể tạo ra cơ hội cho lỗ hổng Command Injection.
Bằng cách thêm một số ký tự |
, tôi đã thử nghiệm lệnh và xác nhận được rằng mình có thể thực thi thành công các lệnh shell trên hệ thống. Thậm chí, việc lật đổ shell cũng diễn ra suôn sẻ!
Báo cáo lỗ hổng
Sau khi xác nhận lỗi và hoàn tất viết PoC (Proof of Concept), tôi nhanh chóng báo cáo đến CVE qua trang CVE.org. Rất vui mừng khi hai lỗi của tôi đã được cấp CVE với mã tương ứng là CVE-2024-46256 và CVE-2024-46257.
Kết luận
Phương án khắc phục tạm thời
Cho đến lúc này, người dùng nên thực hiện một số biện pháp tạm thời như sau:
- Giới hạn truy cập vào cổng dịch vụ hoặc không để nó công khai trên Internet.
- Thay đổi thông tin đăng nhập mặc định và sử dụng mật khẩu mạnh cho hệ thống này.
- Nếu có thể, sửa lại mã nguồn tại vị trí đã đề cập ở trên.
Tổng kết
Câu chuyện lần này mang lại cho tôi nhiều bài học quý giá và nhắc nhở rằng đôi khi, thành công đến từ những khoảnh khắc bất ngờ. Ngoài ra, luôn nhớ rằng việc nối chuỗi trong các lệnh thực thi tiềm ẩn nhiều rủi ro.
Cập nhật 23/10/2024:
Hệ thống đã được cập nhật để chặn các giá trị khả dĩ gây ra command injection. Bạn có thể xem chi tiết trong commit fix.
source: viblo