
Éliminez les adresses IP élastiques orphelines en effectuant une analyse de vos ressources dans tous vos comptes AWS.
Éliminez les adresses IP élastiques pendantes en effectuant une analyse de vos ressources dans tous vos comptes AWS.
Ghostbuster récupère tous les enregistrements DNS présents dans tous vos comptes AWS (Route53), et peut éventuellement prendre en compte des enregistrements via une entrée CSV ou via Cloudflare.
Après avoir collecté ces enregistrements, Ghostbuster parcourt toutes vos adresses IP élastiques AWS et les IP publiques des interfaces réseau et collecte ces données.
En ayant une image complète des enregistrements DNS (depuis Route53, une entrée fichier ou Cloudflare) et une image complète des IP AWS appartenant à votre organisation, cet outil peut détecter les sous-domaines pointant vers des adresses IP élastiques pendantes (des IP que vous ne possédez plus).
Lorsque vous déployez une infrastructure sur AWS, vous pouvez créer des instances EC2 avec une IP associée. Si vous créez des enregistrements DNS pointant vers ces IP, mais oubliez de supprimer les enregistrements DNS après que l'instance EC2 ait reçu une nouvelle IP ou ait été détruite, vous êtes vulnérable aux attaques de prise de contrôle de sous-domaine.
Des recherches approfondies ont été menées sur les prises de contrôle d'IP élastiques, où il est possible pour des attaquants de revendiquer continuellement des IP élastiques jusqu'à obtenir une IP associée à un sous-domaine de l'entreprise ciblée.
Bien qu'AWS bannisse fréquemment les comptes qui tentent d'exécuter ce schéma d'attaque, aucun correctif à long terme n'a été publié par AWS.
L'impact des attaques de prise de contrôle de sous-domaine par IP élastique pendante est plus grave qu'une prise de contrôle de sous-domaine classique où vous ne pouvez contrôler que le contenu servi. Avec les prises de contrôle d'IP élastique pendante, un attaquant peut potentiellement :
*.domain.com.aws/configImportant :
Pour que cet outil soit efficace, il doit avoir une image complète de votre environnement AWS. S'il n'a pas une image complète, cela entraînera des faux positifs.
Installer Ghostbuster est aussi simple que d'exécuter : pip install ghostbuster. L'outil en ligne de commande sera alors accessible via la commande ghostbuster.
Cela nécessite un environnement 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.
Exemples de commandes
Exécutez Ghostbuster avec un accès aux enregistrements DNS Cloudflare, envoyez des notifications à un webhook Slack, parcourez chaque profil AWS configuré dans .aws/config ou .aws/credentials pour toutes les régions AWS :
❯ ghostbuster scan aws --cloudflaretoken APIKEY --slackwebhook https://hooks.slack.com/services/KEY --allregions
Exécutez Ghostbuster avec une liste manuelle d'enregistrements A de sous-domaine (voir records.csv dans ce dépôt pour un exemple de fichier) :
❯ ghostbuster scan aws --records records.csv
Vous pouvez spécifier des régions particulières avec --regions défini sur une liste séparée par des virgules, par exemple 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']}
La première étape consiste à créer des clés ou des rôles dans vos comptes AWS qui accordent les privilèges nécessaires pour lire les enregistrements Route53 et décrire les adresses élastiques et les interfaces réseau EC2.
Access key - Programmatic access, puis cliquez sur Next: Permissions.Attach existing policies directly, puis sur Create policy.JSON, puis collez la politique suivante :{
"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, puis sur Next: Review.GhostbusterPolicy.Create Policy.GhostbusterPolicy.Next: Tags, puis sur Next: Review.Create user et configurez les identifiants AWS dans votre fichier .aws/credentials.Répétez les étapes ci-dessus pour chaque compte AWS que vous possédez.
Cet outil fonctionnera quelle que soit la façon dont vous avez configuré votre environnement AWS (plusieurs clés, ou profils avec assumer un rôle cross-compte). Cela est géré par boto3, la bibliothèque utilisée pour interagir avec AWS.
Un exemple de configuration ressemble à ceci :
.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
Alternativement, au lieu d'avoir des rôles qui sont assumés, vous pouvez également configurer le fichier .aws/credentials pour avoir une liste de profils et de clés associées avec un accès limité.
Une fois votre configuration AWS définie avec tous les comptes de votre environnement AWS, vous pouvez exécuter l'outil en utilisant la commande suivante :
Ghostbuster peut utiliser des rôles au lieu de profils, ce qui évite d'avoir autant d'identifiants au même endroit. Cependant, l'approche par rôles nécessitera la création de politiques IAM supplémentaires dans votre organisation.
Les rôles peuvent être utilisés via les indicateurs --roles roles.csv ou --autoroles. Pour que --roles fonctionne, il faut créer le rôle GhostbusterTargetAccountRole nommé exactement comme cela dans chaque compte qui est scanné :
{
"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 s'exécutera dans lambda/ec2/autre avec le rôle ghostbuster - appelons-le rôle maître ghostbuster. Le rôle maître doit pouvoir assumer les rôles des comptes cibles (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"
}
}
La découverte automatique de comptes nécessite une permission supplémentaire par rapport à --roles. Après avoir configuré --roles pour fonctionner, considérez ajouter la politique IAM suivante dans un compte qui a une vue d'ensemble de l'organisation :
{
sid = "BaseAccess"
actions = [
"organizations:DescribeAccount",
"organizations:ListAccounts"
]
resources = ["*"]
effect = "Allow"
}
}
Ensuite, dans le compte qui exécute ghostbuster, attachez la politique suivante au rôle maître ghostbuster afin qu'il puisse assumer le rôle de consultation de l'organisation :
{
"Version" : "2012-10-17",
"Statement" : [
{
"Effect" : "Allow",
"Action" : "sts:AssumeRole",
"Resource" : ["arn:aws:iam::ORG_LOOKUP_ACCOUNT_ID:role/ghostbuster-org-role"]
}]
}
N'oubliez pas de remplacer ORG_LOOKUP_ACCOUNT_ID par l'ID réel du compte.
Si vous voulez que Ghostbuster récupère tous les enregistrements A que vous avez définis dans Cloudflare, vous devez configurer un jeton API capable de lire les zones.
https://dash.cloudflare.com/profile/api-tokens
Configurez un jeton API Cloudflare comme indiqué dans la capture d'écran ci-dessous :

Une fois que vous avez obtenu ce jeton API, notez-le quelque part (gestionnaire de mots de passe). Pour l'utiliser avec Ghostbuster, passez-le via l'argument cloudflaretoken.
Voir aussi la liste des contributeurs qui ont participé à ce projet.
GNU Affero General Public License
pip3 install virtualenvvirtualenv venv. venv/bin/activatepip3 install --editable .