
قم بالتخلص من عناوين Elastic IPs العالقة عن طريق إجراء تحليل على مواردك داخل جميع حسابات AWS الخاصة بك.
قم بإزالة عناوين IP المرنة العالقة (dangling elastic IPs) عن طريق تحليل مواردك داخل جميع حسابات AWS الخاصة بك.
يحصل Ghostbuster على جميع سجلات DNS الموجودة في جميع حسابات AWS الخاصة بك (Route53)، ويمكنه اختياريًا استقبال السجلات عبر إدخال CSV، أو عبر Cloudflare.
بعد جمع هذه السجلات، يتنقل Ghostbuster عبر جميع عناوين IP المرنة في AWS وعناوين IP العامة لواجهات الشبكة ويجمع هذه البيانات.
من خلال الحصول على صورة كاملة لسجلات DNS (من route53 أو إدخال ملف أو cloudflare) وصورة كاملة لعناوين IP الخاصة بـ AWS التي تمتلكها مؤسستك، يمكن لهذه الأداة اكتشاف النطاقات الفرعية التي تشير إلى عناوين IP مرنة عالقة (عناوين IP لم تعد تمتلكها).
عند نشر بنية تحتية على AWS، قد تقوم بتشغيل مثيلات EC2 لها عنوان IP مرتبط بها. عندما تُنشئ سجلات DNS تشير إلى عناوين IP هذه، لكنك تنسى إزالة سجلات DNS بعد تغيير عنوان IP لمثيل EC2 أو تدميره، فأنت عرضة لهجمات اختطاف النطاق الفرعي.
تم إجراء قدر كبير من الأبحاث حول عمليات الاستيلاء على عناوين IP المرنة، حيث يمكن للمهاجمين المطالبة بعناوين IP مرنة باستمرار حتى يحصلوا على عنوان IP مرتبط بنطاق فرعي للشركة التي يستهدفونها.
بينما تقوم AWS بشكل متكرر بحظر الحسابات التي تحاول تنفيذ نمط الهجوم هذا، لم يتم إصدار إصلاح طويل الأمد من AWS.
تأثير هجمات اختطاف النطاق الفرعي لعناوين IP المرنة العالقة أكثر خطورة من اختطاف النطاق الفرعي النموذجي حيث يمكنك فقط التحكم في المحتوى الذي يتم تقديمه. مع عمليات الاستيلاء على عناوين IP المرنة العالقة، يمكن للمهاجم القيام بما يلي:
*.domain.com.aws/configهام:
لكي تكون هذه الأداة فعالة، يجب أن يكون لديها صورة كاملة لبيئة AWS الخاصة بك. إذا لم تكن لديها صورة كاملة، فسيؤدي ذلك إلى نتائج إيجابية خاطئة.
تثبيت Ghostbuster بسيط مثل تشغيل: pip install ghostbuster. ستكون أداة CLI بعد ذلك متاحة عبر الأمر ghostbuster.
يتطلب هذا بيئة Python 3.x.
❯ ghostbuster scan aws --help
Usage: ghostbuster scan aws [OPTIONS]
افحص عناوين IP المرنة العالقة داخل حسابات AWS الخاصة بك.
Options:
--profile TEXT حدد ملف تعريف AWS معين لتشغيل ghostbuster عليه.
--skipascii تخطي طباعة الفن ASCII عند بدء تشغيل Ghostbuster.
--json إرجاع كائن JSON فقط.
--slackwebhook TEXT حدد عنوان URL لـ Slack webhook لإرسال إشعارات حول
عمليات الاستيلاء المحتملة.
--records PATH حدد يدويًا سجلات DNS للتحقق منها.
سيتحقق Ghostbuster من عناوين IP هذه بعد التحقق
من سجلات DNS المستردة. راجع records.csv كمثال.
--cloudflaretoken TEXT اسحب سجلات DNS من Cloudflare، قدم رمز API لـ CF.
--allregions التشغيل على جميع المناطق.
--exclude TEXT قائمة مفصولة بفواصل بأسماء الملفات الشخصية
لاستثنائها.
--regions TEXT قائمة مفصولة بفواصل بالمناطق للتشغيل عليها.
--help عرض هذه الرسالة والخروج.
أوامر مثال
قم بتشغيل Ghostbuster مع إمكانية الوصول إلى سجلات Cloudflare DNS، وأرسل الإشعارات إلى 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
الحصول على جميع أسماء المناطق من Cloudflare.
الحصول على سجلات DNS A لجميع المناطق من Cloudflare.
تم الحصول على 33 سجل DNS A حتى الآن.
الحصول على مناطق Route53 المستضافة لملف تعريف AWS: default.
الحصول على مناطق Route53 المستضافة لملف تعريف AWS: account-five.
الحصول على مناطق Route53 المستضافة لملف تعريف AWS: account-four.
الحصول على مناطق Route53 المستضافة لملف تعريف AWS: account-four-deploy.
الحصول على مناطق Route53 المستضافة لملف تعريف AWS: account-two-deploy.
الحصول على مناطق Route53 المستضافة لملف تعريف AWS: account-one-deploy.
الحصول على مناطق Route53 المستضافة لملف تعريف AWS: account-three-deploy.
الحصول على مناطق Route53 المستضافة لملف تعريف AWS: account-six.
الحصول على مناطق Route53 المستضافة لملف تعريف AWS: account-seven.
الحصول على مناطق Route53 المستضافة لملف تعريف AWS: account-one.
تم الحصول على 124 سجل DNS A حتى الآن.
الحصول على EIPs للمنطقة: us-east-1، ملف التعريف: default
الحصول على عناوين IP لواجهات الشبكة للمنطقة: us-east-1، ملف التعريف: default
الحصول على EIPs للمنطقة: us-east-1، ملف التعريف: account-five
الحصول على عناوين IP لواجهات الشبكة للمنطقة: us-east-1، ملف التعريف: account-five
الحصول على EIPs للمنطقة: us-east-1، ملف التعريف: account-four
الحصول على عناوين IP لواجهات الشبكة للمنطقة: us-east-1، ملف التعريف: account-four
الحصول على EIPs للمنطقة: us-east-1، ملف التعريف: account-four-deploy
الحصول على عناوين IP لواجهات الشبكة للمنطقة: us-east-1، ملف التعريف: account-four-deploy
الحصول على EIPs للمنطقة: us-east-1، ملف التعريف: account-two-deploy
الحصول على عناوين IP لواجهات الشبكة للمنطقة: us-east-1، ملف التعريف: account-two-deploy
الحصول على EIPs للمنطقة: us-east-1، ملف التعريف: account-one-deploy
الحصول على عناوين IP لواجهات الشبكة للمنطقة: us-east-1، ملف التعريف: account-one-deploy
الحصول على EIPs للمنطقة: us-east-1، ملف التعريف: account-three-deploy
الحصول على عناوين IP لواجهات الشبكة للمنطقة: us-east-1، ملف التعريف: account-three-deploy
الحصول على EIPs للمنطقة: us-east-1، ملف التعريف: account-six
الحصول على عناوين IP لواجهات الشبكة للمنطقة: us-east-1، ملف التعريف: account-six
الحصول على EIPs للمنطقة: us-east-1، ملف التعريف: account-seven
الحصول على عناوين IP لواجهات الشبكة للمنطقة: us-east-1، ملف التعريف: account-seven
الحصول على EIPs للمنطقة: us-east-1، ملف التعريف: account-one
الحصول على عناوين IP لواجهات الشبكة للمنطقة: us-east-1، ملف التعريف: account-one
تم الحصول على 415 عنوان IP مرن فريد من AWS.
إمكانية الاستيلاء: {'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 الرئيسي. يجب أن يكون الدور الرئيسي قادرًا على افتراض أدوار الحساب المستهدف.
resource "aws_iam_policy" "ghostbuster_target_account_roles" {
name = "ghostbuster_target_account_roles"
path = "/"
description = "السماح بفحص DNS وبيانات IP المرنة."
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 بمعرف الحساب الفعلي.
إذا كنت تريد أن يسحب Ghostbuster جميع سجلات A التي قمت بتعيينها في Cloudflare، فستحتاج إلى إعداد رمز API يمكنه قراءة المناطق.
https://dash.cloudflare.com/profile/api-tokens
قم بإعداد رمز API لـ Cloudflare كما هو موضح في لقطة الشاشة أدناه:

بمجرد الحصول على رمز API هذا، قم بتدوينه في مكان ما (مدير كلمات المرور). لاستخدامه مع Ghostbuster، قم بتمريره عبر وسيطة cloudflaretoken.
راجع أيضًا قائمة المساهمين الذين شاركوا في هذا المشروع.
رخصة GNU Affero العامة العامة
pip3 install virtualenvvirtualenv venv. venv/bin/activatepip3 install --editable .