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

This commit is contained in:
Translator
2025-09-29 22:38:18 +00:00
parent 3d0b39a53b
commit 512456b37e
2 changed files with 46 additions and 49 deletions

View File

@@ -1,4 +1,4 @@
# AWS - STS Pós Exploração
# AWS - STS Post Exploitation
{{#include ../../../banners/hacktricks-training.md}}
@@ -10,14 +10,14 @@ Para mais informações:
../aws-services/aws-iam-enum.md
{{#endref}}
### De Credenciais IAM para Console
### De IAM Creds para o Console
Se você conseguiu obter algumas credenciais IAM, pode estar interessado em **acessar o console da web** usando as seguintes ferramentas.\
Observe que o usuário/role deve ter a permissão **`sts:GetFederationToken`**.
Se você conseguiu obter algumas credenciais IAM, pode ter interesse em **acessar o web console** usando as seguintes ferramentas.\
Observe que o usuário/função deve ter a permissão **`sts:GetFederationToken`**.
#### Script personalizado
#### Custom script
O seguinte script usará o perfil padrão e uma localização padrão da AWS (não gov e não cn) para fornecer uma URL assinada que você pode usar para fazer login no console da web:
O script a seguir usará o perfil padrão e uma localização AWS padrão (não gov e não cn) para gerar uma URL assinada que você pode usar para fazer login no web console:
```bash
# Get federated creds (you must indicate a policy or they won't have any perms)
## Even if you don't have Admin access you can indicate that policy to make sure you get all your privileges
@@ -55,7 +55,7 @@ echo -n "https://signin.aws.amazon.com/federation?Action=login&Issuer=example.co
```
#### aws_consoler
Você pode **gerar um link para o console da web** com [https://github.com/NetSPI/aws_consoler](https://github.com/NetSPI/aws_consoler).
Você pode **gerar um link do console web** com [https://github.com/NetSPI/aws_consoler](https://github.com/NetSPI/aws_consoler).
```bash
cd /tmp
python3 -m venv env
@@ -64,22 +64,22 @@ pip install aws-consoler
aws_consoler [params...] #This will generate a link to login into the console
```
> [!WARNING]
> Certifique-se de que o usuário IAM tenha permissão `sts:GetFederationToken`, ou forneça um papel para assumir.
> Certifique-se de que o usuário IAM tenha a permissão `sts:GetFederationToken`, ou forneça uma role para assumir.
#### aws-vault
[**aws-vault**](https://github.com/99designs/aws-vault) é uma ferramenta para armazenar e acessar com segurança as credenciais da AWS em um ambiente de desenvolvimento.
[**aws-vault**](https://github.com/99designs/aws-vault) é uma ferramenta para armazenar e acessar com segurança credenciais AWS em um ambiente de desenvolvimento.
```bash
aws-vault list
aws-vault exec jonsmith -- aws s3 ls # Execute aws cli with jonsmith creds
aws-vault login jonsmith # Open a browser logged as jonsmith
```
> [!NOTE]
> Você também pode usar **aws-vault** para obter uma **sessão de console do navegador**
> Você também pode usar **aws-vault** para obter uma **sessão do console no navegador**
### **Contornar restrições de User-Agent do Python**
### **Contornar restrições de User-Agent a partir do Python**
Se houver uma **restrição para realizar certas ações com base no user agent** usado (como restringir o uso da biblioteca python boto3 com base no user agent), é possível usar a técnica anterior para **conectar-se ao console da web via um navegador**, ou você pode **modificar diretamente o user-agent do boto3** fazendo:
Se houver uma **restrição para executar certas ações com base no User-Agent** usado (como restringir o uso da biblioteca python boto3 com base no User-Agent), é possível usar a técnica anterior para **conectar-se ao console web via um navegador**, ou você pode diretamente **modificar o user-agent do boto3** fazendo:
```bash
# Shared by ex16x41
# Create a client
@@ -92,4 +92,14 @@ client.meta.events.register( 'before-call.secretsmanager.GetSecretValue', lambda
# Perform the action
response = client.get_secret_value(SecretId="flag_secret") print(response['SecretString'])
```
### **`sts:GetFederationToken`**
Com essa permissão é possível criar uma identidade federada para o usuário que a executa, limitada às permissões que esse usuário possui.
```bash
aws sts get-federation-token --name <username>
```
O token retornado por sts:GetFederationToken pertence à identidade federada do usuário que o chamou, mas com permissões restritas. Mesmo que o usuário tenha direitos de administrador, certas ações — como listar IAM users ou anexar políticas — não podem ser realizadas com o token federado.
Além disso, esse método é um pouco mais furtivo, já que o usuário federado não aparece no AWS Portal; ele só pode ser observado através dos logs do CloudTrail ou de ferramentas de monitoramento.
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -6,9 +6,9 @@
### `sts:AssumeRole`
Toda função é criada com uma **política de confiança da função**, essa política indica **quem pode assumir a função criada**. Se uma função da **mesma conta** diz que uma conta pode assumi-la, isso significa que a conta poderá acessar a função (e potencialmente **privesc**).
Every role is created with a **role trust policy**, this policy indicates **who can assume the created role**. If a role from the **same account** says that an account can assume it, it means that the account will be able to access the role (and potentially **privesc**).
Por exemplo, a seguinte política de confiança da função indica que qualquer um pode assumí-la, portanto **qualquer usuário poderá privesc** para as permissões associadas a essa função.
For example, the following role trust policy indicates that anyone can assume it, therefore **any user will be able to privesc** to the permissions associated with that role.
```json
{
"Version": "2012-10-17",
@@ -23,41 +23,22 @@ Por exemplo, a seguinte política de confiança da função indica que qualquer
]
}
```
Você pode se passar por um papel executando:
Você pode se passar por um role em execução:
```bash
aws sts assume-role --role-arn $ROLE_ARN --role-session-name sessionname
```
**Impacto Potencial:** Privesc para o papel.
**Impacto Potencial:** Privesc para a role.
> [!CAUTION]
> Note que, neste caso, a permissão `sts:AssumeRole` precisa ser **indicada no papel a ser abusado** e não em uma política pertencente ao atacante.\
> Com uma exceção, para **assumir um papel de uma conta diferente**, a conta do atacante **também precisa** ter o **`sts:AssumeRole`** sobre o papel.
> Observe que neste caso a permissão `sts:AssumeRole` precisa estar **indicada na role a abusar** e não em uma policy pertencente ao atacante.\
> Com uma exceção, para **assumir uma role de uma conta diferente** a conta do atacante **também precisa** ter o **`sts:AssumeRole`** sobre a role.
### **`sts:GetFederationToken`**
Com essa permissão, é possível gerar credenciais para se passar por qualquer usuário:
```bash
aws sts get-federation-token --name <username>
```
É assim que essa permissão pode ser concedida de forma segura, sem dar acesso para impersonar outros usuários:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "sts:GetFederationToken",
"Resource": "arn:aws:sts::947247140022:federated-user/${aws:username}"
}
]
}
```
### `sts:AssumeRoleWithSAML`
Uma política de confiança com este papel concede **acesso a usuários autenticados via SAML para se passar pelo papel.**
Uma trust policy com esta role concede **a usuários autenticados via SAML o acesso para assumir a role.**
Um exemplo de uma política de confiança com esta permissão é:
Um exemplo de trust policy com essa permissão é:
```json
{
"Version": "2012-10-17",
@@ -78,36 +59,36 @@ Um exemplo de uma política de confiança com esta permissão é:
]
}
```
Para gerar credenciais para impersonar a função, em geral, você poderia usar algo como:
Para gerar credenciais para se passar pelo role, em geral você pode usar algo como:
```bash
aws sts assume-role-with-saml --role-arn <value> --principal-arn <value>
```
Mas **provedores** podem ter suas **próprias ferramentas** para facilitar isso, como [onelogin-aws-assume-role](https://github.com/onelogin/onelogin-python-aws-assume-role):
Mas os **provedores** podem ter suas **próprias ferramentas** para tornar isso mais fácil, como [onelogin-aws-assume-role](https://github.com/onelogin/onelogin-python-aws-assume-role):
```bash
onelogin-aws-assume-role --onelogin-subdomain mettle --onelogin-app-id 283740 --aws-region eu-west-1 -z 3600
```
**Impacto Potencial:** Privesc para o papel.
**Impacto Potencial:** Privesc para a role.
### `sts:AssumeRoleWithWebIdentity`
Esta permissão concede permissão para obter um conjunto de credenciais de segurança temporárias para **usuários que foram autenticados em um aplicativo móvel, web, EKS...** com um provedor de identidade web. [Saiba mais aqui.](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html)
Essa permissão permite obter um conjunto de credenciais de segurança temporárias para **usuários que foram autenticados em um aplicativo mobile, web, EKS...** com um provedor de identidade web. [Learn more here.](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html)
Por exemplo, se uma **conta de serviço EKS** deve ser capaz de **impersonar um papel IAM**, ela terá um token em **`/var/run/secrets/eks.amazonaws.com/serviceaccount/token`** e pode **assumir o papel e obter credenciais** fazendo algo como:
Por exemplo, se uma **EKS service account** precisar poder **se passar por um IAM role**, ela terá um token em **`/var/run/secrets/eks.amazonaws.com/serviceaccount/token`** e pode **assumir a role e obter credenciais** fazendo algo como:
```bash
aws sts assume-role-with-web-identity --role-arn arn:aws:iam::123456789098:role/<role_name> --role-session-name something --web-identity-token file:///var/run/secrets/eks.amazonaws.com/serviceaccount/token
# The role name can be found in the metadata of the configuration of the pod
```
### Abuso de Federação
### Federation Abuse
{{#ref}}
../aws-basic-information/aws-federation-abuse.md
{{#endref}}
### Privesc do IAM Roles Anywhere
### IAM Roles Anywhere Privesc
AWS IAM RolesAnywhere permite que cargas de trabalho fora da AWS assumam funções IAM usando certificados X.509. Mas quando as políticas de confiança não são adequadamente definidas, elas podem ser abusadas para escalonamento de privilégios.
AWS IAM RolesAnywhere permite que workloads fora da AWS assumam IAM roles usando certificados X.509. Mas quando trust policies não são devidamente limitadas, elas podem ser abusadas para privilege escalation.
Esta política não possui restrições sobre quais âncoras de confiança ou atributos de certificado são permitidos. Como resultado, qualquer certificado vinculado a qualquer âncora de confiança na conta pode ser usado para assumir esta função.
Esta policy não impõe restrições sobre qual trust anchor ou quais atributos do certificado são permitidos. Como resultado, qualquer certificado vinculado a qualquer trust anchor na conta pode ser usado para assumir este role.
```json
{
"Version": "2012-10-17",
@@ -129,7 +110,7 @@ Esta política não possui restrições sobre quais âncoras de confiança ou at
```
Para privesc, o `aws_signing_helper` é necessário de https://docs.aws.amazon.com/rolesanywhere/latest/userguide/credential-helper.html
Então, usando um certificado válido, o atacante pode pivotar para o papel de maior privilégio.
Então, usando um certificado válido, o atacante pode realizar pivot para a role de maior privilégio
```bash
aws_signing_helper credential-process \
--certificate readonly.pem \
@@ -138,6 +119,12 @@ aws_signing_helper credential-process \
--profile-arn arn:aws:rolesanywhere:us-east-1:123456789012:profile/default \
--role-arn arn:aws:iam::123456789012:role/Admin
```
A âncora de confiança valida que o certificado do cliente `readonly.pem` provém da sua CA autorizada; quando a âncora de confiança foi criada o certificado público da CA foi incluído (e agora é usado para validar `readonly.pem`). Dentro de `readonly.pem` está a chave pública, que a AWS usa para verificar que a assinatura foi feita com a sua chave privada correspondente `readonly.key`.
O certificado também comprova identidade e fornece atributos (como CN ou OU) que o perfil `default` transforma em tags, que a política de confiança da role pode usar para decidir se autoriza o acesso. Se não houver condições na política de confiança, essas tags são ignoradas e qualquer pessoa com um certificado válido é autorizada.
Para que este ataque seja possível, tanto a âncora de confiança quanto o perfil `default` devem estar ativos.
### Referências
- [https://www.ruse.tech/blogs/aws-roles-anywhere-privilege-escalation](https://www.ruse.tech/blogs/aws-roles-anywhere-privilege-escalation)