AWS - Lambda Enum

Support HackTricks

Lambda

Amazon Web Services (AWS) Lambda को एक कंप्यूट सेवा के रूप में वर्णित किया गया है जो कोड को निष्पादित करने की अनुमति देती है बिना सर्वर प्रावधान या प्रबंधन की आवश्यकता के। इसकी विशेषता यह है कि यह कोड निष्पादन के लिए आवश्यक संसाधनों का स्वचालित रूप से प्रबंधन करती है, जिससे उच्च उपलब्धता, स्केलेबिलिटी और सुरक्षा जैसी सुविधाएँ सुनिश्चित होती हैं। Lambda का एक महत्वपूर्ण पहलू इसका मूल्य निर्धारण मॉडल है, जहाँ शुल्क केवल उपयोग किए गए कंप्यूट समय पर आधारित होते हैं, प्रारंभिक निवेश या दीर्घकालिक प्रतिबद्धताओं की आवश्यकता को समाप्त करते हैं।

एक लैम्ब्डा को कॉल करने के लिए इसे जितनी बार चाहें (Cloudwatch के साथ) कॉल करना संभव है, एक URL एंडपॉइंट को एक्सपोज करना और इसे कॉल करना, API Gateway के माध्यम से कॉल करना या यहां तक कि S3 बकेट में डेटा में परिवर्तनों या DynamoDB तालिका में अपडेट के आधार पर कॉल करना।

एक लैम्ब्डा का कोड /var/task में संग्रहीत होता है।

Lambda Aliases Weights

एक Lambda के पास कई संस्करण हो सकते हैं। और इसके पास एक से अधिक संस्करण हो सकते हैं जो उपनामों के माध्यम से एक्सपोज़ किए जाते हैं। उपनाम के अंदर एक्सपोज़ किए गए प्रत्येक संस्करण का वजन यह तय करेगा कि कौन सा उपनाम कॉल प्राप्त करता है (यह 90%-10% हो सकता है, उदाहरण के लिए)। यदि एक उपनाम का कोड कमजोर है, तो आप अनुरोध भेज सकते हैं जब तक कमजोर संस्करण को एक्सप्लॉइट प्राप्त नहीं होता।

Resource Policies

Lambda संसाधन नीतियाँ अन्य सेवाओं/खातों को लैम्ब्डा को कॉल करने के लिए एक्सेस देने की अनुमति देती हैं। उदाहरण के लिए, यह नीति किसी को URL के माध्यम से एक्सपोज़ किए गए लैम्ब्डा तक पहुँचने की अनुमति देती है:

या इसे API Gateway को इसे कॉल करने की अनुमति देने के लिए:

Lambda Database Proxies

जब सैकड़ों समानांतर लैम्ब्डा अनुरोध होते हैं, यदि प्रत्येक को डेटाबेस से कनेक्ट और कनेक्शन बंद करने की आवश्यकता होती है, तो यह काम नहीं करेगा (लैम्ब्डा स्टेटलेस होते हैं, कनेक्शन को खुला नहीं रख सकते)। फिर, यदि आपके Lambda कार्य RDS Proxy के साथ इंटरैक्ट करते हैं तो आपके डेटाबेस इंस्टेंस के बजाय। यह समानांतर Lambda कार्यों द्वारा बनाए गए कई समवर्ती कनेक्शनों के लिए आवश्यक कनेक्शन पूलिंग को संभालता है। यह आपके Lambda अनुप्रयोगों को मौजूदा कनेक्शनों का पुन: उपयोग करने की अनुमति देता है, बजाय इसके कि हर कार्य कॉल के लिए नए कनेक्शन बनाए।

Lambda EFS Filesystems

डेटा को संरक्षित करने और यहां तक कि साझा करने के लिए Lambdas EFS तक पहुँच सकते हैं और उन्हें माउंट कर सकते हैं, ताकि Lambda इसे पढ़ और लिख सके।

Lambda Layers

एक Lambda लेयर एक .zip फ़ाइल संग्रह है जो अतिरिक्त कोड या अन्य सामग्री को शामिल कर सकता है। एक लेयर में पुस्तकालय, एक कस्टम रनटाइम, डेटा, या कॉन्फ़िगरेशन फ़ाइलें हो सकती हैं।

प्रत्येक फ़ंक्शन में पाँच लेयर तक शामिल करना संभव है। जब आप किसी फ़ंक्शन में एक लेयर शामिल करते हैं, तो सामग्री को /opt निर्देशिका में निष्पादन वातावरण में निकाला जाता है।

डिफ़ॉल्ट रूप से, आप जो लेयर बनाते हैं वे आपके AWS खाते के लिए निजी होती हैं। आप एक लेयर को अन्य खातों के साथ साझा करने या लेयर को सार्वजनिक बनाने का विकल्प चुन सकते हैं। यदि आपके फ़ंक्शन एक लेयर का उपभोग करते हैं जिसे एक अलग खाते ने प्रकाशित किया है, तो आपके फ़ंक्शन लेयर संस्करण का उपयोग जारी रख सकते हैं जब इसे हटा दिया गया हो, या जब आपकी लेयर तक पहुँचने की अनुमति रद्द कर दी गई हो। हालाँकि, आप एक नई फ़ंक्शन नहीं बना सकते या हटाए गए लेयर संस्करण का उपयोग करते हुए फ़ंक्शंस को अपडेट नहीं कर सकते।

कंटेनर छवि के रूप में तैनात फ़ंक्शन लेयर का उपयोग नहीं करते हैं। इसके बजाय, आप छवि बनाने के समय अपने पसंदीदा रनटाइम, पुस्तकालयों और अन्य निर्भरताओं को कंटेनर छवि में पैकेज करते हैं।

Lambda Extensions

Lambda एक्सटेंशन फ़ंक्शंस को विभिन्न निगरानी, अवलोकन, सुरक्षा, और शासन उपकरणों के साथ एकीकृत करके बढ़ाते हैं। ये एक्सटेंशन, .zip संग्रह का उपयोग करके Lambda लेयर्स के माध्यम से जोड़े जाते हैं या कंटेनर छवि तैनाती में शामिल होते हैं, दो मोड में कार्य करते हैं: आंतरिक और बाहरी

  • आंतरिक एक्सटेंशन रनटाइम प्रक्रिया के साथ विलीन होते हैं, इसके स्टार्टअप को भाषा-विशिष्ट पर्यावरण चर और रैपर स्क्रिप्ट का उपयोग करके संशोधित करते हैं। यह अनुकूलन विभिन्न रनटाइम्स पर लागू होता है, जिसमें Java Correto 8 और 11, Node.js 10 और 12, और .NET Core 3.1 शामिल हैं।

  • बाहरी एक्सटेंशन अलग प्रक्रियाओं के रूप में चलते हैं, Lambda फ़ंक्शन के जीवन चक्र के साथ संचालन संरेखण बनाए रखते हैं। वे विभिन्न रनटाइम्स के साथ संगत होते हैं जैसे Node.js 10 और 12, Python 3.7 और 3.8, Ruby 2.5 और 2.7, Java Corretto 8 और 11, .NET Core 3.1, और कस्टम रनटाइम

Enumeration

aws lambda get-account-settings

# List functions and get extra config info
aws lambda list-functions
aws lambda get-function --function-name <function_name>
aws lambda get-function-configuration --function-name <function_name>
aws lambda list-function-event-invoke-configs --function-name <function_name>
## Check for creds in env vars
aws lambda list-functions | jq '.Functions[].Environment'
## Download & check the source code
aws lambda get-function --function-name "<func_name>" --query 'Code.Location'
wget -O lambda-function.zip <url-from-previous-query>

# Get Lambda URL (if any)
aws lambda list-function-url-configs --function-name <function_name>
aws lambda get-function-url-config --function-name <function_name>

# Get who has permissions to invoke the Lambda
aws lambda get-policy --function-name <function_name>

# Versions and Aliases
aws lambda list-versions-by-function --function-name <func_name>
aws lambda list-aliases --function-name <func_name>

# List layers
aws lambda list-layers
aws lambda list-layer-versions --layer-name <name>
aws lambda get-layer-version --layer-name <name> --version-number <ver>
aws lambda get-layer-version-by-arn --arn <name> #Get external ARNs

# List other metadata
aws lambda list-event-source-mappings
aws lambda list-code-signing-configs
aws lambda list-functions-by-code-signing-config --code-signing-config-arn <arn>

एक लैम्ब्डा को सक्रिय करें

मैनुअल

# Invoke function
aws lambda invoke --function-name FUNCTION_NAME /tmp/out
## Some functions will expect parameters, they will access them with something like:
## target_policys = event['policy_names']
## user_name = event['user_name']
aws lambda invoke --function-name <name> --cli-binary-format raw-in-base64-out --payload '{"policy_names": ["AdministratorAccess], "user_name": "sdf"}' out.txt

उजागर URL के माध्यम से

aws lambda list-function-url-configs --function-name <function_name> #Get lambda URL
aws lambda get-function-url-config   --function-name <function_name> #Get lambda URL

Call Lambda function via URL

अब संभावित लैम्ब्डा फ़ंक्शंस को निष्पादित करने का समय है:

aws --region us-west-2 --profile level6 lambda list-functions

एक लैम्ब्डा फ़ंक्शन "Level6" उपलब्ध है। चलो पता करते हैं कि इसे कैसे कॉल किया जाए:

aws --region us-west-2 --profile level6 lambda get-policy --function-name Level6

अब, जब आप नाम और आईडी जानते हैं, तो आप नाम प्राप्त कर सकते हैं:

aws --profile level6 --region us-west-2 apigateway get-stages --rest-api-id "s33ppypa75"

और अंत में फ़ंक्शन को कॉल करें (ध्यान दें कि ID, Name और function-name URL में दिखाई देते हैं): https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6

URL:https://<rest-api-id>.execute-api.<region>.amazonaws.com/<stageName>/<funcName>

अन्य ट्रिगर्स

लैम्ब्डा को ट्रिगर करने के लिए कई अन्य स्रोत हैं

प्रिवेस्क

अगली पृष्ठ में आप देख सकते हैं कि कैसे लैम्ब्डा अनुमतियों का दुरुपयोग करके विशेषाधिकार बढ़ाएं:

AWS - Lambda Privesc

अनधिकृत पहुंच

AWS - Lambda Unauthenticated Access

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

AWS - Lambda Post Exploitation

स्थिरता

AWS - Lambda Persistence

संदर्भ

HackTricks का समर्थन करें

Last updated