龙空技术网

Zoho ManageEngine ADSelfService Plus如何从bypass到RCE

且听安全 188

前言:

现在看官们对“chinanetxsym”大概比较关怀,我们都需要剖析一些“chinanetxsym”的相关知识。那么小编同时在网络上网罗了一些对于“chinanetxsym””的相关资讯,希望同学们能喜欢,看官们快快来了解一下吧!

1.漏洞信息

2021年9月,Zoho官网发布了CVE-2021-40539漏洞补丁。从描述来看,CVE-2021-40539是一个认证绕过漏洞,影响版本包括`ADSelfService Plus builds up to 6113`,漏洞在`ADSelfService Plus build 6114`版本中进行修复(可以bypass)。漏洞脆弱点位于Restful API接口中,攻击者可以构造特殊URL请求,绕过认证后实现RCE,官方给出了漏洞利用的完整示意图:

2.调试配置

下载6113版本,安装完毕后运行自启动命令如下:

修改`wrapper.conf`文件,加入远程调试信息:

重新启动成功打开远程调试端口:

3.Restful API认证绕过

查看`web.xml`,Restful API接口对应的servlet为`action`:

URL以`/RestAPI/*`开头,查看`action`定义:

Restful API接口采用struts架构生成,访问接口的定义位于`*.xml`配置文件中。

`web.xml`定义了一个名为`ADSFilter`的全局过滤器:

定位`com.manageengine.ads.fw.filter.ADSFilter#doFilter`函数:

第65行首先判断如果是Restful API访问,尝试提取认证信息,然后调用`doSubFilters`:

经过一系列判断,进入第136行,对Restful API访问进行检查:

调用`isRestAPIRequest`函数判断是否为Restful API访问,如果为`true`,将调用`RestAPIFilter.doAction`进行认证信息验证等处理,看下`isRestAPIRequest`函数定义:

通过`request.getRequestURI`提取URL信息,这里通过正则表达式`/RestAPI/.*`来判断是否为Restful API访问,因为Zoho ManageEngine ADSelfService Plus使用的是Tomcat容器,下面的两个请求等价:

/RestAPI/LicenseMgr

/./RestAPI/LicenseMgr

`/RestAPI/LicenseMgr`对应的处理类为`LicenseMgr`,打下断点:

请求一:`/RestAPI/LicenseMgr`

可以发现在`com.manageengine.ads.fw.filter.ADSFilter#doSubFilters`没有通过权限检查,返回`false`。

请求二:`/./RestAPI/LicenseMgr`:

绕过了认证检查。

下面继续分析在绕过认证之后,是否存在进一步利用的可能性。


4.任意文件上传

前面提到了Restful API的接口定义位于`*.xml`文件之中,在`struts-config.xml`中找到`LogonCustomization`:

`com.adventnet.sym.adsm.common.webclient.admin.LogonCustomization`:

对参数进行一系列判断后,进入`sCAction.addSmartCardConfig`:

跟进`addSmartCardConfig`:

第94行调用`FileActionHandler.getFileFromRequest`提取`certFileJson`,进入函数:

其中参数`paramName`来源于请求提交的`CERTIFICATE_PATH`参数,实际上就是将上传的文件(来源于参数`CERTIFICATE_PATH`)进行保存。

下面构造一个文件上传的POST请求,根据前面的分析设置参数,最终请求如下:

文件上传至`\ManageEngine\ADSelfService Plus\bin`目录,尝试利用`../`进行穿越,但是`formFile.getFileName`只会提取文件名称,导致前面的`../`无效,无法进行穿越。

5.命令注入

现在可以实现未授权向`bin`目录写入任意文件,文件名称和文件内容完全可控,由于无法实现路径穿越,也就无法直接Getshell。在`struts-config.xml`中找到`ConnectionAction`:

`com.adventnet.sym.adsm.common.webclient.admin.ConnectionAction#openSSLTool`:

进入`SSLUtil.createCSR`:

实例化`JSONObject`对象`sslParams`,其中的参数全部来自于`request`,然后调用`createCSR`,跟进:

实例化字符串`keyCmd`,然后根据`JSONObject`的值完成字符串拼接,最后调用`runCommand`:

猜测可能会调用`runtime`执行命令,在`exec`处打下断点,构造请求进行测试:

确定调用了`Runtime.exec`来执行命令。`keytool.exe`是Java提供的一个生成数字证书的工具:

其中参数`providerclass`和`providerpath`可以用于指定Java字节码class文件的名称和路径,当调用`keytool.exe`时,会自动执行对应Java代码。很自然可以想到结合上面的任意文件上传漏洞,上传一个恶意class文件到bin目录,然后通过构造POST参数实现RCE。

首先构造一个恶意类`evil.java`:

编译evil.class文件后,上传至bin目录:

利用接口`ConnectionAction`构造如下请求:

触发断点,实际执行的命令如下:

成功实现RCE:

6.小结

CVE-2021-40539实现RCE的过程由3个漏洞组成,分别是Restful API认证绕过、任意文件上传以及命令拼接。在深入分析过程中,发现文件上传和命令执行还有其他的触发点,这里不过多赘述。此外,在`ADSelfService Plus build 6114`版本中,补丁更新的地方非常多,但对漏洞的修复并不完善,仍然可以被bypass,直到在更新的版本中,漏洞才得到较为完善的修复,有兴趣的小伙伴可以自行分析。

有需要了解更多漏洞情报小伙伴,请关注微信公众号:且听安全。聪者听于无形,明者见于未形;专注网络安全,关注漏洞态势;拒绝重复搬运,只做精品原创。

7.参考

;mid=2247485533&idx=1&sn=cc6a888c8fcf5c4c24bd12c792572d31&chksm=cefdb149f98a385f275d737c4200608b953b8f9fffad23536a271c4330e5b4265b925f8a99e5&scene=178&cur_album_id=2054199860790083586#rd

标签: #chinanetxsym