AWS - Lambda Layers Persistence
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)
Bir Lambda katmanı, ekstra kod veya diğer içerikleri içerebilen bir .zip dosyası arşividir. Bir katman, kütüphaneler, bir özel çalışma zamanı, veri veya yapılandırma dosyaları içerebilir.
Her işlev için beş katmana kadar dahil etmek mümkündür. Bir katmanı bir işlevde dahil ettiğinizde, içerikler yürütme ortamındaki /opt
dizinine çıkarılır.
Varsayılan olarak, oluşturduğunuz katmanlar AWS hesabınıza özeldir. Bir katmanı diğer hesaplarla paylaşmayı veya katmanı genel hale getirmeyi seçebilirsiniz. İşlevleriniz, farklı bir hesap tarafından yayımlanan bir katmanı tüketiyorsa, işlevleriniz katman silindikten sonra veya katmana erişim izniniz geri alındıktan sonra katman sürümünü kullanmaya devam edebilir. Ancak, silinmiş bir katman sürümünü kullanarak yeni bir işlev oluşturamaz veya işlevleri güncelleyemezsiniz.
Bir konteyner görüntüsü olarak dağıtılan işlevler katmanları kullanmaz. Bunun yerine, görüntüyü oluşturduğunuzda tercih ettiğiniz çalışma zamanı, kütüphaneler ve diğer bağımlılıkları konteyner görüntüsüne paketlersiniz.
Python'un lambda'da kullanacağı yükleme yolu şudur:
Kontrol edin nasıl ikinci ve üçüncü pozisyonlar lambda katmanlarının dosyalarını açtığı dizinler tarafından işgal ediliyor: /opt/python/lib/python3.9/site-packages
ve /opt/python
Eğer bir saldırgan kullanılan bir lambda katmanına arka kapı koymayı veya bir tane eklemeyi başarırsa ve bu, yaygın bir kütüphane yüklendiğinde rastgele kod çalıştırıyorsa, her lambda çağrısında kötü niyetli kod çalıştırabilecektir.
Bu nedenle, gereksinimler şunlardır:
Kurbanların kodu tarafından yüklenen kütüphaneleri kontrol et
Özel kodu çalıştıracak ve orijinal kütüphaneyi yükleyecek bir lambda katmanı ile proxy kütüphanesi oluştur.
Bu tekniği kötüye kullanırken bir zorlukla karşılaştım: Bazı kütüphaneler kodunuz çalıştırıldığında python çalışma zamanında zaten yüklenmiş durumda. os
veya sys
gibi şeyler bulmayı bekliyordum, ama hatta json
kütüphanesi bile yüklüydü.
Bu kalıcılık tekniğini kötüye kullanmak için, kodun çalıştırıldığı anda yüklenmemiş yeni bir kütüphaneyi yüklemesi gerekiyor.
Bu python kodu ile lambda içinde python çalışma zamanında önceden yüklenmiş kütüphanelerin listesini elde etmek mümkündür:
Ve bu liste (kütüphanelerin os
veya json
gibi zaten orada olduğundan emin olun)
Ve bu, lambda'nın varsayılan olarak yüklediği kütüphaneler listesidir: https://gist.github.com/gene1wood/4a052f39490fae00e0c3
Bu örnekte, hedef kodun csv
'yi içe aktardığını varsayalım. csv
kütüphanesinin içe aktarımına arka kapı koyacağız.
Bunu yapmak için, /opt/python/lib/python3.9/site-packages
yolunda csv adlı dizini ve içinde __init__.py
dosyasını oluşturacağız.
Daha sonra, lambda çalıştırıldığında ve csv'yi yüklemeye çalıştığında, __init__.py
dosyamız yüklenecek ve çalıştırılacaktır.
Bu dosya şunları yapmalıdır:
Yükleme yükümüzü çalıştırmak
Orijinal csv kütüphanesini yüklemek
Her ikisini de şu şekilde yapabiliriz:
Sonra, bu kodu python/lib/python3.9/site-packages/__init__.py
yolunda bir zip dosyası oluşturun ve bunu bir lambda katmanı olarak ekleyin.
Bu kodu https://github.com/carlospolop/LambdaLayerBackdoor adresinde bulabilirsiniz.
Entegre yük, ilk kez çağrıldığında veya lambda konteynerinin sıfırlanmasından sonra IAM kimlik bilgilerini bir sunucuya gönderecektir (kod değişikliği veya soğuk lambda), ancak aşağıdaki gibi diğer teknikler de entegre edilebilir:
AWS - Steal Lambda RequestsHarici hesaplardan lambda katmanları kullanmanın mümkün olduğunu unutmayın. Ayrıca, bir lambda, izinleri olmasa bile harici bir hesaptan bir katmanı kullanabilir. Ayrıca, bir lambda'nın sahip olabileceği maksimum katman sayısının 5 olduğunu unutmayın.
Bu nedenle, bu tekniğin çok yönlülüğünü artırmak için bir saldırgan şunları yapabilir:
Kullanıcının mevcut bir katmanını arka kapı ile ele geçirmek (hiçbir şey harici değil)
Kendi hesabında bir katman oluşturmak, kurban hesabına katmanı kullanma erişimi vermek, katmanı kurbanın Lambda'sında yapılandırmak ve izinleri kaldırmak.
Lambda, katmanı kullanmaya devam edebilecek ve kurban, katman kodunu indirmek için kolay bir yol bulamayacaktır (lambda içinde bir rev shell elde etmek dışında)
Kurban, aws lambda list-layers
ile kullanılan harici katmanları görmeyecek.
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)