AWS - API Gateway Enum
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
Basic Information
AWS API Gateway είναι μια ολοκληρωμένη υπηρεσία που προσφέρεται από την Amazon Web Services (AWS) σχεδιασμένη για προγραμματιστές να δημιουργούν, δημοσιεύουν και επιβλέπουν APIs σε μεγάλη κλίμακα. Λειτουργεί ως σημείο εισόδου σε μια εφαρμογή, επιτρέποντας στους προγραμματιστές να καθορίσουν ένα πλαίσιο κανόνων και διαδικασιών. Αυτό το πλαίσιο διέπει την πρόσβαση που έχουν οι εξωτερικοί χρήστες σε ορισμένα δεδομένα ή λειτουργίες εντός της εφαρμογής.
Το API Gateway σας επιτρέπει να ορίσετε πώς θα πρέπει να διαχειρίζονται τα αιτήματα προς τα APIs σας, και μπορεί να δημιουργήσει προσαρμοσμένα API endpoints με συγκεκριμένες μεθόδους (π.χ., GET, POST, PUT, DELETE) και πόρους. Μπορεί επίσης να δημιουργήσει SDKs πελάτη (Software Development Kits) για να διευκολύνει τους προγραμματιστές να καλούν τα APIs σας από τις εφαρμογές τους.
API Gateways Types
- HTTP API: Δημιουργήστε REST APIs χαμηλής καθυστέρησης και οικονομικά αποδοτικά με ενσωματωμένα χαρακτηριστικά όπως OIDC και OAuth2, και εγγενή υποστήριξη CORS. Λειτουργεί με τα εξής: Lambda, HTTP backends.
- WebSocket API: Δημιουργήστε ένα WebSocket API χρησιμοποιώντας μόνιμες συνδέσεις για περιπτώσεις χρήσης σε πραγματικό χρόνο όπως εφαρμογές συνομιλίας ή πίνακες ελέγχου. Λειτουργεί με τα εξής: Lambda, HTTP, AWS Services.
- REST API: Αναπτύξτε ένα REST API όπου έχετε πλήρη έλεγχο πάνω στο αίτημα και την απάντηση μαζί με δυνατότητες διαχείρισης API. Λειτουργεί με τα εξής: Lambda, HTTP, AWS Services.
- REST API Private: Δημιουργήστε ένα REST API που είναι προσβάσιμο μόνο από μέσα σε ένα VPC.
API Gateway Main Components
- Resources: Στο API Gateway, οι πόροι είναι τα στοιχεία που συνθέτουν τη δομή του API σας. Αντιπροσωπεύουν τους διάφορους δρόμους ή endpoints του API σας και αντιστοιχούν στις διάφορες ενέργειες που υποστηρίζει το API σας. Ένας πόρος είναι κάθε μέθοδος (π.χ., GET, POST, PUT, DELETE) μέσα σε κάθε δρόμο (/, ή /users, ή /user/{id}).
- Stages: Οι σκηνές στο API Gateway αντιπροσωπεύουν διαφορετικές εκδόσεις ή περιβάλλοντα του API σας, όπως ανάπτυξη, δοκιμαστική ή παραγωγή. Μπορείτε να χρησιμοποιήσετε σκηνές για να διαχειριστείτε και να αναπτύξετε πολλές εκδόσεις του API σας ταυτόχρονα, επιτρέποντάς σας να δοκιμάσετε νέες δυνατότητες ή διορθώσεις σφαλμάτων χωρίς να επηρεάσετε το περιβάλλον παραγωγής. Οι σκηνές υποστηρίζουν επίσης μεταβλητές σκηνής, οι οποίες είναι ζεύγη κλειδιού-τιμής που μπορούν να χρησιμοποιηθούν για να ρυθμίσουν τη συμπεριφορά του API σας με βάση την τρέχουσα σκηνή. Για παράδειγμα, θα μπορούσατε να χρησιμοποιήσετε μεταβλητές σκηνής για να κατευθύνετε τα αιτήματα API σε διαφορετικές λειτουργίες Lambda ή άλλες υπηρεσίες backend ανάλογα με τη σκηνή.
- Η σκηνή υποδεικνύεται στην αρχή του URL του endpoint του API Gateway.
- Authorizers: Οι εξουσιοδοτητές στο API Gateway είναι υπεύθυνοι για τον έλεγχο πρόσβασης στο API σας επαληθεύοντας την ταυτότητα του καλούντος πριν επιτρέψουν την προώθηση του αιτήματος. Μπορείτε να χρησιμοποιήσετε λειτουργίες AWS Lambda ως προσαρμοσμένους εξουσιοδοτητές, που σας επιτρέπει να εφαρμόσετε τη δική σας λογική ταυτοποίησης και εξουσιοδότησης. Όταν έρχεται ένα αίτημα, το API Gateway περνά το διαπιστευτήριο εξουσιοδότησης του αιτήματος στον εξουσιοδοτητή Lambda, ο οποίος επεξεργάζεται το διαπιστευτήριο και επιστρέφει μια πολιτική IAM που καθορίζει ποιες ενέργειες επιτρέπεται να εκτελέσει ο καλών. Το API Gateway υποστηρίζει επίσης ενσωματωμένους εξουσιοδοτητές, όπως AWS Identity and Access Management (IAM) και Amazon Cognito.
- Resource Policy: Μια πολιτική πόρου στο API Gateway είναι ένα έγγραφο JSON που καθορίζει τις άδειες πρόσβασης στο API σας. Είναι παρόμοια με μια πολιτική IAM αλλά ειδικά προσαρμοσμένη για το API Gateway. Μπορείτε να χρησιμοποιήσετε μια πολιτική πόρου για να ελέγξετε ποιος μπορεί να έχει πρόσβαση στο API σας, ποιες μεθόδους μπορούν να καλέσουν και από ποιες διευθύνσεις IP ή VPC μπορούν να συνδεθούν. Οι πολιτικές πόρου μπορούν να χρησιμοποιηθούν σε συνδυασμό με εξουσιοδοτητές για να παρέχουν λεπτομερή έλεγχο πρόσβασης για το API σας.
- Για να έχει αποτέλεσμα, το API πρέπει να αναπτυχθεί ξανά μετά την τροποποίηση της πολιτικής πόρου.
Logging
Από προεπιλογή, CloudWatch Logs είναι απενεργοποιημένα, Access Logging είναι απενεργοποιημένο, και X-Ray tracing είναι επίσης απενεργοποιημένο.
Enumeration
Tip
Σημειώστε ότι και στα δύο AWS APIs για την καταμέτρηση πόρων (
apigatewayκαιapigatewayv2) η μόνη άδεια που χρειάζεστε και η μόνη άδεια ανάγνωσης που μπορεί να παραχωρηθεί είναιapigateway:GET, με αυτό μπορείτε να καταμετρήσετε τα πάντα.
# Generic info
aws apigateway get-account
aws apigateway get-domain-names
aws apigateway get-usage-plans
aws apigateway get-vpc-links
aws apigateway get-client-certificates
# Enumerate APIs
aws apigateway get-rest-apis # This will also show the resource policy (if any)
## Get stages
aws apigateway get-stages --rest-api-id <id>
## Get resources
aws apigateway get-resources --rest-api-id <id>
## Get API resource action per HTTP verb (check authorizers and api key required)
aws apigateway get-method --http-method GET --rest-api-id <api-id> --resource-id <resource-id>
## Call API
https://<api-id>.execute-api.<region>.amazonaws.com/<stage>/<resource>
## API authorizers
aws apigateway get-authorizers --rest-api-id <id>
## Models
aws apigateway get-models --rest-api-id <id>
## More info
aws apigateway get-gateway-responses --rest-api-id <id>
aws apigateway get-request-validators --rest-api-id <id>
aws apigateway get-deployments --rest-api-id <id>
# Get api keys generated
aws apigateway get-api-keys --include-value
aws apigateway get-api-key --api-key <id> --include-value # Get just 1
## Example use API key
curl -X GET -H "x-api-key: AJE&Ygenu4[..]" https://e83uuftdi8.execute-api.us-east-1.amazonaws.com/dev/test
## Usage plans
aws apigateway get-usage-plans #Get limit use info
aws apigateway get-usage-plan-keys --usage-plan-id <plan_id> #Get clear text values of api keys
aws apigateway get-usage-plan-key --usage-plan-id <plan_id> --key-id <key_id>
###Already consumed
aws apigateway get-usage --usage-plan-id <plan_id> --start-date 2023-07-01 --end-date 2023-07-12
Διάφορες Εξουσιοδοτήσεις για πρόσβαση σε API Gateway endpoints
Πολιτική Πόρου
Είναι δυνατόν να χρησιμοποιηθούν πολιτικές πόρου για να καθοριστεί ποιος μπορεί να καλέσει τα API endpoints.
Στο παρακάτω παράδειγμα μπορείτε να δείτε ότι η υποδεικνυόμενη IP δεν μπορεί να καλέσει το endpoint /resource_policy μέσω GET.
.png)
IAM Authorizer
Είναι δυνατόν να οριστεί ότι μια μέθοδος μέσα σε μια διαδρομή (πόρο) απαιτεί IAM αυθεντικοποίηση για να την καλέσει.
Όταν αυτό έχει οριστεί, θα λάβετε το σφάλμα {"message":"Missing Authentication Token"} όταν προσπαθήσετε να προσεγγίσετε το endpoint χωρίς καμία εξουσιοδότηση.
Ένας εύκολος τρόπος για να δημιουργήσετε το αναμενόμενο token από την εφαρμογή είναι να χρησιμοποιήσετε curl.
$ curl -X <method> https://<api-id>.execute-api.<region>.amazonaws.com/<stage>/<resource> --user <AWS_ACCESS_KEY>:<AWS_SECRET_KEY> --aws-sigv4 "aws:amz:<region>:execute-api"
Ένας άλλος τρόπος είναι να χρησιμοποιήσετε τον τύπο Authorization AWS Signature μέσα στο Postman.
.png)
Ρυθμίστε το accessKey και το SecretKey του λογαριασμού που θέλετε να χρησιμοποιήσετε και μπορείτε να γνωρίζετε πώς να αυθεντικοποιηθείτε κατά της API endpoint.
Και οι δύο μέθοδοι θα δημιουργήσουν ένα Authorization header όπως:
AWS4-HMAC-SHA256 Credential=AKIAYY7XU6ECUDOTWB7W/20220726/us-east-1/execute-api/aws4_request, SignedHeaders=host;x-amz-date, Signature=9f35579fa85c0d089c5a939e3d711362e92641e8c14cc571df8c71b4bc62a5c2
Σημειώστε ότι σε άλλες περιπτώσεις ο Authorizer μπορεί να έχει κακώς κωδικοποιηθεί και απλά η αποστολή οτιδήποτε μέσα στην Authorization header θα επιτρέψει να δείτε το κρυφό περιεχόμενο.
Request Signing Using Python
pip install requests
pip install requests-aws4auth
pip install boto3
import boto3
import requests
from requests_aws4auth import AWS4Auth
region = 'us-east-1' # Region
service = 'execute-api'
access_key = 'YOUR_ACCESS_KEY'
secret_key = 'YOUR_SECRET_KEY'
url = 'https://<apiid>.execute-api.us-east-1.amazonaws.com/<stage>/<resource>'
session = boto3.Session(aws_access_key_id=access_key, aws_secret_access_key=secret_key)
credentials = session.get_credentials()
awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token)
response = requests.get(url, auth=awsauth)
print(response.text)
Custom Lambda Authorizer
Είναι δυνατόν να χρησιμοποιήσετε μια lambda που βασίζεται σε ένα δεδομένο token για να επιστρέψει μια πολιτική IAM που υποδεικνύει αν ο χρήστης είναι εξουσιοδοτημένος να καλέσει το API endpoint.
Μπορείτε να ορίσετε κάθε μέθοδο πόρου που θα χρησιμοποιεί τον εξουσιοδοτητή.
Παράδειγμα Κώδικα Lambda Authorizer
```python import jsondef lambda_handler(event, context): token = event[‘authorizationToken’] method_arn = event[‘methodArn’]
if not token: return { ‘statusCode’: 401, ‘body’: ‘Unauthorized’ }
try:
Replace this with your own token validation logic
if token == “your-secret-token”: return generate_policy(‘user’, ‘Allow’, method_arn) else: return generate_policy(‘user’, ‘Deny’, method_arn) except Exception as e: print(e) return { ‘statusCode’: 500, ‘body’: ‘Internal Server Error’ }
def generate_policy(principal_id, effect, resource): policy = { ‘principalId’: principal_id, ‘policyDocument’: { ‘Version’: ‘2012-10-17’, ‘Statement’: [ { ‘Action’: ‘execute-api:Invoke’, ‘Effect’: effect, ‘Resource’: resource } ] } } return policy
</details>
Καλέστε το με κάτι σαν:
<pre class="language-bash" data-overflow="wrap"><code class="lang-bash"><strong>curl "https://jhhqafgh6f.execute-api.eu-west-1.amazonaws.com/prod/custom_auth" -H 'Authorization: your-secret-token'
</strong></code></pre>
> [!WARNING]
> Ανάλογα με τον κώδικα Lambda, αυτή η εξουσιοδότηση μπορεί να είναι ευάλωτη
Σημειώστε ότι αν **παραχθεί και επιστραφεί μια πολιτική άρνησης**, το σφάλμα που επιστρέφεται από το API Gateway είναι: `{"Message":"User is not authorized to access this resource with an explicit deny"}`
Με αυτόν τον τρόπο μπορείτε να **εντοπίσετε αυτή την εξουσιοδότηση** που είναι σε ισχύ.
### Απαιτούμενο API Key
Είναι δυνατόν να ορίσετε API endpoints που **απαιτούν ένα έγκυρο API key** για να επικοινωνήσουν.
<figure><img src="../../../images/image (88).png" alt=""><figcaption></figcaption></figure>
Είναι δυνατόν να παραχθούν API keys στην πύλη API Gateway και ακόμη και να οριστεί πόσο μπορεί να χρησιμοποιηθεί (σε όρους αιτημάτων ανά δευτερόλεπτο και σε όρους αιτημάτων ανά μήνα).
Για να λειτουργήσει ένα API key, πρέπει να το προσθέσετε σε ένα **Usage Plan**, αυτό το σχέδιο χρήσης πρέπει να προστεθεί στο **API Stage** και η σχετική φάση API πρέπει να έχει ρυθμισμένο **method throttling** στο **endpoint** που απαιτεί το API key:
<figure><img src="../../../images/image (198).png" alt=""><figcaption></figcaption></figure>
## Μη Αυθεντική Πρόσβαση
<a class="content_ref" href="../aws-unauthenticated-enum-access/aws-api-gateway-unauthenticated-enum/index.html"><span class="content_ref_label">AWS - API Gateway Unauthenticated Enum</span></a>
## Privesc
<a class="content_ref" href="../aws-privilege-escalation/aws-apigateway-privesc/index.html"><span class="content_ref_label">AWS - Apigateway Privesc</span></a>
## Post Exploitation
<a class="content_ref" href="../aws-post-exploitation/aws-api-gateway-post-exploitation/index.html"><span class="content_ref_label">AWS - API Gateway Post Exploitation</span></a>
## Persistence
<a class="content_ref" href="../aws-persistence/aws-api-gateway-persistence/index.html"><span class="content_ref_label">AWS - API Gateway Persistence</span></a>
> [!TIP]
> Μάθετε & εξασκηθείτε στο AWS Hacking:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://hacktricks-training.com/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Μάθετε & εξασκηθείτε στο GCP Hacking: <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://hacktricks-training.com/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Μάθετε & εξασκηθείτε στο Az Hacking: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://hacktricks-training.com/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
>
> <details>
>
> <summary>Υποστηρίξτε το HackTricks</summary>
>
> - Δείτε τα [**subscription plans**](https://github.com/sponsors/carlospolop)!
> - **Εγγραφείτε στο** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) ή την [**telegram group**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
> - **Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
>
> </details>
HackTricks Cloud

