AWS - Lambda Enum
Last updated
Last updated
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Amazon Web Services (AWS) Lambda, sunucu sağlama veya yönetim gerektirmeden kodun çalıştırılmasını sağlayan bir hesaplama hizmeti olarak tanımlanır. Kod çalıştırma için gerekli kaynak tahsisini otomatik olarak yönetme yeteneği ile karakterizedir ve yüksek kullanılabilirlik, ölçeklenebilirlik ve güvenlik gibi özellikler sağlar. Lambda'nın önemli bir yönü, ücretlerin yalnızca kullanılan hesaplama süresine dayalı olmasıdır, bu da başlangıç yatırımları veya uzun vadeli yükümlülükler gerektirmez.
Bir lambda çağırmak için, istediğiniz kadar sık (Cloudwatch ile) çağırmak, bir URL uç noktası açmak ve çağırmak, API Gateway üzerinden çağırmak veya S3 kovasındaki verilere veya DynamoDB tablosundaki güncellemelere gibi olaylara dayalı olarak çağırmak mümkündür.
Bir lambdanın kodu /var/task
dizininde saklanır.
Bir Lambda'nın birden fazla versiyonu olabilir. Ve alias aracılığıyla 1'den fazla versiyon açığa çıkarılabilir. Alias içinde açığa çıkarılan her bir versiyonun ağırlıkları, hangi alias'ın çağrıyı alacağını belirleyecektir (örneğin 90%-10% olabilir). Eğer bir alias'ın kodu açık ise, açık versiyonun istismarı alana kadar istekler gönderebilirsiniz.
Lambda kaynak politikaları, örneğin, diğer hizmetlerin/hesapların lambdayı çağırmasına erişim vermek için kullanılır. Örneğin, URL aracılığıyla açığa çıkarılan bir lambdaya herkesin erişmesine izin veren politika:
Ya da bir API Gateway'in bunu çağırmasına izin veren bu:
Yüzlerce eşzamanlı lambda isteği olduğunda, eğer her biri bir veritabanına bağlanmak ve bağlantıyı kapatmak zorundaysa, bu çalışmayacaktır (lambdalar durumsuzdur, açık bağlantıları sürdüremezler). O zaman, eğer Lambda fonksiyonlarınız RDS Proxy ile etkileşime giriyorsa, veritabanı örneğiniz yerine. Bu, eşzamanlı Lambda fonksiyonları tarafından oluşturulan birçok eşzamanlı bağlantının ölçeklenmesi için gerekli bağlantı havuzlamasını yönetir. Bu, Lambda uygulamalarınızın mevcut bağlantıları yeniden kullanmasına olanak tanır, her fonksiyon çağrısı için yeni bağlantılar oluşturmak yerine.
Verileri korumak ve hatta paylaşmak için Lambdalar EFS'ye erişebilir ve bunları bağlayabilir, böylece Lambda ondan okuma ve yazma yapabilir.
Bir Lambda katmanı, ekstra kod veya diğer içerikleri içerebilen bir .zip dosyası arşividir. Bir katman, kütüphaneler, özel çalışma zamanı, veri veya yapılandırma dosyaları içerebilir.
Her fonksiyon için en fazla beş katman dahil etmek mümkündür. Bir fonksiyona bir katman dahil ettiğinizde, içerikler /opt
dizinine çıkarılır.
Varsayılan olarak, oluşturduğunuz katmanlar AWS hesabınıza özel'dir. Bir katmanı diğer hesaplarla paylaşmayı veya katmanı genel hale getirmeyi seçebilirsiniz. Fonksiyonlarınız, farklı bir hesap tarafından yayımlanan bir katmanı tüketirse, fonksiyonlarınız 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 fonksiyon oluşturamaz veya fonksiyonları güncelleyemezsiniz.
Bir konteyner görüntüsü olarak dağıtılan fonksiyonlar 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.
Lambda uzantıları, çeşitli izleme, gözlemlenebilirlik, güvenlik ve yönetişim araçlarıyla entegre olarak fonksiyonları geliştirir. Bu uzantılar, .zip arşivleri kullanarak Lambda katmanları aracılığıyla veya konteyner görüntüsü dağıtımlarında dahil edilir ve iki modda çalışır: içsel ve dışsal.
İçsel uzantılar, çalışma zamanı süreciyle birleştirilir, dil spesifik ortam değişkenleri ve sarmalayıcı betikler kullanarak başlangıcını manipüle eder. Bu özelleştirme, Java Correto 8 ve 11, Node.js 10 ve 12, ve .NET Core 3.1 dahil olmak üzere çeşitli çalışma zamanlarına uygulanır.
Dışsal uzantılar, ayrı süreçler olarak çalışır ve Lambda fonksiyonunun yaşam döngüsüyle operasyon uyumunu sürdürür. Node.js 10 ve 12, Python 3.7 ve 3.8, Ruby 2.5 ve 2.7, Java Corretto 8 ve 11, .NET Core 3.1 ve özel çalışma zamanları gibi çeşitli çalışma zamanlarıyla uyumludur.
Artık çalıştırılabilecek olası lambda fonksiyonlarını bulma zamanı:
"Level6" adında bir lambda fonksiyonu mevcut. Onu nasıl çağıracağımızı bulalım:
Artık ismi ve kimliği bildiğinize göre, ismi alabilirsiniz:
Ve sonunda işlevi çağırın (ID, Ad ve işlev adı URL'de göründüğüne dikkat edin): https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6
URL:
https://<rest-api-id>.execute-api.<region>.amazonaws.com/<stageName>/<funcName>
Bir lambda'yı tetikleyebilecek birçok başka kaynak vardır.
Aşağıdaki sayfada Lambda izinlerini kötüye kullanarak ayrıcalıkları artırma yöntemini kontrol edebilirsiniz:
AWS - Lambda PrivescAWS Hacking öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE) GCP Hacking öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)