
أداة Untitled Goose Tool هي أداة قوية ومرنة للبحث والاستجابة للحوادث تضيف طرقًا جديدة للمصادقة وجمع البيانات من أجل إجراء تحقيق كامل ضد بيئات Azure Active Directory (AzureAD) وAzure وM365 الخاصة بالعميل.
لقد انطلقت الإوزة.
Untitled Goose Tool هي أداة قوية ومرنة للصيد والاستجابة للحوادث، وتضيف طرقًا مبتكرة للمصادقة وجمع البيانات من أجل إجراء تحقيق كامل في بيئات Microsoft Entra ID وAzure وM365 الخاصة بالعميل. كما تجمع Untitled Goose Tool بيانات تتبع إضافية من Microsoft Defender for Endpoint (MDE) وDefender for Internet of Things (IoT) (D4IoT).
صُممت هذه الأداة لمساعدة فرق الاستجابة للحوادث من خلال تصدير القطع الأثرية السحابية بعد وقوع حادث للبيئات التي لا تقوم بإدخال السجلات إلى نظام إدارة معلومات وأحداث الأمان (SIEM) أو أي حل آخر طويل الأمد للسجلات.
لمزيد من الإرشادات حول كيفية استخدام Untitled Goose Tool، يُرجى الاطلاع على: صحيفة حقائق Untitled Goose Tool
مطلوب Python 3.9 أو أحدث لتشغيل Untitled Goose Tool باستخدام Python. يُنصح بشدة باستخدام Python 3.12 لأنه يؤدي إلى تسجيل أفضل.
على جهاز يعمل بنظام Windows، ستحتاج إلى التأكد من تثبيت حزمة Microsoft Visual C++ القابلة لإعادة التوزيع (14.x) قبل تشغيل الأداة.
يُوصى أيضًا بتشغيل Untitled Goose Tool داخل بيئة افتراضية.
pip3 install virtualenv virtualenv -p python3 .venv source .venv/bin/activate
#### Linux```sh
# You may need to run sudo apt-get install python3-venv first
python3 -m venv .venv
source .venv/bin/activate
python -m venv .venv .venv\Scripts\activate
### المتطلبات
أذونات EntraID/M365 التالية مطلوبة لتشغيل Untitled Goose Tool، وهي تمنحه وصولاً للقراءة فقط إلى المستأجر (tenant).
يرجى ملاحظة: يجب أن يكون حساب المستخدم حسابًا سحابيًا فقط (غير مزامن مع البيئة المحلية on-premise)، وهذا يضمن بقاء عملية تسجيل الدخول كما هي عبر البيئات المختلفة للأداة.
حساب مستخدم سحابي فقط ومدير خدمة EXO (service principal) مرتبط به، مع الأذونات التالية:
مركز إدارة Exchange Online```
- View-Only Audit Logs
- View-Only Configuration
- View-Only Recipients
- User Options
مبدأ خدمة بالصلاحيات التالية:
أذونات API``` Log Analytics API
Microsoft Threat Protection:
WindowsDefenderATP:
Microsoft Graph:
Office 365 Exchange Online
أدوار IAM لاشتراكات Azure```
- Reader
- Storage Blob Data Reader
- Storage Queue Data Reader
تأكد من تمكين "Allow public client flows" لكيان الخدمة service principal.
لدينا نص برمجي لإعداد powershell لإعداد كيان خدمة بالصلاحيات المطلوبة. بالإضافة إلى ذلك، يمكن ربط Azure Service Principal مع m365 حاليًا عبر powershell فقط، وهو أمر ضروري لبعض عمليات جمع سجلات m365.
فيما يلي مثال على تشغيل البرنامج النصي، والذي سيُخرج أمر goosey conf الذي تحتاج إلى تشغيله لبناء ملفات الإعداد بالمعلومات الصحيحة.```powershell
PS > Write-Host "Creating a new Goose Application and Users"
PS > ./Create_SP.ps1 -AppName GooseApp -Create
بالإضافة إلى ذلك، يمكن للبرنامج النصي حذف التطبيق عند الانتهاء من استخدامه.```powershell
PS > Write-Host "Creating a new Goose Application and Users"
PS > ./Create_SP.ps1 -AppName GooseApp -Delete
للتثبيت، استنسخ المستودع ثم نفّذ pip install:
git clone https://github.com/cisagov/untitledgoosetool.git cd untitledgoosetool python3 -m pip install .
#### Docker```sh
docker build . -t goosey
docker run -it -v $PWD:/workdir goosey goosey honk --debug
تتطلب أداة Untitled Goose Tool معاملات مصادقة وإعدادات. لإنشاء ملف الإعداد تلقائيًا، شغّل ما يلي بعد التثبيت.```sh $ goosey conf
سيتم إنشاء نسخة من هذا الأمر عند تشغيل سكربت تثبيت PowerShell لإنشاء/إعداد service principal. فيما يلي مثال بقيم معلمات وهمية.```sh
$ goosey conf --config_tenant=5fd146ad-8b31-4afa-a72f-6f71df5c7173 --config_subscriptionid=all --auth_appid=24fd6377-79e0-445d-838b-3eaa60d3ca21
بعد ذلك، يجب وضع ملفات .auth و .conf و .auth_d4iot و .d4iot_conf في دليلك الحالي. تُستخدم هذه الملفات بواسطة Untitled Goose Tool. ما لم يتم إنشاء هذا باستخدام المعاملات أعلاه، يجب عليك ملء القسم العلوي [auth] حتى يتمكن Untitled Goose Tool من المصادقة بشكل صحيح على الموارد المناسبة. ومع ذلك، إذا كنت لا تشعر بالراحة بشأن إدخال بيانات اعتمادك في ملف، فيمكنك اختيار حذف .auth و/أو .auth_d4iot وسيُطلب منك إدخال بيانات الاعتماد عبر وحدة التحكم بدلاً من ذلك.
يبدو المصادقة الأساسية كما يلي:``` [auth]
username=
password=
appid=
clientsecret=
يبدو الإعداد الأساسي كما يلي:```
[config]
# The tenant ID of your AAD tenant
tenant=
# If you have a GCC High tenant
us_government=False
# If you have a GCC tenant with MDE
mde_gcc=False
# If you have a GCC High tenant with MDE
mde_gcc_high=False
# If your M365 tenant is a government tenant
exo_us_government=False
# If you want to check all of your Azure subscriptions, set this to All, otherwise enter your Azure subscription ID. For multiple IDs, separate it with commas, no spaces
subscriptionid=All
[filters]
# Format should be YYYY-MM-DD. If not set will default to the earliest date for log retention
date_start=
# Format should be YYYY-MM-DD. Will default to the present day
date_end=
[variables]
# Threshold used for ual API requests. Specifies the maximum results pulled per session. Can be between 100 - 50000. The api is optimized to return results faster the larger the threshold, but the whole session has to be repeated if an error occurs as the results are not returned sorted. We recommend 5000 as the threshold, but this can be toggled with
ual_threshold=5000
# Maximum number of ual coroutines/tasks to have running asynchronously. Minimum value is 1.
max_ual_tasks=5
# Start date for an extra time frame for ual to search. Reason for this is because ual takes the longest to pull and while you don't want the oldest data to roll off, you may want to look at another timeframe and do not want to wait for ual to get there and pull the logs. Format should be YYY-MM-DD
ual_extra_start=
# End date for an extra time frame for ual to search. Reason for this is because ual takes the longest to pull and while you don't want the oldest data to roll off, you may want to look at another timeframe and do not want to wait for ual to get there and pull the logs. Format should be YYY-MM-DD
ual_extra_end=
# Threshold for how many logs to pull per query. Usually want to try to max this out as KQL queries are rate limited.
mde_threshold=10000
# can be either 'table' or 'machine'. 'table' will pull directly from the mde tables without filtering. While 'machine' will filter by 'machine' with large tenants 'machine' will likely be prefered as time bounding on the entire table will likely cause issues.
mde_query_mode=table
[azure]
# Dumps activity log from azure
activity_log=False
# Returns all azure subscriptions
all_azure_subscriptions=False
# Dump insights bastion audit logs
bastion_logs=False
# Dump Azure configuration information
configs=False
# Dump D4IOT portal configs
d4iot_portal_configs=False
# Dump D4IOT portal pcaps from alerts
d4iot_portal_pcap=False
# Dump insights audit events for key_vault
key_vault_log=False
# Dump insights network security group flow events
nsg_flow_logs=False
[entraid]
# Dumps Entra ID Audit logs
entraid_audit=False
# Dumps Entra ID provisioning logs
entraid_provisioning=False
# Dumps Entra ID configuration files
configs=False
# Dumps risk detections from identity protection. Requires a minimum of Microsoft Entra ID P1 license and Microsoft Entra Workload ID premium license for full results.
risk_detections=False
# Dumps risky users and service principal information. Requires a minimum of Microsoft Entra ID P2 license and Microsoft Entra Workload ID premium license for full results.
risky_objects=False
# Dump security actions, alerts, and scores
security=False
# Dump interactive (adfs) sign in logs
signins_adfs=False
# Dump managed identity (msi) sign in logs
signins_msi=False
# Dump non-interactive (rt) sign in logs
signins_rt=False
# Dump service principal (sp) signin logs
signins_sp=False
[m365]
# Get Exchange discovery information
ediscovery_info=False
# Get all of the applications installed for the organization
exo_addins=False
# Get EXO config information
exo_config_info=False
# Dumps Exchange Online Role Group and Role Group Members information.
exo_groups=False
# Get all the messageRule objects defined for all users' inboxes
exo_inboxrules=False
# Dumps Exchange Online Mailbox Information
exo_mailbox=False
# Get information on m365 mobile devices
exo_mobile_devices=False
# Dumps UAL for last year using Search-UnifiedAuditLog api. Previous ual api is currently deprecated.
ual=False
[mde]
# Dumps the results from incidents and alerts.
advanced_hunting_alerts_incidents=False
# Dumps the results from advanced hunting queries.
advanced_hunting_query=False
# Dumps the results from advanced hunting API queries.
advanced_identity_hunting_query=False
# Dump alerts
alerts=False
# Dump indicators
indicators=False
# Dump investigations
investigations=False
# Dump library files
library_files=False
# Dump known machine vulnerabilities
machine_vulns=False
# Dump machines with mde
machines=False
# Dump mde recommendations
recommendations=False
# Dump known installed software
software=False
تبدو مصادقة D4IoT الأساسية كما يلي:``` [auth]
username=
password=
sensor_token=
mgmt_token=
يبدو تكوين D4IoT كما يلي:```
[config]
# Enter your D4IoT sensor IP
d4iot_sensor_ip=
# Enter your D4IoT management console IP
d4iot_mgmt_ip=
[d4iot]
# Dump management alerts
mgmt_alerts=False
# Dump management devices
mgmt_devices=False
# Dump management sensor pcap captured
mgmt_pcap=False
# Dump management sensor information
mgmt_sensor_info=False
# Dump sensor alerts
sensor_alerts=False
# Collect all device connections
sensor_device_connections=False
# Dummp sensor device known cves
sensor_device_cves=False
# Dump sensor device known vulnerabilities
sensor_device_vuln=False
# Dump sensor devices
sensor_devices=False
# Dump sensor events
sensor_events=False
# Dump sensor operation vulnerabilities
sensor_operational_vuln=False
# Dump sensor pcap
sensor_pcap=False
# Dump sensor security vulnerabilities
sensor_security_vuln=False
لتفعيل عمليات سحب محددة، يمكنك تغيير أي حدوث للقيمة False إلى True (مع تجاهل حالة الأحرف).
$ goosey auth --help NAME goosey auth - Untitled Goose Tool Authentication
SYNOPSIS goosey auth
DESCRIPTION Untitled Goose Tool Authentication
FLAGS --authfile=AUTHFILE Default: '.ugt_auth' File to store the authentication tokens and cookies --d4iot_authfile=D4IOT_AUTHFILE Default: '.d4iot_auth' File to store the authentication cookies for D4IoT -c, --config=CONFIG Default: '.conf' Path to config file --auth=AUTH Default: '.auth' File to store the credentials used for authentication --d4iot_auth=D4IOT_AUTH Default: '.auth_d4iot' File to store the D4IoT credentials used for authentication --d4iot_config=D4IOT_CONFIG Default: '.d4iot_conf' -r, --revoke=REVOKE Default: False Revoke sessions for user with authentication tokens and cookies --interactive=INTERACTIVE Default: False Interactive mode for Selenium. Default to headless --debug=DEBUG Default: False Enable debug logging --d4iot=D4IOT Default: False Run the authentication portion for d4iot --insecure=INSECURE Default: False Disable secure authentication handling (file encryption) -u, --user_auth=USER_AUTH Default: False Authenticate with the user credentials and collect the session tokens
شغّل بالإعدادات الافتراضية. بشكل افتراضي، سيقوم بتشفير بيانات الاعتماد/الرموز المميّزة باستخدام كلمة مرور يُطلب إدخالها. إذا لم تكن الحقول معرّفة في الإعدادات، فسيطلبها أيضًا:```sh
$ goosey auth
شغّل مع تفعيل معالجة المصادقة غير الآمنة ووضع التصحيح:```sh $ goosey auth --debug --insecure
### Csv```sh
$ goosey csv --help
NAME
goosey csv - Create csv files mapping GUIDs to text
SYNOPSIS
goosey csv <flags>
DESCRIPTION
Create csv files mapping GUIDs to text
FLAGS
-o, --output_dir=OUTPUT_DIR
Default: 'output/entraid/'
The directory where the goose files are located
-r, --result_dir=RESULT_DIR
Default: 'output/csvs/'
Directory for storing the results
-d, --debug=DEBUG
Default: False
Enable debug logging
شغّل بالإعدادات الافتراضية:```sh $ goosey csv
### Honk```sh
$ goosey honk --help
NAME
goosey honk - Untitled Goose Tool Information Gathering
SYNOPSIS
goosey honk <flags>
DESCRIPTION
Untitled Goose Tool Information Gathering
FLAGS
--authfile=AUTHFILE
Default: '.ugt_auth'
File to store the authentication tokens and cookies
-c, --config=CONFIG
Default: '.conf'
Path to config file
--auth=AUTH
Default: '.auth'
File to store the credentials used for authentication
-o, --output_dir=OUTPUT_DIR
Default: 'output'
Directory for storing the results
-r, --reports_dir=REPORTS_DIR
Default: 'reports'
Directory for storing debugging/informational logs
--debug=DEBUG
Default: False
Enable debug logging
--dry_run=DRY_RUN
Default: False
Dry run (do not do any API calls)
--azure=AZURE
Default: False
Set all of the Azure calls to true
--entraid=ENTRAID
Default: False
Set all of the Entra ID calls to true
--m365=M365
Default: False
Set all of the M365 calls to true
--mde=MDE
Default: False
Set all of the MDE calls to true
شغّل بالخيارات الافتراضية:```sh $ goosey honk
شغّل مع تفعيل تسجيل التصحيح، وأخرج إلى الدليل `my_outputs`، وفعّل جميع استدعاءات Azure:```sh
$ goosey honk --debug --output-dir my_outputs --azure
$ goosey autohonk --help NAME goosey autohonk - Untitled Goose Tool Information Gathering. With auto authentication! This will never stop until you tell it to.
SYNOPSIS goosey autohonk
DESCRIPTION Untitled Goose Tool Information Gathering. With auto authentication! This will never stop until you tell it to.
FLAGS --authfile=AUTHFILE Default: '.ugt_auth' File to store the authentication tokens and cookies -c, --config=CONFIG Default: '.conf' Path to config file --auth=AUTH Default: '.auth' File to store the credentials used for authentication -o, --output_dir=OUTPUT_DIR Default: 'output' Directory for storing the results -r, --reports_dir=REPORTS_DIR Default: 'reports' Directory for storing debugging/informational logs -d, --debug=DEBUG Default: False Enable debug logging --azure=AZURE Default: False Set all of the Azure calls to true --entraid=ENTRAID Default: False Set all of the Entra ID calls to true --m365=M365 Default: False Set all of the M365 calls to true --mde=MDE Default: False Set all of the MDE calls to true -i, --insecure=INSECURE Default: False Disable secure authentication handling (file encryption)
### سير العمل الافتراضي الموصى به
1. ثبّت الأداة `pip install .`
2. (اختياري) شغّل [سكربت PowerShell للإعداد](https://github.com/cisagov/untitledgoosetool/blob/develop/scripts/Create_SP.ps1) لإعداد service principal لمستأجرك
3. استخدم أمر `goosey conf` المُخرَج. أو شغّله فقط بدون معاملات
4. املأ ملف `.auth` ببيانات اعتمادك (إذا لم تستخدم مخرَج سكربت PowerShell)
5. املأ معلومات الإعداد واضبط الاستدعاءات المطلوبة في ملف `.conf` إلى `True`.
6. شغّل `goosey auth` بالمعاملات المطلوبة.
7. شغّل `goosey honk` بالمعاملات المطلوبة.
8. بدلاً من الخطوتين 6-7 شغّل `goosey autohonk` بالمعاملات المطلوبة
### سير العمل الموصى به لاستدعاء UAL
1. الخطوات من 1 إلى 4 أعلاه
2. افتح ملف `.conf` واضبط `ual` تحت قسم `m365` إلى `True`.
3. شغّل `goosey auth` بالمعاملات المطلوبة.
4. شغّل `goosey honk` بالمعاملات المطلوبة.
5. بدلاً من الخطوتين 3-4 شغّل `goosey autohonk` بالمعاملات المطلوبة
### اعتبارات
1. نوصي بتشغيل [سكربت PowerShell للإعداد](https://github.com/cisagov/untitledgoosetool/blob/develop/scripts/Create_SP.ps1) أو ملء ملف `.conf` أولاً
2. ملء ملف `.auth` و/أو `.auth_d4iot` أصبح اختياريًا الآن.
3. شغّل دائمًا `goosey auth` قبل تشغيل `goosey honk` أو `goosey d4iot`. سيقوم `goosey autohonk` بالمصادقة من تلقاء نفسه.
### حالات استخدام خاصة
#### خلف بروكسي
يجب أن تعمل الأداة خلف بروكسي (proxy). طالما تم تعيين متغيرات البيئة المناسبة لواجهة الأوامر (cli).```
https_proxy=<proxy_url>
http_proxy=<proxy_url>
وجود % في كلمة المرور:
الحل: تأكد من إفلات % في كلمة المرور باستخدام %%.
خطأ عند محاولة pip install . على جهاز Mac:
ModuleNotFoundError: No module named 'certifi'
الحل: انتقل إلى مجلد التطبيقات، وابحث عن مجلد إصدار بايثون الخاص بك، ثم انقر نقرًا مزدوجًا على الملف "Install Certificates.command" داخل مجلد بايثون لتثبيت الشهادة.
لماذا ترجع أداة Untitled Goose Tool نتيجتين لقواعد صندوق الوارد في Exchange Online وأذونات صندوق بريد Exchange Online؟
الحل: كل من استدعاءات API وPowerShell قوية وتُظهر معلومات مختلفة، لذلك قررنا الإبقاء على كلتيهما.
خطأ بعد تشغيل بعض استدعاءات Azure Security Center:
نتائج الامتثال في Azure:
Error: (MissingSubscription) The request did not have a subscription or a valid tenant level resource provider.
Code: MissingSubscription
Message: The request did not have a subscription or a valid tenant level resource provider.
سياسات حماية معلومات Azure:
Error: Operation returned an invalid status 'Not Found'
تقييمات Azure:
Discriminator source is absent or null, use base class ResourceDetails.
نرحب بالمساهمات! يرجى الاطلاع هنا للحصول على التفاصيل.
هذا المشروع في النطاق العام على مستوى العالم.
هذا المشروع في النطاق العام داخل الولايات المتحدة، ويتم التنازل عن حقوق النشر والحقوق ذات الصلة في العمل في جميع أنحاء العالم من خلال إهداء CC0 1.0 العالمي إلى النطاق العام.
سيتم إصدار جميع المساهمات في هذا المشروع بموجب إهداء CC0. بتقديم طلب pull request، فأنت توافق على الامتثال لهذا التنازل عن حقوق النشر.
إشعار
تم إنشاء هذه الحزمة البرمجية (“البرنامج” أو “الكود”) من قبل حكومة الولايات المتحدة ولا تخضع لحقوق النشر داخل الولايات المتحدة. جميع الحقوق الأخرى محفوظة. يمكنك استخدام الكود أو تعديله أو إعادة توزيعه بأي طريقة. ومع ذلك، لا يجوز لك لاحقًا تسجيل حقوق نشر للكود كما هو موزع. لا تطالب حكومة الولايات المتحدة بأي حقوق نشر على التغييرات التي تجريها، ولن تقيّد توزيعك للتغييرات المشروعة على البرنامج. إذا قررت تحديث الكود أو إعادة توزيعه، فيرجى تضمين هذا الإشعار مع الكود. عندما يكون ذلك مناسبًا، نطلب منك أن تنسب الفضل إلى وكالة الأمن السيبراني والبنية التحتية بالعبارة التالية: “الكود الأصلي طُوّر بواسطة وكالة الأمن السيبراني والبنية التحتية (CISA)، وزارة الأمن الداخلي الأمريكية.”
استخدم هذا البرنامج على مسؤوليتك الخاصة. يأتي هذا البرنامج دون أي ضمان، سواء كان صريحًا أو ضمنيًا. لا تتحمل حكومة الولايات المتحدة أي مسؤولية عن استخدام أو إساءة استخدام هذا البرنامج أو مشتقاته.
يُقدَّم هذا البرنامج “AS-IS.” لن تقوم حكومة الولايات المتحدة بتثبيت هذا البرنامج أو إزالته أو تشغيله أو دعمه بناءً على طلبك. إذا لم تكن متأكدًا من كيفية تفاعل هذا البرنامج مع نظامك، فلا تستخدمه.
التقييمات الفرعية في Azure:
Subtype value GeneralVulnerability has no mapping, use base class AdditionalData.
Subtype value SqlVirtualMachineVulnerability has no mapping, use base class AdditionalData.
الحل: هذه الرسائل ليست مشكلات. سيتم تنفيذ استدعاء نتيجة الامتثال في Azure على أي حال. استدعاء سياسة حماية معلومات Azure ليس خطأً حرجًا. استدعاء تقييمات Azure يُغرق وحدة التحكم بتحذير من سطر واحد: "Discriminator source is absent or null, use base class ResourceDetails" وسيكتمل دون أي مشكلة (بصرف النظر عن إغراق وحدة التحكم). استدعاء التقييمات الفرعية في Azure يُغرق وحدة التحكم بتحذير من سطر واحد: "Subtype value GeneralVulnerability has no mapping, use base class AdditionalData." أو "Subtype value SqlVirtualMachineVulnerability has no mapping, use base class AdditionalData." وسيكتمل دون أي مشكلة (بصرف النظر عن إغراق وحدة التحكم).
كمية كبيرة من أخطاء 429 أثناء goosey honk
الحل: ستواجه أداة Untitled Goose Tool بسرعة قيود Graph API الخاصة بالمستأجر؛ وهذا قيد تضعه Microsoft على استدعاءات Graph API.