AWS - API Gateway Enum

Nauka hakowania AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Bramka API

Podstawowe informacje

AWS API Gateway to kompleksowa usługa oferowana przez Amazon Web Services (AWS), przeznaczona dla programistów do tworzenia, publikowania i nadzorowania interfejsów API na dużą skalę. Funkcjonuje jako punkt wejścia do aplikacji, umożliwiając programistom ustanowienie ram regulacji i procedur. Ta struktura reguluje dostęp, jaki zewnętrzni użytkownicy mają do określonych danych lub funkcji w aplikacji.

Bramka API umożliwia zdefiniowanie sposobu obsługi żądań do twoich interfejsów API, a także może tworzyć niestandardowe punkty końcowe API z określonymi metodami (np. GET, POST, PUT, DELETE) i zasobami. Może również generować zestawy SDK klienta (Software Development Kits), ułatwiając programistom wywoływanie twoich interfejsów API z ich aplikacji.

Typy bramek API

  • API HTTP: Buduj niskoopóźnieniowe i ekonomiczne interfejsy REST z wbudowanymi funkcjami takimi jak OIDC i OAuth2 oraz natywnym wsparciem dla CORS. Działa z następującymi: Lambda, backendami HTTP.

  • API WebSocket: Buduj interfejs WebSocket z użyciem trwałych połączeń do zastosowań czasu rzeczywistego, takich jak aplikacje czatowe lub pulpity nawigacyjne. Działa z następującymi: Lambda, HTTP, Usługami AWS.

  • API REST: Opracuj interfejs REST, w którym zyskujesz pełną kontrolę nad żądaniem i odpowiedzią wraz z możliwościami zarządzania interfejsem API. Działa z następującymi: Lambda, HTTP, Usługami AWS.

  • Prywatne API REST: Utwórz interfejs REST, który jest dostępny tylko z wewnątrz VPC.

Główne składniki bramki API

  1. Zasoby: W bramce API zasoby to komponenty, które tworzą strukturę twojego interfejsu API. Reprezentują różne ścieżki lub punkty końcowe twojego interfejsu API i odpowiadają różnym działaniom, które obsługuje twoje API. Zasób to każda metoda (np. GET, POST, PUT, DELETE) wewnątrz każdej ścieżki (/, lub /users, lub /user/{id}).

  2. Etap: Etapy w bramce API reprezentują różne wersje lub środowiska twojego interfejsu API, takie jak rozwój, staging lub produkcja. Możesz używać etapów do zarządzania i wdrażania wielu wersji twojego interfejsu jednocześnie, umożliwiając testowanie nowych funkcji lub poprawek błędów bez wpływu na środowisko produkcyjne. Etapy obsługują również zmienne etapu, które są parami klucz-wartość, które można użyć do konfigurowania zachowania twojego interfejsu API na podstawie bieżącego etapu. Na przykład można użyć zmiennych etapu do kierowania żądań interfejsu API do różnych funkcji Lambda lub innych usług backendowych w zależności od etapu.

  • Etap jest wskazany na początku adresu URL punktu końcowego bramki API.

  1. Autoryzatory: Autoryzatory w bramce API są odpowiedzialne za kontrolę dostępu do twojego interfejsu API poprzez weryfikację tożsamości osoby dzwoniącej przed zezwoleniem na kontynuację żądania. Możesz używać funkcji AWS Lambda jako autoryzatorów niestandardowych, co pozwala ci zaimplementować własną logikę uwierzytelniania i autoryzacji. Gdy wpłynie żądanie, bramka API przekazuje token autoryzacji żądania do autoryzatora Lambda, który przetwarza token i zwraca politykę IAM, która określa, jakie działania osoba dzwoniąca ma zezwolenie wykonać. Bramka API obsługuje również wbudowane autoryzatory, takie jak AWS Identity and Access Management (IAM) i Amazon Cognito.

  2. Polityka zasobu: Polityka zasobu w bramce API to dokument JSON, który definiuje uprawnienia dostępu do twojego interfejsu API. Jest podobna do polityki IAM, ale specjalnie dostosowana do bramki API. Możesz użyć polityki zasobu do kontrolowania, kto może uzyskać dostęp do twojego interfejsu API, jakie metody mogą wywołać i z jakich adresów IP lub VPC mogą się połączyć. Polityki zasobów można używać w połączeniu z autoryzatorami, aby zapewnić precyzyjną kontrolę dostępu do twojego interfejsu API.

  • Aby zastosować zmiany, API musi zostać ponownie wdrożone po zmodyfikowaniu polityki zasobu.

Logowanie

Domyślnie dzienniki CloudWatchwyłączone, Logowanie dostępu jest wyłączone, a śledzenie X-Ray również jest wyłączone.

Wymienianie

Zauważ, że w obu interfejsach API AWS do wymieniania zasobów (apigateway i apigatewayv2) jedyną wymaganą uprawnieniem i jedynym uprawnieniem do odczytu, które można udzielić, jest apigateway:GET, dzięki czemu można wymieniać wszystko.

# Generic info
aws apigateway get-account
aws apigateway get-domain-names
aws apigateway get-usage-plans
aws apigateway get-vpc-links
aws apigateway get-client-certificates

# Enumerate APIs
aws apigateway get-rest-apis # This will also show the resource policy (if any)
## Get stages
aws apigateway get-stages --rest-api-id <id>
## Get resources
aws apigateway get-resources --rest-api-id <id>
## Get API resource action per HTTP verb (check authorizers and api key required)
aws apigateway get-method --http-method GET --rest-api-id <api-id> --resource-id <resource-id>

## Call API
https://<api-id>.execute-api.<region>.amazonaws.com/<stage>/<resource>
## API authorizers
aws apigateway get-authorizers --rest-api-id <id>
## Models
aws apigateway get-models --rest-api-id <id>
## More info
aws apigateway get-gateway-responses --rest-api-id <id>
aws apigateway get-request-validators --rest-api-id <id>
aws apigateway get-deployments --rest-api-id <id>

# Get api keys generated
aws apigateway get-api-keys --include-value
aws apigateway get-api-key --api-key <id> --include-value # Get just 1
## Example use API key
curl -X GET -H "x-api-key: AJE&Ygenu4[..]" https://e83uuftdi8.execute-api.us-east-1.amazonaws.com/dev/test
## Usage plans
aws apigateway get-usage-plans #Get limit use info
aws apigateway get-usage-plan-keys --usage-plan-id <plan_id> #Get clear text values of api keys
aws apigateway get-usage-plan-key --usage-plan-id <plan_id> --key-id <key_id>
###Already consumed
aws apigateway get-usage --usage-plan-id <plan_id> --start-date 2023-07-01 --end-date 2023-07-12

Enumerating API Gateway v2

List APIs

To list all APIs in the account, you can use the getApis method. This will return a list of APIs along with their details.

{
  "operation": "getApis",
  "params": {}
}

Get API details

To get details about a specific API, you can use the getApi method with the API ID as a parameter.

{
  "operation": "getApi",
  "params": {
    "apiId": "exampleApiId"
  }
}

List API mappings

To list all API mappings for a specific API, you can use the getApiMappings method with the API ID as a parameter.

{
  "operation": "getApiMappings",
  "params": {
    "apiId": "exampleApiId"
  }
}

Get API mapping details

To get details about a specific API mapping, you can use the getApiMapping method with the API mapping ID as a parameter.

{
  "operation": "getApiMapping",
  "params": {
    "apiId": "exampleApiId",
       "apiMappingId": "exampleApiMappingId"
  }
}
# Generic info
aws apigatewayv2 get-account --
aws apigatewayv2 get-domain-names
aws apigatewayv2 get-domain-name --domain-name <name>
aws apigatewayv2 get-usage-plans --
aws apigatewayv2 get-vpc-links
aws apigatewayv2 get-client-certificates --

# Enumerate APIs
aws apigatewayv2 get-apis # This will also show the resource policy (if any)
aws apigatewayv2 get-api --api-id <id>

## Get all the info from an api at once
aws apigatewayv2 export-api --api-id <id> --output-type YAML --specification OAS30 /tmp/api.yaml

## Get stages
aws apigatewayv2 get-stages --api-id <id>

## Get routes
aws apigatewayv2 get-routes --api-id <id>
aws apigatewayv2 get-route --api-id <id> --route-id <route-id>

## Get deployments
aws apigatewayv2 get-deployments --api-id <id>
aws apigatewayv2 get-deployment --api-id <id> --deployment-id <dep-id>

## Get integrations
aws apigatewayv2 get-integrations --api-id <id>

## Get authorizers
aws apigatewayv2 get-authorizers --api-id <id>
aws apigatewayv2 get-authorizer --api-id <id> --authorizer-id <uth-id>

## Get domain mappings
aws apigatewayv2 get-api-mappings --api-id <id> --domain-name <dom-name>
aws apigatewayv2 get-api-mapping --api-id <id> --api-mapping-id <map-id> --domain-name <dom-name>

## Get models
aws apigatewayv2 get-models --api-id <id>

## Call API
https://<api-id>.execute-api.<region>.amazonaws.com/<stage>/<resource>

Różne uprawnienia dostępu do punktów końcowych bramy API

Polityka zasobów

Możliwe jest użycie polityk zasobów do określenia, kto może wywołać punkty końcowe API. W poniższym przykładzie można zobaczyć, że wskazany adres IP nie może wywołać punktu końcowego /resource_policy za pomocą metody GET.

Autoryzator IAM

Możliwe jest ustawienie, że metody wewnątrz ścieżki (zasobu) wymagają uwierzytelnienia IAM, aby je wywołać.

Gdy to jest ustawione, otrzymasz błąd {"message":"Brak tokenu uwierzytelniającego"} gdy spróbujesz dotrzeć do punktu końcowego bez żadnej autoryzacji.

Łatwym sposobem na wygenerowanie oczekiwanego tokenu przez aplikację jest użycie typu Authorization Podpis AWS w Postmanie.

Ustaw dostęp do klucza i klucza prywatnego konta, którego chcesz użyć, i możesz uwierzytelniać się przeciwko punktowi końcowemu API.

Wygeneruje to nagłówek Authorization tak jak:

AWS4-HMAC-SHA256 Credential=AKIAYY7XU6ECUDOTWB7W/20220726/us-east-1/execute-api/aws4_request, SignedHeaders=host;x-amz-date, Signature=9f35579fa85c0d089c5a939e3d711362e92641e8c14cc571df8c71b4bc62a5c2

Zauważ, że w innych przypadkach Autoryzator mógł zostać źle zakodowany i wysłanie czegokolwiek w nagłówku Autoryzacji pozwoli na zobaczenie ukrytej zawartości.

Podpisywanie żądania za pomocą Pythona


pip install requests
pip install requests-aws4auth
pip install boto3

import boto3
import requests
from requests_aws4auth import AWS4Auth

region = 'us-east-1'  # Region
service = 'execute-api'
access_key = 'YOUR_ACCESS_KEY'
secret_key = 'YOUR_SECRET_KEY'

url = 'https://<apiid>.execute-api.us-east-1.amazonaws.com/<stage>/<resource>'

session = boto3.Session(aws_access_key_id=access_key, aws_secret_access_key=secret_key)
credentials = session.get_credentials()
awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token)

response = requests.get(url, auth=awsauth)

print(response.text)

Niestandardowy autoryzator Lambda

Istnieje możliwość użycia funkcji lambda, która na podstawie określonego tokena zwróci politykę IAM, wskazującą, czy użytkownik jest uprawniony do wywołania punktu końcowego API. Można ustawić każdą metodę zasobu, która będzie korzystać z autoryzatora.

Przykład kodu autoryzatora Lambda

```python import json

def lambda_handler(event, context): token = event['authorizationToken'] method_arn = event['methodArn']

if not token: return { 'statusCode': 401, 'body': 'Unauthorized' }

try:

Replace this with your own token validation logic

if token == "your-secret-token": return generate_policy('user', 'Allow', method_arn) else: return generate_policy('user', 'Deny', method_arn) except Exception as e: print(e) return { 'statusCode': 500, 'body': 'Internal Server Error' }

def generate_policy(principal_id, effect, resource): policy = { 'principalId': principal_id, 'policyDocument': { 'Version': '2012-10-17', 'Statement': [ { 'Action': 'execute-api:Invoke', 'Effect': effect, 'Resource': resource } ] } } return policy

</details>

Wywołaj to coś w ten sposób:

```bash
curl "https://jhhqafgh6f.execute-api.eu-west-1.amazonaws.com/prod/custom_auth" -H 'Authorization: your-secret-token'

W zależności od kodu Lambda, ta autoryzacja może być podatna

Zauważ, że jeśli została wygenerowana i zwrócona polityka odrzucenia, błąd zwrócony przez bramę API to: {"Message":"User is not authorized to access this resource with an explicit deny"}

W ten sposób można zidentyfikować tę autoryzację.

Wymagany klucz API

Możliwe jest ustawienie punktów końcowych API, które wymagają ważnego klucza API do kontaktu.

Możliwe jest generowanie kluczy API w portalu Bramy API i nawet ustawienie, ile może być używane (pod względem żądań na sekundę i pod względem żądań na miesiąc).

Aby klucz API działał, musisz dodać go do Planu Użycia, ten plan użycia musi być dodany do Etapu API i skojarzony etap API musi mieć skonfigurowane ograniczenie metod do punktu końcowego wymagającego klucza API:

Dostęp bez uwierzytelnienia

Przywileje

Po eksploatacji

Trwałość

Last updated