Translated ['src/pentesting-cloud/aws-security/aws-services/aws-iam-enum

This commit is contained in:
Translator
2026-02-12 12:47:04 +00:00
parent a2bd88822d
commit 11aa69fcaa
3 changed files with 143 additions and 43 deletions
@@ -4,7 +4,7 @@
## SES
Para mais informações, veja:
Para mais informações, consulte:
{{#ref}}
../../aws-services/aws-ses-enum.md
@@ -25,11 +25,11 @@ Enviar um e-mail.
```bash
aws ses send-raw-email --raw-message file://message.json
```
Ainda por testar.
Ainda para testar.
### `ses:SendTemplatedEmail`
Enviar um email com base num modelo.
Enviar um e-mail com base num modelo.
```bash
aws ses send-templated-email --source <value> --destination <value> --template <value>
```
@@ -41,7 +41,7 @@ Enviar um e-mail para múltiplos destinatários
```bash
aws ses send-bulk-templated-email --source <value> --template <value>
```
Ainda por testar.
Ainda para testar.
### `ses:SendBulkEmail`
@@ -51,7 +51,7 @@ aws sesv2 send-bulk-email --default-content <value> --bulk-email-entries <value>
```
### `ses:SendBounce`
Enviar um **bounce email** sobre um email recebido (indicando que o email não pôde ser recebido). Isto só pode ser feito **até 24h após o recebimento** do email.
Enviar um **e-mail de bounce** sobre um e-mail recebido (indicando que o e-mail não pôde ser entregue). Isso só pode ser feito **até 24h após o recebimento** do e-mail.
```bash
aws ses send-bounce --original-message-id <value> --bounce-sender <value> --bounced-recipient-info-list <value>
```
@@ -59,11 +59,23 @@ Ainda por testar.
### `ses:SendCustomVerificationEmail`
Isto irá enviar um email de verificação personalizado. Também poderá precisar de permissões para criar o modelo de email.
Isso enviará um e-mail de verificação personalizado. Você pode também precisar de permissões para criar o template do e-mail.
```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>
```
Ainda por testar.
## WorkMail pivot to bypass SES sandbox
Quando `ses:GetAccount` indicar que a conta ainda está no SES sandbox e `ses:ListIdentities` não retornar remetentes verificados, os atacantes podem **pivot to WorkMail** para enviar imediatamente (sem sandbox e com cotas padrão mais altas) criando organizações, verificando domínios e registrando caixas de correio.
{{#ref}}
../aws-workmail-post-exploitation/README.md
{{#endref}}
## Referências
- [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}}
@@ -0,0 +1,76 @@
# AWS - WorkMail Post Exploitation
{{#include ../../../../banners/hacktricks-training.md}}
## Abusando do WorkMail para contornar o SES sandbox
Mesmo que o SES esteja preso no **sandbox** (apenas recipients verificados, ~200 msgs/24h, 1 msg/s), o WorkMail não possui restrição equivalente. Um atacante com long-term keys pode criar infraestrutura de e-mail descartável e começar a enviar imediatamente:
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:
- Cap padrão de **recipient** documentado pela AWS: **100,000 external recipients/day per org** (agregado entre usuários).
- A atividade de verificação de domínio aparecerá no CloudTrail sob SES mas com **`invokedBy`: `workmail.<region>.amazonaws.com`**, então eventos de verificação do SES podem pertencer à configuração do WorkMail em vez de campanhas SES.
- WorkMail mailbox users become **application-layer persistence** independent from IAM users.
## Sending paths & telemetry gaps
### Cliente web (WorkMail UI)
- Envia como eventos **`ses:SendRawEmail`** no CloudTrail.
- `userIdentity.type` = `AWSService`, `invokedBy/sourceIPAddress/userAgent` = `workmail.<region>.amazonaws.com`, então o **IP real do cliente fica oculto**.
- Os `requestParameters` ainda leak o remetente (`source`, `fromArn`, `sourceArn`, configuration set) para correlacionar com domínios/caixas de correio recém verificados.
### SMTP (mais furtivo)
- Endpoint: `smtp.mail.<region>.awsapps.com:465` (SMTP over SSL) com a mailbox password.
- **No CloudTrail data events** are generated for SMTP delivery, even when SES data events are enabled.
- Pontos ideais de detecção são **provisionamento de org/domínio/usuário** e SES identity ARNs referenciados em eventos `SendRawEmail` enviados pela web subsequentes.
<details>
<summary>Exemplo de envio SMTP via 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>
## Considerações de detecção
- Se o WorkMail for desnecessário, bloqueie-o via **SCPs** (`workmail:*` deny) no nível da organização.
- Alertar sobre provisionamento: `workmail:CreateOrganization`, `workmail:CreateUser`, `workmail:RegisterToWorkMail` e verificações do SES com `invokedBy=workmail.amazonaws.com` (`ses:VerifyDomainIdentity`, `ses:VerifyDomainDkim`).
- Fique atento a eventos anômalos **`ses:SendRawEmail`** onde os ARNs de identidade referenciam domínios novos e o IP/UA de origem é igual a `workmail.<region>.amazonaws.com`.
## References
- [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}}
@@ -1,4 +1,4 @@
# AWS - Enumeração de IAM, Identity Center & SSO
# AWS - IAM, Identity Center & SSO Enum
{{#include ../../../banners/hacktricks-training.md}}
@@ -10,11 +10,11 @@ Você pode encontrar uma **descrição do IAM** em:
../aws-basic-information/
{{#endref}}
### Enumeração
### Enumeration
Permissões principais necessárias:
Principais permissões necessárias:
- `iam:ListPolicies`, `iam:GetPolicy` e `iam:GetPolicyVersion`
- `iam:ListPolicies`, `iam:GetPolicy` and `iam:GetPolicyVersion`
- `iam:ListRoles`
- `iam:ListUsers`
- `iam:ListGroups`
@@ -22,9 +22,9 @@ Permissões principais necessárias:
- `iam:ListAttachedUserPolicies`
- `iam:ListAttachedRolePolicies`
- `iam:ListAttachedGroupPolicies`
- `iam:ListUserPolicies` e `iam:GetUserPolicy`
- `iam:ListGroupPolicies` e `iam:GetGroupPolicy`
- `iam:ListRolePolicies` e `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
```
### Confirmação furtiva de permissões via falhas intencionais
Quando `List*` ou as APIs do simulador estão bloqueadas, você pode **confirmar permissões de mutação sem criar recursos duráveis** forçando erros de validação previsíveis. AWS ainda avalia o IAM antes de retornar esses erros, então ver o erro comprova que o chamador tem permissão para executar a ação:
```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
```
Essas tentativas ainda geram eventos do CloudTrail (com `errorCode` definido) mas evitam deixar novos artefatos do IAM, tornando-as úteis para **validação de permissões com baixo ruído** durante recon interativo.
### Força Bruta de Permissões
Se você estiver interessado em suas próprias permissões, mas não tiver acesso para consultar o IAM, você sempre pode forçá-las.
Se você está interessado nas suas próprias permissões mas não tem acesso para consultar o IAM, você sempre pode fazer brute-force nelas.
#### bf-aws-permissions
A ferramenta [**bf-aws-permissions**](https://github.com/carlospolop/bf-aws-permissions) é apenas um script bash que executará, usando o perfil indicado, todas as ações **`list*`, `describe*`, `get*`** que puder encontrar usando as mensagens de ajuda do cli `aws` e **retornará as execuções bem-sucedidas**.
A ferramenta [**bf-aws-permissions**](https://github.com/carlospolop/bf-aws-permissions) é apenas um script bash que irá executar, usando o perfil indicado, todas as ações **`list*`, `describe*`, `get*`** que conseguir encontrar nas mensagens de ajuda do `aws` cli e **retornar as execuções bem-sucedidas**.
```bash
# Bruteforce permissions
bash bf-aws-permissions.sh -p default > /tmp/bf-permissions-verbose.txt
```
#### bf-aws-perms-simulate
A ferramenta [**bf-aws-perms-simulate**](https://github.com/carlospolop/bf-aws-perms-simulate) pode encontrar suas permissões atuais (ou as de outros principais) se você tiver a permissão **`iam:SimulatePrincipalPolicy`**
A ferramenta [**bf-aws-perms-simulate**](https://github.com/carlospolop/bf-aws-perms-simulate) pode descobrir suas permissões atuais (ou as de outros principals) se você tiver a permissão **`iam:SimulatePrincipalPolicy`**
```bash
# Ask for permissions
python3 aws_permissions_checker.py --profile <AWS_PROFILE> [--arn <USER_ARN>]
```
#### Perms2ManagedPolicies
Se você encontrou **algumas permissões que seu usuário possui**, e você acha que elas estão sendo concedidas por um **papel gerenciado da AWS** (e não por um personalizado). Você pode usar a ferramenta [**aws-Perms2ManagedRoles**](https://github.com/carlospolop/aws-Perms2ManagedPolicies) para verificar todos os **papéis gerenciados da AWS que concedem as permissões que você descobriu que possui**.
Se você encontrou **algumas permissões que seu usuário possui**, e acha que elas estão sendo concedidas por uma **role gerenciada da AWS** (e não por uma personalizada). Você pode usar a ferramenta [**aws-Perms2ManagedRoles**](https://github.com/carlospolop/aws-Perms2ManagedPolicies) para verificar todos os **roles gerenciados da AWS que concedem as permissões que você descobriu possuir**.
```bash
# Run example with my profile
python3 aws-Perms2ManagedPolicies.py --profile myadmin --permissions-file example-permissions.txt
```
> [!WARNING]
> É possível "saber" se as permissões que você tem são concedidas por um papel gerenciado da AWS se você ver que **você tem permissões sobre serviços que não são utilizados**, por exemplo.
> É possível "saber" se as permissões que você tem foram concedidas por uma função gerenciada pela AWS se você vir que, por exemplo, **você tem permissões sobre serviços que não são usados**.
#### Cloudtrail2IAM
[**CloudTrail2IAM**](https://github.com/carlospolop/Cloudtrail2IAM) é uma ferramenta Python que analisa **logs do AWS CloudTrail para extrair e resumir ações** realizadas por todos ou apenas por um usuário ou papel específico. A ferramenta irá **analisar todos os logs do cloudtrail do bucket indicado**.
[**CloudTrail2IAM**](https://github.com/carlospolop/Cloudtrail2IAM) é uma ferramenta Python que analisa **logs do AWS CloudTrail para extrair e resumir ações** realizadas por todos ou apenas por um usuário ou função específica. A ferramenta irá **processar cada log do CloudTrail do 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]
> Se você encontrar .tfstate (arquivos de estado do Terraform) ou arquivos do CloudFormation (geralmente são arquivos yaml localizados dentro de um bucket com o prefixo cf-templates), você também pode lê-los para encontrar a configuração do aws e descobrir quais permissões foram atribuídas a quem.
> Se você encontrar .tfstate (Terraform state files) ou arquivos CloudFormation (estes geralmente são arquivos yaml localizados dentro de um bucket com o prefixo cf-templates), você também pode lê-los para encontrar a configuração do aws e descobrir quais permissões foram atribuídas a quem.
#### enumerate-iam
Para usar a ferramenta [**https://github.com/andresriancho/enumerate-iam**](https://github.com/andresriancho/enumerate-iam), você primeiro precisa baixar todos os endpoints da API AWS, a partir dos quais o script **`generate_bruteforce_tests.py`** obterá todos os **"list\_", "describe\_" e "get\_" endpoints.** E finalmente, ele tentará **acessá-los** com as credenciais fornecidas e **indicar se funcionou**.
To use the tool [**https://github.com/andresriancho/enumerate-iam**](https://github.com/andresriancho/enumerate-iam) you first need to download all the API AWS endpoints, from those the script **`generate_bruteforce_tests.py`** will get all the **"list\_", "describe\_", and "get\_" endpoints.** And finally, it will try to **access them** with the given credentials and **indicate if it worked**.
(Com base na minha experiência, a **ferramenta trava em algum ponto**, [**veja esta correção**](https://github.com/andresriancho/enumerate-iam/pull/15/commits/77ad5b41216e3b5f1511d0c385da8cd5984c2d3c) para tentar corrigir isso).
(Na minha experiência a **ferramenta trava em algum ponto**, [**confira esta correção**](https://github.com/andresriancho/enumerate-iam/pull/15/commits/77ad5b41216e3b5f1511d0c385da8cd5984c2d3c) para tentar corrigir isso).
> [!WARNING]
> Com base na minha experiência, esta ferramenta é como a anterior, mas funciona pior e verifica menos permissões.
> Na minha experiência esta ferramenta é parecida com a anterior, mas funciona pior e verifica menos permissões
```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
Você também pode usar a ferramenta [**weirdAAL**](https://github.com/carnal0wnage/weirdAAL/wiki). Esta ferramenta verificará **várias operações comuns em vários serviços comuns** (verificará algumas permissões de enumeração e também algumas permissões de privesc). Mas ela só verificará os testes codificados (a única maneira de verificar mais coisas é codificando mais testes).
Você também pode usar a ferramenta [**weirdAAL**](https://github.com/carnal0wnage/weirdAAL/wiki). Esta ferramenta verificará **várias operações comuns em vários serviços comuns** (verificará algumas enumeration permissions e também algumas privesc permissions). Mas ela apenas executa as verificações codificadas (a única forma de testar mais coisas é implementar mais testes).
```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']
```
#### Ferramentas de Hardening para BF permissões
#### Ferramentas de Hardening para permissões BF
{{#tabs }}
{{#tab name="CloudSploit" }}
@@ -208,7 +220,7 @@ steampipe dashboard
#### \<YourTool>
Nenhuma das ferramentas anteriores é capaz de verificar todas as permissões, então se você conhece uma ferramenta melhor, envie um PR!
Nenhuma das ferramentas anteriores é capaz de verificar quase todas as permissões; se você conhece uma ferramenta melhor, envie um PR!
### Acesso Não Autenticado
@@ -216,15 +228,15 @@ Nenhuma das ferramentas anteriores é capaz de verificar todas as permissões, e
../aws-unauthenticated-enum-access/aws-iam-and-sts-unauthenticated-enum/README.md
{{#endref}}
### Escalação de Privilégios
### Escalada de Privilégios
Na página seguinte, você pode verificar como **abusar das permissões do IAM para escalar privilégios**:
Na página a seguir você pode ver como **abusar das permissões do IAM para escalar privilégios**:
{{#ref}}
../aws-privilege-escalation/aws-iam-privesc/README.md
{{#endref}}
### Pós Exploração do IAM
### Pós-Exploração do IAM
{{#ref}}
../aws-post-exploitation/aws-iam-post-exploitation/README.md
@@ -236,15 +248,15 @@ Na página seguinte, você pode verificar como **abusar das permissões do IAM p
../aws-persistence/aws-iam-persistence/README.md
{{#endref}}
## Centro de Identidade do IAM
## IAM Identity Center
Você pode encontrar uma **descrição do Centro de Identidade do IAM** em:
Você pode encontrar uma **descrição do IAM Identity Center** em:
{{#ref}}
../aws-basic-information/
{{#endref}}
### Conectar via SSO com CLI
### Conectar via SSO com a CLI
```bash
# Connect with sso via CLI aws configure sso
aws configure sso
@@ -260,13 +272,13 @@ sso_region = us-east-1
Os principais elementos do Identity Center são:
- Usuários e grupos
- Conjuntos de Permissões: Têm políticas anexadas
- Permission Sets: possuem políticas anexadas
- Contas AWS
Então, relacionamentos são criados para que usuários/grupos tenham Conjuntos de Permissões sobre a Conta AWS.
Em seguida, são criados relacionamentos para que usuários/grupos tenham Permission Sets em Contas AWS.
> [!NOTE]
> Note que existem 3 maneiras de anexar políticas a um Conjunto de Permissões. Anexando políticas gerenciadas pela AWS, políticas gerenciadas pelo cliente (essas políticas precisam ser criadas em todas as contas que o Conjunto de Permissões está afetando) e políticas inline (definidas ).
> Observe que existem 3 maneiras de anexar políticas a um Permission Set: políticas gerenciadas pela AWS, políticas gerenciadas pelo cliente (essas políticas precisam ser criadas em todas as contas que o Permission Set afeta) e políticas inline (definidas no próprio Permission Set).
```bash
# Check if IAM Identity Center is used
aws sso-admin list-instances
@@ -327,9 +339,9 @@ aws sso login --profile my-sso-profile
# Use dependent-profile
aws s3 ls --profile dependent-profile
```
Quando um **perfil do SSO é usado** para acessar algumas informações, as credenciais são **armazenadas em cache** em um arquivo dentro da pasta **`$HOME/.aws/sso/cache`**. Portanto, elas podem ser **lidas e usadas a partir daí**.
Quando um **perfil do SSO é usado** para acessar alguma informação, as credenciais são **armazenadas em cache** em um arquivo dentro da pasta **`$HOME/.aws/sso/cache`**. Portanto, elas podem ser **lidas e usadas a partir daí**.
Além disso, **mais credenciais** podem ser armazenadas na pasta **`$HOME/.aws/cli/cache`**. Este diretório de cache é usado principalmente quando você está **trabalhando com perfis do AWS CLI** que usam credenciais de usuário IAM ou **assumem** funções através do IAM (sem SSO). Exemplo de configuração:
Além disso, **mais credenciais** podem ser armazenadas na pasta **`$HOME/.aws/cli/cache`**. Esse diretório de cache é usado principalmente quando você está **trabalhando com perfis do AWS CLI** que usam credenciais de usuário IAM ou **assumem funções** através do IAM (sem SSO). Exemplo de configuração:
```ini
[profile crossaccountrole]
role_arn = arn:aws:iam::234567890123:role/SomeRole
@@ -343,13 +355,13 @@ external_id = 123456
../aws-unauthenticated-enum-access/aws-identity-center-and-sso-unauthenticated-enum/README.md
{{#endref}}
### Escalação de Privilégios
### Escalonamento de Privilégios
{{#ref}}
../aws-privilege-escalation/aws-sso-and-identitystore-privesc/README.md
{{#endref}}
### Pós Exploração
### Pós-Exploração
{{#ref}}
../aws-post-exploitation/aws-sso-and-identitystore-post-exploitation/README.md
@@ -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
```
- Crie um grupo e atribua permissões a ele e defina um usuário controlado nele
- permissões extras a um usuário ou grupo controlado
- Por padrão, apenas usuários com permissões da Conta de Gerenciamento poderão acessar e controlar o IAM Identity Center.
- Criar um grupo, atribuir permissões e configurar um usuário controlado nele
- Conceder permissões extras a um usuário controlado ou a um grupo
- Por padrão, apenas usuários com permissões da Management Account poderão acessar e controlar o IAM Identity Center.
No entanto, é possível, via Delegate Administrator, permitir que usuários de uma conta diferente o gerenciem. Eles não terão exatamente as mesmas permissões, mas poderão realizar [**atividades de gerenciamento**](https://docs.aws.amazon.com/singlesignon/latest/userguide/delegated-admin.html).
No entanto, é possível, via Delegate Administrator, permitir que usuários de uma conta diferente o gerenciem. Eles não terão exatamente as mesmas permissões, mas poderão executar [**management activities**](https://docs.aws.amazon.com/singlesignon/latest/userguide/delegated-admin.html).
{{#include ../../../banners/hacktricks-training.md}}