
Устраните висящие эластичные IP-адреса, выполнив анализ ваших ресурсов во всех ваших учетных записях AWS.
Устраните "зависшие" (dangling) эластичные IP-адреса, выполняя анализ ваших ресурсов во всех аккаунтах AWS.
Ghostbuster получает все DNS-записи, присутствующие во всех ваших аккаунтах AWS (Route53), и опционально может принимать записи через CSV-файл или Cloudflare.
После сбора этих записей Ghostbuster проходит по всем вашим эластичным IP-адресам AWS и публичным IP-адресам сетевых интерфейсов и собирает эти данные.
Имея полную картину DNS-записей (из Route53, файлового ввода или Cloudflare) и полную картину IP-адресов AWS, принадлежащих вашей организации, этот инструмент может обнаруживать поддомены, которые указывают на "зависшие" эластичные IP-адреса (IP-адреса, которыми вы больше не владеете).
При развертывании инфраструктуры в AWS вы можете запускать экземпляры EC2, которым назначается IP-адрес. Когда вы создаете DNS-записи, указывающие на эти IP-адреса, но забываете удалить DNS-записи после того, как экземпляру EC2 был назначен новый IP-адрес или он был уничтожен, вы становитесь уязвимы для атак перехвата поддоменов (subdomain takeover).
Было проведено много исследований по захвату эластичных IP-адресов, когда атакующие могут постоянно запрашивать эластичные IP-адреса, пока не получат IP-адрес, связанный с поддоменом целевой компании.
Хотя AWS часто блокирует аккаунты, пытающиеся выполнить такой сценарий атаки, долгосрочного исправления от AWS выпущено не было.
Последствия атак перехвата "зависших" эластичных IP-поддоменов более серьезны, чем типичный перехват поддомена, при котором вы можете контролировать только отображаемый контент. При захвате "зависших" эластичных IP-адресов атакующий может делать следующее:
*.domain.com.aws/configВажно:
Чтобы этот инструмент был эффективным, он должен иметь полную картину вашей среды AWS. Если у него нет полной картины, это приведет к ложноположительным результатам.
Установка Ghostbuster проста: выполните pip install ghostbuster. Инструмент командной строки будет доступен через команду ghostbuster.
Требуется среда Python 3.x.
❯ ghostbuster scan aws --help
Usage: ghostbuster scan aws [OPTIONS]
Scan for dangling elastic IPs inside your AWS accounts.
Options:
--profile TEXT Specify a specific AWS profile to run ghostbuster
on.
--skipascii Skip printing the ASCII art when starting up
Ghostbuster.
--json Only return a JSON object.
--slackwebhook TEXT Specify a Slack webhook URL to send notifications
about potential takeovers.
--records PATH Manually specify DNS records to check against.
Ghostbuster will check these IPs after checking
retrieved DNS records. See records.csv for an
example.
--cloudflaretoken TEXT Pull DNS records from Cloudflare, provide a CF API
token.
--allregions Run on all regions.
--exclude TEXT Comma delimited list of profile names to exclude.
--regions TEXT Comma delimited list of regions to run on.
--help Show this message and exit.
Примеры команд
Запустите Ghostbuster с доступом к DNS-записям Cloudflare, отправляйте уведомления в Slack webhook, перебирайте каждый профиль AWS, настроенный в .aws/config или .aws/credentials, для всех регионов AWS:
❯ ghostbuster scan aws --cloudflaretoken APIKEY --slackwebhook https://hooks.slack.com/services/KEY --allregions
Запустите Ghostbuster с вручную введенным списком A-записей поддоменов (см. records.csv в этом репозитории для примера файла):
❯ ghostbuster scan aws --records records.csv
Вы можете указать конкретные регионы, используя --regions со списком регионов через запятую, например us-east-1,us-west-1.
❯ ghostbuster scan aws --cloudflaretoken whougonnacall
Obtaining all zone names from Cloudflare.
Obtaining DNS A records for all zones from Cloudflare.
Obtained 33 DNS A records so far.
Obtaining Route53 hosted zones for AWS profile: default.
Obtaining Route53 hosted zones for AWS profile: account-five.
Obtaining Route53 hosted zones for AWS profile: account-four.
Obtaining Route53 hosted zones for AWS profile: account-four-deploy.
Obtaining Route53 hosted zones for AWS profile: account-two-deploy.
Obtaining Route53 hosted zones for AWS profile: account-one-deploy.
Obtaining Route53 hosted zones for AWS profile: account-three-deploy.
Obtaining Route53 hosted zones for AWS profile: account-six.
Obtaining Route53 hosted zones for AWS profile: account-seven.
Obtaining Route53 hosted zones for AWS profile: account-one.
Obtained 124 DNS A records so far.
Obtaining EIPs for region: us-east-1, profile: default
Obtaining IPs for network interfaces for region: us-east-1, profile: default
Obtaining EIPs for region: us-east-1, profile: account-five
Obtaining IPs for network interfaces for region: us-east-1, profile: account-five
Obtaining EIPs for region: us-east-1, profile: account-four
Obtaining IPs for network interfaces for region: us-east-1, profile: account-four
Obtaining EIPs for region: us-east-1, profile: account-four-deploy
Obtaining IPs for network interfaces for region: us-east-1, profile: account-four-deploy
Obtaining EIPs for region: us-east-1, profile: account-two-deploy
Obtaining IPs for network interfaces for region: us-east-1, profile: account-two-deploy
Obtaining EIPs for region: us-east-1, profile: account-one-deploy
Obtaining IPs for network interfaces for region: us-east-1, profile: account-one-deploy
Obtaining EIPs for region: us-east-1, profile: account-three-deploy
Obtaining IPs for network interfaces for region: us-east-1, profile: account-three-deploy
Obtaining EIPs for region: us-east-1, profile: account-six
Obtaining IPs for network interfaces for region: us-east-1, profile: account-six
Obtaining EIPs for region: us-east-1, profile: account-seven
Obtaining IPs for network interfaces for region: us-east-1, profile: account-seven
Obtaining EIPs for region: us-east-1, profile: account-one
Obtaining IPs for network interfaces for region: us-east-1, profile: account-one
Obtained 415 unique elastic IPs from AWS.
Takeover possible: {'name': 'takeover.assetnotecloud.com', 'records': ['52.54.24.193']}
Первый шаг — создание ключей или ролей в ваших аккаунтах AWS, которые предоставляют привилегии, необходимые для чтения записей Route53 и описания эластичных адресов и сетевых интерфейсов EC2.
Access key - Programmatic access и нажмите Next: Permissions.Attach existing policies directly, затем нажмите Create policy.JSON и вставьте следующую политику:{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "GhostbusterPolicy",
"Effect": "Allow",
"Action": [
"ec2:DescribeAddresses",
"ec2:DescribeNetworkInterfaces",
"route53:ListResourceRecordSets",
"route53:ListHostedZonesByName",
"route53:GetTrafficPolicyInstance",
"route53:GetTrafficPolicy"
],
"Resource": "*"
}
]
}
Next: Tags, затем Next: Review.GhostbusterPolicy.Create Policy.GhostbusterPolicy.Next: Tags, затем Next: Review.Create user и настройте учетные данные AWS в файле .aws/credentials.Повторите описанные выше шаги для каждого аккаунта AWS, которым вы владеете.
Этот инструмент будет работать с любой конфигурацией AWS, которую вы настроили (несколько ключей или профили с переключением ролей между аккаунтами). Этим управляет boto3 — библиотека, используемая для взаимодействия с AWS.
Пример конфигурации выглядит так:
.aws/credentials:
[default]
aws_access_key_id = AKIAIII...
aws_secret_access_key = faAaAaA...
.aws/config:
[default]
output = table
region = us-east-1
[profile account-one]
role_arn = arn:aws:iam::911111111113:role/Ec2Route53Access
source_profile = default
region = us-east-1
[profile account-two]
role_arn = arn:aws:iam::911111111112:role/Ec2Route53Access
source_profile = default
region = us-east-1
[profile account-three]
region = us-east-1
role_arn = arn:aws:iam::911111111111:role/Ec2Route53Access
source_profile = default
В качестве альтернативы, вместо ролей, которые предполагаются, вы также можете настроить файл .aws/credentials, содержащий список профилей и связанных ключей с ограниченным доступом.
После того как ваша конфигурация AWS настроена со всеми аккаунтами в вашей среде AWS, вы можете запустить инструмент с помощью следующей команды:
Ghostbuster может использовать роли вместо профилей, что устраняет необходимость хранить много учетных данных в одном месте. Однако подход с ролями потребует создания дополнительных политик IAM внутри вашей организации.
Роли можно использовать с помощью флагов --roles roles.csv или --autoroles. Чтобы настроить --roles для работы, необходимо создать роль GhostbusterTargetAccountRole с точно таким именем в каждом аккаунте, который сканируется:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "GhostbusterTargetAccountRole",
"Effect": "Allow",
"Action": [
"ec2:DescribeAddresses",
"ec2:DescribeNetworkInterfaces",
"ec2:DescribeRegions",
"route53:ListResourceRecordSets",
"route53:ListHostedZonesByName",
"route53:GetTrafficPolicyInstance",
"route53:GetTrafficPolicy"
],
"Resource": "*"
}
]
}
Ghostbuster будет запущен в lambda/ec2/где-либо с ролью ghostbuster — назовем ее главной ролью ghostbuster. Главная роль должна иметь возможность предполагать TargetAccountRoles.
resource "aws_iam_policy" "ghostbuster_target_account_roles" {
name = "ghostbuster_target_account_roles"
path = "/"
description = "Allow inspecting DNS and elastic IP data."
policy = jsonencode({
"Version" : "2012-10-17",
"Statement" : [
{
"Effect" : "Allow",
"Action" : "sts:AssumeRole",
"Resource" : ["arn:aws:iam::*:role/GhostbusterTargetAccountRole"]
}]
})
tags = {
Project = "ghostbuster"
}
}
Автоматическое обнаружение аккаунтов требует дополнительных разрешений по сравнению с --roles. После настройки --roles для работы, рассмотрите возможность добавления следующей политики IAM в аккаунт, имеющий обзор организации:
{
sid = "BaseAccess"
actions = [
"organizations:DescribeAccount",
"organizations:ListAccounts"
]
resources = ["*"]
effect = "Allow"
}
}
Затем в аккаунте, где запускается ghostbuster, прикрепите следующую политику к главной роли ghostbuster, чтобы она могла предполагать роль для просмотра организации:
{
"Version" : "2012-10-17",
"Statement" : [
{
"Effect" : "Allow",
"Action" : "sts:AssumeRole",
"Resource" : ["arn:aws:iam::ORG_LOOKUP_ACCOUNT_ID:role/ghostbuster-org-role"]
}]
}
Не забудьте заменить ORG_LOOKUP_ACCOUNT_ID на фактический ID аккаунта.
Если вы хотите, чтобы Ghostbuster импортировал все A-записи, которые вы настроили в Cloudflare, вам необходимо создать API-токен, который может читать зоны.
https://dash.cloudflare.com/profile/api-tokens
Настройте API-токен Cloudflare, как показано на скриншоте ниже:

После получения этого API-токена сохраните его в надежном месте (менеджере паролей). Чтобы использовать его с Ghostbuster, передайте его через аргумент cloudflaretoken.
Смотрите также список участников, которые внесли вклад в этот проект.
GNU Affero General Public License
pip3 install virtualenvvirtualenv venv. venv/bin/activatepip3 install --editable .