Analytic rule catalog
UniFi Site Manager Console group membership churn
Back
| Id | 8e22eb19-51df-37f7-468f-9d112fff9098 |
| Rulename | UniFi Site Manager: Console group membership churn |
| Description | Tracks members of `userData.consoleGroupMembers` over time. Additions indicate new admin access; removals indicate revoked access. Both warrant review - additions are an account-creation signal, removals can be a sign of attacker cleanup. |
| Tactics | Persistence |
| Techniques | T1098 |
| Required data connectors | UniFiSiteManagerConnectorDefinition |
| Kind | HuntingQuery |
| Source Uri | https://github.com/Azure/Azure-Sentinel/blob/master/Solutions/UniFi%20Site%20Manager%20%28CCF%29/Hunting%20Queries/UniFiCloudConsoleGroupChurn.yaml |
| Version | 1.0.0 |
| Arm template | 8e22eb19-51df-37f7-468f-9d112fff9098.json |
Unifi_SiteManager_Hosts_CL
| where TimeGenerated > ago(30d)
| mv-expand member = UserData.consoleGroupMembers
| summarize MembersByDay = make_set(tostring(member.mac)) by bin(TimeGenerated, 1d), Id, HostName = tostring(ReportedState.name)
| extend MemberCount = array_length(MembersByDay)
| order by Id, TimeGenerated asc
| extend Prev = prev(MembersByDay), PrevId = prev(Id)
| where Id == PrevId and array_length(set_difference(MembersByDay, coalesce(Prev, dynamic([])))) > 0
| project Date=TimeGenerated, HostName, ['New members'] = set_difference(MembersByDay, coalesce(Prev, dynamic([]))), MemberCount
OriginalUri: https://github.com/Azure/Azure-Sentinel/blob/master/Solutions/UniFi%20Site%20Manager%20%28CCF%29/Hunting%20Queries/UniFiCloudConsoleGroupChurn.yaml
name: 'UniFi Site Manager: Console group membership churn'
version: 1.0.0
id: 8e22eb19-51df-37f7-468f-9d112fff9098
kind: HuntingQuery
query: |
Unifi_SiteManager_Hosts_CL
| where TimeGenerated > ago(30d)
| mv-expand member = UserData.consoleGroupMembers
| summarize MembersByDay = make_set(tostring(member.mac)) by bin(TimeGenerated, 1d), Id, HostName = tostring(ReportedState.name)
| extend MemberCount = array_length(MembersByDay)
| order by Id, TimeGenerated asc
| extend Prev = prev(MembersByDay), PrevId = prev(Id)
| where Id == PrevId and array_length(set_difference(MembersByDay, coalesce(Prev, dynamic([])))) > 0
| project Date=TimeGenerated, HostName, ['New members'] = set_difference(MembersByDay, coalesce(Prev, dynamic([]))), MemberCount
relevantTechniques:
- T1098
requiredDataConnectors:
- dataTypes:
- Unifi_SiteManager_Hosts_CL
connectorId: UniFiSiteManagerConnectorDefinition
entityMappings:
- entityType: Host
fieldMappings:
- columnName: HostName
identifier: HostName
description: |
Tracks members of `userData.consoleGroupMembers` over time. Additions indicate new admin access; removals indicate revoked access. Both warrant review - additions are an account-creation signal, removals can be a sign of attacker cleanup.
tactics:
- Persistence
{
"$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/8e22eb19-51df-37f7-468f-9d112fff9098')]",
"kind": "Huntingquery",
"name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/8e22eb19-51df-37f7-468f-9d112fff9098')]",
"properties": {
"alertRuleTemplateName": "8e22eb19-51df-37f7-468f-9d112fff9098",
"customDetails": null,
"description": "Tracks members of `userData.consoleGroupMembers` over time. Additions indicate new admin access; removals indicate revoked access. Both warrant review - additions are an account-creation signal, removals can be a sign of attacker cleanup.\n",
"displayName": "UniFi Site Manager: Console group membership churn",
"enabled": true,
"entityMappings": [
{
"entityType": "Host",
"fieldMappings": [
{
"columnName": "HostName",
"identifier": "HostName"
}
]
}
],
"OriginalUri": "https://github.com/Azure/Azure-Sentinel/blob/master/Solutions/UniFi%20Site%20Manager%20%28CCF%29/Hunting%20Queries/UniFiCloudConsoleGroupChurn.yaml",
"query": "Unifi_SiteManager_Hosts_CL\n| where TimeGenerated > ago(30d)\n| mv-expand member = UserData.consoleGroupMembers\n| summarize MembersByDay = make_set(tostring(member.mac)) by bin(TimeGenerated, 1d), Id, HostName = tostring(ReportedState.name)\n| extend MemberCount = array_length(MembersByDay)\n| order by Id, TimeGenerated asc\n| extend Prev = prev(MembersByDay), PrevId = prev(Id)\n| where Id == PrevId and array_length(set_difference(MembersByDay, coalesce(Prev, dynamic([])))) > 0\n| project Date=TimeGenerated, HostName, ['New members'] = set_difference(MembersByDay, coalesce(Prev, dynamic([]))), MemberCount\n",
"subTechniques": [],
"suppressionDuration": "PT1H",
"suppressionEnabled": false,
"tactics": [
"Persistence"
],
"techniques": [
"T1098"
],
"templateVersion": "1.0.0"
},
"type": "Microsoft.OperationalInsights/workspaces/providers/alertRules"
}
]
}