
Beseitigen Sie ungenutzte Elastic IPs, indem Sie eine Analyse Ihrer Ressourcen in allen Ihren AWS-Konten durchführen.
Beseitigen Sie herrenlose elastische IPs, indem Sie eine Analyse Ihrer Ressourcen in allen Ihren AWS-Konten durchführen.
Ghostbuster ruft alle DNS-Einträge ab, die in all Ihren AWS-Konten (Route53) vorhanden sind, und kann optional Einträge über CSV-Eingabe oder über Cloudflare aufnehmen.
Nachdem diese Einträge gesammelt wurden, durchläuft Ghostbuster alle Ihre AWS-Elastic-IPs und öffentlichen IPs von Netzwerkschnittstellen und sammelt diese Daten.
Durch ein vollständiges Bild der DNS-Einträge (von Route53, Dateieingabe oder Cloudflare) und ein vollständiges Bild der Ihrem Unternehmen gehörenden AWS-IPs kann dieses Tool Subdomains erkennen, die auf herrenlose elastische IPs verweisen (IPs, die Sie nicht mehr besitzen).
Wenn Sie Infrastruktur auf AWS bereitstellen, starten Sie möglicherweise EC2-Instanzen, denen eine IP zugeordnet ist. Wenn Sie DNS-Einträge erstellen, die auf diese IPs verweisen, aber vergessen, die DNS-Einträge zu entfernen, nachdem die EC2-Instanz eine neue IP erhalten oder gelöscht wurde, sind Sie anfällig für Subdomain-Übernahmeangriffe.
Es gab eine große Menge an Forschung zu Elastic-IP-Übernahmen, bei denen Angreifer kontinuierlich elastische IPs beanspruchen können, bis sie eine IP erhalten, die mit einer Subdomain des von ihnen anvisierten Unternehmens verbunden ist.
Während AWS häufig Konten sperrt, die versuchen, dieses Angriffsmuster durchzuführen, wurde von AWS keine langfristige Lösung veröffentlicht.
Die Auswirkungen von Subdomain-Übernahmeangriffen durch herrenlose elastische IPs sind schwerwiegender als bei einer typischen Subdomain-Übernahme, bei der Sie nur den ausgelieferten Inhalt kontrollieren können. Bei Elastic-IP-Übernahmen ist es einem Angreifer möglich, Folgendes zu tun:
*.domain.com beschränkt sind.aws/config konfigurierte AWS-ProfilWichtig:
Damit dieses Tool effektiv ist, muss es ein vollständiges Bild Ihrer AWS-Umgebung haben. Wenn es kein vollständiges Bild hat, führt dies zu Fehlalarmen.
Ghostbuster zu installieren ist so einfach wie das Ausführen von: pip install ghostbuster. Das CLI-Tool ist dann über den Befehl ghostbuster verfügbar.
Dies erfordert eine Python 3.x-Umgebung.
❯ 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.
Beispielbefehle
Ghostbuster mit Zugriff auf Cloudflare-DNS-Einträge ausführen, Benachrichtigungen an einen Slack-Webhook senden, jedes in .aws/config oder .aws/credentials konfigurierte AWS-Profil für alle AWS-Regionen durchlaufen:
❯ ghostbuster scan aws --cloudflaretoken APIKEY --slackwebhook https://hooks.slack.com/services/KEY --allregions
Ghostbuster mit einer manuell eingegebenen Liste von Subdomain-A-Einträgen ausführen (siehe records.csv in diesem Repository für eine Beispieldatei):
❯ ghostbuster scan aws --records records.csv
Sie können mit --regions bestimmte Regionen angeben, die auf eine kommagetrennte Liste von Regionen gesetzt werden, z.B. 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']}
Der erste Schritt ist das Erstellen von Schlüsseln oder Rollen in Ihren AWS-Konten, die die erforderlichen Berechtigungen zum Lesen von Route53-Einträgen und zum Beschreiben von elastischen Adressen und EC2-Netzwerkschnittstellen gewähren.
Access key - Programmatic access aus und klicken Sie auf Next: Permissions.Attach existing policies directly und dann auf Create policy.JSON und fügen Sie die folgende Richtlinie ein:{
"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 und dann auf Next: Review.GhostbusterPolicy.Create Policy.GhostbusterPolicy aus.Next: Tags und dann auf Next: Review.Create user und richten Sie die AWS-Anmeldedaten in Ihrer .aws/credentials-Datei ein.Wiederholen Sie die obigen Schritte für jedes AWS-Konto, das Sie besitzen.
Dieses Tool funktioniert mit der Art und Weise, wie Sie Ihre AWS-Konfiguration eingerichtet haben (mehrere Schlüssel oder Profile mit rollenübergreifendem Assume-Role). Dies wird von boto3 verwaltet, der Bibliothek, die für die Schnittstelle zu AWS verwendet wird.
Eine Beispielkonfiguration sieht wie folgt aus:
.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
Alternativ können Sie anstelle von Rollen, die angenommen werden, auch die .aws/credentials-Datei so konfigurieren, dass sie eine Liste von Profilen und zugehörigen Schlüsseln mit eingeschränktem Zugriff enthält.
Sobald Ihre AWS-Konfiguration mit allen Konten in Ihrer AWS-Umgebung eingerichtet ist, können Sie das Tool mit dem folgenden Befehl ausführen:
Ghostbuster kann Rollen anstelle von Profilen verwenden, was die Notwendigkeit vieler Anmeldeinformationen an einem Ort überflüssig macht. Der Rollenansatz erfordert jedoch das Erstellen zusätzlicher IAM-Richtlinien innerhalb Ihrer Organisation.
Rollen können über die Flags --roles roles.csv oder --autoroles verwendet werden. Damit --roles funktioniert, muss in jedem Konto, das gescannt wird, eine Rolle namens GhostbusterTargetAccountRole genau so benannt erstellt werden:
{
"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 wird in Lambda/EC2/whatever mit der Rolle ghostbuster ausgeführt – nennen wir sie Ghostbuster-Master-Rolle. Die Master-Rolle muss in der Lage sein, TargetAccountRoles anzunehmen.
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"
}
}
Die automatische Kontoerkennung erfordert im Vergleich zu --roles zusätzliche Berechtigungen. Nachdem Sie --roles eingerichtet haben, sollten Sie die folgende IAM-Richtlinie in einem Konto hinzufügen, das eine Organisationsübersicht hat:
{
sid = "BaseAccess"
actions = [
"organizations:DescribeAccount",
"organizations:ListAccounts"
]
resources = ["*"]
effect = "Allow"
}
}
Fügen Sie dann in dem Konto, das Ghostbuster ausführt, die folgende Richtlinie an die Ghostbuster-Master-Rolle an, damit sie die Organisations-Lookup-Rolle annehmen kann:
{
"Version" : "2012-10-17",
"Statement" : [
{
"Effect" : "Allow",
"Action" : "sts:AssumeRole",
"Resource" : ["arn:aws:iam::ORG_LOOKUP_ACCOUNT_ID:role/ghostbuster-org-role"]
}]
}
Vergessen Sie nicht, ORG_LOOKUP_ACCOUNT_ID durch die tatsächliche Konto-ID zu ersetzen.
Wenn Ghostbuster alle A-Einträge abrufen soll, die Sie in Cloudflare eingerichtet haben, müssen Sie einen API-Token einrichten, der Zonen lesen kann.
https://dash.cloudflare.com/profile/api-tokens
Richten Sie einen Cloudflare-API-Token wie im folgenden Screenshot ein:

Sobald Sie diesen API-Token erhalten haben, notieren Sie ihn sich (Passwortmanager). Um ihn mit Ghostbuster zu verwenden, übergeben Sie ihn über das cloudflaretoken-Argument.
Siehe auch die Liste der Mitwirkenden, die an diesem Projekt teilgenommen haben.
GNU Affero General Public License
pip3 install virtualenvvirtualenv venv. venv/bin/activatepip3 install --editable .