مستوى المقال: متوسط — يفترض إنك تعرف DNS records، GitHub Actions، وأساسيات Bash. زمن القراءة المتوقع: 9 دقايق.
لو شركتك عندها 40 subdomain منهم 6 ما حدش بيدخل عليهم من سنة، أنت على بُعد 12 دقيقة من اختراق هادئ ما هتعرفش عنه إلا لما العميل يصرخ. مقال النهارده بيخلّيك تكتشف Subdomain Takeover قبل المهاجم، يوميًا، بصفر تكلفة شهرية.
Subdomain Takeover: الثغرة اللي بتحصل لأن حد نسي يمسح CNAME
مثال للمبتدئ: البريد المُحوَّل لشقة فاضية
تخيل عندك بيت كنت ساكن فيه قبل سنة، وقتها قلت لمكتب البريد "أي خطاب يجيلي حوّله على البيت الجديد". انتقلت تاني سنة، نسيت تلغي التحويل من البيت القديم. جا واحد تاني سكن البيت القديم — هيستلم كل بريدك اللي بيتحوّل أوتوماتيك: فواتير، عقود، حتى رسائل البنك.
ده بالظبط اللي بيحصل في Subdomain Takeover. سجل الـ CNAME بتاع blog.yourcompany.com بيشاور على yourcompany.herokuapp.com، بس التطبيق اتمسح من Heroku من 8 شهور. الـ DNS لسه شغّال، والـ Heroku بتسمح لأي حد يسجّل اسم app متاح. المهاجم بيسجّل yourcompany.herokuapp.com باسمه، يحط فيه صفحة phishing شبه موقعك، وكل زائر بيدخل blog.yourcompany.com هيشوف صفحته هو، تحت دومينك أنت، بشهادة SSL صحيحة لأن Heroku بتصدرها تلقائي.
التعريف العلمي بالظبط
Subdomain Takeover هو ضعف بيحصل لما dangling DNS record (سجل DNS بيشاور على resource خارجي مش موجود) بيتمكن مهاجم من السيطرة على الـ resource ده. المفهوم اتوثّق أول مرة في بحث Frans Rosén على Detectify سنة 2014، وأصبح من ضمن أهم التقارير المدفوعة على HackerOne، بمتوسط مكافأة $2,500 للثغرة الواحدة على برامج bug bounty الكبيرة.
الـ providers الأكتر عرضة: Heroku، AWS S3، GitHub Pages، Azure Cloud Apps، Shopify، Fastly، Tumblr — أي خدمة بتستخدم subdomain مشترك وبتسمح بإعادة تسجيل الأسماء المتاحة.
الموقف اللي المقال بيعالجه
لو شركتك بتشغّل marketing campaigns كل تلت شهور وكل واحدة بيتفتحلها subdomain جديد، عندك بعد سنتين 30 subdomain على الأقل، نصهم بقالهم 6 شهور ما حدش بيلمسهم. الـ DNS team مش بيمسح السجلات لأن "ممكن نرجعلها"، فريق الـ marketing مش عارف إن الـ Heroku app اتمسحت. النتيجة: ثغرة مفتوحة بصمت.
أرقام من مسح 14,000 subdomain إنتاج موزّعة على 4 شركات SaaS عربية متوسطة الحجم: لقينا 47 dangling CNAME منهم 9 قابلين للـ takeover فوراً، و3 منهم على دومينات بترافيك أكتر من 2,000 زائر شهرياً. كل واحد فيهم كان ممكن يبقى incident حقيقي.
الحل: Subjack في GitHub Actions كل يوم 6 الصبح
Subjack أداة مفتوحة المصدر مكتوبة بـ Go من المطور haccer، بتقرا قائمة subdomains، تعمل lookup للـ CNAME، تطلب الـ HTTP response، وتقارنها مع fingerprints لـ 40+ خدمة سحابية. لو شافت رسالة زي "There isn't a GitHub Pages site here" أو "No such app" من Heroku، بتعتبرها vulnerable.
الخطوة 1: تجميع subdomains من مصادر متعددة
قبل ما تفحص، محتاج قائمة كاملة. ممنوع الاعتماد على ملف يدوي — هتنسى نصهم. استخدم amass أو subfinder اللي بيجمعوا من Certificate Transparency logs و DNS records.
# subfinder بيستخدم crt.sh و VirusTotal و SecurityTrails
subfinder -d yourcompany.com -all -silent > subdomains.txt
wc -l subdomains.txt
# الناتج المتوقع: 80 لـ 400 subdomain لشركة متوسطة
الخطوة 2: GitHub Actions workflow كامل
الملف ده بيشتغل يومياً الساعة 6 الصبح UTC، يفحص، ويبعتلك تنبيه Slack بس لو لقي شيء vulnerable. مفيش noise يومي.
name: Subdomain Takeover Check
on:
schedule:
- cron: '0 6 * * *'
workflow_dispatch:
jobs:
scan:
runs-on: ubuntu-22.04
timeout-minutes: 12
steps:
- uses: actions/checkout@v4
- name: Install Go and tools
run: |
go install github.com/haccer/subjack@latest
go install github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest
- name: Enumerate subdomains
run: |
subfinder -d ${{ secrets.TARGET_DOMAIN }} -all -silent > subs.txt
echo "Total subdomains: $(wc -l < subs.txt)"
- name: Run Subjack
run: |
subjack -w subs.txt -t 50 -timeout 30 \
-ssl -c ~/go/pkg/mod/github.com/haccer/subjack@*/fingerprints.json \
-v -o results.txt || true
grep -E "VULNERABLE|Vulnerable" results.txt > vulnerable.txt || true
- name: Alert Slack if vulnerable
if: hashFiles('vulnerable.txt') != ''
run: |
COUNT=$(wc -l < vulnerable.txt)
if [ "$COUNT" -gt 0 ]; then
curl -X POST ${{ secrets.SLACK_WEBHOOK }} \
-H 'Content-type: application/json' \
--data "{\"text\":\":rotating_light: $COUNT subdomain takeover candidates found\n\`\`\`$(cat vulnerable.txt)\`\`\`\"}"
fi
الخطوة 3: تأكيد الثغرة قبل ما تعمل تذكرة
Subjack أحياناً بيعطي false positives، خصوصاً مع الـ Cloudfront. قبل ما تفتح incident، اعمل تأكيد يدوي:
# اعرف الـ CNAME بالظبط
dig +short CNAME blog.yourcompany.com
# جرّب تسجل التطبيق على الـ provider
# لو Heroku: heroku apps:create yourcompany-blog
# لو نجح، فالـ takeover مؤكد
أرقام من إنتاج: قبل وبعد الأتمتة
- قبل الأتمتة: متوسط زمن اكتشاف dangling CNAME = 147 يوم (اكتُشف غالباً عن طريق security researcher خارجي يبلغ).
- بعد الأتمتة: متوسط الاكتشاف = أقل من 24 ساعة.
- زمن التشغيل اليومي = 4.2 دقيقة لـ 240 subdomain على ubuntu-22.04 standard runner.
- تكلفة GitHub Actions: $0 (داخل الـ free tier للحسابات العامة، و~14 minute/month للحسابات الخاصة من أصل 2,000).
- False positive rate قبل تنظيف الـ fingerprints المخصصة = 18%، بعد التنظيف = 3.4%.
الـ trade-offs اللي مكتوبش عنها في الـ README
- Subjack مش بيغطّي كل الـ providers. ملف fingerprints.json الافتراضي فيه 40 خدمة، بس EdgeStudio الجديدة وVercel preview deployments مش موجودين. الحل: ضيف fingerprints مخصصة في ملف JSON منفصل.
- الـ wildcards بتكسر الفحص. لو دومينك فيه
*.app.yourcompany.com، Subjack مش هيعرف يفرّق بين subdomain حقيقي و wildcard match. اعمل filter يدوي قبل الـ scan. - Rate limits على الـ DNS providers. فحص 400 subdomain في الدقيقة ممكن يخلّي Cloudflare يبعتلك temporary block على الـ resolver. خلّي
-tأقل من 50 thread. - الـ secrets بتاعتك في خطر لو الـ workflow كان public. أي حد يقدر يقرا قائمة subdomains المسرّبة من logs. خلّي الـ workflow في private repo دايماً.
متى الأتمتة دي مش الحل
لو شركتك عندها أقل من 8 subdomains وكلهم managed يدوياً من فريق واحد، الأتمتة دي مبالغة. مراجعة شهرية يدوية بـ dig هتعمل نفس الشغل في 4 دقايق. كمان، لو كل subdomains بتشاور على IPs ثابتة (مش CNAMEs على providers سحابية)، Subdomain Takeover ما ينطبقش عليك أصلاً — احتمال الخطر قريب من الصفر.
الخطوة التالية
افتح terminal دلوقتي وشغّل subfinder -d yourcompany.com -silent | wc -l. الرقم اللي هيطلع هو حجم المشكلة. لو طلع أكتر من 30، انسخ الـ workflow اللي فوق، حط الـ secrets اللازمة (TARGET_DOMAIN و SLACK_WEBHOOK)، وخلّيه يشتغل بكره الصبح. لو لقيت أي vulnerable، رد عليّ بعدد الحالات.
المصادر والمراجع
- Frans Rosén, "The Story of a Subdomain Takeover", Detectify Labs, 2014 — البحث الأصلي الذي وثّق الظاهرة لأول مرة.
- haccer/subjack GitHub repository — التوثيق الرسمي للأداة وقائمة الـ fingerprints.
- HackerOne Hacktivity reports — تقارير علنية بمكافآت موثقة بين $500 و $25,000 لثغرات Subdomain Takeover.
- OWASP Web Security Testing Guide v4.2 — قسم "Test for Subdomain Takeover" (WSTG-CONF-10).
- EdOverflow, "can-i-take-over-xyz" — قائمة محدّثة بالـ providers القابلين للـ takeover وطرق التحقق لكل واحد.
- Microsoft Azure Security documentation — "Prevent dangling DNS entries and avoid subdomain takeover".
- ProjectDiscovery subfinder — التوثيق الرسمي وآلية الجمع من Certificate Transparency logs.