Detection rules › Kusto

Infoblox - TI - Syslog Match Found - URL

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

'Syslog URL match found in your Infoblox TIDE Threat Intelligence. Customize query count, scheduling, responses and more. Modify data sources, types and threat properties as desired.'

MITRE ATT&CK coverage

Rule body

id: 28ee3c2b-eb4b-44de-a71e-e462843fea72
name: Infoblox - TI - Syslog Match Found - URL
description: |
  'Syslog URL match found in your Infoblox TIDE Threat Intelligence. Customize query count, scheduling, responses and more. Modify data sources, types and threat properties as desired.'
severity: Medium
status: Available
requiredDataConnectors:
  - connectorId: Syslog
    dataTypes: 
      - Syslog
  - 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 has_cs "Infoblox - URL"
  | where isnotempty(DomainName)
  ;
  let Data = Syslog
  | extend HitTime = TimeGenerated
  | where TimeGenerated >= ago(dt_lookBack)
  //Extract URL patterns from syslog message
  | extend Url = extract("(http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+)", 1,SyslogMessage)
  | where isnotempty(Url)
  ;
  TI | join kind=innerunique Data on $left.DomainName == $right.Url
  | where HitTime >= TimeGenerated and HitTime < ExpirationDateTime
  | project LatestIndicatorTime, HitTime, SyslogMessage, Computer, ProcessName, Url, HostIP, 
  AdditionalInformation, Description, ThreatType, TrafficLightProtocolLevel, Type, ConfidenceScore, ExpirationDateTime, SourceSystem, Action, IndicatorId, ExternalIndicatorId, Tags
entityMappings:
  - entityType: IP
    fieldMappings:
      - identifier: Address
        columnName: HostIP
  - entityType: Host
    fieldMappings:
      - identifier: HostName
        columnName: Computer
  - entityType: DNS
    fieldMappings:
      - identifier: DomainName
        columnName: Url
  - entityType: URL
    fieldMappings:
      - identifier: Url
        columnName: Url
eventGroupingSettings:
  aggregationKind: SingleAlert
incidentConfiguration:
  createIncident: true
version: 1.0.3
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 7

let Data = Syslog
| extend HitTime = TimeGenerated
| where TimeGenerated >= ago(dt_lookBack)
| extend Url = extract("(http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+)", 1,SyslogMessage)
| where isnotempty(Url);

Stages 1 to 6 define let TI (the rule's main pipeline source); stages 7 to 9 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 has_cs "Infoblox - URL"

Stage 6: where

| where isnotempty(DomainName)

Stage 7: join

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

Stage 8: where

| where HitTime >= TimeGenerated and HitTime < ExpirationDateTime

Stage 9: project

| project LatestIndicatorTime, HitTime, SyslogMessage, Computer, ProcessName, Url, HostIP, 
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"
Descriptionmatch
  • Infoblox - URL transforms: term
field:"Description" kind:match value:"Infoblox - URL"
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
Urlis_not_null
  • (no value, null check)
field:"Url" kind:is_not_null

Output fields

These fields are emitted when the rule matches.

FieldSource
Actionproject
AdditionalInformationproject
Computerproject
ConfidenceScoreproject
Descriptionproject
ExpirationDateTimeproject
ExternalIndicatorIdproject
HitTimeproject
HostIPproject
IndicatorIdproject
LatestIndicatorTimeproject
ProcessNameproject
SourceSystemproject
SyslogMessageproject
Tagsproject
ThreatTypeproject
TrafficLightProtocolLevelproject
Typeproject
Urlproject