From 07329c1958c3ac4cf74dc30dab6197c5d2e0cd2a Mon Sep 17 00:00:00 2001 From: tccontre Date: Fri, 24 Mar 2023 10:11:45 +0100 Subject: [PATCH] saa_dynamic_analysis_playbooks --- playbooks/SAA_Dynamic_Analysis.json | 800 ++++++++++++++++++++++++++ playbooks/SAA_Dynamic_Analysis.png | Bin 0 -> 81150 bytes playbooks/SAA_Dynamic_Analysis.py | 860 ++++++++++++++++++++++++++++ playbooks/SAA_Dynamic_Analysis.yml | 25 + 4 files changed, 1685 insertions(+) create mode 100644 playbooks/SAA_Dynamic_Analysis.json create mode 100644 playbooks/SAA_Dynamic_Analysis.png create mode 100644 playbooks/SAA_Dynamic_Analysis.py create mode 100644 playbooks/SAA_Dynamic_Analysis.yml diff --git a/playbooks/SAA_Dynamic_Analysis.json b/playbooks/SAA_Dynamic_Analysis.json new file mode 100644 index 0000000000..cc316f26a1 --- /dev/null +++ b/playbooks/SAA_Dynamic_Analysis.json @@ -0,0 +1,800 @@ +{ + "blockly": false, + "blockly_xml": "", + "category": "Uncategorized", + "coa": { + "data": { + "description": "Accepts a URL or File_Hash and does reputation analysis on the objects. Generates a global report and a per observable sub-report and normalized score. The score can be customized based on a variety of factors.\n\nRef: https://d3fend.mitre.org/technique/d3f:IdentifierReputationAnalysis/", + "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" + }, + { + "id": "port_3_to_port_4", + "sourceNode": "3", + "sourcePort": "3_out", + "targetNode": "4", + "targetPort": "4_in" + }, + { + "conditions": [ + { + "index": 0 + } + ], + "id": "port_4_to_port_5", + "sourceNode": "4", + "sourcePort": "4_out", + "targetNode": "5", + "targetPort": "5_in" + }, + { + "id": "port_5_to_port_6", + "sourceNode": "5", + "sourcePort": "5_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" + }, + { + "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" + }, + { + "id": "port_11_to_port_1", + "sourceNode": "11", + "sourcePort": "11_out", + "targetNode": "1", + "targetPort": "1_in" + }, + { + "conditions": [ + { + "index": 1 + } + ], + "id": "port_2_to_port_12", + "sourceNode": "2", + "sourcePort": "2_out", + "targetNode": "12", + "targetPort": "12_in" + }, + { + "id": "port_14_to_port_15", + "sourceNode": "14", + "sourcePort": "14_out", + "targetNode": "15", + "targetPort": "15_in" + }, + { + "id": "port_17_to_port_18", + "sourceNode": "17", + "sourcePort": "17_out", + "targetNode": "18", + "targetPort": "18_in" + }, + { + "id": "port_18_to_port_19", + "sourceNode": "18", + "sourcePort": "18_out", + "targetNode": "19", + "targetPort": "19_in" + }, + { + "id": "port_19_to_port_1", + "sourceNode": "19", + "sourcePort": "19_out", + "targetNode": "1", + "targetPort": "1_in" + }, + { + "id": "port_12_to_port_4", + "sourceNode": "12", + "sourcePort": "12_out", + "targetNode": "4", + "targetPort": "4_in" + }, + { + "conditions": [ + { + "index": 1 + } + ], + "id": "port_4_to_port_14", + "sourceNode": "4", + "sourcePort": "4_out", + "targetNode": "14", + "targetPort": "14_in" + }, + { + "id": "port_15_to_port_7", + "sourceNode": "15", + "sourcePort": "15_out", + "targetNode": "7", + "targetPort": "7_in" + }, + { + "conditions": [ + { + "index": 1 + } + ], + "id": "port_7_to_port_17", + "sourceNode": "7", + "sourcePort": "7_out", + "targetNode": "17", + "targetPort": "17_in" + } + ], + "hash": "733b478157b79ea195ed77546d95303ebcb23e01", + "nodes": { + "0": { + "data": { + "advanced": { + "join": [] + }, + "functionName": "on_start", + "id": "0", + "type": "start" + }, + "errors": {}, + "id": "0", + "type": "start", + "warnings": {}, + "x": 190, + "y": 0 + }, + "1": { + "data": { + "advanced": { + "join": [] + }, + "functionName": "on_finish", + "id": "1", + "type": "end" + }, + "errors": {}, + "id": "1", + "type": "end", + "warnings": {}, + "x": 190, + "y": 1804 + }, + "10": { + "data": { + "advanced": { + "customName": "format url report ", + "customNameId": 0, + "description": "Format a summary table with the information gathered from the playbook.", + "join": [], + "note": "Format a summary table with the information gathered from the playbook." + }, + "functionId": 1, + "functionName": "format_url_report", + "id": "10", + "parameters": [ + "playbook_input:url", + "normalized_job_forensic_report_output:custom_function:scores", + "normalized_job_forensic_report_output:custom_function:confidence", + "normalized_job_forensic_report_output:custom_function:categories", + "get_jobid_of_url_detonation_output:custom_function:jobid" + ], + "template": "SOAR analyzed URL(s) using Splunk Attack Analyzer. The table below shows a summary of the information gathered.\n\n| URL | Score | Confidence |Categories | Report Link | Source |\n| --- | --- | --- | --- | --- |\n%%\n| `{0}` | {1} | {2} | {3} |https://app.twinwave.io/job/{4} | Splunk Attack Analyzer (SAA){1}{2}{3}{4} |\n%%\n\n\n", + "type": "format" + }, + "errors": {}, + "id": "10", + "type": "format", + "userCode": "\n # Write your custom code here...\n #phantom.debug(phantom.format(container=container, template=template, parameters=parameters, name=\"format_report_url\"))\n", + "warnings": {}, + "x": 0, + "y": 1440 + }, + "11": { + "data": { + "advanced": { + "customName": "build url output", + "customNameId": 0, + "description": "This block uses custom code to generate an observable dictionary to output into the observables data path.", + "join": [], + "note": "This block uses custom code to generate an observable dictionary to output into the observables data path." + }, + "functionId": 3, + "functionName": "build_url_output", + "id": "11", + "inputParameters": [ + "playbook_input:url", + "get_jobid_of_url_detonation_output:custom_function:jobid", + "normalized_job_forensic_report_output:custom_function:url_score_object" + ], + "outputVariables": [ + "observable_array" + ], + "type": "code" + }, + "errors": {}, + "id": "11", + "type": "code", + "userCode": "\n # Write your custom code here...\n from urllib.parse import urlparse\n build_url_output__observable_array = []\n phantom.debug(playbook_input_url_values)\n # Build URL\n for jobs_id in get_jobid_of_url_detonation_output__jobid:\n \n for url, external_id, url_object in zip(playbook_input_url_values, jobs_id, normalized_job_forensic_report_output__url_score_object):\n parsed_url = urlparse(url)\n phantom.debug(\"url: {} jobs_id:{}\".format(url, external_id))\n phantom.debug(\"parsed_url: {}, url_object: {}\".format(parsed_url, url_object))\n observable_object = {\n \"value\": url,\n \"type\": \"url\",\n \"reputation\": {\n \"score\": url_object['score'],\n \"confidence\": url_object['confidence']\n },\n \"attributes\": {\n \"hostname\": parsed_url.hostname,\n \"scheme\": parsed_url.scheme\n },\n \"categories\": url_object['categories'],\n \"source\": \"Splunk Attack Analyzer (SAA)\",\n \"source_link\": f\"https://app.twinwave.io/job/{external_id}\"\n }\n\n if parsed_url.path:\n observable_object['attributes']['path'] = parsed_url.path\n if parsed_url.query:\n observable_object['attributes']['query'] = parsed_url.query\n if parsed_url.port:\n observable_object['attributes']['port'] = parsed_url.port\n\n build_url_output__observable_array.append(observable_object)\n phantom.debug(\"build_url_output__observable_array: {}\".format(build_url_output__observable_array))\n", + "warnings": {}, + "x": 0, + "y": 1626 + }, + "12": { + "data": { + "action": "detonate file", + "actionType": "generic", + "advanced": { + "customName": "saa file detonation", + "customNameId": 0, + "description": "Queries SAA for information about the provided vault_id(s)", + "join": [], + "note": "Queries SAA for information about the provided vault_id(s)" + }, + "connector": "Splunk Attack Analyzer", + "connectorConfigs": [ + "splunk attack analyzer" + ], + "connectorId": "de681fee-c552-45bf-9212-827b1c7529f8", + "connectorVersion": "v1", + "functionId": 1, + "functionName": "saa_file_detonation", + "id": "12", + "parameters": { + "file": "playbook_input:vault_id" + }, + "requiredParameters": [ + { + "data_type": "string", + "field": "file" + } + ], + "type": "action" + }, + "errors": {}, + "id": "12", + "type": "action", + "warnings": {}, + "x": 340, + "y": 328 + }, + "14": { + "data": { + "advanced": { + "customName": "get jobid of file detonation output", + "customNameId": 0, + "description": "This block uses custom code for fetching JobID for URL(s) or file(s) detonation.", + "join": [], + "note": "This block uses custom code for fetching JobID for URL(s) or file(s) detonation." + }, + "functionId": 4, + "functionName": "get_jobid_of_file_detonation_output", + "id": "14", + "inputParameters": [ + "saa_file_detonation:action_result.data.*.JobID" + ], + "outputVariables": [ + "jobid" + ], + "type": "code" + }, + "errors": {}, + "id": "14", + "type": "code", + "userCode": "\n # Write your custom code here...\n get_jobid_of_file_detonation_output__jobid = []\n\n get_jobid_of_file_detonation_output__jobid.append(saa_file_detonation_result_item_0)\n #phantom.debug(\"get_jobid_of_file_detonation_output__jobid: {}\".format(get_jobid_of_file_detonation_output__jobid))\n", + "warnings": {}, + "x": 340, + "y": 686 + }, + "15": { + "data": { + "action": "get job forensics", + "actionType": "investigate", + "advanced": { + "customName": "saa get file job forensics output", + "customNameId": 0, + "description": "Queries SAA Forensics data relative to the JobID of URL(s) or File(s) needs to be detonated.", + "join": [], + "note": "Queries SAA Forensics data relative to the JobID of URL(s) or File(s) needs to be detonated." + }, + "connector": "Splunk Attack Analyzer", + "connectorConfigs": [ + "splunk attack analyzer" + ], + "connectorId": "de681fee-c552-45bf-9212-827b1c7529f8", + "connectorVersion": "v1", + "functionId": 2, + "functionName": "saa_get_file_job_forensics_output", + "id": "15", + "parameters": { + "job_id": "get_jobid_of_file_detonation_output:custom_function:jobid", + "timeout": "5" + }, + "requiredParameters": [ + { + "data_type": "string", + "field": "job_id" + } + ], + "type": "action" + }, + "errors": {}, + "id": "15", + "type": "action", + "userCode": "\n # Write your custom code here...\n parameters = []\n for job_ids in get_jobid_of_file_detonation_output__jobid:\n for job in job_ids:\n if job is not None:\n parameters.append({\n \"job_id\": job,\n \"timeout\": 5,\n })\n #phantom.debug(parameters)\n", + "warnings": {}, + "x": 340, + "y": 880 + }, + "17": { + "data": { + "advanced": { + "customName": "normalized job forensic report output", + "customNameId": 1, + "description": "This block uses custom code for normalizing score. Adjust the logic as desired in the documented sections.", + "join": [], + "note": "This block uses custom code for normalizing score. Adjust the logic as desired in the documented sections." + }, + "functionId": 5, + "functionName": "normalized_job_forensic_report_output_1", + "id": "17", + "inputParameters": [ + "playbook_input:vault_id", + "saa_get_file_job_forensics_output:action_result.data.*.DisplayScore", + "saa_get_file_job_forensics_output:action_result.data.*.Detections.*.Description", + "saa_get_file_job_forensics_output:action_result.data.*.Verdict", + "saa_get_file_job_forensics_output:action_result.data" + ], + "outputVariables": [ + "file_score_object", + "scores", + "categories", + "confidence" + ], + "type": "code" + }, + "errors": {}, + "id": "17", + "type": "code", + "userCode": "\n # Write your custom code here...\n score_id =0\n score_table = {\n \"0\":\"Unknown\",\n \"10\":\"Very_Safe\",\n \"20\":\"Safe\",\n \"30\":\"Probably_Safe\",\n \"40\":\"Leans_Safe\",\n \"50\":\"May_not_be_Safe\",\n \"60\":\"Exercise_Caution\",\n \"70\":\"Suspicious_or_Risky\",\n \"80\":\"Possibly_Malicious\",\n \"90\":\"Probably_Malicious\",\n \"100\":\"Malicious\"\n }\n #phantom.debug(\"vault_id: {}\".format(ssa_get_job_forensics_output_result_item_0))\n #phantom.debug(\"DisplayScore: {}\".format(ssa_get_job_forensics_output_result_item_1))\n #phantom.debug(\"Category: {}\".format(ssa_get_job_forensics_output_result_item_2))\n #phantom.debug(\"verdict: {}\".format(ssa_get_job_forensics_output_result_item_3))\n #phantom.debug(\"action_data: {}\".format(ssa_get_job_forensics_output_result_item_4))\n\n \n normalized_job_forensic_report_output_1__file_score_object = []\n normalized_job_forensic_report_output_1__scores = []\n normalized_job_forensic_report_output_1__categories = []\n normalized_job_forensic_report_output_1__confidence = []\n \n ## normalized NoneType value to avoid enumeration failure\n file_detonation_param_list = [(i or \"\") for i in playbook_input_vault_id_values] \n file_detonation_threat_score_list = [(i or 0) for i in saa_get_file_job_forensics_output_result_item_0] \n file_detonation_category_list = [(i or \"\") for i in saa_get_file_job_forensics_output_result_item_1] \n file_detonation_verdict_list = [(i or \"\") for i in saa_get_file_job_forensics_output_result_item_2] \n \n ## get the set() or unique input url parameter.\n \n index_file_dict = {}\n set_file_inputs = set(file_detonation_param_list)\n \n for file_input in set_file_inputs:\n vaultid_list = []\n score_list = []\n display_score_list = []\n category_list = []\n \n ## getting the index of each detonation phase of the url group the result for each url detonation\n file_input_index = [indx for indx, vaultid_val in enumerate(file_detonation_param_list) if vaultid_val == file_input]\n index_file_dict[file_input] = file_input_index\n \n for idx,(_vaultid, _score, _display_score, _category) in enumerate(zip(file_detonation_param_list, file_detonation_verdict_list, file_detonation_threat_score_list, file_detonation_category_list)):\n if _vaultid == file_input and idx in index_file_dict[file_input]:\n vaultid_list.append(_vaultid)\n score_list.append(_score)\n display_score_list.append(_display_score)\n category_list.append(_category)\n \n ## if score_list is empty or it has one element but empty string, lets score it base on confidence score of its engine detonation\n #phantom.debug(\"score_list: {} len: {}\".format(score_list, len(score_list)))\n #phantom.debug(\"category_list: {} len: {}\".format(category_list, len(category_list)))\n confidence_ = list(set(display_score_list))[0]\n categories = list(set(category_list))\n \n if len(score_list) == 0 or (len(set(score_list)) == 1 and score_list[0] == \"\"):\n if confidence_ >= 0 and confidence_ < 10:\n score_id = 0\n elif confidence_ >= 10 and confidence_ < 20:\n score_id = 10\n elif confidence_ >= 20 and confidence_ < 30:\n score_id = 20\n elif confidence_ >= 30 and confidence_ < 40:\n score_id = 30\n elif confidence_ >= 40 and confidence_ < 50:\n score_id = 40\n elif confidence_ >= 50 and confidence_ < 60:\n score_id = 50\n elif confidence_ >= 60 and confidence_ < 70:\n score_id = 60\n elif confidence_ >= 70 and confidence_ < 80:\n score_id = 70\n elif confidence_ >= 80 and confidence_ < 90:\n score_id = 80\n elif confidence_ >= 90 and confidence_ < 100:\n score_id = 90\n elif confidence_ >= 100:\n score_id = 100\n \n score = score_table[str(score_id)]\n \n else:\n score = list(set(score_list))[0]\n \n # Attach final object\n normalized_job_forensic_report_output_1__file_score_object.append({'score': score, 'confidence': confidence_, 'categories': categories})\n normalized_job_forensic_report_output_1__scores.append(score)\n normalized_job_forensic_report_output_1__categories.append(categories)\n normalized_job_forensic_report_output_1__confidence.append(confidence_)\n phantom.debug(\"normalized_job_forensic_report_output_1__file_score_object: {}\".format(normalized_job_forensic_report_output_1__file_score_object))\n phantom.debug(\"normalized_job_forensic_report_output_1__scores: {}\".format(normalized_job_forensic_report_output_1__scores))\n phantom.debug(\"normalized_job_forensic_report_output_1__categories: {}\".format(normalized_job_forensic_report_output_1__categories))\n", + "warnings": {}, + "x": 340, + "y": 1254 + }, + "18": { + "data": { + "advanced": { + "customName": "format file report ", + "customNameId": 0, + "description": "Format a summary table with the information gathered from the playbook.", + "join": [], + "note": "Format a summary table with the information gathered from the playbook." + }, + "functionId": 2, + "functionName": "format_file_report", + "id": "18", + "parameters": [ + "playbook_input:vault_id", + "normalized_job_forensic_report_output_1:custom_function:scores", + "normalized_job_forensic_report_output_1:custom_function:confidence", + "normalized_job_forensic_report_output_1:custom_function:categories", + "get_jobid_of_file_detonation_output:custom_function:jobid" + ], + "template": "SOAR analyzed File(s) using Splunk Attack Analyzer. The table below shows a summary of the information gathered.\n\n| File hash | Score | Confidence |Categories | Report Link | Source |\n| --- | --- | --- | --- | --- |\n%%\n| `{0}` | {1} | {2} | {3} |https://app.twinwave.io/job/{4} | Splunk Attack Analyzer (SAA){1}{2}{3}{4} |\n%%\n\n\n", + "type": "format" + }, + "errors": {}, + "id": "18", + "type": "format", + "userCode": "\n # Write your custom code here...\n #phantom.debug(phantom.format(container=container, template=template, parameters=parameters, name=\"format_report_file\"))\n", + "warnings": {}, + "x": 340, + "y": 1440 + }, + "19": { + "data": { + "advanced": { + "customName": "build file output", + "customNameId": 0, + "description": "This block uses custom code to generate an observable dictionary to output into the observables data path.", + "join": [], + "note": "This block uses custom code to generate an observable dictionary to output into the observables data path." + }, + "functionId": 6, + "functionName": "build_file_output", + "id": "19", + "inputParameters": [ + "playbook_input:vault_id", + "get_jobid_of_file_detonation_output:custom_function:jobid", + "normalized_job_forensic_report_output_1:custom_function:file_score_object" + ], + "outputVariables": [ + "observable_array" + ], + "type": "code" + }, + "errors": {}, + "id": "19", + "type": "code", + "userCode": "\n # Write your custom code here...\n build_file_output__observable_array = []\n for jobs_id in get_jobid_of_file_detonation_output__jobid:\n for _vault_id, external_id, file_object in zip(playbook_input_vault_id_values, jobs_id, normalized_job_forensic_report_output_1__file_score_object):\n phantom.debug(\"vault: {} id: {}\".format(_vault_id, external_id))\n observable_object = {\n\n \"vault_id\": _vault_id,\n \"type\": \"hash\",\n \"reputation\": {\n \"score\": file_object['score'],\n \"confidence\": file_object['confidence'],\n\n },\n \"enrichment\": {\n \"provider\": \"Splunk Attack Analyzer\",\n \"type\": \"file\",\n\n },\n \"categories\": file_object['categories'],\n \"source\": \"Splunk Attack Analyzer (SAA)\",\n \"source_link\":f\"https://app.twinwave.io/job/{external_id}\"\n }\n build_file_output__observable_array.append(observable_object)\n phantom.debug(\"build_file_output__observable_array: {}\".format(build_file_output__observable_array))\n", + "warnings": {}, + "x": 340, + "y": 1626 + }, + "2": { + "data": { + "advanced": { + "customName": "saa input filter", + "customNameId": 0, + "description": "Determine branches based on provided inputs.", + "join": [], + "note": "Determine branches based on provided inputs." + }, + "conditions": [ + { + "comparisons": [ + { + "conditionIndex": 0, + "op": "!=", + "param": "playbook_input:url", + "value": "" + } + ], + "conditionIndex": 0, + "customName": "saa_url_input", + "logic": "and" + }, + { + "comparisons": [ + { + "conditionIndex": 1, + "op": "!=", + "param": "playbook_input:vault_id", + "value": "" + } + ], + "conditionIndex": 1, + "customName": "saa_vault_id_input", + "logic": "and" + } + ], + "functionId": 1, + "functionName": "saa_input_filter", + "id": "2", + "type": "filter" + }, + "errors": {}, + "id": "2", + "type": "filter", + "warnings": {}, + "x": 230, + "y": 148 + }, + "3": { + "data": { + "action": "detonate url", + "actionType": "generic", + "advanced": { + "customName": "saa url detonation", + "customNameId": 0, + "description": "Queries SAA for information about the provided URL(s)", + "join": [], + "note": "Queries SAA for information about the provided URL(s)" + }, + "connector": "Splunk Attack Analyzer", + "connectorConfigs": [ + "splunk attack analyzer" + ], + "connectorId": "de681fee-c552-45bf-9212-827b1c7529f8", + "connectorVersion": "v1", + "functionId": 1, + "functionName": "saa_url_detonation", + "id": "3", + "parameters": { + "url": "playbook_input:url" + }, + "requiredParameters": [ + { + "data_type": "string", + "field": "url" + } + ], + "type": "action" + }, + "errors": {}, + "id": "3", + "type": "action", + "userCode": "\n # Write your custom code here...\n\n", + "warnings": {}, + "x": 0, + "y": 320 + }, + "4": { + "data": { + "advanced": { + "customName": "url detonation status filter", + "customNameId": 0, + "description": "Filters successful url or file detonation results.", + "join": [], + "note": "Filters successful url or file detonation results." + }, + "conditions": [ + { + "comparisons": [ + { + "conditionIndex": 0, + "op": "==", + "param": "saa_url_detonation:action_result.status", + "value": "success" + } + ], + "conditionIndex": 0, + "customName": "saa_url_success_status", + "logic": "and" + }, + { + "comparisons": [ + { + "conditionIndex": 1, + "op": "==", + "param": "saa_file_detonation:action_result.status", + "value": "success" + } + ], + "conditionIndex": 1, + "customName": "saa_url_success_status", + "logic": "and" + } + ], + "functionId": 2, + "functionName": "url_detonation_status_filter", + "id": "4", + "type": "filter" + }, + "errors": {}, + "id": "4", + "type": "filter", + "warnings": {}, + "x": 230, + "y": 506 + }, + "5": { + "data": { + "advanced": { + "customName": "get jobid of url detonation output", + "customNameId": 0, + "description": "This block uses custom code for fetching JobID for URL(s) or file(s) detonation.", + "join": [], + "note": "This block uses custom code for fetching JobID for URL(s) or file(s) detonation.", + "scope": "default" + }, + "functionId": 1, + "functionName": "get_jobid_of_url_detonation_output", + "id": "5", + "inputParameters": [ + "saa_url_detonation:action_result.data.*.JobID" + ], + "outputVariables": [ + "jobid" + ], + "type": "code" + }, + "errors": {}, + "id": "5", + "type": "code", + "userCode": "\n # Write your custom code here...\n get_jobid_of_url_detonation_output__jobid = []\n\n get_jobid_of_url_detonation_output__jobid.append(saa_url_detonation_result_item_0)\n #phantom.debug(\"get_jobid_of_url_detonation_output__jobid: {}\".format(get_jobid_of_url_detonation_output__jobid))\n", + "warnings": {}, + "x": 0, + "y": 686 + }, + "6": { + "data": { + "action": "get job forensics", + "actionType": "investigate", + "advanced": { + "customName": "ssa get job forensics output", + "customNameId": 0, + "description": "Queries SAA Forensics data relative to the JobID of URL(s) or File(s) needs to be detonated.", + "join": [], + "note": "Queries SAA Forensics data relative to the JobID of URL(s) or File(s) needs to be detonated." + }, + "connector": "Splunk Attack Analyzer", + "connectorConfigs": [ + "splunk attack analyzer" + ], + "connectorId": "de681fee-c552-45bf-9212-827b1c7529f8", + "connectorVersion": "v1", + "functionId": 1, + "functionName": "ssa_get_job_forensics_output", + "id": "6", + "parameters": { + "job_id": "get_jobid_of_url_detonation_output:custom_function:jobid", + "timeout": "5" + }, + "requiredParameters": [ + { + "data_type": "string", + "field": "job_id" + } + ], + "type": "action" + }, + "errors": {}, + "id": "6", + "type": "action", + "userCode": "\n # Write your custom code here...\n parameters = []\n for job_ids in get_jobid_of_url_detonation_output__jobid:\n for job in job_ids:\n if job is not None:\n parameters.append({\n \"job_id\": job,\n \"timeout\": 5,\n })\n #phantom.debug(parameters)\n", + "warnings": {}, + "x": 0, + "y": 880 + }, + "7": { + "data": { + "advanced": { + "customName": "get jobid forensic filter", + "customNameId": 0, + "description": "Filters successful url or file detonation job forensic results.", + "join": [], + "note": "Filters successful url or file detonation job forensic results." + }, + "conditions": [ + { + "comparisons": [ + { + "conditionIndex": 0, + "op": "==", + "param": "ssa_get_job_forensics_output:action_result.status", + "value": "success" + } + ], + "conditionIndex": 0, + "customName": "get_job_forensic_success", + "logic": "and" + }, + { + "comparisons": [ + { + "conditionIndex": 1, + "op": "==", + "param": "saa_get_file_job_forensics_output:action_result.status", + "value": "success" + } + ], + "conditionIndex": 1, + "customName": "get_job_file_forensic_sucess", + "logic": "and" + } + ], + "functionId": 3, + "functionName": "get_jobid_forensic_filter", + "id": "7", + "type": "filter" + }, + "errors": {}, + "id": "7", + "type": "filter", + "warnings": {}, + "x": 230, + "y": 1074 + }, + "8": { + "data": { + "advanced": { + "customName": "normalized job forensic report output", + "customNameId": 0, + "description": "This block uses custom code for normalizing score. Adjust the logic as desired in the documented sections.", + "join": [], + "note": "This block uses custom code for normalizing score. Adjust the logic as desired in the documented sections." + }, + "functionId": 2, + "functionName": "normalized_job_forensic_report_output", + "id": "8", + "inputParameters": [ + "ssa_get_job_forensics_output:action_result.data.*.URLs.*.URL", + "ssa_get_job_forensics_output:action_result.data.*.DisplayScore", + "ssa_get_job_forensics_output:action_result.data.*.Detections.*.Description", + "ssa_get_job_forensics_output:action_result.data.*.Verdict", + "ssa_get_job_forensics_output:action_result.data" + ], + "outputVariables": [ + "url_score_object", + "scores", + "categories", + "confidence" + ], + "type": "code" + }, + "errors": {}, + "id": "8", + "type": "code", + "userCode": "\n # Write your custom code here...\n score_id =0\n score_table = {\n \"0\":\"Unknown\",\n \"10\":\"Very_Safe\",\n \"20\":\"Safe\",\n \"30\":\"Probably_Safe\",\n \"40\":\"Leans_Safe\",\n \"50\":\"May_not_be_Safe\",\n \"60\":\"Exercise_Caution\",\n \"70\":\"Suspicious_or_Risky\",\n \"80\":\"Possibly_Malicious\",\n \"90\":\"Probably_Malicious\",\n \"100\":\"Malicious\"\n }\n #phantom.debug(\"url: {}\".format(ssa_get_job_forensics_output_result_item_0))\n #phantom.debug(\"DisplayScore: {}\".format(ssa_get_job_forensics_output_result_item_1))\n #phantom.debug(\"Category: {}\".format(ssa_get_job_forensics_output_result_item_2))\n #phantom.debug(\"verdict: {}\".format(ssa_get_job_forensics_output_result_item_3))\n #phantom.debug(\"action_data: {}\".format(ssa_get_job_forensics_output_result_item_4))\n\n \n normalized_job_forensic_report_output__url_score_object = []\n normalized_job_forensic_report_output__scores = []\n normalized_job_forensic_report_output__categories = []\n normalized_job_forensic_report_output__confidence = []\n \n ## normalized NoneType value to avoid enumeration failure\n url_detonation_param_list = [(i or \"\") for i in ssa_get_job_forensics_output_result_item_0] \n url_detonation_threat_score_list = [(i or 0) for i in ssa_get_job_forensics_output_result_item_1] \n url_detonation_category_list = [(i or \"\") for i in ssa_get_job_forensics_output_result_item_2] \n url_detonation_verdict_list = [(i or \"\") for i in ssa_get_job_forensics_output_result_item_3] \n \n ## get the set() or unique input url parameter.\n \n index_url_dict = {}\n set_url_inputs = set(url_detonation_param_list)\n \n for url_input in set_url_inputs:\n url_list = []\n score_list = []\n display_score_list = []\n category_list = []\n \n ## getting the index of each detonation phase of the url group the result for each url detonation\n url_input_index = [indx for indx, url_val in enumerate(url_detonation_param_list) if url_val == url_input]\n index_url_dict[url_input] = url_input_index\n\n for idx,(_url, _score, _display_score, _category) in enumerate(zip(url_detonation_param_list, url_detonation_verdict_list, url_detonation_threat_score_list, url_detonation_category_list)):\n if _url == url_input and idx in index_url_dict[url_input]:\n url_list.append(_url)\n score_list.append(_score)\n display_score_list.append(_display_score)\n category_list.append(_category)\n \n ## if score_list is empty or it has one element but empty string, lets score it base on confidence score of its engine detonation\n #phantom.debug(\"score_list: {} len: {}\".format(score_list, len(score_list)))\n #phantom.debug(\"category_list: {} len: {}\".format(category_list, len(category_list)))\n confidence_ = list(set(display_score_list))[0]\n categories = list(set(category_list))\n\n if len(score_list) == 0 or (len(set(score_list)) == 1 and score_list[0] == \"\"):\n if confidence_ >= 0 and confidence_ < 10:\n score_id = 0\n elif confidence_ >= 10 and confidence_ < 20:\n score_id = 10\n elif confidence_ >= 20 and confidence_ < 30:\n score_id = 20\n elif confidence_ >= 30 and confidence_ < 40:\n score_id = 30\n elif confidence_ >= 40 and confidence_ < 50:\n score_id = 40\n elif confidence_ >= 50 and confidence_ < 60:\n score_id = 50\n elif confidence_ >= 60 and confidence_ < 70:\n score_id = 60\n elif confidence_ >= 70 and confidence_ < 80:\n score_id = 70\n elif confidence_ >= 80 and confidence_ < 90:\n score_id = 80\n elif confidence_ >= 90 and confidence_ < 100:\n score_id = 90\n elif confidence_ >= 100:\n score_id = 100\n \n score = score_table[str(score_id)]\n \n else:\n score = list(set(score_list))[0]\n \n # Attach final object\n normalized_job_forensic_report_output__url_score_object.append({'score': score, 'confidence': confidence_, 'categories': categories})\n normalized_job_forensic_report_output__scores.append(score)\n normalized_job_forensic_report_output__categories.append(categories)\n normalized_job_forensic_report_output__confidence.append(confidence_)\n phantom.debug(\"normalized_job_forensic_report_output__url_score_object: {}\".format(normalized_job_forensic_report_output__url_score_object))\n phantom.debug(\"normalized_job_forensic_report_output__categories: {}\".format(normalized_job_forensic_report_output__categories))\n phantom.debug(\"normalized_job_forensic_report_output__confidence: {}\".format(normalized_job_forensic_report_output__confidence))\n\n", + "warnings": {}, + "x": 0, + "y": 1260 + } + }, + "notes": "Inputs: url, file_hash\nInteractions: Splunk Attack Analyzer\nActions: url detonation, , file detonation\nOutputs: report, observables" + }, + "input_spec": [ + { + "contains": [ + "url" + ], + "description": "A URL provided for reputation analysis - Splunk Attack Analyzer", + "name": "url" + }, + { + "contains": [ + "vault id" + ], + "description": "A vault_id provided for reputation analysis - Splunk Attack Analyzer", + "name": "vault_id" + } + ], + "output_spec": null, + "playbook_type": "data", + "python_version": "3", + "schema": "5.0.8", + "version": "5.5.0.108488" + }, + "create_time": "2023-03-23T11:53:03.128006+00:00", + "draft_mode": false, + "labels": [ + "*" + ], + "tags": [ + "url", + "file_hash", + "reputation", + "D3-IPRA", + "D3-FHRA", + "D3-DNRA", + "D3-URA", + "ip", + "domain", + "sandbox" + ] +} \ No newline at end of file diff --git a/playbooks/SAA_Dynamic_Analysis.png b/playbooks/SAA_Dynamic_Analysis.png new file mode 100644 index 0000000000000000000000000000000000000000..de72222307c740518b09430ff53221566f2de87a GIT binary patch literal 81150 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 aY*Ra}UJ?w= 0 and confidence_ < 10: + score_id = 0 + elif confidence_ >= 10 and confidence_ < 20: + score_id = 10 + elif confidence_ >= 20 and confidence_ < 30: + score_id = 20 + elif confidence_ >= 30 and confidence_ < 40: + score_id = 30 + elif confidence_ >= 40 and confidence_ < 50: + score_id = 40 + elif confidence_ >= 50 and confidence_ < 60: + score_id = 50 + elif confidence_ >= 60 and confidence_ < 70: + score_id = 60 + elif confidence_ >= 70 and confidence_ < 80: + score_id = 70 + elif confidence_ >= 80 and confidence_ < 90: + score_id = 80 + elif confidence_ >= 90 and confidence_ < 100: + score_id = 90 + elif confidence_ >= 100: + score_id = 100 + + score = score_table[str(score_id)] + + else: + score = list(set(score_list))[0] + + # Attach final object + normalized_job_forensic_report_output__url_score_object.append({'score': score, 'confidence': confidence_, 'categories': categories}) + normalized_job_forensic_report_output__scores.append(score) + normalized_job_forensic_report_output__categories.append(categories) + normalized_job_forensic_report_output__confidence.append(confidence_) + phantom.debug("normalized_job_forensic_report_output__url_score_object: {}".format(normalized_job_forensic_report_output__url_score_object)) + phantom.debug("normalized_job_forensic_report_output__categories: {}".format(normalized_job_forensic_report_output__categories)) + phantom.debug("normalized_job_forensic_report_output__confidence: {}".format(normalized_job_forensic_report_output__confidence)) + + ################################################################################ + ## Custom Code End + ################################################################################ + + phantom.save_run_data(key="normalized_job_forensic_report_output:url_score_object", value=json.dumps(normalized_job_forensic_report_output__url_score_object)) + phantom.save_run_data(key="normalized_job_forensic_report_output:scores", value=json.dumps(normalized_job_forensic_report_output__scores)) + phantom.save_run_data(key="normalized_job_forensic_report_output:categories", value=json.dumps(normalized_job_forensic_report_output__categories)) + phantom.save_run_data(key="normalized_job_forensic_report_output:confidence", value=json.dumps(normalized_job_forensic_report_output__confidence)) + + format_url_report(container=container) + + return + + +@phantom.playbook_block() +def format_url_report(action=None, success=None, container=None, results=None, handle=None, filtered_artifacts=None, filtered_results=None, custom_function=None, **kwargs): + phantom.debug("format_url_report() called") + + ################################################################################ + # Format a summary table with the information gathered from the playbook. + ################################################################################ + + template = """SOAR analyzed URL(s) using Splunk Attack Analyzer. The table below shows a summary of the information gathered.\n\n| URL | Score | Confidence |Categories | Report Link | Source |\n| --- | --- | --- | --- | --- |\n%%\n| `{0}` | {1} | {2} | {3} |https://app.twinwave.io/job/{4} | Splunk Attack Analyzer (SAA){1}{2}{3}{4} |\n%%\n\n\n""" + + # parameter list for template variable replacement + parameters = [ + "playbook_input:url", + "normalized_job_forensic_report_output:custom_function:scores", + "normalized_job_forensic_report_output:custom_function:confidence", + "normalized_job_forensic_report_output:custom_function:categories", + "get_jobid_of_url_detonation_output:custom_function:jobid" + ] + + ################################################################################ + ## Custom Code Start + ################################################################################ + + # Write your custom code here... + #phantom.debug(phantom.format(container=container, template=template, parameters=parameters, name="format_report_url")) + ################################################################################ + ## Custom Code End + ################################################################################ + + phantom.format(container=container, template=template, parameters=parameters, name="format_url_report") + + build_url_output(container=container) + + return + + +@phantom.playbook_block() +def build_url_output(action=None, success=None, container=None, results=None, handle=None, filtered_artifacts=None, filtered_results=None, custom_function=None, **kwargs): + phantom.debug("build_url_output() called") + + ################################################################################ + # This block uses custom code to generate an observable dictionary to output into + # the observables data path. + ################################################################################ + + playbook_input_url = phantom.collect2(container=container, datapath=["playbook_input:url"]) + get_jobid_of_url_detonation_output__jobid = json.loads(_ if (_ := phantom.get_run_data(key="get_jobid_of_url_detonation_output:jobid")) != "" else "null") # pylint: disable=used-before-assignment + normalized_job_forensic_report_output__url_score_object = json.loads(_ if (_ := phantom.get_run_data(key="normalized_job_forensic_report_output:url_score_object")) != "" else "null") # pylint: disable=used-before-assignment + + playbook_input_url_values = [item[0] for item in playbook_input_url] + + build_url_output__observable_array = None + + ################################################################################ + ## Custom Code Start + ################################################################################ + + # Write your custom code here... + from urllib.parse import urlparse + build_url_output__observable_array = [] + phantom.debug(playbook_input_url_values) + # Build URL + for jobs_id in get_jobid_of_url_detonation_output__jobid: + + for url, external_id, url_object in zip(playbook_input_url_values, jobs_id, normalized_job_forensic_report_output__url_score_object): + parsed_url = urlparse(url) + phantom.debug("url: {} jobs_id:{}".format(url, external_id)) + phantom.debug("parsed_url: {}, url_object: {}".format(parsed_url, url_object)) + observable_object = { + "value": url, + "type": "url", + "reputation": { + "score": url_object['score'], + "confidence": url_object['confidence'] + }, + "attributes": { + "hostname": parsed_url.hostname, + "scheme": parsed_url.scheme + }, + "categories": url_object['categories'], + "source": "Splunk Attack Analyzer (SAA)", + "source_link": f"https://app.twinwave.io/job/{external_id}" + } + + if parsed_url.path: + observable_object['attributes']['path'] = parsed_url.path + if parsed_url.query: + observable_object['attributes']['query'] = parsed_url.query + if parsed_url.port: + observable_object['attributes']['port'] = parsed_url.port + + build_url_output__observable_array.append(observable_object) + phantom.debug("build_url_output__observable_array: {}".format(build_url_output__observable_array)) + ################################################################################ + ## Custom Code End + ################################################################################ + + phantom.save_run_data(key="build_url_output:observable_array", value=json.dumps(build_url_output__observable_array)) + + return + + +@phantom.playbook_block() +def saa_file_detonation(action=None, success=None, container=None, results=None, handle=None, filtered_artifacts=None, filtered_results=None, custom_function=None, **kwargs): + phantom.debug("saa_file_detonation() called") + + # phantom.debug('Action: {0} {1}'.format(action['name'], ('SUCCEEDED' if success else 'FAILED'))) + + ################################################################################ + # Queries SAA for information about the provided vault_id(s) + ################################################################################ + + playbook_input_vault_id = phantom.collect2(container=container, datapath=["playbook_input:vault_id"]) + + parameters = [] + + # build parameters list for 'saa_file_detonation' call + for playbook_input_vault_id_item in playbook_input_vault_id: + if playbook_input_vault_id_item[0] is not None: + parameters.append({ + "file": playbook_input_vault_id_item[0], + }) + + ################################################################################ + ## Custom Code Start + ################################################################################ + + # Write your custom code here... + + ################################################################################ + ## Custom Code End + ################################################################################ + + phantom.act("detonate file", parameters=parameters, name="saa_file_detonation", assets=["splunk attack analyzer"], callback=join_url_detonation_status_filter) + + return + + +@phantom.playbook_block() +def get_jobid_of_file_detonation_output(action=None, success=None, container=None, results=None, handle=None, filtered_artifacts=None, filtered_results=None, custom_function=None, **kwargs): + phantom.debug("get_jobid_of_file_detonation_output() called") + + ################################################################################ + # This block uses custom code for fetching JobID for URL(s) or file(s) detonation. + ################################################################################ + + saa_file_detonation_result_data = phantom.collect2(container=container, datapath=["saa_file_detonation:action_result.data.*.JobID"], action_results=results) + + saa_file_detonation_result_item_0 = [item[0] for item in saa_file_detonation_result_data] + + get_jobid_of_file_detonation_output__jobid = None + + ################################################################################ + ## Custom Code Start + ################################################################################ + + # Write your custom code here... + get_jobid_of_file_detonation_output__jobid = [] + + get_jobid_of_file_detonation_output__jobid.append(saa_file_detonation_result_item_0) + #phantom.debug("get_jobid_of_file_detonation_output__jobid: {}".format(get_jobid_of_file_detonation_output__jobid)) + ################################################################################ + ## Custom Code End + ################################################################################ + + phantom.save_run_data(key="get_jobid_of_file_detonation_output:jobid", value=json.dumps(get_jobid_of_file_detonation_output__jobid)) + + saa_get_file_job_forensics_output(container=container) + + return + + +@phantom.playbook_block() +def saa_get_file_job_forensics_output(action=None, success=None, container=None, results=None, handle=None, filtered_artifacts=None, filtered_results=None, custom_function=None, **kwargs): + phantom.debug("saa_get_file_job_forensics_output() called") + + # phantom.debug('Action: {0} {1}'.format(action['name'], ('SUCCEEDED' if success else 'FAILED'))) + + ################################################################################ + # Queries SAA Forensics data relative to the JobID of URL(s) or File(s) needs + # to be detonated. + ################################################################################ + + get_jobid_of_file_detonation_output__jobid = json.loads(_ if (_ := phantom.get_run_data(key="get_jobid_of_file_detonation_output:jobid")) != "" else "null") # pylint: disable=used-before-assignment + + parameters = [] + + if get_jobid_of_file_detonation_output__jobid is not None: + parameters.append({ + "job_id": get_jobid_of_file_detonation_output__jobid, + "timeout": 5, + }) + + ################################################################################ + ## Custom Code Start + ################################################################################ + + # Write your custom code here... + parameters = [] + for job_ids in get_jobid_of_file_detonation_output__jobid: + for job in job_ids: + if job is not None: + parameters.append({ + "job_id": job, + "timeout": 5, + }) + #phantom.debug(parameters) + ################################################################################ + ## Custom Code End + ################################################################################ + + phantom.act("get job forensics", parameters=parameters, name="saa_get_file_job_forensics_output", assets=["splunk attack analyzer"], callback=join_get_jobid_forensic_filter) + + return + + +@phantom.playbook_block() +def normalized_job_forensic_report_output_1(action=None, success=None, container=None, results=None, handle=None, filtered_artifacts=None, filtered_results=None, custom_function=None, **kwargs): + phantom.debug("normalized_job_forensic_report_output_1() called") + + ################################################################################ + # This block uses custom code for normalizing score. Adjust the logic as desired + # in the documented sections. + ################################################################################ + + playbook_input_vault_id = phantom.collect2(container=container, datapath=["playbook_input:vault_id"]) + saa_get_file_job_forensics_output_result_data = phantom.collect2(container=container, datapath=["saa_get_file_job_forensics_output:action_result.data.*.DisplayScore","saa_get_file_job_forensics_output:action_result.data.*.Detections.*.Description","saa_get_file_job_forensics_output:action_result.data.*.Verdict","saa_get_file_job_forensics_output:action_result.data"], action_results=results) + + playbook_input_vault_id_values = [item[0] for item in playbook_input_vault_id] + saa_get_file_job_forensics_output_result_item_0 = [item[0] for item in saa_get_file_job_forensics_output_result_data] + saa_get_file_job_forensics_output_result_item_1 = [item[1] for item in saa_get_file_job_forensics_output_result_data] + saa_get_file_job_forensics_output_result_item_2 = [item[2] for item in saa_get_file_job_forensics_output_result_data] + saa_get_file_job_forensics_output_result_item_3 = [item[3] for item in saa_get_file_job_forensics_output_result_data] + + normalized_job_forensic_report_output_1__file_score_object = None + normalized_job_forensic_report_output_1__scores = None + normalized_job_forensic_report_output_1__categories = None + normalized_job_forensic_report_output_1__confidence = None + + ################################################################################ + ## Custom Code Start + ################################################################################ + + # Write your custom code here... + score_id =0 + score_table = { + "0":"Unknown", + "10":"Very_Safe", + "20":"Safe", + "30":"Probably_Safe", + "40":"Leans_Safe", + "50":"May_not_be_Safe", + "60":"Exercise_Caution", + "70":"Suspicious_or_Risky", + "80":"Possibly_Malicious", + "90":"Probably_Malicious", + "100":"Malicious" + } + #phantom.debug("vault_id: {}".format(ssa_get_job_forensics_output_result_item_0)) + #phantom.debug("DisplayScore: {}".format(ssa_get_job_forensics_output_result_item_1)) + #phantom.debug("Category: {}".format(ssa_get_job_forensics_output_result_item_2)) + #phantom.debug("verdict: {}".format(ssa_get_job_forensics_output_result_item_3)) + #phantom.debug("action_data: {}".format(ssa_get_job_forensics_output_result_item_4)) + + + normalized_job_forensic_report_output_1__file_score_object = [] + normalized_job_forensic_report_output_1__scores = [] + normalized_job_forensic_report_output_1__categories = [] + normalized_job_forensic_report_output_1__confidence = [] + + ## normalized NoneType value to avoid enumeration failure + file_detonation_param_list = [(i or "") for i in playbook_input_vault_id_values] + file_detonation_threat_score_list = [(i or 0) for i in saa_get_file_job_forensics_output_result_item_0] + file_detonation_category_list = [(i or "") for i in saa_get_file_job_forensics_output_result_item_1] + file_detonation_verdict_list = [(i or "") for i in saa_get_file_job_forensics_output_result_item_2] + + ## get the set() or unique input url parameter. + + index_file_dict = {} + set_file_inputs = set(file_detonation_param_list) + + for file_input in set_file_inputs: + vaultid_list = [] + score_list = [] + display_score_list = [] + category_list = [] + + ## getting the index of each detonation phase of the url group the result for each url detonation + file_input_index = [indx for indx, vaultid_val in enumerate(file_detonation_param_list) if vaultid_val == file_input] + index_file_dict[file_input] = file_input_index + + for idx,(_vaultid, _score, _display_score, _category) in enumerate(zip(file_detonation_param_list, file_detonation_verdict_list, file_detonation_threat_score_list, file_detonation_category_list)): + if _vaultid == file_input and idx in index_file_dict[file_input]: + vaultid_list.append(_vaultid) + score_list.append(_score) + display_score_list.append(_display_score) + category_list.append(_category) + + ## if score_list is empty or it has one element but empty string, lets score it base on confidence score of its engine detonation + #phantom.debug("score_list: {} len: {}".format(score_list, len(score_list))) + #phantom.debug("category_list: {} len: {}".format(category_list, len(category_list))) + confidence_ = list(set(display_score_list))[0] + categories = list(set(category_list)) + + if len(score_list) == 0 or (len(set(score_list)) == 1 and score_list[0] == ""): + if confidence_ >= 0 and confidence_ < 10: + score_id = 0 + elif confidence_ >= 10 and confidence_ < 20: + score_id = 10 + elif confidence_ >= 20 and confidence_ < 30: + score_id = 20 + elif confidence_ >= 30 and confidence_ < 40: + score_id = 30 + elif confidence_ >= 40 and confidence_ < 50: + score_id = 40 + elif confidence_ >= 50 and confidence_ < 60: + score_id = 50 + elif confidence_ >= 60 and confidence_ < 70: + score_id = 60 + elif confidence_ >= 70 and confidence_ < 80: + score_id = 70 + elif confidence_ >= 80 and confidence_ < 90: + score_id = 80 + elif confidence_ >= 90 and confidence_ < 100: + score_id = 90 + elif confidence_ >= 100: + score_id = 100 + + score = score_table[str(score_id)] + + else: + score = list(set(score_list))[0] + + # Attach final object + normalized_job_forensic_report_output_1__file_score_object.append({'score': score, 'confidence': confidence_, 'categories': categories}) + normalized_job_forensic_report_output_1__scores.append(score) + normalized_job_forensic_report_output_1__categories.append(categories) + normalized_job_forensic_report_output_1__confidence.append(confidence_) + phantom.debug("normalized_job_forensic_report_output_1__file_score_object: {}".format(normalized_job_forensic_report_output_1__file_score_object)) + phantom.debug("normalized_job_forensic_report_output_1__scores: {}".format(normalized_job_forensic_report_output_1__scores)) + phantom.debug("normalized_job_forensic_report_output_1__categories: {}".format(normalized_job_forensic_report_output_1__categories)) + ################################################################################ + ## Custom Code End + ################################################################################ + + phantom.save_run_data(key="normalized_job_forensic_report_output_1:file_score_object", value=json.dumps(normalized_job_forensic_report_output_1__file_score_object)) + phantom.save_run_data(key="normalized_job_forensic_report_output_1:scores", value=json.dumps(normalized_job_forensic_report_output_1__scores)) + phantom.save_run_data(key="normalized_job_forensic_report_output_1:categories", value=json.dumps(normalized_job_forensic_report_output_1__categories)) + phantom.save_run_data(key="normalized_job_forensic_report_output_1:confidence", value=json.dumps(normalized_job_forensic_report_output_1__confidence)) + + format_file_report(container=container) + + return + + +@phantom.playbook_block() +def format_file_report(action=None, success=None, container=None, results=None, handle=None, filtered_artifacts=None, filtered_results=None, custom_function=None, **kwargs): + phantom.debug("format_file_report() called") + + ################################################################################ + # Format a summary table with the information gathered from the playbook. + ################################################################################ + + template = """SOAR analyzed File(s) using Splunk Attack Analyzer. The table below shows a summary of the information gathered.\n\n| File hash | Score | Confidence |Categories | Report Link | Source |\n| --- | --- | --- | --- | --- |\n%%\n| `{0}` | {1} | {2} | {3} |https://app.twinwave.io/job/{4} | Splunk Attack Analyzer (SAA){1}{2}{3}{4} |\n%%\n\n\n""" + + # parameter list for template variable replacement + parameters = [ + "playbook_input:vault_id", + "normalized_job_forensic_report_output_1:custom_function:scores", + "normalized_job_forensic_report_output_1:custom_function:confidence", + "normalized_job_forensic_report_output_1:custom_function:categories", + "get_jobid_of_file_detonation_output:custom_function:jobid" + ] + + ################################################################################ + ## Custom Code Start + ################################################################################ + + # Write your custom code here... + #phantom.debug(phantom.format(container=container, template=template, parameters=parameters, name="format_report_file")) + ################################################################################ + ## Custom Code End + ################################################################################ + + phantom.format(container=container, template=template, parameters=parameters, name="format_file_report") + + build_file_output(container=container) + + return + + +@phantom.playbook_block() +def build_file_output(action=None, success=None, container=None, results=None, handle=None, filtered_artifacts=None, filtered_results=None, custom_function=None, **kwargs): + phantom.debug("build_file_output() called") + + ################################################################################ + # This block uses custom code to generate an observable dictionary to output into + # the observables data path. + ################################################################################ + + playbook_input_vault_id = phantom.collect2(container=container, datapath=["playbook_input:vault_id"]) + get_jobid_of_file_detonation_output__jobid = json.loads(_ if (_ := phantom.get_run_data(key="get_jobid_of_file_detonation_output:jobid")) != "" else "null") # pylint: disable=used-before-assignment + normalized_job_forensic_report_output_1__file_score_object = json.loads(_ if (_ := phantom.get_run_data(key="normalized_job_forensic_report_output_1:file_score_object")) != "" else "null") # pylint: disable=used-before-assignment + + playbook_input_vault_id_values = [item[0] for item in playbook_input_vault_id] + + build_file_output__observable_array = None + + ################################################################################ + ## Custom Code Start + ################################################################################ + + # Write your custom code here... + build_file_output__observable_array = [] + for jobs_id in get_jobid_of_file_detonation_output__jobid: + for _vault_id, external_id, file_object in zip(playbook_input_vault_id_values, jobs_id, normalized_job_forensic_report_output_1__file_score_object): + phantom.debug("vault: {} id: {}".format(_vault_id, external_id)) + observable_object = { + + "vault_id": _vault_id, + "type": "hash", + "reputation": { + "score": file_object['score'], + "confidence": file_object['confidence'], + + }, + "enrichment": { + "provider": "Splunk Attack Analyzer", + "type": "file", + + }, + "categories": file_object['categories'], + "source": "Splunk Attack Analyzer (SAA)", + "source_link":f"https://app.twinwave.io/job/{external_id}" + } + build_file_output__observable_array.append(observable_object) + phantom.debug("build_file_output__observable_array: {}".format(build_file_output__observable_array)) + ################################################################################ + ## Custom Code End + ################################################################################ + + phantom.save_run_data(key="build_file_output:observable_array", value=json.dumps(build_file_output__observable_array)) + + 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/SAA_Dynamic_Analysis.yml b/playbooks/SAA_Dynamic_Analysis.yml new file mode 100644 index 0000000000..aaeb0e971f --- /dev/null +++ b/playbooks/SAA_Dynamic_Analysis.yml @@ -0,0 +1,25 @@ +name: SAA Dynamic Analysis +id: 2754c122-c63b-4558-9b83-23c1e1b96177 +version: 1 +date: '2023-03-24' +author: Teoderick Contreras, Splunk +type: Investigation +description: "Accepts url link, domain or vault_id (hash) to be detonated using Splunk Attacker (SAA) API connector. This playbook produces a normalized output for each user and device." +playbook: SAA_Dynamic_Analysis +how_to_implement: This input playbook requires the SAA API connector to be configured. It is designed to work in conjunction with the Dynamic Attribute Lookup playbook or other playbooks in the same style. +references: [] +app_list: + - CrowdStrike OAuth API +tags: + platform_tags: + - reputation + - url + - domain + - sandbox + - ip + - file_hash + playbook_type: Input + vpe_type: Modern + playbook_fields: [] + product: + - Splunk SOAR \ No newline at end of file