zoho manageengine servicedesk plus(sdp)是美国卓豪(zoho)公司的一款基于 itil 架构的 it 软件。这款软件涵盖了事件管理、问题管理、资产管理、it项目管理以及采购与合同管理等多种功能模块。
该系统主要在国外使用,例如通过 fofa 的查询可以看到:
接下来,我们来分析 CVE-2021-44077 漏洞的起因,从未授权访问开始。
0x01 未授权访问根据 Web.xml 文件,可以看到 RestAPI 的请求将由 struts 处理:
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>/RestAPI/*</url-pattern>
</servlet-mapping>此外,还有一段配置,根据注释可以看出,以下 URL 需要登录认证,例如 xxx.do:
<security-constraint>
<web-resource-collection>
<web-resource-name>Secured Core Context</web-resource-name>
<url-pattern>*.do</url-pattern>
<url-pattern>/app</url-pattern>
<url-pattern>/ui/*</url-pattern>
<url-pattern>*.cc</url-pattern>
<url-pattern>*.ls</url-pattern>
<url-pattern>/SoftwareFileUploader.up</url-pattern>
<url-pattern>/WOResolutionFileUploader.up</url-pattern>
<url-pattern>*.json</url-pattern>
<url-pattern>*.jsp</url-pattern>
<url-pattern>/servlet/*</url-pattern>
<url-pattern>/ze/*</url-pattern>
<url-pattern>/aplusinteg</url-pattern>
<url-pattern>/RestAPI/WC/TwoFactorAction</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>*</role-name>
</auth-constraint>
</security-constraint>同时,还配置了一些不需要登录的 URL:
<security-constraint>
<web-resource-collection>
<web-resource-name>Secured Core Context</web-resource-name>
<url-pattern>/approval/*</url-pattern>
<url-pattern>/purchase/ApprovalDetails.jsp</url-pattern>
<url-pattern>/jsp/AuthError.jsp</url-pattern>
<url-pattern>/AuthError.jsp</url-pattern>
<url-pattern>/jsp/pagenotfound.jsp</url-pattern>
<url-pattern>/jsp/exceptionerror.jsp</url-pattern>
<url-pattern>/ze/*</url-pattern>
<url-pattern>/servlet/HdFileDownloadServlet</url-pattern>
<url-pattern>/workorder/CloseWorkOrder.jsp</url-pattern>
<url-pattern>/PurchaseRequestFileUploader.up</url-pattern>
<url-pattern>/PurchaseOrderFileUploader.up</url-pattern>
<url-pattern>/workorder/SDPOutlookAddIn.jsp</url-pattern>
<url-pattern>/j_security_check</url-pattern>
<url-pattern>/RestAPI/TwoFactorAction</url-pattern>
</web-resource-collection>
</security-constraint>在代码 org.apache.catalina.realm.RealmBase#findSecurityConstraints 中使用了上述配置信息。
然而,令人困惑的情况是,当构造 /RestAPI/ImportTechnicians 这种不在上述配置中的请求时,是否需要登录呢?
通过调试发现如下图所示,在经过 findSecurityConstraints 的一系列匹配后,由于没有匹配成功,最终返回 null。程序进入 if 语句块,继续执行下一个管道操作,因此 /RestAPI/ImportTechnicians 无需认证。同理,类似 /RestAPI/xxxx 的访问接口也无需认证。


0x02 任意文件上传在 com.adventnet.servicedesk.setup.action.ImportTechniciansAction#execute 中有一个明显的文件写入操作,且文件内容来自上传表单。
根据配置文件,可以构造相应的请求,执行后会在 bin 目录下保存上传的文件。
<action name="ImportTechnicians" path="/ImportTechnicians" scope="request" type="com.adventnet.servicedesk.setup.action.ImportTechniciansAction">
<forward name="GetInputFile" path="/setup/GetTechInputFile.jsp"></forward>
<forward name="ImportConfirmation" path="/setup/TechImportConfirmation.jsp"></forward>
<forward name="MapFields" path="/setup/TechMapFields.jsp"></forward>
</action>
0x03 命令执行在 com.manageengine.s247.util.S247Util#installAgentProgress 中调用 bin 目录下的 msiexec.exe,结合刚才的文件上传,因此可以上传一个名为 msiexe.exe 的文件,然后调用该接口。
installAgentProgress 在 com.manageengine.s247.actions.S247Action#s247AgentInstallationProcess 这个 action 中被调用。
最后,将未授权访问和文件上传结合起来,就可以完成一次未授权的命令执行。
总结寻找未授权访问原因时花了一些时间,最初以为是在 Filter 中进行的鉴权,但排查了几个 Filter 后没有发现。接着一步步调试,最终发现是在 Tomcat Pipeline 机制中进行的鉴权。反复对比配置文件,也没找出配置错误的点,因为它不仅配置了需要认证的 URL,也配置了不需要认证的 URL,这让我迷惑了许久,算是踩了一个大坑。
以上就是代码审计 | Zoho 从未授权访问到远程 RCE的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号