Analytic rule catalog
CTE - Risky Device Multiple IOC URL Hits
Back
| Id | e1c0f32d-a57b-42ae-8038-b869bca54fef |
| Rulename | CTE - Risky Device (Multiple IOC URL Hits) |
| Description | A single device has repeatedly hit known-malicious (threat-intel-matched) URLs, indicating persistent compromise risk or repeated user exposure. |
| Severity | Medium |
| Tactics | InitialAccess CommandAndControl |
| Techniques | T1189 T1071 |
| Required data connectors | cybereinforce_cte |
| Kind | Scheduled |
| Query frequency | 1h |
| Query period | 7d |
| Trigger threshold | 0 |
| Trigger operator | gt |
| Source Uri | https://github.com/Azure/Azure-Sentinel/blob/master/Solutions/Cybereinforce/Analytic%20Rules/RiskyDeviceMultipleIOCURLHits.yaml |
| Version | 1.0.0 |
| Arm template | e1c0f32d-a57b-42ae-8038-b869bca54fef.json |
CybereinforceCTE_CL
| where EventType == "block.url"
| extend d = parse_json(Details)
| extend
DeviceId = tostring(d.deviceId),
HostName = iff(isnotempty(tostring(d.hostname)), tostring(d.hostname), strcat("cte-device-", substring(EntityId, 0, 8))),
DeviceUser = tostring(d.deviceUser),
DeviceOs = tostring(d.deviceOs),
DeviceVersion = tostring(d.deviceVersion),
RuleId = tostring(d.ruleId),
RuleName = iff(isnotempty(tostring(d.ruleName)), tostring(d.ruleName), "Pattern Match"),
Pattern = tostring(d.pattern),
Url = tostring(d.url),
Action = tostring(d.action),
IsIoc = tobool(d.ioc),
ClientIp = tostring(split(tostring(d.clientIp), ":")[0]),
ClientPort = tostring(split(tostring(d.clientIp), ":")[1]),
UserAgent = tostring(d.userAgent)
| where RuleName == "Cybereinforce Threat Intelligence" or IsIoc == true
| summarize IOC_Hits=count(), BlockedUrls=make_set(Url, 50), ClientIps=make_set(ClientIp, 20), LastSeen=max(TimeGenerated) by DeviceId, HostName, DeviceUser, DeviceOs, TenantId
| where IOC_Hits >= 2
| extend Url = tostring(BlockedUrls[0]), ClientIp = tostring(ClientIps[0])
name: CTE - Risky Device (Multiple IOC URL Hits)
triggerOperator: gt
query: |
CybereinforceCTE_CL
| where EventType == "block.url"
| extend d = parse_json(Details)
| extend
DeviceId = tostring(d.deviceId),
HostName = iff(isnotempty(tostring(d.hostname)), tostring(d.hostname), strcat("cte-device-", substring(EntityId, 0, 8))),
DeviceUser = tostring(d.deviceUser),
DeviceOs = tostring(d.deviceOs),
DeviceVersion = tostring(d.deviceVersion),
RuleId = tostring(d.ruleId),
RuleName = iff(isnotempty(tostring(d.ruleName)), tostring(d.ruleName), "Pattern Match"),
Pattern = tostring(d.pattern),
Url = tostring(d.url),
Action = tostring(d.action),
IsIoc = tobool(d.ioc),
ClientIp = tostring(split(tostring(d.clientIp), ":")[0]),
ClientPort = tostring(split(tostring(d.clientIp), ":")[1]),
UserAgent = tostring(d.userAgent)
| where RuleName == "Cybereinforce Threat Intelligence" or IsIoc == true
| summarize IOC_Hits=count(), BlockedUrls=make_set(Url, 50), ClientIps=make_set(ClientIp, 20), LastSeen=max(TimeGenerated) by DeviceId, HostName, DeviceUser, DeviceOs, TenantId
| where IOC_Hits >= 2
| extend Url = tostring(BlockedUrls[0]), ClientIp = tostring(ClientIps[0])
queryFrequency: 1h
description: |
A single device has repeatedly hit known-malicious (threat-intel-matched) URLs, indicating persistent compromise risk or repeated user exposure.
id: e1c0f32d-a57b-42ae-8038-b869bca54fef
triggerThreshold: 0
queryPeriod: 7d
version: 1.0.0
kind: Scheduled
relevantTechniques:
- T1189
- T1071
severity: Medium
requiredDataConnectors:
- connectorId: cybereinforce_cte
dataTypes:
- CybereinforceCTE_CL
OriginalUri: https://github.com/Azure/Azure-Sentinel/blob/master/Solutions/Cybereinforce/Analytic%20Rules/RiskyDeviceMultipleIOCURLHits.yaml
tactics:
- InitialAccess
- CommandAndControl
entityMappings:
- fieldMappings:
- identifier: HostName
columnName: HostName
entityType: Host
- fieldMappings:
- identifier: Url
columnName: Url
entityType: URL
- fieldMappings:
- identifier: Address
columnName: ClientIp
entityType: IP
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"workspace": {
"type": "String"
}
},
"resources": [
{
"apiVersion": "2024-01-01-preview",
"id": "[concat(resourceId('Microsoft.OperationalInsights/workspaces/providers', parameters('workspace'), 'Microsoft.SecurityInsights'),'/alertRules/e1c0f32d-a57b-42ae-8038-b869bca54fef')]",
"kind": "Scheduled",
"name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/e1c0f32d-a57b-42ae-8038-b869bca54fef')]",
"properties": {
"alertRuleTemplateName": "e1c0f32d-a57b-42ae-8038-b869bca54fef",
"customDetails": null,
"description": "A single device has repeatedly hit known-malicious (threat-intel-matched) URLs, indicating persistent compromise risk or repeated user exposure.\n",
"displayName": "CTE - Risky Device (Multiple IOC URL Hits)",
"enabled": true,
"entityMappings": [
{
"entityType": "Host",
"fieldMappings": [
{
"columnName": "HostName",
"identifier": "HostName"
}
]
},
{
"entityType": "URL",
"fieldMappings": [
{
"columnName": "Url",
"identifier": "Url"
}
]
},
{
"entityType": "IP",
"fieldMappings": [
{
"columnName": "ClientIp",
"identifier": "Address"
}
]
}
],
"OriginalUri": "https://github.com/Azure/Azure-Sentinel/blob/master/Solutions/Cybereinforce/Analytic%20Rules/RiskyDeviceMultipleIOCURLHits.yaml",
"query": "CybereinforceCTE_CL\n| where EventType == \"block.url\"\n| extend d = parse_json(Details)\n| extend\n DeviceId = tostring(d.deviceId),\n HostName = iff(isnotempty(tostring(d.hostname)), tostring(d.hostname), strcat(\"cte-device-\", substring(EntityId, 0, 8))),\n DeviceUser = tostring(d.deviceUser),\n DeviceOs = tostring(d.deviceOs),\n DeviceVersion = tostring(d.deviceVersion),\n RuleId = tostring(d.ruleId),\n RuleName = iff(isnotempty(tostring(d.ruleName)), tostring(d.ruleName), \"Pattern Match\"),\n Pattern = tostring(d.pattern),\n Url = tostring(d.url),\n Action = tostring(d.action),\n IsIoc = tobool(d.ioc),\n ClientIp = tostring(split(tostring(d.clientIp), \":\")[0]),\n ClientPort = tostring(split(tostring(d.clientIp), \":\")[1]),\n UserAgent = tostring(d.userAgent)\n| where RuleName == \"Cybereinforce Threat Intelligence\" or IsIoc == true\n| summarize IOC_Hits=count(), BlockedUrls=make_set(Url, 50), ClientIps=make_set(ClientIp, 20), LastSeen=max(TimeGenerated) by DeviceId, HostName, DeviceUser, DeviceOs, TenantId\n| where IOC_Hits >= 2\n| extend Url = tostring(BlockedUrls[0]), ClientIp = tostring(ClientIps[0])\n",
"queryFrequency": "PT1H",
"queryPeriod": "P7D",
"severity": "Medium",
"subTechniques": [],
"suppressionDuration": "PT1H",
"suppressionEnabled": false,
"tactics": [
"CommandAndControl",
"InitialAccess"
],
"techniques": [
"T1071",
"T1189"
],
"templateVersion": "1.0.0",
"triggerOperator": "GreaterThan",
"triggerThreshold": 0
},
"type": "Microsoft.OperationalInsights/workspaces/providers/alertRules"
}
]
}