PHÂN TÍCH VÀ XÂY DỰNG POC KHAI THÁC CVE-2022-29464

22/04/2022

[+] Introduction:
CVE-2022-29464 là 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ệ.

 
anh-đau.png
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.xml và xử lý mọi định dạng tập tin mà người dùng tải lên.

 
anh-1.png
 
Hàm khởi tạo của FileUploadExecutorManager gọi đến phương thức private loadExecutorMap().
 
anh-2.png
anh-bia-anh-3-(1).png
Các cấu hình định dạng tập tin tải lên nằm trong FileUploadConfig trong tệp cấu hình XML, đây là cấu hình mặc định:
 
1.png
Sau đó tạo một HashMap <Action, Class>. 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 /fileupload với method POST, phương thức doPost() của servlet FileUploadServlet sẽ đượ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().

 
2.png
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.
 
3.png
Biến actionString sau đó được truyền vào hàm CarbonXmlFileUploadExecHandler() cùng với giá trị request và response. Các giá trị này lưu vào constructor.
Đối tượng carbonXmlExecHandler sau đó được truyền vào phường thức execHandlerManager.addExecHandler(carbonXmlExecHandler);.

 
4-(1).png

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

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 parseRequest với tham số truyền vào là request.
 
6.png
Hàm ParseRequest thự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.
 
7.png
Sau khi thực hiện kiểm tra bằng phương thức parseRequest()exetuteGeneric gọi đến phương thức execute(). Phương thức này bị lỗi Path Traversal khi tin tưởng đầu vào mà người dùng truyền vào.
 
8-(1).png
File được lưu vào thư mục tmp thực chất là: ./tmp/work/extra/$uuid/$filename.
Với giá trị uuid được trả lại trong response ta có thể biết được vị trí file upload được lưu.

 
9.png
10.png
Bây giờ, 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.
Tìm thư mục appBase trong 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:

 
11.png
anh-16.png
anh-17.png