3. CVE-2020-8420: 1-click RCE

Phân tích hàm less():

Hình 1 Phân tích chức năng less() ở template

Chức năng này nhận vào các tham số:

- $id : id của template ( protostar hoặc beez, hoặc tự custom )

- $file : file mà ta cần xử lý.

Chức năng dùng xem nội dung của $file. Nếu kết hợp với lỗi CSRF thì rất khó để có thể khai thác vì nội dung của $file chỉ hiển thị ở trang của admin. Tiếp tục phân tích hàm compileLess($file):

Hình 2 Phân tích hàm compileLess

Tham số $file truyền vào được kiểm tra nếu có kí tự “/” thì sẽ cắt $file thành mảng dựa theo "/" và lấy giá trị cuối của mảng , như vậy có thể chống được Path Traversal ở máy chủ chạy hệ điều hành Linux.  Tuy nhiên với máy chủ chạy hệ điều hành Windows có thể bypass với kí tự “\”. Như vậy chức năng bị lỗi Path Traversal nhưng chỉ áp dụng với hệ điều hành Windows.

Phân tích hàm compileFile($fname,$outFname) trong đó có tham số $fname được tạo từ phép cộng chuỗi $path$infile , trong đó:

- $path thư mục của template tương ứng với $id.

- $infile $file sau khi giải mã base64.

Hình 3 Phân tích hàm compileFile

Hàm kiểm tra nếu như $fname truyền vào tồn tại trên máy chủ, nếu không sẽ raise exception “load error: failed to find.”$fname.

Hình 4 exception khi file không tồn tại ở chức năng compileFile

Do hàm compileLess($input) dùng try catch để handle exception nên sẽ gọi đến hàm enqueueMessage() khi có exception xảy ra.

Hình 5 Handle exception ở hàm compileLess
Hình 6 Thông báo lỗi được đưa vào hàng chờ
Hình 7 Hiển thị thông báo lỗi ra màn hình

Thông báo lỗi không được escape, như vậy với $file = base64_encode(“<script>alert(1)”), mã độc javascript được hiển thị trực tiếp ra màn hình dẫn đến lỗi XSS.

Hình 8 Mã độc XSS được inject vào câu hiển thị thông báo lỗi
Hình 9 Mã độc javascript được thi.

Mã khai thác:

http://victim/joomla_path/administrator/index.php?option=com_templates&task=template.less&view=template&id=506&file=[base64(payload_javascript)]

Ngoài ra khi phát hiện lỗi Path traversal Windows như trên, thử thêm kịch bản là đã upload được file chứa mã độc javascript lên máy chủ là payload.js

Hình 10 Tham số $fname ở compileFile bị path traversal gọi đến file payload.js
Hình 11 gọi đến hàm compile() ở model template
Hình 12 Hàm compile trong luồng nghiệp vụ của less

Biến $string là nội dung của file payload.js.

Hình 13 phân tích hàm compile trong luồng nghiệp vụ của less

Hàm parse() sẽ gọi đến một parser trong core ở file JOOMLA_PATH\libraries\vendor\leafo\lessphp\lessc.inc.php. Tương tự trả về thông báo lỗi chứa nội dung là mã độc javascript.

Hình 14 Thông báo lỗi sử dụng cộng chuỗi chưa được escape
Hình 15 Thông báo lỗi trả về không qua escape
Hinh 16

Từ những kịch bản như trên, có 2 cách để ta khai thác chiếm quyền máy chủ:

- Cách 1:

Ø Upload mã độc javascript lên server thông qua local attack hoặc ftp-anon.

Ø Dùng path traversal gọi mã độc (Chỉ áp dụng cho Windows).

Ø Lừa admin truy cập liên kết chứa mã độc ( Open redirect, Phishing).

- Cách 2:

Ø Lừa admin truy cập liên kết chứa mã độc ( Open redirect , Phishing).

Cách 1 thực hiện khai thác tương tự như bài viết ở phần 2. Ở đây định dạng file không quan trọng, chỉ cần upload được file chứa mã độc lên server ( pdf , txt , .... ).

Demo khai thác theo cách 2

Chức năng template cho phép sửa nội dung của file bất kì ở  template với request như sau

Hình 17 Request sửa file template của joomla

Để thực hiện ta cần csrf.token.

csrf.token nằm ở nội dung trang html của admin ở  file hợp lệ thuộc đường dẫn http://victim/administrator/* ( Ví dụ index.php ).

Hình 18

Viết mã độc javascript ghi mã độc php thực hiện lệnh whoami lên file error.php ở template protostar dựa vào request ghi file ở hình 32: https://gist.github.com/komang4130/0ed6f8cffd3e57d20cfd6052f6db2e8c

Mã khai thác:

http://your_host/path_to_joomla/administrator/index.php?option=com_templates&task=template.less&view=template&id=506&file=[base64_javascript]

Minh họa lỗi:

Hình 19 Khi admin click hoặc truy cập mà liên kết chứa mã độc trên.

Author: Le Quang Thao