AWS - Lambda Enum

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

HackTricks'ı desteklemenin diğer yolları:

Lambda

Amazon Web Services (AWS) Lambda, sunucu sağlama veya yönetimi gerektirmeyen bir hesaplama hizmeti olarak tanımlanır. Kod yürütme için gereken kaynak tahsisini otomatik olarak yönetme yeteneğiyle, yüksek kullanılabilirlik, ölçeklenebilirlik ve güvenlik gibi özellikleri sağlar. Lambda'nın önemli bir yönü, sadece kullanılan hesaplama süresine dayalı olarak ücretlendirilmesidir, başlangıç yatırımları veya uzun vadeli yükümlülükler gerektirmez.

Bir lambda'yı çağırmak için Cloudwatch ile istediğiniz kadar sık çağrı yapabilirsiniz, bir URL ucu açabilir ve çağrı yapabilirsiniz, API Gateway üzerinden çağrı yapabilirsiniz veya hatta bir S3 kovasındaki verilerdeki değişiklikler veya bir DynamoDB tablosundaki güncellemeler gibi olaylara dayalı olarak çağrı yapabilirsiniz.

Bir lambda'nın kodu /var/task dizininde depolanır.

Lambda Takma Adı Ağırlıkları

Bir Lambda'nın birkaç sürümü olabilir. Ve takma adlar aracılığıyla birden fazla sürümü açığa çıkarabilir. Takma ad içindeki her bir sürümün ağırlıkları, hangi takma adın çağrıyı alacağını belirler (örneğin, 90%-10% olabilir). Eğer takma adlardan birinin kodu savunmasızsa, saldırıyı alacak olan sürümüne kadar istekler gönderebilirsiniz.

Kaynak İzinleri

Lambda kaynak izinleri, lambda'nın başka hizmetler/hesaplar tarafından çağrılmasına izin verir. Örneğin, bir lambda'ya URL üzerinden herkese erişim izni vermek için aşağıdaki politika kullanılabilir:

Veya API Gateway'in onu çağırmasına izin vermek için:

Lambda Veritabanı Proxy'leri

Eşzamanlı yüzlerce lambda isteği olduğunda, her birinin bir veritabanına bağlanıp bağlantıyı kapatması gerekiyorsa, bu çalışmayacak (lambda'lar durumsuzdur, bağlantıları açık tutamaz). Bu durumda, Lambda işlevleriniz veritabanı yerine RDS Proxy ile etkileşimde bulunursa. Eşzamanlı Lambda işlevleri tarafından oluşturulan birçok eşzamanlı bağlantıyı ölçeklendirmek için gereken bağlantı havuzunu yönetir. Bu, Lambda uygulamalarınızın her işlev çağrısı için yeni bağlantılar oluşturmak yerine mevcut bağlantıları yeniden kullanabilmesini sağlar.

Lambda EFS Dosya Sistemleri

Verileri korumak ve hatta paylaşmak için Lambda'lar EFS'e erişebilir ve onları bağlayabilir, böylece Lambda ondan okuma ve yazma yapabilir.

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 işleve 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 yapmayı seçebilirsiniz. Farklı bir hesap tarafından yayınlanan bir katmanı tüketen işlevleriniz, katman sürümü silindikten sonra veya katmana erişim izniniz iptal edildikten sonra katman sürümünü kullanmaya devam edebilir. Ancak, silinen 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ş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.

Lambda Uzantıları

Lambda uzantıları, çeşitli izleme, gözlemleme, güvenlik ve yönetim araçlarıyla entegre olarak işlevleri geliştirir. Bu uzantılar, .zip arşivleri kullanarak Lambda katmanları veya konteyner görüntüsü dağıtımlarında dahil edilen, iki modda çalışır: dahili ve harici.

  • Dahili uzantılar, dil özgü ortam değişkenleri ve sarmalama betikleri kullanarak çalışma zamanı süreciyle birleşir ve başlangıcını değiştirir. Bu özelleştirme, Java Correto 8 ve 11, Node.js 10 ve 12 ve .NET Core 3.1 gibi bir dizi çalışma zamanı için geçerlidir.

  • Harici uzantılar, ayrı süreçler olarak çalışır ve Lambda işlevinin yaşam döngüsüyle uyumlu bir şekilde çalışı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.

Saptama

AWS Lambda, sunucu oluşturmadan ve yönetmeden kod çalıştırmanıza olanak tanıyan bir hizmettir. Lambda fonksiyonları, olay tetikleyicileriyle ilişkilendirilir ve bu olaylar gerçekleştiğinde çalıştırılır. Lambda hizmetini saptamak için aşağıdaki adımları izleyebilirsiniz:

  1. AWS Management Console üzerinden Lambda hizmetine erişin.

  2. Lambda fonksiyonları bölümünde, mevcut fonksiyonları listeleyin.

  3. Her bir fonksiyonun ayrıntılarını inceleyin ve hedeflenen bilgileri toplayın.

  4. Lambda fonksiyonlarına ilişkin IAM rollerini kontrol edin ve gerektiğinde izinleri sınırlayın.

  5. Lambda fonksiyonlarının tetikleyicilerini kontrol edin ve hedeflenen olayları belirleyin.

  6. Lambda fonksiyonlarının günlüklerini kontrol edin ve potansiyel güvenlik açıklarını tespit etmek için analiz yapın.

  7. Lambda fonksiyonlarının bağımlılıklarını kontrol edin ve güncel olmayan veya güvenlik açıkları olan kütüphaneleri tespit edin.

  8. Lambda fonksiyonlarının yapılandırma ayarlarını kontrol edin ve gerektiğinde güvenlik önlemleri alın.

  9. Lambda fonksiyonlarının ortam değişkenlerini kontrol edin ve hassas bilgilerin sızmasını önlemek için gerekli önlemleri alın.

  10. Lambda fonksiyonlarının erişim izinlerini kontrol edin ve gerektiğinde sınırlayın.

Bu adımları takip ederek AWS Lambda hizmetini saptayabilir ve güvenlik açıklarını tespit edebilirsiniz.

aws lambda get-account-settings

# List functions and get extra config info
aws lambda list-functions
aws lambda get-function --function-name <function_name>
aws lambda get-function-configuration --function-name <function_name>
aws lambda list-function-event-invoke-configs --function-name <function_name>
## Check for creds in env vars
aws lambda list-functions | jq '.Functions[].Environment'
## Download & check the source code
aws lambda get-function --function-name "<func_name>" --query 'Code.Location'
wget -O lambda-function.zip <url-from-previous-query>

# Get Lambda URL (if any)
aws lambda list-function-url-configs --function-name <function_name>
aws lambda get-function-url-config --function-name <function_name>

# Get who has permissions to invoke the Lambda
aws lambda get-policy --function-name <function_name>

# Versions and Aliases
aws lambda list-versions-by-function --function-name <func_name>
aws lambda list-aliases --function-name <func_name>

# List layers
aws lambda list-layers
aws lambda list-layer-versions --layer-name <name>
aws lambda get-layer-version --layer-name <name> --version-number <ver>
aws lambda get-layer-version-by-arn --arn <name> #Get external ARNs

# List other metadata
aws lambda list-event-source-mappings
aws lambda list-code-signing-configs
aws lambda list-functions-by-code-signing-config --code-signing-config-arn <arn>

Elle Çağırma

AWS Lambda işlevini manuel olarak çağırmak için aşağıdaki adımları izleyin:

  1. AWS Yönetim Konsolu'na gidin ve Lambda hizmetine geçin.

  2. Lambda işlevinizi seçin.

  3. "Test" düğmesine tıklayın.

  4. "Yeni test etkinliği oluştur" seçeneğini seçin.

  5. Test etkinliği adını ve giriş verilerini belirtin.

  6. "Test etkinliğini oluştur" düğmesine tıklayın.

  7. İşlevin sonuçlarını ve hata mesajlarını kontrol edin.

Bu adımları takip ederek, AWS Lambda işlevinizi manuel olarak çağırabilirsiniz.

# Invoke function
aws lambda invoke --function-name FUNCTION_NAME /tmp/out
## Some functions will expect parameters, they will access them with something like:
## target_policys = event['policy_names']
## user_name = event['user_name']
aws lambda invoke --function-name <name> --cli-binary-format raw-in-base64-out --payload '{"policy_names": ["AdministratorAccess], "user_name": "sdf"}' out.txt

Açığa çıkan URL üzerinden

If you find an exposed URL of an AWS Lambda function, you can use it to gather information about the function and potentially exploit it. Here are some steps you can follow:

  1. Access the exposed URL in a web browser or using a tool like cURL.

  2. Look for any sensitive information that may be leaked in the response, such as AWS access keys or other credentials.

  3. Analyze the response headers for any security-related information, such as server version or configuration details.

  4. Test for common vulnerabilities, such as SSRF (Server-Side Request Forgery) or code injection, by manipulating the URL parameters or payload.

  5. Enumerate the function's permissions and roles to understand its capabilities and potential attack surface.

  6. Use the exposed URL to trigger the function and observe its behavior. This can help identify any potential security weaknesses or misconfigurations.

  7. Document your findings and report them to the appropriate parties for remediation.

By leveraging an exposed URL, you can gain valuable insights into the AWS Lambda function and potentially uncover security vulnerabilities. However, it's important to always obtain proper authorization before conducting any security testing.

aws lambda list-function-url-configs --function-name <function_name> #Get lambda URL
aws lambda get-function-url-config   --function-name <function_name> #Get lambda URL

URL üzerinden Lambda işlevini çağırma

Şimdi, yürütülebilecek olası lambda işlevlerini bulma zamanı geldi:

aws --region us-west-2 --profile level6 lambda list-functions

Bir "Level6" adında bir lambda fonksiyonu mevcut. Onu nasıl çağıracağımızı bulalım:

aws --region us-west-2 --profile level6 lambda get-policy --function-name Level6

Şimdi, ismi ve kimliği bildiğin için İsmi alabilirsin:

aws --profile level6 --region us-west-2 apigateway get-stages --rest-api-id "s33ppypa75"

Ve son olarak, işlevi çağırarak erişin (dikkat edin, ID, Ad ve işlev adı URL'de görünür): https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6

URL:https://<rest-api-id>.execute-api.<region>.amazonaws.com/<stageName>/<funcName>

Diğer Tetikleyiciler

Bir lambda'yı tetikleyebilecek birçok başka kaynak vardır

Privesc

Aşağıdaki sayfada, yetkileri yükseltmek için Lambda izinlerini kötüye kullanmanın nasıl yapılacağını kontrol edebilirsiniz:

Kimlik Doğrulamasız Erişim

Sonrası Sızma

Kalıcılık

Referanslar

htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahraman olmak için AWS hackleme öğrenin!

HackTricks'i desteklemenin diğer yolları:

Last updated