AWS - Lambda Enum

Reading time: 9 minutes

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

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

Lambda

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

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

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

Lambda Aliases Weights

एक Lambda के पास कई संस्करण हो सकते हैं।
और इसके पास एक से अधिक संस्करण हो सकते हैं जो aliases के माध्यम से एक्सपोज़ किए जाते हैं। हर संस्करण के वजन जो एक एलियास के अंदर एक्सपोज़ किए जाते हैं, यह तय करेंगे कि कौन सा एलियास कॉल प्राप्त करता है (यह 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

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

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

मैनुअल

bash
# 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 के माध्यम से

bash
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

URL के माध्यम से Lambda फ़ंक्शन कॉल करें

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

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

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

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

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

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

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

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

प्रिवेस्क

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

AWS - Lambda Privesc

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

AWS - Lambda Unauthenticated Access

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

AWS - Lambda Post Exploitation

स्थिरता

AWS - Lambda Persistence

संदर्भ

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

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