15 KiB
Cascades Tucson — 8-User Breach Check (Read-Only)
Date: 2026-04-20 (UTC)
Tenant: Cascades Tucson (cascadestucson.com, 207fa277-e9d8-4eb7-ada1-1064d2221498)
Scope: Read-only breach check across all 7 users targeted in Mike's 04-20 phishing sweep + JD Martin (named by Howard; previously a false-positive)
App used: Legacy Claude-MSP-Access Graph API app (fabb3421-8b34-484b-bc17-e46de9703418). New tiered ComputerGuru Security Investigator app vault files do not yet exist in D:/vault/msp-tools/ — provision those before next run.
Operator: Howard Enos (ACG-TECH03L)
Posture: Investigate + document only. No remediation actions taken.
Per-User Verdicts
| User | Verdict | Immediate action needed? |
|---|---|---|
| John Trozzi | CLEAN | No (re-confirms 04-20 AM check) |
| Megan Hiatt | CLEAN but actively attacked via SMTP AUTH | Yes — disable SMTP AUTH |
| Dax Howard | CLEAN, 1 disabled external-forward rule to verify | Clarify w/ Dax |
| Lois Lane | CLEAN | No |
| Meredith Kuhn | CLEAN, 1 dormant rule with attacker-signature name | Yes — delete .... rule |
| Anna Pitzlin | Account disabled/offboarded; stale risky-user record | Low — clean up Identity Protection |
| Ann Dery | CLEAN but no MFA, 0 recent sign-ins, stale risky-user record | Yes — enroll MFA or disable |
| JD Martin | CLEAN | No (confirms false-positive exclusion from sweep) |
Bottom line: No active compromise on any of the 8 mailboxes. Two dormant concerns to resolve (Meredith's .... rule, Dax's disabled forward). Two account-hygiene gaps (Ann no-MFA, Anna stale offboarding state). One active attack vector that needs tenant-level control (SMTP AUTH credential stuffing against Megan).
10-Point Check Matrix
All checks per .claude/skills/remediation-tool/references/checklist.md. [OK] = within normal parameters, [!] = needs attention, [?] = ambiguous.
| # | Check | John | Megan | Dax | Lois | Meredith | Anna | Ann | JD |
|---|---|---|---|---|---|---|---|---|---|
| 01 | Visible inbox rules (Graph) | 0 OK | 1 OK | 3 OK | 0 OK | 3 OK | 0 OK | 0 OK | 0 OK |
| 02 | Auto-reply | off | off | off | off | off | alwaysEnabled (legit offboarding) | off | off |
| 03a | Hidden inbox rules (EXO REST) | 1 system | 4 OK | 4 (1 flag) | 1 system | 6 (1 flag) | 3 system | 3 system | 1 system |
| 03b | Non-SELF mailbox permissions | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 03c | Non-SELF SendAs | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 03d | Mailbox forwarding fields | null | null | null | null | null | null | null | null |
| 04a | OAuth grants | 2 OK | 4 OK | 1 OK | 0 | 2 OK | 1 OK | 2 OK | 0 |
| 04b | App role assignments | 1 (BlueMail) | 3 (iOS/Alignable/Adobe) | 3 (SurveyMonkey/Zoom/CalendarBridge) | 0 | 2 (iOS/ReadMtg) | 1 (Template.net [?]) |
1 (BlueMail) | 0 |
| 05 | Auth methods | 5 (phone, Auth, FIDO2) | 2 (pw, Auth) | 2 (pw, Auth) | 2 (pw, Auth) | 2 (pw, Auth) | 1 (pw only) | 1 (pw only) [!] | 2 (pw, Auth) |
| 06 | Interactive sign-ins 30d (non-US / legacy) | 12 / 0 / 0 | 122 / 106 / 108 | 0 / 0 / 0 | 11 / 0 / 0 | 0 / 0 / 0 | 0 / 0 / 0 | 0 / 0 / 0 | 0 / 0 / 0 |
| 07 | Directory audits 30d | 41 (our 04-16 reset) | 1 | 2 | 2 | 1 | 4 | 0 | 0 |
| 08 | Risky user / detections | none / 0 | none / 0 | none / 0 | none / 0 | none / 0 | low/atRisk stale 2023-11 | low/atRisk stale 2020-12 | none / 0 |
| 09 | Sent items recent 25 | normal | normal | normal | normal | normal | none post-disable | normal | normal |
| 10 | Deleted items recent 25 | normal | normal | normal | normal | normal | none post-disable | normal | normal |
No MFA-challenge, password-reset, sign-in-alert, or bounce-notification messages found in any Deleted Items across the 8 accounts (would indicate attacker cleanup). All legitimate sign-ins are from US IPs — for those who signed in interactively during the 30-day window.
Detailed Findings
1. John Trozzi — CLEAN (re-verified)
Matches Mike's 04-20 AM breach check. 12 interactive sign-ins all US/Phoenix (184.191.143.62). 5 auth methods (phone, 2x Authenticator, FIDO2). 41 directory audits — all from our 04-16 remediation cycle (password reset, disable/re-enable). Phishing emails from 04-20 were deleted in the sweep.
2. Megan Hiatt — CLEAN mailbox, ACTIVE credential-stuffing attack
Mailbox state: No malicious rules, no forwarding, no non-SELF delegates. 14 successful sign-ins all from her two known US IPs (184.191.143.62, 72.211.21.217) via Browser.
Active attack: 108 Authenticated SMTP sign-in attempts over 30 days, geographically distributed:
| Country | Attempts | Failure codes |
|---|---|---|
| GB (UK) | 48 | 50053 (smart lockout) |
| DE (Germany) | 30 | 50053 |
| NL (Netherlands) | 18 | 50053 |
| LT (Lithuania) | 6 | 50053 / 50126 (bad password) |
| CH (Switzerland) | 4 | 50053 |
| US | 2 | 50053 |
Every single attempt failed. Smart lockout (50053) triggered repeatedly — Entra is correctly blocking. BUT: if the attacker ever guesses a correct password, SMTP AUTH bypasses MFA because it uses Basic Authentication. This is the highest-risk attack surface still exposed on this tenant.
3. Dax Howard — CLEAN, dormant external-forward rule
3 inbox rules total:
- Two "Arizona ALFA" rules forwarding newsletters from
info+azalfa.org@ccsend.com(Constant Contact) to Meredith Kuhn — legitimate business. Duplicate (one is(1)) — consolidation opportunity, not a security issue. - One disabled rule "Copy of which is a meeting invitation or update" forwarding meeting requests to
dax@megaloscapital.com. Currently OFF.megaloscapital.comis Megalos Capital — likely Dax's personal/other-company email. Needs user confirmation.
0 interactive sign-ins in 30d, auth methods include Authenticator but with createdDateTime: null (possible duplicate-entry pattern like John had). Authenticator creation date null is low-risk but worth cleaning up.
4. Lois Lane — CLEAN
No custom rules. 11 interactive sign-ins all US. 2 auth methods (password, Authenticator). No anomalies.
5. Meredith Kuhn — CLEAN, DORMANT attacker-signature rule
Primary flag — rule named ....:
- Disabled (
Enabled: false) - Action: mark as read, move to
RSS Subscriptions, stop processing more rules - No
From/SubjectContainsWordsfilter — applies to everything if re-enabled - Owner:
meredith.kuhn - Priority: 3
This matches the textbook attacker-persistence pattern (short-or-blank name, silent move to obscure folder, stop further processing). BUT it is disabled. Get-InboxRule doesn't return creation date, so we can't confirm whether this was ever active or when it was turned off. Two possibilities:
- (A) Someone (Meredith, prior IT) found it and disabled it but didn't delete it.
- (B) Meredith created it herself and gave up on it — Outlook occasionally ships templates that can produce odd-named rules.
Either way, leaving it in place is a latent risk: if her account is ever compromised, re-enabling it is one click away. Recommend deleting it outright after confirming with Meredith she didn't create it.
Other 5 hidden rules: system defaults (Junk, 2 disabled OOF templates) + two disabled legitimate rules (support@focushr.net, results@j2labs.com).
6. Anna Pitzlin — ACCOUNT DISABLED (offboarded)
accountEnabled: falselastPasswordChangeDateTime: null- Auto-reply set to "We regret to inform you that Anna Pitzlin is no longer employed here. Please direct any future correspondence to Meredith Kuhn." (effective 04-20 18:00 UTC → 04-21 18:00 UTC; almost certainly configured then left indefinitely with a non-terminal schedule)
- Risky-user record:
low / atRisk, last updated 2023-11-16 — this is stale. Identity Protection never cleared the signal after offboarding.
Anna received 2 phishing emails in the 04-20 sweep because the account is still licensed and accepting inbound mail for the auto-reply. Not a compromise vector (no interactive auth possible, no MFA method configured, password disabled). The stale atRisk signal is noise.
Side issue: Verify with Mike whether Anna should be converted to a shared mailbox (cheaper, no license) or fully deleted after the retention window expires. Keeping a disabled user account licensed just to run an auto-reply is not standard.
7. Ann Dery — CLEAN mailbox, unused/unprotected account
accountEnabled: true,lastPasswordChangeDateTime: null— account never had a password changed (implying it predates the forced-change policy or was exempted)- Only 1 auth method: password. No MFA, no Authenticator, no FIDO2.
- 0 interactive sign-ins in 30d.
- Risky-user:
low / atRisk, last updated 2020-12-07 — 5+ year old stale signal. - 2 OAuth grants to BlueMail (same as John) — likely from original device pairing, dormant.
This is a dormant, enabled, non-MFA-protected account that received 2 phishing messages. If an attacker ever gets her password, there's no second factor to stop them. Recommend Mike confirm whether Ann still uses this account:
- If yes → enforce MFA enrollment
- If no → disable the account (don't delete — keep mailbox for historical access)
8. JD Martin — CLEAN
No custom rules, no forwarding, 0 non-SELF permissions, normal OAuth (none). Confirms JD was NOT targeted in the phishing campaign — his presence in the sweep was the false-positive HR-thread reply Mike correctly excluded. The HR thread from Ashley Jensen (HRPYDBRUNFOC...xlsx) was and remains legitimate internal payroll correspondence.
Why this keeps happening — root causes
Howard's question was "what can we do to prevent this." The phishing is landing because four layers of defense are not fully engaged:
| Gap | Impact | Fix |
|---|---|---|
DMARC is p=none |
Receiving servers (Microsoft) have no instruction to junk/reject mail that spoofs cascadestucson.com. SPF fails silently, mail lands. |
Publish p=quarantine pct=25 for 1 week → observe DMARC reports → p=reject. See _dmarc.cascadestucson.com TXT. |
| SMTP AUTH still enabled | Megan is being credential-stuffed daily across 5 countries. 108 attempts in 30d. An eventual guess bypasses MFA entirely. | Set-TransportConfig -SmtpClientAuthenticationDisabled $true (tenant-wide) + per-mailbox Set-CASMailbox -SmtpClientAuthenticationDisabled $true. Coordinate with any legacy scanners/MFPs on-site first. |
No tenant-wide anti-impersonation/anti-phish policy tuned for cascadestucson.com |
Lookalike-domain tricks (zoom.nl instead of zoom.us) and display-name spoofing get through. |
Defender for Office 365 anti-phishing policy → add cascadestucson.com as protected domain + key users (Meredith, CEO/admin tier) as protected users. Requires Defender P1 or M365 Business Premium. |
| No URL/IP blocklist from this campaign | Same attacker infrastructure can hit again tomorrow on different users. | Exchange TABL: IP block 139.28.37.117, 104.168.101.10, 207.189.10.75, 91.244.70.212. URL block zoom.nl, *.awstrack.me. |
User-level hygiene also matters:
- Ann Dery — no MFA method at all. If her account is active, enroll MFA today. If inactive, disable.
- Anna Pitzlin — offboard cleanup: convert to shared mailbox or remove license.
- Meredith Kuhn — delete the dormant
....inbox rule. - Dax Howard — confirm the
dax@megaloscapital.comexternal-forward rule is Dax's own, still disable/delete either way. - Megan, Meredith, Ann, Anna — none have FIDO2 or hardware tokens. Authenticator-push is sufficient for most, but for Meredith (finance/admin role) consider FIDO2 like John has.
Prioritized Action List
P1 — Tenant-level prevention (highest leverage)
- Publish DMARC
p=quarantine pct=25→ 1 week observation →p=reject. Coordinate with Meredith and verify DKIM signing is healthy first. Blocks ~all external-hosting spoofs going forward. - Disable SMTP Client Authentication tenant-wide. Megan's active attack ends the moment this is off. Check first with Mike whether any on-site devices (copier, HR scanner) use SMTP AUTH to send — if so, migrate them to App Password / Modern Auth or SMTP relay.
- Add TABL IP blocks + URL blocks from the 04-20 sweep (4 IPs +
zoom.nl+*.awstrack.me).
P2 — User-level cleanup (read-only; ask before acting)
- Delete Meredith's
....inbox rule after a 30-second confirmation with Meredith that she didn't create it. - Enroll Ann Dery in MFA (or disable account if she's no longer using it).
- Clarify Dax's
megaloscapital.comforwarding — delete the disabled rule regardless once confirmed benign. - Offboarding tidy-up for Anna Pitzlin — consider converting to shared mailbox; clear the stale
atRisksignal.
P3 — Defensive posture
- Defender for Office 365 anti-phishing policy for
cascadestucson.com(needs SKU confirmation — does Cascades have M365 Business Premium or E3+Defender?). - Baseline sweep of remaining 38 mailboxes not hit this month (per sweep report recommendation — attackers may cycle to fresh targets).
- Template.net OAuth grant (Anna Pitzlin) — publisher not verified. Low severity because account is disabled, but review if that app pattern appears on any active accounts during a re-sweep.
Raw Artifacts
All 8 users' raw JSON under:
/tmp/remediation-tool/207fa277-e9d8-4eb7-ada1-1064d2221498/user-breach/{user}_cascadestucson_com/
Files per user:
00_user.json— profile01_inbox_rules.json— Graph visible rules02_mbox_settings.json— mailbox settings (auto-reply)03a_hidden_rules.json— EXO Get-InboxRule with-IncludeHidden03b_mbox_perms.json— Get-MailboxPermission03c_recip_perms.json— Get-RecipientPermission (SendAs)03d_mailbox.json— Get-Mailbox (forwarding fields)04a_oauth.json— oauth2PermissionGrants04b_approles.json— appRoleAssignments05_auth_methods.json— authentication/methods06_signins.json— 30d interactive sign-in log07_audits.json— 30d directoryAudits where user is target08a_risky.json— identityProtection/riskyUsers08b_risk_det.json— identityProtection/riskDetections09_sent.json— last 25 sentitems10_deleted.json— last 25 deleteditems
Tooling notes for next session
- Fixed in this session:
user-breach-check.shreferenced old tier namesgraph/exchange; updated toinvestigator/investigator-exoto match the rewrittenget-token.sh. - Not fixed: the new tiered app vault files (
computerguru-security-investigator.sops.yamlet al) do not exist atD:/vault/msp-tools/. The skill's new 5-app architecture is not provisioned yet. This session fell back to inline curl calls using the legacyClaude-MSP-Accessapp. Mike should provision the new vault files before retiring the legacy app.