AWS - API Gateway Enum

Support HackTricks

API Gateway

Basic Information

AWS API Gateway एक व्यापक सेवा है जो Amazon Web Services (AWS) द्वारा पेश की गई है, जिसे डेवलपर्स को बड़े पैमाने पर APIs बनाने, प्रकाशित करने और देखरेख करने के लिए डिज़ाइन किया गया है। यह एक एप्लिकेशन के लिए एक प्रवेश बिंदु के रूप में कार्य करता है, जिससे डेवलपर्स को नियमों और प्रक्रियाओं का एक ढांचा स्थापित करने की अनुमति मिलती है। यह ढांचा बाहरी उपयोगकर्ताओं को एप्लिकेशन के भीतर कुछ डेटा या कार्यक्षमताओं तक पहुंच को नियंत्रित करता है।

API Gateway आपको यह परिभाषित करने की अनुमति देता है कि आपके APIs के लिए अनुरोधों को कैसे संभाला जाना चाहिए, और यह विशिष्ट विधियों (जैसे, GET, POST, PUT, DELETE) और संसाधनों के साथ कस्टम API एंडपॉइंट बनाने में सक्षम है। यह डेवलपर्स के लिए अपने एप्लिकेशन से आपके APIs को कॉल करना आसान बनाने के लिए क्लाइंट SDKs (सॉफ़्टवेयर विकास किट) भी उत्पन्न कर सकता है।

API Gateways Types

  • HTTP API: OIDC और OAuth2 जैसी अंतर्निहित सुविधाओं के साथ कम विलंबता और लागत प्रभावी REST APIs बनाएं, और मूल CORS समर्थन। निम्नलिखित के साथ काम करता है: Lambda, HTTP बैकएंड।

  • WebSocket API: चैट एप्लिकेशन या डैशबोर्ड जैसे वास्तविक समय के उपयोग के मामलों के लिए स्थायी कनेक्शनों का उपयोग करके एक WebSocket API बनाएं। निम्नलिखित के साथ काम करता है: Lambda, HTTP, AWS सेवाएँ।

  • REST API: एक REST API विकसित करें जहाँ आप अनुरोध और प्रतिक्रिया पर पूर्ण नियंत्रण प्राप्त करते हैं साथ ही API प्रबंधन क्षमताएँ। निम्नलिखित के साथ काम करता है: Lambda, HTTP, AWS सेवाएँ।

  • REST API Private: एक REST API बनाएं जो केवल एक VPC के भीतर से सुलभ हो।

API Gateway Main Components

  1. Resources: API Gateway में, संसाधन वे घटक हैं जो आपके API की संरचना बनाते हैं। वे आपके API के विभिन्न पथों या एंडपॉइंट्स का प्रतिनिधित्व करते हैं और आपके API द्वारा समर्थित विभिन्न क्रियाओं के अनुरूप होते हैं। एक संसाधन प्रत्येक विधि है (जैसे, GET, POST, PUT, DELETE) प्रत्येक पथ के भीतर (/, या /users, या /user/{id}).

  2. Stages: API Gateway में स्टेज आपके API के विभिन्न संस्करणों या वातावरणों का प्रतिनिधित्व करते हैं, जैसे विकास, स्टेजिंग, या उत्पादन। आप स्टेज का उपयोग करके एक साथ कई संस्करणों का प्रबंधन और तैनात कर सकते हैं, जिससे आप नए फीचर्स या बग फिक्स का परीक्षण कर सकते हैं बिना उत्पादन वातावरण को प्रभावित किए। स्टेज स्टेज वेरिएबल्स का भी समर्थन करते हैं, जो कुंजी-मूल्य जोड़े होते हैं जिन्हें आपके API के व्यवहार को वर्तमान स्टेज के आधार पर कॉन्फ़िगर करने के लिए उपयोग किया जा सकता है। उदाहरण के लिए, आप स्टेज वेरिएबल्स का उपयोग API अनुरोधों को विभिन्न Lambda कार्यों या अन्य बैकएंड सेवाओं की ओर निर्देशित करने के लिए कर सकते हैं।

  • स्टेज API Gateway एंडपॉइंट के URL की शुरुआत में संकेतित होता है।

  1. Authorizers: API Gateway में ऑथराइजर्स आपके API तक पहुँच को नियंत्रित करने के लिए जिम्मेदार होते हैं, कॉलर की पहचान को सत्यापित करके अनुरोध को आगे बढ़ाने की अनुमति देने से पहले। आप AWS Lambda कार्यों का उपयोग कस्टम ऑथराइजर्स के रूप में कर सकते हैं, जिससे आप अपनी स्वयं की प्रमाणीकरण और प्राधिकरण लॉजिक लागू कर सकते हैं। जब एक अनुरोध आता है, API Gateway अनुरोध के प्रमाणीकरण टोकन को Lambda ऑथराइज़र को पास करता है, जो टोकन को संसाधित करता है और एक IAM नीति लौटाता है जो निर्धारित करती है कि कॉलर को कौन सी क्रियाएँ करने की अनुमति है। API Gateway बिल्ट-इन ऑथराइजर्स का भी समर्थन करता है, जैसे AWS पहचान और पहुंच प्रबंधन (IAM) और Amazon Cognito

  2. Resource Policy: API Gateway में एक संसाधन नीति एक JSON दस्तावेज़ है जो आपके API तक पहुँचने के लिए अनुमतियों को परिभाषित करता है। यह एक IAM नीति के समान है लेकिन विशेष रूप से API Gateway के लिए तैयार की गई है। आप एक संसाधन नीति का उपयोग यह नियंत्रित करने के लिए कर सकते हैं कि कौन आपके API तक पहुँच सकता है, वे कौन सी विधियाँ कॉल कर सकते हैं, और वे किन IP पतों या VPCs से कनेक्ट कर सकते हैं। संसाधन नीतियों का उपयोग ऑथराइजर्स के साथ संयोजन में किया जा सकता है ताकि आपके API के लिए बारीक पहुँच नियंत्रण प्रदान किया जा सके।

  • संसाधन नीति में संशोधन के बाद प्रभावी होने के लिए API को फिर से तैनात करने की आवश्यकता होती है

Logging

डिफ़ॉल्ट रूप से, CloudWatch Logs बंद हैं, Access Logging बंद है, और X-Ray ट्रेसिंग भी बंद है।

Enumeration

Note that in both AWS apis to enumerate resources (apigateway and apigatewayv2) the only permission you need and the only read permission grantable is apigateway:GET, with that you can enumerate everything.

# 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 गेटवे एंडपॉइंट्स तक पहुँचने के लिए विभिन्न प्राधिकरण

संसाधन नीति

यह संभव है कि संसाधन नीतियों का उपयोग करके यह परिभाषित किया जा सके कि कौन API एंडपॉइंट्स को कॉल कर सकता है। निम्नलिखित उदाहरण में आप देख सकते हैं कि निर्दिष्ट IP एंडपॉइंट /resource_policy को GET के माध्यम से कॉल नहीं कर सकता।

IAM प्राधिकर्ता

यह संभव है कि एक पथ (एक संसाधन) के अंदर एक विधि को कॉल करने के लिए IAM प्रमाणीकरण की आवश्यकता हो।

जब यह सेट किया जाता है, तो आप जब किसी भी प्राधिकरण के बिना एंडपॉइंट तक पहुँचने की कोशिश करते हैं, तो आपको त्रुटि {"message":"Missing Authentication Token"} प्राप्त होगी।

ऐप द्वारा अपेक्षित टोकन उत्पन्न करने का एक आसान तरीका Postman के अंदर Authorization प्रकार AWS Signature का उपयोग करना है।

आप जिस खाते का उपयोग करना चाहते हैं, उसके accessKey और SecretKey सेट करें और आप API एंडपॉइंट के खिलाफ प्रमाणीकरण कर सकते हैं।

यह एक 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

यह संभव है कि एक लैम्ब्डा का उपयोग किया जाए जो एक दिए गए टोकन के आधार पर IAM नीति लौटाएगा जो यह दर्शाती है कि क्या उपयोगकर्ता API एंडपॉइंट को कॉल करने के लिए अधिकृत है। आप प्रत्येक संसाधन विधि को सेट कर सकते हैं जो लेखक का उपयोग करेगी।

Lambda Authorizer Code Example

```python import json

def 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>

<div data-gb-custom-block data-tag="hint" data-style='warning'>

Lambda कोड के आधार पर, यह प्राधिकरण कमजोर हो सकता है

</div>

ध्यान दें कि यदि एक **deny policy उत्पन्न और लौटाई जाती है** तो API Gateway द्वारा लौटाया गया त्रुटि संदेश है: `{"Message":"User is not authorized to access this resource with an explicit deny"}`

इस तरह आप **इस प्राधिकरण** की पहचान कर सकते हैं।

### आवश्यक API कुंजी

यह संभव है कि API एंडपॉइंट सेट करें जो **एक मान्य API कुंजी** की आवश्यकता हो।

<figure><img src="../../../.gitbook/assets/image (88).png" alt=""><figcaption></figcaption></figure>

API Gateway पोर्टल में API कुंजी उत्पन्न करना संभव है और यहां तक कि यह भी सेट करना कि इसे कितनी बार उपयोग किया जा सकता है (प्रति सेकंड अनुरोधों और प्रति माह अनुरोधों के संदर्भ में)।

API कुंजी को काम करने के लिए, आपको इसे **Usage Plan** में जोड़ना होगा, यह उपयोग योजना **API Stage** में जोड़ी जानी चाहिए और संबंधित API स्टेज को **endpoint** के लिए एक **method throttling** कॉन्फ़िगर किया जाना चाहिए जो API कुंजी की आवश्यकता करता है:

<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>

## प्रिवेस्क

<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>

## पोस्ट एक्सप्लोइटेशन

<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>

## स्थिरता

<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 हैकिंग सीखें और अभ्यास करें:<img src="../../../.gitbook/assets/image (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).png" alt="" data-size="line">\
GCP हैकिंग सीखें और अभ्यास करें: <img src="../../../.gitbook/assets/image (2).png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/image (2).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)** पर हमें फॉलो करें।**
* **हैकिंग ट्रिक्स साझा करें और [**HackTricks**](https://github.com/carlospolop/hacktricks) और [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) गिटहब रिपोजिटरी में PR सबमिट करें।**

</details>

</div>

Last updated