AWS - API Gateway Enum

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Unterstützen Sie HackTricks

API Gateway

Grundinformationen

AWS API Gateway ist ein umfassender Dienst, der von Amazon Web Services (AWS) angeboten wird und Entwicklern hilft, 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, einen Rahmen von Regeln und Verfahren festzulegen. Dieser Rahmen regelt den Zugriff externer Benutzer auf bestimmte Daten oder Funktionen innerhalb der Anwendung.

API Gateway ermöglicht es Ihnen, zu definieren, wie Anfragen an Ihre APIs behandelt werden sollen, und es 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 heraus aufzurufen.

API Gateway-Typen

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

  • WebSocket API: Erstellen Sie eine WebSocket-API mit persistenten Verbindungen für Echtzeitanwendungen wie Chat-Anwendungen oder Dashboards. Funktioniert mit: Lambda, HTTP, AWS-Diensten.

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

  • REST API Privat: Erstellen Sie eine REST-API, die nur von innerhalb eines VPC zugänglich ist.

Hauptkomponenten des API Gateways

  1. Ressourcen: In API Gateway sind Ressourcen die Komponenten, die die Struktur Ihrer API bilden. 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 Pfades (/, oder /users, oder /user/{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 Fehlerbehebungen 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. Zum Beispiel könnten Sie Stufenvariablen verwenden, um API-Anfragen je nach Stufe an verschiedene Lambda-Funktionen oder andere Backend-Dienste weiterzuleiten.

  • Die Stufe wird zu Beginn der URL des API Gateway-Endpunkts angezeigt.

  1. Autorisierer: Autorisierer in API Gateway sind verantwortlich für die Kontrolle des Zugriffs auf Ihre API, indem sie die Identität des Anrufers überprüfen, bevor sie die Anfrage fortsetzen. 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, übergibt API Gateway das Autorisierungstoken der Anfrage an den Lambda-Autorisierer, der das Token verarbeitet und eine IAM-Richtlinie zurückgibt, die bestimmt, welche Aktionen der Anrufer 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 ist ähnlich wie eine IAM-Richtlinie, aber speziell für 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 sie sich verbinden können. Ressourcenrichtlinien können in Kombination mit Autorisierern verwendet werden, um eine feingranulare Zugriffskontrolle für Ihre API bereitzustellen.

  • Um die Wirkung zu erzielen, muss die API nach der Änderung der Ressourcenrichtlinie erneut bereitgestellt werden.

Protokollierung

Standardmäßig sind CloudWatch Logs deaktiviert, Zugriffsprotokollierung ist deaktiviert, und X-Ray-Tracking 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 lesbare Berechtigung, die gewährt werden kann, 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

Verschiedene Berechtigungen zum Zugriff auf API Gateway-Endpunkte

Ressourcenrichtlinie

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

IAM-Authorizer

Es ist möglich festzulegen, dass eine Methode innerhalb eines Pfades (einer Ressource) IAM-Authentifizierung erfordert, um sie aufzurufen.

Wenn dies festgelegt ist, erhalten Sie den Fehler {"message":"Missing Authentication Token"}, wenn Sie versuchen, den Endpunkt ohne Authentifizierung zu erreichen.

Eine einfache Möglichkeit, das von der Anwendung erwartete Token zu generieren, ist die Verwendung von curl.

$ curl -X <method> https://<api-id>.execute-api.<region>.amazonaws.com/<stage>/<resource> --user <AWS_ACCESS_KEY>:<AWS_SECRET_KEY> --aws-sigv4 "aws:amz:<region>:execute-api"

Eine andere Möglichkeit besteht darin, den Authorization-Typ AWS Signature in Postman zu verwenden.

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

Beide Methoden generieren einen Authorization-header 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 Authorizer möglicherweise schlecht codiert wurde und das Senden von irgendetwas im Authorization header es ermöglicht, den versteckten Inhalt zu sehen.

Request Signing Using 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)

Custom Lambda Authorizer

Es ist möglich, eine Lambda-Funktion zu verwenden, die basierend auf einem gegebenen Token eine IAM-Richtlinie zurückgibt, die angibt, ob der Benutzer berechtigt ist, den API-Endpunkt aufzurufen. Sie können jede Ressourcenmethode festlegen, die den Authorizer verwenden wird.

Lambda Authorizer Code Example

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

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

Je nach Lambda-Code könnte diese Autorisierung anfällig sein

</div>

Beachten Sie, dass wenn eine **deny policy generiert und zurückgegeben wird**, die von API Gateway zurückgegebene Fehlermeldung lautet: `{"Message":"User is not authorized to access this resource with an explicit deny"}`

Auf diese Weise könnten Sie **diese Autorisierung** identifizieren.

### Erforderlicher API-Schlüssel

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

<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 sie verwendet werden können (in Bezug auf Anfragen pro Sekunde und in Bezug auf Anfragen pro Monat).

Um einen API-Schlüssel funktionsfähig zu machen, müssen Sie ihn zu einem **Nutzungsplan** hinzufügen, dieser Nutzungsplan muss zur **API-Stufe** hinzugefügt werden und die zugehörige API-Stufe muss eine konfigurierte **Methoden-Drosselung** für den **Endpunkt** haben, der den API-Schlüssel erfordert:

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

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

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

Lernen & üben Sie AWS Hacking:<img src="../../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="line">\
Lernen & üben Sie GCP Hacking: <img src="../../../.gitbook/assets/image (2) (1).png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/image (2) (1).png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)

<details>

<summary>Unterstützen Sie HackTricks</summary>

* Überprüfen Sie die [**Abonnementpläne**](https://github.com/sponsors/carlospolop)!
* **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 Hacking-Tricks, indem Sie PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub-Repos senden.

</details>

</div>

Last updated