Tóm tắt
Gần đây, nhóm nghiên cứu của chúng tôi đã tiến hành kiểm thử bảo mật sản phẩm WhatsUp Gold của Progress Software Corporation và phát hiện ra ba lỗ hổng nghiêm trọng. Đầu tiên là lỗ hổng Remote Code Execution (RCE) không cần xác thực, thứ hai là lỗ hổng RCE yêu cầu xác thực, và thứ ba là lỗ hổng Local File Inclusion (LFI) không cần xác thực. Mặc dù kết quả chưa toàn diện, nhưng nghiên cứu này đã góp phần nâng cao kỹ năng của các thành viên trong đội ngũ.
Giới thiệu
WhatsUp Gold là một công cụ quản lý mạng và giám sát hiệu suất từ Progress Software Corporation (trước đây là Ipswitch). Đây là giải pháp hoàn chỉnh hỗ trợ các tổ chức trong việc quản lý và giám sát cơ sở hạ tầng mạng, bao gồm cả thiết bị mạng và các ứng dụng. WhatsUp Gold được sử dụng rộng rãi trên toàn cầu để đảm bảo độ ổn định và hiệu quả của hạ tầng mạng.
Đặc điểm nổi bật của WhatsUp Gold là khả năng giám sát và quản lý thiết bị từ xa, thu thập thông tin và điều khiển các agent đã được cài đặt.
Thiết lập Công cụ
Quá trình thiết lập công cụ để thực hiện việc kiểm tra bảo mật khá đơn giản. Chúng tôi đã sử dụng ILSpy để trích xuất mã nguồn và Jetbrain Rider để thực hiện gỡ lỗi.
Lỗ hổng RCE qua Upload File Không Hạn Chế (CVE-2024-5008)
Lỗ hổng đầu tiên chúng tôi phát hiện là một lỗ hổng RCE khi thực hiện tải lên file không hạn chế. Bằng cách tìm kiếm hàm WriteAllText
trong mã nguồn, nhóm đã xác định được cách khai thác lỗ hổng này.
csharp
public async Task<HttpResponseMessage> Post(string fileName, int uploadOption)
{
AppProfileImportController importController = this;
if (!importController.Request.Content.IsMimeMultipartContent())
return importController.getResponse(new ResultModel()
{
message = "MESSAGE_ERROR_APPLICATION_IMPORT_BAD_POST",
success = false
});
string str = await (await importController.Request.Content.ReadAsMultipartAsync()).Contents.Last<HttpContent>().ReadAsStringAsync();
EntityAPMApplication app;
try
{
using (StringReader reader = new StringReader(str))
app = importController.getApp(reader);
}
catch
{
return importController.getResponse(new ResultModel()
{
message = "MESSAGE_ERROR_APPLICATION_IMPORT_BAD_FILE",
success = false
});
}
if (uploadOption == 0 && System.IO.File.Exists(importController.getPath(fileName)))
return importController.getResponse(new ResultModel()
{
message = "FILE_EXISTS",
success = false
});
// Xử lý còn lại...
}
Lỗi này nằm trong hàm Post
và cho phép file có tên định dạng nguy hiểm như .cshtml hay .aspx được tải lên máy chủ mà không có cơ chế kiểm tra an toàn, dẫn đến khả năng thực thi mã từ xa (RCE).
Khai thác Lỗ hổng
Để khai thác lỗ hổng này, người dùng cần có quyền import profile. Khi sử dụng shell CSHTML, kẻ tấn công có thể thực thi mã sau khi tải nó lên máy chủ. Điều này cho thấy mặc dù lỗ hổng chỉ có mức độ CVSS 8.8, nhưng còn tiềm ẩn nhiều rủi ro.
Lỗ hổng RCE qua Upload File Không Hạn Chế trên CommunityController (CVE-2024-4884)
Tương tự như lỗ hổng đầu tiên, lỗ hổng thứ hai này cũng dựa vào chức năng upload file nhưng thông qua một API khác. Mã lỗi xuất hiện do việc sử dụng hàm SaveAs
mà không có kiểm tra tên file rõ ràng.
csharp
[HttpPost]
public ActionResult Import(IEnumerable<HttpPostedFileBase> importFiles)
{
// Xử lý import file...
}
Người dùng chỉ cần thực hiện một POST hợp lệ với loại nội dung XML để có thể chèn shell CSHTML vào phần Description
mà không phải lo lắng về vấn đề giới hạn độ dài.
Kết Luận
Cả hai lỗ hổng này cho thấy sự cần thiết phải kiểm tra và xác thực dữ liệu tải lên đúng cách để ngăn chặn các cuộc tấn công bảo mật nghiêm trọng. Nhóm chúng tôi đã học được nhiều bài học quý giá trong quá trình kiểm tra sản phẩm này và hy vọng các thông tin chia sẻ sẽ hữu ích cho cộng đồng bảo mật.