AWS - Enumeração do API Gateway
Reading time: 11 minutes
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
API Gateway
Informações Básicas
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 uma aplicação, permitindo que os desenvolvedores estabeleçam um conjunto de regras e procedimentos. Este conjunto rege o acesso que usuários externos têm a certos dados ou funcionalidades dentro da aplicaçã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 (Kits de Desenvolvimento de Software) para facilitar a chamada de suas APIs a partir de suas aplicações.
Tipos de Gateways de API
- HTTP API: Crie APIs REST de baixa latência e custo-efetivas com recursos integrados, como OIDC e OAuth2, e suporte nativo a CORS. Funciona com: Lambda, backends HTTP.
- WebSocket API: Crie uma API WebSocket usando conexões persistentes para casos de uso em tempo real, como aplicações de chat ou painéis. Funciona com: Lambda, HTTP, Serviços AWS.
- REST API: Desenvolva uma API REST onde você tem controle total sobre a solicitação e a resposta, juntamente com capacidades de gerenciamento de API. Funciona com: Lambda, HTTP, Serviços AWS.
- REST API Privada: Crie uma API REST que é acessível apenas de dentro de uma VPC.
Principais Componentes do API Gateway
- Recursos: No API Gateway, recursos são os componentes que formam a estrutura da sua API. Eles representam os diferentes caminhos ou endpoints da 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 /users, ou /user/{id}).
- Estágios: Estágios no API Gateway representam diferentes versões ou ambientes da sua API, como desenvolvimento, homologação ou produção. Você pode usar estágios para gerenciar e implantar múltiplas versões da sua API simultaneamente, permitindo que você teste novos recursos ou correções de bugs sem afetar o ambiente de produção. Estágios também suportam variáveis de estágio, que são pares chave-valor que podem ser usados para configurar o comportamento da 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.
- Autorizadores: 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 AWS Lambda como autorizadores personalizados, o que permite implementar 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 pode realizar. O API Gateway também suporta autorizadores integrados, como AWS Identity and Access Management (IAM) e Amazon Cognito.
- Política de Recurso: Uma política de recurso 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 recurso 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. Políticas de recurso podem ser usadas em combinação com autorizadores para fornecer controle de acesso detalhado para sua API.
- Para que a modificação da política de recurso tenha efeito, a API precisa ser implantada novamente após a modificação.
Registro
Por padrão, CloudWatch Logs estão desligados, Registro de Acesso está desligado, e X-Ray tracing também está desligado.
Enumeração
tip
Observe que em ambas as APIs da AWS para enumerar recursos (apigateway
e apigatewayv2
) a única permissão que você precisa e a única permissão de leitura que pode ser concedida é 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
Diferentes Autorizações para acessar os endpoints do 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.
.png)
Autenticador IAM
É possível definir que um método dentro de um caminho (um recurso) requer autenticação IAM para ser chamado.
Quando isso é definido, 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 curl.
$ curl -X <method> https://<api-id>.execute-api.<region>.amazonaws.com/<stage>/<resource> --user <AWS_ACCESS_KEY>:<AWS_SECRET_KEY> --aws-sigv4 "aws:amz:<region>:execute-api"
Outra maneira é usar o tipo Authorization
AWS Signature
dentro do Postman.
.png)
Defina o accessKey e o SecretKey da conta que você deseja usar e você pode autenticar contra o endpoint da API.
Ambos os métodos gerarão um Authorization header 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 Authorizer pode ter sido mal codificado e enviar qualquer coisa dentro do Authorization header permitirá ver o conteúdo oculto.
Assinatura de Requisições 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 usará o autorizador.
Exemplo de Código do Autorizador Lambda
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
Chame-o com algo como:
curl "https://jhhqafgh6f.execute-api.eu-west-1.amazonaws.com/prod/custom_auth" -H 'Authorization: seu-token-secreto'
warning
Dependendo do código Lambda, essa autorização pode ser vulnerável
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 definir endpoints de API que exigem uma chave de API válida para contatá-los.
.png)
É possível gerar chaves de API no portal do API Gateway e até definir quanto elas podem ser usadas (em termos de requisições por segundo e em termos de requisições por mês).
Para fazer uma chave de API funcionar, você precisa adicioná-la a um Plano de Uso, esse plano de uso deve ser adicionado ao Estágio da API e o estágio da API associado precisa ter uma limitação de método configurada para o endpoint que requer a chave de API:
.png)
Acesso Não Autenticado
AWS - API Gateway Unauthenticated Enum
Privesc
Pós Exploração
AWS - API Gateway Post Exploitation
Persistência
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.