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

786 بصمة تغطي 593 مورّدًا عبر تسعة كواشف، بالإضافة إلى 109 بصمات معلّقة بانتظار التأكيد. تُصنَّف النتائج، وكل نتيجة تحمل السجل أو الاستجابة التي أنتجتها.
go build -o yowie ./cmd/yowie
Go 1.22 أو أحدث. حزم التوقيعات مضمّنة في الملف التنفيذي، لذا فإن الملف الواحد هو كل ما تحتاجه للنشر.
yowie [flags] <domain> [candidate ...]
النطاق هو النطاق الجذر للمؤسسة. المرشّحات هي السلاسل القصيرة التي قد يكون مستأجر المورّد مُسمّى على أساسها — الأسماء التجارية، والاختصارات، والعلامات التجارية القديمة الموروثة من عمليات الاستحواذ. قدّم أكبر عدد ممكن منها؛ فكل مرشّح هو فرصة إضافية للعثور على مستأجر. وفي حال عدم تقديم أي منها، يُستخدم التسمية الأولى للنطاق.
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 | مخطط include الكامل لـ SPF، مع تتبّع الـ includes والتحويلات المتداخلة |
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 يحصل على شهادة صادرة، وتلك الشهادة علنية ودائمة. تُبلَّغ الأهداف التي لا تطابق أي بصمة كخيوط استدلال، وهكذا تجد الشيء الذي لم تكن تعرف أن عليك البحث عنه.
النتائج مُصنّفة، والتصنيف هو المقصد:
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 include المُحلَّل | |
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 | منصات الذكاء الاصطناعي وLLM. موقوفة. |
file-transfer | نقل الملفات المُدار — MOVEit، GoAnywhere، Egnyte. موقوفة. |
finance-procurement | المالية، المصروفات، الرواتب، المشتريات. موقوفة. |
security-grc | أدوات الأمان وأتمتة الامتثال. موقوفة. |
graveyard | إدخالات غير مُتحقَّق منها، ومنصات تعذّر تحديد مشغّلها. موقوفة. |
تُشحن خمس حزم معطّلة بالكامل. وهي مكتملة بنيويًا وتجتاز التحقق، لكن معايير المطابقة الخاصة بها لم يتم تأكيدها قط مقابل مستأجر حي، لذا لا يتم تقييمها أثناء الفحص.
هذا متعمد. التوقيع الذي يحتوي على قيمة contains خاطئة لا يُفعَّل أبدًا ولا
يُخطئ أبدًا — إنه فقط يجعل البائع يبدو مغطى وهو ليس كذلك. شحن تلك
معطّلة يحافظ على البحث في المستودع دون تضخيم الأرقام.
تخرّجت خمسة حتى الآن، والسجل يستحق المعرفة قبل أن تثق بالباقي: اثنان كانا صحيحين كما كُتبا، وواحد كان لديه النطاق الخاطئ، واثنان كان لديهما النطاق الصحيح لكن القناة الخاطئة — ظهر البائع كـ SPF include بدلًا من اسم المضيف لكل عميل الذي توقعه الإدخال. تعامل مع الإدخالات الموقوفة المتبقية كملاحظات بحثية، وليس كتغطية كامنة.
-validate يطبع قائمة الأعمال المتراكمة مجمّعة حسب الحزمة:
$ ./yowie -validate
786 signatures across 13 packs, covering 593 vendors
...
109 signature(s) parked behind `disabled: true`, awaiting confirmation against a live tenant:
ai-services.yaml (24)
txt-fireflies-ai Fireflies.ai
...
لترقية واحدة: