Merge branch 'develop' of github.com:splunk/security-content into tf23

This commit is contained in:
Xiao Lin
2021-02-15 13:08:17 -08:00
785 changed files with 24664 additions and 20406 deletions
+8
View File
@@ -253,6 +253,12 @@ jobs:
cd security-content
source venv/bin/activate
python bin/doc-gen.py --path . --output docs -v
- run:
name: make yamls pretty
command: |
cd security-content
source venv/bin/activate
python bin/pretty_yaml.py --path . -v
- run:
name: get cti repo for mitre-maps
command: |
@@ -283,6 +289,7 @@ jobs:
git config --global push.default simple
git add package/*
git add docs/*
git add detections/*
git commit --allow-empty -m "updating docs and package bits [ci skip]"
# Push quietly to prevent showing the token in log
git push https://${GITHUB_TOKEN}@github.com/splunk/security-content.git ${CIRCLE_BRANCH}
@@ -339,6 +346,7 @@ jobs:
name: update api sources
command: |
cd security-content
aws s3 rm s3://security-content --recursive --exclude "*" --include "*.yml"
aws s3 cp stories s3://security-content/stories --recursive --exclude "*" --include "*.yml"
aws s3 cp baselines s3://security-content/baselines --recursive --exclude "*" --include "*.yml"
aws s3 cp detections s3://security-content/detections --recursive --exclude "*" --include "*.yml"
+1 -1
View File
@@ -13,4 +13,4 @@ validate:
script:
- python3 bin/ssa_validate.py --skip-error detections/*/*
- python3 bin/ssa_test.py --skip-error tests/*/*
- python3 bin/testing_coverage.py --type SSA --min-coverage 1.0
- python3 bin/testing_coverage.py --type streaming --min-coverage 1.0
-2
View File
@@ -4,8 +4,6 @@
<img src="https://img.shields.io/github/v/release/splunk/security_content" /></a>
<a href="https://circleci.com/gh/splunk/security_content/tree/develop">
<img src="https://img.shields.io/circleci/build/github/splunk/security_content?token=67ad1fa7779c57d7e5bcfc42bd617baf607ec269" /></a>
<a href="https://github.com/search?q=repo%3Asplunk%2Fsecurity_content+extension%3Ayml+path%3Adetections&type=Code&ref=advsearch&l=&l=">
<img src="https://img.shields.io/github/directory-file-count/splunk/security_content/detections?extension=.yml&label=detections" /></a>
<a href="https://github.com/splunk/security_content">
<img src="https://security-content.s3-us-west-2.amazonaws.com/reporting/detection_coverage.svg" /></a>
<a href="https://github.com/splunk/security_content">
+5 -5
View File
@@ -1,4 +1,4 @@
ansible==2.10.6
ansible==2.10.7
ansible-runner==1.4.6
apipkg==1.5
aspy.yaml==1.3.0
@@ -8,7 +8,7 @@ attrs==20.3.0
azure-common==1.1.26
azure-core==1.10.0
azure-identity==1.5.0
azure-mgmt-compute==18.1.0
azure-mgmt-compute==18.2.0
azure-mgmt-core==1.2.2
azure-mgmt-network==17.1.0
azure-mgmt-resource==15.0.0
@@ -16,18 +16,18 @@ bcrypt==3.2.0
boto3==1.16.61
botocore==1.19.63
certifi==2020.12.5
cffi==1.14.4
cffi==1.14.5
cfgv==2.0.1
chardet==4.0.0
configparser==4.0.2
contextlib2==0.6.0.post1
cryptography==3.3.1
cryptography==3.3.2
Deprecated==1.2.11
dnspython==2.1.0
docutils==0.16
execnet==1.8.0
gitdb==4.0.5
GitPython==3.1.12
GitPython==3.1.13
identify==1.5.13
idna==2.8
importlib-metadata==3.4.0
@@ -2,21 +2,28 @@ name: Baseline of API Calls per User ARN
id: fc0edc96-ff2b-48b0-9f6f-63da3783fd63
version: 1
date: '2018-04-09'
author: David Dorsey, Splunk
type: batch
datamodel: []
description: This search establishes, on a per-hour basis, the average and the standard
deviation of the number of API calls made by each user. Also recorded is the number
of data points for each user. This table is then outputted to a lookup file to allow
the detection search to operate quickly.
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS version (4.4.0 or later), then configure your CloudTrail
inputs.
author: David Dorsey, Splunk
search: '`cloudtrail` eventType=AwsApiCall | spath output=arn path=userIdentity.arn
| bucket _time span=1h | stats count as apiCalls by _time, arn | stats count(apiCalls)
as numDataPoints, latest(apiCalls) as latestCount, avg(apiCalls) as avgApiCalls,
stdev(apiCalls) as stdevApiCalls by arn | table arn, latestCount, numDataPoints,
avgApiCalls, stdevApiCalls | outputlookup api_call_by_user_baseline | stats count'
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS version (4.4.0 or later), then configure your CloudTrail
inputs.
references: []
tags:
analytics_story:
analytic_story:
- AWS User Monitoring
detections:
- Detect Spike in AWS API Activity
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,15 +2,14 @@ name: Baseline of blocked outbound traffic from AWS
id: fc0edd96-ff2b-48b0-9f1f-63da3782fd63
version: 1
date: '2018-05-07'
author: Bhavin Patel, Splunk
type: batch
datamodel: []
description: This search establishes, on a per-hour basis, the average and the standard
deviation of the number of outbound connections blocked in your VPC flow logs by
each source IP address (IP address of your EC2 instances). Also recorded is the
number of data points for each source IP. This table outputs to a lookup file to
allow the detection search to operate quickly.
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS version (4.4.0 or later), then configure your `VPC flow
logs.`.
author: Bhavin Patel, Splunk
search: '`cloudwatchlogs_vpcflow` action=blocked (src_ip=10.0.0.0/8 OR src_ip=172.16.0.0/12
OR src_ip=192.168.0.0/16) ( dest_ip!=10.0.0.0/8 AND dest_ip!=172.16.0.0/12 AND dest_ip!=192.168.0.0/16)
| bucket _time span=1h | stats count as numberOfBlockedConnections by _time, src_ip
@@ -19,10 +18,18 @@ search: '`cloudwatchlogs_vpcflow` action=blocked (src_ip=10.0.0.0/8 OR src_ip=17
as stdevBlockedConnections by src_ip | table src_ip, latestCount, numDataPoints,
avgBlockedConnections, stdevBlockedConnections | outputlookup baseline_blocked_outbound_connections
| stats count'
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS version (4.4.0 or later), then configure your `VPC flow
logs.`.
references: []
tags:
analytics_story:
analytic_story:
- AWS Network ACL Activity
- Command and Control
- Suspicious AWS Traffic
detections:
- Detect Spike in blocked Outbound Traffic from your AWS
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,36 +2,42 @@ name: Baseline Of Cloud Infrastructure API Calls Per User
id: 1da5d5ea-4382-447d-98a9-87c358c95fcb
version: 1
date: '2020-09-07'
description: This search is used to build a Machine Learning Toolkit (MLTK) model
for how many API calls are performed by each user. By default, the search uses
the last 90 days of data to build the model and the model is rebuilt weekly. The
model created by this search is then used in the corresponding detection search,
which identifies subsequent outliers in the number of instances created in a
small time window.
how_to_implement: 'You must have Enterprise Security 6.0 or later, if not you will need
to verify that the Machine Learning Toolkit (MLTK) version 4.2 or later is installed,
along with any required dependencies. Depending on the number of users in your environment,
you may also need to adjust the value for max_inputs in the MLTK settings for the
DensityFunction algorithm, then ensure that the search completes in a reasonable
timeframe. By default, the search builds the model using the past 90 days of data.
You can modify the search window to build the model over a longer period of time,
which may give you better results. You may also want to periodically re-run this
search to rebuild the model with the latest data.'
author: David Dorsey, Splunk
search: '| tstats count as api_calls from datamodel=Change where All_Changes.user!=unknown All_Changes.status=success by All_Changes.user _time span=1h
| `drop_dm_object_name("All_Changes")`
| eval HourOfDay=strftime(_time, "%H")
| eval HourOfDay=floor(HourOfDay/4)*4
| eval DayOfWeek=strftime(_time, "%w")
| eval isWeekend=if(DayOfWeek >= 1 AND DayOfWeek <= 5, 0, 1)
| table _time api_calls, user, HourOfDay, isWeekend
| eventstats dc(api_calls) as api_calls by user, HourOfDay, isWeekend
| where api_calls >= 1
| fit DensityFunction api_calls by "user,HourOfDay,isWeekend" into cloud_excessive_api_calls_v1 dist=norm show_density=true'
type: batch
datamodel:
- Change
description: This search is used to build a Machine Learning Toolkit (MLTK) model
for how many API calls are performed by each user. By default, the search uses the
last 90 days of data to build the model and the model is rebuilt weekly. The model
created by this search is then used in the corresponding detection search, which
identifies subsequent outliers in the number of instances created in a small time
window.
search: '| tstats count as api_calls from datamodel=Change where All_Changes.user!=unknown
All_Changes.status=success by All_Changes.user _time span=1h | `drop_dm_object_name("All_Changes")`
| eval HourOfDay=strftime(_time, "%H") | eval HourOfDay=floor(HourOfDay/4)*4 | eval
DayOfWeek=strftime(_time, "%w") | eval isWeekend=if(DayOfWeek >= 1 AND DayOfWeek
<= 5, 0, 1) | table _time api_calls, user, HourOfDay, isWeekend | eventstats dc(api_calls)
as api_calls by user, HourOfDay, isWeekend | where api_calls >= 1 | fit DensityFunction
api_calls by "user,HourOfDay,isWeekend" into cloud_excessive_api_calls_v1 dist=norm
show_density=true'
how_to_implement: You must have Enterprise Security 6.0 or later, if not you will
need to verify that the Machine Learning Toolkit (MLTK) version 4.2 or later is
installed, along with any required dependencies. Depending on the number of users
in your environment, you may also need to adjust the value for max_inputs in the
MLTK settings for the DensityFunction algorithm, then ensure that the search completes
in a reasonable timeframe. By default, the search builds the model using the past
90 days of data. You can modify the search window to build the model over a longer
period of time, which may give you better results. You may also want to periodically
re-run this search to rebuild the model with the latest data.
references: []
tags:
analytics_story:
analytic_story:
- Suspicious Cloud User Activities
deployments:
- Weekly Model Rebuild 90 Day Lookback
detections:
- Abnormally High Number Of Cloud Infrastructure API Calls
deployments:
- Weekly Model Rebuild 90 Day Lookback
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,37 +2,45 @@ name: Baseline Of Cloud Instances Destroyed
id: a2f701f8-5296-4d74-829c-0b7eb346d549
version: 1
date: '2020-08-25'
author: David Dorsey, Splunk
type: batch
datamodel:
- Change
description: This search is used to build a Machine Learning Toolkit (MLTK) model
for how many instances are destroyed in the environment. By default, the search uses
the last 90 days of data to build the model and the model is rebuilt weekly. The
model created by this search is then used in the corresponding detection search,
which identifies subsequent outliers in the number of instances destroyed in a
small time window.
how_to_implement: 'You must have Enterprise Security 6.0 or later, if not you will need
to verify that the Machine Learning Toolkit (MLTK) version 4.2 or later is installed,
along with any required dependencies. Depending on the number of users in your environment,
you may also need to adjust the value for max_inputs in the MLTK settings for the
DensityFunction algorithm, then ensure that the search completes in a reasonable
timeframe. By default, the search builds the model using the past 30 days of data.
You can modify the search window to build the model over a longer period of time,
which may give you better results. You may also want to periodically re-run this
search to rebuild the model with the latest data.\
for how many instances are destroyed in the environment. By default, the search
uses the last 90 days of data to build the model and the model is rebuilt weekly.
The model created by this search is then used in the corresponding detection search,
which identifies subsequent outliers in the number of instances destroyed in a small
time window.
search: '| tstats count as instances_destroyed from datamodel=Change where All_Changes.action=deleted
AND All_Changes.status=success AND All_Changes.object_category=instance by _time
span=1h | makecontinuous span=1h _time | eval instances_destroyed=coalesce(instances_destroyed,
(random()%2)*0.0000000001) | eval HourOfDay=strftime(_time, "%H") | eval HourOfDay=floor(HourOfDay/4)*4
| eval DayOfWeek=strftime(_time, "%w") | eval isWeekend=if(DayOfWeek >= 1 AND DayOfWeek
<= 5, 0, 1) | table _time instances_destroyed, HourOfDay, isWeekend | fit DensityFunction
instances_destroyed by "HourOfDay,isWeekend" into cloud_excessive_instances_destroyed_v1
dist=expon show_density=true'
how_to_implement: 'You must have Enterprise Security 6.0 or later, if not you will
need to verify that the Machine Learning Toolkit (MLTK) version 4.2 or later is
installed, along with any required dependencies. Depending on the number of users
in your environment, you may also need to adjust the value for max_inputs in the
MLTK settings for the DensityFunction algorithm, then ensure that the search completes
in a reasonable timeframe. By default, the search builds the model using the past
30 days of data. You can modify the search window to build the model over a longer
period of time, which may give you better results. You may also want to periodically
re-run this search to rebuild the model with the latest data.\
More information on the algorithm used in the search can be found at `https://docs.splunk.com/Documentation/MLApp/4.2.0/User/Algorithms#DensityFunction`.'
author: David Dorsey, Splunk
search: '| tstats count as instances_destroyed from datamodel=Change where
All_Changes.action=deleted
AND All_Changes.status=success AND All_Changes.object_category=instance
by _time span=1h
| makecontinuous span=1h _time | eval instances_destroyed=coalesce(instances_destroyed, (random()%2)*0.0000000001)
| eval HourOfDay=strftime(_time, "%H") | eval HourOfDay=floor(HourOfDay/4)*4 | eval DayOfWeek=strftime(_time, "%w") | eval isWeekend=if(DayOfWeek >= 1 AND DayOfWeek <= 5, 0, 1)
| table _time instances_destroyed, HourOfDay, isWeekend
| fit DensityFunction instances_destroyed by "HourOfDay,isWeekend" into cloud_excessive_instances_destroyed_v1 dist=expon show_density=true'
references: []
tags:
analytics_story:
analytic_story:
- Suspicious Cloud Instance Activities
- Cloud Cryptomining
deployments:
- Weekly Model Rebuild 90 Day Lookback
detections:
- Abnormally High Number Of Cloud Instances Destroyed
deployments:
- Weekly Model Rebuild 90 Day Lookback
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,37 +2,45 @@ name: Baseline Of Cloud Instances Launched
id: b01bd274-f661-4f9c-bd9f-cf23ff6ae0bc
version: 1
date: '2020-08-14'
author: David Dorsey, Splunk
type: batch
datamodel:
- Change
description: This search is used to build a Machine Learning Toolkit (MLTK) model
for how many instances are created in the environment. By default, the search uses
the last 90 days of data to build the model and the model is rebuilt weekly. The
model created by this search is then used in the corresponding detection search,
which identifies subsequent outliers in the number of instances created in a
small time window.
how_to_implement: 'You must have Enterprise Security 6.0 or later, if not you will need
to verify that the Machine Learning Toolkit (MLTK) version 4.2 or later is installed,
along with any required dependencies. Depending on the number of users in your environment,
you may also need to adjust the value for max_inputs in the MLTK settings for the
DensityFunction algorithm, then ensure that the search completes in a reasonable
timeframe. By default, the search builds the model using the past 90 days of data.
You can modify the search window to build the model over a longer period of time,
which may give you better results. You may also want to periodically re-run this
search to rebuild the model with the latest data.\
which identifies subsequent outliers in the number of instances created in a small
time window.
search: '| tstats count as instances_launched from datamodel=Change where (All_Changes.action=created)
AND All_Changes.status=success AND All_Changes.object_category=instance by _time
span=1h | makecontinuous span=1h _time | eval instances_launched=coalesce(instances_launched,
(random()%2)*0.0000000001) | eval HourOfDay=strftime(_time, "%H") | eval HourOfDay=floor(HourOfDay/4)*4
| eval DayOfWeek=strftime(_time, "%w") | eval isWeekend=if(DayOfWeek >= 1 AND DayOfWeek
<= 5, 0, 1) | table _time instances_launched, HourOfDay, isWeekend | fit DensityFunction
instances_launched by "HourOfDay,isWeekend" into cloud_excessive_instances_created_v1
dist=expon show_density=true'
how_to_implement: 'You must have Enterprise Security 6.0 or later, if not you will
need to verify that the Machine Learning Toolkit (MLTK) version 4.2 or later is
installed, along with any required dependencies. Depending on the number of users
in your environment, you may also need to adjust the value for max_inputs in the
MLTK settings for the DensityFunction algorithm, then ensure that the search completes
in a reasonable timeframe. By default, the search builds the model using the past
90 days of data. You can modify the search window to build the model over a longer
period of time, which may give you better results. You may also want to periodically
re-run this search to rebuild the model with the latest data.\
More information on the algorithm used in the search can be found at `https://docs.splunk.com/Documentation/MLApp/4.2.0/User/Algorithms#DensityFunction`.'
author: David Dorsey, Splunk
search: '| tstats count as instances_launched from datamodel=Change where
(All_Changes.action=created)
AND All_Changes.status=success AND All_Changes.object_category=instance
by _time span=1h
| makecontinuous span=1h _time | eval instances_launched=coalesce(instances_launched, (random()%2)*0.0000000001)
| eval HourOfDay=strftime(_time, "%H") | eval HourOfDay=floor(HourOfDay/4)*4 | eval DayOfWeek=strftime(_time, "%w") | eval isWeekend=if(DayOfWeek >= 1 AND DayOfWeek <= 5, 0, 1)
| table _time instances_launched, HourOfDay, isWeekend
| fit DensityFunction instances_launched by "HourOfDay,isWeekend" into cloud_excessive_instances_created_v1 dist=expon show_density=true'
references: []
tags:
analytics_story:
analytic_story:
- Cloud Cryptomining
- Suspicious Cloud Instance Activities
detections:
- Abnormally High Number Of Cloud Instances Launched
deployments:
- Weekly Model Rebuild 90 Day Lookback
detections:
- Abnormally High Number Of Cloud Instances Launched
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,33 +2,41 @@ name: Baseline Of Cloud Security Group API Calls Per User
id: 67b84d51-8329-4909-849f-8d38ce54260a
version: 1
date: '2020-09-07'
description: This search is used to build a Machine Learning Toolkit (MLTK) model
for how many API calls for security groups are performed by each user. By default, the search uses
the last 90 days of data to build the model and the model is rebuilt weekly.
how_to_implement: 'You must have Enterprise Security 6.0 or later, if not you will need
to verify that the Machine Learning Toolkit (MLTK) version 4.2 or later is installed,
along with any required dependencies. Depending on the number of users in your environment,
you may also need to adjust the value for max_inputs in the MLTK settings for the
DensityFunction algorithm, then ensure that the search completes in a reasonable
timeframe. By default, the search builds the model using the past 90 days of data.
You can modify the search window to build the model over a longer period of time,
which may give you better results. You may also want to periodically re-run this
search to rebuild the model with the latest data.'
author: David Dorsey, Splunk
search: '| tstats count as security_group_api_calls from datamodel=Change where All_Changes.object_category=firewall All_Changes.status=success by All_Changes.user _time span=1h
| `drop_dm_object_name("All_Changes")`
| eval HourOfDay=strftime(_time, "%H")
| eval HourOfDay=floor(HourOfDay/4)*4
| eval DayOfWeek=strftime(_time, "%w")
| eval isWeekend=if(DayOfWeek >= 1 AND DayOfWeek <= 5, 0, 1)
| table _time security_group_api_calls, user, HourOfDay, isWeekend
| eventstats dc(security_group_api_calls) as security_group_api_calls by user, HourOfDay, isWeekend
| where security_group_api_calls >= 1
| fit DensityFunction security_group_api_calls by "user,HourOfDay,isWeekend" into cloud_excessive_security_group_api_calls_v1 dist=norm show_density=true'
type: batch
datamodel:
- Change
description: This search is used to build a Machine Learning Toolkit (MLTK) model
for how many API calls for security groups are performed by each user. By default,
the search uses the last 90 days of data to build the model and the model is rebuilt
weekly.
search: '| tstats count as security_group_api_calls from datamodel=Change where All_Changes.object_category=firewall
All_Changes.status=success by All_Changes.user _time span=1h | `drop_dm_object_name("All_Changes")`
| eval HourOfDay=strftime(_time, "%H") | eval HourOfDay=floor(HourOfDay/4)*4 | eval
DayOfWeek=strftime(_time, "%w") | eval isWeekend=if(DayOfWeek >= 1 AND DayOfWeek
<= 5, 0, 1) | table _time security_group_api_calls, user, HourOfDay, isWeekend |
eventstats dc(security_group_api_calls) as security_group_api_calls by user, HourOfDay,
isWeekend | where security_group_api_calls >= 1 | fit DensityFunction security_group_api_calls
by "user,HourOfDay,isWeekend" into cloud_excessive_security_group_api_calls_v1 dist=norm
show_density=true'
how_to_implement: You must have Enterprise Security 6.0 or later, if not you will
need to verify that the Machine Learning Toolkit (MLTK) version 4.2 or later is
installed, along with any required dependencies. Depending on the number of users
in your environment, you may also need to adjust the value for max_inputs in the
MLTK settings for the DensityFunction algorithm, then ensure that the search completes
in a reasonable timeframe. By default, the search builds the model using the past
90 days of data. You can modify the search window to build the model over a longer
period of time, which may give you better results. You may also want to periodically
re-run this search to rebuild the model with the latest data.
references: []
tags:
analytics_story:
analytic_story:
- Suspicious Cloud User Activities
deployments:
- Weekly Model Rebuild 90 Day Lookback
detections:
- Abnormally High Number Of Cloud Security Group API Calls
deployments:
- Weekly Model Rebuild 90 Day Lookback
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,11 +2,19 @@ name: Baseline of Command Line Length - MLTK
id: d2a4d85b-fc6a-47a0-82f6-bc1ec2ebc459
version: 1
date: '2019-05-08'
author: Rico Valdez, Splunk
type: batch
datamodel: []
description: This search is used to build a Machine Learning Toolkit (MLTK) model
to characterize the length of the command lines observed for each user in the environment.
By default, the search uses the last 30 days of data to build the model. The model
created by this search is then used in the corresponding detection search, which
identifies outliers in the length of the command line.
search: '| tstats `security_content_summariesonly` count min(_time) as start_time
max(_time) as end_time FROM datamodel=Endpoint.Processes by Processes.user Processes.dest
Processes.process_name Processes.process | `drop_dm_object_name(Processes)` | search
user!=unknown | `security_content_ctime(start_time)`| `security_content_ctime(end_time)`|
eval processlen=len(process) | fit DensityFunction processlen by user into cmdline_pdfmodel'
how_to_implement: You must be ingesting endpoint data and populating the Endpoint
data model. In addition, you must have the Machine Learning Toolkit (MLTK) version
>= 4.2 installed, along with any required dependencies. Depending on the number
@@ -17,14 +25,9 @@ how_to_implement: You must be ingesting endpoint data and populating the Endpoin
a longer period of time, which may give you better results. You may also want to
periodically re-run this search to rebuild the model with the latest data. More
information on the algorithm used in the search can be found at `https://docs.splunk.com/Documentation/MLApp/4.2.0/User/Algorithms#DensityFunction`.
author: Rico Valdez, Splunk
search: '| tstats `security_content_summariesonly` count min(_time) as start_time
max(_time) as end_time FROM datamodel=Endpoint.Processes by Processes.user Processes.dest
Processes.process_name Processes.process | `drop_dm_object_name(Processes)` | search
user!=unknown | `security_content_ctime(start_time)`| `security_content_ctime(end_time)`|
eval processlen=len(process) | fit DensityFunction processlen by user into cmdline_pdfmodel'
references: []
tags:
analytics_story:
analytic_story:
- Possible Backdoor Activity Associated With MUDCARP Espionage Campaigns
- Ransomware
- Suspicious Command-Line Executions
@@ -33,3 +36,7 @@ tags:
detections:
- Detect Prohibited Applications Spawning cmd.exe
- Unusually Long Command Line - MLTK
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,11 +2,19 @@ name: Baseline of DNS Query Length - MLTK
id: c914844c-0ff5-4efc-8d44-c063443129ba
version: 1
date: '2019-05-08'
author: Rico Valdez, Splunk
type: batch
datamodel:
- Network_Resolution
description: This search is used to build a Machine Learning Toolkit (MLTK) model
to characterize the length of the DNS queries for each DNS record type observed
in the environment. By default, the search uses the last 30 days of data to build
the model. The model created by this search is then used in the corresponding detection
search, which uses it to identify outliers in the length of the DNS query.
search: '| tstats `security_content_summariesonly` count from datamodel=Network_Resolution
by DNS.query DNS.record_type | search DNS.record_type=* | `drop_dm_object_name("DNS")`
| eval query_length = len(query) | fit DensityFunction query_length by record_type
into dns_query_pdfmodel'
how_to_implement: To successfully implement this search, you will need to ensure that
DNS data is populating the Network_Resolution data model. In addition, you must
have the Machine Learning Toolkit (MLTK) version >= 4.2 installed, along with any
@@ -15,15 +23,15 @@ how_to_implement: To successfully implement this search, you will need to ensure
period of time, which may give you better results. You may also want to periodically
re-run this search to rebuild the model with the latest data. More information on
the algorithm used in the search can be found at `https://docs.splunk.com/Documentation/MLApp/4.2.0/User/Algorithms#DensityFunction`.
author: Rico Valdez, Splunk
search: '| tstats `security_content_summariesonly` count from datamodel=Network_Resolution
by DNS.query DNS.record_type | search DNS.record_type=* | `drop_dm_object_name("DNS")`
| eval query_length = len(query) | fit DensityFunction query_length by record_type
into dns_query_pdfmodel'
references: []
tags:
analytics_story:
analytic_story:
- Command and Control
- Hidden Cobra Malware
- Suspicious DNS Traffic
detections:
- DNS Query Length Outliers - MLTK
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,11 +2,17 @@ name: Baseline of Excessive AWS Instances Launched by User - MLTK
id: fa5634df-fb05-4b4b-aba0-6115138bb1ba
version: 1
date: '2019-11-14'
author: Jason Brewer, Splunk
type: batch
datamodel: []
description: This search is used to build a Machine Learning Toolkit (MLTK) model
for how many RunInstances users do in the environment. By default, the search uses
the last 90 days of data to build the model. The model created by this search is
then used in the corresponding detection search, which identifies subsequent outliers
in the number of RunInstances performed by a user in a small time window.
search: '`cloudtrail` eventName=RunInstances errorCode=success `ec2_excessive_runinstances_mltk_input_filter`
| bucket span=10m _time | stats count as instances_launched by _time src_user |
fit DensityFunction instances_launched threshold=0.0005 into ec2_excessive_runinstances_v1'
how_to_implement: 'You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS (version 4.4.0 or later), then configure your CloudTrail
inputs.\
@@ -21,13 +27,14 @@ how_to_implement: 'You must install the AWS App for Splunk (version 5.1.0 or lat
search to rebuild the model with the latest data.\
More information on the algorithm used in the search can be found at `https://docs.splunk.com/Documentation/MLApp/4.2.0/User/Algorithms#DensityFunction`.'
author: Jason Brewer, Splunk
search: '`cloudtrail` eventName=RunInstances errorCode=success `ec2_excessive_runinstances_mltk_input_filter`
| bucket span=10m _time | stats count as instances_launched by _time src_user |
fit DensityFunction instances_launched threshold=0.0005 into ec2_excessive_runinstances_v1'
references: []
tags:
analytics_story:
analytic_story:
- AWS Cryptomining
- Suspicious AWS EC2 Activities
detections:
- Abnormally High AWS Instances Launched by User - MLTK
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,12 +2,18 @@ name: Baseline of Excessive AWS Instances Terminated by User - MLTK
id: b28ed6de-e4ba-40f7-ae0a-93a088c774ab
version: 1
date: '2019-11-14'
author: Jason Brewer, Splunk
type: batch
datamodel: []
description: This search is used to build a Machine Learning Toolkit (MLTK) model
for how many TerminateInstances users do in the environment. By default, the search
uses the last 90 days of data to build the model. The model created by this search
is then used in the corresponding detection search, which identifies subsequent
outliers in the number of TerminateInstances performed by a user in a small time
window.
search: '`cloudtrail` eventName=TerminateInstances errorCode=success `ec2_excessive_terminateinstances_mltk_input_filter`
| bucket span=10m _time | stats count as instances_terminated by _time src_user
| fit DensityFunction instances_terminated threshold=0.0005 into ec2_excessive_terminateinstances_v1'
how_to_implement: 'You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS (version 4.4.0 or later), then configure your CloudTrail
inputs.\
@@ -22,12 +28,13 @@ how_to_implement: 'You must install the AWS App for Splunk (version 5.1.0 or lat
search to rebuild the model with the latest data.\
More information on the algorithm used in the search can be found at `https://docs.splunk.com/Documentation/MLApp/4.2.0/User/Algorithms#DensityFunction`.'
author: Jason Brewer, Splunk
search: '`cloudtrail` eventName=TerminateInstances errorCode=success `ec2_excessive_terminateinstances_mltk_input_filter`
| bucket span=10m _time | stats count as instances_terminated by _time src_user
| fit DensityFunction instances_terminated threshold=0.0005 into ec2_excessive_terminateinstances_v1'
references: []
tags:
analytics_story:
analytic_story:
- Suspicious AWS EC2 Activities
detections:
- Abnormally High AWS Instances Terminated by User - MLTK
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,22 +2,29 @@ name: Baseline of Network ACL Activity by ARN
id: fc0edd96-ff2b-4810-9f1f-63da3783fd63
version: 1
date: '2018-05-21'
author: Bhavin Patel, Splunk
type: batch
datamodel: []
description: This search establishes, on a per-hour basis, the average and the standard
deviation of the number of API calls that were related to network ACLs made by each
user. Also recorded is the number of data points for each user. This table is then
outputted to a lookup file to allow the detection search to operate quickly.
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS version (4.4.0 or later), then configure your CloudTrail
inputs. To add or remove API event names for network ACLs, edit the macro `network_acl_events`.
author: Bhavin Patel, Splunk
search: '`cloudtrail` `network_acl_events` | spath output=arn path=userIdentity.arn
| bucket _time span=1h | stats count as apiCalls by _time, arn | stats count(apiCalls)
as numDataPoints, latest(apiCalls) as latestCount, avg(apiCalls) as avgApiCalls,
stdev(apiCalls) as stdevApiCalls by arn | table arn, latestCount, numDataPoints,
avgApiCalls, stdevApiCalls | outputlookup network_acl_activity_baseline | stats
count'
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS version (4.4.0 or later), then configure your CloudTrail
inputs. To add or remove API event names for network ACLs, edit the macro `network_acl_events`.
references: []
tags:
analytics_story:
analytic_story:
- AWS Network ACL Activity
detections:
- Detect Spike in Network ACL Activity
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,21 +2,28 @@ name: Baseline of S3 Bucket deletion activity by ARN
id: fc0edd96-ff2b-48b0-9f1f-63eq3783fd63
version: 1
date: '2018-07-17'
author: Bhavin Patel, Splunk
type: batch
datamodel: []
description: This search establishes, on a per-hour basis, the average and standard
deviation for the number of API calls related to deleting an S3 bucket by each user.
Also recorded is the number of data points for each user. This table is then outputted
to a lookup file to allow the detection search to operate quickly.
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS version (4.4.0 or later), then configure your CloudTrail
inputs.
author: Bhavin Patel, Splunk
search: '`cloudtrail` eventName=DeleteBucket | spath output=arn path=userIdentity.arn
| bucket _time span=1h | stats count as apiCalls by _time, arn | stats count(apiCalls)
as numDataPoints, latest(apiCalls) as latestCount, avg(apiCalls) as avgApiCalls,
stdev(apiCalls) as stdevApiCalls by arn | table arn, latestCount, numDataPoints,
avgApiCalls, stdevApiCalls | outputlookup s3_deletion_baseline | stats count'
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS version (4.4.0 or later), then configure your CloudTrail
inputs.
references: []
tags:
analytics_story:
analytic_story:
- Suspicious AWS S3 Activities
detections:
- Detect Spike in S3 Bucket deletion
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,22 +2,29 @@ name: Baseline of Security Group Activity by ARN
id: fc0edd96-ff2b-48b0-9f1f-63da3783fd63
version: 1
date: '2018-04-17'
author: Bhavin Patel, Splunk
type: batch
datamodel: []
description: This search establishes, on a per-hour basis, the average and the standard
deviation for the number of API calls related to security groups made by each user.
Also recorded is the number of data points for each user. This table is then outputted
to a lookup file to allow the detection search to operate quickly.
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS version (4.4.0 or later), then configure your CloudTrail
inputs. To add or remove API event names for security groups, edit the macro `security_group_api_calls`.
author: Bhavin Patel, Splunk
search: '`cloudtrail` `security_group_api_calls` | spath output=arn path=userIdentity.arn
| bucket _time span=1h | stats count as apiCalls by _time, arn | stats count(apiCalls)
as numDataPoints, latest(apiCalls) as latestCount, avg(apiCalls) as avgApiCalls,
stdev(apiCalls) as stdevApiCalls by arn | table arn, latestCount, numDataPoints,
avgApiCalls, stdevApiCalls | outputlookup security_group_activity_baseline | stats
count'
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS version (4.4.0 or later), then configure your CloudTrail
inputs. To add or remove API event names for security groups, edit the macro `security_group_api_calls`.
references: []
tags:
analytics_story:
analytic_story:
- AWS User Monitoring
detections:
- Detect Spike in Security Group Activity
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
+15 -7
View File
@@ -2,12 +2,21 @@ name: Baseline of SMB Traffic - MLTK
id: df98763b-0b08-4281-8ef9-08db7ac572a9
version: 1
date: '2019-05-08'
author: Rico Valdez, Splunk
type: batch
datamodel:
- Network_Traffic
description: This search is used to build a Machine Learning Toolkit (MLTK) model
to characterize the number of SMB connections observed each hour for every day of
week. By default, the search uses the last 30 days of data to build the model. The
model created by this search is then used in the corresponding detection search
to identify outliers in the number of SMB connections for that hour and day of the
week.
search: '| tstats `security_content_summariesonly` count from datamodel=Network_Traffic
where All_Traffic.dest_port=139 OR All_Traffic.dest_port=445 OR All_Traffic.app=smb
by _time span=10m, All_Traffic.src | eval HourOfDay=strftime(_time, "%H") | eval
DayOfWeek=strftime(_time, "%A") | `drop_dm_object_name("All_Traffic")` | fit DensityFunction
count by "HourOfDay,DayOfWeek" into smb_pdfmodel'
how_to_implement: You must be ingesting network traffic and populating the Network_Traffic
data model. In addition, you must have the Machine Learning Toolkit (MLTK) version
>= 4.2 installed, along with any required dependencies. To improve your results,
@@ -21,14 +30,9 @@ how_to_implement: You must be ingesting network traffic and populating the Netwo
which may give you better results. You may also want to periodically re-run this
search to rebuild the model with the latest data. More information on the algorithm
used in the search can be found at `https://docs.splunk.com/Documentation/MLApp/4.2.0/User/Algorithms#DensityFunction`.
author: Rico Valdez, Splunk
search: '| tstats `security_content_summariesonly` count from datamodel=Network_Traffic
where All_Traffic.dest_port=139 OR All_Traffic.dest_port=445 OR All_Traffic.app=smb
by _time span=10m, All_Traffic.src | eval HourOfDay=strftime(_time, "%H") | eval
DayOfWeek=strftime(_time, "%A") | `drop_dm_object_name("All_Traffic")` | fit DensityFunction
count by "HourOfDay,DayOfWeek" into smb_pdfmodel'
references: []
tags:
analytics_story:
analytic_story:
- DHS Report TA18-074A
- Disabling Security Tools
- 'Emotet Malware DHS Report TA18-201A '
@@ -38,3 +42,7 @@ tags:
detections:
- Processes launching netsh
- SMB Traffic Spike - MLTK
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
+11 -4
View File
@@ -2,18 +2,25 @@ name: Count of assets by category
id: dcfd6b40-42f9-469d-a433-2e53f7489ff9
version: 1
date: '2017-09-13'
author: Bhavin Patel, Splunk
type: batch
datamodel: []
description: This search shows you every asset category you have and the assets that
belong to those categories.
search: '| from datamodel Identity_Management.All_Assets | stats count values(nt_host)
by category | sort -count'
how_to_implement: To successfully implement this search you must first leverage the
Assets and Identity framework in Enterprise Security to populate your assets_by_str.csv
file which should then be mapped to the Identity_Management data model. The Identity_Management
data model will contain a list of known authorized company assets. Ensure that all
inventoried systems are constantly vetted and updated.
author: Bhavin Patel, Splunk
search: '| from datamodel Identity_Management.All_Assets | stats count values(nt_host)
by category | sort -count'
references: []
tags:
analytics_story:
analytic_story:
- Asset Tracking
detections:
- Detect Unauthorized Assets by MAC address
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,12 +2,20 @@ name: Count of Unique IPs Connecting to Ports
id: 9f3bae5a-9fe3-49df-8c84-5edc51d84b7f
version: 1
date: '2017-09-13'
author: David Dorsey, Splunk
type: batch
datamodel:
- Network_Traffic
description: The search counts the number of times a connection was observed to each
destination port, and the number of unique source IPs connecting to them.
how_to_implement: To successfully implement this search, you must be ingesting network
traffic, and populating the Network_Traffic data model.
author: David Dorsey, Splunk
search: '| tstats `security_content_summariesonly` count dc(All_Traffic.src) as numberOfUniqueHosts
from datamodel=Network_Traffic by All_Traffic.dest_port | `drop_dm_object_name("All_Traffic")`
| sort - count'
tags: {}
how_to_implement: To successfully implement this search, you must be ingesting network
traffic, and populating the Network_Traffic data model.
references: []
tags:
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,20 +2,27 @@ name: Create a list of approved AWS service accounts
id: fc0edc95-ff2b-48b1-5f6f-63ga3789fd43
version: 2
date: '2018-12-03'
author: Bhavin Patel, Splunk
type: batch
datamodel: []
description: This search looks for successful API activity in CloudTrail within the
last 30 days, filters out known users from the identity table, and outputs values
of users into `aws_service_accounts.csv` lookup file.
search: '`cloudtrail` errorCode=success | rename userName as identity | search NOT
[inputlookup identity_lookup_expanded | fields identity] | stats count by identity
| table identity | outputlookup aws_service_accounts | stats count'
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS (version 4.4.0 or later), then configure your CloudTrail
inputs. Please validate the service account entires in `aws_service_accounts.csv`,
which is a lookup file created as a result of running this support search. Please
remove the entries of service accounts that are not legitimate.
author: Bhavin Patel, Splunk
search: '`cloudtrail` errorCode=success | rename userName as identity | search NOT
[inputlookup identity_lookup_expanded | fields identity] | stats count by identity
| table identity | outputlookup aws_service_accounts | stats count'
references: []
tags:
analytics_story:
analytic_story:
- AWS User Monitoring
detections:
- Detect AWS API Activities From Unapproved Accounts
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,19 +2,26 @@ name: Add Prohibited Processes to Enterprise Security
id: 251930a5-1451-4428-bb13-eed5775be0ce
version: 1
date: '2017-09-15'
author: David Dorsey, Splunk
type: batch
datamodel: []
description: This search takes the existing interesting process table from ES, filters
out any existing additions added by ESCU and then updates the table with processes
identified by ESCU that should be prohibited on your endpoints.
search: '| inputlookup prohibited_processes | search note!=ESCU* | inputlookup append=T
prohibited_processes | fillnull value=* dest dest_pci_domain | fillnull value=false
is_required is_secure | fillnull value=true is_prohibited | outputlookup prohibited_processes
| stats count'
how_to_implement: This search should be run on each new install of ESCU.
author: David Dorsey, Splunk
search: '| inputlookup prohibited_processes | search note!=ESCU* | inputlookup
append=T prohibited_processes | fillnull value=* dest dest_pci_domain | fillnull
value=false is_required is_secure | fillnull value=true is_prohibited | outputlookup
prohibited_processes | stats count'
references: []
tags:
analytics_story:
analytic_story:
- 'Emotet Malware DHS Report TA18-201A '
- Monitor for Unauthorized Software
- SamSam Ransomware
detections:
- Prohibited Software On Endpoint
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
+14 -6
View File
@@ -2,15 +2,14 @@ name: Discover DNS records
id: c096f721-8842-42ce-bfc7-74bd8c72b7c3
version: 1
date: '2019-02-14'
author: Jose Hernandez, Splunk
type: batch
datamodel:
- Network_Resolution
description: The search takes corporate and common cloud provider domains configured
under `cim_corporate_email_domains.csv`, `cim_corporate_web_domains.csv`, and `cloud_domains.csv`
finds their responses across the last 30 days from data in the `Network_Resolution
` datamodel, then stores the output under the `discovered_dns_records.csv` lookup
how_to_implement: To successfully implement this search, you must be ingesting DNS
logs, and populating the Network_Resolution data model. Also make sure that the
cim_corporate_web_domains and cim_corporate_email_domains lookups are populated
with the domains owned by your corporation
author: Jose Hernandez, Splunk
search: '| inputlookup cim_corporate_email_domains.csv | inputlookup append=T cim_corporate_web_domains.csv
| inputlookup append=T cim_cloud_domains.csv | eval domain = trim(replace(domain,
"\*", "")) | join domain [|tstats `security_content_summariesonly` count values(DNS.record_type)
@@ -19,8 +18,17 @@ search: '| inputlookup cim_corporate_email_domains.csv | inputlookup append=T ci
where query!="unknown" | rex field=query "(?<domain>\w+\.\w+?)(?:$|/)"] | makemv
delim=" " answer | makemv delim=" " type | sort -count | table count,domain,type,query,answer
| outputlookup createinapp=true discovered_dns_records'
how_to_implement: To successfully implement this search, you must be ingesting DNS
logs, and populating the Network_Resolution data model. Also make sure that the
cim_corporate_web_domains and cim_corporate_email_domains lookups are populated
with the domains owned by your corporation
references: []
tags:
analytics_story:
analytic_story:
- DNS Hijacking
detections:
- DNS record changed
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
+11 -4
View File
@@ -2,20 +2,27 @@ name: DNSTwist Domain Names
id: 19f7d2ec-6028-4d01-bcdb-bda9a034c17f
version: 2
date: '2018-10-08'
author: David Dorsey, Splunk
type: batch
datamodel: []
description: This search creates permutations of your existing domains, removes the
valid domain names and stores them in a specified lookup file so they can be checked
for in the associated detection searches.
search: '| dnstwist domainlist=domains.csv | `remove_valid_domains` | eval domain_abuse="true"
| table domain, domain_abuse | outputlookup brandMonitoring_lookup | stats count'
how_to_implement: To successfully implement this search you need to update the file
called domains.csv in the DA-ESS-SOC/lookup directory. Or `cim_corporate_email_domains.csv`
and `cim_corporate_web_domains.csv` from **Splunk\_SA\_CIM**.
author: David Dorsey, Splunk
search: '| dnstwist domainlist=domains.csv | `remove_valid_domains` | eval domain_abuse="true"
| table domain, domain_abuse | outputlookup brandMonitoring_lookup | stats count'
references: []
tags:
analytics_story:
analytic_story:
- Brand Monitoring
- Suspicious Emails
detections:
- Monitor Email For Brand Abuse
- Monitor DNS For Brand Abuse
- Monitor Web Traffic For Brand Abuse
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,12 +2,20 @@ name: Identify Systems Creating Remote Desktop Traffic
id: 5cdda34f-4caf-4128-a713-0837fc48b67a
version: 1
date: '2017-09-15'
author: David Dorsey, Splunk
type: batch
datamodel:
- Network_Traffic
description: This search counts the numbers of times the system has generated remote
desktop traffic.
how_to_implement: To successfully implement this search, you must ingest network traffic
and populate the Network_Traffic data model.
author: David Dorsey, Splunk
search: '| tstats `security_content_summariesonly` count from datamodel=Network_Traffic
where All_Traffic.dest_port=3389 by All_Traffic.src | `drop_dm_object_name("All_Traffic")`
| sort - count'
tags: {}
how_to_implement: To successfully implement this search, you must ingest network traffic
and populate the Network_Traffic data model.
references: []
tags:
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,13 +2,21 @@ name: Identify Systems Receiving Remote Desktop Traffic
id: baaeea15-fe8a-4090-92c2-5b60943bb608
version: 1
date: '2017-09-15'
author: David Dorsey, Splunk
type: batch
datamodel:
- Network_Traffic
description: This search counts the numbers of times the system has created remote
desktop traffic
how_to_implement: To successfully implement this search you must ingest network traffic
and populate the Network_Traffic data model. If a system receives a lot of remote
desktop traffic, you can apply the category common_rdp_destination to it.
author: David Dorsey, Splunk
search: '| tstats `security_content_summariesonly` count from datamodel=Network_Traffic
where All_Traffic.dest_port=3389 by All_Traffic.dest | `drop_dm_object_name("All_Traffic")`
| sort - count'
tags: {}
how_to_implement: To successfully implement this search you must ingest network traffic
and populate the Network_Traffic data model. If a system receives a lot of remote
desktop traffic, you can apply the category common_rdp_destination to it.
references: []
tags:
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,12 +2,20 @@ name: Identify Systems Using Remote Desktop
id: 063dfe9f-b1d7-4254-a16d-1e2e7eadd6a8
version: 1
date: '2019-04-01'
author: David Dorsey, Splunk
type: batch
datamodel:
- Endpoint
description: This search counts the numbers of times the remote desktop process, mstsc.exe,
has run on each system.
how_to_implement: To successfully implement this search you must be ingesting endpoint
data that records process activity.
author: David Dorsey, Splunk
search: '| tstats `security_content_summariesonly` count from datamodel=Endpoint.Processes
where Processes.process_name="*mstsc.exe*" by Processes.dest Processes.process_name
| `drop_dm_object_name(Processes)` | sort - count'
tags: {}
how_to_implement: To successfully implement this search you must be ingesting endpoint
data that records process activity.
references: []
tags:
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
+11 -4
View File
@@ -2,17 +2,24 @@ name: Monitor Successful Backups
id: b4d0dfb2-2195-4f6e-93a3-48468ed9734e
version: 1
date: '2017-09-12'
author: David Dorsey, Splunk
type: batch
datamodel: []
description: This search is intended to give you a feel for how often successful backups
are conducted in your environment. Fluctuations in these numbers will allow you
to determine when you should investigate.
how_to_implement: To successfully implement this search you must be ingesting your
backup logs.
author: David Dorsey, Splunk
search: '`netbackup` "Disk/Partition backup completed successfully." | bucket _time
span=1d | stats dc(COMPUTERNAME) as count values(COMPUTERNAME) as dest by _time,
MESSAGE'
how_to_implement: To successfully implement this search you must be ingesting your
backup logs.
references: []
tags:
analytics_story:
analytic_story:
- Monitor Backup Solution
detections:
- Unsuccessful Netbackup backups
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
+11 -4
View File
@@ -2,16 +2,23 @@ name: Monitor Unsuccessful Backups
id: b2178fed-592f-492b-b851-74161678aa56
version: 1
date: '2017-09-12'
author: David Dorsey, Splunk
type: batch
datamodel: []
description: This search is intended to give you a feel for how often backup failures
happen in your environments. Fluctuations in these numbers will allow you to determine
when you should investigate.
how_to_implement: To successfully implement this search you must be ingesting your
backup logs.
author: David Dorsey, Splunk
search: '`netbackup` "An error occurred, failed to backup." | bucket _time span=1d
| stats dc(COMPUTERNAME) as count values(COMPUTERNAME) as dest by _time, MESSAGE'
how_to_implement: To successfully implement this search you must be ingesting your
backup logs.
references: []
tags:
analytics_story:
analytic_story:
- Monitor Backup Solution
detections:
- Unsuccessful Netbackup backups
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,21 +2,28 @@ name: Previously seen API call per user roles in CloudTrail
id: fc0edc95-fq2c-48b0-9f6f-63da3289fd03
version: 1
date: '2018-04-16'
author: Bhavin Patel, Splunk
type: batch
datamodel: []
description: This search looks for successful API calls made by different user roles,
then creates a baseline of the earliest and latest times we have encountered this
user role. It also returns the name of the API call in our dataset--grouped by user
role and name of the API call--that occurred within the last 30 days. In this support
search, we are only looking for events where the user identity is Assumed Role.
search: '`cloudtrail` eventType=AwsApiCall errorCode=success userIdentity.type=AssumedRole
| stats earliest(_time) as earliest latest(_time) as latest by userName eventName
| outputlookup previously_seen_api_calls_from_user_roles | stats count'
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS (version 4.4.0 or later), then configure your CloudTrail
inputs. Please validate the user role entries in `previously_seen_api_calls_from_user_roles.csv`,
which is a lookup file created as a result of running this support search.
author: Bhavin Patel, Splunk
search: '`cloudtrail` eventType=AwsApiCall errorCode=success userIdentity.type=AssumedRole
| stats earliest(_time) as earliest latest(_time) as latest by userName eventName
| outputlookup previously_seen_api_calls_from_user_roles | stats count'
references: []
tags:
analytics_story:
analytic_story:
- AWS User Monitoring
detections:
- Detect new API calls from user roles
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,21 +2,28 @@ name: Previously Seen AWS Cross Account Activity
id: 1cc22b09-c867-416e-a511-cb36ac44aee2
version: 1
date: '2018-06-04'
author: David Dorsey, Splunk
type: batch
datamodel: []
description: This search looks for **AssumeRole** events where the requesting account
differs from the requested account, then writes these relationships to a lookup
file.
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS (version 4.4.0 or later), then configure your CloudTrail
inputs. Validate the user name entries in `previously_seen_aws_cross_account_activity.csv`,
a lookup file created by this support search.
author: David Dorsey, Splunk
search: '`cloudtrail` eventName=AssumeRole | spath output=requestingAccountId path=userIdentity.accountId
| spath output=requestedAccountId path=resources{}.accountId | search requestingAccountId=*
| where requestingAccountId!=requestedAccountId | stats earliest(_time) as firstTime
latest(_time) as lastTime by requestingAccountId, requestedAccountId | outputlookup
previously_seen_aws_cross_account_activity | stats count'
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS (version 4.4.0 or later), then configure your CloudTrail
inputs. Validate the user name entries in `previously_seen_aws_cross_account_activity.csv`,
a lookup file created by this support search.
references: []
tags:
analytics_story:
analytic_story:
- AWS Cross Account Activity
detections:
- AWS Cross Account Activity From Previously Unseen Account
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,18 +2,34 @@ name: Previously Seen AWS Cross Account Activity - Initial
id: 82af2ed9-8f4b-4785-a152-ba61e6a23bbf
version: 1
date: '2020-08-15'
description: This search looks for **AssumeRole** events where the requesting account differs from the requested account, then writes these relationships to a lookup file.
how_to_implement: You must install and configure the Splunk Add-on for AWS (version 5.1.0 or later)and Enterprise Security 6.2, which contains the required updates to the Authentication data model for cloud use cases. Validate the user name entries in `previously_seen_aws_cross_account_activity.csv`, a lookup file created by this support search.
author: Rico Valdez, Splunk
search: '| tstats earliest(_time) as firstTime latest(_time) as lastTime from datamodel=Authentication where Authentication.signature=AssumeRole by Authentication.vendor_account Authentication.user Authentication.src Authentication.user_role
| `drop_dm_object_name(Authentication)`
| rex field=user_role "arn:aws:sts:*:(?<dest_account>.*):"
| where vendor_account != dest_account
| rename vendor_account as requestingAccountId dest_account as requestedAccountId | table requestingAccountId requestedAccountId firstTime lastTime | outputlookup previously_seen_aws_cross_account_activity'
type: batch
datamodel:
- Authentication
description: This search looks for **AssumeRole** events where the requesting account
differs from the requested account, then writes these relationships to a lookup
file.
search: '| tstats earliest(_time) as firstTime latest(_time) as lastTime from datamodel=Authentication
where Authentication.signature=AssumeRole by Authentication.vendor_account Authentication.user
Authentication.src Authentication.user_role | `drop_dm_object_name(Authentication)`
| rex field=user_role "arn:aws:sts:*:(?<dest_account>.*):" | where vendor_account
!= dest_account | rename vendor_account as requestingAccountId dest_account as requestedAccountId
| table requestingAccountId requestedAccountId firstTime lastTime | outputlookup
previously_seen_aws_cross_account_activity'
how_to_implement: You must install and configure the Splunk Add-on for AWS (version
5.1.0 or later)and Enterprise Security 6.2, which contains the required updates
to the Authentication data model for cloud use cases. Validate the user name entries
in `previously_seen_aws_cross_account_activity.csv`, a lookup file created by this
support search.
references: []
tags:
analytics_story:
- Suspicious Cloud Authentication Activities
detections:
- AWS Cross Account Activity From Previously Unseen Account
analytic_story:
- Suspicious Cloud Authentication Activities
deployments:
- 90 Day Baseline
detections:
- AWS Cross Account Activity From Previously Unseen Account
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,26 +2,35 @@ name: Previously Seen AWS Cross Account Activity - Update
id: dd6fb3a9-4906-48cb-8626-c88a25a056c3
version: 1
date: '2020-08-15'
author: Rico Valdez, Splunk
type: batch
datamodel:
- Authentication
description: This search looks for **AssumeRole** events where the requesting account
differs from the requested account, then writes these relationships to a lookup
file.
how_to_implement: You must install and configure the Splunk Add-on for AWS (version 5.1.0 or later)
and Enterprise Security 6.2, which contains the required updates to the Authentication data model for cloud use cases. Validate the user name entries in `previously_seen_aws_cross_account_activity.csv`,
a lookup file created by this support search.
author: Rico Valdez, Splunk
search: '| tstats earliest(_time) as firstTime latest(_time) as lastTime from datamodel=Authentication where Authentication.signature=AssumeRole by Authentication.vendor_account Authentication.user Authentication.src Authentication.user_role
| `drop_dm_object_name(Authentication)`
| rex field=user_role "arn:aws:sts:*:(?<dest_account>.*):"
| where vendor_account != dest_account
| rename vendor_account as requestingAccountId dest_account as requestedAccountId
| inputlookup append=t previously_seen_aws_cross_account_activity
| stats min(firstTime) as firstTime max(lastTime) as lastTime by requestingAccountId requestedAccountId
| outputlookup previously_seen_aws_cross_account_activity'
search: '| tstats earliest(_time) as firstTime latest(_time) as lastTime from datamodel=Authentication
where Authentication.signature=AssumeRole by Authentication.vendor_account Authentication.user
Authentication.src Authentication.user_role | `drop_dm_object_name(Authentication)`
| rex field=user_role "arn:aws:sts:*:(?<dest_account>.*):" | where vendor_account
!= dest_account | rename vendor_account as requestingAccountId dest_account as requestedAccountId
| inputlookup append=t previously_seen_aws_cross_account_activity | stats min(firstTime)
as firstTime max(lastTime) as lastTime by requestingAccountId requestedAccountId
| outputlookup previously_seen_aws_cross_account_activity'
how_to_implement: You must install and configure the Splunk Add-on for AWS (version
5.1.0 or later) and Enterprise Security 6.2, which contains the required updates
to the Authentication data model for cloud use cases. Validate the user name entries
in `previously_seen_aws_cross_account_activity.csv`, a lookup file created by this
support search.
references: []
tags:
analytics_story:
- Suspicious Cloud Authentication Activities
detections:
- AWS Cross Account Activity From Previously Unseen Account
analytic_story:
- Suspicious Cloud Authentication Activities
deployments:
- Daily Cache Updates
detections:
- AWS Cross Account Activity From Previously Unseen Account
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,22 +2,29 @@ name: Previously Seen AWS Provisioning Activity Sources
id: ac88e6a0-4fba-4dfd-b7b9-8964df7d1aee
version: 1
date: '2018-03-16'
author: David Dorsey, Splunk
type: batch
datamodel: []
description: This search builds a table of the first and last times seen for every
IP address (along with its physical location) previously associated with cloud-provisioning
activity. This is broadly defined as any event that runs or creates something.
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS (version 4.4.0 or later), then configure your CloudTrail
inputs.
author: David Dorsey, Splunk
search: '`cloudtrail` (eventName=Run* OR eventName=Create*) | iplocation sourceIPAddress
| stats earliest(_time) as firstTime, latest(_time) as lastTime by sourceIPAddress,
City, Region, Country | outputlookup previously_seen_provisioning_activity_src.csv
| stats count'
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS (version 4.4.0 or later), then configure your CloudTrail
inputs.
references: []
tags:
analytics_story:
analytic_story:
- AWS Suspicious Provisioning Activities
detections:
- AWS Cloud Provisioning From Previously Unseen IP Address
- AWS Cloud Provisioning From Previously Unseen City
- AWS Cloud Provisioning From Previously Unseen Country
- AWS Cloud Provisioning From Previously Unseen Region
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
+11 -4
View File
@@ -2,19 +2,26 @@ name: Previously Seen AWS Regions
id: fc0edc95-ff2b-48b0-9f6f-63da3789fd63
version: 1
date: '2018-01-08'
author: Bhavin Patel, Splunk
type: batch
datamodel: []
description: This search looks for CloudTrail events where an AWS instance is started
and creates a baseline of most recent time (latest) and the first time (earliest)
we've seen this region in our dataset grouped by the value awsRegion for the last
30 days
search: '`cloudtrail` StartInstances | stats earliest(_time) as earliest latest(_time)
as latest by awsRegion | outputlookup previously_seen_aws_regions.csv | stats count'
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS version (4.4.0 or later), then configure your CloudTrail
inputs.
author: Bhavin Patel, Splunk
search: '`cloudtrail` StartInstances | stats earliest(_time) as earliest latest(_time)
as latest by awsRegion | outputlookup previously_seen_aws_regions.csv | stats count'
references: []
tags:
analytics_story:
analytic_story:
- AWS Cryptomining
- Suspicious AWS EC2 Activities
detections:
- EC2 Instance Started In Previously Unseen Region
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,22 +2,30 @@ name: Previously Seen Cloud API Calls Per User Role - Initial
id: 69d75f4b-b794-4a66-a777-730357b886b4
version: 1
date: '2020-09-03'
author: David Dorsey, Splunk
type: batch
datamodel:
- Change
description: This search builds a table of the first and last times seen for every
user role and command combination. This is broadly defined as any event that runs
or creates something. This table is then cached.
how_to_implement: You must be ingesting Cloud infrastructure logs from your cloud provider.
author: David Dorsey, Splunk
search: '| tstats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen from datamodel=Change
where All_Changes.user_type=AssumedRole AND All_Changes.status=success
search: '| tstats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen
from datamodel=Change where All_Changes.user_type=AssumedRole AND All_Changes.status=success
by All_Changes.user, All_Changes.command | `drop_dm_object_name("All_Changes")`
| eventstats min(firstTimeSeen) as globalFirstTime
| eval enough_data = if(globalFirstTime <= relative_time(now(), "-7d@d"), 1, 0)
| table user, command, firstTimeSeen, lastTimeSeen, enough_data
| outputlookup previously_seen_cloud_api_calls_per_user_role'
| eventstats min(firstTimeSeen) as globalFirstTime | eval enough_data = if(globalFirstTime
<= relative_time(now(), "-7d@d"), 1, 0) | table user, command, firstTimeSeen, lastTimeSeen,
enough_data | outputlookup previously_seen_cloud_api_calls_per_user_role'
how_to_implement: You must be ingesting Cloud infrastructure logs from your cloud
provider.
references: []
tags:
analytics_story:
analytic_story:
- Suspicious Cloud User Activities
detections:
- Cloud API Calls From Previously Unseen User Roles
deployments:
- 90 Day Baseline
detections:
- Cloud API Calls From Previously Unseen User Roles
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,25 +2,32 @@ name: Previously Seen Cloud API Calls Per User Role - Update
id: c4b760a0-6a97-47e9-b089-8ae9e57f210e
version: 1
date: '2020-09-03'
author: David Dorsey, Splunk
type: batch
datamodel:
- Change
description: This search updates the table of the first and last times seen for every
user role and command combination.
how_to_implement: You must be ingesting Cloud infrastructure logs from your cloud provider.
author: David Dorsey, Splunk
search: '| tstats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen from datamodel=Change
where All_Changes.user_type=AssumedRole AND All_Changes.status=success
search: '| tstats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen
from datamodel=Change where All_Changes.user_type=AssumedRole AND All_Changes.status=success
by All_Changes.user, All_Changes.command | `drop_dm_object_name("All_Changes")`
| table user, command, firstTimeSeen, lastTimeSeen
| inputlookup previously_seen_cloud_api_calls_per_user_role append=t
| stats min(firstTimeSeen) as firstTimeSeen, max(lastTimeSeen) as lastTimeSeen by user, command
| where lastTimeSeen > relative_time(now(), `previously_seen_cloud_api_calls_per_user_role_forget_window`)
| eventstats min(firstTimeSeen) as globalFirstTime
| eval enough_data = if(globalFirstTime <= relative_time(now(), "-7d@d"), 1, 0)
| table user, command, firstTimeSeen, lastTimeSeen, enough_data
| outputlookup previously_seen_cloud_api_calls_per_user_role'
| table user, command, firstTimeSeen, lastTimeSeen | inputlookup previously_seen_cloud_api_calls_per_user_role
append=t | stats min(firstTimeSeen) as firstTimeSeen, max(lastTimeSeen) as lastTimeSeen
by user, command | where lastTimeSeen > relative_time(now(), `previously_seen_cloud_api_calls_per_user_role_forget_window`)
| eventstats min(firstTimeSeen) as globalFirstTime | eval enough_data = if(globalFirstTime
<= relative_time(now(), "-7d@d"), 1, 0) | table user, command, firstTimeSeen, lastTimeSeen,
enough_data | outputlookup previously_seen_cloud_api_calls_per_user_role'
how_to_implement: You must be ingesting Cloud infrastructure logs from your cloud
provider.
references: []
tags:
analytics_story:
analytic_story:
- Suspicious Cloud User Activities
detections:
- Cloud API Calls From Previously Unseen User Roles
deployments:
- Daily Cache Updates
detections:
- Cloud API Calls From Previously Unseen User Roles
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,21 +2,27 @@ name: Previously Seen Cloud Compute Creations By User - Initial
id: dd4ced8a-15a9-4285-94ac-7e4134673bf8
version: 1
date: '2020-08-15'
author: Rico Valdez, Splunk
type: batch
datamodel:
- Change
description: This search builds a table of previously seen users that have launched
a cloud compute instance.
search: '| tstats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen
from datamodel=Change where All_Changes.action=created AND All_Changes.object_category=instance
by All_Changes.user | `drop_dm_object_name("All_Changes")` | outputlookup previously_seen_cloud_compute_creations_by_user
| stats count'
how_to_implement: You must be ingesting the approrpiate cloud infrastructure logs
and have the proper TAs installed.
author: Rico Valdez, Splunk
search: '| tstats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen from datamodel=Change
where All_Changes.action=created AND All_Changes.object_category=instance
by All_Changes.user
| `drop_dm_object_name("All_Changes")`
| outputlookup previously_seen_cloud_compute_creations_by_user
| stats count'
references: []
tags:
analytics_story:
analytic_story:
- Cloud Cryptomining
detections:
- Cloud Compute Instance Created By Previously Unseen User
deployments:
- Hourly Cache Updates
detections:
- Cloud Compute Instance Created By Previously Unseen User
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,24 +2,30 @@ name: Previously Seen Cloud Compute Creations By User - Update
id: 6bf75d69-7766-47bc-8097-e41696807a6f
version: 1
date: '2020-08-15'
author: Rico Valdez, Splunk
type: batch
datamodel:
- Change
description: This search builds a table of previously seen users that have launched
a cloud compute instance.
search: '| tstats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen
from datamodel=Change where All_Changes.action=created AND All_Changes.object_category=instance
by All_Changes.user| `drop_dm_object_name("All_Changes")` | inputlookup append=t
previously_seen_cloud_compute_creations_by_user | stats min(firstTimeSeen) as firstTimeSeen
max(lastTimeSeen) as lastTimeSeen by user | where lastTimeSeen > relative_time(now(),
"-90d@d") | eventstats min(firstTimeSeen) as globalFirstTime | eval enough_data
= if(globalFirstTime <= relative_time(now(), "-7d@d"), 1, 0) | outputlookup previously_seen_cloud_compute_creations_by_user'
how_to_implement: You must be ingesting the approrpiate cloud infrastructure logs
and have the proper TAs installed.
author: Rico Valdez, Splunk
search: '| tstats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen from datamodel=Change
where All_Changes.action=created AND All_Changes.object_category=instance
by All_Changes.user| `drop_dm_object_name("All_Changes")`
| inputlookup append=t previously_seen_cloud_compute_creations_by_user
| stats min(firstTimeSeen) as firstTimeSeen max(lastTimeSeen) as lastTimeSeen by user
| where lastTimeSeen > relative_time(now(), "-90d@d")
| eventstats min(firstTimeSeen) as globalFirstTime
| eval enough_data = if(globalFirstTime <= relative_time(now(), "-7d@d"), 1, 0)
| outputlookup previously_seen_cloud_compute_creations_by_user'
references: []
tags:
analytics_story:
analytic_story:
- Cloud Cryptomining
deployments:
- Daily Cache Updates
detections:
- Cloud Compute Instance Created By Previously Unseen User
deployments:
- Daily Cache Updates
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,22 +2,29 @@ name: Previously Seen Cloud Compute Images - Initial
id: 7744597f-d07a-4cea-94a7-e0f8aaebc410
version: 1
date: '2020-10-08'
author: David Dorsey, Splunk
type: batch
datamodel:
- Change
description: This search builds a table of previously seen images used to launch cloud
compute instances
search: '| tstats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen
from datamodel=Change where All_Changes.action=created by All_Changes.Instance_Changes.image_id
| `drop_dm_object_name("All_Changes")` | `drop_dm_object_name("Instance_Changes")`
| where image_id != "unknown" | eventstats min(firstTimeSeen) as globalFirstTime
| eval enough_data = if(globalFirstTime <= relative_time(now(), "-7d@d"), 1, 0)
| outputlookup previously_seen_cloud_compute_images'
how_to_implement: You must be ingesting the approrpiate cloud infrastructure logs
and have the latest Change Datamodel accelerated
author: David Dorsey, Splunk
search: '| tstats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen from datamodel=Change where All_Changes.action=created by All_Changes.Instance_Changes.image_id
| `drop_dm_object_name("All_Changes")`
| `drop_dm_object_name("Instance_Changes")`
| where image_id != "unknown"
| eventstats min(firstTimeSeen) as globalFirstTime
| eval enough_data = if(globalFirstTime <= relative_time(now(), "-7d@d"), 1, 0)
| outputlookup previously_seen_cloud_compute_images'
references: []
tags:
analytics_story:
analytic_story:
- Cloud Cryptomining
detections:
- Cloud Compute Instance Created With Previously Unseen Image
deployments:
- 90 Day Baseline
detections:
- Cloud Compute Instance Created With Previously Unseen Image
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,25 +2,30 @@ name: Previously Seen Cloud Compute Images - Update
id: 6f1ca5dc-e445-401c-9845-a96d2b6ba184
version: 1
date: '2020-08-12'
author: David Dorsey, Splunk
type: batch
datamodel:
- Change
description: This search builds a table of previously seen images used to launch cloud
compute instances
search: '| tstats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen
from datamodel=Change where All_Changes.action=created by All_Changes.Instance_Changes.image_id
| `drop_dm_object_name("All_Changes")` | `drop_dm_object_name("Instance_Changes")`
| where image_id != "unknown" | inputlookup append=t previously_seen_cloud_compute_images
| stats min(firstTimeSeen) as firstTimeSeen max(lastTimeSeen) as lastTimeSeen by
image_id | where lastTimeSeen > relative_time(now(), `previously_seen_cloud_compute_images_forget_window`)
| eventstats min(firstTimeSeen) as globalFirstTime | eval enough_data = if(globalFirstTime
<= relative_time(now(), "-7d@d"), 1, 0) | outputlookup previously_seen_cloud_compute_images'
how_to_implement: You must be ingesting the approrpiate cloud infrastructure logs
author: David Dorsey, Splunk
search: '| tstats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen from datamodel=Change
where All_Changes.action=created by All_Changes.Instance_Changes.image_id
| `drop_dm_object_name("All_Changes")`
| `drop_dm_object_name("Instance_Changes")`
| where image_id != "unknown"
| inputlookup append=t previously_seen_cloud_compute_images
| stats min(firstTimeSeen) as firstTimeSeen max(lastTimeSeen) as lastTimeSeen by image_id
| where lastTimeSeen > relative_time(now(), `previously_seen_cloud_compute_images_forget_window`)
| eventstats min(firstTimeSeen) as globalFirstTime
| eval enough_data = if(globalFirstTime <= relative_time(now(), "-7d@d"), 1, 0)
| outputlookup previously_seen_cloud_compute_images'
references: []
tags:
analytics_story:
analytic_story:
- Cloud Cryptomining
detections:
- Cloud Compute Instance Created With Previously Unseen Image
deployments:
- Daily Cache Updates
detections:
- Cloud Compute Instance Created With Previously Unseen Image
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -1,25 +1,29 @@
name: Previously Seen Cloud Compute Instance Types - Initial
id: 3c78025c-1ffe-4976-a640-75ef604842be
version: 1
date: '2020-9-03'
date: 2020-9-03
author: David Dorsey, Splunk
type: batch
datamodel:
- Change
description: This search builds a table of previously seen cloud compute instance
types
search: '| tstats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen
from datamodel=Change where All_Changes.action=created by All_Changes.Instance_Changes.instance_type
| `drop_dm_object_name("All_Changes.Instance_Changes")` | where instance_type !=
"unknown" | eventstats min(firstTimeSeen) as globalFirstTime | eval enough_data
= if(globalFirstTime <= relative_time(now(), "-14d@d"), 1, 0) | outputlookup previously_seen_cloud_compute_instance_types'
how_to_implement: You must be ingesting the approrpiate cloud infrastructure logs
and have the Security Research cloud data model installed.
author: David Dorsey, Splunk
search: '| tstats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen from datamodel=Change
where All_Changes.action=created
by All_Changes.Instance_Changes.instance_type
| `drop_dm_object_name("All_Changes.Instance_Changes")`
| where instance_type != "unknown"
| eventstats min(firstTimeSeen) as globalFirstTime
| eval enough_data = if(globalFirstTime <= relative_time(now(), "-14d@d"), 1, 0)
| outputlookup previously_seen_cloud_compute_instance_types'
references: []
tags:
analytics_story:
analytic_story:
- Cloud Cryptomining
detections:
- Cloud Compute Instance Created With Previously Unseen Instance Type
deployments:
- 90 Day Baseline
detections:
- Cloud Compute Instance Created With Previously Unseen Instance Type
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -1,26 +1,31 @@
name: Previously Seen Cloud Compute Instance Types - Update
id: 7b7ef9ab-acb9-4e07-af76-4cf1e722885c
version: 1
date: '2020-9-03'
date: 2020-9-03
author: David Dorsey, Splunk
type: batch
datamodel:
- Change
description: This search builds a table of previously seen cloud compute instance
types
search: '| tstats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen
from datamodel=Change where All_Changes.action=created by All_Changes.Instance_Changes.instance_type
| `drop_dm_object_name("All_Changes.Instance_Changes")` | where instance_type !=
"unknown" | inputlookup append=t previously_seen_cloud_compute_instance_types |
stats min(firstTimeSeen) as firstTimeSeen max(lastTimeSeen) as lastTimeSeen by instance_type
| where lastTimeSeen > relative_time(now(), `previously_seen_cloud_compute_instance_type_forget_window`)
| eventstats min(firstTimeSeen) as globalFirstTime | eval enough_data = if(globalFirstTime
<= relative_time(now(), "-14d@d"), 1, 0) | outputlookup previously_seen_cloud_compute_instance_types'
how_to_implement: You must be ingesting the approrpiate cloud infrastructure logs
author: David Dorsey, Splunk
search: '| tstats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen from datamodel=Change
where All_Changes.action=created
by All_Changes.Instance_Changes.instance_type
| `drop_dm_object_name("All_Changes.Instance_Changes")`
| where instance_type != "unknown"
| inputlookup append=t previously_seen_cloud_compute_instance_types
| stats min(firstTimeSeen) as firstTimeSeen max(lastTimeSeen) as lastTimeSeen by instance_type
| where lastTimeSeen > relative_time(now(), `previously_seen_cloud_compute_instance_type_forget_window`)
| eventstats min(firstTimeSeen) as globalFirstTime
| eval enough_data = if(globalFirstTime <= relative_time(now(), "-14d@d"), 1, 0)
| outputlookup previously_seen_cloud_compute_instance_types'
references: []
tags:
analytics_story:
analytic_story:
- Cloud Cryptomining
detections:
- Cloud Compute Instance Created With Previously Unseen Instance Type
deployments:
- Daily Cache Updates
detections:
- Cloud Compute Instance Created With Previously Unseen Instance Type
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,21 +2,28 @@ name: Previously Seen Cloud Instance Modifications By User - Initial
id: f36dc403-739d-42f3-83a3-49237d8654c5
version: 1
date: '2020-07-29'
author: Rico Valdez, Splunk
type: batch
datamodel:
- Change
description: This search builds a table of previously seen users that have modified
a cloud instance.
how_to_implement: You must be ingesting the approrpiate cloud infrastructure logs and have the latest Change Datamodel accelerated.
author: Rico Valdez, Splunk
search: '| tstats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen from datamodel=Change
where All_Changes.action=modified All_Changes.change_type=EC2 All_Changes.status=success by All_Changes.user
| `drop_dm_object_name("All_Changes")`
| eventstats min(firstTimeSeen) as globalFirstTime
| eval enough_data = if(globalFirstTime <= relative_time(now(), "-7d@d"), 1, 0)
| outputlookup previously_seen_cloud_instance_modifications_by_user'
search: '| tstats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen
from datamodel=Change where All_Changes.action=modified All_Changes.change_type=EC2
All_Changes.status=success by All_Changes.user | `drop_dm_object_name("All_Changes")`
| eventstats min(firstTimeSeen) as globalFirstTime | eval enough_data = if(globalFirstTime
<= relative_time(now(), "-7d@d"), 1, 0) | outputlookup previously_seen_cloud_instance_modifications_by_user'
how_to_implement: You must be ingesting the approrpiate cloud infrastructure logs
and have the latest Change Datamodel accelerated.
references: []
tags:
analytics_story:
analytic_story:
- Suspicious Cloud Instance Activities
detections:
- Cloud Instance Modified By Previously Unseen User
deployments:
- 90 Day Baseline
detections:
- Cloud Instance Modified By Previously Unseen User
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,25 +2,32 @@ name: Previously Seen Cloud Instance Modifications By User - Update
id: 534b7d30-7b0c-4510-8f55-65439850d58d
version: 1
date: '2020-07-29'
description: This search updates a table of previously seen Cloud Instance modifications that have been made by a user
author: Rico Valdez, Splunk
type: batch
datamodel:
- Change
description: This search updates a table of previously seen Cloud Instance modifications
that have been made by a user
search: '| tstats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen
from datamodel=Change where All_Changes.action=modified All_Changes.change_type=EC2
All_Changes.status=success by All_Changes.user | `drop_dm_object_name("All_Changes")`
| inputlookup append=t previously_seen_cloud_instance_modifications_by_user | stats
min(firstTimeSeen) as firstTimeSeen max(lastTimeSeen) as lastTimeSeen by user |
where lastTimeSeen > relative_time(now(), `previously_seen_cloud_compute_images_forget_window`)
| eventstats min(firstTimeSeen) as globalFirstTime | eval enough_data = if(globalFirstTime
<= relative_time(now(), "-7d@d"), 1, 0) | outputlookup previously_seen_cloud_instance_modifications_by_user'
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS version (4.4.0 or later), then configure your CloudTrail
inputs. To add or remove APIs that modify an EC2 instance, edit the macro `ec2_modification_api_calls`.
author: Rico Valdez, Splunk
search: '| tstats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen from datamodel=Change
where All_Changes.action=modified All_Changes.change_type=EC2 All_Changes.status=success
by All_Changes.user
| `drop_dm_object_name("All_Changes")`
| inputlookup append=t previously_seen_cloud_instance_modifications_by_user
| stats min(firstTimeSeen) as firstTimeSeen max(lastTimeSeen) as lastTimeSeen by user
| where lastTimeSeen > relative_time(now(), `previously_seen_cloud_compute_images_forget_window`)
| eventstats min(firstTimeSeen) as globalFirstTime
| eval enough_data = if(globalFirstTime <= relative_time(now(), "-7d@d"), 1, 0)
| outputlookup previously_seen_cloud_instance_modifications_by_user'
references: []
tags:
analytics_story:
analytic_story:
- Suspicious Cloud Instance Activities
detections:
- Cloud Instance Modified By Previously Unseen User
deployments:
- Daily Cache Updates
detections:
- Cloud Instance Modified By Previously Unseen User
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,27 +2,35 @@ name: Previously Seen Cloud Provisioning Activity Sources - Initial
id: 4ce865fc-f43e-4521-a8ed-ab8af99052d7
version: 1
date: '2020-08-19'
author: Rico Valdez, Splunk
type: batch
datamodel:
- Change
description: This search builds a table of the first and last times seen for every
IP address (along with its physical location) previously associated with cloud-provisioning
activity. This is broadly defined as any event that runs or creates something. This table is
then cached.
how_to_implement: You must be ingesting Cloud infrastructure logs from your cloud provider.
author: Rico Valdez, Splunk
search: '| tstats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen from datamodel=Change
where (All_Changes.action=started OR All_Changes.action=created) All_Changes.status=success
by All_Changes.src | `drop_dm_object_name("All_Changes")`
| iplocation src | where isnotnull(Country)
| eventstats min(firstTimeSeen) as globalFirstTime
| eval enough_data = if(globalFirstTime <= relative_time(now(), "-7d@d"), 1, 0)
| table src, City, Country, Region, firstTimeSeen, lastTimeSeen, enough_data
| outputlookup previously_seen_cloud_provisioning_activity_sources'
activity. This is broadly defined as any event that runs or creates something. This
table is then cached.
search: '| tstats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen
from datamodel=Change where (All_Changes.action=started OR All_Changes.action=created)
All_Changes.status=success by All_Changes.src | `drop_dm_object_name("All_Changes")`
| iplocation src | where isnotnull(Country) | eventstats min(firstTimeSeen) as globalFirstTime
| eval enough_data = if(globalFirstTime <= relative_time(now(), "-7d@d"), 1, 0)
| table src, City, Country, Region, firstTimeSeen, lastTimeSeen, enough_data | outputlookup
previously_seen_cloud_provisioning_activity_sources'
how_to_implement: You must be ingesting Cloud infrastructure logs from your cloud
provider.
references: []
tags:
analytics_story:
analytic_story:
- Suspicious Cloud Provisioning Activities
deployments:
- 90 Day Baseline
detections:
- Cloud Provisioning Activity From Previously Unseen IP Address
- Cloud Provisioning Activity From Previously Unseen City
- Cloud Provisioning Activity From Previously Unseen Country
- Cloud Provisioning Activity From Previously Unseen Region
deployments:
- 90 Day Baseline
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,32 +2,40 @@ name: Previously Seen Cloud Provisioning Activity Sources - Update
id: 9830abb9-be80-4563-b232-09bf1f628cf3
version: 1
date: '2020-08-20'
description: This returns the first and last times seen for every
IP address (along with its physical location) previously associated with cloud-provisioning
activity within the last day. Cloud provisioning is broadly defined as any event that runs or
creates something. It then updates this information with historical data and filters out locations
that have not been seen within the specified time window. This updated table is then cached.
how_to_implement: You must be ingesting Cloud infrastructure logs from your cloud provider.
author: David Dorsey, Splunk
search: '| tstats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen from datamodel=Change
where (All_Changes.action=started OR All_Changes.action=created) All_Changes.status=success
by All_Changes.src | `drop_dm_object_name("All_Changes")`
| iplocation src | where isnotnull(Country)
| table src, firstTimeSeen, lastTimeSeen, City, Country, Region
| inputlookup previously_seen_cloud_provisioning_activity_sources append=t
| stats min(firstTimeSeen) as firstTimeSeen, max(lastTimeSeen) as lastTimeSeen by src, City, Country, Region
| where lastTimeSeen > relative_time(now(), `previously_seen_cloud_provisioning_activity_forget_window`)
| eventstats min(firstTimeSeen) as globalFirstTime
| eval enough_data = if(globalFirstTime <= relative_time(now(), "-7d@d"), 1, 0)
| table src, City, Country, Region, firstTimeSeen, lastTimeSeen, enough_data
| outputlookup previously_seen_cloud_provisioning_activity_sources'
type: batch
datamodel:
- Change
description: This returns the first and last times seen for every IP address (along
with its physical location) previously associated with cloud-provisioning activity
within the last day. Cloud provisioning is broadly defined as any event that runs
or creates something. It then updates this information with historical data and
filters out locations that have not been seen within the specified time window.
This updated table is then cached.
search: '| tstats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen
from datamodel=Change where (All_Changes.action=started OR All_Changes.action=created)
All_Changes.status=success by All_Changes.src | `drop_dm_object_name("All_Changes")`
| iplocation src | where isnotnull(Country) | table src, firstTimeSeen, lastTimeSeen,
City, Country, Region | inputlookup previously_seen_cloud_provisioning_activity_sources
append=t | stats min(firstTimeSeen) as firstTimeSeen, max(lastTimeSeen) as lastTimeSeen
by src, City, Country, Region | where lastTimeSeen > relative_time(now(), `previously_seen_cloud_provisioning_activity_forget_window`)
| eventstats min(firstTimeSeen) as globalFirstTime | eval enough_data = if(globalFirstTime
<= relative_time(now(), "-7d@d"), 1, 0) | table src, City, Country, Region, firstTimeSeen,
lastTimeSeen, enough_data | outputlookup previously_seen_cloud_provisioning_activity_sources'
how_to_implement: You must be ingesting Cloud infrastructure logs from your cloud
provider.
references: []
tags:
analytics_story:
analytic_story:
- Suspicious Cloud Provisioning Activities
deployments:
- Daily Cache Updates
detections:
- Cloud Provisioning Activity From Previously Unseen IP Address
- Cloud Provisioning Activity From Previously Unseen City
- Cloud Provisioning Activity From Previously Unseen Country
- Cloud Provisioning Activity From Previously Unseen Region
deployments:
- Daily Cache Updates
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,24 +2,30 @@ name: Previously Seen Cloud Regions - Initial
id: b5e232db-dec6-4db8-aaa1-dd5474521e40
version: 1
date: '2020-09-02'
author: David Dorsey, Splunk
type: batch
datamodel:
- Change
description: This search looks for cloud compute events where a compute instance is
started and creates a baseline of most recent time, `lastTime` and the first time
`firstTime` we've seen this region in our dataset grouped by the region for the
last 30 days
how_to_implement: You must be ingesting the approrpiate cloud infrastructure logs
and have the Security Research cloud data model installed.
author: David Dorsey, Splunk
search: '| tstats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen from datamodel=Change
where All_Changes.action=created by All_Changes.vendor_region
| `drop_dm_object_name("All_Changes")`
| eventstats min(firstTimeSeen) as globalFirstTime
search: '| tstats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen
from datamodel=Change where All_Changes.action=created by All_Changes.vendor_region
| `drop_dm_object_name("All_Changes")` | eventstats min(firstTimeSeen) as globalFirstTime
| eval enough_data = if(globalFirstTime <= relative_time(now(), "-14d@d"), 1, 0)
| outputlookup previously_seen_cloud_regions'
how_to_implement: You must be ingesting the approrpiate cloud infrastructure logs
and have the Security Research cloud data model installed.
references: []
tags:
analytics_story:
analytic_story:
- Cloud Cryptomining
detections:
- Cloud Compute Instance Created In Previously Unused Region
deployments:
- 90 Day Baseline
detections:
- Cloud Compute Instance Created In Previously Unused Region
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,29 +2,33 @@ name: Previously Seen Cloud Regions - Update
id: 512f928a-a461-41b4-8984-db4dd2c472e4
version: 1
date: '2020-09-02'
author: David Dorsey, Splunk
type: batch
datamodel:
- Change
description: This search looks for cloud compute events where a compute instance is
started and creates a baseline of most recent time, `lastTime` and the first time
`firstTime` we've seen this region in our dataset grouped by the region for the
last 30 days
search: '| tstats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen
from datamodel=Change where All_Changes.action=created by All_Changes.vendor_region
| `drop_dm_object_name("All_Changes")` | inputlookup append=t previously_seen_cloud_regions
| stats min(firstTimeSeen) as firstTimeSeen max(lastTimeSeen) as lastTimeSeen by
vendor_region | where lastTimeSeen > relative_time(now(), `previously_seen_cloud_region_forget_window`)
| eventstats min(firstTimeSeen) as globalFirstTime | eval enough_data = if(globalFirstTime
<= relative_time(now(), "-14d@d"), 1, 0) | outputlookup previously_seen_cloud_regions
| stats count'
how_to_implement: You must be ingesting the approrpiate cloud infrastructure logs
and have the Security Research cloud data model installed.
author: David Dorsey, Splunk
search: '| tstats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen from datamodel=Change
where All_Changes.action=created by All_Changes.vendor_region
| `drop_dm_object_name("All_Changes")` | inputlookup append=t previously_seen_cloud_regions
| stats min(firstTimeSeen) as firstTimeSeen max(lastTimeSeen) as lastTimeSeen by vendor_region
| where lastTimeSeen > relative_time(now(), `previously_seen_cloud_region_forget_window`)
| eventstats min(firstTimeSeen) as globalFirstTime
| eval enough_data = if(globalFirstTime <= relative_time(now(), "-14d@d"), 1, 0)
| outputlookup previously_seen_cloud_regions | stats count'
references: []
tags:
analytics_story:
analytic_story:
- Cloud Cryptomining
detections:
- Cloud Compute Instance Created In Previously Unused Region
deployments:
- Daily Cache Updates
detections:
- Cloud Compute Instance Created In Previously Unused Region
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,20 +2,24 @@ name: Previously seen command line arguments
id: 56059acf-50fe-4f60-98d1-b75b51b5c2f3
version: 2
date: '2019-03-01'
author: Bhavin Patel, Splunk
type: batch
datamodel:
- Endpoint
description: This search looks for command-line arguments where `cmd.exe /c` is used
to execute a program, then creates a baseline of the earliest and latest times we
have encountered this command-line argument in our dataset within the last 30 days.
search: '| tstats `security_content_summariesonly` min(_time) as firstTime max(_time)
as lastTime from datamodel=Endpoint.Processes where Processes.process_name=cmd.exe
AND Processes.process="* /c *" by Processes.process | `drop_dm_object_name(Processes)`'
how_to_implement: You must be ingesting data that records process activity from your
hosts to populate the Endpoint data model in the Processes node. You must be ingesting
logs with both the process name and command line from your endpoints. The complete
process name with command-line arguments are mapped to the "process" field in the
Endpoint data model.
author: Bhavin Patel, Splunk
search: '| tstats `security_content_summariesonly` min(_time) as firstTime max(_time)
as lastTime from datamodel=Endpoint.Processes where Processes.process_name=cmd.exe
AND Processes.process="* /c *" by Processes.process | `drop_dm_object_name(Processes)`'
references: []
tags:
analytics_story:
analytic_story:
- DHS Report TA18-074A
- Disabling Security Tools
- Hidden Cobra Malware
@@ -28,3 +32,7 @@ tags:
- Detect Prohibited Applications Spawning cmd.exe
- Processes launching netsh
- First time seen command line argument
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
+12 -5
View File
@@ -2,17 +2,24 @@ name: Previously Seen EC2 AMIs
id: bb1bd99d-1e93-45f1-9571-cfed42d372b9
version: 1
date: '2018-03-12'
author: David Dorsey, Splunk
type: batch
datamodel: []
description: This search builds a table of previously seen AMIs used to launch EC2
instances
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS version (4.4.0 or later), then configure your CloudTrail
inputs.
author: David Dorsey, Splunk
search: '`cloudtrail` eventName=RunInstances errorCode=success | rename requestParameters.instancesSet.items{}.imageId
as amiID | stats earliest(_time) as firstTime latest(_time) as lastTime by amiID
| outputlookup previously_seen_ec2_amis.csv | stats count'
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS version (4.4.0 or later), then configure your CloudTrail
inputs.
references: []
tags:
analytics_story:
analytic_story:
- AWS Cryptomining
detections:
- EC2 Instance Started With Previously Unseen AMI
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,17 +2,24 @@ name: Previously Seen EC2 Instance Types
id: b8f029f2-65a6-4d76-be98-dad1c9d59c45
version: 1
date: '2018-03-08'
description: This search builds a table of previously seen EC2 instance types
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS version (4.4.0 or later), then configure your CloudTrail
inputs.
author: David Dorsey, Splunk
type: batch
datamodel: []
description: This search builds a table of previously seen EC2 instance types
search: '`cloudtrail` eventName=RunInstances errorCode=success | rename requestParameters.instanceType
as instanceType | fillnull value="m1.small" instanceType | stats earliest(_time)
as earliest latest(_time) as latest by instanceType | outputlookup previously_seen_ec2_instance_types.csv
| stats count'
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS version (4.4.0 or later), then configure your CloudTrail
inputs.
references: []
tags:
analytics_story:
analytic_story:
- AWS Cryptomining
detections:
- EC2 Instance Started With Previously Unseen Instance Type
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,18 +2,25 @@ name: Previously Seen EC2 Launches By User
id: 6c767ac0-0906-4355-9a83-927f5ee7bdad
version: 1
date: '2018-03-15'
author: David Dorsey, Splunk
type: batch
datamodel: []
description: This search builds a table of previously seen ARNs that have launched
a EC2 instance.
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS version (4.4.0 or later), then configure your CloudTrail
inputs.
author: David Dorsey, Splunk
search: '`cloudtrail` eventName=RunInstances errorCode=success | rename userIdentity.arn
as arn | stats earliest(_time) as firstTime latest(_time) as lastTime by arn | outputlookup
previously_seen_ec2_launches_by_user.csv | stats count'
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS version (4.4.0 or later), then configure your CloudTrail
inputs.
references: []
tags:
analytics_story:
analytic_story:
- AWS Cryptomining
- Suspicious AWS EC2 Activities
detections:
- EC2 Instance Started With Previously Unseen User
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,17 +2,24 @@ name: Previously Seen EC2 Modifications By User
id: 4d69091b-d975-4267-85df-888bd41034eb
version: 1
date: '2018-04-05'
author: David Dorsey, Splunk
type: batch
datamodel: []
description: This search builds a table of previously seen ARNs that have launched
a EC2 instance.
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS version (4.4.0 or later), then configure your CloudTrail
inputs. To add or remove APIs that modify an EC2 instance, edit the macro `ec2_modification_api_calls`.
author: David Dorsey, Splunk
search: '`cloudtrail` `ec2_modification_api_calls` errorCode=success | spath output=arn
userIdentity.arn | stats earliest(_time) as firstTime latest(_time) as lastTime
by arn | outputlookup previously_seen_ec2_modifications_by_user | stats count'
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS version (4.4.0 or later), then configure your CloudTrail
inputs. To add or remove APIs that modify an EC2 instance, edit the macro `ec2_modification_api_calls`.
references: []
tags:
analytics_story:
analytic_story:
- Unusual AWS EC2 Modifications
detections:
- EC2 Instance Modified With Previously Unseen User
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,23 +2,28 @@ name: Previously Seen Running Windows Services - Initial
id: 64ce0ade-cb01-4678-bddd-d31c0b175394
version: 3
date: '2020-06-23'
author: David Dorsey, Splunk
type: batch
datamodel: []
description: This collects the services that have been started across your entire
enterprise.
search: '`wineventlog_system` EventCode=7036 | rex field=Message "The (?<service>[-\(\)\s\w]+)
service entered the (?<state>\w+) state" | where state="running" | stats earliest(_time)
as firstTimeSeen, latest(_time) as lastTimeSeen by service | outputlookup previously_seen_running_windows_services'
how_to_implement: While this search does not require you to adhere to Splunk CIM,
you must be ingesting your Windows security-event logs for it to execute successfully.
Please ensure that the Splunk Add-on for Microsoft Windows is version 8.0.0 or above.
author: David Dorsey, Splunk
search: '`wineventlog_system` EventCode=7036 |
rex field=Message "The (?<service>[-\(\)\s\w]+) service entered the (?<state>\w+) state" |
where state="running" |
stats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen by service |
outputlookup previously_seen_running_windows_services'
references: []
tags:
analytics_story:
analytic_story:
- Orangeworm Attack Group
- Windows Service Abuse
- Sunburst Malware
detections:
- First Time Seen Running Windows Service
deployments:
- 90 Day Baseline
detections:
- First Time Seen Running Windows Service
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,28 +2,33 @@ name: Previously Seen Running Windows Services - Update
id: 2e3bdd68-1863-46ee-81f8-87273eee7f1c
version: 3
date: '2020-06-23'
description: This search returns the first and last time a Windows service was seen across your enterprise
within the last hour. It then updates this information with historical data and filters out
Windows services pairs that have not been seen within the specified time window.
This updated table is then cached.
author: David Dorsey, Splunk
type: batch
datamodel: []
description: This search returns the first and last time a Windows service was seen
across your enterprise within the last hour. It then updates this information with
historical data and filters out Windows services pairs that have not been seen within
the specified time window. This updated table is then cached.
search: '`wineventlog_system` EventCode=7036 | rex field=Message "The (?<service>[-\(\)\s\w]+)
service entered the (?<state>\w+) state" | where state="running" | stats earliest(_time)
as firstTimeSeen, latest(_time) as lastTimeSeen by service | inputlookup previously_seen_running_windows_services
append=t | stats min(firstTimeSeen) as firstTimeSeen, max(lastTimeSeen) as lastTimeSeen
by service | where lastTimeSeen > relative_time(now(), "`previously_seen_windows_service_forget_window`")
| outputlookup previously_seen_running_windows_services'
how_to_implement: While this search does not require you to adhere to Splunk CIM,
you must be ingesting your Windows security-event logs for it to execute successfully.
Please ensure that the Splunk Add-on for Microsoft Windows is version 8.0.0 or above.
author: David Dorsey, Splunk
search: '`wineventlog_system` EventCode=7036 |
rex field=Message "The (?<service>[-\(\)\s\w]+) service entered the (?<state>\w+) state" |
where state="running" |
stats earliest(_time) as firstTimeSeen, latest(_time) as lastTimeSeen by service |
inputlookup previously_seen_running_windows_services append=t |
stats min(firstTimeSeen) as firstTimeSeen, max(lastTimeSeen) as lastTimeSeen by service |
where lastTimeSeen > relative_time(now(), "`previously_seen_windows_service_forget_window`") |
outputlookup previously_seen_running_windows_services'
references: []
tags:
analytics_story:
analytic_story:
- Orangeworm Attack Group
- Windows Service Abuse
- Sunburst Malware
detections:
- First Time Seen Running Windows Service
deployments:
- Hourly Cache Updates
detections:
- First Time Seen Running Windows Service
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,20 +2,27 @@ name: Previously seen S3 bucket access by remote IP
id: fc0edc15-fq2c-48b0-9f6f-63qa1281fd03
version: 1
date: '2018-06-28'
author: Bhavin Patel, Splunk
type: batch
datamodel: []
description: This search looks for successful access to S3 buckets from remote IP
addresses, then creates a baseline of the earliest and latest times we have encountered
this remote IP within the last 30 days. In this support search, we are only looking
for S3 access events where the HTTP response code from AWS is "200"
search: '`aws_s3_accesslogs` http_status=200 | stats earliest(_time) as earliest
latest(_time) as latest by bucket_name remote_ip | outputlookup previously_seen_S3_access_from_remote_ip
| stats count'
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS (version 4.4.0 or later), then configure your S3 access-logs
inputs. You must validate the remote IP and bucket name entries in `previously_seen_S3_access_from_remote_ip.csv`,
which is a lookup file created as a result of running this support search.
author: Bhavin Patel, Splunk
search: '`aws_s3_accesslogs` http_status=200 | stats earliest(_time) as earliest
latest(_time) as latest by bucket_name remote_ip | outputlookup previously_seen_S3_access_from_remote_ip
| stats count'
references: []
tags:
analytics_story:
analytic_story:
- Suspicious AWS S3 Activities
detections:
- Detect S3 access from a new IP
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,24 +2,32 @@ name: Previously seen users in CloudTrail
id: fc0edc95-ff2b-48b0-9f6f-63da3789fd03
version: 1
date: '2018-04-30'
author: Jason Brewer, Splunk
type: batch
datamodel: []
description: This search looks for CloudTrail events where a user logs into the console,
then creates a baseline of the latest and earliest times, City, Region, and Country
we have encountered this user in our dataset, grouped by ARN, within the last 30
days. NOTE - This baseline search is deprecated and has been updated to use the Authentication Datamodel
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS (version 4.4.0 or later), then configure your CloudTrail
inputs. Please validate the user name entries in `previously_seen_users_console_logins_cloudtrail`,
which is a lookup file created as a result of running this support search.
author: Jason Brewer, Splunk
days. NOTE - This baseline search is deprecated and has been updated to use the
Authentication Datamodel
search: '`cloudtrail` eventName=ConsoleLogin | rename userIdentity.arn as user | iplocation
src | eval City=if(City LIKE "",src,City),Region=if(Region LIKE "",src,Region) |
stats earliest(_time) as firstTime latest(_time) as lastTime by user src City Region
Country | outputlookup previously_seen_users_console_logins_cloudtrail | stats count'
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS (version 4.4.0 or later), then configure your CloudTrail
inputs. Please validate the user name entries in `previously_seen_users_console_logins_cloudtrail`,
which is a lookup file created as a result of running this support search.
references: []
tags:
analytics_story:
analytic_story:
- Suspicious AWS Login Activities
detections:
- Detect AWS Console Login by User from New Country
- Detect AWS Console Login by User from New Region
- Detect AWS Console Login by User from New City
- Detect new user AWS Console Login
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,27 +2,36 @@ name: Previously Seen Users in CloudTrail - Initial
id: 0a87ecf9-dc6a-43af-861a-205e75a09bf5
version: 1
date: '2020-05-28'
author: Rico Valdez, Splunk
type: batch
datamodel:
- Authentication
description: This search looks for CloudTrail events where a user logs into the console,
then creates a baseline of the latest and earliest times, City, Region, and Country
we have encountered this user in our dataset, grouped by username, within the last 30
days.
how_to_implement: You must install and configure the Splunk Add-on for AWS (version 5.1.0 or later)
and Enterprise Security 6.2, which contains the required updates to the Authentication data model
for cloud use cases. Validate the user name entries in `previously_seen_users_console_logins`,
which is a lookup file created by this support search.
author: Rico Valdez, Splunk
we have encountered this user in our dataset, grouped by username, within the last
30 days.
search: '| tstats earliest(_time) as firstTime latest(_time) as lastTime from datamodel=Authentication
where Authentication.signature=ConsoleLogin by Authentication.user Authentication.src
| iplocation Authentication.src | rename Authentication.user as user Authentication.src as src
| table user src City Region Country firstTime lastTime | outputlookup previously_seen_users_console_logins | stats count'
| iplocation Authentication.src | rename Authentication.user as user Authentication.src
as src | table user src City Region Country firstTime lastTime | outputlookup previously_seen_users_console_logins
| stats count'
how_to_implement: You must install and configure the Splunk Add-on for AWS (version
5.1.0 or later) and Enterprise Security 6.2, which contains the required updates
to the Authentication data model for cloud use cases. Validate the user name entries
in `previously_seen_users_console_logins`, which is a lookup file created by this
support search.
references: []
tags:
analytics_story:
analytic_story:
- Suspicious Cloud Authentication Activities
deployments:
- 90 Day Baseline
detections:
- Detect AWS Console Login by User from New Country
- Detect AWS Console Login by User from New Region
- Detect AWS Console Login by User from New City
- Detect AWS Console Login by New User
deployments:
- 90 Day Baseline
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,28 +2,36 @@ name: Previously Seen Users In CloudTrail - Update
id: 66ff71c2-7e01-47dd-a041-906688c9d322
version: 1
date: '2020-05-28'
author: Rico Valdez, Splunk
type: batch
datamodel:
- Authentication
description: This search looks for CloudTrail events where a user logs into the console,
then updates the baseline of the latest and earliest times, City, Region, and Country
we have encountered this user in our dataset, grouped by user, within the last hour.
how_to_implement: You must install and configure the Splunk Add-on for AWS (version 5.1.0 or later)
and Enterprise Security 6.2, which contains the required updates to the Authentication data model
for cloud use cases. Validate the user name entries in `previously_seen_users_console_logins`,
which is a lookup file created by this support search.
author: Rico Valdez, Splunk
search: '| tstats earliest(_time) as firstTime latest(_time) as lastTime from
datamodel=Authentication where Authentication.signature=ConsoleLogin by Authentication.user
Authentication.src | iplocation Authentication.src | rename Authentication.user as user
Authentication.src as src | table user src City Region Country firstTime lastTime
| inputlookup append=t previously_seen_users_console_logins | stats min(firstTime) as
firstTime max(lastTime) as lastTime by user src City Region Country
| outputlookup previously_seen_users_console_logins'
search: '| tstats earliest(_time) as firstTime latest(_time) as lastTime from datamodel=Authentication
where Authentication.signature=ConsoleLogin by Authentication.user Authentication.src
| iplocation Authentication.src | rename Authentication.user as user Authentication.src
as src | table user src City Region Country firstTime lastTime | inputlookup append=t
previously_seen_users_console_logins | stats min(firstTime) as firstTime max(lastTime)
as lastTime by user src City Region Country | outputlookup previously_seen_users_console_logins'
how_to_implement: You must install and configure the Splunk Add-on for AWS (version
5.1.0 or later) and Enterprise Security 6.2, which contains the required updates
to the Authentication data model for cloud use cases. Validate the user name entries
in `previously_seen_users_console_logins`, which is a lookup file created by this
support search.
references: []
tags:
analytics_story:
analytic_story:
- Suspicious Cloud Authentication Activities
deployments:
- Daily Cache Updates
detections:
- Detect AWS Console Login by User from New Country
- Detect AWS Console Login by User from New Region
- Detect AWS Console Login by User from New City
- Detect AWS Console Login by New User
deployments:
- Daily Cache Updates
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,21 +2,30 @@ name: Previously Seen Zoom Child Processes - Initial
id: 60b9c00f-a9d6-4e51-803c-5d63ea21b95b
version: 1
date: '2020-05-20'
description: This search returns the first and last time a process was seen per endpoint with
a parent process of zoom.exe (Windows) or zoom.us (macOS). This table is then cached.
author: David Dorsey, Splunk
type: batch
datamodel:
- Endpoint
description: This search returns the first and last time a process was seen per endpoint
with a parent process of zoom.exe (Windows) or zoom.us (macOS). This table is then
cached.
search: '| tstats `security_content_summariesonly` min(_time) as firstTimeSeen max(_time)
as lastTimeSeen from datamodel=Endpoint.Processes where (Processes.parent_process_name=zoom.exe
OR Processes.parent_process_name=zoom.us) by Processes.process_name Processes.dest|
`drop_dm_object_name(Processes)` | table dest, process_name, firstTimeSeen, lastTimeSeen
| outputlookup zoom_first_time_child_process'
how_to_implement: You must be ingesting endpoint data that tracks process activity,
including parent-child relationships from your endpoints, to populate the Endpoint
data model in the Processes node.
author: David Dorsey, Splunk
search: '| tstats `security_content_summariesonly` min(_time) as firstTimeSeen max(_time) as lastTimeSeen
from datamodel=Endpoint.Processes where (Processes.parent_process_name=zoom.exe OR Processes.parent_process_name=zoom.us)
by Processes.process_name Processes.dest| `drop_dm_object_name(Processes)`
| table dest, process_name, firstTimeSeen, lastTimeSeen
| outputlookup zoom_first_time_child_process'
references: []
tags:
analytics_story:
analytic_story:
- Suspicious Zoom Child Processes
detections:
- First Time Seen Child Process of Zoom
deployments:
- 90 Day Baseline
detections:
- First Time Seen Child Process of Zoom
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,26 +2,35 @@ name: Previously Seen Zoom Child Processes - Update
id: 80aea7fd-5da2-4533-b3c2-560533bfbaee
version: 1
date: '2020-05-20'
description: This search returns the first and last time a process was seen per endpoint with
a parent process of zoom.exe (Windows) or zoom.us (macOS) within the last hour. It then updates
this information with historical data and filters out proces_name and endpoint pairs that have not
been seen within the specified time window. This updated table is outputed to disk.
author: David Dorsey, Splunk
type: batch
datamodel:
- Endpoint
description: This search returns the first and last time a process was seen per endpoint
with a parent process of zoom.exe (Windows) or zoom.us (macOS) within the last hour.
It then updates this information with historical data and filters out proces_name
and endpoint pairs that have not been seen within the specified time window. This
updated table is outputed to disk.
search: '| tstats `security_content_summariesonly` min(_time) as firstTimeSeen max(_time)
as lastTimeSeen from datamodel=Endpoint.Processes where (Processes.parent_process_name=zoom.exe
OR Processes.parent_process_name=zoom.us) by Processes.process_name Processes.dest|
`drop_dm_object_name(Processes)` | table firstTimeSeen, lastTimeSeen, process_name,
dest | inputlookup zoom_first_time_child_process append=t | stats min(firstTimeSeen)
as firstTimeSeen max(lastTimeSeen) as lastTimeSeen by process_name, dest | where
lastTimeSeen > relative_time(now(), "`previously_seen_zoom_child_processes_forget_window`")
| outputlookup zoom_first_time_child_process'
how_to_implement: You must be ingesting endpoint data that tracks process activity,
including parent-child relationships from your endpoints, to populate the Endpoint
data model in the Processes node.
author: David Dorsey, Splunk
search: '| tstats `security_content_summariesonly` min(_time) as firstTimeSeen max(_time) as lastTimeSeen
from datamodel=Endpoint.Processes where (Processes.parent_process_name=zoom.exe OR Processes.parent_process_name=zoom.us)
by Processes.process_name Processes.dest| `drop_dm_object_name(Processes)`
| table firstTimeSeen, lastTimeSeen, process_name, dest
| inputlookup zoom_first_time_child_process append=t
| stats min(firstTimeSeen) as firstTimeSeen max(lastTimeSeen) as lastTimeSeen by process_name, dest
| where lastTimeSeen > relative_time(now(), "`previously_seen_zoom_child_processes_forget_window`")
| outputlookup zoom_first_time_child_process'
references: []
tags:
analytics_story:
analytic_story:
- Suspicious Zoom Child Processes
detections:
- First Time Seen Child Process of Zoom
deployments:
- Hourly Cache Updates
detections:
- First Time Seen Child Process of Zoom
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,22 +2,29 @@ name: Systems Ready for Spectre-Meltdown Windows Patch
id: fc0edc95-ff2b-48b0-9f6f-63da3789fd61
version: 1
date: '2018-01-08'
author: David Dorsey, Splunk
type: batch
datamodel: []
description: Some AV applications can cause the Spectre/Meltdown patch for Windows
not to install successfully. This registry key is supposed to be created by the
AV engine when it has been patched to be able to handle the Windows patch. If this
key has been written, the system can then be patched for Spectre and Meltdown.
how_to_implement: You need to be ingesting logs with both the process name and command-line
from your endpoints. If you are using Sysmon, you must have at least version 6.0.4
of the Sysmon TA.
author: David Dorsey, Splunk
search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time)
as lastTime FROM datamodel=Change_Analysis.All_Changes where All_Changes.object_category=registry
AND (All_Changes.object_path="HKLM\Software\Microsoft\Windows\CurrentVersion\QualityCompat*")
by All_Changes.dest, All_Changes.command, All_Changes.user, All_Changes.object,
All_Changes.object_path | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)`
| `drop_dm_object_name("All_Changes")`'
how_to_implement: You need to be ingesting logs with both the process name and command-line
from your endpoints. If you are using Sysmon, you must have at least version 6.0.4
of the Sysmon TA.
references: []
tags:
analytics_story:
analytic_story:
- Spectre And Meltdown Vulnerabilities
detections:
- Spectre and Meltdown Vulnerable Systems
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,25 +2,34 @@ name: Update previously seen users in CloudTrail
id: 06c036e6-d6d7-4daa-bd76-411c3d356031
version: 1
date: '2018-04-30'
author: Jason Brewer, Splunk
type: batch
datamodel: []
description: This search looks for CloudTrail events where a user logs into the console,
then updates the baseline of the latest and earliest times, City, Region, and Country
we have encountered this user in our dataset, grouped by ARN, within the last hour. NOTE - This baseline search is deprecated and has been updated to use the Authentication Datamodel
we have encountered this user in our dataset, grouped by ARN, within the last hour.
NOTE - This baseline search is deprecated and has been updated to use the Authentication
Datamodel
search: '`cloudtrail` eventName=ConsoleLogin | rename userIdentity.arn as user | iplocation
src | eval City=if(City LIKE "",src,City),Region=if(Region LIKE "",src,Region) |
stats earliest(_time) AS firstTime latest(_time) AS lastTime by user src City Region
Country | inputlookup append=t previously_seen_users_console_logins_cloudtrail |
stats min(firstTime) as firstTime max(lastTime) as lastTime by user src City Region
Country | outputlookup previously_seen_users_console_logins_cloudtrail'
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS (version 4.4.0 or later), then configure your CloudTrail
inputs. Please validate the user name entries in `previously_seen_users_console_logins_cloudtrail`,
which is a lookup file created as a result of running this support search.
author: Jason Brewer, Splunk
search: '`cloudtrail` eventName=ConsoleLogin | rename userIdentity.arn as user | iplocation
src | eval City=if(City LIKE "",src,City),Region=if(Region LIKE "",src,Region) |
stats earliest(_time) AS firstTime latest(_time) AS lastTime by user src City Region
Country | inputlookup append=t previously_seen_users_console_logins_cloudtrail | stats
min(firstTime) as firstTime max(lastTime) as lastTime by user src City Region Country
| outputlookup previously_seen_users_console_logins_cloudtrail'
references: []
tags:
analytics_story:
analytic_story:
- Suspicious AWS Login Activities
detections:
- Detect AWS Console Login by User from New Country
- Detect AWS Console Login by User from New Region
- Detect AWS Console Login by User from New City
- Detect new user AWS Console Login
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
+10 -3
View File
@@ -2,12 +2,19 @@ name: Windows Updates Install Failures
id: 6a4dbd1b-4502-4a11-943a-82b5ae7a42d7
version: 1
date: '2017-09-14'
author: David Dorsey, Splunk
type: batch
datamodel: []
description: This search is intended to give you a feel for how often Windows updates
fail to install in your environment. Fluctuations in these numbers will allow you
to determine when you should be concerned.
how_to_implement: You must be ingesting your Windows Update Logs
author: David Dorsey, Splunk
search: '| tstats `security_content_summariesonly` dc(Updates.dest) as count FROM
datamodel=Updates where Updates.vendor_product="Microsoft Windows" AND Updates.status=failure
by _time span=1d'
tags: {}
how_to_implement: You must be ingesting your Windows Update Logs
references: []
tags:
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -2,12 +2,19 @@ name: Windows Updates Install Successes
id: 6a80535c-86a6-4b54-894c-4b446d0c701d
version: 1
date: '2017-09-14'
author: David Dorsey, Splunk
type: batch
datamodel: []
description: This search is intended to give you a feel for how often successful Windows
updates are applied in your environments. Fluctuations in these numbers will allow
you to determine when you should be concerned.
how_to_implement: You must be ingesting your Windows Update Logs
author: David Dorsey, Splunk
search: '| tstats `security_content_summariesonly` dc(Updates.dest) as count FROM
datamodel=Updates where Updates.vendor_product="Microsoft Windows" AND Updates.status=installed
by _time span=1d'
tags: {}
how_to_implement: You must be ingesting your Windows Update Logs
references: []
tags:
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
+2 -2
View File
@@ -37,8 +37,8 @@ def prepare_content(stories, detections):
sto_to_nists = {}
sto_to_det = {}
for detection in detections:
if 'analytics_story' in detection['tags']:
for story in detection['tags']['analytics_story']:
if 'analytic_story' in detection['tags']:
for story in detection['tags']['analytic_story']:
if story in sto_to_det.keys():
sto_to_det[story].add(detection['name'])
else:
+40 -33
View File
@@ -105,7 +105,7 @@ def generate_savedsearches_conf(detections, response_tasks, baselines, deploymen
# we are duplicating the code block above for now and just changing variable names to make future
# changes to this data structure separate from the mappings generation
# @todo expose the JSON data structure for newer risk type
annotation_keys = ['mitre_attack', 'kill_chain_phases', 'cis20', 'nist', 'analytics_story']
annotation_keys = ['mitre_attack', 'kill_chain_phases', 'cis20', 'nist', 'analytic_story']
savedsearch_annotations = {}
for key in annotation_keys:
if key == 'mitre_attack':
@@ -154,7 +154,7 @@ def generate_savedsearches_conf(detections, response_tasks, baselines, deploymen
return output_path
def generate_analytics_story_conf(stories, detections, response_tasks, baselines, TEMPLATE_PATH, OUTPUT_PATH):
def generate_analytic_story_conf(stories, detections, response_tasks, baselines, TEMPLATE_PATH, OUTPUT_PATH):
sto_det = map_detection_to_stories(detections)
@@ -280,7 +280,7 @@ def generate_workbench_panels(response_tasks, stories, TEMPLATE_PATH, OUTPUT_PAT
j2_env = Environment(loader=FileSystemLoader(TEMPLATE_PATH),
trim_blocks=True)
template = j2_env.get_template('panel.j2')
file_path = "default/data/ui/panels/workbench_panel_" + response_file_name_xml
file_path = "default/data/ui/panels/workbench_panel_" + response_file_name_xml
output_path = path.join(OUTPUT_PATH, file_path)
response_task['search']= response_task['search'].replace(">","&gt;")
response_task['search']= response_task['search'].replace("<","&lt;")
@@ -334,27 +334,30 @@ def get_deployments(object, deployments):
matched_deployments = []
for deployment in deployments:
if 'analytics_story' in deployment['tags']:
if type(deployment['tags']['analytics_story']) is str:
if 'analytics_story' in object['tags']:
if deployment['tags']['analytics_story'] == object['tags']['analytics_story'] or deployment['tags']['analytics_story']=='all':
if 'analytic_story' in deployment['tags']:
if type(deployment['tags']['analytic_story']) is str:
if 'analytic_story' in object['tags']:
if deployment['tags']['analytic_story'] == object['tags']['analytic_story'] or deployment['tags']['analytic_story']=='all':
matched_deployments.append(deployment)
else:
for story in deployment['tags']['analytics_story']:
if story == object['tags']['analytics_story']:
for story in deployment['tags']['analytic_story']:
if story == object['tags']['analytic_story']:
matched_deployments.append(deployment)
continue
if 'product' in deployment['tags']:
if type(deployment['tags']['product']) is str:
if 'product' in object['tags']:
if deployment['tags']['product'] == object['tags']['analytics_story'] or deployment['tags']['product']=='Splunk Security Analytics for AWS':
matched_deployments.append(deployment)
else:
for story in deployment['tags']['product']:
if story == object['tags']['product']:
matched_deployments.append(deployment)
continue
# Remove this check since deployment files are numbered and detections for Splunk Security Analytics for AWS will only get risk configs.
# if 'product' in deployment['tags']:
# if type(deployment['tags']['product']) is str:
# if 'product' in object['tags']:
# if deployment['tags']['product'] == object['tags']['product'] or deployment['tags']['product']=='Splunk Security Analytics for AWS':
# matched_deployments.append(deployment)
# else:
# for story in deployment['tags']['product']:
# if story == object['tags']['product']:
# matched_deployments.append(deployment)
# continue
if 'detection_name' in deployment['tags']:
@@ -428,10 +431,11 @@ def get_nes_fields(search, deployment):
def map_detection_to_stories(detections):
sto_det = {}
for detection in detections:
if 'analytics_story' in detection['tags']:
for story in detection['tags']['analytics_story']:
if 'analytic_story' in detection['tags']:
for story in detection['tags']['analytic_story']:
if 'type' in detection.keys():
rule_name = str(detection['type'] + ' - ' + detection['name'] + ' - Rule')
if detection['type'] == 'batch':
rule_name = str('ESCU - ' + detection['name'] + ' - Rule')
else:
rule_name = str('ESCU - ' + detection['name'] + ' - Rule')
if not (story in sto_det):
@@ -445,10 +449,11 @@ def map_response_tasks_to_stories(response_tasks):
sto_res = {}
for response_task in response_tasks:
if 'tags' in response_task:
if 'analytics_story' in response_task['tags']:
for story in response_task['tags']['analytics_story']:
if 'analytic_story' in response_task['tags']:
for story in response_task['tags']['analytic_story']:
if 'type' in response_task.keys():
task_name = str(response_task['type'] + ' - ' + response_task['name'] + ' - Response Task' )
if response_task['type'] == 'response':
task_name = str('ESCU - ' + response_task['name'] + ' - Response Task')
else:
task_name = str('ESCU - ' + response_task['name'] + ' - Response Task')
if not (story in sto_res):
@@ -462,10 +467,11 @@ def map_baselines_to_stories(baselines):
sto_bas = {}
for baseline in baselines:
if 'tags' in baseline:
if 'analytics_story' in baseline['tags']:
for story in baseline['tags']['analytics_story']:
if 'analytic_story' in baseline['tags']:
for story in baseline['tags']['analytic_story']:
if 'type' in baseline.keys():
baseline_name = str(baseline['type'] + ' - ' + baseline['name'])
if baseline['type'] == 'batch':
baseline_name = str('ESCU - ' + baseline['name'])
else:
baseline_name = str('ESCU - ' + baseline['name'])
if not (story in sto_bas):
@@ -496,10 +502,11 @@ def prepare_stories(stories, detections):
sto_to_nists = {}
sto_to_det = {}
for detection in detections:
if 'analytics_story' in detection['tags']:
for story in detection['tags']['analytics_story']:
if 'analytic_story' in detection['tags']:
for story in detection['tags']['analytic_story']:
if 'type' in detection.keys():
rule_name = str(detection['type'] + ' - ' + detection['name'] + ' - Rule')
if detection['type'] == 'batch':
rule_name = str('ESCU - ' + detection['name'] + ' - Rule')
else:
rule_name = str('ESCU - ' + detection['name'] + ' - Rule')
@@ -637,14 +644,14 @@ def main(args):
detections = sorted(detections, key=lambda d: d['name'])
# only use ESCU detections to the configurations
detections = [object for object in detections if object["type"].lower() == "escu"]
detections = [object for object in detections if object["type"].lower() == "batch"]
response_tasks = sorted(response_tasks, key=lambda i: i['name'])
baselines = sorted(baselines, key=lambda b: b['name'])
detection_path = generate_savedsearches_conf(detections, response_tasks, baselines, deployments, TEMPLATE_PATH, OUTPUT_PATH)
stories = sorted(stories, key=lambda s: s['name'])
story_path = generate_analytics_story_conf(stories, detections, response_tasks, baselines, TEMPLATE_PATH, OUTPUT_PATH)
story_path = generate_analytic_story_conf(stories, detections, response_tasks, baselines, TEMPLATE_PATH, OUTPUT_PATH)
use_case_lib_path = generate_use_case_library_conf(stories, detections, response_tasks, baselines, TEMPLATE_PATH, OUTPUT_PATH)
+8 -8
View File
@@ -8,7 +8,7 @@
### ESCU DETECTIONS ###
{% for detection in detections %}
[{{ detection.type | default('ESCU') }} - {{ detection.name }} - Rule]
[ESCU - {{ detection.name }} - Rule]
action.escu = 0
action.escu.enabled = 1
description = {{ detection.description }}
@@ -32,7 +32,7 @@ action.escu.known_false_positives = None
action.escu.creation_date = {{ detection.date }}
action.escu.modification_date = {{ detection.date }}
action.escu.confidence = high
action.escu.full_search_name = {{ detection.type | default('ESCU') }} - {{ detection.name }} - Rule
action.escu.full_search_name = ESCU - {{ detection.name }} - Rule
action.escu.search_type = detection
{% if detection.product is defined %}
action.escu.product = {{ detection.product | tojson }}
@@ -42,8 +42,8 @@ action.escu.providing_technologies = {{ detection.providing_technologies | tojso
{% else %}
action.escu.providing_technologies = []
{% endif %}
{% if detection.tags.analytics_story is defined %}
action.escu.analytic_story = {{ detection.tags.analytics_story | tojson }}
{% if detection.tags.analytic_story is defined %}
action.escu.analytic_story = {{ detection.tags.analytic_story | tojson }}
{% if detection.tags.risk_object is defined %}
action.risk = 1
action.risk.param._risk_object = {{ detection.tags.risk_object }}
@@ -58,7 +58,7 @@ cron_schedule = {{ detection.deployment.scheduling.cron_schedule }}
dispatch.earliest_time = {{ detection.deployment.scheduling.earliest_time }}
dispatch.latest_time = {{ detection.deployment.scheduling.latest_time }}
action.correlationsearch.enabled = 1
action.correlationsearch.label = {{ detection.type | default('ESCU') }} - {{ detection.name }} - Rule
action.correlationsearch.label = ESCU - {{ detection.name }} - Rule
action.correlationsearch.annotations = {{ detection.savedsearch_annotations | tojson }}
{% if detection.deployment.scheduling.schedule_window is defined %}
schedule_window = {{ detection.deployment.scheduling.schedule_window }}
@@ -106,8 +106,8 @@ action.escu.full_search_name = {{ baseline.type | default('ESCU') }} - {{ baseli
description = {{ baseline.description }}
action.escu.creation_date = {{ baseline.date }}
action.escu.modification_date = {{ baseline.date }}
{% if baseline.tags.analytics_story is defined %}
action.escu.analytic_story = {{ baseline.tags.analytics_story | tojson }}
{% if baseline.tags.analytic_story is defined %}
action.escu.analytic_story = {{ baseline.tags.analytic_story | tojson }}
{% else %}
action.escu.analytic_story = []
{% endif %}
@@ -154,7 +154,7 @@ description = {{ response_task.description }}
action.escu.creation_date = {{ response_task.date }}
action.escu.modification_date = {{ response_task.date }}
{% if response_task.tags is defined %}
action.escu.analytic_story = {{ response_task.tags.analytics_story | tojson }}
action.escu.analytic_story = {{ response_task.tags.analytic_story | tojson }}
{% else %}
action.escu.analytic_story = []
{% endif %}
+268
View File
@@ -0,0 +1,268 @@
#!/bin/python
from os import path, walk
import sys
import argparse
import yaml
import re
def parse_data_models_from_search(search):
match = re.search(r'from\sdatamodel\s?=\s?([^\s.]*)', search)
if match is not None:
return match.group(1)
return False
def pretty_yaml_detections(REPO_PATH, VERBOSE, content_part):
manifest_files = []
types = ["endpoint", "application", "cloud", "deprecated", "experimental", "network", "web"]
for t in types:
for root, dirs, files in walk(REPO_PATH + "/" + content_part + '/' + t):
for file in files:
if file.endswith(".yml"):
manifest_files.append((path.join(root, file)))
for manifest_file in manifest_files:
pretty_yaml = dict()
if VERBOSE:
print("processing manifest {0}".format(manifest_file))
with open(manifest_file, 'r') as stream:
try:
object = list(yaml.safe_load_all(stream))[0]
except yaml.YAMLError as exc:
print(exc)
print("Error reading {0}".format(manifest_file))
error = True
continue
pretty_yaml['name'] = object['name']
pretty_yaml['id'] = object['id']
pretty_yaml['version'] = object['version']
pretty_yaml['date'] = object['date']
pretty_yaml['author'] = object['author']
pretty_yaml['type'] = object['type']
pretty_yaml['datamodel'] = object['datamodel']
pretty_yaml['description'] = object['description']
pretty_yaml['search'] = object['search']
if 'how_to_implement' in object:
pretty_yaml['how_to_implement'] = object['how_to_implement']
else:
pretty_yaml['how_to_implement'] = ''
pretty_yaml['known_false_positives'] = object['known_false_positives']
if 'references' in object:
pretty_yaml['references'] = object['references']
else:
pretty_yaml['references'] = []
pretty_yaml['tags'] = {key: value for key, value in sorted(object['tags'].items())}
with open(manifest_file, 'w') as file:
documents = yaml.dump(pretty_yaml, file, sort_keys=False)
return manifest_files
def pretty_yaml_baselines(REPO_PATH, VERBOSE, content_part):
manifest_files = []
for root, dirs, files in walk(REPO_PATH + "/" + content_part + '/'):
for file in files:
if file.endswith(".yml"):
manifest_files.append((path.join(root, file)))
for manifest_file in manifest_files:
pretty_yaml = dict()
if VERBOSE:
print("processing manifest {0}".format(manifest_file))
with open(manifest_file, 'r') as stream:
try:
object = list(yaml.safe_load_all(stream))[0]
except yaml.YAMLError as exc:
print(exc)
print("Error reading {0}".format(manifest_file))
error = True
continue
pretty_yaml['name'] = object['name']
pretty_yaml['id'] = object['id']
pretty_yaml['version'] = object['version']
pretty_yaml['date'] = object['date']
pretty_yaml['author'] = object['author']
pretty_yaml['type'] = object['type']
pretty_yaml['datamodel'] = object['datamodel']
pretty_yaml['description'] = object['description']
pretty_yaml['search'] = object['search']
if 'how_to_implement' in object:
pretty_yaml['how_to_implement'] = object['how_to_implement']
else:
pretty_yaml['how_to_implement'] = ''
if 'references' in object:
pretty_yaml['references'] = object['references']
else:
pretty_yaml['references'] = []
pretty_yaml['tags'] = {key: value for key, value in sorted(object['tags'].items())}
with open(manifest_file, 'w') as file:
documents = yaml.dump(pretty_yaml, file, sort_keys=False)
return manifest_files
def pretty_yaml_baselines(REPO_PATH, VERBOSE, content_part):
manifest_files = []
for root, dirs, files in walk(REPO_PATH + "/" + content_part + '/'):
for file in files:
if file.endswith(".yml"):
manifest_files.append((path.join(root, file)))
for manifest_file in manifest_files:
pretty_yaml = dict()
if VERBOSE:
print("processing manifest {0}".format(manifest_file))
with open(manifest_file, 'r') as stream:
try:
object = list(yaml.safe_load_all(stream))[0]
except yaml.YAMLError as exc:
print(exc)
print("Error reading {0}".format(manifest_file))
error = True
continue
pretty_yaml['name'] = object['name']
pretty_yaml['id'] = object['id']
pretty_yaml['version'] = object['version']
pretty_yaml['date'] = object['date']
pretty_yaml['author'] = object['author']
pretty_yaml['type'] = object['type']
pretty_yaml['datamodel'] = object['datamodel']
pretty_yaml['description'] = object['description']
pretty_yaml['search'] = object['search']
if 'how_to_implement' in object:
pretty_yaml['how_to_implement'] = object['how_to_implement']
else:
pretty_yaml['how_to_implement'] = ''
if 'references' in object:
pretty_yaml['references'] = object['references']
else:
pretty_yaml['references'] = []
pretty_yaml['tags'] = {key: value for key, value in sorted(object['tags'].items())}
with open(manifest_file, 'w') as file:
documents = yaml.dump(pretty_yaml, file, sort_keys=False)
return manifest_files
def pretty_yaml_deployments(REPO_PATH, VERBOSE, content_part):
manifest_files = []
for root, dirs, files in walk(REPO_PATH + "/" + content_part + '/'):
for file in files:
if file.endswith(".yml"):
manifest_files.append((path.join(root, file)))
for manifest_file in manifest_files:
pretty_yaml = dict()
if VERBOSE:
print("processing manifest {0}".format(manifest_file))
with open(manifest_file, 'r') as stream:
try:
object = list(yaml.safe_load_all(stream))[0]
except yaml.YAMLError as exc:
print(exc)
print("Error reading {0}".format(manifest_file))
error = True
continue
pretty_yaml['name'] = object['name']
pretty_yaml['id'] = object['id']
pretty_yaml['date'] = object['date']
pretty_yaml['author'] = object['author']
pretty_yaml['description'] = object['description']
pretty_yaml['scheduling'] = object['scheduling']
if 'alert_action' in object:
pretty_yaml['alert_action'] = object['alert_action']
pretty_yaml['tags'] = {key: value for key, value in sorted(object['tags'].items())}
with open(manifest_file, 'w') as file:
documents = yaml.dump(pretty_yaml, file, sort_keys=False)
return manifest_files
def pretty_yaml_stories(REPO_PATH, VERBOSE, content_part):
manifest_files = []
for root, dirs, files in walk(REPO_PATH + "/" + content_part + '/'):
for file in files:
if file.endswith(".yml"):
manifest_files.append((path.join(root, file)))
for manifest_file in manifest_files:
pretty_yaml = dict()
if VERBOSE:
print("processing manifest {0}".format(manifest_file))
with open(manifest_file, 'r') as stream:
try:
object = list(yaml.safe_load_all(stream))[0]
except yaml.YAMLError as exc:
print(exc)
print("Error reading {0}".format(manifest_file))
error = True
continue
pretty_yaml['name'] = object['name']
pretty_yaml['id'] = object['id']
pretty_yaml['version'] = object['version']
pretty_yaml['date'] = object['date']
pretty_yaml['author'] = object['author']
pretty_yaml['type'] = object['type']
pretty_yaml['description'] = object['description']
pretty_yaml['narrative'] = object['narrative']
if 'references' in object:
pretty_yaml['references'] = object['references']
else:
pretty_yaml['references'] = []
pretty_yaml['tags'] = {key: value for key, value in sorted(object['tags'].items())}
with open(manifest_file, 'w') as file:
documents = yaml.dump(pretty_yaml, file, sort_keys=False)
return manifest_files
def pretty_yaml(REPO_PATH, VERBOSE, content_part):
#for root, dirs, files in walk(REPO_PATH + "/"):
manifest_files = []
if content_part == 'detections':
manifest_files = pretty_yaml_detections(REPO_PATH, VERBOSE, content_part)
elif content_part == 'baselines':
manifest_files = pretty_yaml_baselines(REPO_PATH, VERBOSE, content_part)
elif content_part == 'deployments':
manifest_files = pretty_yaml_deployments(REPO_PATH, VERBOSE, content_part)
elif content_part == 'stories':
manifest_files = pretty_yaml_stories(REPO_PATH, VERBOSE, content_part)
return len(manifest_files)
def main(args):
parser = argparse.ArgumentParser(description="keeps yamls in security_content sorted and pretty printed with custom sort keys, \
meant to run quitely for CI, use -v flag to make it bark")
parser.add_argument("-p", "--path", required=True, help="path to security_content repo")
parser.add_argument("-v", "--verbose", required=False, default=False, action='store_true', help="prints verbose output")
# parse them
args = parser.parse_args()
REPO_PATH = args.path
VERBOSE = args.verbose
output = []
pretty_yaml_objects = ['macros','lookups','stories','detections','baselines','response_tasks','responses','deployments']
for pretty_yaml_object in pretty_yaml_objects:
touch_count = pretty_yaml(REPO_PATH, VERBOSE, pretty_yaml_object)
if VERBOSE:
output.append("made {0} {1} pretty".format(touch_count, pretty_yaml_object))
for o in output:
print(o)
print("finished successfully!")
if __name__ == "__main__":
main(sys.argv[1:])
+1 -1
View File
@@ -14,6 +14,6 @@
<g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11">
<text x="30" y="15" fill="#010101" fill-opacity=".3">coverage</text>
<text x="30" y="14">coverage</text>
<text x="80" y="14">80%%</text>
<text x="80" y="14">82%</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 726 B

After

Width:  |  Height:  |  Size: 725 B

+1 -1
View File
@@ -24,7 +24,7 @@ def main(args):
type=float,
default=0.0,
help="Minimum coverage, script return error if target is not met")
parser.add_argument('--types', type=str, nargs="*", help="SSA, ESCU", default=["ESCU", "SSA"])
parser.add_argument('--types', type=str, nargs="*", help="batch, streaming", default=["batch", "streaming"])
parsed = parser.parse_args(args)
populate_coverage(parsed.types)
print_results(parsed.types)
+6 -4
View File
@@ -76,10 +76,8 @@ def validate_objects(REPO_PATH, objects, verbose):
validation_errors, uuids = validate_standard_fields(object, uuids)
errors = errors + validation_errors
if verbose:
print("validating object {0}".format(object['name']))
for object in objects['detections']:
if object['type'] == 'ESCU':
if object['type'] == 'batch':
errors = errors + validate_detection_search(object, objects['macros'])
for object in objects['baselines']:
@@ -132,8 +130,12 @@ def validate_standard_fields(object, uuids):
# the first two fields risk_object, and risk_object_type are an enum of fixed values
# defined by ESCU risk scoring
if 'tags' in object:
# check product tag is present in all objects
if 'product' not in object['tags']:
errors.append("ERROR: a `product` tag is required for object: %s" % object['name'])
# check risk score values
for k,v in object['tags'].items():
if k == 'risk_score':
@@ -1,10 +1,11 @@
name: Enterprise Security deployment configuration
id: bc91a8cd-35e7-4bb2-6140-e756cc46f212
date: '2020-04-27'
description: This configuration file applies to all correlation searches that are used for detection
author: Bhavin Patel
description: This configuration file applies to all correlation searches that are
used for detection
scheduling:
cron_schedule: '0 * * * *'
cron_schedule: 0 * * * *
earliest_time: -70m@m
latest_time: -10m@m
schedule_window: auto
@@ -13,8 +14,8 @@ alert_action:
rule_description: '%description%'
rule_title: '%name%'
nes_fields:
- user
- dest
- src
- user
- dest
- src
tags:
analytics_story: all
+9 -9
View File
@@ -1,22 +1,22 @@
name: Detect ARP Poisoning deployment configuration
id: e1d5b4dc-4cf3-404f-905c-b478bbb20474
date: '2020-08-14'
description: This configuration file applies to the Detect ARP Poisoning detection
author: Mikael Bjerkeland
description: This configuration file applies to the Detect ARP Poisoning detection
scheduling:
cron_schedule: '59 * * * *'
cron_schedule: 59 * * * *
earliest_time: -70m@m
latest_time: -10m@m
schedule_window: auto
alert_action:
notable:
rule_description: 'ARP Poisoning has been detected on interface $src_interface$ on host $orig_host$.
This may be an indication of a MITM attack.'
rule_title: 'ARP Poisoning Detected on $orig_host$'
rule_description: ARP Poisoning has been detected on interface $src_interface$
on host $orig_host$. This may be an indication of a MITM attack.
rule_title: ARP Poisoning Detected on $orig_host$
nes_fields:
- src_interface
- firstTime
- lastTime
- count
- src_interface
- firstTime
- lastTime
- count
tags:
detection_name: Detect ARP Poisoning
+10 -10
View File
@@ -1,23 +1,23 @@
name: Detect Rogue DHCP Server deployment configuration
id: 6e4e20ac-e719-4ebe-a52d-d672cd451dbb
date: '2020-08-14'
description: This configuration file applies to the Detect Rogue DHCP Server detection
author: Mikael Bjerkeland
description: This configuration file applies to the Detect Rogue DHCP Server detection
scheduling:
cron_schedule: '59 * * * *'
cron_schedule: 59 * * * *
earliest_time: -70m@m
latest_time: -10m@m
schedule_window: auto
alert_action:
notable:
rule_description: 'DHCP Snooping has detected a Rogue DHCP Server on $orig_host$ from $src_mac$.
This may be an indication of a MITM attack.'
rule_title: 'Rogue DHCP Server Detected on $orig_host$'
rule_description: DHCP Snooping has detected a Rogue DHCP Server on $orig_host$
from $src_mac$. This may be an indication of a MITM attack.
rule_title: Rogue DHCP Server Detected on $orig_host$
nes_fields:
- src_mac
- firstTime
- lastTime
- count
- message_type
- src_mac
- firstTime
- lastTime
- count
- message_type
tags:
detection_name: Detect Rogue DHCP Server
+2 -2
View File
@@ -1,10 +1,10 @@
name: Credential Dumping Story
id: 52f52a7c-078f-4413-84da-388b61ccac26
date: '2021-01-13'
description: Example for a deployment for a specific Analytics Story
author: Patrick Bareiss
description: Example for a deployment for a specific Analytics Story
scheduling:
cron_schedule: '0 * * * *'
cron_schedule: 0 * * * *
earliest_time: -40m@m
latest_time: -10m@m
schedule_window: auto
@@ -1,10 +1,10 @@
name: Access LSASS Memory for Dump Creation Deployment
id: 974c422f-db3f-4538-8f2a-ee5bf8eec0fa
date: '2021-01-13'
description: Example for a deployment for a specific Detection
author: Patrick Bareiss
description: Example for a deployment for a specific Detection
scheduling:
cron_schedule: '0 * * * *'
cron_schedule: 0 * * * *
earliest_time: -30m@m
latest_time: now
schedule_window: auto
@@ -13,6 +13,6 @@ alert_action:
rule_description: '%description%'
rule_title: '%name% Notable'
nes_fields:
- dest
- dest
tags:
detection_name: Access LSASS Memory for Dump Creation
@@ -1,10 +1,12 @@
name: Enterprise Security config for Splunk Security Analytics for AWS customers
id: bc91a8cd-35e7-4bb2-6140-e756cc46f211
date: '2021-01-20'
description: This configuration file applies to all correlation searches that are used in the Splunk Security Analytics for AWS product. NOTE - Splunk Security Analytics for AWS searches do not need notable configurations
author: Bhavin Patel
description: This configuration file applies to all correlation searches that are
used in the Splunk Security Analytics for AWS product. NOTE - Splunk Security Analytics
for AWS searches do not need notable configurations
scheduling:
cron_schedule: '0 * * * *'
cron_schedule: 0 * * * *
earliest_time: -70m@m
latest_time: -10m@m
schedule_window: auto
@@ -1,13 +1,14 @@
name: Baseline Cache Hourly Updates
id: 1030c701-2acf-4b1a-9970-46c7145caf2d
date: '2020-06-24'
description: This configuration file applies to all baselines with tag deployments Hourly Cache Updates
author: Bhavin Patel
description: This configuration file applies to all baselines with tag deployments
Hourly Cache Updates
scheduling:
cron_schedule: '55 * * * *'
cron_schedule: 55 * * * *
earliest_time: -70m@m
latest_time: -10m@m
schedule_window: auto
tags:
deployments:
- Hourly Cache Updates
- Hourly Cache Updates
@@ -1,13 +1,14 @@
name: Baseline Cache Daily Updates
id: 9541d6f8-fa58-4d48-bb44-6720e39b7b0d
date: '2020-08-18'
description: This configuration file applies to all baselines with tag deployments Daily Cache Updates
author: David Dorsey
description: This configuration file applies to all baselines with tag deployments
Daily Cache Updates
scheduling:
cron_schedule: '10 0 * * *'
cron_schedule: 10 0 * * *
earliest_time: -1450m@m
latest_time: -10m@m
schedule_window: auto
tags:
deployments:
- Daily Cache Updates
- Daily Cache Updates
@@ -1,8 +1,9 @@
name: 90 Day Baseline Searches
id: 6eac9f8b-a35d-4b64-b57f-e5ecde43be6b
date: '2020-06-24'
description: This configuration file applies to all baselines with tag deployments Long Running Baseline
author: Bhavin Patel
description: This configuration file applies to all baselines with tag deployments
Long Running Baseline
scheduling:
cron_schedule: 0 1 1 1,4,7,10 *
earliest_time: -90d@d
@@ -10,4 +11,4 @@ scheduling:
schedule_window: auto
tags:
deployments:
- 90 Day Baseline
- 90 Day Baseline
@@ -1,13 +1,14 @@
name: Weekly Model Rebuild 90 Day Lookback
id: 4b329568-bcff-49fa-8c85-92e95f0f270d
date: '2020-09-07'
description: This configuration file applies to all baselines with tag deployments Weekly Model Rebuild 90 Day Lookback
author: David Dorsey
description: This configuration file applies to all baselines with tag deployments
Weekly Model Rebuild 90 Day Lookback
scheduling:
cron_schedule: '0 2 * * 0'
cron_schedule: 0 2 * * 0
earliest_time: -90d@d
latest_time: -1d@d
schedule_window: auto
tags:
deployments:
- Weekly Model Rebuild 90 Day Lookback
- Weekly Model Rebuild 90 Day Lookback
@@ -2,17 +2,12 @@ name: Email files written outside of the Outlook directory
id: ee18ed37-0802-4268-9435-b3b91aaa18xx
version: 3
date: '2020-07-21'
author: Bhavin Patel, Splunk
type: batch
datamodel:
- Endpoint
description: The search looks at the change-analysis data model and detects email
files created outside the normal Outlook directory.
how_to_implement: To successfully implement this search, you must be ingesting data
that records the file-system activity from your hosts to populate the Endpoint.Filesystem
data model node. This is typically populated via endpoint detection-and-response
products, such as Carbon Black, or by other endpoint data sources, such as Sysmon.
The data used for this search is typically generated via logs that report file-system
reads and writes.
type: ESCU
references: []
author: Bhavin Patel, Splunk
search: '| tstats `security_content_summariesonly` count values(Filesystem.file_path)
as file_path min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Filesystem
where (Filesystem.file_name=*.pst OR Filesystem.file_name=*.ost) Filesystem.file_path
@@ -20,17 +15,28 @@ search: '| tstats `security_content_summariesonly` count values(Filesystem.file_
by Filesystem.action Filesystem.process_id Filesystem.file_name Filesystem.dest
| `drop_dm_object_name("Filesystem")` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`|
`email_files_written_outside_of_the_outlook_directory_filter` '
how_to_implement: To successfully implement this search, you must be ingesting data
that records the file-system activity from your hosts to populate the Endpoint.Filesystem
data model node. This is typically populated via endpoint detection-and-response
product, such as Carbon Black, or by other endpoint data sources, such as Sysmon.
The data used for this search is typically generated via logs that report file-system
reads and writes.
known_false_positives: Administrators and users sometimes prefer backing up their
email data by moving the email files into a different folder. These attempts will
be detected by the search.
references: []
tags:
analytics_story:
analytic_story:
- Collection and Staging
mitre_attack_id:
- T1114.001
kill_chain_phases:
- Actions on Objectives
asset_type: Endpoint
cis20:
- CIS 8
kill_chain_phases:
- Actions on Objectives
mitre_attack_id:
- T1114.001
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
security_domain: endpoint
asset_type: Endpoint
@@ -2,30 +2,36 @@ name: Multiple Okta Users With Invalid Credentails From The Same IP
id: 19cba45f-cad3-4032-8911-0c09e0444552
version: 2
date: '2020-07-21'
author: Rico Valdez, Splunk
type: batch
datamodel: []
description: This search detects Okta login failures due to bad credentials for multiple
users originating from the same ip address.
how_to_implement: This search is specific to Okta and requires Okta logs are being
ingested in your Splunk deployment.
type: ESCU
author: Rico Valdez, Splunk
search: '`okta` outcome.reason=INVALID_CREDENTIALS | rename client.geographicalContext.country
as country, client.geographicalContext.state as state, client.geographicalContext.city
as city | stats min(_time) as firstTime max(_time) as lastTime dc(user) as distinct_users
values(user) as users by src_ip, displayMessage, outcome.reason, country, state,
city | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`
| search distinct_users > 5| `multiple_okta_users_with_invalid_credentails_from_the_same_ip_filter` '
how_to_implement: This search is specific to Okta and requires Okta logs are being
ingested in your Splunk deployment.
known_false_positives: A single public IP address servicing multiple legitmate users
may trigger this search. In addition, the threshold of 5 distinct users may be too
low for your needs. You may modify the included filter macro XXXXXXXXXXXXX to raise
the threshold or except specific IP adresses from triggering this search.
references: []
tags:
analytics_story:
analytic_story:
- Suspicious Okta Activity
mitre_attack_id:
- T1078.001
asset_type: Infrastructure
cis20:
- CIS 16
mitre_attack_id:
- T1078.001
nist:
- DE.CM
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
security_domain: access
asset_type: Infrastructure
@@ -2,25 +2,31 @@ name: Okta Account Lockout Events
id: 62b70968-a0a5-4724-8ac4-67871e6f544d
version: 2
date: '2020-07-21'
description: Detect Okta user lockout events
how_to_implement: This search is specific to Okta and requires Okta logs are being
ingested in your Splunk deployment.
type: ESCU
author: Rico Valdez, Splunk
type: batch
datamodel: []
description: Detect Okta user lockout events
search: '`okta` displayMessage="Max sign in attempts exceeded" | rename client.geographicalContext.country
as country, client.geographicalContext.state as state, client.geographicalContext.city
as city | table _time, user, country, state, city, src_ip | `okta_account_lockout_events_filter` '
how_to_implement: This search is specific to Okta and requires Okta logs are being
ingested in your Splunk deployment.
known_false_positives: None. Account lockouts should be followed up on to determine
if the actual user was the one who caused the lockout, or if it was an unauthorized
actor.
references: []
tags:
analytics_story:
analytic_story:
- Suspicious Okta Activity
mitre_attack_id:
- T1078.001
asset_type: Infrastructure
cis20:
- CIS 16
mitre_attack_id:
- T1078.001
nist:
- DE.CM
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
security_domain: access
asset_type: Infrastructure
@@ -2,24 +2,31 @@ name: Okta Failed SSO Attempts
id: 371a6545-2618-4032-ad84-93386b8698c5
version: 2
date: '2020-07-21'
description: Detect failed Okta SSO events
how_to_implement: This search is specific to Okta and requires Okta logs are being
ingested in your Splunk deployment.
type: ESCU
author: Rico Valdez, Splunk
type: batch
datamodel: []
description: Detect failed Okta SSO events
search: '`okta` displayMessage="User attempted unauthorized access to app" | stats min(_time)
as firstTime max(_time) as lastTime values(app) as Apps count by user, result ,displayMessage,
src_ip | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `okta_failed_sso_attempts_filter` '
src_ip | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`
| `okta_failed_sso_attempts_filter` '
how_to_implement: This search is specific to Okta and requires Okta logs are being
ingested in your Splunk deployment.
known_false_positives: There may be a faulty config preventing legitmate users from
accessing apps they should have access to.
references: []
tags:
analytics_story:
analytic_story:
- Suspicious Okta Activity
mitre_attack_id:
- T1078.001
asset_type: Infrastructure
cis20:
- CIS 16
mitre_attack_id:
- T1078.001
nist:
- DE.CM
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
security_domain: access
asset_type: Infrastructure
@@ -2,31 +2,37 @@ name: Okta User Logins From Multiple Cities
id: 7594fa07-9f34-4d01-81cc-d6af6a5db9e8
version: 2
date: '2020-07-21'
author: Rico Valdez, Splunk
type: batch
datamodel: []
description: This search detects logins from the same user from different states in
a 24 hour period.
how_to_implement: This search is specific to Okta and requires Okta logs are being
ingested in your Splunk deployment.
type: ESCU
author: Rico Valdez, Splunk
search: '`okta` displayMessage="User login to Okta" client.geographicalContext.city!=null
| stats min(_time) as firstTime max(_time) as lastTime dc(client.geographicalContext.city)
as locations values(client.geographicalContext.city) as cities values(client.geographicalContext.state)
as states by user | `security_content_ctime(firstTime)`| `security_content_ctime(lastTime)`
| `okta_user_logins_from_multiple_cities_filter` | search locations > 1'
how_to_implement: This search is specific to Okta and requires Okta logs are being
ingested in your Splunk deployment.
known_false_positives: Users in your enviornment may legitmately be travelling and
loggin in from different locations. This search is useful for those users that should
*not* be travelling for some reason, such as the COVID-19 pandemic. The search also
relies on the geographical information being populated in the Okta logs. It is also
possible that a connection from another region may be attributed to a login from
a remote VPN endpoint.
references: []
tags:
analytics_story:
analytic_story:
- Suspicious Okta Activity
mitre_attack_id:
- T1078.001
asset_type: Infrastructure
cis20:
- CIS 16
mitre_attack_id:
- T1078.001
nist:
- DE.CM
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
security_domain: access
asset_type: Infrastructure
@@ -2,35 +2,41 @@ name: Web Servers Executing Suspicious Processes
id: ec3b7601-689a-4463-94e0-c9f45638efb9
version: 1
date: '2019-04-01'
author: David Dorsey, Splunk
type: batch
datamodel:
- Endpoint
description: This search looks for suspicious processes on all systems labeled as
web servers.
how_to_implement: You must be ingesting data that records process activity from your
hosts to populate the Endpoint data model in the Processes node. You must also be
ingesting logs with both the process name and command line from your endpoints.
The command-line arguments are mapped to the "process" field in the Endpoint data
model. In addition, web servers will need to be identified in the Assets and Identity
Framework of Enterprise Security.
type: ESCU
references: []
author: David Dorsey, Splunk
search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time)
as lastTime from datamodel=Endpoint.Processes where Processes.dest_category="web_server"
AND (Processes.process="*whoami*" OR Processes.process="*ping*" OR Processes.process="*iptables*"
OR Processes.process="*wget*" OR Processes.process="*service*" OR Processes.process="*curl*")
by Processes.process Processes.process_name, Processes.dest Processes.user| `drop_dm_object_name(Processes)`
| `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `web_servers_executing_suspicious_processes_filter`'
how_to_implement: You must be ingesting data that records process activity from your
hosts to populate the Endpoint data model in the Processes node. You must also be
ingesting logs with both the process name and command line from your endpoints.
The command-line arguments are mapped to the "process" field in the Endpoint data
model. In addition, web servers will need to be identified in the Assets and Identity
Framework of Enterprise Security.
known_false_positives: Some of these processes may be used legitimately on web servers
during maintenance or other administrative tasks.
references: []
tags:
analytics_story:
analytic_story:
- Apache Struts Vulnerability
mitre_attack_id:
- T1082
kill_chain_phases:
- Actions on Objectives
asset_type: Web Server
cis20:
- CIS 3
kill_chain_phases:
- Actions on Objectives
mitre_attack_id:
- T1082
nist:
- PR.IP
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
security_domain: endpoint
asset_type: Web Server
@@ -2,48 +2,52 @@ name: Abnormally High Number Of Cloud Instances Destroyed
id: ef629fc9-1583-4590-b62a-f2247fbf7bbf
version: 1
date: '2020-08-21'
description: This search finds for the number successfully destroyed cloud instances for every 4 hour
block. This is split up between weekdays and the weekend. It then applies the probability densitiy model
previously created and alerts on any outliers.
how_to_implement: You must be ingesting your cloud infrastructure logs. You also must run the baseline search
`Baseline Of Cloud Instances Destroyed` to create the probability density function.
type: ESCU
references: []
author: David Dorsey, Splunk
search: '| tstats count as instances_destroyed values(All_Changes.object_id) as object_id from datamodel=Change where
All_Changes.action=deleted
AND All_Changes.status=success AND All_Changes.object_category=instance
by All_Changes.user _time span=1h
| `drop_dm_object_name("All_Changes")`
| eval HourOfDay=strftime(_time, "%H") | eval HourOfDay=floor(HourOfDay/4)*4 | eval DayOfWeek=strftime(_time, "%w") | eval isWeekend=if(DayOfWeek >= 1 AND DayOfWeek <= 5, 0, 1)
| join HourOfDay isWeekend [summary cloud_excessive_instances_destroyed_v1]
| where cardinality >=16
| apply cloud_excessive_instances_destroyed_v1 threshold=0.005 | rename "IsOutlier(instances_destroyed)" as isOutlier
| where isOutlier=1
| eval expected_upper_threshold = mvindex(split(mvindex(BoundaryRanges, -1), ":"), 0)
| eval distance_from_threshold = instances_destroyed - expected_upper_threshold
| table _time, user, instances_destroyed, expected_upper_threshold, distance_from_threshold, object_id
| `abnormally_high_number_of_cloud_instances_destroyed_filter`'
type: batch
datamodel:
- Change
description: This search finds for the number successfully destroyed cloud instances
for every 4 hour block. This is split up between weekdays and the weekend. It then
applies the probability densitiy model previously created and alerts on any outliers.
search: '| tstats count as instances_destroyed values(All_Changes.object_id) as object_id
from datamodel=Change where All_Changes.action=deleted AND All_Changes.status=success
AND All_Changes.object_category=instance by All_Changes.user _time span=1h | `drop_dm_object_name("All_Changes")`
| eval HourOfDay=strftime(_time, "%H") | eval HourOfDay=floor(HourOfDay/4)*4 | eval
DayOfWeek=strftime(_time, "%w") | eval isWeekend=if(DayOfWeek >= 1 AND DayOfWeek
<= 5, 0, 1) | join HourOfDay isWeekend [summary cloud_excessive_instances_destroyed_v1]
| where cardinality >=16 | apply cloud_excessive_instances_destroyed_v1 threshold=0.005
| rename "IsOutlier(instances_destroyed)" as isOutlier | where isOutlier=1 | eval
expected_upper_threshold = mvindex(split(mvindex(BoundaryRanges, -1), ":"), 0) |
eval distance_from_threshold = instances_destroyed - expected_upper_threshold |
table _time, user, instances_destroyed, expected_upper_threshold, distance_from_threshold,
object_id | `abnormally_high_number_of_cloud_instances_destroyed_filter`'
how_to_implement: You must be ingesting your cloud infrastructure logs. You also must
run the baseline search `Baseline Of Cloud Instances Destroyed` to create the probability
density function.
known_false_positives: Many service accounts configured within a cloud infrastructure
are known to exhibit this behavior. Please adjust the threshold values and filter
out service accounts from the output. Always verify if this search alerted on a
human user.
references: []
tags:
analytics_story:
analytic_story:
- Suspicious Cloud Instance Activities
asset_type: Cloud Instance
cis20:
- CIS 13
kill_chain_phases:
- Actions on Objectives
mitre_attack_id:
- T1078.004
cis20:
- CIS 13
nist:
- DE.DP
- DE.AE
product:
- Splunk Security Analytics for AWS
security_domain: Cloud
asset_type: Cloud Instance
risk_score: 10
risk_object_type: user
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
risk_object: user
risk_object_type: user
risk_score: 10
security_domain: Cloud
@@ -2,50 +2,53 @@ name: Abnormally High Number Of Cloud Instances Launched
id: f2361e9f-3928-496c-a556-120cd4223a65
version: 2
date: '2020-08-21'
description: This search finds for the number successfully created cloud instances for every 4 hour
block. This is split up between weekdays and the weekend. It then applies the probability densitiy model
previously created and alerts on any outliers.
how_to_implement: You must be ingesting your cloud infrastructure logs. You also must run the baseline search
`Baseline Of Cloud Instances Launched` to create the probability density function.
type: ESCU
references: []
author: David Dorsey, Splunk
search: '| tstats count as instances_launched values(All_Changes.object_id) as object_id from datamodel=Change where
(All_Changes.action=created)
AND All_Changes.status=success AND All_Changes.object_category=instance
by All_Changes.user _time span=1h
| `drop_dm_object_name("All_Changes")`
| eval HourOfDay=strftime(_time, "%H") | eval HourOfDay=floor(HourOfDay/4)*4 | eval DayOfWeek=strftime(_time, "%w") | eval isWeekend=if(DayOfWeek >= 1 AND DayOfWeek <= 5, 0, 1)
| join HourOfDay isWeekend [summary cloud_excessive_instances_created_v1]
| where cardinality >=16
| apply cloud_excessive_instances_created_v1 threshold=0.005 | rename "IsOutlier(instances_launched)" as isOutlier
| where isOutlier=1
| eval expected_upper_threshold = mvindex(split(mvindex(BoundaryRanges, -1), ":"), 0)
| eval distance_from_threshold = instances_launched - expected_upper_threshold
| table _time, user, instances_launched, expected_upper_threshold, distance_from_threshold, object_id
| `abnormally_high_number_of_cloud_instances_launched_filter`'
type: batch
datamodel:
- Change
description: This search finds for the number successfully created cloud instances
for every 4 hour block. This is split up between weekdays and the weekend. It then
applies the probability densitiy model previously created and alerts on any outliers.
search: '| tstats count as instances_launched values(All_Changes.object_id) as object_id
from datamodel=Change where (All_Changes.action=created) AND All_Changes.status=success
AND All_Changes.object_category=instance by All_Changes.user _time span=1h | `drop_dm_object_name("All_Changes")`
| eval HourOfDay=strftime(_time, "%H") | eval HourOfDay=floor(HourOfDay/4)*4 | eval
DayOfWeek=strftime(_time, "%w") | eval isWeekend=if(DayOfWeek >= 1 AND DayOfWeek
<= 5, 0, 1) | join HourOfDay isWeekend [summary cloud_excessive_instances_created_v1]
| where cardinality >=16 | apply cloud_excessive_instances_created_v1 threshold=0.005
| rename "IsOutlier(instances_launched)" as isOutlier | where isOutlier=1 | eval
expected_upper_threshold = mvindex(split(mvindex(BoundaryRanges, -1), ":"), 0) |
eval distance_from_threshold = instances_launched - expected_upper_threshold | table
_time, user, instances_launched, expected_upper_threshold, distance_from_threshold,
object_id | `abnormally_high_number_of_cloud_instances_launched_filter`'
how_to_implement: You must be ingesting your cloud infrastructure logs. You also must
run the baseline search `Baseline Of Cloud Instances Launched` to create the probability
density function.
known_false_positives: Many service accounts configured within an AWS infrastructure
are known to exhibit this behavior. Please adjust the threshold values and filter
out service accounts from the output. Always verify if this search alerted on a
human user.
references: []
tags:
analytics_story:
analytic_story:
- Cloud Cryptomining
- Suspicious Cloud Instance Activities
asset_type: Cloud Instance
cis20:
- CIS 13
kill_chain_phases:
- Actions on Objectives
mitre_attack_id:
- T1078.004
cis20:
- CIS 13
nist:
- DE.DP
- DE.AE
product:
- Splunk Security Analytics for AWS
security_domain: Cloud
asset_type: Cloud Instance
risk_score: 40
risk_object_type: user
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
risk_object: user
risk_object_type: user
risk_score: 40
security_domain: Cloud
@@ -2,14 +2,12 @@ name: Abnormally High Number Of Cloud Infrastructure API Calls
id: 0840ddf1-8c89-46ff-b730-c8d6722478c0
version: 1
date: '2020-09-07'
author: David Dorsey, Splunk
type: batch
datamodel:
- Change
description: This search will detect a spike in the number of API calls made to your
cloud infrastructure environment by a user.
how_to_implement: You must be ingesting your cloud infrastructure logs. You also must
run the baseline search `Baseline Of Cloud Infrastructure API Calls Per User` to
create the probability density function.
type: ESCU
references: []
author: David Dorsey, Splunk
search: '| tstats count as api_calls values(All_Changes.command) as command from datamodel=Change
where All_Changes.user!=unknown All_Changes.status=success by All_Changes.user _time
span=1h | `drop_dm_object_name("All_Changes")` | eval HourOfDay=strftime(_time,
@@ -21,27 +19,34 @@ search: '| tstats count as api_calls values(All_Changes.command) as command from
-1), ":"), 0) | where api_calls > expected_upper_threshold | eval distance_from_threshold
= api_calls - expected_upper_threshold | table _time, user, command, api_calls,
expected_upper_threshold, distance_from_threshold | `abnormally_high_number_of_cloud_infrastructure_api_calls_filter`'
how_to_implement: You must be ingesting your cloud infrastructure logs. You also must
run the baseline search `Baseline Of Cloud Infrastructure API Calls Per User` to
create the probability density function.
known_false_positives: ''
references: []
tags:
analytics_story:
analytic_story:
- Suspicious Cloud User Activities
asset_type: AWS Instance
automated_detection_testing: passed
cis20:
- CIS 16
dataset:
- https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/suspicious_behaviour/abnormally_high_cloud_instances_launched/cloudtrail_behavioural_detections.json
kill_chain_phases:
- Actions on Objectives
mitre_attack_id:
- T1078.004
cis20:
- CIS 16
nist:
- DE.DP
- DE.CM
- PR.AC
security_domain: network
asset_type: AWS Instance
product:
- Splunk Security Analytics for AWS
risk_score: 25
risk_object_type: user
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
risk_object: user
automated_detection_testing: passed
dataset:
- https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/suspicious_behaviour/abnormally_high_cloud_instances_launched/cloudtrail_behavioural_detections.json
risk_object_type: user
risk_score: 25
security_domain: network
@@ -2,14 +2,12 @@ name: Abnormally High Number Of Cloud Security Group API Calls
id: d4dfb7f3-7a37-498a-b5df-f19334e871af
version: 1
date: '2020-09-07'
author: David Dorsey, Splunk
type: batch
datamodel:
- Change
description: This search will detect a spike in the number of API calls made to your
cloud infrastructure environment about security groups by a user.
how_to_implement: You must be ingesting your cloud infrastructure logs. You also must
run the baseline search `Baseline Of Cloud Security Group API Calls Per User` to
create the probability density function model.
type: ESCU
references: []
author: David Dorsey, Splunk
search: '| tstats count as security_group_api_calls values(All_Changes.command) as
command from datamodel=Change where All_Changes.object_category=firewall AND All_Changes.status=success
by All_Changes.user _time span=1h | `drop_dm_object_name("All_Changes")` | eval
@@ -22,27 +20,34 @@ search: '| tstats count as security_group_api_calls values(All_Changes.command)
> expected_upper_threshold | eval distance_from_threshold = security_group_api_calls
- expected_upper_threshold | table _time, user, command, security_group_api_calls,
expected_upper_threshold, distance_from_threshold | `abnormally_high_number_of_cloud_security_group_api_calls_filter`'
how_to_implement: You must be ingesting your cloud infrastructure logs. You also must
run the baseline search `Baseline Of Cloud Security Group API Calls Per User` to
create the probability density function model.
known_false_positives: ''
references: []
tags:
analytics_story:
analytic_story:
- Suspicious Cloud User Activities
asset_type: AWS Instance
automated_detection_testing: passed
cis20:
- CIS 16
dataset:
- https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/suspicious_behaviour/abnormally_high_cloud_instances_launched/cloudtrail_behavioural_detections.json
kill_chain_phases:
- Actions on Objectives
mitre_attack_id:
- T1078.004
cis20:
- CIS 16
nist:
- DE.DP
- DE.CM
- PR.AC
product:
- Splunk Security Analytics for AWS
security_domain: network
asset_type: AWS Instance
risk_score: 25
risk_object_type: user
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
risk_object: user
automated_detection_testing: passed
dataset:
- https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/suspicious_behaviour/abnormally_high_cloud_instances_launched/cloudtrail_behavioural_detections.json
risk_object_type: user
risk_score: 25
security_domain: network
@@ -2,18 +2,13 @@ name: AWS Cross Account Activity From Previously Unseen Account
id: 21193641-cb96-4a2c-a707-d9b9a7f7792b
version: 1
date: '2020-05-28'
description: This search looks for AssumeRole events where an IAM role in a different
account is requested for the first time. This search is deprecated and have been translated to use the latest Authentication Datamodel.
how_to_implement: You must be ingesting your cloud infrastructure logs from your cloud
provider. You should run the baseline search `Previously Seen AWS Cross Account
Activity - Initial` to build the initial table of source IP address, geographic
locations, and times. You must also enable the second baseline search `Previously
Seen AWS Cross Account Activity - Update` to keep this table up to date and to age
out old data. You can also provide additional filtering for this search by customizing
the `aws_cross_account_activity_from_previously_unseen_account_filter` macro.
type: ESCU
references: []
author: Rico Valdez, Splunk
type: batch
datamodel:
- Authentication
description: This search looks for AssumeRole events where an IAM role in a different
account is requested for the first time. This search is deprecated and have been
translated to use the latest Authentication Datamodel.
search: '| tstats min(_time) as firstTime max(_time) as lastTime from datamodel=Authentication
where Authentication.signature=AssumeRole by Authentication.vendor_account Authentication.user
Authentication.src Authentication.user_role | `drop_dm_object_name(Authentication)`
@@ -24,27 +19,38 @@ search: '| tstats min(_time) as firstTime max(_time) as lastTime from datamodel=
Cross Account Activity","Previously Seen") | where status = "New Cross Account
Activity" | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`|
`aws_cross_account_activity_from_previously_unseen_account_filter`'
how_to_implement: You must be ingesting your cloud infrastructure logs from your cloud
provider. You should run the baseline search `Previously Seen AWS Cross Account
Activity - Initial` to build the initial table of source IP address, geographic
locations, and times. You must also enable the second baseline search `Previously
Seen AWS Cross Account Activity - Update` to keep this table up to date and to age
out old data. You can also provide additional filtering for this search by customizing
the `aws_cross_account_activity_from_previously_unseen_account_filter` macro.
known_false_positives: Using multiple AWS accounts and roles is perfectly valid behavior.
It's suspicious when an account requests privileges of an account it hasn't before.
You should validate with the account owner that this is a legitimate request.
references: []
tags:
analytics_story:
analytic_story:
- Suspicious Cloud Authentication Activities
kill_chain_phases:
- Actions on Objectives
asset_type: AWS Instance
automated_detection_testing: passed
cis20:
- CIS 16
dataset:
- https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/suspicious_behaviour/abnormally_high_cloud_instances_launched/cloudtrail_behavioural_detections.json
kill_chain_phases:
- Actions on Objectives
nist:
- PR.AC
- PR.DS
- DE.AE
security_domain: network
asset_type: AWS Instance
risk_score: 15
risk_object_type: user
risk_object: user
product:
- Splunk Security Analytics for AWS
automated_detection_testing: passed
dataset:
- https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/suspicious_behaviour/abnormally_high_cloud_instances_launched/cloudtrail_behavioural_detections.json
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
risk_object: user
risk_object_type: user
risk_score: 15
security_domain: network
@@ -1,18 +1,14 @@
author: Rod Soto, Patrick Bareiss Splunk
name: AWS Detect Users creating keys with encrypt policy without MFA
id: c79c164f-4b21-4847-98f9-cf6a9f49179e
version: 1
date: '2021-01-11'
author: Rod Soto, Patrick Bareiss Splunk
type: batch
datamodel: []
description: This search provides detection of KMS keys which action kms:Encrypt is
accessible for everyone (also outside of your organization). This is an identicator
that your account is compromised and the attacker uses the encryption key to compromise
another company.
how_to_implement: You must install splunk AWS add on and Splunk App for AWS. This
search works with cloudtrail logs
id: c79c164f-4b21-4847-98f9-cf6a9f49179e
known_false_positives: unknown
name: AWS Detect Users creating keys with encrypt policy without MFA
references:
- https://rhinosecuritylabs.com/aws/s3-ransomware-part-1-attack-vector/
- https://github.com/d1vious/git-wild-hunt
- https://www.youtube.com/watch?v=PgzNib37g0M
search: '`cloudtrail` eventName=CreateKey OR eventName=PutKeyPolicy | spath input=requestParameters.policy
output=key_policy_statements path=Statement{} | mvexpand key_policy_statements |
spath input=key_policy_statements output=key_policy_action_1 path=Action | spath
@@ -22,15 +18,24 @@ search: '`cloudtrail` eventName=CreateKey OR eventName=PutKeyPolicy | spath inpu
| stats count min(_time) as firstTime max(_time) as lastTime by eventName eventSource
eventID awsRegion userIdentity.principalId | `security_content_ctime(firstTime)`|
`security_content_ctime(lastTime)` |`aws_detect_users_creating_keys_with_encrypt_policy_without_mfa_filter`'
how_to_implement: You must install splunk AWS add on and Splunk App for AWS. This
search works with cloudtrail logs
known_false_positives: unknown
references:
- https://rhinosecuritylabs.com/aws/s3-ransomware-part-1-attack-vector/
- https://github.com/d1vious/git-wild-hunt
- https://www.youtube.com/watch?v=PgzNib37g0M
tags:
analytics_story:
analytic_story:
- Ransomware Cloud
asset_type: AWS Account
mitre_attack_id:
- T1486
security_domain: threat
automated_detection_testing: passed
dataset:
- https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1486/aws_kms_key/aws_cloudtrail_events.json
type: ESCU
version: 1
mitre_attack_id:
- T1486
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
security_domain: threat
@@ -1,31 +1,36 @@
author: Rod Soto, Patrick Bareiss Splunk
name: AWS Detect Users with KMS keys performing encryption S3
id: 884a5f59-eec7-4f4a-948b-dbde18225fdc
version: 1
date: '2021-01-11'
author: Rod Soto, Patrick Bareiss Splunk
type: batch
datamodel: []
description: This search provides detection of users with KMS keys performing encryption
specifically against S3 buckets.
how_to_implement: You must install splunk AWS add on and Splunk App for AWS. This
search works with cloudtrail logs
id: 884a5f59-eec7-4f4a-948b-dbde18225fdc
known_false_positives: bucket with S3 encryption
name: AWS Detect Users with KMS keys performing encryption S3
references:
- https://rhinosecuritylabs.com/aws/s3-ransomware-part-1-attack-vector/
- https://github.com/d1vious/git-wild-hunt
- https://www.youtube.com/watch?v=PgzNib37g0M
search: '`cloudtrail` eventName=CopyObject requestParameters.x-amz-server-side-encryption="aws:kms"
| rename requestParameters.bucketName AS bucket_name, requestParameters.x-amz-copy-source
AS src_file, requestParameters.key AS dest_file | stats count min(_time) as firstTime
max(_time) as lastTime values(src_file) AS src_file values(dest_file) AS dest_file
values(userAgent) AS userAgent values(region) AS region values(src) AS src by user
| `security_content_ctime(firstTime)`| `security_content_ctime(lastTime)` |`aws_detect_users_with_kms_keys_performing_encryption_s3_filter`'
how_to_implement: You must install splunk AWS add on and Splunk App for AWS. This
search works with cloudtrail logs
known_false_positives: bucket with S3 encryption
references:
- https://rhinosecuritylabs.com/aws/s3-ransomware-part-1-attack-vector/
- https://github.com/d1vious/git-wild-hunt
- https://www.youtube.com/watch?v=PgzNib37g0M
tags:
analytics_story:
analytic_story:
- Ransomware Cloud
asset_type: S3 Bucket
mitre_attack_id:
- T1486
security_domain: threat
automated_detection_testing: passed
dataset:
- https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1486/s3_file_encryption/aws_cloudtrail_events.json
type: ESCU
version: 1
mitre_attack_id:
- T1486
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
security_domain: threat
@@ -2,14 +2,11 @@ name: AWS Network Access Control List Created with All Open Ports
id: ada0f478-84a8-4641-a3f1-d82362d6bd75
version: 2
date: '2021-01-11'
author: Bhavin Patel, Patrick Bareiss, Splunk
type: batch
datamodel: []
description: The search looks for CloudTrail events to detect if any network ACLs
were created with all the ports open to a specified CIDR.
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS, version 4.4.0 or later, and configure your CloudTrail
inputs.
type: ESCU
references: []
author: Bhavin Patel, Patrick Bareiss, Splunk
search: '`cloudtrail` eventName=CreateNetworkAclEntry OR eventName=ReplaceNetworkAclEntry
requestParameters.ruleAction=allow requestParameters.egress=false requestParameters.aclProtocol=-1
| append [search `cloudtrail` eventName=CreateNetworkAclEntry OR eventName=ReplaceNetworkAclEntry
@@ -20,26 +17,34 @@ search: '`cloudtrail` eventName=CreateNetworkAclEntry OR eventName=ReplaceNetwor
requestParameters.egress requestParameters.aclProtocol requestParameters.portRange.to
requestParameters.portRange.from src userAgent requestParameters.cidrBlock | `security_content_ctime(firstTime)`|
`security_content_ctime(lastTime)` | `aws_network_access_control_list_created_with_all_open_ports_filter`'
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS, version 4.4.0 or later, and configure your CloudTrail
inputs.
known_false_positives: It's possible that an admin has created this ACL with all ports
open for some legitimate purpose however, this should be scoped and not allowed
in production environment.
references: []
tags:
analytics_story:
analytic_story:
- AWS Network ACL Activity
mitre_attack_id:
- T1562.007
kill_chain_phases:
- Actions on Objectives
asset_type: AWS Instance
automated_detection_testing: passed
cis20:
- CIS 11
dataset:
- https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1562.007/aws_create_acl/aws_cloudtrail_events.json
kill_chain_phases:
- Actions on Objectives
mitre_attack_id:
- T1562.007
nist:
- DE.DP
- DE.AE
security_domain: network
asset_type: AWS Instance
risk_score: 10
risk_object_type: user
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
risk_object: userName
automated_detection_testing: passed
dataset:
- https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1562.007/aws_create_acl/aws_cloudtrail_events.json
risk_object_type: user
risk_score: 10
security_domain: network
@@ -2,40 +2,45 @@ name: AWS Network Access Control List Deleted
id: ada0f478-84a8-4641-a3f1-d82362d6fd75
version: 2
date: '2021-01-12'
author: Bhavin Patel, Patrick Bareiss, Splunk
type: batch
datamodel: []
description: Enforcing network-access controls is one of the defensive mechanisms
used by cloud administrators to restrict access to a cloud instance. After the attacker
has gained control of the AWS console by compromising an admin account, they can
delete a network ACL and gain access to the instance from anywhere. This search
will query the CloudTrail logs to detect users deleting network ACLs.
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS (version 4.4.0 or later), then configure your CloudTrail
inputs.
type: ESCU
references: []
author: Bhavin Patel, Patrick Bareiss, Splunk
search: '`cloudtrail` eventName=DeleteNetworkAclEntry requestParameters.egress=false
| fillnull | stats count min(_time) as firstTime max(_time) as lastTime by userName
userIdentity.principalId eventName requestParameters.egress src userAgent | `security_content_ctime(firstTime)`|
`security_content_ctime(lastTime)` | `aws_network_access_control_list_deleted_filter`'
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later)
and Splunk Add-on for AWS (version 4.4.0 or later), then configure your CloudTrail
inputs.
known_false_positives: It's possible that a user has legitimately deleted a network
ACL.
references: []
tags:
analytics_story:
analytic_story:
- AWS Network ACL Activity
mitre_attack_id:
- T1562.007
kill_chain_phases:
- Actions on Objectives
asset_type: AWS Instance
automated_detection_testing: passed
cis20:
- CIS 11
dataset:
- https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1562.007/aws_delete_acl/aws_cloudtrail_events.json
kill_chain_phases:
- Actions on Objectives
mitre_attack_id:
- T1562.007
nist:
- DE.DP
- DE.AE
security_domain: network
asset_type: AWS Instance
risk_score: 5
risk_object_type: user
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
risk_object: userName
automated_detection_testing: passed
dataset:
- https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1562.007/aws_delete_acl/aws_cloudtrail_events.json
risk_object_type: user
risk_score: 5
security_domain: network
@@ -0,0 +1,43 @@
name: AWS SAML Access by Provider User and Principal
id: bbe23980-6019-11eb-ae93-0242ac130002
version: 1
date: '2021-01-26'
author: Rod Soto, Splunk
type: batch
datamodel: []
description: This search provides specific SAML access from specific Service Provider,
user and targeted principal at AWS. This search provides specific information to
detect abnormal access or potential credential hijack or forgery, specially in federated
environments using SAML protocol inside the perimeter or cloud provider.
search: '`cloudtrail` eventName=Assumerolewithsaml | stats count min(_time) as firstTime
max(_time) as lastTime by requestParameters.principalArn requestParameters.roleArn
requestParameters.roleSessionName recipientAccountId responseElements.issuer sourceIPAddress
userAgent | `security_content_ctime(firstTime)`| `security_content_ctime(lastTime)`
|`aws_saml_access_by_provider_user_and_principal_filter`'
how_to_implement: You must install splunk AWS add on and Splunk App for AWS. This
search works with cloudtrail logs
known_false_positives: Attacks using a Golden SAML or SAML assertion hijacks or forgeries
are very difficult to detect as accessing cloud providers with these assertions
looks exactly like normal access, however things such as source IP sourceIPAddress
user, and principal targeted at receiving cloud provider along with endpoint credential
access and abuse detection searches can provide the necessary context to detect
these attacks.
references:
- https://us-cert.cisa.gov/ncas/alerts/aa21-008a
- https://www.splunk.com/en_us/blog/security/a-golden-saml-journey-solarwinds-continued.html
- https://www.fireeye.com/content/dam/fireeye-www/blog/pdfs/wp-m-unc2452-2021-000343-01.pdf
- https://www.cyberark.com/resources/threat-research-blog/golden-saml-newly-discovered-attack-technique-forges-authentication-to-cloud-apps
tags:
analytic_story:
- Cloud Federated Credential Abuse
asset_type: AWS Federated Account
automated_detection_testing: passed
dataset:
- https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1078/assume_role_with_saml/assume_role_with_saml.json
mitre_attack_id:
- T1078
security_domain: threat
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
@@ -0,0 +1,39 @@
name: AWS SAML Update identity provider
id: 2f0604c6-6030-11eb-ae93-0242ac130002
version: 1
date: '2021-01-26'
author: Rod Soto, Splunk
type: batch
datamodel: []
description: This search provides detection of updates to SAML provider in AWS. Updates
to SAML provider need to be monitored closely as they may indicate possible perimeter
compromise of federated credentials, or backdoor access from another cloud provider
set by attacker.
search: '`cloudtrail` eventName=UpdateSAMLProvider | stats count min(_time) as firstTime
max(_time) as lastTime by eventType eventName requestParameters.sAMLProviderArn
userIdentity.sessionContext.sessionIssuer.arn sourceIPAddress userIdentity.accessKeyId
userIdentity.principalId | `security_content_ctime(firstTime)`| `security_content_ctime(lastTime)`
|`aws_saml_update_identity_provider_filter`'
how_to_implement: You must install splunk AWS add on and Splunk App for AWS. This
search works with cloudtrail logs.
known_false_positives: Updating a SAML provider or creating a new one may not necessarily
be malicious however it needs to be closely monitored.
references:
- https://us-cert.cisa.gov/ncas/alerts/aa21-008a
- https://www.splunk.com/en_us/blog/security/a-golden-saml-journey-solarwinds-continued.html
- https://www.fireeye.com/content/dam/fireeye-www/blog/pdfs/wp-m-unc2452-2021-000343-01.pdf
- https://www.cyberark.com/resources/threat-research-blog/golden-saml-newly-discovered-attack-technique-forges-authentication-to-cloud-apps
tags:
analytic_story:
- Cloud Federated Credential Abuse
asset_type: AWS Federated Account
automated_detection_testing: passed
dataset:
- https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1078/update_saml_provider/update_saml_provider.json
mitre_attack_id:
- T1078
security_domain: threat
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud

Some files were not shown because too many files have changed in this diff Show More