From 59340ad7f0bc46eaf826454612b5eda67abb81b5 Mon Sep 17 00:00:00 2001 From: Lou Stella Date: Mon, 10 Apr 2023 17:09:41 -0500 Subject: [PATCH 1/4] Identifier Activity Analysis Dispatch --- ...Identifier_Activity_Analysis_Dispatch.json | 647 ++++++++++++++++++ .../Identifier_Activity_Analysis_Dispatch.png | Bin 0 -> 77608 bytes .../Identifier_Activity_Analysis_Dispatch.py | 263 +++++++ .../Identifier_Activity_Analysis_Dispatch.yml | 18 + 4 files changed, 928 insertions(+) create mode 100644 playbooks/Identifier_Activity_Analysis_Dispatch.json create mode 100644 playbooks/Identifier_Activity_Analysis_Dispatch.png create mode 100644 playbooks/Identifier_Activity_Analysis_Dispatch.py create mode 100644 playbooks/Identifier_Activity_Analysis_Dispatch.yml diff --git a/playbooks/Identifier_Activity_Analysis_Dispatch.json b/playbooks/Identifier_Activity_Analysis_Dispatch.json new file mode 100644 index 0000000000..f72731c7ed --- /dev/null +++ b/playbooks/Identifier_Activity_Analysis_Dispatch.json @@ -0,0 +1,647 @@ +{ + "blockly": false, + "blockly_xml": "", + "category": "Identifier Activity Analysis", + "coa": { + "data": { + "description": "Detects available indicators and routes them to related identifier activity analysis playbooks. The output of the analysis will update any artifacts, tasks, and indicator tags.", + "edges": [ + { + "id": "port_0_to_port_2", + "sourceNode": "0", + "sourcePort": "0_out", + "targetNode": "2", + "targetPort": "2_in" + }, + { + "conditions": [ + { + "index": 0 + } + ], + "id": "port_2_to_port_3", + "sourceNode": "2", + "sourcePort": "2_out", + "targetNode": "3", + "targetPort": "3_in" + }, + { + "conditions": [ + { + "index": 1 + } + ], + "id": "port_2_to_port_4", + "sourceNode": "2", + "sourcePort": "2_out", + "targetNode": "4", + "targetPort": "4_in" + }, + { + "conditions": [ + { + "index": 0 + } + ], + "id": "port_3_to_port_6", + "sourceNode": "3", + "sourcePort": "3_out", + "targetNode": "6", + "targetPort": "6_in" + }, + { + "id": "port_6_to_port_7", + "sourceNode": "6", + "sourcePort": "6_out", + "targetNode": "7", + "targetPort": "7_in" + }, + { + "conditions": [ + { + "index": 0 + } + ], + "id": "port_7_to_port_8", + "sourceNode": "7", + "sourcePort": "7_out", + "targetNode": "8", + "targetPort": "8_in" + }, + { + "conditions": [ + { + "index": 1 + } + ], + "id": "port_7_to_port_9", + "sourceNode": "7", + "sourcePort": "7_out", + "targetNode": "9", + "targetPort": "9_in" + }, + { + "conditions": [ + { + "index": 0 + } + ], + "id": "port_8_to_port_10", + "sourceNode": "8", + "sourcePort": "8_out", + "targetNode": "10", + "targetPort": "10_in" + }, + { + "id": "port_10_to_port_11", + "sourceNode": "10", + "sourcePort": "10_out", + "targetNode": "11", + "targetPort": "11_in" + } + ], + "hash": "359d39b5fb39feffe490768af266255e4a7ce7a4", + "nodes": { + "0": { + "data": { + "advanced": { + "join": [] + }, + "functionName": "on_start", + "id": "0", + "type": "start" + }, + "errors": {}, + "id": "0", + "type": "start", + "warnings": {}, + "x": 300, + "y": -1.9184653865522705e-13 + }, + "1": { + "data": { + "advanced": { + "join": [] + }, + "functionName": "on_finish", + "id": "1", + "type": "end" + }, + "errors": {}, + "id": "1", + "type": "end", + "warnings": {}, + "x": 600, + "y": -1.9184653865522705e-13 + }, + "10": { + "data": { + "advanced": { + "customName": "merge reports", + "customNameId": 0, + "description": "Merge markdown outputs from dispatched playbooks", + "join": [], + "note": "Merge markdown outputs from dispatched playbooks" + }, + "functionId": 1, + "functionName": "merge_reports", + "id": "10", + "parameters": [ + "filtered-data:filter_3:condition_1:dispatch_activity_analysis_playbooks:playbook_output:{outputPath}" + ], + "template": "%%\n{0}\n\n%%", + "type": "format" + }, + "errors": {}, + "id": "10", + "type": "format", + "warnings": {}, + "x": 0, + "y": 1040 + }, + "11": { + "data": { + "advanced": { + "customName": "Update Identifier Activity Analysis Task", + "customNameId": 0, + "join": [], + "note": "Update workbook task that called this playbook." + }, + "customFunction": { + "draftMode": false, + "name": "workbook_task_update", + "repoName": "community" + }, + "functionId": 3, + "functionName": "update_identifier_activity_analysis_task", + "id": "11", + "selectMore": false, + "tab": "customFunctions", + "type": "utility", + "utilities": { + "workbook_task_update": { + "description": "Update a workbook task by task name or the task where the currently running playbook appears. Requires a task_name, container_id, and a note_title, note_content, owner, or status.", + "fields": [ + { + "dataTypes": [ + "*" + ], + "description": "Name of a workbook task or keyword 'playbook' to update the task where the currently running playbook appears. (Required)", + "inputType": "item", + "label": "task_name", + "name": "task_name", + "placeholder": "my_task", + "renderType": "datapath", + "required": false + }, + { + "dataTypes": [ + "*" + ], + "description": "Note title. (Optional)", + "inputType": "item", + "label": "note_title", + "name": "note_title", + "placeholder": "My Title", + "renderType": "datapath", + "required": false + }, + { + "dataTypes": [ + "*" + ], + "description": "Note content. (Optional)", + "inputType": "item", + "label": "note_content", + "name": "note_content", + "placeholder": "My notes", + "renderType": "datapath", + "required": false + }, + { + "dataTypes": [ + "*" + ], + "description": "Accepts 'incomplete', 'in_progress, or 'complete'. (Optional)", + "inputType": "item", + "label": "status", + "name": "status", + "placeholder": "in_progress", + "renderType": "datapath", + "required": false + }, + { + "dataTypes": [ + "*" + ], + "description": "A user to assign as the task owner or keyword 'current\" to assign the task to the user that launched the playbook. (Optional)", + "inputType": "item", + "label": "owner", + "name": "owner", + "placeholder": "username", + "renderType": "datapath", + "required": false + }, + { + "dataTypes": [ + "phantom container id" + ], + "description": "The ID of a SOAR Container. (Required)", + "inputType": "item", + "label": "container", + "name": "container", + "placeholder": "container:id", + "renderType": "datapath", + "required": false + } + ], + "label": "workbook_task_update", + "name": "workbook_task_update" + } + }, + "utilityType": "custom_function", + "values": { + "comment": { + "_internal": [ + "container", + "author", + "trace" + ], + "comment": "No observable data found from playbook(s)." + }, + "workbook_task_update": { + "container": "container:id", + "note_content": "merge_reports:formatted_data", + "note_title": "Identifier Activity Analysis Dispatch", + "owner": null, + "status": "complete", + "task_name": "playbook" + } + } + }, + "errors": {}, + "id": "11", + "type": "utility", + "warnings": {}, + "x": 0, + "y": 1180 + }, + "2": { + "data": { + "advanced": { + "description": "Only dispatch playbooks against new artifacts.", + "join": [], + "note": "Only dispatch playbooks against new artifacts." + }, + "conditions": [ + { + "comparisons": [ + { + "conditionIndex": 0, + "op": "!=", + "param": "artifact:*.id", + "value": "None" + } + ], + "conditionIndex": 0, + "customName": "artifacts exist", + "display": "If", + "logic": "and", + "type": "if" + }, + { + "comparisons": [ + { + "conditionIndex": 1, + "op": "==", + "param": "", + "value": "" + } + ], + "conditionIndex": 1, + "customName": "artifacts do not exist", + "display": "Else", + "logic": "and", + "type": "else" + } + ], + "functionId": 1, + "functionName": "decision_1", + "id": "2", + "type": "decision" + }, + "errors": {}, + "id": "2", + "type": "decision", + "warnings": {}, + "x": 360, + "y": 148 + }, + "3": { + "data": { + "advanced": { + "join": [] + }, + "conditions": [ + { + "comparisons": [ + { + "conditionIndex": 0, + "op": "!=", + "param": "artifact:*.id", + "value": "None" + } + ], + "conditionIndex": 0, + "customName": "artifacts", + "logic": "and" + } + ], + "functionId": 1, + "functionName": "filter_1", + "id": "3", + "type": "filter" + }, + "errors": {}, + "id": "3", + "type": "filter", + "warnings": {}, + "x": 200, + "y": 328 + }, + "4": { + "data": { + "advanced": { + "description": "Comment and exit if there are no new artifacts", + "join": [], + "note": "Comment and exit if there are no new artifacts" + }, + "functionId": 1, + "functionName": "add_comment_1", + "id": "4", + "selectMore": false, + "tab": "apis", + "type": "utility", + "utilities": { + "comment": { + "description": "", + "fields": [ + { + "description": "", + "label": "comment", + "name": "comment", + "placeholder": "Enter a comment", + "renderType": "datapath", + "required": true + }, + { + "hidden": true, + "name": "container", + "required": false + }, + { + "hidden": true, + "name": "author", + "required": false + }, + { + "hidden": true, + "name": "trace", + "required": false + } + ], + "label": "add comment", + "name": "comment" + } + }, + "utilityType": "api", + "values": { + "comment": { + "_internal": [ + "container", + "author", + "trace" + ], + "comment": "No new artifact data found in event." + } + } + }, + "errors": {}, + "id": "4", + "type": "utility", + "warnings": {}, + "x": 420, + "y": 344 + }, + "6": { + "data": { + "advanced": { + "customName": "Dispatch Activity Analysis Playbooks", + "customNameId": 0, + "join": [] + }, + "functionId": 1, + "functionName": "dispatch_activity_analysis_playbooks", + "id": "6", + "inputs": { + "artifact_ids_include": { + "datapaths": [ + "artifact:*.id" + ], + "deduplicate": false + }, + "indicator_tags_exclude": { + "datapaths": [], + "deduplicate": false + }, + "indicator_tags_include": { + "datapaths": [], + "deduplicate": false + }, + "playbook_repo": { + "datapaths": [], + "deduplicate": false + }, + "playbook_tags": { + "datapaths": [ + "identifier_activity" + ], + "deduplicate": false + } + }, + "playbookName": "dispatch_input_playbooks", + "playbookRepo": 1, + "playbookRepoName": "community", + "playbookType": "data", + "synchronous": true, + "type": "playbook" + }, + "errors": {}, + "id": "6", + "type": "playbook", + "warnings": {}, + "x": 140, + "y": 508 + }, + "7": { + "data": { + "advanced": { + "description": "Determine if outputs exist", + "join": [], + "note": "Determine if outputs exist" + }, + "conditions": [ + { + "comparisons": [ + { + "conditionIndex": 0, + "op": "!=", + "param": "dispatch_activity_analysis_playbooks:playbook_output:observable", + "value": "None" + } + ], + "conditionIndex": 0, + "customName": "outputs exist", + "display": "If", + "logic": "and", + "type": "if" + }, + { + "comparisons": [ + { + "conditionIndex": 1, + "op": "==", + "param": "", + "value": "" + } + ], + "conditionIndex": 1, + "customName": "outputs do not exist", + "display": "Else", + "logic": "and", + "type": "else" + } + ], + "functionId": 2, + "functionName": "decision_2", + "id": "7", + "type": "decision" + }, + "errors": {}, + "id": "7", + "type": "decision", + "warnings": {}, + "x": 220, + "y": 672 + }, + "8": { + "data": { + "advanced": { + "join": [] + }, + "conditions": [ + { + "comparisons": [ + { + "conditionIndex": 0, + "op": "!=", + "param": "dispatch_activity_analysis_playbooks:playbook_output:markdown_report", + "value": "None" + } + ], + "conditionIndex": 0, + "customName": "outputs exist", + "logic": "and" + } + ], + "functionId": 3, + "functionName": "filter_3", + "id": "8", + "type": "filter" + }, + "errors": {}, + "id": "8", + "type": "filter", + "warnings": {}, + "x": 60, + "y": 852 + }, + "9": { + "data": { + "advanced": { + "join": [] + }, + "functionId": 2, + "functionName": "add_comment_2", + "id": "9", + "selectMore": false, + "tab": "apis", + "type": "utility", + "utilities": { + "comment": { + "description": "", + "fields": [ + { + "description": "", + "label": "comment", + "name": "comment", + "placeholder": "Enter a comment", + "renderType": "datapath", + "required": true + }, + { + "hidden": true, + "name": "container", + "required": false + }, + { + "hidden": true, + "name": "author", + "required": false + }, + { + "hidden": true, + "name": "trace", + "required": false + } + ], + "label": "add comment", + "name": "comment" + } + }, + "utilityType": "api", + "values": { + "comment": { + "_internal": [ + "container", + "author", + "trace" + ], + "comment": "No observable data found from playbook(s)." + } + } + }, + "errors": {}, + "id": "9", + "type": "utility", + "warnings": {}, + "x": 280, + "y": 868 + } + }, + "notes": "Outputs:\nMarkdown note on cases\nMarks workbook task complete" + }, + "input_spec": null, + "output_spec": null, + "playbook_type": "automation", + "python_version": "3", + "schema": "5.0.9", + "version": "6.0.0.114895" + }, + "create_time": "2023-04-10T22:04:40.934992+00:00", + "draft_mode": false, + "labels": [ + "*" + ], + "tags": [] +} \ No newline at end of file diff --git a/playbooks/Identifier_Activity_Analysis_Dispatch.png b/playbooks/Identifier_Activity_Analysis_Dispatch.png new file mode 100644 index 0000000000000000000000000000000000000000..50dab2cb294b6b8b4ed15994fac1948c5e9ba665 GIT binary patch literal 77608 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 =Uyk7`dG>fce%^hRg8z9e_{%gU?yYr| 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 ND61-ydE4;y{|84>*#!Uq literal 0 HcmV?d00001 diff --git a/playbooks/Identifier_Activity_Analysis_Dispatch.py b/playbooks/Identifier_Activity_Analysis_Dispatch.py new file mode 100644 index 0000000000..fede807dfe --- /dev/null +++ b/playbooks/Identifier_Activity_Analysis_Dispatch.py @@ -0,0 +1,263 @@ +""" +Detects available indicators and routes them to related identifier activity analysis playbooks. The output of the analysis will update any artifacts, tasks, and indicator tags. +""" + + +import phantom.rules as phantom +import json +from datetime import datetime, timedelta + + +@phantom.playbook_block() +def on_start(container): + phantom.debug('on_start() called') + + # call 'decision_1' block + decision_1(container=container) + + return + +@phantom.playbook_block() +def decision_1(action=None, success=None, container=None, results=None, handle=None, filtered_artifacts=None, filtered_results=None, custom_function=None, **kwargs): + phantom.debug("decision_1() called") + + ################################################################################ + # Only dispatch playbooks against new artifacts. + ################################################################################ + + # check for 'if' condition 1 + found_match_1 = phantom.decision( + container=container, + conditions=[ + ["artifact:*.id", "!=", None] + ]) + + # call connected blocks if condition 1 matched + if found_match_1: + filter_1(action=action, success=success, container=container, results=results, handle=handle) + return + + # check for 'else' condition 2 + add_comment_1(action=action, success=success, container=container, results=results, handle=handle) + + return + + +@phantom.playbook_block() +def filter_1(action=None, success=None, container=None, results=None, handle=None, filtered_artifacts=None, filtered_results=None, custom_function=None, **kwargs): + phantom.debug("filter_1() called") + + # collect filtered artifact ids and results for 'if' condition 1 + matched_artifacts_1, matched_results_1 = phantom.condition( + container=container, + conditions=[ + ["artifact:*.id", "!=", None] + ], + name="filter_1:condition_1") + + # call connected blocks if filtered artifacts or results + if matched_artifacts_1 or matched_results_1: + dispatch_activity_analysis_playbooks(action=action, success=success, container=container, results=results, handle=handle, filtered_artifacts=matched_artifacts_1, filtered_results=matched_results_1) + + return + + +@phantom.playbook_block() +def add_comment_1(action=None, success=None, container=None, results=None, handle=None, filtered_artifacts=None, filtered_results=None, custom_function=None, **kwargs): + phantom.debug("add_comment_1() called") + + ################################################################################ + # Comment and exit if there are no new artifacts + ################################################################################ + + ################################################################################ + ## Custom Code Start + ################################################################################ + + # Write your custom code here... + + ################################################################################ + ## Custom Code End + ################################################################################ + + phantom.comment(container=container, comment="No new artifact data found in event.") + + return + + +@phantom.playbook_block() +def dispatch_activity_analysis_playbooks(action=None, success=None, container=None, results=None, handle=None, filtered_artifacts=None, filtered_results=None, custom_function=None, **kwargs): + phantom.debug("dispatch_activity_analysis_playbooks() called") + + container_artifact_data = phantom.collect2(container=container, datapath=["artifact:*.id"]) + + container_artifact_header_item_0 = [item[0] for item in container_artifact_data] + + inputs = { + "playbook_repo": [], + "playbook_tags": ["identifier_activity"], + "artifact_ids_include": container_artifact_header_item_0, + "indicator_tags_exclude": [], + "indicator_tags_include": [], + } + + ################################################################################ + ## Custom Code Start + ################################################################################ + + # Write your custom code here... + + ################################################################################ + ## Custom Code End + ################################################################################ + + # call playbook "community/dispatch_input_playbooks", returns the playbook_run_id + playbook_run_id = phantom.playbook("community/dispatch_input_playbooks", container=container, name="dispatch_activity_analysis_playbooks", callback=decision_2, inputs=inputs) + + return + + +@phantom.playbook_block() +def decision_2(action=None, success=None, container=None, results=None, handle=None, filtered_artifacts=None, filtered_results=None, custom_function=None, **kwargs): + phantom.debug("decision_2() called") + + ################################################################################ + # Determine if outputs exist + ################################################################################ + + # check for 'if' condition 1 + found_match_1 = phantom.decision( + container=container, + conditions=[ + ["dispatch_activity_analysis_playbooks:playbook_output:observable", "!=", None] + ]) + + # call connected blocks if condition 1 matched + if found_match_1: + filter_3(action=action, success=success, container=container, results=results, handle=handle) + return + + # check for 'else' condition 2 + add_comment_2(action=action, success=success, container=container, results=results, handle=handle) + + return + + +@phantom.playbook_block() +def filter_3(action=None, success=None, container=None, results=None, handle=None, filtered_artifacts=None, filtered_results=None, custom_function=None, **kwargs): + phantom.debug("filter_3() called") + + # collect filtered artifact ids and results for 'if' condition 1 + matched_artifacts_1, matched_results_1 = phantom.condition( + container=container, + conditions=[ + ["dispatch_activity_analysis_playbooks:playbook_output:markdown_report", "!=", None] + ], + name="filter_3:condition_1") + + # call connected blocks if filtered artifacts or results + if matched_artifacts_1 or matched_results_1: + merge_reports(action=action, success=success, container=container, results=results, handle=handle, filtered_artifacts=matched_artifacts_1, filtered_results=matched_results_1) + + return + + +@phantom.playbook_block() +def add_comment_2(action=None, success=None, container=None, results=None, handle=None, filtered_artifacts=None, filtered_results=None, custom_function=None, **kwargs): + phantom.debug("add_comment_2() called") + + ################################################################################ + ## Custom Code Start + ################################################################################ + + # Write your custom code here... + + ################################################################################ + ## Custom Code End + ################################################################################ + + phantom.comment(container=container, comment="No observable data found from playbook(s).") + + return + + +@phantom.playbook_block() +def merge_reports(action=None, success=None, container=None, results=None, handle=None, filtered_artifacts=None, filtered_results=None, custom_function=None, **kwargs): + phantom.debug("merge_reports() called") + + ################################################################################ + # Merge markdown outputs from dispatched playbooks + ################################################################################ + + template = """%%\n{0}\n\n%%""" + + # parameter list for template variable replacement + parameters = [ + "filtered-data:filter_3:condition_1:dispatch_activity_analysis_playbooks:playbook_output:{outputPath}" + ] + + ################################################################################ + ## Custom Code Start + ################################################################################ + + # Write your custom code here... + + ################################################################################ + ## Custom Code End + ################################################################################ + + phantom.format(container=container, template=template, parameters=parameters, name="merge_reports") + + update_identifier_activity_analysis_task(container=container) + + return + + +@phantom.playbook_block() +def update_identifier_activity_analysis_task(action=None, success=None, container=None, results=None, handle=None, filtered_artifacts=None, filtered_results=None, custom_function=None, **kwargs): + phantom.debug("update_identifier_activity_analysis_task() called") + + id_value = container.get("id", None) + merge_reports = phantom.get_format_data(name="merge_reports") + + parameters = [] + + parameters.append({ + "owner": None, + "status": "complete", + "container": id_value, + "task_name": "playbook", + "note_title": "Identifier Activity Analysis Dispatch", + "note_content": merge_reports, + }) + + ################################################################################ + ## Custom Code Start + ################################################################################ + + # Write your custom code here... + + ################################################################################ + ## Custom Code End + ################################################################################ + + phantom.custom_function(custom_function="community/workbook_task_update", parameters=parameters, name="update_identifier_activity_analysis_task") + + return + + +@phantom.playbook_block() +def on_finish(container, summary): + phantom.debug("on_finish() called") + + ################################################################################ + ## Custom Code Start + ################################################################################ + + # Write your custom code here... + + ################################################################################ + ## Custom Code End + ################################################################################ + + return \ No newline at end of file diff --git a/playbooks/Identifier_Activity_Analysis_Dispatch.yml b/playbooks/Identifier_Activity_Analysis_Dispatch.yml new file mode 100644 index 0000000000..0d8119bfe0 --- /dev/null +++ b/playbooks/Identifier_Activity_Analysis_Dispatch.yml @@ -0,0 +1,18 @@ +name: Identifier Activity Analysis Dispatch +id: fc0edc96-ab1f-48b9-1b4d-63da52dbfa74 +version: 1 +date: '2023-02-28' +author: Lou Stella, Splunk +type: Investigation +description: "Detects available indicators and routes them to related identifier activity analysis playbooks. The output of the analysis will update any artifacts, tasks, and indicator tags." +playbook: Identifier_Activity_Analysis_Dispatch +how_to_implement: This playbook looks for artifacts and then dispatches the community Related Tickets playbooks. This playbook takes the output of those playbooks and nicely formats them into notes and tags indicators with their results. +references: [] +app_list: [] +tags: + platform_tags: [] + playbook_type: Automation + vpe_type: Modern + playbook_fields: [] + product: + - Splunk SOAR \ No newline at end of file From aaf23ac73b786b93caae49939c9ad6c949498364 Mon Sep 17 00:00:00 2001 From: Lou Stella Date: Fri, 14 Apr 2023 16:06:02 -0500 Subject: [PATCH 2/4] Tooltips, names, connected End block --- ...Identifier_Activity_Analysis_Dispatch.json | 74 ++++++++++++++----- .../Identifier_Activity_Analysis_Dispatch.py | 64 ++++++++++------ 2 files changed, 96 insertions(+), 42 deletions(-) diff --git a/playbooks/Identifier_Activity_Analysis_Dispatch.json b/playbooks/Identifier_Activity_Analysis_Dispatch.json index f72731c7ed..3b3f0492bf 100644 --- a/playbooks/Identifier_Activity_Analysis_Dispatch.json +++ b/playbooks/Identifier_Activity_Analysis_Dispatch.json @@ -98,9 +98,16 @@ "sourcePort": "10_out", "targetNode": "11", "targetPort": "11_in" + }, + { + "id": "port_11_to_port_1", + "sourceNode": "11", + "sourcePort": "11_out", + "targetNode": "1", + "targetPort": "1_in" } ], - "hash": "359d39b5fb39feffe490768af266255e4a7ce7a4", + "hash": "0f8bdd2e4ac47ac1e8f90ba38d41508686ba9d2e", "nodes": { "0": { "data": { @@ -116,7 +123,7 @@ "type": "start", "warnings": {}, "x": 300, - "y": -1.9184653865522705e-13 + "y": -2.5579538487363607e-13 }, "1": { "data": { @@ -131,8 +138,8 @@ "id": "1", "type": "end", "warnings": {}, - "x": 600, - "y": -1.9184653865522705e-13 + "x": 180, + "y": 1380 }, "10": { "data": { @@ -147,7 +154,7 @@ "functionName": "merge_reports", "id": "10", "parameters": [ - "filtered-data:filter_3:condition_1:dispatch_activity_analysis_playbooks:playbook_output:{outputPath}" + "filtered-data:markdown_filter:condition_1:dispatch_activity_analysis_playbooks:playbook_output:{outputPath}" ], "template": "%%\n{0}\n\n%%", "type": "format" @@ -289,6 +296,8 @@ "2": { "data": { "advanced": { + "customName": "route_artifacts", + "customNameId": 0, "description": "Only dispatch playbooks against new artifacts.", "join": [], "note": "Only dispatch playbooks against new artifacts." @@ -326,7 +335,7 @@ } ], "functionId": 1, - "functionName": "decision_1", + "functionName": "route_artifacts", "id": "2", "type": "decision" }, @@ -340,7 +349,11 @@ "3": { "data": { "advanced": { - "join": [] + "customName": "filter_inputs", + "customNameId": 0, + "description": "Ensure there are artifacts", + "join": [], + "note": "Ensure there are artifacts" }, "conditions": [ { @@ -358,7 +371,7 @@ } ], "functionId": 1, - "functionName": "filter_1", + "functionName": "filter_inputs", "id": "3", "type": "filter" }, @@ -372,12 +385,14 @@ "4": { "data": { "advanced": { + "customName": "No Artifacts", + "customNameId": 0, "description": "Comment and exit if there are no new artifacts", "join": [], "note": "Comment and exit if there are no new artifacts" }, "functionId": 1, - "functionName": "add_comment_1", + "functionName": "no_artifacts", "id": "4", "selectMore": false, "tab": "apis", @@ -431,7 +446,7 @@ "type": "utility", "warnings": {}, "x": 420, - "y": 344 + "y": 340 }, "6": { "data": { @@ -459,7 +474,9 @@ "deduplicate": false }, "playbook_repo": { - "datapaths": [], + "datapaths": [ + "" + ], "deduplicate": false }, "playbook_tags": { @@ -486,6 +503,8 @@ "7": { "data": { "advanced": { + "customName": "route outputs", + "customNameId": 0, "description": "Determine if outputs exist", "join": [], "note": "Determine if outputs exist" @@ -523,7 +542,7 @@ } ], "functionId": 2, - "functionName": "decision_2", + "functionName": "route_outputs", "id": "7", "type": "decision" }, @@ -537,7 +556,11 @@ "8": { "data": { "advanced": { - "join": [] + "customName": "markdown filter", + "customNameId": 0, + "description": "Ensure there are outputs", + "join": [], + "note": "Ensure there are outputs" }, "conditions": [ { @@ -555,7 +578,7 @@ } ], "functionId": 3, - "functionName": "filter_3", + "functionName": "markdown_filter", "id": "8", "type": "filter" }, @@ -564,15 +587,19 @@ "type": "filter", "warnings": {}, "x": 60, - "y": 852 + "y": 860 }, "9": { "data": { "advanced": { - "join": [] + "customName": "No Outputs", + "customNameId": 0, + "description": "Comment and exit if there are no observables returned", + "join": [], + "note": "Comment and exit if there are no observables returned" }, "functionId": 2, - "functionName": "add_comment_2", + "functionName": "no_outputs", "id": "9", "selectMore": false, "tab": "apis", @@ -632,13 +659,22 @@ "notes": "Outputs:\nMarkdown note on cases\nMarks workbook task complete" }, "input_spec": null, - "output_spec": null, + "output_spec": [ + { + "contains": [], + "datapaths": [], + "deduplicate": false, + "description": "", + "metadata": {}, + "name": "observable" + } + ], "playbook_type": "automation", "python_version": "3", "schema": "5.0.9", "version": "6.0.0.114895" }, - "create_time": "2023-04-10T22:04:40.934992+00:00", + "create_time": "2023-04-14T16:52:38.752503+00:00", "draft_mode": false, "labels": [ "*" diff --git a/playbooks/Identifier_Activity_Analysis_Dispatch.py b/playbooks/Identifier_Activity_Analysis_Dispatch.py index fede807dfe..b03660acee 100644 --- a/playbooks/Identifier_Activity_Analysis_Dispatch.py +++ b/playbooks/Identifier_Activity_Analysis_Dispatch.py @@ -12,14 +12,14 @@ from datetime import datetime, timedelta def on_start(container): phantom.debug('on_start() called') - # call 'decision_1' block - decision_1(container=container) + # call 'route_artifacts' block + route_artifacts(container=container) return @phantom.playbook_block() -def decision_1(action=None, success=None, container=None, results=None, handle=None, filtered_artifacts=None, filtered_results=None, custom_function=None, **kwargs): - phantom.debug("decision_1() called") +def route_artifacts(action=None, success=None, container=None, results=None, handle=None, filtered_artifacts=None, filtered_results=None, custom_function=None, **kwargs): + phantom.debug("route_artifacts() called") ################################################################################ # Only dispatch playbooks against new artifacts. @@ -34,18 +34,22 @@ def decision_1(action=None, success=None, container=None, results=None, handle=N # call connected blocks if condition 1 matched if found_match_1: - filter_1(action=action, success=success, container=container, results=results, handle=handle) + filter_inputs(action=action, success=success, container=container, results=results, handle=handle) return # check for 'else' condition 2 - add_comment_1(action=action, success=success, container=container, results=results, handle=handle) + no_artifacts(action=action, success=success, container=container, results=results, handle=handle) return @phantom.playbook_block() -def filter_1(action=None, success=None, container=None, results=None, handle=None, filtered_artifacts=None, filtered_results=None, custom_function=None, **kwargs): - phantom.debug("filter_1() called") +def filter_inputs(action=None, success=None, container=None, results=None, handle=None, filtered_artifacts=None, filtered_results=None, custom_function=None, **kwargs): + phantom.debug("filter_inputs() called") + + ################################################################################ + # Ensure there are artifacts + ################################################################################ # collect filtered artifact ids and results for 'if' condition 1 matched_artifacts_1, matched_results_1 = phantom.condition( @@ -53,7 +57,7 @@ def filter_1(action=None, success=None, container=None, results=None, handle=Non conditions=[ ["artifact:*.id", "!=", None] ], - name="filter_1:condition_1") + name="filter_inputs:condition_1") # call connected blocks if filtered artifacts or results if matched_artifacts_1 or matched_results_1: @@ -63,8 +67,8 @@ def filter_1(action=None, success=None, container=None, results=None, handle=Non @phantom.playbook_block() -def add_comment_1(action=None, success=None, container=None, results=None, handle=None, filtered_artifacts=None, filtered_results=None, custom_function=None, **kwargs): - phantom.debug("add_comment_1() called") +def no_artifacts(action=None, success=None, container=None, results=None, handle=None, filtered_artifacts=None, filtered_results=None, custom_function=None, **kwargs): + phantom.debug("no_artifacts() called") ################################################################################ # Comment and exit if there are no new artifacts @@ -94,7 +98,7 @@ def dispatch_activity_analysis_playbooks(action=None, success=None, container=No container_artifact_header_item_0 = [item[0] for item in container_artifact_data] inputs = { - "playbook_repo": [], + "playbook_repo": [""], "playbook_tags": ["identifier_activity"], "artifact_ids_include": container_artifact_header_item_0, "indicator_tags_exclude": [], @@ -112,14 +116,14 @@ def dispatch_activity_analysis_playbooks(action=None, success=None, container=No ################################################################################ # call playbook "community/dispatch_input_playbooks", returns the playbook_run_id - playbook_run_id = phantom.playbook("community/dispatch_input_playbooks", container=container, name="dispatch_activity_analysis_playbooks", callback=decision_2, inputs=inputs) + playbook_run_id = phantom.playbook("community/dispatch_input_playbooks", container=container, name="dispatch_activity_analysis_playbooks", callback=route_outputs, inputs=inputs) return @phantom.playbook_block() -def decision_2(action=None, success=None, container=None, results=None, handle=None, filtered_artifacts=None, filtered_results=None, custom_function=None, **kwargs): - phantom.debug("decision_2() called") +def route_outputs(action=None, success=None, container=None, results=None, handle=None, filtered_artifacts=None, filtered_results=None, custom_function=None, **kwargs): + phantom.debug("route_outputs() called") ################################################################################ # Determine if outputs exist @@ -134,18 +138,22 @@ def decision_2(action=None, success=None, container=None, results=None, handle=N # call connected blocks if condition 1 matched if found_match_1: - filter_3(action=action, success=success, container=container, results=results, handle=handle) + markdown_filter(action=action, success=success, container=container, results=results, handle=handle) return # check for 'else' condition 2 - add_comment_2(action=action, success=success, container=container, results=results, handle=handle) + no_outputs(action=action, success=success, container=container, results=results, handle=handle) return @phantom.playbook_block() -def filter_3(action=None, success=None, container=None, results=None, handle=None, filtered_artifacts=None, filtered_results=None, custom_function=None, **kwargs): - phantom.debug("filter_3() called") +def markdown_filter(action=None, success=None, container=None, results=None, handle=None, filtered_artifacts=None, filtered_results=None, custom_function=None, **kwargs): + phantom.debug("markdown_filter() called") + + ################################################################################ + # Ensure there are outputs + ################################################################################ # collect filtered artifact ids and results for 'if' condition 1 matched_artifacts_1, matched_results_1 = phantom.condition( @@ -153,7 +161,7 @@ def filter_3(action=None, success=None, container=None, results=None, handle=Non conditions=[ ["dispatch_activity_analysis_playbooks:playbook_output:markdown_report", "!=", None] ], - name="filter_3:condition_1") + name="markdown_filter:condition_1") # call connected blocks if filtered artifacts or results if matched_artifacts_1 or matched_results_1: @@ -163,8 +171,12 @@ def filter_3(action=None, success=None, container=None, results=None, handle=Non @phantom.playbook_block() -def add_comment_2(action=None, success=None, container=None, results=None, handle=None, filtered_artifacts=None, filtered_results=None, custom_function=None, **kwargs): - phantom.debug("add_comment_2() called") +def no_outputs(action=None, success=None, container=None, results=None, handle=None, filtered_artifacts=None, filtered_results=None, custom_function=None, **kwargs): + phantom.debug("no_outputs() called") + + ################################################################################ + # Comment and exit if there are no observables returned + ################################################################################ ################################################################################ ## Custom Code Start @@ -193,7 +205,7 @@ def merge_reports(action=None, success=None, container=None, results=None, handl # parameter list for template variable replacement parameters = [ - "filtered-data:filter_3:condition_1:dispatch_activity_analysis_playbooks:playbook_output:{outputPath}" + "filtered-data:markdown_filter:condition_1:dispatch_activity_analysis_playbooks:playbook_output:{outputPath}" ] ################################################################################ @@ -250,6 +262,10 @@ def update_identifier_activity_analysis_task(action=None, success=None, containe def on_finish(container, summary): phantom.debug("on_finish() called") + output = { + "observable": [], + } + ################################################################################ ## Custom Code Start ################################################################################ @@ -260,4 +276,6 @@ def on_finish(container, summary): ## Custom Code End ################################################################################ + phantom.save_playbook_output_data(output=output) + return \ No newline at end of file From 483d3bad6ab9ef985495709e883ca6ce321e0b00 Mon Sep 17 00:00:00 2001 From: Lou Stella Date: Thu, 4 May 2023 15:24:43 -0500 Subject: [PATCH 3/4] Added D3FEND Tag --- playbooks/Identifier_Activity_Analysis_Dispatch.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/playbooks/Identifier_Activity_Analysis_Dispatch.json b/playbooks/Identifier_Activity_Analysis_Dispatch.json index 3b3f0492bf..25001b4af3 100644 --- a/playbooks/Identifier_Activity_Analysis_Dispatch.json +++ b/playbooks/Identifier_Activity_Analysis_Dispatch.json @@ -123,7 +123,7 @@ "type": "start", "warnings": {}, "x": 300, - "y": -2.5579538487363607e-13 + "y": -3.197442310920451e-13 }, "1": { "data": { @@ -679,5 +679,7 @@ "labels": [ "*" ], - "tags": [] + "tags": [ + "D3-IAA" + ] } \ No newline at end of file From 66539b1f12293e222565266c541db1a0ad165239 Mon Sep 17 00:00:00 2001 From: Lou Stella Date: Fri, 19 May 2023 08:58:05 -0500 Subject: [PATCH 4/4] Last style update --- playbooks/Identifier_Activity_Analysis_Dispatch.json | 10 +++++----- playbooks/Identifier_Activity_Analysis_Dispatch.py | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/playbooks/Identifier_Activity_Analysis_Dispatch.json b/playbooks/Identifier_Activity_Analysis_Dispatch.json index 25001b4af3..1b1481ba2d 100644 --- a/playbooks/Identifier_Activity_Analysis_Dispatch.json +++ b/playbooks/Identifier_Activity_Analysis_Dispatch.json @@ -107,7 +107,7 @@ "targetPort": "1_in" } ], - "hash": "0f8bdd2e4ac47ac1e8f90ba38d41508686ba9d2e", + "hash": "420742e453b73f08fcf67587b7e96d27210e00df", "nodes": { "0": { "data": { @@ -123,7 +123,7 @@ "type": "start", "warnings": {}, "x": 300, - "y": -3.197442310920451e-13 + "y": -4.476419235288631e-13 }, "1": { "data": { @@ -154,9 +154,9 @@ "functionName": "merge_reports", "id": "10", "parameters": [ - "filtered-data:markdown_filter:condition_1:dispatch_activity_analysis_playbooks:playbook_output:{outputPath}" + "filtered-data:markdown_filter:condition_1:dispatch_activity_analysis_playbooks:playbook_output:markdown_report" ], - "template": "%%\n{0}\n\n%%", + "template": "%%\n{0}\n\n\n%%", "type": "format" }, "errors": {}, @@ -674,7 +674,7 @@ "schema": "5.0.9", "version": "6.0.0.114895" }, - "create_time": "2023-04-14T16:52:38.752503+00:00", + "create_time": "2023-05-19T13:56:00.984330+00:00", "draft_mode": false, "labels": [ "*" diff --git a/playbooks/Identifier_Activity_Analysis_Dispatch.py b/playbooks/Identifier_Activity_Analysis_Dispatch.py index b03660acee..61226dbfb3 100644 --- a/playbooks/Identifier_Activity_Analysis_Dispatch.py +++ b/playbooks/Identifier_Activity_Analysis_Dispatch.py @@ -201,11 +201,11 @@ def merge_reports(action=None, success=None, container=None, results=None, handl # Merge markdown outputs from dispatched playbooks ################################################################################ - template = """%%\n{0}\n\n%%""" + template = """%%\n{0}\n\n\n%%""" # parameter list for template variable replacement parameters = [ - "filtered-data:markdown_filter:condition_1:dispatch_activity_analysis_playbooks:playbook_output:{outputPath}" + "filtered-data:markdown_filter:condition_1:dispatch_activity_analysis_playbooks:playbook_output:markdown_report" ] ################################################################################