AWS - Lambda Privesc
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)
lambda hakkında daha fazla bilgi için:
AWS - Lambda Enumiam:PassRole
, lambda:CreateFunction
, (lambda:InvokeFunction
| lambda:InvokeFunctionUrl
)iam:PassRole
, lambda:CreateFunction
ve lambda:InvokeFunction
izinlerine sahip kullanıcılar, ayrıcalıklarını artırabilir.
Yeni bir Lambda fonksiyonu oluşturabilir ve ona mevcut bir IAM rolü atayabilir, bu da fonksiyona o rolle ilişkili izinleri verir. Kullanıcı daha sonra bu Lambda fonksiyonuna kod yazabilir ve yükleyebilir (örneğin bir rev shell ile).
Fonksiyon kurulduktan sonra, kullanıcı çalıştırılmasını tetikleyebilir ve Lambda fonksiyonunu AWS API'si aracılığıyla çağırarak istenen eylemleri gerçekleştirebilir. Bu yaklaşım, kullanıcının Lambda fonksiyonu aracılığıyla dolaylı olarak görevler gerçekleştirmesine olanak tanır ve buna bağlı IAM rolü ile verilen erişim seviyesinde çalışır.\
Bir saldırgan bunu rev shell almak ve token'ı çalmak için kötüye kullanabilir:
Lambda fonksiyonunun kendisinden lambda rol izinlerini kötüye kullanabilirsiniz. Eğer lambda rolü yeterli izinlere sahipse, bunu size yönetici hakları vermek için kullanabilirsiniz:
Lambda'nın rol kimlik bilgilerini dış bağlantıya ihtiyaç duymadan sızdırmak da mümkündür. Bu, iç görevlerde kullanılan Ağdan İzole Lambdalar için faydalı olacaktır. Eğer bilinmeyen güvenlik grupları ters shell'lerinizi filtreliyorsa, bu kod parçası, kimlik bilgilerini lambda'nın çıktısı olarak doğrudan sızdırmanıza olanak tanıyacaktır.
Olası Etki: Belirtilen keyfi lambda hizmet rolüne doğrudan privesc.
İlginç görünebilir, ancak lambda:InvokeAsync
kendi başına aws lambda invoke-async
çalıştırmaya izin vermez, ayrıca lambda:InvokeFunction
iznine de ihtiyacınız var.
iam:PassRole
, lambda:CreateFunction
, lambda:AddPermission
Önceki senaryoda olduğu gibi, lambda:AddPermission
iznine sahipseniz kendinize lambda:InvokeFunction
iznini verebilirsiniz.
Potansiyel Etki: Belirtilen keyfi lambda hizmet rolüne doğrudan yetki yükseltme.
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
) dolaylı olarak yetki yükseltebilirler; hatta lambda:InvokeFunction
olmadan bile.
Kötü niyetli kod içeren bir Lambda fonksiyonu oluşturabilir ve ona mevcut bir IAM rolü atayabilirler.
Kullanıcı, Lambda'yı doğrudan çağırmak yerine, mevcut bir DynamoDB tablosu kurar veya kullanır ve bunu bir olay kaynağı eşlemesi aracılığıyla Lambda ile bağlar. Bu kurulum, Lambda fonksiyonunun tablodaki yeni bir öğe girişi ile otomatik olarak tetiklenmesini sağlar; bu, kullanıcının eylemi veya başka bir süreç tarafından gerçekleşebilir ve böylece Lambda fonksiyonunu dolaylı olarak çağırarak kodu atanan IAM rolünün izinleriyle çalıştırır.
Eğer DynamoDB AWS ortamında zaten aktifse, kullanıcı sadece Lambda fonksiyonu için olay kaynağı eşlemesini oluşturması gerekir. Ancak, eğer DynamoDB kullanılmıyorsa, kullanıcı streaming etkinleştirilmiş yeni bir tablo oluşturmalıdır:
Artık Lambda fonksiyonunu DynamoDB tablosuna bağlamak için bir olay kaynağı eşlemesi oluşturmak mümkündür:
DynamoDB akışına bağlı Lambda işlevi ile, saldırgan DynamoDB akışını etkinleştirerek Lambda'yı dolaylı olarak tetikleyebilir. Bu, DynamoDB tablosuna bir öğe ekleyerek gerçekleştirilebilir:
Olası Etki: Belirtilen lambda hizmet rolüne doğrudan yetki yükseltme.
lambda:AddPermission
Bu izne sahip bir saldırgan kendisine (veya başkalarına) herhangi bir izin verebilir (bu, kaynağa erişim sağlamak için kaynak tabanlı politikalar oluşturur):
Olası Etki: Kodu değiştirme ve çalıştırma izni vererek lambda hizmet rolüne doğrudan yetki yükseltme.
lambda:AddLayerVersionPermission
Bu izne sahip bir saldırgan kendisine (veya başkalarına) lambda:GetLayerVersion
iznini verebilir. Katmana erişebilir ve güvenlik açıkları veya hassas bilgiler arayabilir.
Olası Etki: Hassas bilgilere potansiyel erişim.
lambda:UpdateFunctionCode
lambda:UpdateFunctionCode
iznine sahip kullanıcılar, bir IAM rolüne bağlı mevcut bir Lambda fonksiyonunun kodunu değiştirme potansiyeline sahiptir.
Saldırgan, IAM kimlik bilgilerini dışarı aktarmak için lambdanın kodunu değiştirebilir.
Saldırganın fonksiyonu doğrudan çağırma yeteneği olmasa da, eğer Lambda fonksiyonu önceden var ve çalışıyorsa, mevcut iş akışları veya olaylar aracılığıyla tetiklenmesi muhtemeldir, böylece değiştirilmiş kodun yürütülmesini dolaylı olarak kolaylaştırır.
Olası Etki: Kullanılan lambda hizmet rolüne doğrudan yetki yükseltme.
lambda:UpdateFunctionConfiguration
Bu izinlerle, Lambda'nın rastgele kod çalıştırmasına neden olacak ortam değişkenleri eklemek mümkündür. Örneğin, Python'da PYTHONWARNING
ve BROWSER
ortam değişkenlerini kötüye kullanarak bir Python sürecinin rastgele komutlar çalıştırması sağlanabilir:
Diğer betik dilleri için kullanabileceğiniz başka ortam değişkenleri vardır. Daha fazla bilgi için aşağıdaki bağlantıdaki betik dilleri alt bölümlerine bakın:
Lambda Katmanları, kodunuzu lambda fonksiyonunuza dahil etmenizi sağlar, ancak ayrı olarak depolayarak, böylece fonksiyon kodu küçük kalabilir ve birden fazla fonksiyon kodu paylaşabilir.
Lambda içinde, python kodunun yüklendiği yolları aşağıdaki gibi bir fonksiyonla kontrol edebilirsiniz:
Bunlar yerlerdir:
/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. pozisyon) konumundan yüklenir.
lambda:UpdateFunctionConfiguration
iznini kötüye kullanarak bir lambda fonksiyonuna yeni bir katman eklemek mümkündür. Rastgele kod çalıştırmak için bu katmanın lambda'nın içe aktaracağı bazı kütüphaneleri içermesi gerekir. Lambda'nın kodunu okuyabiliyorsanız, bunu kolayca bulabilirsiniz, ayrıca lambda'nın zaten bir katman kullanıyor olabileceğini ve bu katmanı indirebileceğinizi ve oraya kodu ekleyebileceğinizi unutmayın.
Örneğin, lambda'nın boto3 kütüphanesini kullandığını varsayalım, bu, kütüphanenin son sürümüyle yerel bir katman oluşturacaktır:
You can open ./lambda_layer/boto3/__init__.py
and global kodda arka kapıyı ekleyin (örneğin, kimlik bilgilerini dışa aktaran bir fonksiyon veya ters shell almak için).
Sonra, ./lambda_layer
dizinini zipleyin ve yeni lambda katmanını kendi hesabınıza (veya kurbanın hesabına, ancak bunun için izinleriniz olmayabilir) yükleyin.
Bir python klasörü oluşturmanız ve kütüphaneleri oraya koymanız gerektiğini unutmayın, böylece /opt/python/boto3'ü geçersiz kılabilirsiniz. Ayrıca, katmanın lambda tarafından kullanılan python sürümüyle uyumlu olması gerekir ve eğer bunu hesabınıza yüklüyorsanız, aynı bölgede olması gerekir:
Şimdi, yüklenen lambda katmanını herhangi bir hesap tarafından erişilebilir hale getirin:
Ve lambda katmanını kurban lambda fonksiyonuna ekleyin:
Sonraki adım, eğer yapabiliyorsak fonksiyonu kendimiz çağırmak ya da normal yollarla çağrılmasını beklemek olacaktır - bu daha güvenli bir yöntemdir.
Bu açığı istismar etmenin daha gizli bir yolu şurada bulunabilir:
AWS - Lambda Layers PersistenceOlası Etki: Kullanılan lambda hizmet rolüne doğrudan privesc.
iam:PassRole
, lambda:CreateFunction
, lambda:CreateFunctionUrlConfig
, lambda:InvokeFunctionUrl
Belki bu izinlerle bir fonksiyon oluşturup URL'yi çağırarak çalıştırabilirsiniz... ama bunu test etmenin bir yolunu bulamadım, eğer bulursanız bana bildirin!
Bazı lambdalar, kullanıcılardan parametrelerde hassas bilgiler alacak. Eğer bunlardan birinde RCE elde ederseniz, diğer kullanıcıların gönderdiği bilgileri dışarı sızdırabilirsiniz, bunu kontrol edin:
AWS - Steal Lambda RequestsAWS 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)