← All hunts medium TLP:CLEAR

Bypass of Legacy Identity Controls and Persistence via NHIs

An intruder has bypassed traditional MFA via session hijacking or push fatigue and established persistence using overprivileged non-human identities or standing administrative accounts.

Based on research by Proofpoint 2026-11-13 12 steps · 5 queries T1078 T1133 T1190 T1550 T1566

Brief

Why identity resilience matters

Proofpoint recently published 18 Outdated Identity And Access Management Assumptions To Retire, highlighting how traditional security boundaries have dissolved. Static MFA and permanent administrative rights create a false sense of security. Modern attackers do not break in; they log in using stolen sessions or by exhausting users through MFA fatigue. This hunt provides a structured way to verify if these identity-centric defenses are holding or if an intruder has already pivoted to persistent, non-human identities.

How the Hunt Flows

The hunt starts by scoping the environment for remote access gateways. It queries the software inventory for VPN and remote access packages to determine which hosts serve as the primary entry points for external traffic. Once gateways are identified, the hunt runs parallel queries to detect initial access anomalies. One query looks for MFA push fatigue: a sequence of multiple authentication failures followed by a single success for the same user and IP. Another query checks for outbound connections to known VPN indicators of compromise. An analyst triages these leads to confirm suspicious entry. This verdict then triggers the persistence phase. The hunt searches for rare sign-ins from non-human identities (NHIs) like service accounts or bots. It baselines these accounts to find instances where they appear on an unusual number of hosts or from new source IPs. Finally, the hunt pulls an inventory of standing administrative accounts. An agent correlates the initial access findings with any subsequent NHI or admin activity. If an account compromised via push fatigue is seen using service account credentials from the same infrastructure, the analyst confirms a malicious linkage.

Blind Spots

The hunt cannot determine if a specific session token was hijacked from a trusted device without debug-level IDP logs that track session identifiers. We also face a visibility gap regarding Just-In-Time (JIT) elevations. Without JIT logs, we cannot distinguish between a malicious actor using standing admin rights and a legitimate administrator performing unscheduled maintenance.

Steps

  1. Identify Remote Access Gateways

    Query · scoping

    Identify hosts running VPN or remote access software to focus the later network traffic analysis.

    reads hb_software_inventorysql
    SELECT DISTINCT device_hostname, package_name, package_version FROM hb_software_inventory WHERE (LOWER(package_name) LIKE '%checkpoint%' OR LOWER(package_name) LIKE '%vpn%')

    What a hit looks like. A list of hosts acting as remote gateways. Silence indicates no managed VPN software is recorded in inventory.

  2. Patterns of MFA Push Fatigue

    Query · detection candidate

    Identify accounts experiencing high failure rates followed by a successful login, typical of push fatigue.

    reads hb_auth_signinsql
    SELECT actor_user_name, src_endpoint_ip, activity_id, COUNT(*) AS count, MIN(time) AS first_event, MAX(time) AS last_event FROM hb_auth_signin WHERE activity_id IN (1, 5) AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY actor_user_name, src_endpoint_ip, activity_id

    What a hit looks like. High failure counts (activity_id 5) coupled with a final success (activity_id 1) for the same user and IP.

  3. Connections to VPN IOC Domains

    Query · enrichment

    Corroborate whether identified gateways or other hosts are communicating with the reported VPN IOC domain.

    reads hb_network_connectionsql
    SELECT time, device_hostname, dst_endpoint_hostname, dst_endpoint_ip, dst_endpoint_port FROM hb_network_connection WHERE instr(',' || '{{vpn_domains}}' || ',', ',' || LOWER(dst_endpoint_hostname) || ',') > 0 AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')

    What a hit looks like. Outbound traffic to vpn.com or related domains from internal hosts. Silence indicates no traffic to these domains in the window.

  4. Triage Initial Access Lead

    Agent triage

    Evaluate whether the MFA patterns and network traffic indicate a successful session hijack or gateway compromise.

  5. Rare Non-Human Identity Sign-ins

    Query · baseline

    Identify service accounts signing in from unusual or rare source IPs, which may indicate attacker reuse.

    reads hb_auth_signinsql
    SELECT actor_user_name, src_endpoint_ip, COUNT(DISTINCT device_hostname) AS host_count, MIN(time) AS first_seen FROM hb_auth_signin WHERE (LOWER(actor_user_name) LIKE 'svc_%' OR LOWER(actor_user_name) LIKE '%bot%') AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY actor_user_name, src_endpoint_ip HAVING host_count < 3

    What a hit looks like. Service accounts appearing on a small number of hosts or new IPs. Silence means no service accounts matched naming patterns in the window.

  6. Inventory of Standing Administrative Privileges

    Query · enrichment

    Retrieve a list of accounts with permanent administrative roles to cross-reference with early-stage anomalies.

    reads hb_userssql
    SELECT id, name, email, privileged, status, provider FROM hb_users WHERE (LOWER(privileged) = 'true') AND status = 'active'

    What a hit looks like. A list of standing administrators. The agent will compare these against identities performing suspicious transactions.

  7. Triage Identity Persistence

    Agent triage

    Correlate early access anomalies with follow-on service account and admin activity to confirm an ongoing threat.

  8. Route on Persistence Verdict

    Decision

    Direct the response based on whether a confirmed identity compromise has reached the persistence phase.

  9. Suspend Compromised Accounts

    Response action

    Immediately revoke access for compromised users and service accounts to stop further lateral movement.

  10. IAM Governance Review

    Analyst task

    Perform a broader audit to identify systematic failures in identity resilience and governance.

  11. Hunt Close-out

    Analyst task

    Document findings and telemetry gaps discovered during the hunt.

Coverage

Scenario coverage

StageCoveredHow, or why not
AitM Phishing and Push Fatigue
T1566
Yes mfa-push-fatigue, triage-access
Exploitation of External Remote Services
T1133 · T1190
Yes scoping-vpn-gateways, vpn-ioc-traffic
Session Token Theft and MFA Bypass
T1550
Yes triage-access
Abuse of Non-Human Identities
T1133
Yes rare-nhi-signins, triage-persistence
Exploitation of Standing Privileges
T1078
Yes standing-admin-inventory, triage-persistence

Blind spots

  • Needs Advanced IDP logging for session-specific attributes. Without session-level tracking, attackers can mask shifts using proxies that mimic a user's known geolocation. It would answer Was a specific session token hijacked from a trusted device?. Remediation: Enable and ingest debug-level IDP logs including user_agent and session identifiers.
  • Needs Just-In-Time (JIT) access logs from a PAM solution. In the absence of JIT logs, malicious use of standing admin rights is indistinguishable from legitimate maintenance. It would answer Was an administrative action preceded by a legitimate JIT elevation request?. Remediation: Integrate a PAM solution that logs JIT elevations into the primary telemetry stream.

Parameters & data

Parameters

ParameterTypeDefaultWhat it is
lookback_daysnumber14Days of history to examine.
scope_hostslist[host]—Optional list of hostnames to focus the network search.
vpn_domainslist[domain]vpn.comKnown VPN or remote access domains to monitor.

Telemetry

SourceCategoryTelemetry
Endpoint telemetry (hb_ surfaces)endpointendpoint
Identity / sign-in telemetryidentityidentity
Network telemetrynetworknetwork

Source

Download hunt.md Definition (JSON) An open hunt.md file; it runs anywhere that reads the format.
---
analysis: A single rule might catch a login from a new country, but it cannot weigh
  that against a subsequent shift to service-account behavior or the context of a
  long-standing unrotated admin credential. This hunt uses a phased flow and two agents
  to bridge the gap between individual authentication events and the lifecycle of
  identity abuse.
blind_spots:
- id: no-session-details
  owner: IAM Operations
  question: Was a specific session token hijacked from a trusted device?
  remediation: Enable and ingest debug-level IDP logs including user_agent and session
    identifiers.
  requires: Advanced IDP logging for session-specific attributes
  risk: Without session-level tracking, attackers can mask shifts using proxies that
    mimic a user's known geolocation.
  stage: defense-evasion-session-hijacking
- id: jit-log-absence
  owner: Security Engineering
  question: Was an administrative action preceded by a legitimate JIT elevation request?
  remediation: Integrate a PAM solution that logs JIT elevations into the primary
    telemetry stream.
  requires: Just-In-Time (JIT) access logs from a PAM solution
  risk: In the absence of JIT logs, malicious use of standing admin rights is indistinguishable
    from legitimate maintenance.
  stage: privilege-escalation-standing-admin
coverage:
- stage: initial-access-aitm-phishing
  status: covered
  steps:
  - mfa-push-fatigue
  - triage-access
- stage: initial-access-vpn-exploitation
  status: covered
  steps:
  - scoping-vpn-gateways
  - vpn-ioc-traffic
- stage: defense-evasion-session-hijacking
  status: covered
  steps:
  - triage-access
- stage: persistence-non-human-identities
  status: covered
  steps:
  - rare-nhi-signins
  - triage-persistence
- stage: privilege-escalation-standing-admin
  status: covered
  steps:
  - standing-admin-inventory
  - triage-persistence
guardrails:
  claims: no_unsupported
  evidence: citation_required
  missing_data: not_benign
  telemetry: untrusted
hunt:
  applicability: campaign-specific
  handoff: promote-to-detection
  justification: Modern identity attacks frequently bypass static MFA and exploit
    the lack of governance over non-human identities; a negative result confirms that
    identity resilience controls are effective.
  methodology: model-assisted
  trigger: intel-report
hypothesis: An intruder has bypassed traditional MFA via session hijacking or push
  fatigue and established persistence using overprivileged non-human identities or
  standing administrative accounts.
labels:
- hunt
- attack.t1566
- attack.t1133
- attack.t1190
- attack.t1550
- attack.t1078
- defense evasion
- initial access
- persistence
- privilege escalation
name: Bypass of Legacy Identity Controls and Persistence via NHIs
parameters:
  lookback_days:
    default: '14'
    description: Days of history to examine.
    type: number
  scope_hosts:
    default: []
    description: Optional list of hostnames to focus the network search.
    type: list[host]
  vpn_domains:
    default:
    - vpn.com
    description: Known VPN or remote access domains to monitor.
    from:
      kind: article
      observed: '2026-11-10'
      ref: proofpoint-iam-assumptions
    type: list[domain]
provenance:
  authors:
  - name: Huntbase hunt generation
    org: huntbase.io
  generated:
    by: huntbase-hunt-generation
    from: https://www.proofpoint.com/us/newsroom/news/18-outdated-identity-and-access-management-assumptions-retire
    gates:
    - dry-run
    - lint
    - critic
    model: hb_google/gemini-3-flash-preview
rationale: Start with internet-facing gateways identified in software inventory; focus
  the identity search on accounts with privileged status if the estate size requires
  narrowing.
references:
- name: "Proofpoint \u2014 18 Outdated Identity And Access Management Assumptions\
    \ To Retire"
  url: https://www.proofpoint.com/us/newsroom/news/18-outdated-identity-and-access-management-assumptions-retire
related:
- hunt: non-human-identity-governance-audit
  reason: This hunt identifies active abuse; a full audit is required to identify
    all overprivileged NHIs regardless of current activity.
  relation: follows
scenario:
  stages:
  - name: AitM Phishing and Push Fatigue
    observables:
    - Adversary-in-the-middle (AitM) proxies
    - SMS code interception
    - MFA push notification fatigue (multiple rapid requests)
    - Phishing domains mimicking login portals
    slug: initial-access-aitm-phishing
    tactic: initial-access
    techniques:
    - T1566
  - name: Exploitation of External Remote Services
    observables:
    - VPN connections (vpn.com)
    - Checkpoint VPN gateway logs
    - Exploitation of vulnerabilities in internet-facing access gateways
    slug: initial-access-vpn-exploitation
    tactic: initial-access
    techniques:
    - T1133
    - T1190
  - name: Session Token Theft and MFA Bypass
    observables:
    - Captured session tokens used from new/unknown devices
    - Bypassing push-based MFA via fatigue
    - Login from anonymizing proxies or unusual geolocations
    slug: defense-evasion-session-hijacking
    tactic: defense-evasion
    techniques:
    - T1550
  - name: Abuse of Non-Human Identities
    observables:
    - Service accounts with standing overprivileged access
    - AI agents performing actions outside of normal user intent
    - Orchestrator sub-agents acting within application processes
    - Stale service accounts from offboarded employees
    slug: persistence-non-human-identities
    tactic: persistence
    techniques:
    - T1133
  - name: Exploitation of Standing Privileges
    observables:
    - Permanent administrative credentials used for high-impact tasks
    - Lack of Just-In-Time (JIT) elevation for sensitive commands
    - Administrative access to service accounts
    slug: privilege-escalation-standing-admin
    tactic: privilege-escalation
    techniques:
    - T1078
  summary: This scenario represents a modern identity-focused intrusion where attackers
    bypass traditional MFA via adversary-in-the-middle phishing or push-fatigue tactics
    to hijack sessions. The campaign transitions from human identity compromise to
    long-term persistence by exploiting overprivileged non-human identities (NHIs)
    and standing administrative permissions that lack continuous verification.
severity: medium
targets:
  analyst:
    name: Tier-2 analyst
    role: analyst
  endpoint:
    category: endpoint
    name: Endpoint telemetry (hb_ surfaces)
    telemetry:
    - endpoint
  hunter:
    agent: true
    name: Hunt agent
  identity:
    category: identity
    name: Identity / sign-in telemetry
    telemetry:
    - identity
  network:
    category: network
    name: Network telemetry
    telemetry:
    - network
tlp: clear
type: investigation
---


# Bypass of Legacy Identity Controls and Persistence via NHIs

An adversary steals active sessions or triggers push fatigue to bypass traditional authentication hurdles. The hunt first identifies internet-facing gateways and scans for high-frequency MFA failures that culminate in a single success. By correlating these access anomalies with the behavior of non-human identities and standing administrative accounts, the hunt identifies identities an intruder has repurposed for persistence. An analyst then reviews the linked chain of events to revoke compromised credentials and recommend phishing-resistant controls.

## scoping-vpn-gateways
<!-- Identify Remote Access Gateways -->
Identify hosts running VPN or remote access software to focus the later network traffic analysis.

```sqlite target=endpoint role=scoping
~~~yaml
expected: A list of hosts acting as remote gateways. Silence indicates no managed
  VPN software is recorded in inventory.
reads:
- device_hostname
- package_name
- package_version
silence: not_evidence_of_absence
source: hb_software_inventory
verified: dry-run
verified_at: '2026-11-13'
~~~
SELECT DISTINCT device_hostname, package_name, package_version FROM hb_software_inventory WHERE (LOWER(package_name) LIKE '%checkpoint%' OR LOWER(package_name) LIKE '%vpn%')
```

## initial-access-parallel
<!-- Monitor for Early-Stage Identity Bypass -->
parallel:
- → mfa-push-fatigue
- → vpn-ioc-traffic
join: → triage-access

## mfa-push-fatigue
<!-- Patterns of MFA Push Fatigue -->
Identify accounts experiencing high failure rates followed by a successful login, typical of push fatigue.

```sqlite target=identity role=detection-candidate params=(lookback_days=lookback_days)
~~~yaml
expected: High failure counts (activity_id 5) coupled with a final success (activity_id
  1) for the same user and IP.
reads:
- actor_user_name
- src_endpoint_ip
- activity_id
- time
silence: not_evidence_of_absence
source: hb_auth_signin
verified: dry-run
verified_at: '2026-11-13'
~~~
SELECT actor_user_name, src_endpoint_ip, activity_id, COUNT(*) AS count, MIN(time) AS first_event, MAX(time) AS last_event FROM hb_auth_signin WHERE activity_id IN (1, 5) AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY actor_user_name, src_endpoint_ip, activity_id
```

## vpn-ioc-traffic
<!-- Connections to VPN IOC Domains -->
Corroborate whether identified gateways or other hosts are communicating with the reported VPN IOC domain.

```sqlite target=network role=enrichment params=(vpn_domains=vpn_domains, scope_hosts=scope_hosts, lookback_days=lookback_days)
~~~yaml
expected: Outbound traffic to vpn.com or related domains from internal hosts. Silence
  indicates no traffic to these domains in the window.
reads:
- time
- device_hostname
- dst_endpoint_hostname
- dst_endpoint_ip
- dst_endpoint_port
silence: not_evidence_of_absence
source: hb_network_connection
verified: dry-run
verified_at: '2026-11-13'
~~~
SELECT time, device_hostname, dst_endpoint_hostname, dst_endpoint_ip, dst_endpoint_port FROM hb_network_connection WHERE instr(',' || '{{vpn_domains}}' || ',', ',' || LOWER(dst_endpoint_hostname) || ',') > 0 AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')
```

## triage-access
<!-- Triage Initial Access Lead -->
```agent target=hunter
cite: required
context:
- mfa-push-fatigue
- vpn-ioc-traffic
max_iterations: 5
objective: Determine if the patterns of MFA fatigue and VPN connections identify compromised
  user accounts or exposed gateways.
success_criteria: A per-user or per-host verdict of suspicious or malicious, citing
  specific failure/success sequences or IOC connections.
tools:
- endpoint
- identity
- network
```

## persistence-parallel
<!-- Hunt for Identity Persistence -->
parallel:
- → rare-nhi-signins
- → standing-admin-inventory
join: → triage-persistence

## rare-nhi-signins
<!-- Rare Non-Human Identity Sign-ins -->
Identify service accounts signing in from unusual or rare source IPs, which may indicate attacker reuse.

```sqlite target=identity role=baseline params=(lookback_days=lookback_days)
~~~yaml
baseline:
  compare: first_seen
  window: '{{lookback_days}}d'
expected: Service accounts appearing on a small number of hosts or new IPs. Silence
  means no service accounts matched naming patterns in the window.
prevalence:
  by: device_hostname
  key:
  - actor_user_name
  - src_endpoint_ip
  rare_below: 3
reads:
- actor_user_name
- src_endpoint_ip
- device_hostname
- time
silence: not_evidence_of_absence
source: hb_auth_signin
verified: dry-run
verified_at: '2026-11-13'
~~~
SELECT actor_user_name, src_endpoint_ip, COUNT(DISTINCT device_hostname) AS host_count, MIN(time) AS first_seen FROM hb_auth_signin WHERE (LOWER(actor_user_name) LIKE 'svc_%' OR LOWER(actor_user_name) LIKE '%bot%') AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY actor_user_name, src_endpoint_ip HAVING host_count < 3
```

## standing-admin-inventory
<!-- Inventory of Standing Administrative Privileges -->
Retrieve a list of accounts with permanent administrative roles to cross-reference with early-stage anomalies.

```sqlite target=identity role=enrichment
~~~yaml
expected: A list of standing administrators. The agent will compare these against
  identities performing suspicious transactions.
reads:
- id
- name
- email
- privileged
- status
- provider
silence: not_evidence_of_absence
source: hb_users
verified: dry-run
verified_at: '2026-11-13'
~~~
SELECT id, name, email, privileged, status, provider FROM hb_users WHERE (LOWER(privileged) = 'true') AND status = 'active'
```

## triage-persistence
<!-- Triage Identity Persistence -->
```agent target=hunter
cite: required
context:
- triage-access
- rare-nhi-signins
- standing-admin-inventory
max_iterations: 6
objective: Determine if the suspicious access identified in the first triage stage
  has transitioned into persistence through service accounts or standing administrative
  abuse.
success_criteria: A final malicious verdict if an account compromised via fatigue/session
  theft is seen interacting with or utilizing administrative or service account privileges
  from the same source infrastructure.
tools:
- endpoint
- identity
- network
```

## route-on-risk
<!-- Route on Persistence Verdict -->
if~: "The triage-persistence verdict identifies a malicious linkage between initial access anomalies and subsequent NHI or standing administrative abuse." (confidence: high, judge=hunter)
then: → suspend-account
indeterminate: → iam-governance-review
unavailable: → iam-governance-review (blind_spot: no-session-details)
else: → iam-governance-review

## suspend-account
<!-- Suspend Compromised Accounts -->
```action target=identity
~~~yaml
approval: required
~~~
Suspend the primary user account and any service accounts identified by the agent as being under attacker control. Revoke all active session tokens immediately.
```
→ iam-governance-review

## iam-governance-review
<!-- IAM Governance Review -->
```manual target=analyst
Evaluate why standing privileges were available to the compromised user. Identify service accounts that lack distinct ownership or periodic review. Propose moving to FIDO2 or phishing-resistant MFA for the affected groups.
```
→ close-out

## close-out
<!-- Hunt Close-out -->
```manual target=analyst
Document all malicious activity confirmed. Record any telemetry blind spots identified, such as lack of session-level IDP tracking.
```
→ end

Run it

Take this hunt into your environment.

Open it in Huntbase to run every step against your own connections, with Scout weighing the evidence and your analysts in command. Or take the open hunt.md file anywhere that reads the format.

Machine-drafted by huntbase-hunt-generation using hb_google/gemini-3-flash-preview, gated by dry-run, lint, critic, then reviewed by a person.

Locked pack

Sign up to unlock

Pack contents are available to Huntbase users.