AWS API Gateway είναι μια ολοκληρωμένη υπηρεσία που προσφέρεται από την Amazon Web Services (AWS) σχεδιασμένη για προγραμματιστές να δημιουργούν, δημοσιεύουν και επιβλέπουν APIs σε μεγάλη κλίμακα. Λειτουργεί ως σημείο εισόδου σε μια εφαρμογή, επιτρέποντας στους προγραμματιστές να καθορίσουν ένα πλαίσιο κανόνων και διαδικασιών. Αυτό το πλαίσιο διέπει την πρόσβαση που έχουν οι εξωτερικοί χρήστες σε ορισμένα δεδομένα ή λειτουργίες εντός της εφαρμογής.
Το API Gateway σας επιτρέπει να ορίσετε πώς θα πρέπει να διαχειρίζονται τα αιτήματα προς τα APIs σας, και μπορεί να δημιουργήσει προσαρμοσμένα API endpoints με συγκεκριμένες μεθόδους (π.χ., GET, POST, PUT, DELETE) και πόρους. Μπορεί επίσης να δημιουργήσει SDKs (Software Development Kits) για να διευκολύνει τους προγραμματιστές να καλούν τα APIs σας από τις εφαρμογές τους.
Τύποι API Gateways
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: Δημιουργήστε ένα REST API που είναι προσβάσιμο μόνο από μέσα σε ένα VPC.
Κύρια Συστατικά του API Gateway
Πόροι: Στο API Gateway, οι πόροι είναι τα συστατικά που συνθέτουν τη δομή του API σας. Αντιπροσωπεύουν τους διάφορους δρόμους ή endpoints του API σας και αντιστοιχούν στις διάφορες ενέργειες που υποστηρίζει το API σας. Ένας πόρος είναι κάθε μέθοδος (π.χ., GET, POST, PUT, DELETE) μέσα σε κάθε δρόμο (/, ή /users, ή /user/{id}).
Στάδια: Τα στάδια στο API Gateway αντιπροσωπεύουν διαφορετικές εκδόσεις ή περιβάλλοντα του API σας, όπως ανάπτυξη, δοκιμαστική ή παραγωγή. Μπορείτε να χρησιμοποιήσετε στάδια για να διαχειριστείτε και να αναπτύξετε πολλαπλές εκδόσεις του API σας ταυτόχρονα, επιτρέποντάς σας να δοκιμάσετε νέες δυνατότητες ή διορθώσεις σφαλμάτων χωρίς να επηρεάσετε το περιβάλλον παραγωγής. Τα στάδια υποστηρίζουν επίσης μεταβλητές σταδίου, οι οποίες είναι ζεύγη κλειδιού-τιμής που μπορούν να χρησιμοποιηθούν για να ρυθμίσουν τη συμπεριφορά του API σας με βάση το τρέχον στάδιο. Για παράδειγμα, θα μπορούσατε να χρησιμοποιήσετε μεταβλητές σταδίου για να κατευθύνετε τα αιτήματα API σε διαφορετικές λειτουργίες Lambda ή άλλες υπηρεσίες backend ανάλογα με το στάδιο.
Το στάδιο υποδεικνύεται στην αρχή του URL του endpoint του API Gateway.
Εξουσιοδοτητές: Οι εξουσιοδοτητές στο API Gateway είναι υπεύθυνοι για τον έλεγχο πρόσβασης στο API σας επαληθεύοντας την ταυτότητα του καλούντος πριν επιτρέψουν την προώθηση του αιτήματος. Μπορείτε να χρησιμοποιήσετε λειτουργίες AWS Lambda ως προσαρμοσμένους εξουσιοδοτητές, που σας επιτρέπει να εφαρμόσετε τη δική σας λογική αυθεντικοποίησης και εξουσιοδότησης. Όταν έρχεται ένα αίτημα, το API Gateway περνά το διαπιστευτήριο εξουσιοδότησης του αιτήματος στον εξουσιοδοτητή Lambda, ο οποίος επεξεργάζεται το διαπιστευτήριο και επιστρέφει μια πολιτική IAM που καθορίζει ποιες ενέργειες επιτρέπεται να εκτελέσει ο καλών. Το API Gateway υποστηρίζει επίσης ενσωματωμένους εξουσιοδοτητές, όπως AWS Identity and Access Management (IAM) και Amazon Cognito.
Πολιτική Πόρου: Μια πολιτική πόρου στο API Gateway είναι ένα έγγραφο JSON που καθορίζει τις άδειες για την πρόσβαση στο API σας. Είναι παρόμοια με μια πολιτική IAM αλλά ειδικά προσαρμοσμένη για το API Gateway. Μπορείτε να χρησιμοποιήσετε μια πολιτική πόρου για να ελέγξετε ποιος μπορεί να έχει πρόσβαση στο API σας, ποιες μεθόδους μπορούν να καλέσουν και από ποιες διευθύνσεις IP ή VPC μπορούν να συνδεθούν. Οι πολιτικές πόρου μπορούν να χρησιμοποιηθούν σε συνδυασμό με εξουσιοδοτητές για να παρέχουν λεπτομερή έλεγχο πρόσβασης στο API σας.
Για να έχει αποτέλεσμα, το API πρέπει να αναπτυχθεί ξανά μετά την τροποποίηση της πολιτικής πόρου.
Καταγραφή
Από προεπιλογή, CloudWatch Logs είναι απενεργοποιημένα, Access Logging είναι απενεργοποιημένο, και X-Ray tracing είναι επίσης απενεργοποιημένο.
Αρίθμηση
Σημειώστε ότι και στις δύο AWS APIs για την αρίθμηση πόρων (apigateway και apigatewayv2) η μόνη άδεια που χρειάζεστε και η μόνη άδεια ανάγνωσης που μπορεί να παραχωρηθεί είναι apigateway:GET, με αυτή μπορείτε να αριθμήσετε τα πάντα.
# Generic infoawsapigatewayget-accountawsapigatewayget-domain-namesawsapigatewayget-usage-plansawsapigatewayget-vpc-linksawsapigatewayget-client-certificates# Enumerate APIsawsapigatewayget-rest-apis# This will also show the resource policy (if any)## Get stagesawsapigatewayget-stages--rest-api-id<id>## Get resourcesawsapigatewayget-resources--rest-api-id<id>## Get API resource action per HTTP verb (check authorizers and api key required)awsapigatewayget-method--http-methodGET--rest-api-id<api-id>--resource-id<resource-id>## Call APIhttps://<api-id>.execute-api.<region>.amazonaws.com/<stage>/<resource>## API authorizersawsapigatewayget-authorizers--rest-api-id<id>## Modelsawsapigatewayget-models--rest-api-id<id>## More infoawsapigatewayget-gateway-responses--rest-api-id<id>awsapigatewayget-request-validators--rest-api-id<id>awsapigatewayget-deployments--rest-api-id<id># Get api keys generatedawsapigatewayget-api-keys--include-valueawsapigatewayget-api-key--api-key<id>--include-value# Get just 1## Example use API keycurl-XGET-H"x-api-key: AJE&Ygenu4[..]"https://e83uuftdi8.execute-api.us-east-1.amazonaws.com/dev/test## Usage plansawsapigatewayget-usage-plans#Get limit use infoawsapigatewayget-usage-plan-keys--usage-plan-id<plan_id>#Get clear text values of api keysawsapigatewayget-usage-plan-key--usage-plan-id<plan_id>--key-id<key_id>###Already consumedawsapigatewayget-usage--usage-plan-id<plan_id>--start-date2023-07-01--end-date2023-07-12
# Generic infoawsapigatewayv2get-domain-namesawsapigatewayv2get-domain-name--domain-name<name>awsapigatewayv2get-vpc-links# Enumerate APIsawsapigatewayv2get-apis# This will also show the resource policy (if any)awsapigatewayv2get-api--api-id<id>## Get all the info from an api at onceawsapigatewayv2export-api--api-id<id>--output-typeYAML--specificationOAS30/tmp/api.yaml## Get stagesawsapigatewayv2get-stages--api-id<id>## Get routesawsapigatewayv2get-routes--api-id<id>awsapigatewayv2get-route--api-id<id>--route-id<route-id>## Get deploymentsawsapigatewayv2get-deployments--api-id<id>awsapigatewayv2get-deployment--api-id<id>--deployment-id<dep-id>## Get integrationsawsapigatewayv2get-integrations--api-id<id>## Get authorizersawsapigatewayv2get-authorizers--api-id<id>awsapigatewayv2get-authorizer--api-id<id>--authorizer-id<uth-id>## Get domain mappingsawsapigatewayv2get-api-mappings--api-id<id>--domain-name<dom-name>awsapigatewayv2get-api-mapping--api-id<id>--api-mapping-id<map-id>--domain-name<dom-name>## Get modelsawsapigatewayv2get-models--api-id<id>## Call APIhttps://<api-id>.execute-api.<region>.amazonaws.com/<stage>/<resource>
Διάφορες Εξουσιοδοτήσεις για πρόσβαση σε σημεία τέλους API Gateway
Πολιτική Πόρου
Είναι δυνατόν να χρησιμοποιηθούν πολιτικές πόρου για να καθοριστεί ποιος μπορεί να καλέσει τα σημεία τέλους API.
Στο παρακάτω παράδειγμα μπορείτε να δείτε ότι η υποδεικνυόμενη IP δεν μπορεί να καλέσει το σημείο τέλους /resource_policy μέσω GET.
Εξουσιοδότης IAM
Είναι δυνατόν να οριστεί ότι μια μέθοδος μέσα σε μια διαδρομή (πόρο) απαιτεί αυθεντικοποίηση IAM για να την καλέσει.
Όταν αυτό έχει οριστεί, θα λάβετε το σφάλμα {"message":"Missing Authentication Token"} όταν προσπαθήσετε να προσεγγίσετε το σημείο τέλους χωρίς καμία εξουσιοδότηση.
Ένας εύκολος τρόπος για να δημιουργήσετε το αναμενόμενο διακριτικό από την εφαρμογή είναι να χρησιμοποιήσετε curl.
Ένας άλλος τρόπος είναι να χρησιμοποιήσετε τον τύπο AuthorizationAWS Signature μέσα στο Postman.
Ρυθμίστε το accessKey και το SecretKey του λογαριασμού που θέλετε να χρησιμοποιήσετε και μπορείτε να γνωρίζετε να αυθεντικοποιηθείτε κατά της API endpoint.
Και οι δύο μέθοδοι θα δημιουργήσουν ένα Authorizationheader όπως:
Σημειώστε ότι σε άλλες περιπτώσεις ο Authorizer μπορεί να έχει κακώς κωδικοποιηθεί και απλά η αποστολή οτιδήποτε μέσα στην Authorization header θα επιτρέψει να δείτε το κρυφό περιεχόμενο.
Είναι δυνατόν να χρησιμοποιήσετε μια lambda που βασίζεται σε ένα δεδομένο token για να επιστρέψει μια πολιτική IAM που υποδεικνύει αν ο χρήστης είναι εξουσιοδοτημένος να καλέσει το API endpoint.
Μπορείτε να ορίσετε κάθε μέθοδο πόρου που θα χρησιμοποιεί τον εξουσιοδοτητή.
</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>
<div data-gb-custom-block data-tag="hint" data-style='warning'>
Ανάλογα με τον κώδικα Lambda, αυτή η εξουσιοδότηση μπορεί να είναι ευάλωτη
</div>
Σημειώστε ότι αν **παραχθεί και επιστραφεί μια πολιτική άρνησης**, το σφάλμα που επιστρέφει το API Gateway είναι: `{"Message":"User is not authorized to access this resource with an explicit deny"}`
Με αυτόν τον τρόπο μπορείτε να **εντοπίσετε αυτή την εξουσιοδότηση** που είναι σε ισχύ.
### Απαιτούμενο API Key
Είναι δυνατόν να ορίσετε API endpoints που **απαιτούν ένα έγκυρο API key** για να επικοινωνήσουν.
<figure><img src="../../../.gitbook/assets/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="../../../.gitbook/assets/image (198).png" alt=""><figcaption></figcaption></figure>
## Μη Αυθεντική Πρόσβαση
<div data-gb-custom-block data-tag="content-ref" data-url='../aws-unauthenticated-enum-access/aws-api-gateway-unauthenticated-enum.md'>
[aws-api-gateway-unauthenticated-enum.md](../aws-unauthenticated-enum-access/aws-api-gateway-unauthenticated-enum.md)
</div>
## Privesc
<div data-gb-custom-block data-tag="content-ref" data-url='../aws-privilege-escalation/aws-apigateway-privesc.md'>
[aws-apigateway-privesc.md](../aws-privilege-escalation/aws-apigateway-privesc.md)
</div>
## Post Exploitation
<div data-gb-custom-block data-tag="content-ref" data-url='../aws-post-exploitation/aws-api-gateway-post-exploitation.md'>
[aws-api-gateway-post-exploitation.md](../aws-post-exploitation/aws-api-gateway-post-exploitation.md)
</div>
## Persistence
<div data-gb-custom-block data-tag="content-ref" data-url='../aws-persistence/aws-api-gateway-persistence.md'>
[aws-api-gateway-persistence.md](../aws-persistence/aws-api-gateway-persistence.md)
</div>
<div data-gb-custom-block data-tag="hint" data-style='success'>
Μάθετε & εξασκηθείτε στο AWS Hacking:<img src="../../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="line">\
Μάθετε & εξασκηθείτε στο GCP Hacking: <img src="../../../.gitbook/assets/image (2) (1).png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/image (2) (1).png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Υποστηρίξτε το HackTricks</summary>
* Ελέγξτε τα [**σχέδια συνδρομής**](https://github.com/sponsors/carlospolop)!
* **Εγγραφείτε στην** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks_live)**.**
* **Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
</div>