AWS - API Gateway Enum

Erlernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

API Gateway

Grundlegende Informationen

AWS API Gateway ist ein umfassender Service von Amazon Web Services (AWS), der für Entwickler entwickelt wurde, um APIs in großem Maßstab zu erstellen, zu veröffentlichen und zu überwachen. Es fungiert als Einstiegspunkt für eine Anwendung und ermöglicht es Entwicklern, ein Regelwerk und Verfahren festzulegen. Dieses Regelwerk regelt den Zugriff externer Benutzer auf bestimmte Daten oder Funktionen innerhalb der Anwendung.

API Gateway ermöglicht es Ihnen, festzulegen, wie Anfragen an Ihre APIs behandelt werden sollen, und kann benutzerdefinierte API-Endpunkte mit spezifischen Methoden (z. B. GET, POST, PUT, DELETE) und Ressourcen erstellen. Es kann auch Client-SDKs (Software Development Kits) generieren, um es Entwicklern zu erleichtern, Ihre APIs aus ihren Anwendungen aufzurufen.

Arten von API-Gateways

  • HTTP-API: Erstellen Sie latenzarme und kostengünstige REST-APIs mit integrierten Funktionen wie OIDC und OAuth2 sowie nativer CORS-Unterstützung. Funktioniert mit folgendem: Lambda, HTTP-Backends.

  • WebSocket-API: Erstellen Sie eine WebSocket-API mit persistenter Verbindung für Echtzeitanwendungsfälle wie Chat-Anwendungen oder Dashboards. Funktioniert mit folgendem: Lambda, HTTP, AWS-Services.

  • REST-API: Entwickeln Sie eine REST-API, bei der Sie die vollständige Kontrolle über die Anfrage und Antwort sowie über API-Verwaltungsfunktionen haben. Funktioniert mit folgendem: Lambda, HTTP, AWS-Services.

  • REST-API privat: Erstellen Sie eine REST-API, die nur aus einem VPC heraus zugänglich ist.

Hauptkomponenten des API-Gateways

  1. Ressourcen: In API Gateway sind Ressourcen die Komponenten, die die Struktur Ihrer API ausmachen. Sie repräsentieren die verschiedenen Pfade oder Endpunkte Ihrer API und entsprechen den verschiedenen Aktionen, die Ihre API unterstützt. Eine Ressource ist jede Methode (z. B. GET, POST, PUT, DELETE) innerhalb jedes Pfads (/, oder /benutzer, oder /benutzer/{id}).

  2. Stufen: Stufen in API Gateway repräsentieren verschiedene Versionen oder Umgebungen Ihrer API, wie Entwicklung, Staging oder Produktion. Sie können Stufen verwenden, um mehrere Versionen Ihrer API gleichzeitig zu verwalten und bereitzustellen, sodass Sie neue Funktionen oder Fehlerkorrekturen testen können, ohne die Produktionsumgebung zu beeinträchtigen. Stufen unterstützen auch Stufenvariablen, die Schlüssel-Wert-Paare sind, die verwendet werden können, um das Verhalten Ihrer API basierend auf der aktuellen Stufe zu konfigurieren. Sie könnten beispielsweise Stufenvariablen verwenden, um API-Anfragen an verschiedene Lambda-Funktionen oder andere Backend-Services je nach Stufe zu leiten.

  • Die Stufe wird am Anfang der URL des API-Gateway-Endpunkts angezeigt.

  1. Autorisierer: Autorisierer in API Gateway sind dafür verantwortlich, den Zugriff auf Ihre API zu steuern, indem sie die Identität des Aufrufers überprüfen, bevor die Anfrage fortgesetzt wird. Sie können AWS Lambda-Funktionen als benutzerdefinierte Autorisierer verwenden, was es Ihnen ermöglicht, Ihre eigene Authentifizierungs- und Autorisierungslogik zu implementieren. Wenn eine Anfrage eingeht, leitet API Gateway den Autorisierungstoken der Anfrage an den Lambda-Autorisierer weiter, der den Token verarbeitet und eine IAM-Richtlinie zurückgibt, die bestimmt, welche Aktionen der Aufrufer ausführen darf. API Gateway unterstützt auch eingebaute Autorisierer wie AWS Identity and Access Management (IAM) und Amazon Cognito.

  2. Ressourcenrichtlinie: Eine Ressourcenrichtlinie in API Gateway ist ein JSON-Dokument, das die Berechtigungen für den Zugriff auf Ihre API definiert. Sie ähnelt einer IAM-Richtlinie, ist jedoch speziell auf API Gateway zugeschnitten. Sie können eine Ressourcenrichtlinie verwenden, um zu steuern, wer auf Ihre API zugreifen kann, welche Methoden sie aufrufen können und von welchen IP-Adressen oder VPCs aus sie eine Verbindung herstellen können. Ressourcenrichtlinien können in Kombination mit Autorisierern verwendet werden, um eine fein abgestufte Zugriffssteuerung für Ihre API bereitzustellen.

  • Um die API wirksam zu machen, muss sie nach der Änderung der Ressourcenrichtlinie erneut bereitgestellt werden.

Protokollierung

Standardmäßig sind CloudWatch-Protokolle deaktiviert, Zugriffsprotokollierung ist deaktiviert, und X-Ray-Tracing ist ebenfalls deaktiviert.

Enumeration

Beachten Sie, dass in beiden AWS-APIs zur Auflistung von Ressourcen (apigateway und apigatewayv2) die einzige Berechtigung, die Sie benötigen, und die einzige erteilbare Leseberechtigung apigateway:GET ist. Damit können Sie alles auflisten.

# 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

AWS API Gateway v2 Enumeration

HTTP API

  • Endpoint: https://apigateway.<region>.amazonaws.com/v2/

  • Method: GET

  • Headers:

    • Authorization: Bearer <token>

  • Response Codes:

    • 200: Successful request

    • 401: Unauthorized request

    • 403: Forbidden request

WebSocket API

  • Endpoint: https://apigateway.<region>.amazonaws.com/v2/

  • Method: GET

  • Headers:

    • Authorization: Bearer <token>

  • Response Codes:

    • 200: Successful request

    • 401: Unauthorized request

    • 403: Forbidden request

API Gateway Management API

  • Endpoint: https://apigateway.<region>.amazonaws.com/v2/

  • Method: GET

  • Headers:

    • Authorization: Bearer <token>

  • Response Codes:

    • 200: Successful request

    • 401: Unauthorized request

    • 403: Forbidden request

API Gateway V2 API

  • Endpoint: https://apigateway.<region>.amazonaws.com/v2/

  • Method: GET

  • Headers:

    • Authorization: Bearer <token>

  • Response Codes:

    • 200: Successful request

    • 401: Unauthorized request

    • 403: Forbidden request

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

Verschiedene Autorisierungen zum Zugriff auf API Gateway-Endpunkte

Ressourcenrichtlinie

Es ist möglich, Ressourcenrichtlinien zu verwenden, um festzulegen, wer die API-Endpunkte aufrufen darf. Im folgenden Beispiel sehen Sie, dass die angegebene IP den Endpunkt /resource_policy über GET nicht aufrufen kann.

IAM-Autorisierung

Es ist möglich festzulegen, dass ein Methode innerhalb eines Pfads (einer Ressource) eine IAM-Authentifizierung erfordert, um aufgerufen zu werden.

Wenn dies festgelegt ist, erhalten Sie den Fehler {"message":"Fehlendes Authentifizierungstoken"}, wenn Sie versuchen, den Endpunkt ohne Autorisierung zu erreichen.

Ein einfacher Weg, um das erwartete Token durch die Anwendung zu generieren, ist die Verwendung des Typs Authorization AWS Signature in Postman.

Setzen Sie den AccessKey und den SecretKey des Kontos, das Sie verwenden möchten, und Sie können sich gegen den API-Endpunkt authentifizieren.

Es wird einen Autorisierungsheader generieren wie:

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

Beachten Sie, dass in anderen Fällen der Autorisierer möglicherweise schlecht codiert wurde und das Senden von beliebigem Inhalt im Autorisierungsheader es ermöglicht, den versteckten Inhalt zu sehen.

Anforderungssignierung mit Python


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)

Benutzerdefinierter Lambda-Autorisierer

Es ist möglich, eine Lambda-Funktion zu verwenden, die basierend auf einem bereitgestellten Token eine IAM-Richtlinie zurückgibt, die anzeigt, ob der Benutzer berechtigt ist, den API-Endpunkt aufzurufen. Sie können für jeden Ressourcenmethode festlegen, die den Autorisierer verwenden wird.

Beispielcode für den Lambda-Autorisierer

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

Rufen Sie es mit etwas wie:

<pre class="language-bash" data-overflow="wrap"><code class="lang-bash"><strong>curl "https://jhhqafgh6f.execute-api.eu-west-1.amazonaws.com/prod/custom_auth" -H 'Authorization: your-secret-token'
</strong></code></pre>

<div data-gb-custom-block data-tag="hint" data-style='warning'>

Abhängig vom Lambda-Code könnte diese Autorisierung anfällig sein

</div>

Beachten Sie, dass bei einer **deny-Richtlinie, die generiert und zurückgegeben wird**, der von der API Gateway zurückgegebene Fehler lautet: `{"Message":"User is not authorized to access this resource with an explicit deny"}`

Auf diese Weise könnten Sie **feststellen, dass diese Autorisierung** vorhanden ist.

### Erforderlicher API-Schlüssel

Es ist möglich, API-Endpunkte festzulegen, die einen **gültigen API-Schlüssel** erfordern, um sie zu kontaktieren.

<figure><img src="../../../.gitbook/assets/image (88).png" alt=""><figcaption></figcaption></figure>

Es ist möglich, API-Schlüssel im API Gateway-Portal zu generieren und sogar festzulegen, wie oft er verwendet werden kann (in Bezug auf Anfragen pro Sekunde und pro Monat).

Um einen API-Schlüssel zu aktivieren, müssen Sie ihn einem **Nutzungsplan** hinzufügen. Dieser Nutzungsplan muss dem **API-Stage** hinzugefügt werden, und der zugehörige API-Stage muss ein **Methoden-Drosselung** zum **Endpunkt** haben, der den API-Schlüssel erfordert:

<figure><img src="../../../.gitbook/assets/image (198).png" alt=""><figcaption></figcaption></figure>

## Nicht authentifizierter Zugriff

<div data-gb-custom-block data-tag="content-ref" data-url='../aws-unauthenticated-enum-access/aws-api-gateway-unauthenticated-enum.md'>

[aws-api-gateway-unauthenticated-enum.md](../aws-unauthenticated-enum-access/aws-api-gateway-unauthenticated-enum.md)

</div>

## Privesc

<div data-gb-custom-block data-tag="content-ref" data-url='../aws-privilege-escalation/aws-apigateway-privesc.md'>

[aws-apigateway-privesc.md](../aws-privilege-escalation/aws-apigateway-privesc.md)

</div>

## Post-Exploitation

<div data-gb-custom-block data-tag="content-ref" data-url='../aws-post-exploitation/aws-api-gateway-post-exploitation.md'>

[aws-api-gateway-post-exploitation.md](../aws-post-exploitation/aws-api-gateway-post-exploitation.md)

</div>

### Persistenz

<div data-gb-custom-block data-tag="content-ref" data-url='../aws-persistence/aws-api-gateway-persistence.md'>

[aws-api-gateway-persistence.md](../aws-persistence/aws-api-gateway-persistence.md)

</div>

<details>

<summary><strong>Lernen Sie AWS-Hacking von Null auf Held mit</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>

Andere Möglichkeiten, HackTricks zu unterstützen:

* Wenn Sie Ihr **Unternehmen in HackTricks beworben sehen möchten** oder **HackTricks als PDF herunterladen möchten**, überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)!
* Holen Sie sich das [**offizielle PEASS & HackTricks-Merch**](https://peass.creator-spring.com)
* Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Treten Sie der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folgen** Sie uns auf **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub-Repositories einreichen.

</details>

Last updated