# AWS - API Gateway Enum

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

## API Gateway

### Basiese Inligting

AWS API Gateway is 'n omvattende diens wat deur Amazon Web Services (AWS) aangebied word, ontwerp vir ontwikkelaars om **API's op 'n groot skaal te skep, te publiseer en te bestuur**. Dit funksioneer as 'n toegangspunt tot 'n toepassing, wat ontwikkelaars toelaat om 'n raamwerk van reëls en prosedures op te stel. Hierdie raamwerk regeer die toegang wat eksterne gebruikers tot sekere data of funksies binne die toepassing het.

API Gateway stel jou in staat om **te definieer hoe versoeke na jou API's hanteer moet word**, en dit kan pasgemaakte API-eindpunte met spesifieke metodes (bv. GET, POST, PUT, DELETE) en hulpbronne skep. Dit kan ook kliënt SDK's (Software Development Kits) genereer om dit vir ontwikkelaars makliker te maak om jou API's vanuit hul toepassings aan te roep.

### API Gateway Tipes

- **HTTP API**: Bou lae-latensie en kostedoeltreffende REST API's met ingeboude funksies soos OIDC en OAuth2, en inheemse CORS-ondersteuning. Werk met die volgende: Lambda, HTTP agtergronde.
- **WebSocket API**: Bou 'n WebSocket API met volgehoue verbindings vir regte-tyd gebruiksgevalle soos klets toepassings of dashboards. Werk met die volgende: Lambda, HTTP, AWS Dienste.
- **REST API**: Ontwikkel 'n REST API waar jy volledige beheer oor die versoek en antwoord het, saam met API bestuur vermoëns. Werk met die volgende: Lambda, HTTP, AWS Dienste.
- **REST API Privaat**: Skep 'n REST API wat slegs vanaf binne 'n VPC toeganklik is.

### API Gateway Hoofkomponente

1. **Hulpbronne**: In API Gateway is hulpbronne die komponente wat **die struktuur van jou API vorm**. Hulle verteenwoordig **die verskillende paaie of eindpunte** van jou API en ooreen met die verskillende aksies wat jou API ondersteun. 'n Hulpbron is elke metode (bv. GET, POST, PUT, DELETE) **binne elke pad** (/, of /users, of /user/{id}).
2. **Fases**: Fases in API Gateway verteenwoordig **verskillende weergawes of omgewings** van jou API, soos ontwikkeling, staging, of produksie. Jy kan fases gebruik om **meervoudige weergawes van jou API gelyktydig te bestuur en te ontplooi**, wat jou toelaat om nuwe funksies of foutoplossings te toets sonder om die produksie-omgewing te beïnvloed. Fases ondersteun ook **fase veranderlikes**, wat sleutel-waarde pare is wat gebruik kan word om die gedrag van jou API op grond van die huidige fase te konfigureer. Byvoorbeeld, jy kan fase veranderlikes gebruik om API versoeke na verskillende Lambda funksies of ander agtergrond dienste te lei, afhangende van die fase.
- Die fase word aan die begin van die URL van die API Gateway eindpunt aangedui.
3. **Outoriseerders**: Outoriseerders in API Gateway is verantwoordelik vir **die beheer van toegang tot jou API** deur die identiteit van die oproeper te verifieer voordat die versoek voortgaan. Jy kan **AWS Lambda funksies** as pasgemaakte outoriseerders gebruik, wat jou toelaat om jou eie outentikasie en outorisasie logika te implementeer. Wanneer 'n versoek inkom, stuur API Gateway die versoek se outorisasie token na die Lambda outoriseerder, wat die token verwerk en 'n IAM-beleid teruggee wat bepaal watter aksies die oproeper mag uitvoer. API Gateway ondersteun ook **ingeboude outoriseerders**, soos **AWS Identiteit en Toegang Bestuur (IAM)** en **Amazon Cognito**.
4. **Hulpbronbeleid**: 'n Hulpbronbeleid in API Gateway is 'n JSON-dokument wat **die toestemmings vir die toegang tot jou API definieer**. Dit is soortgelyk aan 'n IAM-beleid, maar spesifiek aangepas vir API Gateway. Jy kan 'n hulpbronbeleid gebruik om te beheer wie jou API kan toegang, watter metodes hulle kan aanroep, en vanaf watter IP adresse of VPC's hulle kan aansluit. **Hulpbronbeleide kan in kombinasie met outoriseerders gebruik word** om fyn-gegradeerde toegangbeheer vir jou API te bied.
- Om effektief te wees, moet die API **weer ontplooi word nadat** die hulpbronbeleid gewysig is.

### Logging

Standaard is **CloudWatch Logs** **af**, **Toegang Logging** is **af**, en **X-Ray tracing** is ook **af**.

### Enumerasie

> [!TIP]
> Let daarop dat in beide AWS API's om hulpbronne te enumereer (**`apigateway`** en **`apigatewayv2`**) die enigste toestemming wat jy nodig het en die enigste lees toestemming wat toegeken kan word, is **`apigateway:GET`**, met dit kan jy **alles enumereer.**

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

## Verskillende Owerhede om toegang te verkry tot API Gateway eindpunte

### Hulpbronbeleid

Dit is moontlik om hulpbronbeleide te gebruik om te definieer wie die API eindpunte kan bel.\
In die volgende voorbeeld kan jy sien dat die **aangegeven IP nie kan bel** na die eindpunt `/resource_policy` via GET nie.

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

### IAM Owerhede

Dit is moontlik om te stel dat 'n metode binne 'n pad (n hulpbron) IAM-sertifisering benodig om dit te bel.

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

Wanneer dit gestel is, sal jy die fout `{"message":"Missing Authentication Token"}` ontvang wanneer jy probeer om die eindpunt te bereik sonder enige owerheid.

Een maklike manier om die verwagte token deur die toepassing te genereer, is om **curl** te gebruik.
```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"
```
'n Ander manier is om die **`Authorization`** tipe **`AWS Signature`** binne **Postman** te gebruik.

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

Stel die accessKey en die SecretKey van die rekening wat jy wil gebruik in, en jy kan nou teen die API-eindpunt autentiseer.

Albei metodes sal 'n **Authorization** **header** genereer soos:
```
AWS4-HMAC-SHA256 Credential=AKIAYY7XU6ECUDOTWB7W/20220726/us-east-1/execute-api/aws4_request, SignedHeaders=host;x-amz-date, Signature=9f35579fa85c0d089c5a939e3d711362e92641e8c14cc571df8c71b4bc62a5c2
```
Let op dat in ander gevalle die **Authorizer** dalk **sleg gekodeer** is en net **enigiets** binne die **Authorization header** sal **toelaat om die versteekte inhoud te sien**.

### Versoekondertekening met 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)

```
### Pasgemaakte Lambda Outeur

Dit is moontlik om 'n lambda te gebruik wat op 'n gegewe token gebaseer is en **'n IAM-beleid** sal **teruggee wat aandui of die gebruiker **gemagtig is om die API-eindpunt** aan te roep.\
Jy kan elke hulpbronmetode instel wat die outeur gaan gebruik.

<details>

<summary>Lambda Outeur Kode Voorbeeld</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>

Noem dit met iets soos:

<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]
> Afhangende van die Lambda-kode, mag hierdie autorisasie kwesbaar wees

Let daarop dat as 'n **weierbeleid gegenereer en teruggestuur word**, die fout wat deur API Gateway teruggestuur word is: `{"Message":"User is not authorized to access this resource with an explicit deny"}`

Op hierdie manier kan jy **identifiseer dat hierdie autorisasie** in plek is.

### Vereiste API Sleutel

Dit is moontlik om API eindpunte in te stel wat **'n geldige API-sleutel vereis** om dit te kontak.

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

Dit is moontlik om API-sleutels in die API Gateway-portaal te genereer en selfs in te stel hoeveel dit gebruik kan word (in terme van versoeke per sekonde en in terme van versoeke per maand).

Om 'n API-sleutel te laat werk, moet jy dit by 'n **Gebruik Plan** voeg, hierdie gebruiksplan moet by die **API Stadium** gevoeg word en die geassosieerde API-stadium moet 'n **metode throttling** geconfigureer hê na die **eindpunt** wat die API-sleutel vereis:

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

## Ongeauthentiseerde Toegang

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

## Privesc

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

## Post Exploitation

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

## Persistensie

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

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