AWS - API Gateway Enum

Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

API Gateway

Basiese Inligting

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

API Gateway stel jou in staat om te bepaal hoe versoeke aan jou API's hanteer moet word, en dit kan aangepaste API-eindpunte met spesifieke metodes (bv., GET, POST, PUT, DELETE) en bronne skep. Dit kan ook klient-SDK's (Software Development Kits) genereer om dit vir ontwikkelaars makliker te maak om jou API's vanuit hul aansoeke aan te roep.

Tipes API-poorte

  • HTTP API: Bou lae-latensie en koste-effektiewe REST-API's met ingeboude kenmerke soos OIDC en OAuth2, en inheemse CORS-ondersteuning. Werk met die volgende: Lambda, HTTP-agterkante.

  • WebSocket API: Bou 'n WebSocket-API met volgehoue verbindings vir werklike gebruiksfases soos geselskapsaansoeke of dashboard. Werk met die volgende: Lambda, HTTP, AWS-diens.

  • REST API: Ontwikkel 'n REST-API waar jy volledige beheer oor die versoek en respons saam met API-bestuursvermoëns verkry. Werk met die volgende: Lambda, HTTP, AWS-diens.

  • REST API Privaat: Skep 'n REST-API wat slegs toeganklik is van binne 'n VPC.

Hoofkomponente van API Gateway

  1. Hulpbronne: In API Gateway is hulpbronne die komponente wat die struktuur van jou API uitmaak. Hulle verteenwoordig die verskillende paaie of eindpunte van jou API en stem ooreen met die verskeie aksies wat jou API ondersteun. 'n Hulpbron is elke metode (bv., GET, POST, PUT, DELETE) binne elke pad (/, of /gebruikers, of /gebruiker/{id}.

  2. Stadia: Stadia in API Gateway verteenwoordig verskillende weergawes of omgewings van jou API, soos ontwikkeling, stellings of produksie. Jy kan stadia gebruik om meervoudige weergawes van jou API gelyktydig te bestuur en te implementeer, wat jou in staat stel om nuwe kenmerke of foutregstellings te toets sonder om die produksie-omgewing te beïnvloed. Stadia ondersteun ook stadiumveranderlikes, wat sleutel-waardepare is wat gebruik kan word om die gedrag van jou API te konfigureer op grond van die huidige stadium. Byvoorbeeld, jy kan stadiumveranderlikes gebruik om API-versoeke na verskillende Lambda-funksies of ander agterkantdiens te rig, afhangende van die stadium.

  • Die stadium word aan die begin van die URL van die API Gateway-eindpunt aangedui.

  1. Gemagtigdes: Gemagtigdes in API Gateway is verantwoordelik vir die beheer van toegang tot jou API deur die identiteit van die oproeper te verifieer voordat die versoek toegelaat word om voort te gaan. Jy kan AWS Lambda-funksies as aangepaste gemagtigdes gebruik, wat jou in staat stel om jou eie outentiserings- en magtigingslogika te implementeer. Wanneer 'n versoek binnekom, stuur API Gateway die outoriseringstoken van die versoek na die Lambda-gemagtigde, wat die token verwerk en 'n IAM-beleid terugstuur wat bepaal watter aksies die oproeper toegelaat word om uit te voer. API Gateway ondersteun ook ingeboude gemagtigdes, soos AWS Identity and Access Management (IAM) en Amazon Cognito.

  2. 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 op maat gemaak vir API Gateway. Jy kan 'n hulpbronbeleid gebruik om te beheer wie toegang tot jou API kan verkry, watter metodes hulle kan aanroep, en van watter IP-adresse of VPC's hulle kan koppel. Hulpbronbeleide kan in kombinasie met gemagtigdes gebruik word om fynkorrelige toegangsbeheer vir jou API te voorsien.

  • Om die API effektief te maak, moet die API na die verandering van die hulpbronbeleid weer geïmplementeer word.

Logboekhouding

Standaard is CloudWatch Logs af, Toegangslogboekhouding is af, en X-Ray-trassering is ook af.

Enumerasie

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 leestoestemming wat verleen kan word, apigateway:GET is, waarmee jy alles kan enumereer.

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

To list all APIs in the account, you can use the getApis method.

GET /v2/apis

Get API details

To get details about a specific API, you can use the getApi method with the API ID.

GET /v2/apis/{api_id}

List Integrations

To list all integrations for a specific API, you can use the getIntegrations method with the API ID.

GET /v2/apis/{api_id}/integrations

Get Integration details

To get details about a specific integration, you can use the getIntegration method with the integration ID.

GET /v2/apis/{api_id}/integrations/{integration_id}

List Routes

To list all routes for a specific API, you can use the getRoutes method with the API ID.

GET /v2/apis/{api_id}/routes

Get Route details

To get details about a specific route, you can use the getRoute method with the route ID.

GET /v2/apis/{api_id}/routes/{route_id}
# 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>

Verskillende Magtigings om API Gateway eindpunte te benader

Bronbeleid

Dit is moontlik om bronbeleide te gebruik om te bepaal wie die API-eindpunte kan aanroep. In die volgende voorbeeld kan jy sien dat die aangeduide IP nie kan aanroep die eindpunt /resource_policy via GET nie.

IAM Magtigingsbevestiger

Dit is moontlik om in te stel dat 'n metodes binne 'n pad ( 'n bron) IAM-verifikasie benodig om dit aan te roep.

Wanneer dit ingestel is, sal jy die fout ontvang {"boodskap":"Ontbrekende Verifikasie Teken"} wanneer jy probeer om die eindpunt sonder enige magtiging te bereik.

Een maklike manier om die verwagte teken deur die aansoek te genereer, is om die Magtiging tipe AWS Handtekening binne Postman te gebruik.

Stel die toegangssleutel en die Geheimsleutel van die rekening wat jy wil gebruik en jy kan teen die API-eindpunt verifieer.

Dit sal 'n Magtiging kop genereer soos:

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

Moenie vergeet dat in ander gevalle die Outentiseerder dalk sleg geskodeer is en enige iets binne die Outoriseringskop stuur sal toelaat om die verborge inhoud te sien.

Versoekondertekening met behulp van 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)

Aangepaste Lambda-outeur

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

Lambda Auteur Kodevoorbeeld

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

Roep dit aan 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>

<div data-gb-custom-block data-tag="hint" data-style='warning'>

Afhanklik van die Lambda-kode, kan hierdie magtiging kwesbaar wees

</div>

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

Op hierdie manier kan jy **identifiseer dat hierdie magtiging** 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="../../../.gitbook/assets/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 versoek per sekonde en in terme van versoek per maand).

Om 'n API-sleutel te laat werk, moet jy dit by 'n **Gebruiksplan** voeg, hierdie gebruikplan moet by die **API-fase** gevoeg word en die geassosieerde API-fase moet 'n **metodevertraging** na die **eindpunt** wat die API-sleutel vereis, geconfigureer hê:

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

## Ongeagte Toegang

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

### Volharding

<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>Leer AWS-hacking van nul tot held met</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>

Ander maniere om HackTricks te ondersteun:

* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ontdek [**Die PEASS-familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFT's**](https://opensea.io/collection/the-peass-family)
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Deel jou haktruuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github-opslag.

</details>

Last updated