AWS - API Gateway Enum

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

API Gateway

Osnovne informacije

AWS API Gateway je sveobuhvatna usluga koju nudi Amazon Web Services (AWS) dizajnirana za developere da kreiraju, objave i nadgledaju API-je u velikom obimu. Funkcioniše kao ulazna tačka u aplikaciju, omogućavajući developerima da uspostave okvir pravila i procedura. Ovaj okvir upravlja pristupom spoljnih korisnika određenim podacima ili funkcionalnostima unutar aplikacije.

API Gateway omogućava da definišete kako zahtevi ka vašim API-jima treba da budu obrađeni, i može kreirati prilagođene API endpointe sa specifičnim metodama (npr. GET, POST, PUT, DELETE) i resursima. Takođe može generisati SDK-ove klijenata (Software Development Kits) kako bi olakšao developerima pozivanje vaših API-ja iz njihovih aplikacija.

Tipovi API Gateway-a

  • HTTP API: Izgradite nisko-latentne i ekonomične REST API-je sa ugrađenim funkcijama kao što su OIDC i OAuth2, i nativnom CORS podrškom. Radi sa sledećim: Lambda, HTTP backends.

  • WebSocket API: Izgradite WebSocket API koristeći trajne veze za realno vreme kao što su aplikacije za čet ili kontrolne table. Radi sa sledećim: Lambda, HTTP, AWS Services.

  • REST API: Razvijte REST API gde imate potpunu kontrolu nad zahtevom i odgovorom zajedno sa mogućnostima upravljanja API-jem. Radi sa sledećim: Lambda, HTTP, AWS Services.

  • REST API Private: Kreirajte REST API koji je dostupan samo iz VPC-a.

Glavne komponente API Gateway-a

  1. Resursi: U API Gateway-u, resursi su komponente koje čine strukturu vašeg API-ja. Oni predstavljaju različite putanje ili endpointe vašeg API-ja i odgovaraju različitim akcijama koje vaš API podržava. Resurs je svaka metoda (npr. GET, POST, PUT, DELETE) unutar svake putanje (/, ili /korisnici, ili /korisnik/{id}).

  2. Faze: Faze u API Gateway-u predstavljaju različite verzije ili okruženja vašeg API-ja, kao što su razvoj, staging ili produkcija. Možete koristiti faze za upravljanje i implementaciju više verzija vašeg API-ja istovremeno, omogućavajući vam testiranje novih funkcionalnosti ili ispravki bagova bez uticaja na produkciono okruženje. Faze takođe podržavaju varijable faze, koje su parovi ključ-vrednost koji se mogu koristiti za konfigurisanje ponašanja vašeg API-ja na osnovu trenutne faze. Na primer, mogli biste koristiti varijable faze da usmerite zahteve API-ja ka različitim Lambda funkcijama ili drugim backend servisima u zavisnosti od faze.

  • Faza je naznačena na početku URL-a API Gateway endpointa.

  1. Autorizatori: Autorizatori u API Gateway-u su odgovorni za kontrolu pristupa vašem API-ju proverom identiteta pozivaoca pre nego što dozvole zahtev da se nastavi. Možete koristiti AWS Lambda funkcije kao prilagođene autorizatore, što vam omogućava da implementirate svoju autentifikaciju i autorizaciju. Kada zahtev stigne, API Gateway prosleđuje autorizacioni token zahteva Lambda autorizatoru, koji obrađuje token i vraća IAM politiku koja određuje koje akcije pozivalac može da izvrši. API Gateway takođe podržava ugrađene autorizatore, kao što su AWS Identity and Access Management (IAM) i Amazon Cognito.

  2. Politika resursa: Politika resursa u API Gateway-u je JSON dokument koji definiše dozvole za pristup vašem API-ju. Slično je IAM politici, ali je posebno prilagođena za API Gateway. Možete koristiti politiku resursa da kontrolišete ko može pristupiti vašem API-ju, koje metode mogu pozvati i sa kojih IP adresa ili VPC-a mogu da se povežu. Politike resursa mogu se koristiti u kombinaciji sa autorizatorima kako bi pružile detaljnu kontrolu pristupa vašem API-ju.

  • Da bi politika resursa imala efekta, API mora biti ponovo implementiran nakon što se politika resursa izmeni.

Logovanje

Podrazumevano, CloudWatch Logs su isključeni, Access Logging je isključen, a X-Ray praćenje je takođe isključeno.

Enumeracija

Imajte na umu da u oba AWS API-ja za enumeraciju resursa (apigateway i apigatewayv2) jedina dozvola koja vam je potrebna i jedina dozvola za čitanje koja se može dodeliti je apigateway:GET, sa tim možete enumerisati sve.

# 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

Enumerating AWS API Gateway v2

List API Gateway v2 APIs

To list all API Gateway v2 APIs in the current AWS account, you can use the following AWS CLI command:

aws apigatewayv2 get-apis

This command will return a list of all API Gateway v2 APIs along with their details such as API ID, name, protocol type, and creation date.

Describe API Gateway v2 API

To get more detailed information about a specific API Gateway v2 API, you can use the following AWS CLI command:

aws apigatewayv2 get-api --api-id <api-id>

Replace <api-id> with the actual API ID you want to describe. This command will provide detailed information about the specified API including routes, integrations, authorizers, and other configurations.

List API Gateway v2 Integrations

To list all integrations for a specific API Gateway v2 API, you can use the following AWS CLI command:

aws apigatewayv2 get-integrations --api-id <api-id>

Replace <api-id> with the API ID for which you want to list the integrations. This command will return a list of all integrations configured for the specified API.

List API Gateway v2 Routes

To list all routes for a specific API Gateway v2 API, you can use the following AWS CLI command:

aws apigatewayv2 get-routes --api-id <api-id>

Replace <api-id> with the API ID for which you want to list the routes. This command will return a list of all routes configured for the specified API.

List API Gateway v2 Authorizers

To list all authorizers for a specific API Gateway v2 API, you can use the following AWS CLI command:

aws apigatewayv2 get-authorizers --api-id <api-id>

Replace <api-id> with the API ID for which you want to list the authorizers. This command will return a list of all authorizers configured for the specified API.

List API Gateway v2 Deployments

To list all deployments for a specific API Gateway v2 API, you can use the following AWS CLI command:

aws apigatewayv2 get-deployments --api-id <api-id>

Replace <api-id> with the API ID for which you want to list the deployments. This command will return a list of all deployments made for the specified API.

List API Gateway v2 Stages

To list all stages for a specific API Gateway v2 API, you can use the following AWS CLI command:

aws apigatewayv2 get-stages --api-id <api-id>

Replace <api-id> with the API ID for which you want to list the stages. This command will return a list of all stages configured for the specified API.

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

Različite autorizacije za pristup API Gateway endpointima

Politika resursa

Moguće je koristiti politike resursa da definišemo ko može pozvati API endpointe. U sledećem primeru možete videti da označena IP adresa ne može pozvati endpoint /resource_policy putem GET zahteva.

IAM Autorizator

Moguće je postaviti da metodi unutar putanje (resursa) zahtevaju IAM autentifikaciju da bi bili pozvani.

Kada je ovo postavljeno, dobićete grešku {"message":"Missing Authentication Token"} kada pokušate da pristupite endpointu bez autorizacije.

Jedan jednostavan način da generišete očekivani token pomoću aplikacije je korišćenjem Authorization tipa AWS Signature unutar Postman-a.

Postavite pristupni ključ i tajni ključ naloga koji želite da koristite i možete se autentifikovati protiv API endpointa.

Generisaće se Authorization header kao što je:

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

Potrebno potpisivanje zahteva korišćenjem Python-a


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)

Prilagođeni Lambda autorizator

Moguće je koristiti lambda funkciju koja će na osnovu datog tokena vratiti IAM politiku koja će pokazati da li je korisnik ovlašćen da pozove API endpoint. Možete postaviti svaku metodu resursa koja će koristiti autorizator.

Primer koda Lambda autorizatora

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

Pozovite ga nečim poput:

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

Zavisno od Lambda koda, ova autorizacija može biti ranjiva

</div>

Imajte na umu da ako je generisana i vraćena **deny politika**, greška koju vraća API Gateway je: `{"Message":"User is not authorized to access this resource with an explicit deny"}`

Na ovaj način možete **identifikovati ovu autorizaciju** koja je na snazi.

### Potreban API ključ

Moguće je postaviti API endpointove koji zahtevaju **validan API ključ** da bi se kontaktirali.

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

Moguće je generisati API ključeve u portalu API Gateway-a i čak postaviti koliko se može koristiti (u pogledu zahteva po sekundi i u pogledu zahteva mesečno).

Da bi API ključ radio, morate ga dodati u **Usage Plan**, ovaj plan korišćenja mora biti dodat na **API Stage** i povezani API stage mora imati konfigurisan **method throttling** za **endpoint** koji zahteva API ključ:

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

## Neautentifikovan pristup

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

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

### Upornost

<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>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>

Drugi načini podrške HackTricks-u:

* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** Proverite [**PLANOVE ZA PRETPLATU**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.

</details>

Last updated