ADSelfService Plus未授权RCE漏洞(CVE-2021-40539)利用与分析
字数 1632 2025-08-09 13:33:52

ManageEngine ADSelfService Plus 未授权RCE漏洞(CVE-2021-40539)分析与利用

漏洞概述

ZOHO ManageEngine ADSelfService Plus是美国卓豪(ZOHO)公司的针对Active Directory和云应用程序的集成式自助密码管理和单点登录解决方案。该产品在6113及更早版本中存在严重的安全漏洞,允许攻击者绕过REST API认证并实现远程代码执行(RCE)。

漏洞细节

1. 认证绕过漏洞

漏洞存在于ManageEngineADSFrameworkJava.jar中的com.manageengine.ads.fw.api.RestAPIUtil类的isRestAPIRequest方法:

public static boolean isRestAPIRequest(HttpServletRequest request, JSONObject filterParams) {
    String restApiUrlPattern = "/RestAPI/.*";
    try {
        restApiUrlPattern = filterParams.optString("API_URL_PATTERN", restApiUrlPattern);
    } catch (Exception ex) {
        out.log(Level.INFO, "Unable to get API_URL_PATTERN.", ex);
    }
    String reqURI = request.getRequestURI();
    String contextPath = request.getContextPath() != null ? request.getContextPath() : "";
    reqURI = reqURI.replace(contextPath, "");
    reqURI = reqURI.replace("//", "/");
    return Pattern.matches(restApiUrlPattern, reqURI);
}

问题点:修复前的版本未对URL中的路径遍历字符(/., /..等)进行过滤,导致可以通过以下路径绕过认证:

/.//.
///
///.///
/.
//.///
/../

2. 任意文件上传

漏洞存在于AdventNetADSMClient.jar中的LogonCustomization类的unspecified方法:

  1. 该方法原本用于添加智能卡相关配置参数
  2. 通过跟踪sCAction.addSmartCardConfig()方法,发现文件上传功能直接将表单中的文件内容以filename参数命名写入应用启动程序的bin目录
  3. 无任何过滤措施

3. 命令注入漏洞

漏洞存在于AdventNetADSMClient.jar中的ConnectionAction类的openSSLTool方法:

  1. action参数值为generateCSR时,会执行SSLUtil.createCSR()
  2. SSLUtil.createCSR()中使用keytool工具生成证书
  3. keysizevalidity参数可控且未过滤,可直接拼接进命令中执行

关键代码:

StringBuilder keyCmd = new StringBuilder("..\\jre\\bin\\keytool.exe -J-Duser.language=en -genkey -alias tomcat -sigalg SHA256withRSA -keyalg RSA -keypass ");
keyCmd.append(password);
keyCmd.append(" -storePass ").append(password);
String keyLength = sslSettings.optString("KEY_LENGTH", null);
if ((keyLength != null) && (!keyLength.equals(""))) {
    keyCmd.append(" -keysize ").append(keyLength);
}
String validity = sslSettings.optString("VALIDITY", null);
if ((validity != null) && (!validity.equals(""))) {
    keyCmd.append(" -validity ").append(validity);
}
// ...其他参数拼接...
String status = runCommand(keyCmd.toString());

漏洞利用步骤

1. 上传恶意文件

利用认证绕过漏洞上传恶意class文件到bin目录:

  1. 构造包含路径遍历字符的URL绕过认证
  2. 通过unspecified方法上传文件
  3. 文件会被直接写入bin目录

2. 执行命令注入

利用keytool的命令注入特性执行恶意代码:

  1. 通过openSSLTool方法触发命令执行
  2. 利用keysizevalidity参数注入keytool的-providerclass-providerpath参数
  3. 指向之前上传的恶意class文件
  4. 最终通过Runtime.getRuntime().exec()执行命令

完整利用链

  1. 使用/./等路径遍历字符绕过REST API认证
  2. 上传恶意class文件到bin目录
  3. 通过keytool命令的参数注入加载并执行恶意class
  4. 实现任意代码执行

修复建议

  1. 升级到最新版本(补丁链接:https://www.manageengine.com/products/self-service-password/service-pack.html)
  2. 官方提供的检测工具可通过以下方式检测是否被入侵:
    • 检查日志报错信息
    • 检查相应路径下是否含有异常key和证书
    • 检查非常规web路径下是否含有jsp文件

参考链接

  1. 官方修复文档:https://www.manageengine.com/products/self-service-password/kb/how-to-fix-authentication-bypass-vulnerability-in-REST-API.html
  2. Nuclei模板:https://github.com/projectdiscovery/nuclei-templates/blob/77c3dc36ac7df4c04e3ff7cd97f5f63ec8dc7311/cves/2021/CVE-2021-40539.yaml
ManageEngine ADSelfService Plus 未授权RCE漏洞(CVE-2021-40539)分析与利用 漏洞概述 ZOHO ManageEngine ADSelfService Plus是美国卓豪(ZOHO)公司的针对Active Directory和云应用程序的集成式自助密码管理和单点登录解决方案。该产品在6113及更早版本中存在严重的安全漏洞,允许攻击者绕过REST API认证并实现远程代码执行(RCE)。 漏洞细节 1. 认证绕过漏洞 漏洞存在于 ManageEngineADSFrameworkJava.jar 中的 com.manageengine.ads.fw.api.RestAPIUtil 类的 isRestAPIRequest 方法: 问题点 :修复前的版本未对URL中的路径遍历字符( /. , /.. 等)进行过滤,导致可以通过以下路径绕过认证: 2. 任意文件上传 漏洞存在于 AdventNetADSMClient.jar 中的 LogonCustomization 类的 unspecified 方法: 该方法原本用于添加智能卡相关配置参数 通过跟踪 sCAction.addSmartCardConfig() 方法,发现文件上传功能直接将表单中的文件内容以 filename 参数命名写入应用启动程序的 bin 目录 无任何过滤措施 3. 命令注入漏洞 漏洞存在于 AdventNetADSMClient.jar 中的 ConnectionAction 类的 openSSLTool 方法: 当 action 参数值为 generateCSR 时,会执行 SSLUtil.createCSR() SSLUtil.createCSR() 中使用 keytool 工具生成证书 keysize 和 validity 参数可控且未过滤,可直接拼接进命令中执行 关键代码: 漏洞利用步骤 1. 上传恶意文件 利用认证绕过漏洞上传恶意class文件到bin目录: 构造包含路径遍历字符的URL绕过认证 通过 unspecified 方法上传文件 文件会被直接写入 bin 目录 2. 执行命令注入 利用keytool的命令注入特性执行恶意代码: 通过 openSSLTool 方法触发命令执行 利用 keysize 或 validity 参数注入keytool的 -providerclass 和 -providerpath 参数 指向之前上传的恶意class文件 最终通过 Runtime.getRuntime().exec() 执行命令 完整利用链 使用 /./ 等路径遍历字符绕过REST API认证 上传恶意class文件到bin目录 通过keytool命令的参数注入加载并执行恶意class 实现任意代码执行 修复建议 升级到最新版本(补丁链接:https://www.manageengine.com/products/self-service-password/service-pack.html) 官方提供的检测工具可通过以下方式检测是否被入侵: 检查日志报错信息 检查相应路径下是否含有异常key和证书 检查非常规web路径下是否含有jsp文件 参考链接 官方修复文档:https://www.manageengine.com/products/self-service-password/kb/how-to-fix-authentication-bypass-vulnerability-in-REST-API.html Nuclei模板:https://github.com/projectdiscovery/nuclei-templates/blob/77c3dc36ac7df4c04e3ff7cd97f5f63ec8dc7311/cves/2021/CVE-2021-40539.yaml