AWS - API Gateway Enum

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar 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, publiquen y supervisen 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 gobierna 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 de cliente (Software Development Kits) para que sea más fácil para los desarrolladores llamar a tus APIs desde sus aplicaciones.

Tipos de API Gateways

  • API HTTP: Construye APIs REST de baja latencia y rentables con funciones integradas como OIDC y OAuth2, y soporte nativo de CORS. Funciona con lo siguiente: Lambda, backends HTTP.

  • API WebSocket: Construye 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.

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

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

Componentes Principales de API Gateway

  1. Recursos: En API Gateway, los recursos son los componentes que componen 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 /usuarios, o /usuario/{id}).

  2. Etapas: Las etapas en API Gateway representan diferentes versiones o entornos de tu API, como desarrollo, puesta en escena o producción. Puedes usar etapas para gestionar y desplegar múltiples versiones de tu API simultáneamente, lo que te permite probar nuevas funciones 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 utilizar para configurar el comportamiento de tu API en función de la etapa actual. Por ejemplo, podrías usar variables de etapa para dirigir las solicitudes de API a diferentes funciones Lambda u otros servicios backend según 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 solicitante antes de permitir que la solicitud continúe. Puedes usar funciones Lambda de AWS 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 le permite realizar al solicitante. API Gateway también admite autorizadores integrados, como Identity and Access Management (IAM) de AWS 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 diseñada 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 VPC pueden conectarse. Las políticas de recursos se pueden utilizar en combinación con autorizadores para proporcionar un control de acceso detallado para tu API.

  • Para que la API haga efecto, es necesario que sea desplegada nuevamente después de que se modifique la política de recursos.

Registro

Por defecto, los registros de CloudWatch están apagados, el registro de acceso está apagado, y el seguimiento X-Ray también está apagado.

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

Enumeración de API Gateway v2

Descripción

API Gateway v2 es un servicio de enrutamiento y transformación de HTTP que permite a los clientes crear, publicar, mantener, monitorear y proteger API en cualquier escala. Al enumerar un API Gateway v2, un atacante puede descubrir información sensible sobre las API expuestas, como rutas, métodos HTTP permitidos, integraciones con otros servicios y configuraciones de seguridad.

Métodos de Enumeración

  1. Enumeración de Rutas: Identificar las rutas disponibles en el API Gateway v2 utilizando técnicas como fuerza bruta o búsqueda de diccionario.

  2. Enumeración de Métodos HTTP: Determinar los métodos HTTP permitidos en cada ruta, como GET, POST, PUT, DELETE, etc.

  3. Enumeración de Integraciones: Descubrir qué servicios están integrados con el API Gateway v2 y cómo se comunican.

  4. Enumeración de Configuraciones de Seguridad: Identificar configuraciones de seguridad débiles, como políticas de autorización mal configuradas o falta de cifrado en las comunicaciones.

Herramientas Recomendadas

  • AWS CLI: La interfaz de línea de comandos de AWS proporciona comandos para interactuar con API Gateway v2 y recuperar información sobre las API expuestas.

  • Postman: Una herramienta útil para enviar solicitudes HTTP a las API y analizar las respuestas para identificar rutas y métodos permitidos.

Ejemplo de Uso

aws apigatewayv2 get-apis --region <region>

Este comando de AWS CLI devuelve una lista de todas las API Gateway v2 en la región especificada, lo que puede ayudar en la enumeración de API Gateway v2.

Medidas de Mitigación

  • Implementar controles de acceso adecuados para restringir el acceso no autorizado a las API expuestas.

  • Seguir las mejores prácticas de seguridad al configurar las políticas de autorización y autenticación en API Gateway v2.

  • Realizar pruebas de penetración regulares para identificar y remediar posibles vulnerabilidades en las API expuestas.

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

Diferentes Autorizaciones para acceder a los puntos finales de API Gateway

Política de Recursos

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

Autorizador IAM

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

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

Una forma sencilla de generar el token esperado por la aplicación es utilizar el tipo de Autorización Firma AWS dentro de Postman.

Establece la accessKey y la SecretKey de la cuenta que deseas utilizar y podrás autenticarte contra el punto final de la API.

Generará un encabezado de Autorización como este:

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

Ten en cuenta que en otros casos el Autorizador podría haber sido mal codificado y simplemente enviar cualquier cosa dentro del encabezado de Autorización permitirá ver el contenido oculto.

Firma de solicitud usando 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 utilizar una función lambda que, basada en un token dado, devolverá una política IAM indicando si el usuario está autorizado para llamar al punto de conexión de la API. Puedes configurar 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 de API requerida

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

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

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

Para que una clave de API funcione, debes agregarla a un **Plan de uso**, este plan de uso debe agregarse a la **Etapa de API** y la etapa de API asociada debe tener configurado un **control de velocidad de método** en el **punto final** que requiere la clave de 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>

## Escalada de privilegios

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

<details>

<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>

Otras formas de apoyar a HackTricks:

* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Ú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 tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).

</details>

Última actualización