
Elimina las IPs elásticas huérfanas realizando un análisis de tus recursos en todas tus cuentas de AWS.
Elimina IPs elásticas colgantes realizando análisis de tus recursos en todas tus cuentas de AWS.
Ghostbuster obtiene todos los registros DNS presentes en todas tus cuentas de AWS (Route53) y opcionalmente puede recibir registros mediante entrada CSV o desde Cloudflare.
Después de recolectar estos registros, Ghostbuster itera sobre todas tus IPs elásticas de AWS y las IPs públicas de interfaces de red y recolecta estos datos.
Al tener una imagen completa de los registros DNS (desde Route53, archivo de entrada o Cloudflare) y una imagen completa de las IPs de AWS que posee tu organización, esta herramienta puede detectar subdominios que apuntan a IPs elásticas colgantes (IPs que ya no posees).
Cuando despliegas infraestructura en AWS, puedes crear instancias EC2 que tienen una IP asociada. Cuando creas registros DNS que apuntan a estas IPs, pero olvidas eliminar los registros DNS después de que la instancia EC2 haya recibido una nueva IP o haya sido destruida, eres susceptible a ataques de secuestro de subdominios.
Se ha realizado una gran cantidad de investigación sobre secuestros de IPs elásticas, donde es posible que atacantes reclamen continuamente IPs elásticas hasta obtener una IP asociada con un subdominio de la empresa que están atacando.
Aunque AWS frecuentemente bloquea cuentas que intentan realizar este patrón de ataque, no se ha publicado una solución a largo plazo por parte de AWS.
El impacto de los ataques de secuestro de subdominios por IPs elásticas colgantes es más grave que un secuestro de subdominio típico donde solo puedes controlar el contenido que se sirve. Con los secuestros de IPs elásticas colgantes, es posible que un atacante haga lo siguiente:
*.domain.com.aws/configImportante:
Para que esta herramienta sea efectiva, debe tener una imagen completa de tu entorno AWS. Si no tiene una imagen completa, generará falsos positivos.
Instalar Ghostbuster es tan sencillo como ejecutar: pip install ghostbuster. La herramienta CLI será accesible mediante el comando ghostbuster.
Esto requiere un entorno 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.
Comandos de ejemplo
Ejecuta Ghostbuster con acceso a registros DNS de Cloudflare, envía notificaciones a un webhook de Slack, itera a través de cada perfil de AWS configurado en .aws/config o .aws/credentials para todas las regiones de AWS
❯ ghostbuster scan aws --cloudflaretoken APIKEY --slackwebhook https://hooks.slack.com/services/KEY --allregions
Ejecuta Ghostbuster con una lista ingresada manualmente de registros A de subdominios (consulta records.csv en este repositorio para un archivo de ejemplo):
❯ ghostbuster scan aws --records records.csv
Puedes especificar regiones específicas usando --regions configurado con una lista separada por comas de regiones, p.ej. 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']}
El primer paso es crear claves o roles en tus cuentas AWS que otorguen los privilegios necesarios para leer registros Route53 y describir direcciones elásticas e interfaces de red EC2.
Access key - Programmatic access y haz clic en Next: Permissions.Attach existing policies directly y luego en Create policy.JSON y luego pega la siguiente 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 y luego en Next: Review.GhostbusterPolicy.Create Policy.GhostbusterPolicy.Next: Tags y luego en Next: Review.Create user y configura las credenciales AWS en tu archivo .aws/credentials.Repite los pasos anteriores para cada cuenta AWS que poseas.
Esta herramienta funcionará con cualquier configuración de AWS que hayas establecido (múltiples claves o perfiles de asunción de roles entre cuentas). Esto es gestionado por boto3, la librería utilizada para interactuar con AWS.
Un ejemplo de configuración se ve así:
.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, en lugar de tener roles que se asumen, también puedes configurar el archivo .aws/credentials para que tenga una lista de perfiles y claves asociadas con acceso limitado.
Una vez que tu configuración de AWS se haya establecido con todas las cuentas de tu entorno AWS, puedes ejecutar la herramienta usando el siguiente comando:
Ghostbuster puede usar roles en lugar de perfiles, lo que elimina la necesidad de tener tantas credenciales en un solo lugar. Sin embargo, el enfoque de roles requerirá crear políticas IAM adicionales dentro de tu organización.
Los roles se pueden usar mediante las banderas --roles roles.csv o --autoroles. Para configurar --roles para que funcione, es necesario crear el rol GhostbusterTargetAccountRole exactamente con ese nombre en cada cuenta que se va a escanear:
{
"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 se ejecutará en lambda/ec2/etc. con el rol ghostbuster - llamémoslo rol maestro de ghostbuster. El rol maestro debe poder asumir los roles de las cuentas objetivo.
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"
}
}
El descubrimiento automático de cuentas requiere permisos adicionales en comparación con --roles. Después de configurar --roles para que funcione, considera agregar la siguiente política IAM en una cuenta que tenga una visión general de la organización:
{
sid = "BaseAccess"
actions = [
"organizations:DescribeAccount",
"organizations:ListAccounts"
]
resources = ["*"]
effect = "Allow"
}
}
Luego, en la cuenta que ejecuta ghostbuster, adjunta la siguiente política al rol maestro de ghostbuster para que pueda asumir el rol de búsqueda de la organización:
{
"Version" : "2012-10-17",
"Statement" : [
{
"Effect" : "Allow",
"Action" : "sts:AssumeRole",
"Resource" : ["arn:aws:iam::ORG_LOOKUP_ACCOUNT_ID:role/ghostbuster-org-role"]
}]
}
No olvides reemplazar ORG_LOOKUP_ACCOUNT_ID con el ID de cuenta real.
Si deseas que Ghostbuster obtenga todos los registros A que tienes configurados en Cloudflare, deberás configurar un token de API que pueda leer zonas.
https://dash.cloudflare.com/profile/api-tokens
Configura un token de API de Cloudflare como se muestra en la captura de pantalla a continuación:

Una vez que hayas obtenido este token de API, anótalo en algún lugar (gestor de contraseñas). Para usarlo con Ghostbuster, pásalo mediante el argumento cloudflaretoken.
Consulta también la lista de contribuidores que participaron en este proyecto.
GNU Affero General Public License
pip3 install virtualenvvirtualenv venv. venv/bin/activatepip3 install --editable .