
يكتشف خدمات SaaS التي تشترك فيها المؤسسة، باستخدام البيانات القابلة للملاحظة خارجيًا فقط. مصمم لاكتشاف تكنولوجيا المعلومات الظلية.
▄▄▓▓▓▓▓▓▓▓▓▄▄
▄▓▓▒▒▒▒▒▒▒▒▒▒▒▓▓▄ Yowie · تتبّع خدمات SaaS التي لم يخبرك بها أحد
▓▓▒▒░░░░░░░░░░░▒▒▓▓
▓▒░░ ● ● ░▒▓ Domain acme.com.au
▓▒░░ ▼ ░▒▓ Candidates acme, acmecorp
▓▓▒░░ ╰───╯ ░▒▓▓
▀▓▓▒▒░░░░░░░░░▒▒▓▓▀
▀▀▓▓▓▓▓▓▓▓▓▓▓▀▀
يكتشف خدمات SaaS التي تشترك فيها مؤسسة ما، باستخدام البيانات المرصودة خارجيًا فقط. صُمِّم لاكتشاف الظل الرقمي (shadow IT): فالخدمات الجديرة بالاكتشاف هي تلك التي لم يخبرك بها أحد.
سُمِّي على اسم مخلوق أسترالي أسطوري، لأنك تطارد شيئًا يصرّ الجميع على أنه غير موجود.

574 بصمة تغطي 412 مورّدًا عبر تسعة كواشف، إضافة إلى 104 بصمات مُعلَّقة بانتظار التأكيد. تُصنَّف النتائج، ويحمل كل اكتشاف السجل أو الاستجابة التي أنتجته.
go build -o yowie ./cmd/yowie
يتطلب Go 1.22 أو أحدث. حزم البصمات مضمّنة في الملف التنفيذي، لذا يكفي ملف واحد للنشر.
yowie [flags] <domain> [candidate ...]
النطاق (domain) هو النطاق الجذر للمؤسسة. المرشّحات (candidates) هي السلاسل القصيرة التي قد يكون مستأجر المورّد مسمّى بها — الأسماء التجارية، والاختصارات، والعلامات القديمة الموروثة من عمليات الاستحواذ. قدّم أكبر عدد ممكن منها؛ فكل واحد منها فرصة إضافية للعثور على مستأجر. وإن لم تُقدّم أيًا منها، يُستخدم أول مُسمّى من النطاق.
yowie acme.com.au acme acmecorp acmegroup
yowie -format html -o report.html acme.com.au acme
yowie -format json acme.com.au | jq '.findings[] | select(.confidence=="high")'
yowie -only dns,spf,dmarc -compact acme.com.au
yowie -signatures ./signatures -validate
| الكاشف | الإشارة |
|---|---|
dns | رموز التحقق TXT، وسجلات CNAME وMX وNS |
vanity | مستأجرون مستضافون لدى المورّد ومسمّون باسم المؤسسة (acme.zendesk.com) |
http | بصمات على مستوى طبقة التطبيق للخدمات التي لا أثر لها في DNS |
spf | مخطط تضمينات SPF الكامل، مع تتبّع التضمينات والتحويلات المتداخلة |
dmarc | وجهات تقارير DMARC المجمّعة والتحليلية |
bimi | استضافة شعار BIMI وشهادة العلامة الموثّقة |
mta-sts | محتويات سياسة MTA-STS |
tenant | معرّف مستأجر Microsoft، ومزوّد الهوية الموحّدة، والنطاقات الشقيقة |
ct | النطاقات الفرعية من سجلات شفافية الشهادات، بعد تحليلها ونسبها |
اختر باستخدام -only أو -skip، مثل -skip ct,http لتمريرة سريعة على DNS فقط.
يستحق الأخيران ملاحظة، لأنهما يجدان أشياء لا تستطيع قائمة بصمات أن تجدها.
tenant يسأل نقاط النهاية غير الموثّقة لدى Microsoft عن الجهة التي ينتمي
إليها النطاق. تُعيد معلومات الاتحاد في Autodiscover كل نطاق مرتبط بالمستأجر
نفسه، وهو ما يُظهر بانتظام وحدات الأعمال وعمليات الاستحواذ والعلامات
المهجورة. وكل واحد منها نطاق يستحق الفحص.
ct يقلب نموذج الاكتشاف. فكل الفحوصات الأخرى تسأل "هل تستخدم هذه
المؤسسة المورّد X؟" مقابل قائمة ثابتة، لذا لا يمكنها إلا العثور على مورّدين
كتب أحدهم بصمة لهم بالفعل. أما CT فيسأل "إلى ماذا وجّهت هذه المؤسسة نطاقاتها
الفرعية فعليًا؟" فالفريق الذي يشترك في منتج ويربط support.acme.com يحصل على
شهادة صادرة، وتلك الشهادة عامة ودائمة. وتُبلَّغ الأهداف التي لا تطابق أي بصمة
كخيوط (leads)، وهكذا تجد الشيء الذي لم تكن تعرف أنك تبحث عنه.
تُصنَّف النتائج، والتصنيف هو المقصد:
acme.blogspot.com هو acme الخاص بك.اتفاق كاشفين مستقلين على مورّد يرفع اكتشافًا محتملًا إلى مؤكَّد. ويحمل كل اكتشاف السجل أو الاستجابة الدقيقة التي أطلقته، لذا يكون التقرير قابلًا للدفاع عنه دون إعادة تشغيل الأداة.
وللترقية استثناء واحد، وهو الفرق بين "هذا المستأجر موجود" و"هذا المستأجر ملكك" — انظر ملاحظة نطاق الأسماء تحت الدقة.
يُسقط -no-unknown الخيوط غير المنسوبة إن أردت الإشارة فقط.
-format cli (الافتراضية)، وjson، وjsonl، وcsv، وhtml. استخدم -o
للكتابة إلى ملف. تقرير HTML مكتفٍ بذاته — بلا أصول خارجية — لذا يبقى صالحًا
عند إرساله بالبريد أو وضعه على قرص مشترك.
يذهب التقدّم إلى stderr والنتائج إلى stdout، لذا فإن
yowie -format json acme.com > out.json لا يزال يُظهر سطر تقدّم حيًّا.
توجد البصمات في signatures/*.yaml. والملف التنفيذي يضمّنها؛ أما
-signatures <dir> أو YOWIE_SIGNATURES=<dir> فيحمّل من القرص بدلًا من ذلك،
وهكذا تُجري التعديلات دون إعادة البناء.
version: 1
pack: dns-txt
description: "Domain-ownership verification tokens published as TXT records."
defaults:
confidence: high
signatures:
- id: txt-1password
vendor: "1Password"
category: "Identity & Secrets"
type: txt
query: "{domain}"
match:
contains: "1password-site-verification"
يتوسّع {domain} إلى النطاق الجذر، و{candidate} إلى كل سلسلة مرشّح. وتُقيَّم
البصمة التي تشير إلى {candidate} مرة واحدة لكل مرشّح.
| النوع | المطابقات | ملاحظات |
|---|---|---|
txt, cname, mx, ns | match.contains مقابل سجلات query | غير حساس لحالة الأحرف |
vanity_a, vanity_cname | مقارنة بخط الأساس؛ بلا كتلة match | يجب أن يحتوي query على {candidate} |
http | match.present أو match.absent أو match.status وحده | انظر معالجة الحالة أدناه |
spf_include | match.contains مقابل مخطط تضمينات SPF المحلول | |
dmarc_rua | match.contains مقابل وجهات تقارير DMARC | |
cname_target | query هو لاحقة استضافة مجرّدة | يُطبَّق على المضيفين المكتشفين بواسطة ct؛ و* يطابق مُسمّى واحدًا |
disabled: true يُعلّق بصمة دون فقدان البحث الذي يقف خلفها. وnotes: ينقل
إرشادات المحلّل إلى التقرير.
شغّل yowie -validate بعد التعديل. التحقق صارم — فمفتاح غير معروف خطأ، لا
عملية صامتة بلا أثر — كما تُفحص الحزم بواسطة go test، لذا لا يمكن لخطأ
مطبعي أن يكلّفك التغطية بصمت في كل فحص مستقبلي.
| الحزمة | المحتويات |
|---|---|
dns-txt, dns-cname, dns-mx | رموز التحقق وأسماء المضيفين المفوّضة. مفعّلة. |
email-spf, email-dmarc | المرسلون ومعالجات DMARC. مفعّلة. |
vanity-tenants, http-endpoints | أسماء مضيفي المستأجرين وبصمات التطبيقات. مفعّلة. |
cname-targets | لواحق الاستضافة للنطاقات الفرعية المكتشفة عبر CT. مفعّلة. |
ai-services | منصات الذكاء الاصطناعي والنماذج اللغوية. مُعلَّقة. |
file-transfer | نقل الملفات المُدار — MOVEit وGoAnywhere وEgnyte. مُعلَّقة. |
finance-procurement | المالية والمصروفات والرواتب والمشتريات. مُعلَّقة. |
security-grc | أدوات الأمن وأتمتة الامتثال. مُعلَّقة. |
graveyard | مدخلات غير موثّقة، ومنصات تعذّر تحديد مشغّلها. مُعلَّقة. |
خمس حزم تُشحن معطّلة بالكامل. وهي مكتملة بنيويًا وتجتاز التحقق، لكن معايير مطابقتها لم تُؤكَّد قط مقابل مستأجر حي، لذا لا تُقيَّم أثناء الفحص.
وهذا مقصود. فالبصمة ذات قيمة contains خاطئة لا تُطلق أبدًا ولا تُخطئ أبدًا —
إنها فقط تجعل المورّد يبدو مغطّى وهو ليس كذلك. وشحنها معطّلة يُبقي البحث في
المستودع دون تضخيم الأرقام.
وقد تخرّجت خمس حتى الآن، ويستحق السجل معرفته قبل أن تثق بالباقي: اثنتان كانتا صحيحتين كما كُتبتا، وواحدة كان نطاقها خاطئًا، واثنتان كان نطاقهما صحيحًا لكن القناة خاطئة — إذ ظهر المورّد كتضمين SPF بدلًا من اسم المضيف الخاص بكل عميل الذي توقّعته المدخلة. تعامل مع المدخلات المُعلَّقة المتبقية كملاحظات بحثية، لا كتغطية كامنة.
يطبع -validate قائمة الأعمال المتراكمة مجمّعة حسب الحزمة:
$ ./yowie -validate
574 signatures across 13 packs, covering 412 vendors
...
104 signature(s) parked behind `disabled: true`, awaiting confirmation against a live tenant:
ai-services.yaml (24)
txt-fireflies-ai Fireflies.ai
...
لترقية إحداها: