Objective

Connect the abuse.ch ThreatFox TAXII feed to Sentinel, enable TI matching analytics rules, hunt for IOCs in historical data, and establish the indicator lifecycle baseline from Module 12.

Required: Sentinel workspace. Contributor role.


Step 1: Configure the TAXII data connector

Navigate to: Sentinel → Data connectors → Search "Threat intelligence - TAXII"

Click Open connector page → Add TAXII server

FieldValue
Friendly nameabuse.ch ThreatFox
API root URLhttps://threatfox-api.abuse.ch/api/v1/taxii2/
Collection IDCheck abuse.ch documentation for current collection
Polling frequencyOnce per hour
Username / PasswordLeave empty (no authentication required)

Click Add.


Step 2: Verify indicator ingestion

Wait 1-2 hours for the first poll cycle, then verify:

ThreatIntelligenceIndicator
| where TimeGenerated > ago(4h)
| where SourceSystem has "TAXII"
| summarize Count = count() by IndicatorType
| sort by Count desc

If this returns results, the feed is ingesting. If zero results after 2 hours, check the data connector health page for error messages.


Step 3: Enable TI matching analytics rules

Navigate to: Sentinel → Analytics → Rule templates

Filter for "Threat Intelligence." Enable these matching rules:

Rule templateWhat it matchesPriority
TI map IP entity to SigninLogsIP indicators → sign-in source IPsHigh
TI map IP entity to DeviceNetworkEventsIP indicators → endpoint network connectionsMedium
TI map URL entity to EmailUrlInfoURL indicators → email URLsHigh
TI map FileHash to DeviceFileEventsHash indicators → files on endpointsMedium

For each rule, set the minimum confidence threshold:


Step 4: Run a retroactive IOC hunt

Pick 3 IP indicators from the ingested ThreatFox feed and search your historical data:

let iocIPs = ThreatIntelligenceIndicator
    | where TimeGenerated > ago(1d)
    | where IndicatorType == "ipv4-addr"
    | where ConfidenceScore >= 70
    | take 3
    | project NetworkIP;
union
    (SigninLogs | where TimeGenerated > ago(90d) 
        | where IPAddress in (iocIPs)
        | project TimeGenerated, Source="SigninLogs", 
            Entity=UserPrincipalName, IP=IPAddress),
    (DeviceNetworkEvents | where TimeGenerated > ago(90d)
        | where RemoteIP in (iocIPs)
        | project TimeGenerated, Source="DeviceNetwork", 
            Entity=DeviceName, IP=RemoteIP)
| sort by TimeGenerated asc

Document the results — positive or negative — in the hunting campaign format from Module 12, subsection 12.6.


Step 5: Establish the indicator hygiene baseline

ThreatIntelligenceIndicator
| summarize 
    Total = count(),
    Active = countif(Active == true),
    WithExpiration = countif(isnotempty(ExpirationDateTime)),
    NoExpiration = countif(isempty(ExpirationDateTime)),
    HighConfidence = countif(ConfidenceScore >= 80),
    LowConfidence = countif(ConfidenceScore < 50)

Record these numbers. This is your Day 1 indicator baseline. Run the same query monthly to track indicator lifecycle health.


Verification checklist