Detection rules › Kusto

Infoblox - TI - InfobloxCDC Match Found - Lookalike Domains

Status
available
Severity
medium
Time window
14d
Group by
DestinationDnsDomain, DomainName, IndicatorId
Source
github.com/Azure/Azure-Sentinel

'InfobloxCDC Lookalike Domain match found in your Infoblox TIDE Threat Intelligence. Customize query count, scheduling, responses and more. Modify data sources, types and threat properties as desired. This rule depends on a parser based on a Kusto Function to work as expected called InfobloxCDC.'

MITRE ATT&CK coverage

Rule body

id: 568730be-b39d-45e3-a392-941e00837d52
name: Infoblox - TI - InfobloxCDC Match Found - Lookalike Domains
description: |
  'InfobloxCDC Lookalike Domain match found in your Infoblox TIDE Threat Intelligence. Customize query count, scheduling, responses and more. Modify data sources, types and threat properties as desired. This rule depends on a parser based on a Kusto Function to work as expected called [**InfobloxCDC**](https://aka.ms/sentinel-InfobloxCloudDataConnector-parser).'
severity: Medium
status: Available
requiredDataConnectors:
  - connectorId: ThreatIntelligence
    dataTypes: 
      - ThreatIntelligenceIndicator
  - connectorId: CefAma
    dataTypes:
      - CommonSecurityLog
queryFrequency: 1h
queryPeriod: 14d
triggerOperator: gt
triggerThreshold: 0
tactics:
  - Impact
relevantTechniques:
  - T1498
  - T1565
query: |
  let dt_lookBack = 1h;
  let ioc_lookBack = 14d;
  let TI = ThreatIntelligenceIndicator
  | where TimeGenerated >= ago(ioc_lookBack)
  | summarize LatestIndicatorTime = arg_max(TimeGenerated, *) by IndicatorId
  | where Active == true and ExpirationDateTime > now()  
  | where Description == "Infoblox - HOST - Policy"
  | where Tags has_cs "Property: Policy_LookalikeDomains" 
  | where isnotempty(DomainName)
  ;
  let Data = InfobloxCDC
  | extend HitTime = TimeGenerated
  | where TimeGenerated >= ago(dt_lookBack)
  | where isnotempty(DestinationDnsDomain)
  //Remove trailing period at end of domain
  | extend DestinationDnsDomain = trim_end(@"\.$", DestinationDnsDomain)
  ;
  TI | join kind=innerunique Data on $left.DomainName == $right.DestinationDnsDomain
  | where HitTime >= TimeGenerated and HitTime < ExpirationDateTime
  | project LatestIndicatorTime, HitTime, DeviceEventClassID, ThreatLevel, ThreatLevel_Score, ThreatConfidence, DestinationDnsDomain, InfobloxB1FeedName, ThreatClass, ThreatProperty, InfobloxB1PolicyAction, DeviceAction, InfobloxB1PolicyName, SourceIP, DeviceName, SourceMACAddress, SourceUserName, InfobloxB1SrcOSVersion, InfobloxB1ConnectionType, InfobloxB1Network, AdditionalExtensionsParsedNested, 
  AdditionalInformation, Description, ThreatType, TrafficLightProtocolLevel, Type, ConfidenceScore, ExpirationDateTime, SourceSystem, Action, IndicatorId, ExternalIndicatorId, Tags
entityMappings:
  - entityType: IP
    fieldMappings:
      - identifier: Address
        columnName: SourceIP
  - entityType: Host
    fieldMappings:
      - identifier: HostName
        columnName: DeviceName
      - identifier: OSVersion
        columnName: InfobloxB1SrcOSVersion
      - identifier: FullName
        columnName: SourceUserName
  - entityType: DNS
    fieldMappings:
      - identifier: DomainName
        columnName: DestinationDnsDomain
  - entityType: Malware
    fieldMappings:
      - identifier: Name
        columnName: ThreatProperty
      - identifier: Category
        columnName: ThreatClass
customDetails:
  SourceMACAddress: SourceMACAddress
  InfobloxB1FeedName: InfobloxB1FeedName
  InfobloxB1Network: InfobloxB1Network
  InfobloxB1Action: InfobloxB1PolicyAction
  InfobloxB1PolicyName: InfobloxB1PolicyName
eventGroupingSettings:
  aggregationKind: SingleAlert
incidentConfiguration:
  createIncident: true
version: 1.0.4
kind: Scheduled

Stages and Predicates

Parameters

let dt_lookBack = 1h;
let ioc_lookBack = 14d;

let TI is inlined into the numbered stages below.

Let binding: Data used in Stage 8

let Data = InfobloxCDC
| extend HitTime = TimeGenerated
| where TimeGenerated >= ago(dt_lookBack)
| where isnotempty(DestinationDnsDomain)
| extend DestinationDnsDomain = trim_end(@"\.$", DestinationDnsDomain);

Stages 1 to 7 define let TI (the rule's main pipeline source); stages 8 to 10 run on it.

Stage 1: source

ThreatIntelligenceIndicator

Stage 2: where

| where TimeGenerated >= ago(ioc_lookBack)

Stage 3: summarize

| summarize LatestIndicatorTime = arg_max(TimeGenerated, *) by IndicatorId

Stage 4: where

| where Active == true and ExpirationDateTime > now()

Stage 5: where

| where Description == "Infoblox - HOST - Policy"

Stage 6: where

| where Tags has_cs "Property: Policy_LookalikeDomains"

Stage 7: where

| where isnotempty(DomainName)

Stage 8: join

TI
| join kind=innerunique Data on $left.DomainName == $right.DestinationDnsDomain

Stage 9: where

| where HitTime >= TimeGenerated and HitTime < ExpirationDateTime

Stage 10: project

| project LatestIndicatorTime, HitTime, DeviceEventClassID, ThreatLevel, ThreatLevel_Score, ThreatConfidence, DestinationDnsDomain, InfobloxB1FeedName, ThreatClass, ThreatProperty, InfobloxB1PolicyAction, DeviceAction, InfobloxB1PolicyName, SourceIP, DeviceName, SourceMACAddress, SourceUserName, InfobloxB1SrcOSVersion, InfobloxB1ConnectionType, InfobloxB1Network, AdditionalExtensionsParsedNested, 
AdditionalInformation, Description, ThreatType, TrafficLightProtocolLevel, Type, ConfidenceScore, ExpirationDateTime, SourceSystem, Action, IndicatorId, ExternalIndicatorId, Tags

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Activeeq
  • true
field:"Active" kind:eq value:"true"
Descriptioneq
  • Infoblox - HOST - Policy
field:"Description" kind:eq value:"Infoblox - HOST - Policy"
DestinationDnsDomainis_not_null
  • (no value, null check)
field:"DestinationDnsDomain" kind:is_not_null
DomainNameis_not_null
  • (no value, null check)
field:"DomainName" kind:is_not_null
HitTimecross_field_compare
  • ExpirationDateTime transforms: op:lt
  • TimeGenerated transforms: op:ge
field:"HitTime" kind:cross_field_compare
Tagsmatch
  • Property: Policy_LookalikeDomains transforms: term
field:"Tags" kind:match value:"Property: Policy_LookalikeDomains"

Output fields

These fields are emitted when the rule matches.

FieldSource
Actionproject
AdditionalExtensionsParsedNestedproject
AdditionalInformationproject
ConfidenceScoreproject
Descriptionproject
DestinationDnsDomainproject
DeviceActionproject
DeviceEventClassIDproject
DeviceNameproject
ExpirationDateTimeproject
ExternalIndicatorIdproject
HitTimeproject
IndicatorIdproject
InfobloxB1ConnectionTypeproject
InfobloxB1FeedNameproject
InfobloxB1Networkproject
InfobloxB1PolicyActionproject
InfobloxB1PolicyNameproject
InfobloxB1SrcOSVersionproject
LatestIndicatorTimeproject
SourceIPproject
SourceMACAddressproject
SourceSystemproject
SourceUserNameproject
Tagsproject
ThreatClassproject
ThreatConfidenceproject
ThreatLevelproject
ThreatLevel_Scoreproject
ThreatPropertyproject
ThreatTypeproject
TrafficLightProtocolLevelproject
Typeproject