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 Manager, Identity Server, Enterprise 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.xml
và 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 FileUploadExecutorManager
gọ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 FileUploadConfig
trong tệp cấu hình XML, đây là cấu hình mặc định:
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()
.
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 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);
.
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 parseRequest
với tham số truyền vào là request
.
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.
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.
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.
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: