Detection rules › Kusto

EatonForeseer - Unauthorized Logins

Status
available
Severity
high
Time window
15m
Group by
Computer, TargetUserName
Source
github.com/Azure/Azure-Sentinel

Detects Unauthorized Logins into Eaton Foreseer

MITRE ATT&CK coverage

TacticTechniques
Initial AccessT1078 Valid Accounts

Event coverage

Rule body kusto

id: 5a7fccb8-3ed0-44f2-8477-540af3ef4d92
name: EatonForeseer - Unauthorized Logins
description: |
  'Detects Unauthorized Logins into Eaton Foreseer'
severity: High
status: Available
requiredDataConnectors:
  - connectorId: WindowsSecurityEvents
    dataTypes:
      - SecurityEvent
queryFrequency: 15m
queryPeriod: 15m
triggerOperator: gt
triggerThreshold: 0
tactics:
  - InitialAccess
relevantTechniques:
  - T1078
query: |
  SecurityEvent
  // Look for all events relating to user logins
  | where EventID in (4624,4625,4648,4675,4634,4647)
  | where AccountType == "User"
  // Filter for data present
  | where isnotempty(TargetUserName)
  // Look for all events that relate to the Eaton Foreseer application
  | where ProcessName has "Foreseer"
  // Ignore known user accounts (please edit based on your allowed users)
  | where TargetUserName !in ("janedoe", "johndoe")
  // De-duplicate multiple entries for the same user accessing a particular device
  | summarize TimeGenerated=arg_min(TimeGenerated, *) by TargetUserName, Computer
  | project
      TimeGenerated,
      IPCustomEntity = IpAddress,
      HostCustomEntity = Computer,
      UserEntity = TargetUserName,
      Process,
      ProcessName
entityMappings:
  - entityType: IP
    fieldMappings:
      - identifier: Address
        columnName: IPCustomEntity
  - entityType: Account
    fieldMappings:
      - identifier: Name
        columnName: UserEntity
  - entityType: Host
    fieldMappings:
      - identifier: HostName
        columnName: HostCustomEntity
  - entityType: Process
    fieldMappings:
      - identifier: CommandLine
        columnName: Process
version: 1.0.0
kind: Scheduled

Stages and Predicates

Stage 1: source

SecurityEvent

Stage 2: where

| where EventID in (4624,4625,4648,4675,4634,4647)

Stage 3: where

| where AccountType == "User"

Stage 4: where

| where isnotempty(TargetUserName)

Stage 5: where

| where ProcessName has "Foreseer"

Stage 6: where

| where TargetUserName !in ("janedoe", "johndoe")

Stage 7: summarize

| summarize TimeGenerated=arg_min(TimeGenerated, *) by TargetUserName, Computer

Stage 8: project

| project
    TimeGenerated,
    IPCustomEntity = IpAddress,
    HostCustomEntity = Computer,
    UserEntity = TargetUserName,
    Process,
    ProcessName

Exclusions

Top-level NOT(...) conjuncts: predicates this rule actively suppresses.

FieldKindExcluded values
TargetUserNameinjanedoe, johndoe

Indicators

Each row is a field, operator, and value that the rule matches. The corpus column counts how many other rules in the catalog look for the same combination: high numbers point to widely-used, community-vetted indicators. Blank or 1 shows that the indicator is specific to this rule.

FieldKindValues
AccountTypeeq
  • User transforms: cased corpus 9 (kusto 9)
EventIDin
  • 4624 transforms: cased corpus 25 (splunk 13, kusto 8, chronicle 4)
  • 4625 transforms: cased corpus 15 (splunk 11, chronicle 2, kusto 2)
  • 4634 transforms: cased
  • 4647 transforms: cased
  • 4648 transforms: cased corpus 5 (splunk 5)
  • 4675 transforms: cased
ProcessNamematch
  • Foreseer transforms: term
TargetUserNameis_not_null
  • (no value, null check)

Output fields

Fields the rule emits when it matches. Chronicle authors list these in the outcome block; they appear on the detection and $risk_score drives alerting. Sentinel / Defender XDR rules build them up through project / summarize / extend stages. Sentinel maps these into alert fields via entityMappings and customDetails; Defender XDR custom detections surface them as alert fields directly.

FieldSource
HostCustomEntityproject
IPCustomEntityproject
Processproject
ProcessNameproject
TimeGeneratedproject
UserEntityproject