AWS - API Gateway Enum

Apoya a HackTricks

API Gateway

Información Básica

AWS API Gateway es un servicio integral ofrecido por Amazon Web Services (AWS) diseñado para que los desarrolladores crean, publican y supervisan APIs a gran escala. Funciona como un punto de entrada a una aplicación, permitiendo a los desarrolladores establecer un marco de reglas y procedimientos. Este marco regula el acceso que los usuarios externos tienen a ciertos datos o funcionalidades dentro de la aplicación.

API Gateway te permite definir cómo deben manejarse las solicitudes a tus APIs, y puede crear puntos finales de API personalizados con métodos específicos (por ejemplo, GET, POST, PUT, DELETE) y recursos. También puede generar SDKs (Kits de Desarrollo de Software) para facilitar a los desarrolladores la llamada a tus APIs desde sus aplicaciones.

Tipos de API Gateways

  • HTTP API: Crea APIs REST de baja latencia y costo efectivo con características integradas como OIDC y OAuth2, y soporte nativo para CORS. Funciona con lo siguiente: Lambda, backends HTTP.

  • WebSocket API: Crea una API WebSocket utilizando conexiones persistentes para casos de uso en tiempo real como aplicaciones de chat o paneles de control. Funciona con lo siguiente: Lambda, HTTP, Servicios de AWS.

  • REST API: Desarrolla una API REST donde obtienes control total sobre la solicitud y la respuesta junto con capacidades de gestión de API. Funciona con lo siguiente: Lambda, HTTP, Servicios de AWS.

  • REST API Privada: Crea una API REST que solo es accesible desde dentro de un VPC.

Componentes Principales de API Gateway

  1. Recursos: En API Gateway, los recursos son los componentes que constituyen la estructura de tu API. Representan los diferentes caminos o puntos finales de tu API y corresponden a las diversas acciones que tu API admite. Un recurso es cada método (por ejemplo, GET, POST, PUT, DELETE) dentro de cada camino (/, o /users, o /user/{id}).

  2. Etapas: Las etapas en API Gateway representan diferentes versiones o entornos de tu API, como desarrollo, pruebas o producción. Puedes usar etapas para gestionar y desplegar múltiples versiones de tu API simultáneamente, permitiéndote probar nuevas características o correcciones de errores sin afectar el entorno de producción. Las etapas también soportan variables de etapa, que son pares clave-valor que se pueden usar para configurar el comportamiento de tu API según la etapa actual. Por ejemplo, podrías usar variables de etapa para dirigir solicitudes de API a diferentes funciones Lambda u otros servicios de backend dependiendo de la etapa.

  • La etapa se indica al principio de la URL del punto final de API Gateway.

  1. Autorizadores: Los autorizadores en API Gateway son responsables de controlar el acceso a tu API verificando la identidad del llamador antes de permitir que la solicitud continúe. Puedes usar funciones de AWS Lambda como autorizadores personalizados, lo que te permite implementar tu propia lógica de autenticación y autorización. Cuando llega una solicitud, API Gateway pasa el token de autorización de la solicitud al autorizador Lambda, que procesa el token y devuelve una política IAM que determina qué acciones se permite realizar al llamador. API Gateway también admite autorizadores integrados, como AWS Identity and Access Management (IAM) y Amazon Cognito.

  2. Política de Recursos: Una política de recursos en API Gateway es un documento JSON que define los permisos para acceder a tu API. Es similar a una política IAM pero específicamente adaptada para API Gateway. Puedes usar una política de recursos para controlar quién puede acceder a tu API, qué métodos pueden llamar y desde qué direcciones IP o VPCs pueden conectarse. Las políticas de recursos se pueden usar en combinación con autorizadores para proporcionar un control de acceso más granular para tu API.

  • Para que surta efecto, la API necesita ser desplegada nuevamente después de que se modifique la política de recursos.

Registro

Por defecto, CloudWatch Logs están desactivados, el registro de acceso está desactivado, y el rastreo de X-Ray también está desactivado.

Enumeración

Ten en cuenta que en ambas APIs de AWS para enumerar recursos (apigateway y apigatewayv2) el único permiso que necesitas y el único permiso de lectura que se puede otorgar es apigateway:GET, con eso puedes enumerar todo.

# 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

Diferentes Autorizaciones para acceder a los endpoints de API Gateway

Política de Recursos

Es posible utilizar políticas de recursos para definir quién puede llamar a los endpoints de la API. En el siguiente ejemplo puedes ver que la IP indicada no puede llamar al endpoint /resource_policy a través de GET.

Autorizador IAM

Es posible establecer que un método dentro de una ruta (un recurso) requiera autenticación IAM para ser llamado.

Cuando esto está configurado, recibirás el error {"message":"Missing Authentication Token"} cuando intentes acceder al endpoint sin ninguna autorización.

Una forma fácil de generar el token esperado por la aplicación es usar el tipo Authorization AWS Signature dentro de Postman.

Configura el accessKey y el SecretKey de la cuenta que deseas usar y podrás autenticarte contra el endpoint de la API.

Generará un Authorization header como:

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

Nota que en otros casos el Authorizer podría haber sido mal codificado y simplemente enviar cualquier cosa dentro del Authorization header permitirá ver el contenido oculto.

Request Signing Using 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)

Autorizador Lambda Personalizado

Es posible usar un lambda que, basado en un token dado, devuelva una política IAM indicando si el usuario está autorizado para llamar al endpoint de la API. Puedes establecer cada método de recurso que utilizará el autorizador.

Ejemplo de Código del Autorizador Lambda

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

Llámalo con algo como:

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

Dependiendo del código de Lambda, esta autorización podría ser vulnerable

</div>

Ten en cuenta que si se **genera y devuelve una política de denegación**, el error devuelto por API Gateway es: `{"Message":"User is not authorized to access this resource with an explicit deny"}`

De esta manera podrías **identificar esta autorización** que está en su lugar.

### Clave API Requerida

Es posible establecer puntos finales de API que **requieren una clave API válida** para contactarlos.

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

Es posible generar claves API en el portal de API Gateway e incluso establecer cuánto se puede usar (en términos de solicitudes por segundo y en términos de solicitudes por mes).

Para que una clave API funcione, necesitas agregarla a un **Plan de Uso**, este plan de uso debe ser agregado a la **Etapa de API** y la etapa de API asociada necesita tener configurado un **throttling de método** para el **punto final** que requiere la clave API:

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

## Acceso No Autenticado

<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 Explotación

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

## Persistencia

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

Aprende y practica Hacking en AWS:<img src="/.gitbook/assets/image.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/image.png" alt="" data-size="line">\
Aprende y practica Hacking en GCP: <img src="/.gitbook/assets/image (2).png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/image (2).png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)

<details>

<summary>Apoya a HackTricks</summary>

* Revisa los [**planes de suscripción**](https://github.com/sponsors/carlospolop)!
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Comparte trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.

</details>

</div>

Last updated