AWS - Lambda Privesc
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
lambda के बारे में अधिक जानकारी:
AWS - Lambda Enumiam:PassRole
, lambda:CreateFunction
, (lambda:InvokeFunction
| lambda:InvokeFunctionUrl
)iam:PassRole
, lambda:CreateFunction
, और lambda:InvokeFunction
अनुमतियों वाले उपयोगकर्ता अपनी विशेषाधिकारों को बढ़ा सकते हैं।
वे एक नया Lambda फ़ंक्शन बना सकते हैं और उसे एक मौजूदा IAM भूमिका सौंप सकते हैं, जिससे फ़ंक्शन को उस भूमिका से संबंधित अनुमतियाँ मिलती हैं। उपयोगकर्ता फिर इस Lambda फ़ंक्शन में कोड लिख और अपलोड कर सकता है (उदाहरण के लिए एक rev shell)।
एक बार फ़ंक्शन सेटअप हो जाने के बाद, उपयोगकर्ता इसके निष्पादन को ट्रिगर कर सकता है और AWS API के माध्यम से Lambda फ़ंक्शन को कॉल करके इच्छित क्रियाएँ कर सकता है। यह दृष्टिकोण प्रभावी रूप से उपयोगकर्ता को Lambda फ़ंक्शन के माध्यम से अप्रत्यक्ष रूप से कार्य करने की अनुमति देता है, जो कि इससे संबंधित IAM भूमिका द्वारा दी गई पहुँच के स्तर के साथ कार्य करता है।\
एक हमलावर इसका दुरुपयोग करके rev shell प्राप्त कर सकता है और टोकन चुरा सकता है:
आप लैम्ब्डा भूमिका अनुमतियों का दुरुपयोग भी कर सकते हैं जो लैम्ब्डा फ़ंक्शन से ही हैं। यदि लैम्ब्डा भूमिका में पर्याप्त अनुमतियाँ थीं, तो आप इसका उपयोग करके अपने लिए प्रशासनिक अधिकार प्रदान कर सकते हैं:
यह भी संभव है कि बिना किसी बाहरी कनेक्शन की आवश्यकता के लम्ब्डा की भूमिका क्रेडेंशियल्स लीक करें। यह Network isolated Lambdas के लिए उपयोगी होगा जो आंतरिक कार्यों पर उपयोग किए जाते हैं। यदि आपके रिवर्स शेल को फ़िल्टर करने वाले अज्ञात सुरक्षा समूह हैं, तो यह कोड का टुकड़ा आपको लम्ब्डा के आउटपुट के रूप में सीधे क्रेडेंशियल्स लीक करने की अनुमति देगा।
संभावित प्रभाव: निर्दिष्ट मनमाने लैम्ब्डा सेवा भूमिका के लिए सीधे प्रिवेस्क।
ध्यान दें कि भले ही यह दिलचस्प लग सकता है lambda:InvokeAsync
अपने आप aws lambda invoke-async
को निष्पादित करने की अनुमति नहीं देता, आपको lambda:InvokeFunction
भी चाहिए।
iam:PassRole
, lambda:CreateFunction
, lambda:AddPermission
पिछले परिदृश्य की तरह, आप lambda:AddPermission
अनुमति होने पर अपने लिए lambda:InvokeFunction
अनुमति प्रदान कर सकते हैं।
संभावित प्रभाव: निर्दिष्ट मनमाने लैम्ब्डा सेवा भूमिका के लिए सीधे विशेषाधिकार वृद्धि।
iam:PassRole
, lambda:CreateFunction
, lambda:CreateEventSourceMapping
iam:PassRole
, lambda:CreateFunction
, और lambda:CreateEventSourceMapping
अनुमतियों वाले उपयोगकर्ता (और संभावित रूप से dynamodb:PutItem
और dynamodb:CreateTable
) अप्रत्यक्ष रूप से विशेषाधिकार बढ़ा सकते हैं भले ही उनके पास lambda:InvokeFunction
न हो।
वे एक दुष्ट कोड के साथ लैम्ब्डा फ़ंक्शन बना सकते हैं और इसे एक मौजूदा IAM भूमिका सौंप सकते हैं।
लैम्ब्डा को सीधे सक्रिय करने के बजाय, उपयोगकर्ता एक मौजूदा DynamoDB तालिका सेट करता है या उसका उपयोग करता है, इसे लैम्ब्डा के साथ एक इवेंट स्रोत मैपिंग के माध्यम से जोड़ता है। यह सेटअप सुनिश्चित करता है कि तालिका में एक नए आइटम के प्रवेश पर लैम्ब्डा फ़ंक्शन स्वतः सक्रिय हो जाता है, चाहे वह उपयोगकर्ता की क्रिया द्वारा हो या किसी अन्य प्रक्रिया द्वारा, इस प्रकार अप्रत्यक्ष रूप से लैम्ब्डा फ़ंक्शन को सक्रिय करना और पास की गई IAM भूमिका के अनुमतियों के साथ कोड को निष्पादित करना।
यदि DynamoDB पहले से AWS वातावरण में सक्रिय है, तो उपयोगकर्ता केवल Lambda फ़ंक्शन के लिए इवेंट स्रोत मैपिंग स्थापित करने की आवश्यकता है। हालाँकि, यदि DynamoDB का उपयोग नहीं किया जा रहा है, तो उपयोगकर्ता को स्ट्रीमिंग सक्षम के साथ एक नई तालिका बनानी होगी:
अब यह संभव है Lambda फ़ंक्शन को DynamoDB तालिका से कनेक्ट करना एक इवेंट स्रोत मैपिंग बनाकर:
Lambda फ़ंक्शन को DynamoDB स्ट्रीम से लिंक करके, हमलावर DynamoDB स्ट्रीम को सक्रिय करके Lambda को अप्रत्यक्ष रूप से ट्रिगर कर सकता है। यह DynamoDB तालिका में एक आइटम डालकर किया जा सकता है:
संभावित प्रभाव: निर्दिष्ट लैम्ब्डा सेवा भूमिका के लिए सीधे प्रिवेस्क।
lambda:AddPermission
इस अनुमति के साथ एक हमलावर अपने लिए (या दूसरों के लिए) कोई भी अनुमति प्रदान कर सकता है (यह संसाधन आधारित नीतियों को उत्पन्न करता है ताकि संसाधन तक पहुंच प्रदान की जा सके):
संभावित प्रभाव: कोड को संशोधित करने और इसे चलाने की अनुमति देकर लैम्ब्डा सेवा भूमिका के लिए सीधे प्रिवेस्क।
lambda:AddLayerVersionPermission
इस अनुमति के साथ एक हमलावर अपने लिए (या दूसरों के लिए) अनुमति lambda:GetLayerVersion
प्रदान कर सकता है। वह लेयर तक पहुँच सकता है और कमजोरियों या संवेदनशील जानकारी की खोज कर सकता है।
संभावित प्रभाव: संवेदनशील जानकारी तक संभावित पहुंच।
lambda:UpdateFunctionCode
lambda:UpdateFunctionCode
अनुमति रखने वाले उपयोगकर्ताओं के पास IAM भूमिका से जुड़े एक मौजूदा Lambda फ़ंक्शन के कोड को संशोधित करने की क्षमता है।
हमलावर IAM क्रेडेंशियल्स को निकालने के लिए Lambda के कोड को संशोधित कर सकता है।
हालांकि हमलावर के पास फ़ंक्शन को सीधे सक्रिय करने की क्षमता नहीं हो सकती है, यदि Lambda फ़ंक्शन पहले से मौजूद और कार्यात्मक है, तो यह संभावना है कि इसे मौजूदा वर्कफ़्लो या घटनाओं के माध्यम से सक्रिय किया जाएगा, इस प्रकार संशोधित कोड के निष्पादन को अप्रत्यक्ष रूप से सुविधाजनक बनाता है।
संभावित प्रभाव: उपयोग की जाने वाली लैम्ब्डा सेवा भूमिका के लिए सीधे प्रिवेस्क।
lambda:UpdateFunctionConfiguration
इन अनुमतियों के साथ, ऐसे पर्यावरण वेरिएबल्स जोड़ना संभव है जो लैम्ब्डा को मनमाने कोड को निष्पादित करने का कारण बनेंगे। उदाहरण के लिए, पायथन में, पर्यावरण वेरिएबल्स PYTHONWARNING
और BROWSER
का दुरुपयोग करके एक पायथन प्रक्रिया को मनमाने आदेश निष्पादित करने के लिए मजबूर किया जा सकता है:
अन्य स्क्रिप्टिंग भाषाओं के लिए अन्य env वेरिएबल्स हैं जिनका आप उपयोग कर सकते हैं। अधिक जानकारी के लिए देखें:
Lambda Layers आपको अपने लैम्ब्डा फ़ंक्शन में कोड शामिल करने की अनुमति देता है लेकिन इसे अलग से स्टोर करता है, ताकि फ़ंक्शन कोड छोटा रह सके और कई फ़ंक्शन कोड साझा कर सकें।
लैम्ब्डा के अंदर आप एक फ़ंक्शन के साथ उन पथों की जांच कर सकते हैं जहाँ से पायथन कोड लोड किया जा रहा है:
ये स्थान हैं:
/var/task
/opt/python/lib/python3.7/site-packages
/opt/python
/var/runtime
/var/lang/lib/python37.zip
/var/lang/lib/python3.7
/var/lang/lib/python3.7/lib-dynload
/var/lang/lib/python3.7/site-packages
/opt/python/lib/python3.7/site-packages
/opt/python
उदाहरण के लिए, पुस्तकालय boto3 को /var/runtime/boto3
(4थी स्थिति) से लोड किया जाता है।
lambda:UpdateFunctionConfiguration
अनुमति का दुरुपयोग करके एक नया लेयर जोड़ना संभव है। मनमाने कोड को निष्पादित करने के लिए इस लेयर में कुछ पुस्तकालय होना चाहिए जिसे लैम्ब्डा आयात करने जा रहा है। यदि आप लैम्ब्डा का कोड पढ़ सकते हैं, तो आप इसे आसानी से ढूंढ सकते हैं, यह भी ध्यान दें कि यह संभव है कि लैम्ब्डा पहले से ही एक लेयर का उपयोग कर रहा है और आप लेयर डाउनलोड कर सकते हैं और वहाँ अपना कोड जोड़ सकते हैं।
उदाहरण के लिए, मान लीजिए कि लैम्ब्डा पुस्तकालय boto3 का उपयोग कर रहा है, यह पुस्तकालय के अंतिम संस्करण के साथ एक स्थानीय लेयर बनाएगा:
आप ./lambda_layer/boto3/__init__.py
खोल सकते हैं और वैश्विक कोड में बैकडोर जोड़ सकते हैं (उदाहरण के लिए, क्रेडेंशियल्स को एक्सफिल्ट्रेट करने के लिए या एक रिवर्स शेल प्राप्त करने के लिए)।
फिर, उस ./lambda_layer
निर्देशिका को ज़िप करें और नई लैम्ब्डा लेयर अपने खाते में (या पीड़ित के खाते में, लेकिन आपके पास इसके लिए अनुमतियाँ नहीं हो सकती हैं) अपलोड करें।
ध्यान दें कि आपको एक पायथन फ़ोल्डर बनाना होगा और वहां पुस्तकालयों को रखना होगा ताकि /opt/python/boto3 को ओवरराइड किया जा सके। इसके अलावा, लेयर को लैम्ब्डा द्वारा उपयोग की जाने वाली पायथन संस्करण के साथ संगत होना चाहिए और यदि आप इसे अपने खाते में अपलोड करते हैं, तो यह समान क्षेत्र में होना चाहिए:
अब, अपलोड की गई लैम्ब्डा लेयर को किसी भी खाते द्वारा सुलभ बनाएं:
और पीड़ित लैम्ब्डा फ़ंक्शन से लैम्ब्डा लेयर को संलग्न करें:
The next step would be to either invoke the function ourselves if we can or to wait until यह invoke होता है by normal means–which is the safer method.
A more stealth way to exploit this vulnerability can be found in:
AWS - Lambda Layers PersistencePotential Impact: Direct privesc to the lambda service role used.
iam:PassRole
, lambda:CreateFunction
, lambda:CreateFunctionUrlConfig
, lambda:InvokeFunctionUrl
Maybe with those permissions you are able to create a function and execute it calling the URL... but I could find a way to test it, so let me know if you do!
Some lambdas are going to be उपयोगकर्ताओं से संवेदनशील जानकारी प्राप्त कर रहे हैं। If get RCE in one of them, you can exfiltrate the info other users are sending to it, check it in:
AWS - Steal Lambda RequestsLearn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)