Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
cve-2023-34446 — Prueba de concepto de exploit para CVE-2023-36664, una vulnerabilidad de inyección de comandos en Ghostscript. Incluye entorno de laboratorio Docker, análisis detallado de la evasión de validación de tuberías y guía de reproducción paso a paso. | Kitploit
Herramientas/GitHubGitHub/minsmiths/cve-2023-34446
Análisis de VulnerabilidadesAnálisis de CódigoExplotaciónAprendizaje y EducaciónExplotación de BinariosLabs y Práctica
GitHubminsmiths/cve-2023-34446

cve-2023-34446

Prueba de concepto de exploit para CVE-2023-36664, una vulnerabilidad de inyección de comandos en Ghostscript. Incluye entorno de laboratorio Docker, análisis detallado de la evasión de validación de tuberías y guía de reproducción paso a paso.

Ver Repositorio
4hace 2 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2023-36664: Ghostscript Remote Code Execution

Resumen de la vulnerabilidad

ID de CVE: CVE-2023-36664
Producto: Ghostscript (< 10.01.2)
Tipo de vulnerabilidad: Remote Code Execution (RCE)

Resumen

Esta vulnerabilidad (CVE-2023-36664) es una vulnerabilidad de ejecución remota de código (RCE) que ocurre debido a que Ghostscript maneja inadecuadamente la validación de permisos de ruta para el dispositivo pipe (prefijo %pipe% o |).

Cuando el sistema analiza o procesa un archivo de documento (PS/EPS) manipulado maliciosamente por un atacante, se pueden ejecutar comandos arbitrarios del sistema sin autorización del usuario.

[Explicación de conceptos] Entendiendo Ghostscript y las tuberías (Pipe)

1. ¿Qué es Ghostscript?.

Función principal: Esencialmente, lee código de coordenadas gráficas basado en texto (por ejemplo, "dibuja una línea en la posición 100 200") y lo convierte en imágenes visibles en la pantalla del monitor o en archivos de imagen para imprimir.

2. ¿Qué es una tubería (Pipe)?

Una tubería es una función que conecta la salida de una aplicación a la entrada de otra, permitiendo que los programas se comuniquen entre sí. En la línea de comandos se representa con el símbolo |.

Ejemplo: cat /etc/hosts | grep localhost

  • Todos los datos de texto extraídos por el comando cat se pasan a través de la tubería (|) directamente como entrada del comando grep, filtrando solo las líneas que contienen "localhost".

Comprendiendo la vulnerabilidad

Causa raíz de la vulnerabilidad

Ghostscript, por defecto, cuando el modo seguro (-dSAFER) está activado, verifica estrictamente las rutas de archivo para evitar el acceso a archivos sensibles del sistema o la ejecución arbitraria de comandos externos.

Problema: Cuando un atacante introduce cuidadosamente un prefijo de dispositivo pipe (%pipe% o |) en lugar de un nombre de archivo normal, la lógica de validación de permisos interna de Ghostscript no reconoce correctamente este prefijo y lo trata como una "ruta segura" o "no sujeta a verificación", permitiendo que pase.

Resultado: El comando peligroso que debería haber sido filtrado evade el bucle de validación sin obstáculos.

Mecanismo de explotación de la vulnerabilidad

Inyección de archivo malicioso: El atacante inserta código dentro de un archivo PostScript (.ps/.eps) con una forma como (%pipe%comando_malicioso) (modo) file /DCTDecode filter.

Parseo y confusión: Al leer y procesar este archivo, Ghostscript pasa la etapa de validación de permisos (el guardián) sin errores.

Entrega al shell del sistema operativo: El flujo de comandos que pasó la validación es entregado directamente al shell interno del sistema operativo (como sh en Linux o cmd en Windows) a través de la funcionalidad del dispositivo pipe, y se ejecuta con los permisos del backend.

Analizando el código vulnerable

Al observar el código parcheado, se puede ver que se modificaron los siguientes dos archivos .c:

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

Aquí, analizando gpmisc.c se puede entender la vulnerabilidad.

png2

El núcleo de esta vulnerabilidad es que no se puede distinguir adecuadamente rutas especiales como %pipe% de rutas de archivo normales, y se reconocen erróneamente como rutas comunes.

Función de limpieza de ruta: gp_file_name_reduce

Para verificarlo, es necesario examinar la función que limpia las rutas de archivo. En gpmisc.c, la función encargada de limpiar rutas es gp_file_name_reduce(...), que internamente llama a gp_file_name_combine() y devuelve su resultado.

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(), como su nombre indica, elimina expresiones de ruta relativas innecesarias como ./ o // de la ruta de archivo recibida.

El problema ocurre aquí. Si a esta función se le pasa una cadena especial que induce la ejecución de comandos, como %pipe%, en lugar de una ruta de archivo normal, la función no reconoce esto como un patrón de ruta válido y devuelve la cadena original sin ningún procesamiento.

Ausencia de lógica de validación: gp_validate_path_len

png1

gp_validate_path_len(...) es una función que internamente llama a gp_file_name_reduce() para validar la ruta. En este proceso, no existe una lógica de validación separada que distinga si el valor de entrada es una ruta de archivo normal o una sintaxis de ejecución de comandos como %pipe%.

Como resultado, las cadenas que contienen %pipe% pasan sin ningún filtro, y esta es la causa raíz de esta vulnerabilidad.

Por lo tanto, si se pasa una cadena como %pipe%touch /tmp/pwned como ruta de archivo, aunque el usuario solo pretendía renderizar un archivo de imagen, en realidad se ejecuta el comando touch /tmp/pwned, lo que resulta en la creación del archivo /tmp/pwned.

Arquitectura

root@kitploit:~
┌─────────────────────────────────┐
│  Docker Container               │
│  (Ubuntu 22.04 + Ghostscript)   │
│                                 │
│  /home/test/               ← Directorio de trabajo
│  ├── poc.py               ← Script de generación de PoC
│  |                              |
│  └── /var/www/html/config.php   ← Archivo de información sensible
│                                 │
│  User: test (no root)           │
│  Ghostscript: 10.01.1 (vulnerable)│
└─────────────────────────────────┘

La razón por la que se eligió una cuenta normal en lugar de la cuenta root es que, en servidores de producción reales, generalmente no se utiliza directamente la cuenta root por razones de seguridad. Por lo tanto, para reproducir lo más fielmente posible la situación de un ataque a un servidor real, se configuró el entorno con una cuenta normal.

Configuración de 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

entorno

  • DISPLAY=${DISPLAY}: Pasa la variable de entorno al contenedor para que las aplicaciones GUI dentro del contenedor puedan acceder al servidor de visualización X11 del host.

volumes

  • /tmp/.X11-unix:/tmp/.X11-unix:ro: Monta el socket Unix para la comunicación entre el servidor de visualización X11 del host y el contenedor.

  • ./poc.py:/home/test/poc.py: Monta el script PoC local del host en el entorno de ejecución del contenedor.

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"]

Instalación básica de apt

Para configurar un entorno PoC básico, se necesita wget para obtener la versión vulnerable de Ghostscript, build-essential para instalar el código fuente después de descomprimir el tar.gz, y gedit (un bloc de notas) que se abrirá maliciosamente al ejecutar el .ps, entre otros.

Instalación de Ghostscript 10.01.1

png3 png4 La versión vulnerable 10.01.1 de Ghostscript se instaló obteniendo el código fuente desde git. RUN ./configure && \ make && \ make install se ejecutó siguiendo las instrucciones de uso que estaban escritas en la carpeta donde se descargó el código fuente.

Información a robar

Normalmente, en /var/www/html/config.php se encuentran los valores de configuración principales de la aplicación web, como el nombre de la base de datos y la contraseña. Por lo tanto, se asumió que se robaría la contraseña de la base de datos y se creó el archivo config.php de forma arbitraria.

Creación de una cuenta normal

Dado que se planea realizar el PoC con la cuenta normal test en lugar de la cuenta root, se crea un nuevo usuario.


Procedimiento de reproducción

1. Configuración del entorno

root@kitploit:~
# Construir la imagen Docker
docker compose -f docker-compose.yml up -d

# Ejecutar el contenedor
docker exec -it cve_lab bash

2. Creación del archivo PoC

Dentro del contenedor: png5

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

Resultado de la generación: png6

Se puede ver que la ruta maliciosa ingresada está correctamente insertada dentro del archivo .ps.

3. Procesamiento del archivo malicioso con Ghostscript

root@kitploit:~
gs -dNOSAFER test.ps

png7

4. Verificación del resultado

Se abre gedit automáticamente y se muestra el contenido de /var/www/html/config.php.

root@kitploit:~
DB_PASSWORD=SuperSecret1234!!!

Medidas de mitigación

png8

1. Aplicación de parches de seguridad y actualización

Se debe actualizar a la versión oficial más reciente de Ghostscript 10.01.2 o superior, que corrige la vulnerabilidad.

2. Comprensión del mecanismo de defensa mediante el análisis del código del parche

En el parche oficial, se agregó una lógica de validación dentro de la función gp_validate_path_len() antes de llamar a gp_file_name_reduce().

Manejo de excepciones y bloqueo forzado de cadenas especiales de pipe: Se agregó una rama de decisión que detecta de forma separada y completa si el prefijo de la ruta de entrada comienza con %pipe% o el símbolo |.

Versión del parche oficial: https://github.com/ArtifexSoftware/ghostpdl/commit/5f56c6f6f989816fc9cc671116740acecbed5b6c


Referencias

  • Página oficial de CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-36664
  • Entendiendo CVE: https://www.vicarius.io/vsociety/posts/cve-2023-36664-command-injection-with-ghostscript
  • Reproducción del PoC: https://github.com/jakabakos/CVE-2023-36664-Ghostscript-command-injection

Descargar herramienta