作者:xxhzz@星闌科技PortalLab
原文鏈接:https://mp.weixin.qq.com/s/K9nmiwr8yL5tVxiLnhFDmA

漏洞描述

某些WSO2產品允許不受限制地上傳文件,從而執行遠程代碼。以WSO2 API Manager 為例,它是一個完全開源的 API 管理平臺。它支持API設計,API發布,生命周期管理,應用程序開發,API安全性,速率限制,查看API的統計信息,以及連接API,API產品和端點。

漏洞版本

WSO2 API Manager 2.2.0 及以上版本

WSO2 Identity Server 5.2.0 及以上

版本WSO2 Identity Server Analytics 5.4.0、5.4.1、5.5.0、5.6.0WSO2

Identity Server as Key Manager 5.3.0 及更高版本

WSO2 Enterprise Integrator 6.2.0 及更高版本

WSO2 Open Banking AM 1.4.0 及更高版本

WSO2 Open Banking KM 1.4.0 及更高

環境搭建

采用Dockerfile搭建 wso2/wso2am - Docker Image | Docker Hub

版本:WSO2 API Manager 4.0.0

# ------------------------------------------------------------------------
#
# Copyright 2018 WSO2, Inc. (http://wso2.com)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License
#
# ------------------------------------------------------------------------
# set base Docker image to AdoptOpenJDK CentOS Docker image
FROM adoptopenjdk/openjdk11:x86_64-centos-jdk-11.0.10_9
LABEL maintainer="WSO2 Docker Maintainers <dev@wso2.org>" \
      com.wso2.docker.source="https://github.com/wso2/docker-apim/releases/tag/v4.0.0.1"
# set Docker image build arguments
# build arguments for user/group configurations
ARG USER=wso2carbon
ARG USER_ID=802
ARG USER_GROUP=wso2
ARG USER_GROUP_ID=802
ARG USER_HOME=/home/${USER}
# build arguments for WSO2 product installation
ARG WSO2_SERVER_NAME=wso2am
ARG WSO2_SERVER_VERSION=4.0.0
ARG WSO2_SERVER_REPOSITORY=product-apim
ARG WSO2_SERVER=${WSO2_SERVER_NAME}-${WSO2_SERVER_VERSION}
ARG WSO2_SERVER_HOME=${USER_HOME}/${WSO2_SERVER}
ARG WSO2_SERVER_DIST_URL=https://github.com/wso2/${WSO2_SERVER_REPOSITORY}/releases/download/v${WSO2_SERVER_VERSION}/${WSO2_SERVER}.zip
# build argument for MOTD
ARG MOTD='printf "\n\
Welcome to WSO2 Docker resources.\n\
------------------------------------ \n\
This Docker container comprises of a WSO2 product, running with its latest GA release \n\
which is under the Apache License, Version 2.0. \n\
Read more about Apache License, Version 2.0 here @ http://www.apache.org/licenses/LICENSE-2.0.\n\n"'

# create the non-root user and group and set MOTD login message
RUN \
    groupadd --system -g ${USER_GROUP_ID} ${USER_GROUP} \
    && useradd --system --create-home --home-dir ${USER_HOME} --no-log-init -g ${USER_GROUP_ID} -u ${USER_ID} ${USER} \
    && echo ${MOTD} > /etc/profile.d/motd.sh
# copy init script to user home
COPY --chown=wso2carbon:wso2 docker-entrypoint.sh ${USER_HOME}/
# install required packages
RUN \
    yum -y update \
    && yum install -y \
        nc \
        unzip \
        wget \
    && rm -rf /var/cache/yum/*
# add the WSO2 product distribution to user's home directory
RUN \
    wget -O ${WSO2_SERVER}.zip "${WSO2_SERVER_DIST_URL}" \
    && unzip -d ${USER_HOME} ${WSO2_SERVER}.zip \
    && chown wso2carbon:wso2 -R ${WSO2_SERVER_HOME} \
    && mkdir ${USER_HOME}/wso2-tmp \
    && bash -c 'mkdir -p ${USER_HOME}/solr/{indexed-data,database}' \
    && chown wso2carbon:wso2 -R ${USER_HOME}/solr \
    && cp -r ${WSO2_SERVER_HOME}/repository/deployment/server/synapse-configs ${USER_HOME}/wso2-tmp \
    && cp -r ${WSO2_SERVER_HOME}/repository/deployment/server/executionplans ${USER_HOME}/wso2-tmp \
    && rm -f ${WSO2_SERVER}.zip
# set the user and work directory
USER ${USER_ID}
WORKDIR ${USER_HOME}
# set environment variables
ENV WORKING_DIRECTORY=${USER_HOME} \
    WSO2_SERVER_HOME=${WSO2_SERVER_HOME}
# expose ports
EXPOSE 9763 9443 9999 11111 8280 8243 5672 9711 9611 9099
# initiate container and start WSO2 Carbon server
ENTRYPOINT ["/home/wso2carbon/docker-entrypoint.sh"]

運行docker run命令 搭建docker環境。

docker run -it -p 8280:8280 -p 8243:8243 -p 9443:9443 --name api-manager wso2/wso2am:4.0.0

搭建完成后,訪問 https://localhost:9943 默認用戶名 密碼 admin admin。

圖片

漏洞復現

漏洞原理

補丁diff記錄(https://github.com/wso2/carbon-kernel/pull/3152/commits/13795df0a5b6a2206fd0338abfff057a7b99e1bb) Remove Unnecessary file uploader classes and improve parent path validation. by bhagyasakalanka · Pull Request #3152 · wso2/carbon-kernel (github.com)

查看diff記錄、在創建file對象時會先對上傳文件的路徑做校驗。

圖片

圖片

carbon-kernel/FileUploadServlet.java at 4.4.x · wso2/carbon-kernel (github.com)

開啟docker鏡像調試模式,在idea上使用遠程調試。

docker run -it -p 8280:8280 -p 8243:8243 -p 9443:9443 -p 5005:5005 --name another-api-manager wso2/wso2am:4.0.0 -debug *:5005

/fileupload 會在服務器啟動期間被注冊。

圖片

在使用文件上傳時,會調用/org/wso2/carbon/ui/transports/FileUploadServlet.java 。

構造函數FileUploadServlet 會將類內部定義的私有屬性進行修改。

圖片

使用POST方法時,會調用doPost(),接著調用fileUploadExecutorManager.execute()

圖片

因此我們將斷點打到/org/wso2/carbon/ui/transports/fileupload/FileUploadExecutorManager.java#execute,正如上面描述所說、當收到一個文件上傳請求,這個方法會被調用。它接受的兩個參數:http request、https response,會返回布爾值。

圖片

圖片

CarbonConstants類包含Carbon所有重要常數

然后對CarbonConstants的cookie、webContext、SERVER_URL、進行操作。向下走,通過對requestURI的截取獲得actionString。

圖片

在下面的代碼中會注冊execution handlers、首先會創建execHandlerManager對象 ,接下來會加上ExecHandler鏈條 。FileUploadExecutionHandlerManager => CarbonXmlFileUploadExecHandler=>OSGiFileUploadExecHandler=>AnyFileUploadExecHandler。

圖片

進入startExec() 會調用/org/wso2/carbon/ui/transports/fileupload/FileUploadExecutorManager.java# execute() 在for循環中匹配到 toolsAny。

圖片

然后進入/org/wso2/carbon/ui/transports/fileupload/AbstractFileUploadExecutor.java# executeGeneric() ,然后調用parseRequest(request) 獲取request 參數。

圖片

/org/wso2/carbon/ui/transports/fileupload/AbstractFileUploadExecutor.java#parseRequest()

將斷點打到該位置,繼續調試。它首先確保 POST 請求是分段 POST 請求,然后提取上傳的文件,確保 POST 請求至少包含上傳的文件,并根據最大文件大小對其進行驗證。

圖片

走了很長一串之后,進入到/org/wso2/carbon/ui/transports/fileupload/ToolsAnyFileUploadExecutor.java# execute()

這是錯誤所在,該方法容易受到路徑遍歷vulenerabulity的影響,因為它信任用戶在POST請求中給出的文件名。

圖片

在該方法下,會返回一個 uuid 是由系統時間和隨機數組成。在uploadeFile中可以看到存放上傳文件的路徑。

圖片

圖片

漏洞測試

運行以下命令:

python3 exploit.py https://127.0.0.1:9443/ shell.jsp

圖片

在網頁中打開以下鏈接。在輸入框中輸入命令 ls 。

圖片

修復建議

如果最新版本未列在受影響的產品列表下,則可以遷移到產品的最新版本。否則,您可以根據以下公開修復程序將相關修復程序應用于產品:

臨時緩解措施:

產品版本 臨時緩解步
WSO2 API 管理器 2.6.0、2.5.0、2.2.0 及更早版本WSO2 身份服務器 5.8.0、5.7.0、5.6.0、5.5.0、5.4.1、5.4.0、5.3.0、5.2.0 和更早版本作為密鑰管理器的 WSO2 身份服務器 5.7.0、5.6.0、5.5.0、5.3.0 和更早版本WSO2 IS 分析 5.6.0、5.5.0、5.4.1、5.4.0 及更早版本 刪除/repository/conf/carbonFileUploadConfig標記內定義的所有映射.xml
WSO2 API 管理器 4.0.0、3.2.0、3.1.0、3.0.0 將以下配置添加到 /repository/conf/deployment.toml*deployment.toml[[resource.access_control]]context="(.)/fileupload/resource(.)"secure=falsehttp_method = "all" [[resource.access_control]]context="(.)/fileupload/(.*)"secure=truehttp_method = "all"permissions = ["/permission/protected/"]
SO2 企業集成商 6.6.0、6.5.0、6.4.0、6.3.0、6.2.0及更早版本 于 EI 配置文件,請從<文件上傳配置>部分中刪除/conf/carbon.xml 文件中的以下映射。對于業務流程/代理和分析配置文件,分別在以下位置對 carbon.xml 文件應用相同的更改。/wso2/broker/conf/carbon.xml/wso2/業務流程/conf/carbon.xml/wso2/analytics/conf/carbon.xmldeployment.toml keystore certificate * org.wso2.carbon.ui.transports.fileupload.AnyFileUploadExecutor jarZip org.wso2.carbon.ui.transports.fileupload.JarZipUploadExecutor tools org.wso2.carbon.ui.transports.fileupload.ToolsFileUploadExecutor toolsAny org.wso2.carbon.ui.transports.fileupload.ToolsAnyFileUploadExecutor
WSO2 身份服務器 5.11.0、5.10.0、5.9.0作為密鑰管理器的 WSO2 身份服務器 5.10.0、5.9.0 將以下配置添加到 /repository/conf/deployment.toml*deployment.toml[[resource.access_control]]context="(.)/fileupload/service(.)"secure=falsehttp_method = "all" [[resource.access_control]]context="(.)/fileupload/entitlement-policy(.)"secure=falsehttp_method = "all" [[resource.access_control]]context="(.)/fileupload/resource(.)"secure=falsehttp_method = "all" [[resource.access_control]]context="(.)/fileupload/(.*)"secure=truehttp_method = "all"permissions = ["/permission/protected/"]
基于 WSO2 碳核 4 版本的其他不受支持的產品/版本 刪除/repository/conf/carbonFileUploadConfig標記內定義的所有映射.xml

參考材料

  1. 安全公告 WSO2-2021-1738 - WSO2 平臺安全性 - WSO2 文檔:https://docs.wso2.com/display/Security/Security+Advisory+WSO2-2021-1738

  2. 關鍵概念 - WSO2 API 管理器文檔 4.1.0:https://apim.docs.wso2.com/en/latest/get-started/key-concepts/

  3. hakivvi/CVE-2022-29464:WSO2 RCE (CVE-2022-29464) 漏洞利用和寫入。(github.com):https://github.com/hakivvi/CVE-2022-29464


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/2033/