mirror of
https://github.com/splunk/security_content
synced 2026-06-08 17:32:49 +00:00
371 lines
16 KiB
YAML
371 lines
16 KiB
YAML
summary:
|
|
success: false
|
|
total_detections: 11
|
|
total_pass: 8
|
|
total_fail: 3
|
|
total_skipped: 0
|
|
total_untested: 0
|
|
total_experimental_or_deprecated: 0
|
|
success_rate: 72.7%
|
|
tested_detections:
|
|
- name: Windows AD Replication Request Initiated from Unsanctioned Location
|
|
search: '`wineventlog_security` EventCode=4662 ObjectType IN ("%{19195a5b-6da0-11d0-afd3-00c04fd930c9}",
|
|
"domainDNS") AND Properties IN ("*Replicating Directory Changes All*", "*{1131f6ad-9c07-11d1-f79f-00c04fc2dcd2}*",
|
|
"*{9923a32a-3607-11d2-b9be-0000f87a36b2}*","*{1131f6ac-9c07-11d1-f79f-00c04fc2dcd2}*")
|
|
AND AccessMask="0x100" AND (SubjectUserSid="NT AUT*" OR SubjectUserSid="S-1-5-18"
|
|
OR SubjectDomainName="Window Manager" OR SubjectUserName="*$") | stats min(_time)
|
|
as attack_time, count by SubjectDomainName, SubjectUserName, Computer, Logon_ID,
|
|
ObjectName, ObjectServer, ObjectType, OperationType, status | rename SubjectDomainName
|
|
as Target_Domain, SubjectUserName as user, Logon_ID as TargetLogonId | appendpipe
|
|
[| map search="search `wineventlog_security` EventCode=4624 TargetLogonId=$TargetLogonId$"]
|
|
| table attack_time, AuthenticationPackageName, LogonProcessName, LogonType, TargetUserSid,
|
|
Target_Domain, user, Computer, TargetLogonId, status, src_ip, src_category, ObjectName,
|
|
ObjectServer, ObjectType, OperationType | stats min(attack_time) as _time, values(TargetUserSid)
|
|
as TargetUserSid, values(Target_Domain) as Target_Domain, values(user) as user,
|
|
values(Computer) as Computer, values(status) as status, values(src_category) as
|
|
src_category, values(src_ip) as src_ip by TargetLogonId | search NOT src_category="domain_controller"
|
|
| `windows_ad_replication_request_initiated_from_unsanctioned_location_filter`'
|
|
success: false
|
|
tests:
|
|
- name: True Positive Test
|
|
test_type: unit
|
|
success: false
|
|
message: TEST ERROR
|
|
exception: The observable field(s) {'src_ip'} are missing in the detection results
|
|
status: error
|
|
duration: 6.49
|
|
wait_duration: null
|
|
resultCount: '1'
|
|
runDuration: '1.320'
|
|
- name: True Positive Test
|
|
test_type: integration
|
|
success: false
|
|
message: 'TEST FAILED (PREEMPTIVE): associated unit test failed or encountered
|
|
an error'
|
|
exception: The observable field(s) {'src_ip'} are missing in the detection results
|
|
status: error
|
|
duration: 3.08
|
|
wait_duration: null
|
|
resultCount: null
|
|
runDuration: null
|
|
- name: Windows Admon Default Group Policy Object Modified
|
|
search: ' `admon` admonEventType=Update objectCategory="CN=Group-Policy-Container,CN=Schema,CN=Configuration,DC=*"
|
|
(displayName="Default Domain Policy" OR displayName="Default Domain Controllers
|
|
Policy") | appendpipe [ | map search="search `wineventlog_security` EventCode=5136 AttributeSyntaxOID=2.5.5.12
|
|
AttributeValue=$displayName$" | rename AttributeValue as displayName] | stats
|
|
min(_time) as _time values(displayName) as gp_name, values(gPCFileSysPath) as
|
|
gPCFileSysPath, values(src_user) as src_user, values(dcName) as dcName, values(dest_category)
|
|
as dest_category, values(src_user_category) as src_user_category by displayName
|
|
| `windows_admon_default_group_policy_object_modified_filter`'
|
|
success: false
|
|
tests:
|
|
- name: True Positive Test
|
|
test_type: unit
|
|
success: false
|
|
message: TEST ERROR
|
|
exception: The observable field(s) {'src_user'} are missing in the detection results
|
|
status: error
|
|
duration: 7.63
|
|
wait_duration: null
|
|
resultCount: '1'
|
|
runDuration: '2.158'
|
|
- name: True Positive Test
|
|
test_type: integration
|
|
success: false
|
|
message: 'TEST FAILED (PREEMPTIVE): associated unit test failed or encountered
|
|
an error'
|
|
exception: The observable field(s) {'src_user'} are missing in the detection results
|
|
status: error
|
|
duration: 3.17
|
|
wait_duration: null
|
|
resultCount: null
|
|
runDuration: null
|
|
- name: Windows Admon Group Policy Object Created
|
|
search: ' `admon` admonEventType=Update objectCategory="CN=Group-Policy-Container,CN=Schema,CN=Configuration,DC=*"
|
|
versionNumber=0 displayName!="New Group Policy Object" | appendpipe [ | map search="search
|
|
`wineventlog_security` EventCode=5136 AttributeSyntaxOID=2.5.5.12 AttributeValue=$displayName$"
|
|
| rename AttributeValue as displayName] | stats min(_time) as _time values(displayName)
|
|
as gp_name, values(gPCFileSysPath) as gPCFileSysPath, values(src_user) as src_user,
|
|
values(dcName) as dcName, values(dest_category) as dest_category, values(src_user_category)
|
|
as src_user_category by displayName | `windows_admon_group_policy_object_created_filter`'
|
|
success: false
|
|
tests:
|
|
- name: True Positive Test
|
|
test_type: unit
|
|
success: false
|
|
message: TEST ERROR
|
|
exception: The observable field(s) {'src_user'} are missing in the detection results
|
|
status: error
|
|
duration: 11.45
|
|
wait_duration: null
|
|
resultCount: '1'
|
|
runDuration: '1.270'
|
|
- name: True Positive Test
|
|
test_type: integration
|
|
success: false
|
|
message: 'TEST FAILED (PREEMPTIVE): associated unit test failed or encountered
|
|
an error'
|
|
exception: The observable field(s) {'src_user'} are missing in the detection results
|
|
status: error
|
|
duration: 3.26
|
|
wait_duration: null
|
|
resultCount: null
|
|
runDuration: null
|
|
- name: Azure AD Admin Consent Bypassed by Service Principal
|
|
search: '`azure_monitor_aad` (operationName="Add app role assignment to service
|
|
principal" OR operationName="Add member to role*") src_user_type=servicePrincipal |
|
|
rename properties.* as * | eval roleId = mvindex(''targetResources{}.modifiedProperties{}.newValue'',
|
|
0) | eval roleValue = mvindex(''targetResources{}.modifiedProperties{}.newValue'',
|
|
1) | eval roleDescription = mvindex(''targetResources{}.modifiedProperties{}.newValue'',
|
|
2) | eval user_id = mvindex(''targetResources{}.id'', 0), user=coalesce(user,mvindex(''targetResources{}.displayName'',
|
|
0)) | rename initiatedBy.app.displayName as src_user | stats count earliest(_time)
|
|
as firstTime latest(_time) as lastTime by src_user user user_id roleId roleValue
|
|
roleDescription | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` |
|
|
`azure_ad_admin_consent_bypassed_by_service_principal_filter`'
|
|
success: true
|
|
tests:
|
|
- name: True Positive Test
|
|
test_type: unit
|
|
success: true
|
|
message: TEST PASSED
|
|
exception: null
|
|
status: pass
|
|
duration: 5.84
|
|
wait_duration: null
|
|
resultCount: '1'
|
|
runDuration: '0.654'
|
|
- name: True Positive Test
|
|
test_type: integration
|
|
success: true
|
|
message: 'TEST SKIPPED: Skipping all integration tests'
|
|
exception: null
|
|
status: skip
|
|
duration: 0
|
|
wait_duration: null
|
|
resultCount: null
|
|
runDuration: null
|
|
- name: Azure AD Global Administrator Role Assigned
|
|
search: '`azure_monitor_aad` operationName="Add member to role" properties.targetResources{}.modifiedProperties{}.newValue="\"Global
|
|
Administrator\"" | rename properties.* as *, initiatedBy.user.userPrincipalName
|
|
as userPrincipalName, targetResources{}.displayName as displayName | eval initiatedBy
|
|
= coalesce(userPrincipalName,src_user) | eval user = coalesce(user,mvfilter(displayName!="null"))
|
|
| stats count min(_time) as firstTime max(_time) as lastTime values(user) as user
|
|
by initiatedBy, result, operationName | `security_content_ctime(firstTime)` |
|
|
`security_content_ctime(lastTime)` | `azure_ad_global_administrator_role_assigned_filter`'
|
|
success: true
|
|
tests:
|
|
- name: True Positive Test
|
|
test_type: unit
|
|
success: true
|
|
message: TEST PASSED
|
|
exception: null
|
|
status: pass
|
|
duration: 5.97
|
|
wait_duration: null
|
|
resultCount: '1'
|
|
runDuration: '0.666'
|
|
- name: True Positive Test
|
|
test_type: integration
|
|
success: true
|
|
message: 'TEST SKIPPED: Skipping all integration tests'
|
|
exception: null
|
|
status: skip
|
|
duration: 0
|
|
wait_duration: null
|
|
resultCount: null
|
|
runDuration: null
|
|
- name: Azure AD Privileged Role Assigned
|
|
search: ' `azure_monitor_aad` "operationName"="Add member to role" | rename properties.*
|
|
as *, initiatedBy.user.userPrincipalName as userPrincipalName, targetResources{}.displayName
|
|
as displayName | eval initiatedBy = coalesce(userPrincipalName,src_user) | eval
|
|
user = coalesce(user,mvfilter(displayName!="null")) | rename targetResources{}.modifiedProperties{}.newValue as
|
|
roles | eval role=mvindex(roles,1) | stats count min(_time) as firstTime max(_time)
|
|
as lastTime values(user) as user by initiatedBy, result, operationName, role |
|
|
lookup privileged_azure_ad_roles azureadrole AS role OUTPUT isprvilegedadrole
|
|
description | search isprvilegedadrole = True | `security_content_ctime(firstTime)`
|
|
| `security_content_ctime(lastTime)` | `azure_ad_privileged_role_assigned_filter`'
|
|
success: true
|
|
tests:
|
|
- name: True Positive Test
|
|
test_type: unit
|
|
success: true
|
|
message: TEST PASSED
|
|
exception: null
|
|
status: pass
|
|
duration: 5.94
|
|
wait_duration: null
|
|
resultCount: '1'
|
|
runDuration: '0.648'
|
|
- name: True Positive Test
|
|
test_type: integration
|
|
success: true
|
|
message: 'TEST SKIPPED: Skipping all integration tests'
|
|
exception: null
|
|
status: skip
|
|
duration: 0
|
|
wait_duration: null
|
|
resultCount: null
|
|
runDuration: null
|
|
- name: Azure AD Privileged Role Assigned to Service Principal
|
|
search: ' `azure_monitor_aad` operationName="Add member to role" | rename properties.*
|
|
as * | search "targetResources{}.type"=ServicePrincipal | rename initiatedBy.user.userPrincipalName
|
|
as initiatedBy | rename targetResources{}.modifiedProperties{}.newValue as roles
|
|
| eval role=mvindex(roles,1) | rename targetResources{}.displayName as apps |
|
|
eval displayName=mvindex(apps,0) | stats count min(_time) as firstTime max(_time)
|
|
as lastTime values(displayName) as displayName by initiatedBy, result, operationName,
|
|
role | lookup privileged_azure_ad_roles azureadrole AS role OUTPUT isprvilegedadrole
|
|
description | search isprvilegedadrole = True | `security_content_ctime(firstTime)`
|
|
| `security_content_ctime(lastTime)` | `azure_ad_privileged_role_assigned_to_service_principal_filter`'
|
|
success: true
|
|
tests:
|
|
- name: True Positive Test
|
|
test_type: unit
|
|
success: true
|
|
message: TEST PASSED
|
|
exception: null
|
|
status: pass
|
|
duration: 9.3
|
|
wait_duration: null
|
|
resultCount: '1'
|
|
runDuration: '3.134'
|
|
- name: True Positive Test
|
|
test_type: integration
|
|
success: true
|
|
message: 'TEST SKIPPED: Skipping all integration tests'
|
|
exception: null
|
|
status: skip
|
|
duration: 0
|
|
wait_duration: null
|
|
resultCount: null
|
|
runDuration: null
|
|
- name: Azure AD Service Principal New Client Credentials
|
|
search: ' `azure_monitor_aad` category=AuditLogs operationName="Update application*Certificates
|
|
and secrets management*" | rename properties.* as * | rename targetResources{}.*
|
|
as * | rename modifiedProperties{}.* as * | eval src_user=coalesce(user,identity),
|
|
newValue=mvfilter(newValue!="\"KeyDescription\"") | stats count min(_time) as
|
|
firstTime max(_time) as lastTime values(displayName) as displayName values(src_ip)
|
|
as src_ip values(eval(mvfilter(oldValue!="null"))) as oldValue by src_user, object,
|
|
newValue | spath input=oldValue output=oldValues path={} | spath input=newValue
|
|
output=newValues path={} | mvexpand newValues | where NOT newValues IN (oldValues)
|
|
| fields - newValue, oldValue, oldValues | rename newValues as newValue | `security_content_ctime(firstTime)`
|
|
| `security_content_ctime(lastTime)` | `azure_ad_service_principal_new_client_credentials_filter`'
|
|
success: true
|
|
tests:
|
|
- name: True Positive Test
|
|
test_type: unit
|
|
success: true
|
|
message: TEST PASSED
|
|
exception: null
|
|
status: pass
|
|
duration: 5.94
|
|
wait_duration: null
|
|
resultCount: '1'
|
|
runDuration: '0.782'
|
|
- name: True Positive Test
|
|
test_type: integration
|
|
success: true
|
|
message: 'TEST SKIPPED: Skipping all integration tests'
|
|
exception: null
|
|
status: skip
|
|
duration: 0
|
|
wait_duration: null
|
|
resultCount: null
|
|
runDuration: null
|
|
- name: Detect New Local Admin account
|
|
search: '`wineventlog_security` (EventCode=4720) OR (EventCode=4732 Group_Name=Administrators)
|
|
| stats dc(EventCode) as evCount min(_time) as _time range(_time) as duration
|
|
values(src_user) as src_user values(src_user_category) as src_user_category values(dest_category)
|
|
as dest_category by user dest | where evCount=2 | fields - evCount, duration |
|
|
`detect_new_local_admin_account_filter`'
|
|
success: true
|
|
tests:
|
|
- name: True Positive Test
|
|
test_type: unit
|
|
success: true
|
|
message: TEST PASSED
|
|
exception: null
|
|
status: pass
|
|
duration: 14.33
|
|
wait_duration: null
|
|
resultCount: '1'
|
|
runDuration: '0.696'
|
|
- name: True Positive Test
|
|
test_type: integration
|
|
success: true
|
|
message: 'TEST SKIPPED: Skipping all integration tests'
|
|
exception: null
|
|
status: skip
|
|
duration: 0
|
|
wait_duration: null
|
|
resultCount: null
|
|
runDuration: null
|
|
- name: Kerberos Pre-Authentication Flag Disabled in UserAccountControl
|
|
search: '`wineventlog_security` EventCode=4738 (UserAccountControl="%%2096" OR MSADChangedAttributes="*Don''t
|
|
Require Preauth'' - Enabled*") | eval MSADChangedAttributes="''Don''t Require
|
|
Preauth'' - Enabled" | table _time, source, EventCode, src_user, src_user_category,
|
|
user, user_category, MSADChangedAttributes | `kerberos_pre_authentication_flag_disabled_in_useraccountcontrol_filter`'
|
|
success: true
|
|
tests:
|
|
- name: True Positive Test
|
|
test_type: unit
|
|
success: true
|
|
message: TEST PASSED
|
|
exception: null
|
|
status: pass
|
|
duration: 6.08
|
|
wait_duration: null
|
|
resultCount: '1'
|
|
runDuration: '0.630'
|
|
- name: True Positive Test
|
|
test_type: integration
|
|
success: true
|
|
message: 'TEST SKIPPED: Skipping all integration tests'
|
|
exception: null
|
|
status: skip
|
|
duration: 0
|
|
wait_duration: null
|
|
resultCount: null
|
|
runDuration: null
|
|
- name: Windows AD Replication Request Initiated by User Account
|
|
search: '`wineventlog_security` EventCode=4662 ObjectType IN ("%{19195a5b-6da0-11d0-afd3-00c04fd930c9}",
|
|
"domainDNS") AND Properties IN ("*Replicating Directory Changes All*", "*{1131f6ad-9c07-11d1-f79f-00c04fc2dcd2}*",
|
|
"*{9923a32a-3607-11d2-b9be-0000f87a36b2}*","*{1131f6ac-9c07-11d1-f79f-00c04fc2dcd2}*")
|
|
AND AccessMask="0x100" AND NOT (SubjectUserSid="NT AUT*" OR SubjectUserSid="S-1-5-18"
|
|
OR SubjectDomainName="Window Manager" OR SubjectUserName="*$") | stats min(_time)
|
|
as _time, count by SubjectDomainName, SubjectUserName, Computer, Logon_ID, ObjectName,
|
|
ObjectServer, ObjectType, OperationType, status | rename SubjectDomainName as
|
|
Target_Domain, SubjectUserName as user, Logon_ID as TargetLogonId, _time as attack_time
|
|
| appendpipe [| map search="search `wineventlog_security` EventCode=4624 TargetLogonId=$TargetLogonId$"]
|
|
| table attack_time, AuthenticationPackageName, LogonProcessName, LogonType, TargetUserSid,
|
|
Target_Domain, user, Computer, TargetLogonId, status, src_ip, src_category, ObjectName,
|
|
ObjectServer, ObjectType, OperationType | stats min(attack_time) as _time values(TargetUserSid)
|
|
as TargetUserSid, values(Target_Domain) as Target_Domain, values(user) as user,
|
|
values(Computer) as Computer, values(status) as status, values(src_category) as
|
|
src_category, values(src_ip) as src_ip by TargetLogonId | `windows_ad_replication_request_initiated_by_user_account_filter`'
|
|
success: true
|
|
tests:
|
|
- name: True Positive Test
|
|
test_type: unit
|
|
success: true
|
|
message: TEST PASSED
|
|
exception: null
|
|
status: pass
|
|
duration: 11.26
|
|
wait_duration: null
|
|
resultCount: '1'
|
|
runDuration: '1.289'
|
|
- name: True Positive Test
|
|
test_type: integration
|
|
success: true
|
|
message: 'TEST SKIPPED: Skipping all integration tests'
|
|
exception: null
|
|
status: skip
|
|
duration: 0
|
|
wait_duration: null
|
|
resultCount: null
|
|
runDuration: null
|
|
untested_detections: []
|
|
percent_complete: UKNOWN
|
|
deprecated_detections: []
|
|
experimental_detections: []
|