Skip to content

Conversation

terrancedejesus
Copy link
Contributor

Pull Request

Issue link(s):

Summary - What I changed

Adds detection for TeamFiltration tool via hardcoded user agent. Checks for usage across M365 and Entra ID via Sign-In Logs.

How To Test

  • Query can be used in TRADE stack to see recent tool usage.

Checklist

  • Added a label for the type of pr: bug, enhancement, schema, maintenance, Rule: New, Rule: Deprecation, Rule: Tuning, Hunt: New, or Hunt: Tuning so guidelines can be generated
  • Added the meta:rapid-merge label if planning to merge within 24 hours
  • Secret and sensitive material has been managed correctly
  • Automated testing was updated or added to match the most common scenarios
  • Documentation and comments were added for features that require explanation

Contributor checklist

@terrancedejesus terrancedejesus linked an issue Jul 2, 2025 that may be closed by this pull request
@terrancedejesus terrancedejesus self-assigned this Jul 2, 2025
Copy link
Contributor

github-actions bot commented Jul 2, 2025

Rule: New - Guidelines

These guidelines serve as a reminder set of considerations when proposing a new rule.

Documentation and Context

  • Detailed description of the rule.
  • List any new fields required in ECS/data sources.
  • Link related issues or PRs.
  • Include references.

Rule Metadata Checks

  • creation_date matches the date of creation PR initially merged.
  • min_stack_version should support the widest stack versions.
  • name and description should be descriptive and not include typos.
  • query should be inclusive, not overly exclusive, considering performance for diverse environments. Non ecs fields should be added to non-ecs-schema.json if not available in an integration.
  • min_stack_comments and min_stack_version should be included if the rule is only compatible starting from a specific stack version.
  • index pattern should be neither too specific nor too vague, ensuring it accurately matches the relevant data stream (e.g., use logs-endpoint.process-* for process data).
  • integration should align with the index. If the integration is newly introduced, ensure the manifest, schemas, and new_rule.yaml template are updated.
  • setup should include the necessary steps to configure the integration.
  • note should include any additional information (e.g. Triage and analysis investigation guides, timeline templates).
  • tags should be relevant to the threat and align/added to the EXPECTED_RULE_TAGS in the definitions.py file.
  • threat, techniques, and subtechniques should map to ATT&CK always if possible.

New BBR Rules

  • building_block_type should be included if the rule is a building block and the rule should be located in the rules_building_block folder.
  • bypass_bbr_timing should be included if adding custom lookback timing to the rule.

Testing and Validation

  • Provide evidence of testing and detecting the expected threat.
  • Check for existence of coverage to prevent duplication.
@terrancedejesus terrancedejesus marked this pull request as ready for review July 2, 2025 14:44
Comment on lines 98 to 102
event.dataset:(azure.signinlogs or o365.audit)
and user_agent.name:Electron
and user_agent.os.name:Windows
and user_agent.version:8.5.1 or
user_agent.original:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Teams/1.3.00.30866 Chrome/80.0.3987.165 Electron/8.5.1 Safari/537.36"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@terrancedejesus I think that with no ()s this query is effective like this:

Condition 1:
event.dataset:(azure.signinlogs or o365.audit) and user_agent.name:Electron and user_agent.os.name:Windows and user_agent.version:8.5.1

Condition 2:
user_agent.original:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Teams/1.3.00.30866 Chrome/80.0.3987.165 Electron/8.5.1 Safari/537.36"

Which is probably not prone to FPs, but it can still match unintended events

Example:
image

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@w0rk3r - Thanks for the insight. I originally changed it due to KQL having issues with the "optimization" of it.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adjusted the query to include a nested object instead to avoid any unintended events and fix query optimization.

@terrancedejesus terrancedejesus merged commit 6e2936a into main Jul 8, 2025
11 checks passed
@terrancedejesus terrancedejesus deleted the 4862-new-rule-potential-teamfiltration-tool-detected branch July 8, 2025 13:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment