Elastic medium stable kql
Multiple Device Token Hashes for Single Okta Session
This rule detects when a specific Okta actor has multiple device token hashes and multiple source IPs for a single Okta session. This may indicate an authenticated session has been hijacked or replayed from a different device and network. Adversaries may steal session cookies or tokens to gain unauthorized access to Okta admin console, applications, tenants, or other resources.
Detection Logic
from logs-okta.system-*
| where
data_stream.dataset == "okta.system" and
not event.action in (
"policy.evaluate_sign_on",
"user.session.start",
"user.authentication.sso"
) and
okta.actor.alternate_id != "system@okta.com" and
okta.actor.alternate_id rlike "[^@\\s]+\\@[^@\\s]+" and
okta.authentication_context.external_session_id != "unknown" and
(
okta.authentication_context.external_session_id IS NOT NULL and
okta.debug_context.debug_data.dt_hash IS NOT NULL and
okta.client.ip IS NOT NULL and
okta.client.user_agent.raw_user_agent IS NOT NULL
) and
(
okta.authentication_context.external_session_id != "-" and
okta.debug_context.debug_data.dt_hash != "-" and
okta.client.user_agent.raw_user_agent != "-"
)
| stats
Esql.dt_hash_count_distinct = count_distinct(okta.debug_context.debug_data.dt_hash),
Esql.client_ip_count_distinct = count_distinct(okta.client.ip),
Esql.event_count = count(*),
Esql.first_event_time = min(@timestamp),
Esql.last_event_time = max(@timestamp),
Esql.dt_hash_values = values(okta.debug_context.debug_data.dt_hash),
Esql.event_action_values = values(event.action),
Esql.client_ip_values = values(okta.client.ip),
Esql.user_agent_values = values(okta.client.user_agent.raw_user_agent),
Esql.device_values = values(okta.client.device),
Esql.is_proxy_values = values(okta.security_context.is_proxy),
Esql.geo_country_name_values = values(client.geo.country_name),
Esql.geo_city_name_values = values(client.geo.city_name),
Esql.source_asn_number_values = values(source.`as`.number),
Esql.source_asn_org_name_values = values(source.`as`.organization.name),
Esql.threat_suspected_values = values(okta.debug_context.debug_data.threat_suspected),
Esql.risk_level_values = values(okta.debug_context.debug_data.risk_level),
Esql.risk_reasons_values = values(okta.debug_context.debug_data.risk_reasons),
Esql.behaviors_values = values(okta.debug_context.debug_data.behaviors),
Esql.device_fingerprint_values = values(okta.debug_context.debug_data.device_fingerprint),
Esql.risk_behaviors_values = values(okta.debug_context.debug_data.risk_behaviors),
Esql.request_uri_values = values(okta.debug_context.debug_data.request_uri)
by
okta.actor.alternate_id,
okta.authentication_context.external_session_id
| where
Esql.dt_hash_count_distinct >= 4 and
Esql.client_ip_count_distinct >= 2
| keep Esql.*, okta.* Field Validations
Loading…
Comments (0)
Loading comments...