Phân tích và xây dựng POC khai thác CVE-2022-29464

[+] Introduction:

CVE-2022-29464là lỗ hổng bảo mật nghiêm trọng cho phép khai thác ở mức độ RCE  máy chủ web chạy dịch vụ WSO2 bao gồm API ManagerIdentity ServerEnterprise Integrator. Lỗ hổng bào mật này xảy ra do tính năng Upload file không kiểm soát định dạng tập tin mà người dùng tải lên hệ thống, dẫn đến lỗi Path Traversal. Từ đó kẻ tấn công có thể tải tập tin mã độc vào vị trí tùy ý trên máy chủ web.

[+] Methodology:

Vị trí lỗ hổng nằm tại controller /fileuploadđược xử lý bởi servlet FileUploadServlet. Nội dung tập tin cấu hình indetity.xml với giá trị secured=”false”dẫn đến controller /fileupload không được IAM bảo vệ.

Khi servlet FileUploadServletđược khởi tạo bằng hàm init(). Hàm khởi tạo init sẽ phân tích nội dung tập tin cấu hình carbon.xmlvà xử lý mọi định dạng tập tin mà người dùng tải lên

Hàm khởi tạo của FileUploadExecutorManagergọi đến phương thức private loadExecutorMap().

Các cấu hình định dạng tập tin tải lên nằm trong FileUploadConfigtrong tệp cấu hình XML, đây là cấu hình mặc định:


Sau đó tạo một HashMap . Giá trị Action và Class được lấy trong tập tin 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).

Khi gọi đến controller /fileuploadvới method POST, phương thức doPost()của servlet FileUploadServletsẽ được gọi. Phương thức chuyển tiếp đối tượng yêu cầu và phản hồi tới phương thức execute()của fileUploadExecutorManagerđã được khởi tạo ở hàm init().


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



Biến actionStringsau đó được truyền vào hàm CarbonXmlFileUploadExecHandler()cùng với giá trị requestvà response. Các giá trị này lưu vào constructor

Đối tượng carbonXmlExecHandlersau đó được truyền vào phường thức execHandlerManager.addExecHandler(carbonXmlExecHandler);.



Sau đó phương thức execHandlerManager.startExec()được gọi và hàm startExec() gọi đến phương thức execute() trong CarbonXmlFileUploadExecHandler().



Tiếp tục giá trị trong executorMapđược so sánh với giá trị của actionString, nếu giá trị giống nhau sẽ gọi đến phương thức executeGeneric(). Sau đó, trong phương thức executeGeneric() gọi đến hàm parseRequestvới tham số truyền vào là request.



Hàm ParseRequestthực hiện kiểm tra có phải yêu cầu POST multipart không và kiểm tra kích thước tập tin



Sau khi thực hiện kiểm tra bằng phương thức parseRequest()exetuteGenericgọi đến phương thức execute(). Phương thức này bị lỗi Path Traversalkhi tin tưởng đầu vào mà người dùng truyền vào



File được lưu vào thư mục tmpthực chất là: ./tmp/work/extra/$uuid/$filename.

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





Bây giờ, lợi dụng lỗ hổng Path Traversalđể thoát khỏi thư mục tmpvà upload file jsp vào vị trí dịch vụ web của WSO2.

Tìm thư mục appBasetrong tomcat. Vì thư mục này là vị trí của các ứng dụng được triển khai trên tomcat, nó chứa nhiều ứng dụng WAR đã được triển khai:

./repository/deployment/server/webapps

Một trong những ứng dụng đó là authenticationendpoint(//host/authenticationendpoint) xử lý xác thực cho WSO2 và vị trí của nó là:

./repository/deployment/server/webapps/authenticationendpoint

[+] Exploitation: