AWS - API Gateway Enum

Aprenda hacking na AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks:

API Gateway

Informações Básicas

O AWS API Gateway é um serviço abrangente oferecido pela Amazon Web Services (AWS) projetado para desenvolvedores criarem, publicarem e supervisionarem APIs em grande escala. Ele funciona como um ponto de entrada para um aplicativo, permitindo que os desenvolvedores estabeleçam um conjunto de regras e procedimentos. Esse conjunto de regras governa o acesso que usuários externos têm a determinados dados ou funcionalidades dentro do aplicativo.

O API Gateway permite que você defina como as solicitações para suas APIs devem ser tratadas, e pode criar endpoints de API personalizados com métodos específicos (por exemplo, GET, POST, PUT, DELETE) e recursos. Ele também pode gerar SDKs de cliente (Software Development Kits) para facilitar aos desenvolvedores a chamada de suas APIs a partir de seus aplicativos.

Tipos de Gateways de API

  • API HTTP: Construa APIs REST de baixa latência e econômicas com recursos integrados como OIDC e OAuth2, e suporte nativo para CORS. Funciona com o seguinte: Lambda, backends HTTP.

  • API WebSocket: Construa uma API WebSocket usando conexões persistentes para casos de uso em tempo real, como aplicativos de chat ou painéis. Funciona com o seguinte: Lambda, HTTP, Serviços AWS.

  • API REST: Desenvolva uma API REST onde você obtém controle total sobre a solicitação e resposta, juntamente com capacidades de gerenciamento de API. Funciona com o seguinte: Lambda, HTTP, Serviços AWS.

  • API REST Privada: Crie uma API REST que só é acessível de dentro de uma VPC.

Principais Componentes do API Gateway

  1. Recursos: No API Gateway, os recursos são os componentes que compõem a estrutura de sua API. Eles representam os diferentes caminhos ou endpoints de sua API e correspondem às várias ações que sua API suporta. Um recurso é cada método (por exemplo, GET, POST, PUT, DELETE) dentro de cada caminho (/, ou /usuários, ou /usuário/{id}).

  2. Estágios: Os estágios no API Gateway representam diferentes versões ou ambientes de sua API, como desenvolvimento, staging ou produção. Você pode usar estágios para gerenciar e implantar múltiplas versões de sua API simultaneamente, permitindo que você teste novos recursos ou correções de bugs sem afetar o ambiente de produção. Os estágios também suportam variáveis de estágio, que são pares de chave-valor que podem ser usados para configurar o comportamento de sua API com base no estágio atual. Por exemplo, você poderia usar variáveis de estágio para direcionar solicitações de API para diferentes funções Lambda ou outros serviços de backend, dependendo do estágio.

  • O estágio é indicado no início da URL do endpoint do API Gateway.

  1. Autorizadores: Os autorizadores no API Gateway são responsáveis por controlar o acesso à sua API verificando a identidade do chamador antes de permitir que a solicitação prossiga. Você pode usar funções Lambda da AWS como autorizadores personalizados, o que permite que você implemente sua própria lógica de autenticação e autorização. Quando uma solicitação chega, o API Gateway passa o token de autorização da solicitação para o autorizador Lambda, que processa o token e retorna uma política IAM que determina quais ações o chamador está autorizado a realizar. O API Gateway também suporta autorizadores integrados, como AWS Identity and Access Management (IAM) e Amazon Cognito.

  2. Política de Recursos: Uma política de recursos no API Gateway é um documento JSON que define as permissões para acessar sua API. É semelhante a uma política IAM, mas especificamente adaptada para o API Gateway. Você pode usar uma política de recursos para controlar quem pode acessar sua API, quais métodos eles podem chamar e de quais endereços IP ou VPCs eles podem se conectar. As políticas de recursos podem ser usadas em combinação com autorizadores para fornecer controle de acesso detalhado para sua API.

  • Para que a API faça efeito, ela precisa ser implantada novamente após a modificação da política de recursos.

Registro

Por padrão, os Logs do CloudWatch estão desativados, o Logging de Acesso está desativado e o traçado X-Ray também está desativado.

Enumeração

Observe que em ambas as APIs da AWS para enumerar recursos (apigateway e apigatewayv2), a única permissão necessária e a única permissão de leitura concedível é apigateway:GET, com isso você pode enumerar tudo.

# 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

Enumeração do AWS API Gateway v2

Descrição

O AWS API Gateway v2 é um serviço de gateway de API que facilita a criação, publicação, manutenção, monitoramento e proteção de APIs em qualquer escala. Durante a enumeração, é possível identificar informações importantes sobre as APIs configuradas no serviço.

Técnicas de Enumeração

  1. Enumeração de APIs: Identificar APIs configuradas no serviço.

  2. Enumeração de Endpoints: Identificar os endpoints associados às APIs.

  3. Enumeração de Métodos: Identificar os métodos HTTP permitidos em cada endpoint.

  4. Enumeração de Autorizadores: Identificar os autorizadores configurados para controlar o acesso às APIs.

  5. Enumeração de Modelos: Identificar os modelos de dados definidos para as APIs.

  6. Enumeração de Integrações: Identificar as integrações configuradas para os endpoints.

  7. Enumeração de Documentação: Identificar a documentação disponível para as APIs.

Ferramentas Recomendadas

  • AWS CLI: Interface de linha de comando para interagir com os serviços da AWS.

  • Postman: Ferramenta para testar APIs.

  • Swagger: Para visualização e interação com APIs RESTful.

Exemplo de Comando AWS CLI

aws apigatewayv2 get-apis

Medidas de Mitigação

  • Implementar políticas de segurança adequadas para controlar o acesso e proteger as APIs.

  • Monitorar regularmente as configurações do AWS API Gateway v2 em busca de possíveis vulnerabilidades.

  • Manter a documentação atualizada e revisar as permissões dos usuários com acesso ao serviço.

# 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 Autorizações para acessar endpoints da API Gateway

Política de Recursos

É possível usar políticas de recursos para definir quem pode chamar os endpoints da API. No exemplo a seguir, você pode ver que o IP indicado não pode chamar o endpoint /resource_policy via GET.

Autorizador IAM

É possível definir que um método dentro de um caminho (um recurso) requer autenticação IAM para ser chamado.

Quando isso é configurado, você receberá o erro {"message":"Missing Authentication Token"} ao tentar acessar o endpoint sem nenhuma autorização.

Uma maneira fácil de gerar o token esperado pela aplicação é usar o tipo Authorization AWS Signature dentro do Postman.

Defina a accessKey e a SecretKey da conta que deseja usar e você poderá autenticar contra o endpoint da API.

Ele irá gerar um cabeçalho de Autorização como:

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

Observe que em outros casos o Autorizador pode ter sido mal codificado e simplesmente enviar qualquer coisa dentro do cabeçalho de Autorização permitirá ver o conteúdo oculto.

Assinatura de Solicitação 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

É possível usar um lambda que, com base em um token fornecido, retornará uma política IAM indicando se o usuário está autorizado a chamar o endpoint da API. Você pode definir cada método de recurso que estará usando o autorizador.

Exemplo de Código do 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>

Chame-o com 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'>

Dependendo do código Lambda, essa autorização pode ser vulnerável

</div>

Note que se uma **política de negação for gerada e retornada**, o erro retornado pelo API Gateway é: `{"Message":"User is not authorized to access this resource with an explicit deny"}`

Dessa forma, você poderia **identificar essa autorização** em vigor.

### Chave de API Necessária

É possível configurar endpoints da API que **exigem uma chave de API válida** para acessá-los.

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

É possível gerar chaves de API no portal da API Gateway e até mesmo definir quantas vezes ela pode ser usada (em termos de solicitações por segundo e em termos de solicitações por mês).

Para fazer uma chave de API funcionar, você precisa adicioná-la a um **Plano de Uso**, este plano de uso deve ser adicionado ao **Estágio da API** e o estágio da API associado precisa ter um **controle de taxa de método** configurado para o **endpoint** que exige a chave de API:

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

## Acesso Não 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>

## Pós-Exploração

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

### Persistência

<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>Aprenda hacking na AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>

Outras maneiras de apoiar o HackTricks:

* Se você quiser ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe seus truques de hacking enviando PRs para** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.

</details>

Última actualización