CVE-2022-36923 ManageEngine OpManager getUserAPIKey Authentication Bypass

語言: CN / TW / HK

根據 ZDI的公告 來看,漏洞點存在於 com.adventnet.me.opmanager.server.util.RMMUtil#getUserAPIKey

關鍵點在於怎麼走到這個位置。

搜尋xml配置檔案發現

路由為 /RestAPI/getAPIKey ,嘗試構造請求包

提示缺失引數,看日誌報錯

IAMSecurityException 斷點打在其建構函式上向上追溯,最終在 com.adventnet.iam.security.ParameterRule#checkForAllowedValueRegex 發現是由於引數正則匹配不對導致丟擲異常。

最終構造引數成功返回200

此時回頭來看 com.adventnet.me.opmanager.server.util.RMMUtil#getUserAPIKey

    public String getUserAPIKey(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String userName = request.getParameter("username");
        String domainName = request.getParameter("domainname");
        if (userName != null && domainName != null) {
            try {
                Long userId = MickeyLiteUtil.getUserId(userName, domainName);
                String apiKey = (new APIKeyGenerator()).checkAndGenerateApiKey(userId, -1L);
                response.setContentType("text/plain");
                PrintWriter out = response.getWriter();
                out.println(apiKey);
                out.flush();
                return null;
            } catch (Exception var8) {
                var8.printStackTrace();
                return null;
            }
        } else {
            return null;
        }
    }

MickeyLiteUtil.getUserId() 需要給一個正確的domainName才行,得看資料庫AaaLogin表中有什麼值。

檢視資料庫jdbc連結 C:\Program Files\ManageEngine\OpManager\conf\database_params.conf

密碼被加密,在bin目錄中發現 bin\encrypt.bat

call .\setCommonEnv.bat

set CLASS_PATH="%SERVER_HOME%\lib\framework-tools.jar"

IF "%1"=="" GOTO SHOW_SYNTAX

"%JAVA%"  -Dserver.home="%SERVER_HOME%" -cp %CLASS_PATH% com.zoho.framework.utils.crypto.CryptoUtil %*
GOTO END_ENCRYPT

:SHOW_SYNTAX 
"%JAVA%" -Dserver.home="%SERVER_HOME%" -cp %CLASS_PATH% com.zoho.framework.utils.crypto.CryptoUtil "showUsage"

:END_ENCRYPT

呼叫CryptoUtil類進行加密

直接寫一個類呼叫decrypt函式即可

cryptTag由 EnDecryptUtil.getCryptTag() 獲得

解析persistence-configurations.xml檔案拿到CryptTag屬性,檢視檔案內容

嘗試用 MLITE_ENCRYPT_DECRYPT 解密不成功,然後發現這個xml檔案最上方引入了外部實體

最終在 conf\customer-config.xml 檔案中找到了CryptTag

演算法為AES256,解密後連結資料庫,檢視AaaLogin表

得到domainName為 - ,最終請求包如下

由此拿到restapi

rce的方式看了看restapi文件,有一個workflow可以rce,但是通過restapi訪問有問題,在 OpManagerServerClasses.jar!/com/adventnet/me/opmanager/server/api/OpManagerAPIServlet.class:354

如果你的api是 APIUtil.getInstance().isInternalAPI() 內部api,那麼在session中isAPIClient只有在login的時候才會被賦值,所以這個地方isApiclient為false,而NmsUtil.isRMMEdition為false,導致丟擲異常 APIError.internalAPI(request, response)那麼所有的內部api都不能被呼叫。

conf\OpManager\do\RestApi.xml 定義了workflow關鍵的api都是 EXPOSED_API=TRUE ,也就是內部API

到這rce就斷了,回溯了一下 isInternalAPI() 函式,發現所有的api在資料庫 OpManagerDB.public.restapioperation 表中,過濾一下 exposed_api='true' ,一共955個api可以通過restapi訪問。

看了看沒啥都是增刪改查,希望有緣人能挖出來一個rce把。

文筆垃圾,措辭輕浮,內容淺顯,操作生疏。不足之處歡迎大師傅們指點和糾正,感激不盡。