# AWS - API Gateway Enum {{#include ../../../banners/hacktricks-training.md}} ## 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 की शुरुआत में संकेतित होता है। 3. **Authorizers**: API Gateway में ऑथराइज़र आपके API तक पहुँच को **नियंत्रित करने** के लिए जिम्मेदार होते हैं, कॉलर की पहचान को सत्यापित करके अनुरोध को आगे बढ़ाने की अनुमति देने से पहले। आप **AWS Lambda कार्यों** का उपयोग कस्टम ऑथराइज़र के रूप में कर सकते हैं, जिससे आप अपनी स्वयं की प्रमाणीकरण और प्राधिकरण लॉजिक लागू कर सकते हैं। जब एक अनुरोध आता है, API Gateway अनुरोध के प्रमाणीकरण टोकन को Lambda ऑथराइज़र को पास करता है, जो टोकन को संसाधित करता है और एक IAM नीति लौटाता है जो निर्धारित करती है कि कॉलर को कौन सी क्रियाएँ करने की अनुमति है। API Gateway **निर्मित ऑथराइज़र** का भी समर्थन करता है, जैसे **AWS पहचान और पहुँच प्रबंधन (IAM)** और **Amazon Cognito**। 4. **Resource Policy**: API Gateway में एक संसाधन नीति एक JSON दस्तावेज़ है जो **आपके API तक पहुँचने के लिए अनुमतियों को परिभाषित करता है**। यह एक IAM नीति के समान है लेकिन विशेष रूप से API Gateway के लिए तैयार की गई है। आप एक संसाधन नीति का उपयोग यह नियंत्रित करने के लिए कर सकते हैं कि कौन आपके API तक पहुँच सकता है, वे कौन सी विधियाँ कॉल कर सकते हैं, और वे किन IP पते या VPCs से कनेक्ट कर सकते हैं। **संसाधन नीतियों का उपयोग ऑथराइज़र्स के साथ संयोजन में किया जा सकता है** ताकि आपके API के लिए बारीक पहुँच नियंत्रण प्रदान किया जा सके। - प्रभाव डालने के लिए API को **संसाधन नीति में संशोधन के बाद फिर से तैनात** करने की आवश्यकता होती है। ### Logging डिफ़ॉल्ट रूप से, **CloudWatch Logs** **बंद** हैं, **Access Logging** **बंद** है, और **X-Ray ट्रेसिंग** भी **बंद** है। ### Enumeration > [!TIP] > ध्यान दें कि संसाधनों को सूचीबद्ध करने के लिए AWS APIs (**`apigateway`** और **`apigatewayv2`**) में आपको केवल एक अनुमति की आवश्यकता है और केवल पढ़ने की अनुमति जो दी जा सकती है वह है **`apigateway:GET`**, इसके साथ आप **सब कुछ सूचीबद्ध कर सकते हैं।** {{#tabs }} {{#tab name="apigateway" }} ```bash # 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 ## Get resources aws apigateway get-resources --rest-api-id ## Get API resource action per HTTP verb (check authorizers and api key required) aws apigateway get-method --http-method GET --rest-api-id --resource-id ## Call API https://.execute-api..amazonaws.com// ## API authorizers aws apigateway get-authorizers --rest-api-id ## Models aws apigateway get-models --rest-api-id ## More info aws apigateway get-gateway-responses --rest-api-id aws apigateway get-request-validators --rest-api-id aws apigateway get-deployments --rest-api-id # Get api keys generated aws apigateway get-api-keys --include-value aws apigateway get-api-key --api-key --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 #Get clear text values of api keys aws apigateway get-usage-plan-key --usage-plan-id --key-id ###Already consumed aws apigateway get-usage --usage-plan-id --start-date 2023-07-01 --end-date 2023-07-12 ``` {{#endtab }} {{#tab name="apigatewayv2" }} ```bash # Generic info aws apigatewayv2 get-domain-names aws apigatewayv2 get-domain-name --domain-name aws apigatewayv2 get-vpc-links # Enumerate APIs aws apigatewayv2 get-apis # This will also show the resource policy (if any) aws apigatewayv2 get-api --api-id ## Get all the info from an api at once aws apigatewayv2 export-api --api-id --output-type YAML --specification OAS30 /tmp/api.yaml ## Get stages aws apigatewayv2 get-stages --api-id ## Get routes aws apigatewayv2 get-routes --api-id aws apigatewayv2 get-route --api-id --route-id ## Get deployments aws apigatewayv2 get-deployments --api-id aws apigatewayv2 get-deployment --api-id --deployment-id ## Get integrations aws apigatewayv2 get-integrations --api-id ## Get authorizers aws apigatewayv2 get-authorizers --api-id aws apigatewayv2 get-authorizer --api-id --authorizer-id ## Get domain mappings aws apigatewayv2 get-api-mappings --api-id --domain-name aws apigatewayv2 get-api-mapping --api-id --api-mapping-id --domain-name ## Get models aws apigatewayv2 get-models --api-id ## Call API https://.execute-api..amazonaws.com// ``` {{#endtab }} {{#endtabs }} ## API गेटवे एंडपॉइंट्स तक पहुँचने के लिए विभिन्न प्राधिकरण ### संसाधन नीति यह संभव है कि संसाधन नीतियों का उपयोग यह परिभाषित करने के लिए किया जाए कि कौन API एंडपॉइंट्स को कॉल कर सकता है।\ निम्नलिखित उदाहरण में आप देख सकते हैं कि **संकेतित IP एंडपॉइंट** `/resource_policy` को GET के माध्यम से कॉल नहीं कर सकता।
### IAM प्राधिकर्ता यह संभव है कि एक पथ (एक संसाधन) के अंदर एक विधि को कॉल करने के लिए IAM प्रमाणीकरण की आवश्यकता हो।
जब यह सेट किया जाता है, तो आप बिना किसी प्राधिकरण के एंडपॉइंट तक पहुँचने की कोशिश करते समय त्रुटि `{"message":"Missing Authentication Token"}` प्राप्त करेंगे। ऐप्लिकेशन द्वारा अपेक्षित टोकन उत्पन्न करने का एक आसान तरीका **curl** का उपयोग करना है। ```bash $ curl -X https://.execute-api..amazonaws.com// --user : --aws-sigv4 "aws:amz::execute-api" ``` एक और तरीका है **Postman** के अंदर **`Authorization`** प्रकार **`AWS Signature`** का उपयोग करना।
जिस खाते का आप उपयोग करना चाहते हैं, उसके 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** के अंदर **कुछ भी** भेजने से **छिपी हुई सामग्री** को **देखने की अनुमति** मिल जाएगी। ### Python का उपयोग करके अनुरोध हस्ताक्षर करना ```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://.execute-api.us-east-1.amazonaws.com//' 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) ``` ### कस्टम लैम्ब्डा ऑथराइज़र यह संभव है कि एक लैम्ब्डा का उपयोग किया जाए जो दिए गए टोकन के आधार पर **IAM नीति** लौटाएगा जो यह दर्शाती है कि उपयोगकर्ता **API एंडपॉइंट को कॉल करने के लिए अधिकृत है**।\ आप प्रत्येक संसाधन विधि को सेट कर सकते हैं जो ऑथराइज़र का उपयोग करेगी।
लैम्ब्डा ऑथराइज़र कोड उदाहरण ```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 ```
इसे कुछ इस तरह कॉल करें:
curl "https://jhhqafgh6f.execute-api.eu-west-1.amazonaws.com/prod/custom_auth" -H 'Authorization: your-secret-token'
> [!WARNING] > Lambda कोड के आधार पर, यह प्राधिकरण कमजोर हो सकता है ध्यान दें कि यदि एक **deny policy उत्पन्न और लौटाई जाती है** तो API Gateway द्वारा लौटाई गई त्रुटि है: `{"Message":"User is not authorized to access this resource with an explicit deny"}` इस तरह आप **इस प्राधिकरण** की पहचान कर सकते हैं। ### आवश्यक API कुंजी यह संभव है कि API एंडपॉइंट सेट करें जो **एक मान्य API कुंजी** की आवश्यकता हो।
API Gateway पोर्टल में API कुंजी उत्पन्न करना संभव है और यहां तक कि यह भी सेट करना कि इसे कितनी बार उपयोग किया जा सकता है (प्रति सेकंड अनुरोधों और प्रति माह अनुरोधों के संदर्भ में)। API कुंजी को काम करने के लिए, आपको इसे **Usage Plan** में जोड़ना होगा, यह उपयोग योजना **API Stage** में जोड़ी जानी चाहिए और संबंधित API स्टेज को **endpoint** के लिए एक **method throttling** कॉन्फ़िगर किया जाना चाहिए जो API कुंजी की आवश्यकता है:
## अनधिकृत पहुंच {{#ref}} ../aws-unauthenticated-enum-access/aws-api-gateway-unauthenticated-enum.md {{#endref}} ## Privesc {{#ref}} ../aws-privilege-escalation/aws-apigateway-privesc.md {{#endref}} ## Post Exploitation {{#ref}} ../aws-post-exploitation/aws-api-gateway-post-exploitation.md {{#endref}} ## Persistence {{#ref}} ../aws-persistence/aws-api-gateway-persistence.md {{#endref}} {{#include ../../../banners/hacktricks-training.md}}