AWS - Lambda Privesc
lambda
Lambda hakkında daha fazla bilgi için:
iam:PassRole
, lambda:CreateFunction
, (lambda:InvokeFunction
| lambda:InvokeFunctionUrl
)
iam:PassRole
, lambda:CreateFunction
, (lambda:InvokeFunction
| lambda:InvokeFunctionUrl
)iam:PassRole
, lambda:CreateFunction
ve lambda:InvokeFunction
izinlerine sahip kullanıcılar ayrıcalıklarını yükseltebilir.
Varolan bir IAM rolünü yeni bir Lambda işlevine atayarak işlevi o rolle ilişkilendirilen izinlere sahip kılabilirler. Kullanıcı daha sonra bu Lambda işlevine kod yazabilir ve yükleyebilir (örneğin bir ters shell).
İşlev kurulduktan sonra, kullanıcı AWS API aracılığıyla Lambda işlevini çağırarak işlevin yürütülmesini tetikleyebilir ve istenilen eylemleri gerçekleştirebilir. Bu yaklaşım, kullanıcının IAM rolüyle ilişkilendirilen erişim düzeyi ile işlem yapmasına izin vererek kullanıcının Lambda işlevi aracılığıyla dolaylı olarak görevleri gerçekleştirmesine olanak tanır.\
Bir saldırgan bunu kullanarak bir ters shell alabilir ve belirteci çalabilir:
Lambda rol izinlerini lambda işlevinden de kötüye kullanabilirsiniz. Eğer lambda rol yeterli izinlere sahipse, bunu kullanarak size yönetici hakları verebilirsiniz:
Ayrıca, dış bir bağlantıya ihtiyaç duymadan lambda'nın rol kimlik bilgilerini sızdırmak da mümkündür. Bu, iç görevlerde kullanılan Ağdan izole edilmiş Lambdalar için faydalı olacaktır. Eğer ters kabuklarınızı filtreleyen bilinmeyen güvenlik grupları varsa, bu kod parçası size lambda'nın çıktısı olarak kimlik bilgilerini doğrudan sızdırmanıza olanak tanıyacaktır.
Potansiyel Etki: Belirtilen keyfi lambda hizmet rolüne doğrudan ayrıcalık yükseltme.
Dikkat edin ki, lambda:InvokeAsync
'in tek başına aws lambda invoke-async
'i çalıştırmanıza izin vermez, ayrıca lambda:InvokeFunction
'a da ihtiyacınız vardır.
iam:PassRole
, lambda:CreateFunction
, lambda:AddPermission
iam:PassRole
, lambda:CreateFunction
, lambda:AddPermission
Önceki senaryoda olduğu gibi, lambda:AddPermission
izniniz varsa, kendinize lambda:InvokeFunction
iznini verebilirsiniz.
Potansiyel Etki: Belirtilen keyfi lambda hizmet rolüne doğrudan ayrıcalık yükseltme.
iam:PassRole
, lambda:CreateFunction
, lambda:CreateEventSourceMapping
iam:PassRole
, lambda:CreateFunction
, lambda:CreateEventSourceMapping
iam:PassRole
, lambda:CreateFunction
ve lambda:CreateEventSourceMapping
izinlerine sahip kullanıcılar (ve potansiyel olarak dynamodb:PutItem
ve dynamodb:CreateTable
) lambda:InvokeFunction
olmadan bile dolaylı olarak ayrıcalıkları yükseltebilirler.
Kötü niyetli kod içeren bir Lambda işlevi oluşturabilir ve var olan bir IAM rolünü atayabilirler.
Lambda'yı doğrudan çağırmak yerine, kullanıcı bir DynamoDB tablosu kurar veya var olan bir tabloyu kullanır ve bu tabloyu Lambda'ya bir olay kaynağı eşlemesi aracılığıyla bağlar. Bu kurulum, Lambda işlevinin tabloya yeni bir öğe girişi yapıldığında otomatik olarak tetiklendiğinden, kullanıcının eylemi veya başka bir işlem tarafından Lambda işlevinin dolaylı olarak çağrılmasını ve geçilen IAM rolünün izinleriyle kodun yürütülmesini sağlar.
Eğer DynamoDB zaten AWS ortamında etkinse, kullanıcı yalnızca Lambda işlevi için olay kaynağı eşlemesini kurmalıdır. Ancak, DynamoDB kullanılmıyorsa, kullanıcı yeni bir tablo oluşturmalıdır ve akış etkinleştirilmelidir:
Şimdi Lambda işlevini DynamoDB tablosuna bağlamak mümkün, bunun için bir olay kaynağı eşlemesi oluşturarak:
Lambda fonksiyonu DynamoDB akışına bağlandığında, saldırgan DynamoDB akışını etkinleştirerek Lambda'yı dolaylı olarak tetikleyebilir. Bunun için DynamoDB tablosuna bir öğe ekleyerek gerçekleştirilebilir:
Potansiyel Etki: Belirtilen lambda hizmet rolüne doğrudan ayrıcalık yükseltme.
lambda:AddPermission
lambda:AddPermission
Bu izne sahip bir saldırgan, kendisine (veya başkalarına) herhangi bir izni verir (bu, kaynağa erişim izni vermek için kaynak tabanlı politikalar oluşturur):
Potansiyel Etki: Kullanılan lambda hizmet rolüne doğrudan ayrıcalık yükseltme.
lambda:UpdateFunctionConfiguration
lambda:UpdateFunctionConfiguration
Tanıtım
Lambda Katmanları, kodunuzu lambda işlevinize dahil etmenizi sağlar ancak bunu ayrı bir şekilde depolar, böylece işlev kodu küçük kalabilir ve birkaç işlev kodu paylaşabilir.
Lambda içinde, aşağıdaki gibi bir işlevle yüklenen python kodunun yollarını kontrol edebilirsiniz:
İşte yerler:
/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
Örneğin, boto3 kütüphanesi /var/runtime/boto3
(4. sırada) konumundan yüklenir.
Sömürü
Bir lambda işlevine yeni bir katman eklemek için lambda:UpdateFunctionConfiguration
iznini kötüye kullanmak mümkündür. Rastgele kodu yürütmek için bu katmanın, lambdanın içe aktaracağı bir kütüphaneyi içermesi gerekir. Lambda işlevinin kodunu okuyabiliyorsanız, bunu kolayca bulabilirsiniz, ayrıca lambdanın zaten bir katmanı kullandığı olabilir ve bu katmanı indirip içine kodunuzu ekleyebilirsiniz.
Örneğin, lambdanın boto3 kütüphanesini kullandığını varsayalım, bu, kütüphanenin en son sürümünü içeren yerel bir katman oluşturacaktır:
Dosyayı ./lambda_layer/boto3/__init__.py
açabilir ve global kodda arka kapı ekleyebilirsin (örneğin kimlik bilgilerini dışa aktarmak veya ters kabuk almak için bir işlev).
Ardından, ./lambda_layer
dizinini sıkıştır ve yeni lambda katmanını yükle kendi hesabına (veya kurbanın hesabına, ancak bunun için izinlerin olmayabilir).
Unutma ki /opt/python/boto3'ü geçersiz kılmak için python klasörü oluşturman ve kütüphaneleri içine koymalısın. Ayrıca, katmanın lambda tarafından kullanılan python sürümüyle uyumlu olması ve kendi hesabına yüklüyorsan, aynı bölgede olması gerekir:
Şimdi, yüklenen lambda katmanını herhangi bir hesap tarafından erişilebilir hale getirin:
Ve kurban lambda işlevine lambda katmanını ekleyin:
Sonraki adım, fonksiyonu kendimiz çağırmak olabilir veya normal yollarla çağrılmasını beklemek olabilir - ki bu daha güvenli bir yöntemdir.
Bu zafiyeti sömürmenin daha gizli bir yolu şurada bulunabilir:
Potansiyel Etki: Kullanılan lambda hizmet rolüne doğrudan ayrıcalık yükseltme.
?iam:PassRole
, lambda:CreateFunction
, lambda:CreateFunctionUrlConfig
, lambda:InvokeFunctionUrl
?iam:PassRole
, lambda:CreateFunction
, lambda:CreateFunctionUrlConfig
, lambda:InvokeFunctionUrl
Belki bu izinlerle bir fonksiyon oluşturabilir ve URL'yi çağırarak çalıştırabilirsiniz... ama bunu test etmek için bir yol bulamadım, bu yüzden yapabilirseniz bana bildirin!
Lambda MitM
Bazı lambdalar kullanıcılardan parametrelerde hassas bilgiler alacak. Bunlardan birinde RCE alırsanız, diğer kullanıcıların gönderdiği bilgileri dışarı çıkarabilirsiniz, bunu kontrol edin:
Referanslar
Last updated