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方法:
- 该方法原本用于添加智能卡相关配置参数
- 通过跟踪
sCAction.addSmartCardConfig()方法,发现文件上传功能直接将表单中的文件内容以filename参数命名写入应用启动程序的bin目录 - 无任何过滤措施
3. 命令注入漏洞
漏洞存在于AdventNetADSMClient.jar中的ConnectionAction类的openSSLTool方法:
- 当
action参数值为generateCSR时,会执行SSLUtil.createCSR() SSLUtil.createCSR()中使用keytool工具生成证书keysize和validity参数可控且未过滤,可直接拼接进命令中执行
关键代码:
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目录:
- 构造包含路径遍历字符的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