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
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}).
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.
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.
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 infoawsapigatewayget-accountawsapigatewayget-domain-namesawsapigatewayget-usage-plansawsapigatewayget-vpc-linksawsapigatewayget-client-certificates# Enumerate APIsawsapigatewayget-rest-apis# This will also show the resource policy (if any)## Get stagesawsapigatewayget-stages--rest-api-id<id>## Get resourcesawsapigatewayget-resources--rest-api-id<id>## Get API resource action per HTTP verb (check authorizers and api key required)awsapigatewayget-method--http-methodGET--rest-api-id<api-id>--resource-id<resource-id>## Call APIhttps://<api-id>.execute-api.<region>.amazonaws.com/<stage>/<resource>## API authorizersawsapigatewayget-authorizers--rest-api-id<id>## Modelsawsapigatewayget-models--rest-api-id<id>## More infoawsapigatewayget-gateway-responses--rest-api-id<id>awsapigatewayget-request-validators--rest-api-id<id>awsapigatewayget-deployments--rest-api-id<id># Get api keys generatedawsapigatewayget-api-keys--include-valueawsapigatewayget-api-key--api-key<id>--include-value# Get just 1## Example use API keycurl-XGET-H"x-api-key: AJE&Ygenu4[..]"https://e83uuftdi8.execute-api.us-east-1.amazonaws.com/dev/test## Usage plansawsapigatewayget-usage-plans#Get limit use infoawsapigatewayget-usage-plan-keys--usage-plan-id<plan_id>#Get clear text values of api keysawsapigatewayget-usage-plan-key--usage-plan-id<plan_id>--key-id<key_id>###Already consumedawsapigatewayget-usage--usage-plan-id<plan_id>--start-date2023-07-01--end-date2023-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
Enumeración de Rutas: Identificar las rutas disponibles en el API Gateway v2 utilizando técnicas como fuerza bruta o búsqueda de diccionario.
Enumeración de Métodos HTTP: Determinar los métodos HTTP permitidos en cada ruta, como GET, POST, PUT, DELETE, etc.
Enumeración de Integraciones: Descubrir qué servicios están integrados con el API Gateway v2 y cómo se comunican.
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
awsapigatewayv2get-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 infoawsapigatewayv2get-account--awsapigatewayv2get-domain-namesawsapigatewayv2get-domain-name--domain-name<name>awsapigatewayv2get-usage-plans--awsapigatewayv2get-vpc-linksawsapigatewayv2get-client-certificates--# Enumerate APIsawsapigatewayv2get-apis# This will also show the resource policy (if any)awsapigatewayv2get-api--api-id<id>## Get all the info from an api at onceawsapigatewayv2export-api--api-id<id>--output-typeYAML--specificationOAS30/tmp/api.yaml## Get stagesawsapigatewayv2get-stages--api-id<id>## Get routesawsapigatewayv2get-routes--api-id<id>awsapigatewayv2get-route--api-id<id>--route-id<route-id>## Get deploymentsawsapigatewayv2get-deployments--api-id<id>awsapigatewayv2get-deployment--api-id<id>--deployment-id<dep-id>## Get integrationsawsapigatewayv2get-integrations--api-id<id>## Get authorizersawsapigatewayv2get-authorizers--api-id<id>awsapigatewayv2get-authorizer--api-id<id>--authorizer-id<uth-id>## Get domain mappingsawsapigatewayv2get-api-mappings--api-id<id>--domain-name<dom-name>awsapigatewayv2get-api-mapping--api-id<id>--api-mapping-id<map-id>--domain-name<dom-name>## Get modelsawsapigatewayv2get-models--api-id<id>## Call APIhttps://<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ónFirma 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.
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.
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.
</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>