# AWS - API Gateway Enum

{{#include ../../../banners/hacktricks-training.md}}

## API Gateway

### Osnovne informacije

AWS API Gateway je sveobuhvatna usluga koju nudi Amazon Web Services (AWS) dizajnirana za programere da **kreiraju, objavljuju i nadgledaju API-je na velikoj skali**. Funkcioniše kao ulazna tačka za aplikaciju, omogućavajući programerima da uspostave okvir pravila i procedura. Ovaj okvir reguliše pristup spoljnim korisnicima određenim podacima ili funkcionalnostima unutar aplikacije.

API Gateway vam omogućava da definišete **kako bi zahtevi za vaše API-je trebali biti obrađeni**, i može kreirati prilagođene API krajnje tačke sa specifičnim metodama (npr. GET, POST, PUT, DELETE) i resursima. Takođe može generisati klijentske SDK-ove (Softverske razvojne kompleti) kako bi olakšao programerima pozivanje vaših API-ja iz njihovih aplikacija.

### Tipovi API Gateway-a

- **HTTP API**: Kreirajte REST API-je sa niskom latencijom i troškovima, sa ugrađenim funkcijama kao što su OIDC i OAuth2, i podrškom za CORS. Radi sa sledećim: Lambda, HTTP backend-ima.
- **WebSocket API**: Kreirajte WebSocket API koristeći trajne veze za slučajeve korišćenja u realnom vremenu kao što su chat aplikacije ili kontrolne table. Radi sa sledećim: Lambda, HTTP, AWS uslugama.
- **REST API**: Razvijajte REST API gde dobijate potpunu kontrolu nad zahtevima i odgovorima zajedno sa mogućnostima upravljanja API-jem. Radi sa sledećim: Lambda, HTTP, AWS uslugama.
- **REST API Privatni**: 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 krajnje tačke** vašeg API-ja i odgovaraju raznim akcijama koje vaš API podržava. Resurs je svaka metoda (npr. GET, POST, PUT, DELETE) **unutar svake putanje** (/, ili /users, ili /user/{id}).
2. **Faze**: Faze u API Gateway-u predstavljaju **različite verzije ili okruženja** vašeg API-ja, kao što su razvoj, testiranje ili produkcija. Možete koristiti faze za upravljanje i implementaciju **više verzija vašeg API-ja istovremeno**, omogućavajući vam da testirate nove funkcije ili ispravke grešaka bez uticaja na produkciono okruženje. Faze takođe **podržavaju varijable faze**, koje su parovi ključ-vrednost koji se mogu koristiti za konfiguraciju ponašanja vašeg API-ja na osnovu trenutne faze. Na primer, mogli biste koristiti varijable faze da usmerite API zahteve na različite Lambda funkcije ili druge backend usluge u zavisnosti od faze.
- Faza se označava na početku URL-a krajnje tačke API Gateway-a.
3. **Autorizatori**: Autorizatori u API Gateway-u su odgovorni za **kontrolu pristupa vašem API-ju** verifikovanjem identiteta pozivaoca pre nego što dozvole da zahtev nastavi. Možete koristiti **AWS Lambda funkcije** kao prilagođene autorizatore, što vam omogućava da implementirate sopstvenu logiku autentifikacije i autorizacije. 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**.
4. **Politika resursa**: Politika resursa u API Gateway-u je JSON dokument koji **definiše dozvole za pristup vašem API-ju**. Slična 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 se mogu povezati. **Politike resursa se mogu koristiti u kombinaciji sa autorizatorima** kako bi se obezbedila precizna kontrola pristupa za vaš API.
- Da bi promena imala efekat, API treba da bude **ponovo implementiran nakon** što je politika resursa izmenjena.

### Logovanje

Podrazumevano, **CloudWatch Logs** su **isključeni**, **Access Logging** je **isključen**, a **X-Ray tracing** je takođe **isključen**.

### Enumeracija

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

{{#tabs }}
{{#tab name="apigateway" }}
```bash
# 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
```
{{#endtab }}

{{#tab name="apigatewayv2" }}
```bash
# Generic info
aws apigatewayv2 get-domain-names
aws apigatewayv2 get-domain-name --domain-name <name>
aws apigatewayv2 get-vpc-links

# 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>
```
{{#endtab }}
{{#endtabs }}

## Različite autorizacije za pristup API Gateway krajnjim tačkama

### Politika resursa

Moguće je koristiti politike resursa da definišete ko može da poziva API krajnje tačke.\
U sledećem primeru možete videti da **naznačena IP adresa ne može da pozove** krajnju tačku `/resource_policy` putem GET.

<figure><img src="../../../images/image (256).png" alt=""><figcaption></figcaption></figure>

### IAM autorizator

Moguće je postaviti da metode unutar putanje (resursa) zahtevaju IAM autentifikaciju za pozivanje.

<figure><img src="https://lh3.googleusercontent.com/GGx-kfqNXu6zMqGidnO8_eR88fYPpJG-wNuBBnedAJntiRUEPTEScl7OvWthGYRiI_msYCdC6oBFvJc827Tb4-4UogxpOyrEXyst-8IDzP9DC2NOtXSY7w58L0baCAcBQjSyvBhJREvWWCtiboNYPSKuEw=s2048" alt=""><figcaption></figcaption></figure>

Kada je ovo postavljeno, dobićete grešku `{"message":"Missing Authentication Token"}` kada pokušate da dođete do krajnje tačke bez bilo kakve autorizacije.

Jedan jednostavan način da generišete očekivani token od strane aplikacije je korišćenje **curl**.
```bash
$ 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"
```
Drugi način je da se koristi **`Authorization`** tip **`AWS Signature`** unutar **Postman**.

<figure><img src="../../../images/image (168).png" alt=""><figcaption></figcaption></figure>

Postavite accessKey i SecretKey naloga koji želite da koristite i možete se autentifikovati protiv API krajnje tačke.

Obe metode će generisati **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
```
Napomena da u drugim slučajevima **Authorizer** možda nije **dobro kodiran** i jednostavno slanje **bilo čega** unutar **Authorization header** će **omogućiti da se vidi skriveni sadržaj**.

### Potpisivanje zahteva koristeći Python
```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)

```
### Prilagođeni Lambda Autorizator

Moguće je koristiti lambda funkciju koja na osnovu datog tokena **vraća IAM politiku** koja ukazuje da li je korisnik **ovlašćen da pozove API krajnju tačku**.\
Možete postaviti svaku metodu resursa koja će koristiti autorizator.

<details>

<summary>Primer koda Lambda Autorizatora</summary>
```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 sa 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>

> [!WARNING]
> U zavisnosti od Lambda koda, ova autorizacija može biti ranjiva

Imajte na umu da ako se **generiše i vrati deny policy**, 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 krajnje tačke koje **zahtevaju važeći API ključ** za kontakt.

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

Moguće je generisati API ključeve u API Gateway portalu i čak postaviti koliko često mogu biti korišćeni (u smislu zahteva po sekundi i u smislu zahteva po mesecu).

Da bi API ključ radio, potrebno je dodati ga u **Usage Plan**, ovaj plan korišćenja mora biti dodat u **API Stage** i povezani API stage treba da ima konfigurisano **metod throttling** za **krajnju tačku** koja zahteva API ključ:

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

## Neautorizovani pristup

{{#ref}}
../aws-unauthenticated-enum-access/aws-api-gateway-unauthenticated-enum.md
{{#endref}}

## Privesc

{{#ref}}
../aws-privilege-escalation/aws-apigateway-privesc.md
{{#endref}}

## Post Exploatacija

{{#ref}}
../aws-post-exploitation/aws-api-gateway-post-exploitation.md
{{#endref}}

## Persistencija

{{#ref}}
../aws-persistence/aws-api-gateway-persistence.md
{{#endref}}

{{#include ../../../banners/hacktricks-training.md}}
