AWS - API Gateway Enum

Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres façons de soutenir HackTricks :

API Gateway

Informations de base

AWS API Gateway est un service complet proposé par Amazon Web Services (AWS) conçu pour que les développeurs puissent créer, publier et superviser des API à grande échelle. Il fonctionne comme un point d'entrée vers une application, permettant aux développeurs d'établir un cadre de règles et de procédures. Ce cadre régit l'accès des utilisateurs externes à certaines données ou fonctionnalités au sein de l'application.

API Gateway vous permet de définir comment les requêtes vers vos API doivent être gérées, et il peut créer des points de terminaison API personnalisés avec des méthodes spécifiques (par exemple, GET, POST, PUT, DELETE) et des ressources. Il peut également générer des SDK client (Kits de développement logiciel) pour faciliter l'appel de vos API par les développeurs depuis leurs applications.

Types de passerelles API

  • API HTTP : Construisez des API REST à faible latence et économiques avec des fonctionnalités intégrées telles que OIDC et OAuth2, et une prise en charge native de CORS. Fonctionne avec les éléments suivants : Lambda, backends HTTP.

  • API WebSocket : Créez une API WebSocket en utilisant des connexions persistantes pour des cas d'utilisation en temps réel tels que des applications de chat ou des tableaux de bord. Fonctionne avec les éléments suivants : Lambda, HTTP, Services AWS.

  • API REST : Développez une API REST où vous avez un contrôle complet sur la requête et la réponse ainsi que des capacités de gestion d'API. Fonctionne avec les éléments suivants : Lambda, HTTP, Services AWS.

  • API REST privée : Créez une API REST accessible uniquement depuis un VPC.

Principaux composants de l'API Gateway

  1. Ressources : Dans API Gateway, les ressources sont les composants qui constituent la structure de votre API. Elles représentent les différents chemins ou points de terminaison de votre API et correspondent aux différentes actions que votre API prend en charge. Une ressource est chaque méthode (par exemple, GET, POST, PUT, DELETE) à l'intérieur de chaque chemin (/, ou /utilisateurs, ou /utilisateur/{id}).

  2. Stades : Les stades dans API Gateway représentent différentes versions ou environnements de votre API, tels que développement, staging ou production. Vous pouvez utiliser des stades pour gérer et déployer plusieurs versions de votre API simultanément, vous permettant de tester de nouvelles fonctionnalités ou corrections de bogues sans affecter l'environnement de production. Les stades prennent également en charge les variables de stade, qui sont des paires clé-valeur pouvant être utilisées pour configurer le comportement de votre API en fonction du stade actuel. Par exemple, vous pourriez utiliser des variables de stade pour diriger les requêtes API vers différentes fonctions Lambda ou autres services backend en fonction du stade.

  • Le stade est indiqué au début de l'URL du point de terminaison de l'API Gateway.

  1. Autorisateurs : Les autorisateurs dans API Gateway sont responsables de contrôler l'accès à votre API en vérifiant l'identité de l'appelant avant de permettre à la requête de se poursuivre. Vous pouvez utiliser des fonctions Lambda AWS en tant qu'autorisateurs personnalisés, ce qui vous permet de mettre en œuvre votre propre logique d'authentification et d'autorisation. Lorsqu'une requête arrive, API Gateway transmet le jeton d'autorisation de la requête à l'autorisateur Lambda, qui traite le jeton et renvoie une stratégie IAM qui détermine les actions que l'appelant est autorisé à effectuer. API Gateway prend également en charge les autorisateurs intégrés, tels que IAM (Identity and Access Management) AWS et Amazon Cognito.

  2. Politique de ressources : Une politique de ressources dans API Gateway est un document JSON qui définit les autorisations d'accès à votre API. Elle est similaire à une politique IAM mais spécifiquement conçue pour API Gateway. Vous pouvez utiliser une politique de ressources pour contrôler qui peut accéder à votre API, quelles méthodes ils peuvent appeler et à partir de quelles adresses IP ou VPC ils peuvent se connecter. Les politiques de ressources peuvent être utilisées en combinaison avec des autorisateurs pour fournir un contrôle d'accès granulaire pour votre API.

  • Pour que la politique de ressources ait un effet, l'API doit être redéployée après la modification de la politique de ressources.

Journalisation

Par défaut, les logs CloudWatch sont désactivés, la journalisation d'accès est désactivée, et la trace X-Ray est également désactivée.

Énumération

Notez que dans les deux API AWS pour énumérer les ressources (apigateway et apigatewayv2), la seule autorisation dont vous avez besoin et la seule autorisation de lecture accordable est apigateway:GET, avec cela vous pouvez énumérer tout.

# 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

Enumération de l'API Gateway v2

L'API Gateway v2 peut être explorée pour identifier les ressources et les configurations exposées. Voici quelques techniques courantes d'enumération :

  1. Liste des APIs : Utilisez l'API GetApis pour obtenir la liste des APIs disponibles.

  2. Liste des Routes : Utilisez l'API GetRoutes pour récupérer les routes configurées pour une API spécifique.

  3. Liste des Intégrations : Utilisez l'API GetIntegrations pour obtenir les intégrations définies pour une route donnée.

  4. Liste des Authorizers : Utilisez l'API GetAuthorizers pour récupérer les authorizers configurés pour une API.

  5. Liste des Modèles : Utilisez l'API GetModels pour obtenir les modèles de données définis pour une API.

Ces méthodes peuvent aider à cartographier l'infrastructure de l'API Gateway v2 et à identifier les points d'entrée potentiels pour des attaques ultérieures.

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

Différentes autorisations pour accéder aux points de terminaison de l'API Gateway

Politique de ressources

Il est possible d'utiliser des politiques de ressources pour définir qui peut appeler les points de terminaison de l'API. Dans l'exemple suivant, vous pouvez voir que l'IP indiqué ne peut pas appeler le point de terminaison /resource_policy via GET.

Autorisateur IAM

Il est possible de définir qu'une méthode à l'intérieur d'un chemin (une ressource) nécessite une authentification IAM pour être appelée.

Lorsque cela est défini, vous recevrez l'erreur {"message":"Token d'authentification manquant"} lorsque vous essayez d'atteindre le point de terminaison sans aucune autorisation.

Une façon facile de générer le jeton attendu par l'application est d'utiliser le type AWS Signature dans Postman.

Définissez la clé d'accès et la clé secrète du compte que vous souhaitez utiliser et vous pourrez vous authentifier contre le point de terminaison de l'API.

Cela générera un en-tête d' autorisation tel que:

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

Notez que dans d'autres cas, l'Authorizer aurait pu être mal codé et envoyer simplement n'importe quoi à l'intérieur de l'en-tête Authorization permettra de voir le contenu caché.

Signature de la requête en utilisant 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

Il est possible d'utiliser une fonction lambda qui, en fonction d'un jeton donné, renverra une stratégie IAM indiquant si l'utilisateur est autorisé à appeler le point de terminaison de l'API. Vous pouvez définir chaque méthode de ressource qui utilisera l'auteur.

Exemple de code de l'auteur 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>

Appelez-le avec quelque chose comme :

<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: votre-jeton-secret'
</strong></code></pre>

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

Selon le code Lambda, cette autorisation pourrait être vulnérable

</div>

Notez que si une **politique de refus est générée et renvoyée**, l'erreur renvoyée par API Gateway est : `{"Message":"User is not authorized to access this resource with an explicit deny"}`

De cette manière, vous pourriez **identifier cette autorisation** en place.

### Clé API requise

Il est possible de définir des points de terminaison d'API qui **requièrent une clé API valide** pour les contacter.

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

Il est possible de générer des clés API dans le portail de l'API Gateway et même de définir combien de fois elles peuvent être utilisées (en termes de requêtes par seconde et en termes de requêtes par mois).

Pour faire fonctionner une clé API, vous devez l'ajouter à un **Plan d'utilisation**, ce plan d'utilisation doit être ajouté à la **Scène API** et la scène API associée doit avoir configuré un **throttling de méthode** vers le **point de terminaison** nécessitant la clé API :

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

## Accès non authentifié

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

## Élévation de privilèges

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

### Persistance

<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>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>

Autres façons de soutenir HackTricks :

* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** nous sur **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.

</details>

Dernière mise à jour