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
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}).
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.
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.
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 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
# Generic infoawsapigatewayv2get-domain-namesawsapigatewayv2get-domain-name--domain-name<name>awsapigatewayv2get-vpc-links# 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 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 AuthorizationAWS 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.
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.
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.
</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>