
Elimine IPs elásticos órfãos realizando análises em seus recursos em todas as suas contas AWS.
Elimine Elastic IPs órfãos realizando análises em seus recursos em todas as suas contas AWS.
O Ghostbuster obtém todos os registros DNS presentes em todas as suas contas AWS (Route53) e pode opcionalmente receber registros via entrada CSV ou via Cloudflare.
Após coletar esses registros, o Ghostbuster percorre todos os seus Elastic IPs da AWS e IPs Públicos de Interfaces de Rede e coleta esses dados.
Ao ter uma visão completa dos registros DNS (do Route53, entrada de arquivo ou Cloudflare) e uma visão completa dos IPs AWS pertencentes à sua organização, esta ferramenta pode detectar subdomínios que apontam para Elastic IPs órfãos (IPs que você não possui mais).
Ao implantar infraestrutura na AWS, você pode iniciar instâncias EC2 que possuem um IP associado a elas. Quando você cria registros DNS apontando para esses IPs, mas esquece de removê-los após a instância EC2 receber um novo IP ou ser destruída, você fica suscetível a ataques de takeover de subdomínio.
Houve uma grande quantidade de pesquisa sobre takeovers de Elastic IP, onde é possível que atacantes reivindiquem continuamente Elastic IPs até obterem um IP associado a um subdomínio da empresa que estão atacando.
Embora a AWS ban frequentemente contas que tentam executar esse padrão de ataque, nenhuma correção de longo prazo foi lançada pela AWS.
O impacto de ataques de takeover de subdomínio por Elastic IP órfão é mais grave do que um takeover de subdomínio típico, onde você só pode controlar o conteúdo sendo servido. Com takeovers de Elastic IP órfão, é possível que um atacante faça o seguinte:
*.domain.com.aws/configImportante:
Para que esta ferramenta seja eficaz, ela deve ter uma visão completa do seu ambiente AWS. Se não tiver uma visão completa, isso levará a falsos positivos.
Instalar o Ghostbuster é tão simples quanto executar: pip install ghostbuster. A ferramenta CLI estará então acessível através do comando ghostbuster.
Isso requer um ambiente 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.
Exemplos de Comandos
Executar o Ghostbuster com acesso aos registros DNS do Cloudflare, enviar notificações para um Slack webhook, iterar por todos os perfis AWS configurados em .aws/config ou .aws/credentials para todas as regiões AWS
❯ ghostbuster scan aws --cloudflaretoken APIKEY --slackwebhook https://hooks.slack.com/services/KEY --allregions
Executar o Ghostbuster com uma lista inserida manualmente de registros A de subdomínio (veja records.csv neste repositório para um exemplo de arquivo):
❯ ghostbuster scan aws --records records.csv
Você pode especificar regiões específicas usando --regions definido como uma lista separada por vírgulas de regiões, ex.: 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']}
O primeiro passo é criar chaves ou funções (roles) em suas contas AWS que concedam os privilégios necessários para ler registros Route53 e descrever endereços elásticos e interfaces de rede EC2.
Access key - Programmatic access e clique em Next: Permissions.Attach existing policies directly e depois em Create policy.JSON e cole a seguinte política:{
"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 e depois Next: Review.GhostbusterPolicy.Create Policy.GhostbusterPolicy.Next: Tags e depois Next: Review.Create user e configure as credenciais AWS no seu arquivo .aws/credentials.Repita os passos acima para cada conta AWS que você possui.
Esta ferramenta funcionará com a configuração AWS que você tiver (várias chaves ou perfis de assumir função entre contas). Isso é gerenciado pelo boto3, a biblioteca usada para interface com a AWS.
Um exemplo de configuração é assim:
.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
Alternativamente, em vez de ter funções que são assumidas, você também pode configurar o arquivo .aws/credentials para ter uma lista de perfis e chaves associadas com acesso delimitado.
Assim que sua configuração AWS estiver definida com todas as contas do seu ambiente AWS, você pode executar a ferramenta usando o seguinte comando:
O Ghostbuster pode usar funções (roles) em vez de perfis, o que elimina a necessidade de ter tantas credenciais em um só lugar. No entanto, a abordagem de funções exigirá a criação de políticas IAM adicionais dentro da sua organização.
Funções podem ser usadas via flags --roles roles.csv ou --autoroles. Para configurar --roles para funcionar, é necessário criar a função GhostbusterTargetAccountRole nomeada exatamente assim em cada conta que está sendo escaneada:
{
"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": "*"
}
]
}
O Ghostbuster será executado em lambda/ec2/qualquer coisa com a função ghostbuster – vamos chamá-la de função mestre ghostbuster. A função mestre deve ser capaz de assumir as 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"
}
}
A descoberta automática de contas requer permissão adicional em comparação com --roles. Após configurar --roles para funcionar, considere adicionar a seguinte política IAM em uma conta que tenha visão geral da organização:
{
sid = "BaseAccess"
actions = [
"organizations:DescribeAccount",
"organizations:ListAccounts"
]
resources = ["*"]
effect = "Allow"
}
}
Em seguida, na conta que está executando o Ghostbuster, anexe a seguinte política à função mestre Ghostbuster para que ela possa assumir a função de consulta da organização:
{
"Version" : "2012-10-17",
"Statement" : [
{
"Effect" : "Allow",
"Action" : "sts:AssumeRole",
"Resource" : ["arn:aws:iam::ORG_LOOKUP_ACCOUNT_ID:role/ghostbuster-org-role"]
}]
}
Não se esqueça de substituir ORG_LOOKUP_ACCOUNT_ID pelo ID real da conta.
Se você quiser que o Ghostbuster obtenha todos os registros A que você configurou no Cloudflare, será necessário configurar um token de API que possa ler zonas.
https://dash.cloudflare.com/profile/api-tokens
Configure um token de API do Cloudflare como mostrado na captura de tela abaixo:

Assim que obtiver este token de API, anote-o em algum lugar (gerenciador de senhas). Para usá-lo com o Ghostbuster, passe-o através do argumento cloudflaretoken.
Veja também a lista de contribuidores que participaram deste projeto.
GNU Affero General Public License
pip3 install virtualenvvirtualenv venv. venv/bin/activatepip3 install --editable .