CVE-2022-36923 ManageEngine OpManager getUserAPIKey Authentication Bypass
根據 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把。
文筆垃圾,措辭輕浮,內容淺顯,操作生疏。不足之處歡迎大師傅們指點和糾正,感激不盡。
- fastjson 1.2.80 漏洞分析
- Doop學習 part 1
- ByteCodeDL 學習
- CVE-2022-36923 ManageEngine OpManager getUserAPIKey Authentication Bypass
- 從濫用HTTP hop by hop請求頭看CVE-2022-1388
- 解決哥斯拉記憶體馬pagecontext的問題
- CVE 2022 22947 SpringCloud GateWay SPEL RCE Echo Response
- CVE-2021-44521 Apache Cassandra 載入UDF RCE
- dotnet 反序列化的另外幾個gadget
- CVE-2021-45456 Apache Kylin 命令注入
- 使用C#開發IIS模組後門
- 使用serverless實現動態新增水印
- XXE到域控復現(基於資源的約束委派)
- Kerberos協議之基於資源的約束委派
- Kerberos協議之約束委派
- Kerberos協議之TGS_REQ & TGS_REP
- Kerberos協議之AS_REQ & AS_REP
- Windows網路認證NTLM&Net-NTLM Hash
- fastjson 1.2.68 bypass autotype
- Ysoserial JDK7u21