AWS - API Gateway Enum

Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:

API Gateway

Informazioni di Base

AWS API Gateway è un servizio completo offerto da Amazon Web Services (AWS) progettato per gli sviluppatori per creare, pubblicare e gestire API su larga scala. Funziona come punto di ingresso per un'applicazione, consentendo agli sviluppatori di stabilire un framework di regole e procedure. Questo framework governa l'accesso che gli utenti esterni hanno a determinati dati o funzionalità all'interno dell'applicazione.

API Gateway ti consente di definire come gestire le richieste alle tue API, e può creare endpoint API personalizzati con metodi specifici (ad esempio, GET, POST, PUT, DELETE) e risorse. Può anche generare SDK client (Software Development Kits) per facilitare agli sviluppatori la chiamata alle tue API dalle loro applicazioni.

Tipi di API Gateway

  • API HTTP: Costruisci API REST a bassa latenza e convenienti con funzionalità integrate come OIDC e OAuth2, e supporto nativo CORS. Funziona con i seguenti: Lambda, backend HTTP.

  • API WebSocket: Costruisci un'API WebSocket utilizzando connessioni persistenti per casi d'uso in tempo reale come applicazioni di chat o dashboard. Funziona con i seguenti: Lambda, HTTP, Servizi AWS.

  • API REST: Sviluppa un'API REST in cui hai il controllo completo sulla richiesta e sulla risposta insieme alle capacità di gestione dell'API. Funziona con i seguenti: Lambda, HTTP, Servizi AWS.

  • API REST Privata: Crea un'API REST accessibile solo da all'interno di una VPC.

Principali Componenti di API Gateway

  1. Risorse: In API Gateway, le risorse sono i componenti che costituiscono la struttura della tua API. Rappresentano i diversi percorsi o endpoint della tua API e corrispondono alle varie azioni supportate dalla tua API. Una risorsa è ciascun metodo (ad esempio, GET, POST, PUT, DELETE) all'interno di ciascun percorso (/, o /utenti, o /utente/{id}).

  2. Fasi: Le fasi in API Gateway rappresentano diverse versioni o ambienti della tua API, come sviluppo, staging o produzione. Puoi utilizzare le fasi per gestire e distribuire più versioni della tua API contemporaneamente, consentendoti di testare nuove funzionalità o correzioni di bug senza influenzare l'ambiente di produzione. Le fasi supportano anche le variabili di fase, che sono coppie chiave-valore che possono essere utilizzate per configurare il comportamento della tua API in base alla fase corrente. Ad esempio, potresti utilizzare le variabili di fase per indirizzare le richieste API a diverse funzioni Lambda o altri servizi backend a seconda della fase.

  • La fase è indicata all'inizio dell'URL del punto di accesso di API Gateway.

  1. Autorizzatori: Gli autorizzatori in API Gateway sono responsabili del controllo dell'accesso alla tua API verificando l'identità del chiamante prima di consentire alla richiesta di procedere. Puoi utilizzare funzioni Lambda di AWS come autorizzatori personalizzati, che ti consentono di implementare la tua logica di autenticazione e autorizzazione. Quando arriva una richiesta, API Gateway passa il token di autorizzazione della richiesta all'autorizzatore Lambda, che elabora il token e restituisce una policy IAM che determina quali azioni il chiamante è autorizzato a eseguire. API Gateway supporta anche autorizzatori integrati, come Identity and Access Management (IAM) di AWS e Amazon Cognito.

  2. Policy delle Risorse: Una policy delle risorse in API Gateway è un documento JSON che definisce i permessi per accedere alla tua API. È simile a una policy IAM ma specificamente progettata per API Gateway. Puoi utilizzare una policy delle risorse per controllare chi può accedere alla tua API, quali metodi possono chiamare e da quali indirizzi IP o VPC possono connettersi. Le policy delle risorse possono essere utilizzate in combinazione con gli autorizzatori per fornire un controllo degli accessi dettagliato per la tua API.

  • Per rendere effettiva l'API è necessario rilasciarla nuovamente dopo che la policy delle risorse è stata modificata.

Registrazione

Per impostazione predefinita, i Log di CloudWatch sono disattivati, il Logging di Accesso è disattivato, e il tracciamento X-Ray è anche disattivato.

Enumerazione

Nota che in entrambe le API AWS per enumerare risorse (apigateway e apigatewayv2) l'unica autorizzazione di cui hai bisogno e l'unica autorizzazione di lettura concessa è apigateway:GET, con quella puoi enumerare tutto.

# 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

Diverse autorizzazioni per accedere ai punti finali dell'API Gateway

Policy delle risorse

È possibile utilizzare le policy delle risorse per definire chi può chiamare i punti finali dell'API. Nell'esempio seguente puoi vedere che l'IP indicato non può chiamare il punto finale /resource_policy tramite GET.

IAM Authorizer

È possibile impostare che un metodo all'interno di un percorso (una risorsa) richieda l'autenticazione IAM per chiamarlo.

Quando ciò è impostato, riceverai l'errore {"message":"Missing Authentication Token"} quando cerchi di raggiungere il punto finale senza alcuna autorizzazione.

Un modo semplice per generare il token previsto dall'applicazione è utilizzare il tipo AWS Signature all'interno di Postman.

Imposta l'accessKey e il SecretKey dell'account che desideri utilizzare e potrai autenticarti contro il punto finale dell'API.

Genererà un header di Autorizzazione come:

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

Nota che in altri casi l'Authorizer potrebbe essere stato codificato male e inviare qualsiasi cosa all'interno dell'intestazione di autorizzazione permetterà di vedere il contenuto nascosto.

Firma della richiesta usando 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)

Autorizzatore Lambda personalizzato

È possibile utilizzare una funzione lambda che, basandosi su un token fornito, restituirà una policy IAM indicando se l'utente è autorizzato a chiamare il punto finale dell'API. È possibile impostare ciascun metodo della risorsa che utilizzerà l'autorizzatore.

Esempio di codice dell'autorizzatore 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>

Chiamalo con qualcosa del genere:

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

A seconda del codice Lambda, questa autorizzazione potrebbe essere vulnerabile

</div>

Nota che se viene generata e restituita una **policy di negazione**, l'errore restituito da API Gateway è: `{"Message":"User is not authorized to access this resource with an explicit deny"}`

In questo modo potresti **identificare che questa autorizzazione** è in atto.

### Chiave API richiesta

È possibile impostare endpoint API che **richiedono una chiave API valida** per contattarli.

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

È possibile generare chiavi API nel portale di API Gateway e anche impostare quanto può essere utilizzata (in termini di richieste al secondo e in termini di richieste al mese).

Per far funzionare una chiave API, è necessario aggiungerla a un **Piano di utilizzo**, questo piano di utilizzo deve essere aggiunto alla **Fase API** e la fase API associata deve avere configurato un **limitatore di metodo** per il **endpoint** che richiede la chiave API:

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

## Accesso non autenticato

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

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

### Persistenza

<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>Impara l'hacking di AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>

Altri modi per supportare HackTricks:

* Se vuoi vedere la tua **azienda pubblicizzata in HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Ottieni il [**merchandising ufficiale PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT esclusivi**](https://opensea.io/collection/the-peass-family)
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR a** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.

</details>

Last updated