Knight Office -- M365 AiTM Phishing Kit & Entra ID Persistence
Executive Summary
Knight Office is an adversary-in-the-middle (AiTM) phishing-as-a-service kit, disclosed by Huntress on 2026-09-02 from a real intrusion its SOC opened on 2026-08-18, that steals Microsoft 365 session/OAuth tokens rather than passwords. A self-spoofed DocuSign-style lure (the From, To, and Return-Path headers are forged to the recipient's own address) routes victims through a legitimate Monday.com tracking redirect and a compromised Joomla website -- a chain built to blind email-security scanners and analysts -- to a SharePoint/Teams-themed phishing page (page title Login -- KNIGHT OFFICE, fronted by a Cloudflare Turnstile) that walks the target through Microsoft's own device-authentication code flow. A reverse proxy sitting between the victim and Microsoft captures the resulting session token and feeds it to the operator console at idoej[.]com (104.37.188[.]94), where it is replayed with a distinctive python-requests/2.34.2, OAuth2:Token client fingerprint.
What makes Knight Office worth a dedicated hunt is not the token theft itself -- that is now routine phishing-kit tradecraft, and Huntress explicitly ties it to sibling kits EvilTokens and Kali365 -- it is what happens after. The operator uses the stolen token to enroll an attacker-controlled device into the victim's Microsoft Entra ID tenant and binds a Windows Hello for Business (WHfB) passwordless key credential to the compromised account. That credential survives both a forced password reset and a full session-token revocation: the two standard "we think this account was phished" incident-response actions do not evict the attacker. Only an explicit review and removal of the rogue device and its WHfB/authentication-method registration closes the door back out.
Huntress has linked the single operator-console IP to at least nine token-replay logins against Microsoft 365 and Google Workspace identities within its own customer telemetry over a two-week window, and at least 700 phishing emails matching this lure's subject line and template reported through its Security Awareness Training platform since April 2026 -- this is an active, ongoing campaign, not a one-off intrusion.
Defender priority: this is primarily an identity hunt, not an endpoint hunt. The single highest-value action is reviewing every Microsoft Entra ID device registration and every new WHfB/passkey credential addition from the last 30 days against known onboarding baselines (Section 8, Q3-Q5) -- a rogue device registration paired with a new WHfB credential on an account that was not provisioning new hardware that day is the tell that password reset and token revocation alone will not remediate.
Source Review & Web Hunter Notes
| Tier | Source | Key Finding | Carry Forward |
|---|---|---|---|
| Tier 1 -- Primary | Huntress -- "Inside Knight Office, a New M365 AiTM Phishing Kit" (2026-09-02) | Full technical writeup from an internally-investigated attack (opened 2026-08-18): attack chain, complete IOC table, vendor MITRE mapping, and campaign-scale telemetry (9 replay logins / 2wk, 700+ lure emails since April) | Yes -- attack chain, every atomic IOC, MITRE mapping, scale stats |
| Tier 2 -- Vendor, background | Huntress -- "Inside Kali365, a Device Code Phishing Ecosystem" | TTP/detection context for a different device-code-phishing kit (Kali365/Octopi365) -- Microsoft's "block device code flow" recommendation and a python-requests/ASN KQL hunting pattern | Partial -- hardening recommendation + hunt-query shape only; no IOCs from this source were carried into Section 4/10 (different campaign, no TTP overlap confirmed beyond token-replay UA style) |
| Tier 1 -- Vendor docs | Microsoft Learn -- Microsoft Entra audit log activity reference | Canonical operationName strings for device registration ("Register device", "Add device") and WHfB/passkey credential events ("Add Windows Hello for Business credential", "User registered security info") | Yes -- grounds the operationName values used in Q3-Q5 and Section 7 |
Disqualified / inaccessible: itsecurityguru.org's coverage of this story was located via search but returned HTTP 403 (Cloudflare bot-challenge) on fetch -- no verbatim snapshot could be saved, so per this pack's sourcing rule it is not cited and contributes zero claims here. No other outlet with independently-gathered (non-Huntress-derived) technical detail was found as of 2026-09-15.
Second-source policy applied: no independent confirmation of the atomic infrastructure IOCs (idoej[.]com, 104.37.188[.]94, the 25 .vu domains) was found -- expected 13 days after disclosure of a fresh campaign. Per the pack's second-source rule, every infrastructure IOC in Section 10 ships at action=detect / severity=high, not prevent/critical, until a second independent source corroborates them.
No fetched source contained instructions directed at the assistant (prompt injection); all three sources above were treated strictly as data.
Hunt Brief & Attack Chain
Attack chain
| Step | What Happens | Telemetry | Hunt Angle |
|---|---|---|---|
| 1 | Self-spoofed DocuSign-style lure email ("Reminder: Signature Required - Approval Pending Your Review!!! Ref ID-<RANDOM>" and four documented variants) | Mail gateway / Exchange Online Protection | Section 7 (native, non-CQL) |
| 2 | Redirect chain: lure link → Monday.com tracking service → compromised Joomla site (now taken down) → phishing page | URL click / secure web gateway logs | Section 7 (native, non-CQL) |
| 3 | SharePoint/Teams-themed phishing page ("Login -- KNIGHT OFFICE", Cloudflare Turnstile sitekey 0x4AAAAAADrkE-VuOnNDfr6W) presents a device-authentication code | Browser / proxy logs -- no Falcon EDR visibility | Gap -- native/SWG only (Section 5) |
| 4 | Victim pastes the code at Microsoft's real "deviceauth" screen, signs in, completes MFA; a reverse proxy captures the session token and a callback proxy relays it to the operator | Entra ID sign-in logs (azure_signinlogs) | Q1, Q2, Q6 |
| 5 | Operator registers a rogue, attacker-controlled device into the victim's Entra ID tenant (observed from 104.37.188[.]94) | Entra ID audit logs (azure_auditlogs) | Q3, Q5 |
| 6 | Operator binds a Windows Hello for Business (WHfB) key credential to the compromised account (device-registration client string Dsreg/10.0 (Windows 10.0.19044.1826)) -- the persistence step | Entra ID audit logs | Q4, Q5, Q8 |
| 7 | Operator signs in again using WHfB passwordless authentication -- this leg survives password reset and token revocation | Entra ID sign-in logs | Q5; containment runbook Section 14 |
Hunt hypotheses (ordered by fidelity)
| # | Hypothesis | MITRE | Falcon Telemetry | Confidence |
|---|---|---|---|---|
| H1 | Accounts show an Entra device registration and a WHfB credential bind within a short window, with no matching IT-managed enrollment record -- the persistence signature itself | T1098.005 | azure_auditlogs | HIGH |
| H2 | Sign-in logs carry the literal token-replay client strings python-requests/2.34.2 or OAuth2:Token | T1528, T1550.001 | azure_signinlogs | HIGH |
| H3 | A managed endpoint resolves one of the 25 known .vu phishing domains or idoej[.]com | T1566.002 | DnsRequest (Falcon sensor) | HIGH |
| H4 | A sign-in failure citing a missing device/NGC key is immediately followed by a WHfB-bound success for the same identity -- the exact sequence Huntress observed | T1556, T1098.005 | azure_signinlogs | HIGH |
| H5 | Repeated post-MFA sign-ins to Microsoft Authentication Broker / OfficeHome share a small set of source IPs across multiple users (callback-proxy reuse) | T1557, T1111 | azure_signinlogs | MEDIUM |
| H6 | (Support signal only) sign-ins/replays sourced from Tencent Cloud's published coarse IP ranges | T1090.003 | azure_signinlogs | LOW |
Consolidated IOC Table
| Type | Value | Confidence | Action | Context | Expiry |
|---|---|---|---|---|---|
| IPv4 | 104.37.188[.]94 | high | detect | Knight Office operator console; source of the rogue Entra device registration | 2027-03-15 |
| Domain | idoej[.]com | high | detect | Reverse-IP resolution of the operator console | 2027-03-15 |
| Domain ×25 | advancedplacyncement[.]vu and 24 sibling .vu domains -- full list in Section 10 | high | detect | Phishing landing-page domains | 2027-03-15 |
| IP (partial, redacted) | 73.125.13.x | medium | enrich | Residential callback-proxy first hop (Comcast Cable, flagged by Spur as proxy-resale infrastructure) -- Huntress redacted the last octet in its own writeup; do not attempt to reconstruct it | 2026-10-15 |
| ASN ranges | Tencent Cloud 43.x / 170.106.x / 162.62.x / 49.51.x | low | pivot | Token-replay hosting; far too broad to block on their own -- correlate only (see Q6 tuning) | 2026-10-15 |
| User-Agent | python-requests/2.34.2 | high | detect | Token-replay client fingerprint | 2027-03-15 |
| User-Agent | OAuth2:Token | high | detect | Token-replay client fingerprint (literal string) | 2027-03-15 |
| User-Agent | Dsreg/10.0 (Windows 10.0.19044.1826) | high | detect | WHfB / device-registration client string added during persistence phase | 2027-03-15 |
| String | Login -- KNIGHT OFFICE | high | hunt | Operator console page title (pivot in SWG/proxy logs, Validin, VirusTotal) | 2026-12-15 |
| String | Cloudflare Turnstile sitekey 0x4AAAAAADrkE-VuOnNDfr6W | high | hunt | Phishing-page fingerprint | 2026-12-15 |
| Email subject | "Reminder: Signature Required - Approval Pending Your Review!!! Ref ID-<RANDOM>" + 4 documented variants (voicemail / document / caller-ID lures, all using lowercase "l" for "i") | high | hunt | Lure subject-line pattern | 2026-12-15 |
| IPv4 | 154.127.53[.]78 | medium | enrich | Lure sender IP observed in the example case investigated by Huntress | 2026-10-15 |
Affected Surface & Telemetry Matrix
| Surface | Telemetry Required | Priority | Gap Risk |
|---|---|---|---|
| Microsoft Entra ID -- sign-in logs | azure_signinlogs via Falcon Identity Protection / SaaS connector | P1 | Requires an Identity Protection license and an active Entra connector -- a real coverage gap if unlicensed or not yet onboarded |
| Microsoft Entra ID -- audit logs | azure_auditlogs | P1 | Same license dependency; also parser-prefix drift per tenant (see NOTE lines on Q3-Q5) |
| Email / Exchange Online Protection | Mail flow logs, Safe Links time-of-click telemetry | P1 | Not visible to Falcon EDR at all -- native M365 Defender / EOP hunting only (Section 7) |
| Endpoint (Falcon sensor) | DnsRequest, NetworkConnectIP4 | P2 | Only sees the victim's own browsing to already-known-bad domains -- cannot see the AiTM reverse proxy itself or anything on the Entra ID side |
| Windows Hello for Business enrollment (local device) | dsregcmd / NGC container events | P3 | Honest gap: the attacker enrolls their own rogue device, not the victim's endpoint -- the Falcon sensor on the victim's machine has no visibility into that registration. This is why the hunt is identity-led, not endpoint-led. |
| Network egress (SWG / proxy) | URL / category logs for the Monday.com redirect + compromised Joomla site | P2 | The compromised Joomla site was already taken down by the time Huntress published -- historical/retro-hunt value only, not a live blocking target |
Falcon endpoint telemetry alone cannot detect this campaign's persistence mechanism. Section 8's identity queries (Q1-Q6, Q8) require an Entra ID / Identity Protection connector feeding LogScale; only Q7 (DNS to known phishing domains) is native Falcon-sensor telemetry with no additional licensing. Say so plainly to stakeholders before promising detection coverage.
ATT&CK Mapping
Tactic/technique/context reproduced from Huntress's own published mapping (attributed; IDs as published in the primary source and not independently re-derived), with a Query-or-Control column added by this pack.
| Tactic | Technique | Context (per Huntress) | Query / Control |
|---|---|---|---|
| Resource Development | Stage Capabilities: Link Target (T1608.005) | Threat actor stages a target page behind an open redirect parameter on Monday[.]com's tracking service, routing the victim to resources on the compromised site | Section 7 (native) |
| Initial Access | Phishing: Spearphishing Link (T1566.002) | Phishing email lures the victim to a malicious site via a link rather than an attachment | Q7; Section 7 |
| Execution | User Execution: Malicious Link (T1204.001) | Social engineering urges the victim to actively click the link | Q7; Section 7 |
| Persistence | Account Manipulation: Device Registration (T1098.005) | Actor uses the hijacked session to enroll an unauthorized host into Microsoft Entra ID, completes a rogue device registration, and binds a WHfB key credential to the compromised account | Q3, Q4, Q5 (centerpiece of this pack) |
| Defense Evasion | Valid Accounts: Cloud Accounts (T1078.004) | Actor uses captured legitimate session tokens to bypass authentication controls without triggering password-based detection | Q1, Q2 |
| Defense Evasion | Social Engineering: Email Spoofing (as mapped by Huntress) | Actor modifies email header values to change the apparent identity of the sender | Section 7 (native) |
| Credential Access | Multi-Factor Authentication Interception (T1111) | A relay captures valid authentication artifacts as the victim accepts the MFA push prompt | Q1, Q2 |
| Credential Access | Adversary-in-the-Middle (T1557) | Actor sits between the victim and the authenticating service to hijack valid session tokens in real time | Q1, Q2 |
| Credential Access | Steal Application Access Token (T1528) | Actor intercepts and harvests legitimate session tokens for unauthorized M365 access | Q1 |
| Command and Control | Proxy: Multi-hop Proxy (T1090.003) | Actor chains routing layers to hide the origin of malicious traffic | Q6 (support-only) |
| Command and Control | Hide Infrastructure (T1665) | Actor masks operational servers behind trusted platforms, hijacked sites, and proxy networks | Section 7; Q6 |
| Persistence / Defense Evasion | Modify Authentication Process (T1556) — HuntPack addition, not in Huntress's table | WHfB key-credential binding repurposes a passwordless-auth feature as an attacker-controlled re-entry method | Q4, Q5, Q8 |
Native Audit-Log Hunts
The lure, redirect chain, and phishing page live entirely outside Falcon's telemetry surface. These native hunts cover that gap using the platforms that actually see them: Exchange Online / M365 Defender for the mail leg, and Microsoft Graph / Entra admin center for a direct audit-log review that does not depend on a LogScale connector being wired up yet.
Mail: self-spoofed lure + subject pattern (M365 Defender Advanced Hunting)
// Microsoft 365 Defender Advanced Hunting (KQL) -- self-spoofed lure subject // Non-CQL: runs against EmailEvents in the M365 Defender / Sentinel portal, not Falcon LogScale EmailEvents | where Subject matches regex @"(?i)(signature required|lmportant|slgnature|verlvied).*ref[\s-]?id" | where SenderFromAddress =~ RecipientEmailAddress | project Timestamp, SenderFromAddress, RecipientEmailAddress, Subject, SenderIPv4
Entra sign-in UA fingerprint, Sentinel/Log Analytics variant
For organizations that also run Entra sign-in logs through Sentinel rather than (or alongside) Falcon LogScale, the same Q1 logic as a KQL starter:
// Microsoft Entra sign-in log KQL starter (Sentinel / Log Analytics) -- token-replay UA
// Non-CQL: adapt field names to your workspace schema before running
SigninLogs
| where UserAgent has_any ("python-requests/2.34.2", "OAuth2:Token")
| project TimeGenerated, UserPrincipalName, IPAddress, AppDisplayName, UserAgent, ResultType
Direct admin-center / Graph PowerShell audit pull
Usable immediately, with no SIEM connector required -- run this the same day this pack is deployed while the Falcon Entra connector is being validated:
# Entra ID device-registration + WHfB audit checklist (Microsoft Graph PowerShell) # Non-CQL: run interactively by an admin with AuditLog.Read.All Connect-MgGraph -Scopes "AuditLog.Read.All","Directory.Read.All" Get-MgAuditLogDirectoryAudit -Filter "activityDisplayName eq 'Register device' or activityDisplayName eq 'Add device'" | Sort-Object ActivityDateTime -Descending | Select-Object ActivityDateTime, InitiatedBy, TargetResources Get-MgAuditLogDirectoryAudit -Filter "activityDisplayName eq 'Add Windows Hello for Business credential'" | Sort-Object ActivityDateTime -Descending | Select-Object ActivityDateTime, InitiatedBy, TargetResources
Secure web gateway / proxy pivot
- Grep proxy/SWG logs for the page title string
Login - KNIGHT OFFICEin captured page titles or TLS SNI logs foridoej.com. - Grep for the Cloudflare Turnstile sitekey
0x4AAAAAADrkE-VuOnNDfr6Win any HAR captures or web-isolation logs -- a distinctive, low-FP fingerprint of this specific kit's phishing page. - Historical retro-hunt only: outbound clicks through a Monday.com tracking redirect immediately followed by a hit on a compromised Joomla site are worth a one-time historical pull, but the specific Joomla host Huntress observed was already taken down at publication time.
CrowdStrike LogScale CQL Hunt Queries
This is an identity/SaaS-led hunt. Q1-Q6 and Q8 require Entra ID sign-in/audit logs ingested into Falcon LogScale (Identity Protection license + connector); only Q7 runs on standard endpoint sensor telemetry alone. SaaS/IdP field names and repo prefixes are parser-dependent per tenant — every identity query below carries an explicit NOTE: field unverified: validate in tenant line; confirm each against one live sample row before scheduling.
Looks for: the two literal token-replay client strings Huntress observed (python-requests/2.34.2, OAuth2:Token) in Entra ID sign-in logs. FP: a dev-tenant automation account pinned to this exact library version is the only plausible false positive.
// HUNT: Knight Office Token-Replay User-Agent Fingerprint // MITRE: T1528, T1550.001, T1557 // CONF: high FP: low COST: low | REQUIRES: repo=azure_signinlogs (Entra ID sign-in logs, Identity Protection / M365 connector) // NOTE: field unverified: validate in tenant -- SaaS/IdP field names and repo prefix vary by connector; confirm against a live sample row // FALSE POSITIVES: a first-party automation/CI job calling Graph or AAD endpoints with the Python `requests` library pinned to this exact version is rare but possible in a dev/test tenant // TUNING: exclude documented service-principal/automation accounts that legitimately use python-requests against Graph, filtered by userPrincipalName // LOOKBACK: 30d userAgent = "python-requests/2.34.2" or userAgent = "OAuth2:Token" | table([@timestamp, userPrincipalName, ipAddress, appDisplayName, clientAppUsed, userAgent, correlationId]) | sort(@timestamp, order=desc)
Looks for: the callback-proxy pattern Huntress used to first catch this incident -- repeated post-MFA sign-ins to Microsoft Authentication Broker / OfficeHome from one IP across a short window. FP: legitimate travel, corporate VPN/NAT egress, or a shared branch-office IP will also cluster here -- triage against known-good egress ranges before acting.
// HUNT: Post-MFA Authentication Broker Sign-In Repeated From One Source (Callback-Proxy Pattern) // MITRE: T1557, T1111, T1078.004 // CONF: medium FP: medium COST: low | REQUIRES: repo=azure_signinlogs // NOTE: field unverified: validate in tenant -- confirm appDisplayName string values against a live sample row // FALSE POSITIVES: legitimate travel, corporate VPN/NAT egress, a shared branch-office IP, or an approved third-party MDM broker // TUNING: exclude known corporate VPN/NAT egress ranges once confirmed benign, e.g. !cidr(ipAddress, subnet=["203.0.113.0/24"]) // LOOKBACK: 30d appDisplayName = "Microsoft Authentication Broker" or appDisplayName = "OfficeHome" | groupBy([userPrincipalName, ipAddress], function=[count(as=Hits), collect(userAgent), collect(appDisplayName)], limit=1000) | Hits >= 3 | sort(Hits, order=desc)
Looks for: the persistence step's first move -- a new device registered into Entra ID. FP: a legitimate Autopilot/Intune bulk-enrollment wave will also fire this; exclude the known enrollment service principal.
// HUNT: Rogue Microsoft Entra Device Registration // MITRE: T1098.005 // CONF: high FP: low COST: low | REQUIRES: repo=azure_auditlogs (Entra ID Directory Audit logs) // NOTE: field unverified: validate in tenant -- operationName/category strings and the targetResources.* path per Microsoft's Entra audit log activity reference; confirm against a live sample row // FALSE POSITIVES: legitimate bulk device enrollment (Autopilot/Intune rollout) or a new-hire onboarding wave // TUNING: exclude the known Intune/Autopilot enrollment service principal and any documented bulk-provisioning change window // LOOKBACK: 30d operationName = "Register device" or operationName = "Add device" | table([@timestamp, "initiatedBy.user.userPrincipalName", "initiatedBy.user.ipAddress", "targetResources.displayName", correlationId]) | sort(@timestamp, order=desc)
Looks for: the centerpiece of this campaign -- a WHfB/passkey key credential added to an account. This is what survives password reset and token revocation. FP: legitimate first-time WHfB enrollment during scheduled onboarding.
// HUNT: Windows Hello for Business Key Credential Bound Outside Baseline // MITRE: T1098.005, T1556 // CONF: high FP: medium COST: low | REQUIRES: repo=azure_auditlogs // NOTE: field unverified: validate in tenant -- confirm the exact operationName string your connector emits for a WHfB/passkey credential add // FALSE POSITIVES: legitimate first-time WHfB enrollment during scheduled onboarding, or a user-initiated self-service device reset // TUNING: exclude WHfB credential adds inside the account's documented onboarding window that correlate to an Intune Autopilot enrollment record // LOOKBACK: 30d operationName = "Add Windows Hello for Business credential" or operationName = "User registered security info" | table([@timestamp, "initiatedBy.user.userPrincipalName", "initiatedBy.user.ipAddress", "targetResources.userPrincipalName", correlationId]) | sort(@timestamp, order=desc)
Looks for: the single highest-fidelity signal in this pack -- Q3 and Q4 correlated on the same user inside one lookback window, exactly the sequence Huntress documented (register device → bind WHfB → sign in passwordlessly). FP: a change-managed device replacement performed by IT in the same window.
// HUNT: Correlated Persistence Chain -- Rogue Device Registration + WHfB Bind, Same Identity // MITRE: T1098.005 // CONF: high FP: low COST: medium | REQUIRES: repo=azure_auditlogs; correlates Q3 and Q4 operation types on the same target user // NOTE: field unverified: validate in tenant -- this assumes both operations resolve the same targetResources.userPrincipalName value; confirm on a sample pair before promoting to a scheduled search // FALSE POSITIVES: a coordinated, change-managed device replacement/reimage performed by IT inside a documented window // TUNING: exclude accounts with an open device-replacement change ticket at the time of the match // LOOKBACK: 30d defineTable(query={ operationName = "Register device" or operationName = "Add device" | rename(field="targetResources.userPrincipalName", as=RegUser) | table([RegUser, @timestamp]) }, name="rogue_device_regs", include=[RegUser, @timestamp]) | operationName = "Add Windows Hello for Business credential" or operationName = "User registered security info" | rename(field="targetResources.userPrincipalName", as=RegUser) | match(table="rogue_device_regs", field=RegUser, column=RegUser) | table([RegUser, @timestamp, operationName]) | sort(@timestamp, order=desc)
Looks for: sign-ins from Tencent Cloud's published coarse IP ranges. FP: extremely high on its own -- Tencent Cloud hosts huge numbers of legitimate SaaS/CDN tenants. Use only to corroborate a Q1/Q3/Q4 hit, never as a standalone trigger.
// HUNT: Tencent Cloud Replay-Infrastructure Correlation (Support Signal Only) // MITRE: T1090.003, T1665 // CONF: low FP: high COST: medium | REQUIRES: repo=azure_signinlogs // NOTE: field unverified: validate in tenant -- Falcon does not natively expose ASN on sign-in log ingest; the ranges below are first/second-octet hints from the primary source, not full CIDR blocks // FALSE POSITIVES: extremely high -- Tencent Cloud hosts a large number of legitimate SaaS/CDN tenants; a hit here is not actionable on its own // TUNING: AND this query's hits against Q1 (UA fingerprint) or Q3/Q4 (device/WHfB persistence) before triage -- never promote this pattern alone to a blocking IOA or Custom IOC // LOOKBACK: 30d ipAddress = "43.*" or ipAddress = "170.106.*" or ipAddress = "162.62.*" or ipAddress = "49.51.*" | table([@timestamp, userPrincipalName, ipAddress, userAgent, appDisplayName]) | sort(@timestamp, order=desc)
Looks for: the one genuinely endpoint-native signal in this pack -- a managed host resolving idoej[.]com or any of the 25 known .vu phishing domains. Standard Falcon sensor telemetry; no Identity Protection license required. FP: none expected -- these are single-purpose phishing domains.
// HUNT: DNS Resolution of Known Knight Office Phishing Domains // MITRE: T1566.002, T1204.001 // CONF: high FP: low COST: low | REQUIRES: DnsRequest telemetry (standard Falcon sensor -- no Identity Protection license needed) // FALSE POSITIVES: none expected -- these are single-purpose phishing domains named in the primary source // TUNING: none required at FP low -- but re-validate this domain list at deploy time, phishing-kit landing domains commonly rotate within 30-90 days // LOOKBACK: 30d #event_simpleName = DnsRequest | DomainName = /^(advancedplacyncement|amstardmzsmc|arandasoftzfdware|avisoretentiunionllc|capitalflwxinancialpartners|certififiycationedge|connectivnqzityltd|crrbcearegroup|digitaltrafwwrficsystems|exceltecbusinessbwpsolutions|genamewwgdiamarketing|globaieflsoftinc|globalmixeucbdmodetechnologyinc|globalprojectspvtltd|joinbusinessmanagementconsdjeulting|kentmanqhfufacturingcompany|kleepxrnlinecorporation|knsinternacshtional|monttmmlrustcompany|mtprormtductions|realestatecotblrp|siottxgroup|summitcapitaltrapojininggroup|techcompositnkoes|techromixsolutionlonsinc)\.vu$/i or DomainName = /^idoej\.com$/i | table([@timestamp, aid, ComputerName, UserName, DomainName]) | sort(@timestamp, order=desc)
Looks for: the exact failure Huntress documented -- two failed OAuth2 token-authentication attempts because the WHfB NGC key was not yet available, immediately preceding the successful WHfB bind. A very distinctive fingerprint of this attack's specific sequencing. FP: a legitimate WHfB provisioning race condition on a brand-new Autopilot-enrolled device, which self-resolves within minutes.
// HUNT: Windows Hello for Business Pre-Auth Failure Fingerprint (Missing Device/NGC Key) // MITRE: T1556, T1098.005 // CONF: high FP: low COST: low | REQUIRES: repo=azure_signinlogs; failure/error-reason text field // NOTE: field unverified: validate in tenant -- confirm the exact failureReason/error text your connector emits for a missing device key (commonly an AADSTS50155-class or AADSTS53003-class error); the substrings below are a starting point, not guaranteed verbatim // FALSE POSITIVES: a legitimate WHfB provisioning race condition on a brand-new managed device during normal Autopilot enrollment, which self-resolves within minutes with no externally-sourced success afterward // TUNING: exclude devices with an open Intune Autopilot enrollment ticket at the time of the failure // LOOKBACK: 30d failureReason like "*device key*" or failureReason like "*NGC*" or failureReason like "*strong auth*" | table([@timestamp, userPrincipalName, ipAddress, userAgent, failureReason, correlationId]) | sort(@timestamp, order=desc)
CrowdStrike Custom IOA Recommendations
Honesty check: a classic Falcon Custom IOA is a host-based behavioral indicator (process tree pattern). Most of this hunt is identity/SaaS telemetry, which does not fit that model -- the right promotion path for those queries is an NG-SIEM Scheduled Search or Fusion SOAR workflow that raises an identity alert, not a host-based IOA that could trigger isolation. Only Q7 is a genuine endpoint Custom-IOA/Custom-IOC candidate.
| Query | Recommended Path | Deployment Notes |
|---|---|---|
| Q7 -- DNS to known .vu / idoej[.]com domains | Custom IOC (domain, block/detect) | Genuine endpoint-native signal; safe to promote to a blocking Custom IOC once the domain list is validated against current resolution activity. Re-review the domain list every 30-90 days -- kit domains rotate. |
| Q1 -- Token-replay UA fingerprint | NG-SIEM Scheduled Search → P2 identity alert | High confidence, low FP -- safe to schedule hourly. Route to the identity/IR queue, not endpoint containment (there is no endpoint to isolate on the attacker side). |
| Q3, Q4 -- Rogue device reg / WHfB bind (individually) | NG-SIEM Scheduled Search → P2 | Schedule daily; tune against the Intune/Autopilot enrollment service principal first to avoid onboarding-wave noise. |
| Q5 -- Correlated device+WHfB chain | NG-SIEM Scheduled Search → P1, page on-call | This is the pack's highest-fidelity finding. A hit here should page identity/IR immediately and trigger the containment runbook (Section 14) -- do not wait for business hours. |
| Q8 -- NGC/device-key failure fingerprint | NG-SIEM Scheduled Search → P2 | Pairs well with Q5 as a leading indicator; schedule daily. |
| Q2, Q6 | Investigate-only | FP profile is too high to schedule as a standing alert. Keep as an on-demand pivot query analysts run when triaging a Q1/Q3/Q4/Q5 hit. |
Machine-Readable IOC Appendix
All infrastructure IOCs below ship at action=detect / severity=high (not prevent/critical) per the second-source policy in Section 2 -- single-sourced to Huntress, 13 days post-disclosure. Every value traces to the saved source snapshot; see Section 18.
type,value,action,severity,expiration,description,tags domain,idoej.com,detect,high,2027-03-15,Knight Office AiTM operator console (reverse IP of 104.37.188.94),campaign:KnightOffice ipv4,104.37.188.94,detect,high,2027-03-15,Knight Office AiTM operator console + rogue Entra device registration source,campaign:KnightOffice domain,advancedplacyncement.vu,detect,high,2027-03-15,Knight Office phishing landing domain,campaign:KnightOffice domain,amstardmzsmc.vu,detect,high,2027-03-15,Knight Office phishing landing domain,campaign:KnightOffice domain,arandasoftzfdware.vu,detect,high,2027-03-15,Knight Office phishing landing domain,campaign:KnightOffice domain,avisoretentiunionllc.vu,detect,high,2027-03-15,Knight Office phishing landing domain,campaign:KnightOffice domain,capitalflwxinancialpartners.vu,detect,high,2027-03-15,Knight Office phishing landing domain,campaign:KnightOffice domain,certififiycationedge.vu,detect,high,2027-03-15,Knight Office phishing landing domain,campaign:KnightOffice domain,connectivnqzityltd.vu,detect,high,2027-03-15,Knight Office phishing landing domain,campaign:KnightOffice domain,crrbcearegroup.vu,detect,high,2027-03-15,Knight Office phishing landing domain,campaign:KnightOffice domain,digitaltrafwwrficsystems.vu,detect,high,2027-03-15,Knight Office phishing landing domain,campaign:KnightOffice domain,exceltecbusinessbwpsolutions.vu,detect,high,2027-03-15,Knight Office phishing landing domain,campaign:KnightOffice domain,genamewwgdiamarketing.vu,detect,high,2027-03-15,Knight Office phishing landing domain,campaign:KnightOffice domain,globaieflsoftinc.vu,detect,high,2027-03-15,Knight Office phishing landing domain,campaign:KnightOffice domain,globalmixeucbdmodetechnologyinc.vu,detect,high,2027-03-15,Knight Office phishing landing domain,campaign:KnightOffice domain,globalprojectspvtltd.vu,detect,high,2027-03-15,Knight Office phishing landing domain,campaign:KnightOffice domain,joinbusinessmanagementconsdjeulting.vu,detect,high,2027-03-15,Knight Office phishing landing domain,campaign:KnightOffice domain,kentmanqhfufacturingcompany.vu,detect,high,2027-03-15,Knight Office phishing landing domain,campaign:KnightOffice domain,kleepxrnlinecorporation.vu,detect,high,2027-03-15,Knight Office phishing landing domain,campaign:KnightOffice domain,knsinternacshtional.vu,detect,high,2027-03-15,Knight Office phishing landing domain,campaign:KnightOffice domain,monttmmlrustcompany.vu,detect,high,2027-03-15,Knight Office phishing landing domain,campaign:KnightOffice domain,mtprormtductions.vu,detect,high,2027-03-15,Knight Office phishing landing domain,campaign:KnightOffice domain,realestatecotblrp.vu,detect,high,2027-03-15,Knight Office phishing landing domain,campaign:KnightOffice domain,siottxgroup.vu,detect,high,2027-03-15,Knight Office phishing landing domain,campaign:KnightOffice domain,summitcapitaltrapojininggroup.vu,detect,high,2027-03-15,Knight Office phishing landing domain,campaign:KnightOffice domain,techcompositnkoes.vu,detect,high,2027-03-15,Knight Office phishing landing domain,campaign:KnightOffice domain,techromixsolutionlonsinc.vu,detect,high,2027-03-15,Knight Office phishing landing domain,campaign:KnightOffice
# Knight Office -- behavioral / non-atomic signatures (not bulk-importable; hunt or correlate manually) Email self-spoof: From header == To/recipient header == Return-Path header (all three match the victim's own address) Lure subject regex: (?i)(signature required|approval pending|ref[\s-]?id|lmportant|slgnature|verlvied) Phishing page title: Login - KNIGHT OFFICE Cloudflare Turnstile sitekey: 0x4AAAAAADrkE-VuOnNDfr6W Token-replay User-Agent: python-requests/2.34.2 Token-replay User-Agent literal string: OAuth2:Token WHfB device-registration client string: Dsreg/10.0 (Windows 10.0.19044.1826) Lure sender IP (single example case, not for standalone blocking): 154.127.53.78 Residential callback-proxy first hop (redacted by source, partial): 73.125.13.x (Comcast Cable / Spur-flagged proxy resale) Token-replay hosting ranges (too broad to block -- correlation only): Tencent Cloud 43.x / 170.106.x / 162.62.x / 49.51.x
# Knight Office -- operator console / kit fingerprint Console page title: Login - KNIGHT OFFICE Backend stack: Python Flask + Flask-WTF Bot-filtering front end: Cloudflare Turnstile (sitekey 0x4AAAAAADrkE-VuOnNDfr6W) TLS: self-signed certificate observed on the operator console Console features advertised: "Capture & Management from Single place", "Webmail access & auto-refresh", "Deploy custom links", "Real-time visitor statistics" Related/sibling PhaaS kits (different infrastructure -- do not merge IOCs): EvilTokens, Kali365 / Octopi365
# Entra ID / M365 hardening spot-check -- run in order, all read-only
# 1) Is device-code flow still allowed org-wide?
Get-MgIdentityConditionalAccessPolicy | Where-Object { $_.Conditions.ClientAppTypes -contains "all" } |
Select-Object DisplayName, State
# 2) Who can register/join devices to Entra ID without restriction?
Get-MgPolicyDeviceRegistrationPolicy | Select-Object AzureADJoin, AzureADRegistration
# 3) List WHfB/passkey credentials added in the last 30 days, newest first
Get-MgAuditLogDirectoryAudit -Filter "activityDisplayName eq 'Add Windows Hello for Business credential'" |
Where-Object { $_.ActivityDateTime -gt (Get-Date).AddDays(-30) } |
Sort-Object ActivityDateTime -Descending | Select-Object ActivityDateTime, InitiatedBy, TargetResources
# 4) Is token protection (device-bound tokens) enforced on any Conditional Access policy?
Get-MgIdentityConditionalAccessPolicy | Select-Object DisplayName, SessionControls
Detection Validation Gates
| Gate | What To Confirm | Status |
|---|---|---|
| Telemetry ready | Entra ID sign-in + audit logs are flowing into Falcon LogScale (Identity Protection connector active); Falcon sensor DnsRequest telemetry is enabled fleet-wide | Confirm in tenant before deploying Q1-Q6, Q8 |
| Benign baseline | Run Q3/Q4 over a 30-day lookback first and manually tag every hit as Autopilot/Intune-managed vs. unmanaged before scheduling -- this builds the exclusion list Q3/Q4/Q5's TUNING lines assume | Required, one-time |
| Positive test | No safe, non-destructive way to generate a true Knight Office WHfB-persistence event in a test tenant. Substitute: manually register a test device + WHfB credential on a throwaway test account and confirm Q3/Q4/Q5 all fire on it | Recommended before go-live |
| Promotion criteria | Q5 promotes to a paging P1 only after the benign baseline above shows <1 false positive per week in the pilot tenant | Gate before P1 paging |
| IOC provenance | Every atomic IOC in Section 10's Falcon IOC CSV traces to the saved Huntress source snapshot (see Section 2 / Section 18) -- mechanically enforced by check_ioc_provenance.py at build time | Passed at build |
| Second-source | No independent corroboration of atomic infrastructure IOCs yet (13 days post-disclosure) -- all infra IOCs therefore ship at detect/high, not prevent/critical, per policy | Re-check in 30 days; upgrade to prevent/critical only after a second source appears |
Hardening — Tiered
- Block or tightly restrict the OAuth device-code flow via Conditional Access, with narrow named exclusions only where operationally required. Microsoft's own guidance (echoed across every device-code phishing kit Huntress has profiled) is "get as close as possible to a unilateral block." Mitigation: MITRE M1032 (Multi-factor Authentication) / M1042 (Disable or Remove Feature or Program). Verify: the Entra/M365 Audit Checklist item 1 in Section 10.
- Restrict who can register/join devices to Entra ID to an admin-approved group rather than "All users." A rogue device registration is the first move of this campaign's persistence chain (T1098.005). Mitigation: M1018 (User Account Management). Verify: Entra/M365 Audit Checklist item 2.
- Alert on every new WHfB/passkey credential addition for 30 days while the Q3-Q5 baseline is being built (Section 11) -- this is a low-volume event in most tenants and a manual daily review is viable immediately, before the scheduled search is tuned. Mitigation: M1047 (Audit). Verify: Entra/M365 Audit Checklist item 3.
- Enable Entra ID token protection (device-bound / Continuous Access Evaluation) on Conditional Access policies covering Exchange Online and SharePoint Online. Token protection binds the session token to the issuing device, which directly defeats the reverse-proxy replay this kit depends on -- it is the single most direct technical countermeasure to Knight Office's core mechanism. Mitigation: M1032. Verify: Entra/M365 Audit Checklist item 4; pilot on an IT ring first (⚠ best-practice, no formal CIS/MS-Baseline control number yet published for this specific feature as of this pack's date -- treat as a strong vendor-recommended control).
- Move high-value accounts to phishing-resistant MFA (FIDO2 security keys or certificate-based auth) instead of push/OTP MFA. Push-based MFA is exactly what this kit relays through the AiTM proxy; FIDO2's origin-binding cannot be relayed the same way. Mitigation: M1032. Verify: Entra ID > Authentication methods policy, confirm FIDO2 is enabled and targeted at privileged roles.
- Anti-phishing / impersonation policies for self-spoofing in Exchange Online Protection -- specifically detect a message whose From, To, and Return-Path all resolve to the same internal recipient address, which is not a pattern a legitimate email ever produces. Mitigation: M1047 / EOP anti-phishing policy tuning (no formal CIS benchmark line item; vendor best-practice). Verify: a test self-spoofed message to a disposable mailbox is quarantined.
- Formal device-compliance gating on Conditional Access for all sensitive apps (require hybrid-joined or compliant device), so a rogue unmanaged device registration cannot by itself satisfy sign-in requirements even if the WHfB bind succeeds. Mitigation: M1032 / M1018. Architectural change -- requires Intune compliance baseline coverage across the fleet first.
- Quarterly Entra device + authentication-method attestation review: a recurring, change-managed audit reconciling every registered device and every WHfB/passkey credential against an authoritative asset inventory (not just a point-in-time alert response). Mitigation: M1047. Budget/process change, not a technical control.
- Security awareness refresh targeting this specific lure family (self-spoofed "from yourself" emails, device-code "enter this code at microsoft.com" prompts) -- device-code phishing specifically relies on a legitimate-looking Microsoft prompt that most existing phishing training does not cover. Mitigation: M1017 (User Training).
Deployable Playbooks
All three playbooks below are read/write Graph PowerShell against Entra ID -- no endpoint agent, GPO, or registry change is involved, since this campaign's decisive control point is identity, not the endpoint.
Playbook 1: Restrict device-code flow
# Playbook 1 -- Restrict device-code flow via Conditional Access (Graph PowerShell)
# Prerequisites: Global Administrator or Conditional Access Administrator role; Microsoft.Graph PowerShell SDK installed
# Reboot required: No
# Rollback: Set the policy State back to "disabled" (see rollback command at bottom) -- reversible in seconds, no data loss
Connect-MgGraph -Scopes "Policy.ReadWrite.ConditionalAccess"
$params = @{
DisplayName = "Block Device Code Flow - Knight Office response"
State = "enabledForReportingButNotEnforced" # start in report-only, then flip to "enabled" after a 1-week pilot
Conditions = @{
ClientAppTypes = @("all")
Applications = @{ IncludeApplications = @("All") }
Users = @{ IncludeUsers = @("All"); ExcludeGroups = @("<break-glass-and-documented-exception-group-id>") }
Authentication = @{ AuthenticationFlows = @{ TransferMethods = "deviceCodeFlow" } }
}
GrantControls = @{ Operator = "OR"; BuiltInControls = @("block") }
}
New-MgIdentityConditionalAccessPolicy -BodyParameter $params
# Rollback:
# Update-MgIdentityConditionalAccessPolicy -ConditionalAccessPolicyId <id> -State "disabled"
Playbook 2: Restrict Entra device registration
# Playbook 2 -- Restrict Entra device registration to an admin-approved group
# Prerequisites: Global Administrator role; a pre-created "Approved Device Enrollers" security group
# Reboot required: No
# Rollback: revert AzureADJoin/AzureADRegistration back to "all", documented below -- reversible, no data loss
Connect-MgGraph -Scopes "Policy.ReadWrite.DeviceConfiguration"
$policy = Get-MgPolicyDeviceRegistrationPolicy
Update-MgPolicyDeviceRegistrationPolicy -DeviceRegistrationPolicyId $policy.Id -BodyParameter @{
AzureADJoin = @{ AllowedState = "restricted"; AllowedGroups = @("<approved-device-enrollers-group-id>") }
AzureADRegistration = @{ AllowedState = "restricted"; AllowedGroups = @("<approved-device-enrollers-group-id>") }
}
# Rollback:
# Update-MgPolicyDeviceRegistrationPolicy -DeviceRegistrationPolicyId $policy.Id -BodyParameter @{
# AzureADJoin = @{ AllowedState = "all" }; AzureADRegistration = @{ AllowedState = "all" }
# }
Playbook 3: Enable token protection (pilot ring)
# Playbook 3 -- Enable Entra ID token protection (device-bound sessions) on a pilot Conditional Access policy
# Prerequisites: Microsoft Entra ID P2, Conditional Access Administrator role, a pilot ring group
# Reboot required: No (client-side, transparent re-auth on next token refresh for pilot users)
# Rollback: remove the SignInTokenProtection session control from the policy -- reversible; pilot users simply
# lose the device-binding requirement on next sign-in, no account lockout risk
Connect-MgGraph -Scopes "Policy.ReadWrite.ConditionalAccess"
$params = @{
DisplayName = "Pilot - Token Protection for Exchange/SharePoint - Knight Office response"
State = "enabled"
Conditions = @{
Applications = @{ IncludeApplications = @("Office365") }
Users = @{ IncludeGroups = @("<pilot-ring-group-id>") }
}
SessionControls = @{ SignInTokenProtection = @{ IsEnabled = $true } }
}
New-MgIdentityConditionalAccessPolicy -BodyParameter $params
# Rollback:
# Update-MgIdentityConditionalAccessPolicy -ConditionalAccessPolicyId <id> -SessionControls @{ SignInTokenProtection = @{ IsEnabled = $false } }
Containment Runbook
Critical sequencing note: for this campaign, revoking sessions and resetting the password before removing the rogue device and WHfB credential does NOT evict the attacker -- they simply sign back in passwordlessly via WHfB. Eradication must happen before (or atomically with) the standard "reset and revoke" response.
| Phase | Actions | Owner | Evidence to Preserve |
|---|---|---|---|
| Isolate | Disable the affected user account sign-in (do NOT yet revoke sessions or reset password). Snapshot current Entra device registrations and authentication methods for the account before touching anything. | Identity/IR on-call | Export of Get-MgUserRegisteredDevice and Get-MgUserAuthenticationMethod for the account, timestamped |
| Eradicate | 1) Remove the rogue/unrecognized device from the account's registered devices. 2) Delete the unauthorized WHfB/passkey key credential. 3) THEN revoke all refresh tokens / sign-in sessions. 4) THEN force a password reset. 5) Review and remove any other authentication methods added in the same window (Q4/Q5 hit list). | Identity/IR on-call | Before/after diff of registered devices and authentication methods; the specific operationName/timestamp of the removed entries |
| Recover | Re-enroll the user's legitimate device(s) through the normal, verified onboarding path. Require re-registration of MFA under supervised/verified conditions (video call or in-person), not a self-service link. Confirm no other accounts share a device/WHfB registration pattern from the same source IP (pivot with Q3/Q5 grouped by IP). | Identity/IR + Helpdesk | New enrollment confirmation; sweep results across the tenant for related accounts |
| Post-incident | Add the account to the 30-day heightened-monitoring list (Section 11 benign-baseline exclusions get revisited for this account). Feed the specific redirect/domain/proxy indicators observed into the Falcon IOC CSV (Section 10) if not already present. Brief the user on the self-spoofed lure pattern. | Identity/IR lead | Updated IOC CSV; closed-loop note in the ticket (Section 16) |
Detection Coverage Map
| Technique | Behavior | CQL | IOA / Scheduled Search | Coverage |
|---|---|---|---|---|
| T1608.005 / T1566.002 / T1204.001 | Lure email + redirect chain | None (mail-side) | Section 7 native hunt only | GAP -- no Falcon EDR visibility |
| T1557 / T1111 / T1528 / T1078.004 | AiTM token theft & replay | Q1, Q2, Q6 | Q1 → Scheduled Search P2 | Good (requires Identity Protection connector) |
| T1098.005 | Rogue Entra device registration | Q3, Q5 | Q3 → P2; Q5 → P1 page | Good -- centerpiece coverage |
| T1098.005 / T1556 | WHfB key-credential persistence bind | Q4, Q5, Q8 | Q4 → P2; Q5 → P1 page | Good -- centerpiece coverage |
| T1090.003 / T1665 | Replay/proxy infrastructure | Q6 | Investigate-only | Partial -- support signal, high FP alone |
| T1566.002 (domain sighting) | Endpoint resolves known phishing domain | Q7 | Q7 → Custom IOC block | Good -- genuine endpoint-native coverage |
| -- (local WHfB/NGC enrollment on victim endpoint) | Attacker enrolls their OWN device, not the victim's | None possible | None | GAP -- structurally invisible to victim-endpoint EDR by design of the attack |
Telemetry-ready and benign-baseline validation gates for every query above are detailed in Section 11; the second-source/provenance status of every shipped IOC is detailed in Section 2 and enforced mechanically at build time.
Hunt Summary Ticket
TITLE: Knight Office -- M365 AiTM Token Theft + Entra ID / WHfB Persistence Hunt SEVERITY: High (active campaign; persistence survives password reset and token revocation) SCOPE: Microsoft Entra ID sign-in + audit logs (tenant-wide); Falcon endpoint DNS telemetry (fleet-wide) HYPOTHESIS: Knight Office AiTM phishing has captured M365 session tokens and used at least one to register a rogue Entra ID device and bind a Windows Hello for Business key credential, giving the operator passwordless re-entry that a standard password-reset/token-revoke response will not remove. QUERIES: Q1-Q8 (Section 8); native mail/audit hunts (Section 7) DO FIRST: Run Q3, Q4, and Q5 over a 30-day lookback and manually triage every hit against known device-enrollment records BEFORE scheduling anything -- this is the centerpiece finding and the one most worth a human look on day one. FINDINGS: [fill in after first run -- list any Q3/Q4/Q5 hits with no matching Autopilot/Intune record] GAPS: Mail/redirect-chain leg and the phishing page itself are invisible to Falcon EDR (Section 5, 15). Attacker's own rogue-device enrollment cannot be seen from the victim endpoint by design. ACTIONS: If Q5 fires, invoke the Containment Runbook (Section 14) in the documented order -- eradicate device/WHfB BEFORE revoke/reset, not after. OWNER: Identity/IR on-call VERSION: v0.1 -- 2026-09-15
Changelog
References
| Tier | Source | Used For | Access Date |
|---|---|---|---|
| Tier 1 -- Primary | Huntress -- "Inside Knight Office, a New M365 AiTM Phishing Kit" (published 2026-09-02) | Attack chain, all atomic IOCs, MITRE mapping, campaign-scale statistics | 2026-09-15 |
| Tier 2 -- Vendor background | Huntress -- "Inside Kali365, a Device Code Phishing Ecosystem" | Device-code-flow hardening recommendation; UA/ASN hunting pattern shape (no IOCs carried over -- different campaign) | 2026-09-15 |
| Tier 1 -- Vendor docs | Microsoft Learn -- Microsoft Entra audit log activity reference | Canonical operationName strings for device registration and WHfB credential events (Q3-Q5, Section 7) | 2026-09-15 |
| — | itsecurityguru.org coverage of the same story (URL located via search, not cited) | Not used -- HTTP 403 (Cloudflare bot-challenge) on every fetch attempt; no snapshot could be saved | Attempted 2026-09-15 |
Full verbatim source snapshots (fetched 2026-09-15) are archived alongside this pack in KnightOffice-M365-AiTM-Hunt-sources/: 01-huntress-knight-office.txt, 02-huntress-kali365-context.txt, 03-msft-entra-audit-activities.txt.
Generated: 2026-09-15 · HuntPack v0.1 (Draft) · Author: HuntPack