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

VSEC - BLOG Bảo mật cho người mới

Mô tả ngắn gọn về CVE mình tìm được:

  1. CVE-2020-10238: Incorrect Access Control in com_templates (Bài mình nói về cái này) CVSS 2.0:5.0 và CVSS 3.x :7.5
  2. CVE-2020-10239: Incorrect Access Control in com_fields SQL field CVSS 2.0:6.5 và CVSS 3.x :8.8
  3. CVE-2020-10241: CSRF in com_templates image actions CVSS 2.0:6.8 và CVSS 3.x :8.8
  4. Và còn … cái nữa nhưng họ đang thảo luận sửa lỗi sao cho đúng nên họ hẹn bản cập nhật sau. Đồng nghĩa là mình chưa thể public cách khai thác được :))

—————————————————————————————————————————————–

Ban đầu thì mình được tham gia vào dự án của công ty để thực hiện quá trình pentest cho ứng dụng website. Thì tại website đó có sử dụng CMS là Joomla.

Trước khi đi vào chi tiết thì mình muốn làm rõ một vài khái niệm như:

  1. CVE là gì?

CVE (Common Vulnerabilities and Exposures) là 1 chương trình được khởi xướng vào năm 1999 bởi MITRE. Mục đích của chương trình này là phân loại và nhận dạng những lỗ hổng về phần cứng hoặc phần mềm, tập hợp thành 1 hệ thống mở để chuẩn hóa qui trình xác thực các lỗ hổng đã được biết. Những lỗ hổng này có thể dẫn đến các vụ tấn công an ninh mạng dưới các hình thức như chiếm quyền điều khiển hệ thống mục tiêu, đọc các dữ liệu quan trọng của người dùng như địa chỉ, số điện thoại, mã thẻ ngân hàng.

Như vậy, có thể coi CVE như 1 cơ sở dữ liệu về các lỗ hổng bảo mật, tạo thuận lợi cho việc đối chiếu thông tin giữa các công cụ và dịch vụ bảo mật khác nhau. Danh sách CVE chứa số ID, thông báo trạng thái, mô tả ngắn gọn và tài liệu tham khảo liên quan đến lỗ hổng bảo mật. Bằng việc tham chiếu CVE ID của 1 lỗ hổng nhất định, các tổ chức có thể thu thập thông tin nhanh gọn và chính xác từ nhiều nguồn tin khác nhau.

2. CMS là gì?

CMS là chữ viết tắt của Content Management System, hay còn gọi là hệ thống quản trị nội dung nhằm mục đích giúp dễ dàng quản lý, chỉnh sửa nội dung. Nội dung ở đây có thể là tin tức điện tử, báo chí hay các media hình ảnh, video, và nhiều loại tư liệu khác.

Hệ thống CMS giúp tiết kiệm thời gian quản lý, chi phí vận hành và bảo trì nên hiện nay có rất nhiều công ty sử dụng. Không chỉ là công ty mà hiện nay các blog cá nhân cũng ra đời với số lượng không hề nhỏ, và họ chọn giải pháp sử dụng CMS nhằm dễ dàng xây dựng website và quản lý nội dung, bên cạnh đó còn tiết kiệm được chi phí xây dựng website.

Và trong số đó thì có Joomla, chỉ đứng sau WordPress về mức độ phổ biến.

Thời điểm đầu

Và khi thực hiện pentest trên website đó, họ sử dụng Joomla version 1.5. Thoạt đầu thì có thể sẽ có rất nhiều CVE đã được công khai nhưng không thể khai thác. Mình quyết định duyệt quét các thành phần của Joomla. Thì website có sử dụng thành phần AllVideos Reloaded chứa lỗi SQL injection(Mình đã phải thử tay mới ra được, vì sử dụng tool đều trả về thành công trong khi thực tế là không tìm thấy, tốn rất nhiều thời gian). Chuyện gì đến cũng đến, từ SQLi có thể thu được username và password nhưng password lại được hash(MD5).salt .May mắn là có thể bruteforce được.

Khá hài là tìm được bản hash với quyền user manager và super-admin. Trong đó, quyền manager thì bạn chỉ có thể viết bài. Khi giải mã được thì tài khoản super-admin cần tiền bằng bitcoin để trả. Vì tiết kiệm tiền nên mình đã quyết định bypass bằng cách upload shell.

Như các bạn đã biết hoặc có thể chưa biết, việc bypass để upload shell của CMS là điều rất khó. Nhưng mình quyết định bypass. Bằng cách sử dụng các thủ thuật search google cũng không hiệu quả, mình chợt nghĩ thêm dấu “.” sau file để xem phản ứng là sao. Ồ, đã bypass và thực thi mã lệnh từ xa.

Thời điểm tìm kiếm

Từ đây, đã nung nấu trong lòng là tìm CVE. Khi tìm đến phiên bản mới mới thì mới phát hiện là đã có người tìm ra rồi, được 6.8 điểm. Khá tiếc.

Rồi, ra Tết Nguyên Đán thì phải đi làm. Ngay ngày đầu tiền của năm mình đã tìm cách bypass trên phiên bản mới nhất nhưng bất thành. Mình đã chuyển sang hướng khác là tìm cách xem họ có kiểm soát sai cách không? Tức là thực hiện quyền khi không được phép do ứng dụng không kiểm tra hoặc kiểm tra sai.

Trong chính sách phân quyền của Joomla, có 3 tài khoản là manger,admin và superadmin. Nếu bạn là superadmin thì bạn có thể làm mọi thứ. Nhưng khi phân quyền, rõ ràng là admin có quyền thấp hơn là không thể thực thi mã bằng cách gì đó.

Mình quyết định đi từ quyền admin vì rõ ràng quyền manager sẽ không hiệu quả. Bắt tay vào làm thì có một thành phần tên com_template cho phép người dùng có thể thêm/xóa/sửa code của template trực tiếp từ giao diện website như hình ảnh minh họa:

Giao diện template của super-admin

Phiên bản bị ảnh hưởng là nhỏ hơn hoặc bằng 3.9.15.

Link truy cập nhanh :

yourdomain/administrator/index.php?option=com_templates&view=template&id=506&file=aG9tZQ==

Giao diện cho biết người đó là superadmin.

Mình tiến hành đăng nhập với quyền admin thì như sau:

Rõ ràng là khác nhau đã xảy ra.

Ý tưởng như sau: Sẽ sử dụng quyền admin để chỉnh sửa file index.php để thực thi mã lệnh từ xa(RCE).

Mình quyết định bắt request chỉnh sửa file index.php ở trên của quyền superadmin như sau:

Thêm vào file index.php code php thực thi mã như sau:

Thêm code để RCE

Tiến hành lưu lại và dùng Burpsuite để bắt request này:

Để dễ nhìn thì mình xóa hết file và chỉ để mã code như trên cho dễ nhìn:

Token của super-admin

Phần bôi vàng là token của superadmin. Joomla sử dụng token để loại bỏ lỗi CSRF. Không sao, ở đây là quyền admin.

Giữ lại request này. Và đăng nhập bằng quyền admin.

Để lấy token của admin thì mình làm như hình:

Chọn Edit và dùng Burpsuite để bắt request này:

Tìm token của admin

Phần bôi vàng chính là token của admin.

Bây giờ thực hiện thay token của admin cho superadmin và sửa phần URI như sau:

Request để RCE

Chuyển tiếp và kết quả:

Lưu thành công

Vậy là đã chèn mã thực thi, tự hỏi shell ở đâu?

Đơn giản, bạn chỉ cần về homepage như sau để thực thi mã:

RCE

Khi tìm được thì mình đã gửi mail cho Joomla theo hướng dẫn trên trang chủ của họ và kết quả sau cuối:

Mail gán CVE của Joomla

Để cho tự động hơn, mình viết tool để khai thác lỗi này cách sử dụng như sau:

Khai thác bằng tool

Video thực hiện:

https://vimeo.com/396947804

Mã nguồn cho lỗi này có tại:

https://github.com/HoangKien1020/Joomla-CVE/tree/master/CVE-2020-10238

CVE được gán:

https://developer.joomla.org/security-centre/804-20200303-core-incorrect-access-control-in-com-templates.html

Nguồn tham khảo cho các khái niệm:

  1. https://cystack.net/vi/resource/zero-day-la-gi-cve-la-gi/
  2. https://freetuts.net/cms-la-gi-cac-cms-pho-bien-hien-nay-342.html