Phân tích lỗ hổng RCE trong các dịch vụ WSO2 (CVE-2022-29464)

nǝıH

Active Member
23/03/2020
24
37 bài viết
Phân tích lỗ hổng RCE trong các dịch vụ WSO2 (CVE-2022-29464)
CVE-2022-29464 là lỗ hổng nghiêm trọng dẫn đến RCE ảnh hưởng đến các ứng dụng của WSO2 bao gồm API Manager, Identity Server, Enterprise Integrator. Lỗ hổng này xảy ra do tính năng upload file và không kiểm tra nội dung mà người dùng gửi lên dẫn đến lỗi Path Traversal. Từ đó kẻ tấn công có thể upload file mã độc vào vị trí tùy ý trên server.

cve_wso2.png

Dựa vào POC đã công khai có thể thấy vị trí lỗ hổng ở /fileupload được xử lý bởi class FileUploadServlet. Và /fileupload không được bảo vệ (secured=”false”) trong cấu hình của file indetity.xml.

1651054528634.png


Khi FileUploadServlet được khởi tạo thì phương thức init() cũng được chạy. Init sẽ phân tích file cấu hình carbon.xml để chọn ra đối tượng phù hợp xử lý các loại file khác nhau được tải lên.

1651054573226.png


Contructor của FileUploadExecutorManager gọi đến phương thức loadExecutorMap().


1651054587333.png

1651054595592.png


loadExecutorMap() là phương thức để tải file cấu hình trong file carbon.xml.

1651054604690.png


Sau đó tạo một HashMap <Action, Class>. Giá trị Action và Class được lấy trong file cấu hình và sau này được dùng để chọn ra Class để xử lý theo đúng Action (HashMap khai báo một đối tượng là executorMap).

1651054614943.png


1651054620509.png


Khi gọi đến /fileupload với method POST, phương thức doPost() của FileUploadServlet sẽ được gọi.
1651054629488.png


doPost() sau đó sẽ gọi đến fileUploadExecutorManager.execute().

1651054642973.png


execute(): đầu tiên thực hiện cắt theo chuỗi “fileupload/” để lấy string sau “fileupload/” và lưu vào biến actionString.

1651054655941.png


actionString sau đó được truyền vào CarbonXmlFileUploadExecHandler() cùng với request và response. Các giá trị này lưu vào constructor.

1651054669022.png


Đối tượng carbonXmlExecHandler sau đó được truyền vào execHandlerManager.addExecHandler(carbonXmlExecHandler);
Sau đó execHandlerManager.startExec() được gọi, startExec gọi đến execute()

1651054683327.png


Vòng lắp lấy giá trị trong executorMap ra và so sanh với actionString nếu giống nhau sẽ gọi đến executeGeneric() (Sửa lại giá trị của actionString thành 1 trong số 10 giá trị trong executorMap).
Sau đó trong hàm executeGeneric() gọi đến parseRequest với tham số là request.

1651054697875.png


ParseRequest thực hiện kiểm tra xem có phải yêu cầu POST multipart không, kiểm tra kích thước file…

1651054711538.png


Sau khi thực hiện parseRequest(), exetuteGeneric gọi đến phương thức execute(). Phương thức này bị lỗi Path Traversal khi tin đầu vào (“name”) do người dùng truyền vào.

1651054723365.png


Với giá trị uuid được trả lại trong response ta có thể biết được vị trí file upload được lưu.

1651054735958.png

1651054741482.png


Ở đây chỉ cần lợi dụng lỗ hổng Path Traversal (“../../”) để thoát khỏi thư mục tmp và upload file jsp vào vị trí dịch vụ web của WSO2. Vị trí được sử dụng ở đây là authenticationendpoint:
./repository/deployment/server/webapps/authenticationendpoint.

POC:
1651054773793.png

1651054780071.png

1651054784175.png


Hướng dẫn giảm thiểu lỗ hổng có thể tham khảo ở đây: https://docs.wso2.com/display/Security/Security+Advisory+WSO2-2021-1738
 
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Thẻ
cve-2022-29464 rce wso2
Bên trên