Hành trình tìm kiếm CVE của Joomla (Phần 2)

Cũng khá lâu rồi chưa viết được thêm gì, nhân tiện thì cũng viết về CVE-2020-10239: Incorrect Access Control in com_fields SQL field CVSS 2.0:6.5 và CVSS 3.x :8.8

Bài này mình sẽ phân tích lỗi này.

Mặc dù có nhiều lỗi nhưng đa phần đều yêu cầu quyền người dùng khá là cao, nên mình cũng đã quyết tìm cho mình một cái CVE xịn xò xíu.

Như phần trước đã đề cập, ở Joomla cho quản trị backend sẽ là 3 quyền: Manager để quản lý các bài viết, Administrator để quản lý người dùng và thêm vài chức năng riêng, còn cấp cao nhất là người dùng Super User thì sẽ làm mọi thứ, bao gồm cả RCE.

Yêu cầu:

Với CVE này, thì chỉ cần yêu cầu người dùng là Manager thôi và phiên bản : Từ Joomla core 3.7.0 đến 3.9.15.

Như phần mô tả của CVE thì đó là cho phép người với quyền Manager sẽ thực thi câu lệnh SQL tùy ý mà chỉ có người dùng Super User làm được, kể cả Administrator cũng không được phép.

Khai thác:

Để truy cập vào thành phần này thì yêu cầu tài khoản Manager nhé:

domain/administrator/index.php?option=com_fields&context=com_content.article

Chọn New , tại trường Type chọn như hình và kết quả:

Điền tùy ý và kết quả nhận được sau khi Save là:

Thông báo chỉ ra rằng chỉ có người dùng với quyền Super User mới được phép tạo trường SQL.

Sẽ là vấn đề như sau: Mình đã thử kịch bản: Tạo một cái type được phép như là Text và Save lại thì điều này hoàn toàn hợp lý. Nhưng sau khi Save, mình sẽ sửa tham số tại trường Type từ text sang sql và kết quả mong đợi là sẽ cập nhật được câu lệnh sql tùy ý.

Bắt tay vào làm như sau:

Tạo như hình và Save lại.

Thực hiện Save lại lần nữa, nhưng sẽ dùng Burpsuite để bắt request này và sửa đổi theo kịch bản đã được thiết lập:

Từ request bắt được chứa tham số jform%5Btype%5D=text, trong đó chỉ ra là loại Type là gì. Sửa thành sql như sau:

Forward và kết quả:

Kéo xuống có phần để thêm câu lệnh SQL tùy ý

Để khai thác được cái này, thực sự là mình đã đọc rất nhiều ở phần tài liệu của Joomla mới tìm ra được là chèn câu lệnh SQL như thế nào.

Vậy, rõ ràng là mình đã chuẩn bị sẵn rồi, các bạn chỉ cần dùng thôi, và nó sẽ có dạng như sau:

Ở đây thể hiện là ở bảng user_usergroup_map sẽ gắn định danh người dùng ứng với nhóm quyền, nhóm quyền cao nhất là 8. Do đó mình sẽ cập nhật từ 6 lên 8 để đạt được nhóm quyền cao nhất là Super User. Như các bạn đã biết trước bảng cần có thuộc tính table prefix, tiền tố của bảng, nếu không biết được nó thì rất khó để truy xuất các thuộc tính của bảng. Rất may là Joomla có hỗ trợ là chỉ cần đặt #__ là nó sẽ tự hiểu và làm cho mình. Còn thuộc tính user_id chính là định danh của mình, ví dụ là 76.

UPDATE #__user_usergroup_map SET group_id = 8 WHERE user_id=76 AND group_id=6

Sẽ có nhiều ý tưởng là sao không lấy session của Super User, cái này có nhược điểm là Super User không đăng nhập thì sẽ không có để lấy, phụ thuộc vào Super User. Tiếp đến là thực thi RCE luôn, điều này lại phụ thuộc vào tài khoản người dùng của hệ quản trị có thực thi được hay không, do đó không phải là giải pháp hay. Giải pháp được đưa ra là cập nhật quyền cho chính mình và thực thi RCE luôn, không phụ thuộc bất kỳ điều gì cả.

Kết quả là:

Vấn đề lại vấn đề , Save được rồi đấy, vậy làm sao để kích hoạt nó.

Sau khi nghiên cứu để trigger nó sẽ như sau:

Chỉ cần vào phần tạo mới New một Article thì nó sẽ tự kích hoạt cho mình:

Và làm mới trang và kết quả sau cùng:

Khi đã là Super User rồi thì trigger RCE qua bài trước mình đã đề cập.

http://hocvahoc.me/index.php/2020/03/13/hanh-trinh-tim-kiem-cve-cua-joomla-phan-1/

Nguồn gốc của vấn đề

Bây giờ sẽ phân tích mã nguồn tại sao có lỗi này:

File code chứa lỗi có tại đây:

plugins/fields/sql/sql.php

Tại hàm onContentBeforeSave việc kiểm tra điều kiện bị sai. Tại đó, nó kiểm tra xem xem cái trường field này xem có phải là tạo mới hay không bằng tham số isNew. Vấn đề này đã bị kịch bản ban đầu đưa ra đánh bại vì rõ ràng khi đã tạo thì không phải là com_field với fields là mới nữa. Còn nếu ta tạo ngay từ đầu thì đã bị từ chối. Vấn đề phát sinh là do không kiểm tra việc cập nhật.

Ngay sau đó, Joomla đã vá lỗi bằng việc bỏ tham số kiểm tra isNew như hình trên.

Kết quả:

CVE -2020 -10239 cho phép RCE

Khuyến cáo:

Cập nhật ngay lên phiên bản từ 3.9.16

Mã nguồn khai thác tự động:

https://github.com/HoangKien1020/CVE-2020-10239