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 un punto di accesso a un'applicazione, consentendo agli sviluppatori di stabilire un insieme di regole e procedure. Questo insieme governa l'accesso che gli utenti esterni hanno a determinati dati o funzionalità all'interno dell'applicazione.
API Gateway ti consente di definire come le richieste alle tue API devono essere gestite, e può creare endpoint API personalizzati con metodi specifici (ad es., GET, POST, PUT, DELETE) e risorse. Può anche generare SDK client (Software Development Kits) per facilitare agli sviluppatori la chiamata delle tue API dalle loro applicazioni.
Tipi di API Gateway
HTTP API: Crea API REST a bassa latenza e costo con funzionalità integrate come OIDC e OAuth2, e supporto nativo per CORS. Funziona con i seguenti: Lambda, backend HTTP.
WebSocket API: Crea 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.
REST API: Sviluppa un'API REST dove hai il completo controllo sulla richiesta e sulla risposta insieme alle capacità di gestione delle API. Funziona con i seguenti: Lambda, HTTP, Servizi AWS.
REST API Privata: Crea un'API REST accessibile solo dall'interno di una VPC.
Componenti principali di API Gateway
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 che la tua API supporta. Una risorsa è ogni metodo (ad es., GET, POST, PUT, DELETE) all'interno di ciascun percorso (/, o /users, o /user/{id}).
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 simultaneamente, consentendoti di testare nuove funzionalità o correzioni di bug senza influenzare l'ambiente di produzione. Le fasi supportano anche variabili di fase, che sono coppie chiave-valore che possono essere utilizzate per configurare il comportamento della tua API in base alla fase attuale. Ad esempio, potresti utilizzare 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 dell'endpoint API Gateway.
Autenticatori: Gli autenticatori in API Gateway sono responsabili di controllare l'accesso alla tua API verificando l'identità del chiamante prima di consentire la richiesta di procedere. Puoi utilizzare funzioni AWS Lambda come autenticatori personalizzati, il che ti consente di implementare la tua logica di autenticazione e autorizzazione. Quando arriva una richiesta, API Gateway passa il token di autorizzazione della richiesta all'autenticatore Lambda, che elabora il token e restituisce una policy IAM che determina quali azioni il chiamante è autorizzato a eseguire. API Gateway supporta anche autenticatori integrati, come AWS Identity and Access Management (IAM) e Amazon Cognito.
Politica delle risorse: Una politica delle risorse in API Gateway è un documento JSON che definisce i permessi per accedere alla tua API. È simile a una policy IAM ma specificamente adattata per API Gateway. Puoi utilizzare una politica delle risorse per controllare chi può accedere alla tua API, quali metodi possono chiamare e da quali indirizzi IP o VPC possono connettersi. Le politiche delle risorse possono essere utilizzate in combinazione con gli autenticatori per fornire un controllo degli accessi dettagliato per la tua API.
Per rendere effettiva la modifica, l'API deve essere ridistribuita dopo che la politica delle risorse è stata modificata.
Logging
Per impostazione predefinita, CloudWatch Logs sono disattivati, Access Logging è disattivato, e X-Ray tracing è anch'esso disattivato.
Enumerazione
Nota che in entrambe le API AWS per enumerare le risorse (apigateway e apigatewayv2) l'unico permesso di cui hai bisogno e l'unico permesso di lettura concessibile è apigateway:GET, con quello puoi enumerare tutto.
# Generic infoawsapigatewayget-accountawsapigatewayget-domain-namesawsapigatewayget-usage-plansawsapigatewayget-vpc-linksawsapigatewayget-client-certificates# Enumerate APIsawsapigatewayget-rest-apis# This will also show the resource policy (if any)## Get stagesawsapigatewayget-stages--rest-api-id<id>## Get resourcesawsapigatewayget-resources--rest-api-id<id>## Get API resource action per HTTP verb (check authorizers and api key required)awsapigatewayget-method--http-methodGET--rest-api-id<api-id>--resource-id<resource-id>## Call APIhttps://<api-id>.execute-api.<region>.amazonaws.com/<stage>/<resource>## API authorizersawsapigatewayget-authorizers--rest-api-id<id>## Modelsawsapigatewayget-models--rest-api-id<id>## More infoawsapigatewayget-gateway-responses--rest-api-id<id>awsapigatewayget-request-validators--rest-api-id<id>awsapigatewayget-deployments--rest-api-id<id># Get api keys generatedawsapigatewayget-api-keys--include-valueawsapigatewayget-api-key--api-key<id>--include-value# Get just 1## Example use API keycurl-XGET-H"x-api-key: AJE&Ygenu4[..]"https://e83uuftdi8.execute-api.us-east-1.amazonaws.com/dev/test## Usage plansawsapigatewayget-usage-plans#Get limit use infoawsapigatewayget-usage-plan-keys--usage-plan-id<plan_id>#Get clear text values of api keysawsapigatewayget-usage-plan-key--usage-plan-id<plan_id>--key-id<key_id>###Already consumedawsapigatewayget-usage--usage-plan-id<plan_id>--start-date2023-07-01--end-date2023-07-12
# Generic infoawsapigatewayv2get-domain-namesawsapigatewayv2get-domain-name--domain-name<name>awsapigatewayv2get-vpc-links# Enumerate APIsawsapigatewayv2get-apis# This will also show the resource policy (if any)awsapigatewayv2get-api--api-id<id>## Get all the info from an api at onceawsapigatewayv2export-api--api-id<id>--output-typeYAML--specificationOAS30/tmp/api.yaml## Get stagesawsapigatewayv2get-stages--api-id<id>## Get routesawsapigatewayv2get-routes--api-id<id>awsapigatewayv2get-route--api-id<id>--route-id<route-id>## Get deploymentsawsapigatewayv2get-deployments--api-id<id>awsapigatewayv2get-deployment--api-id<id>--deployment-id<dep-id>## Get integrationsawsapigatewayv2get-integrations--api-id<id>## Get authorizersawsapigatewayv2get-authorizers--api-id<id>awsapigatewayv2get-authorizer--api-id<id>--authorizer-id<uth-id>## Get domain mappingsawsapigatewayv2get-api-mappings--api-id<id>--domain-name<dom-name>awsapigatewayv2get-api-mapping--api-id<id>--api-mapping-id<map-id>--domain-name<dom-name>## Get modelsawsapigatewayv2get-models--api-id<id>## Call APIhttps://<api-id>.execute-api.<region>.amazonaws.com/<stage>/<resource>
Diverse autorizzazioni per accedere agli endpoint di API Gateway
Politica delle risorse
È possibile utilizzare le politiche delle risorse per definire chi può chiamare gli endpoint API.
Nell'esempio seguente puoi vedere che l'IP indicato non può chiamare l'endpoint /resource_policy tramite GET.
Autenticatore IAM
È possibile impostare che un metodo all'interno di un percorso (una risorsa) richieda l'autenticazione IAM per essere chiamato.
Quando questo è impostato, riceverai l'errore {"message":"Missing Authentication Token"} quando cerchi di raggiungere l'endpoint senza alcuna autorizzazione.
Un modo semplice per generare il token atteso dall'applicazione è utilizzare curl.
Nota che in altri casi l'Authorizer potrebbe essere mal codificato e inviare qualsiasi cosa all'interno dell'Authorization headerpermetterà di vedere il contenuto nascosto.
È possibile utilizzare un lambda che, basato su un dato token, restituirà una policy IAM che indica se l'utente è autorizzato a chiamare l'endpoint API.
Puoi impostare ogni metodo di risorsa che utilizzerà l'autenticatore.
</details>
Chiamalo con qualcosa come:
<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 questa autorizzazione** in atto.
### Chiave API richiesta
È possibile impostare endpoint API che **richiedono una chiave API valida** per contattarla.
<figure><img src="../../../.gitbook/assets/image (88).png" alt=""><figcaption></figcaption></figure>
È possibile generare chiavi API nel portale API Gateway e persino impostare quanto possono essere utilizzate (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 allo **Stadio API** e lo stadio API associato deve avere configurato un **throttling del metodo** per l'**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 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>
## 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>
<div data-gb-custom-block data-tag="hint" data-style='success'>
Impara e pratica il hacking AWS:<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">\
Impara e pratica il hacking GCP: <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>Supporta HackTricks</summary>
* Controlla i [**piani di abbonamento**](https://github.com/sponsors/carlospolop)!
* **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 trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos di github.
</details>
</div>