CVE-2024-42327
Shut up, be better
Overview
Hello, chào mọi người đây là bài blog phân tích CVE đầu tiên của 0x1ceKing mong rằng bản thân có thể phân tích thêm nhiều lỗ hổng 1day và kiếm cho mình được 0day trong thời gian tới hihi. Không để rong dài thì nay mình sẽ phân tích lỗ hổng CVE-2024-42327 trên Zabbix.
Zabbix là một ứng dụng mã nguồn mở dùng để giám sát hệ thống và mạng, giúp người dùng có thể theo dõi hiệu suất, tình trạng của máy chủ, thiết bị mạng, ứng dụng và dịch vụ. Sử dụng Search Engine ta thấy được Zabbix được dùng nhiều ở Brazil, Mỹ...

Lỗ hổng SQL Injection (SQLi) ở CVE-2024-42327 này tồn tại trong class CUser, cụ thể là trong hàm addRelatedObjects. Hàm này được gọi từ hàm CUser.get, Mọi tài khoản có quyền truy cập vào API đều có thể truy vấn được đến hàm này.
Affected Software
CVE này ảnh hưởng trên các phiên bản từ 6.0.0-6.0.31 / 6.4.0-6.4.16 / 7.0.0
Classification: SQL Injection ( SQLi)
CVSS Score: 9.9 (Critical)
ZABBIX API
Đầu tiên để hiểu được lỗ hổng trên cần hiểu được cách Zabbix -> Authentication, Authorization methods và user.get API của Zabbix
May mắn thay Zabbix có cả API docs hướng dẫn trên trang chủ:


Description và example của API user.get :
Từ đó ta có thể dùng example của API trên để làm Unit Test cho CVE này.
Patch Analysis - Find endpoints
Vì đây là một lỗ hổng đã phát hiện từ ngày 27 tháng 11 nên đã có bản vá. Vậy công việc giờ đơn giản hơn không cần mò cả source code mà chỉ cần tìm và xem diff code.
Git commit link: here
May mắn là nhờ description ta biết được source của CVE này nằm trong API user.get nên không cần truy ngược những nơi gọi hàm addRelatedObjects nữa.

Dòng 1977 → 1982: Các dòng code trên tạo Database Raw Select Query → DBselect() là 1 Dangerous Function. Từ đó ta sẽ trace theo các tham số được input vào câu query trên.
Từ đó trace theo các dữ kiện như: userid, selectRole
Technical Analysis

Trace code trong ui/include/classes/api/services/CUser.php ta thấy userids, selectRole chúng được define ở hàm get :
Ở đây hàm get() trong class CUser được sử dụng để lấy thông tin người dùng từ database.Hàm này là core function để truy xuất thông tin user trong Zabbix API.

Từ dòng 116 → 120 tham số userids đã bị filter → Từ đó không thể kích hoạt lỗ hổng bằng Option trên.
⇒ Tuy nhiên khi phân tích code ở hàm get() , cũng như addRelatedObjects() ta đều không thấy Option selectRole bị Filter hoặc Sanitization. Từ đó tìm được source dẫn tới sink.
Root Cause: Bản chất lỗ hổng trên do các Untrusted Data từ các giá trị của Option selectRole trong API user. Các giá trị này do người dùng kiểm soát không được Sanitization/Validation mà rơi thẳng vào câu lệnh RAW SELECT SQL FUNCTION = DBselect() → Từ đó dẫn đến lỗ hổng.
Minimal PoC
Mình có viết một PoC với Payload được Minimal dùng để assume lỗ hổng trên hệ thống.
Bản thân mình còn nợ 1 exploit code hoàn chỉnh cho CVE này.
Source code: https://github.com/0x1ceKing/Zabbix-6.0.31
Các cách tối ưu hóa Blind Injection có các tài liệu tham khảo sau:
List các Impact và các cách có thể thực thi nó:
Dump Database →
True/False,Time-based,Out-of-band (OOB)=Gửi dữ liệu ra ngoàiRCE using →
sys_exec(),SELECT ... INTO OUTFILE,User-Defined Function
Bài phân tích xin được kết thúc ở đây cảm ơn các bạn đã đọc 🔆w🍄
Last updated
