diff --git a/.doctrees/environment.pickle b/.doctrees/environment.pickle index 8d80e033c..dbdd34250 100644 Binary files a/.doctrees/environment.pickle and b/.doctrees/environment.pickle differ diff --git a/.doctrees/fn_extrahop/README.doctree b/.doctrees/fn_extrahop/README.doctree index 22b42e206..b66bfc61d 100644 Binary files a/.doctrees/fn_extrahop/README.doctree and b/.doctrees/fn_extrahop/README.doctree differ diff --git a/.environments/README.html b/.environments/README.html index ff170304d..e939a1109 100644 --- a/.environments/README.html +++ b/.environments/README.html @@ -257,7 +257,7 @@
```python @@ -420,12 +441,13 @@ def main(): inputs.extrahop_note = '\n'.join([detection_note if detection_note else "", make_summary_note()]) inputs.extrahop_update_time = 0 main() + ```
```python @@ -471,6 +493,7 @@ def main(): main() ``` +
@@ -520,15 +544,15 @@ results = { "result": "success" }, "inputs": { - "extrahop_device_ids": "3", - "extrahop_tag_id": 5 + "extrahop_device_ids": "4294967313", + "extrahop_tag_id": 21 }, "metrics": { - "execution_time_ms": 810, - "host": "myhost.ibm.com", + "execution_time_ms": 4046, + "host": "MBP", "package": "fn-extrahop", "package_version": "1.0.0", - "timestamp": "2022-04-13 17:19:42", + "timestamp": "2023-04-10 14:21:27", "version": "1.0" }, "raw": null, @@ -541,7 +565,7 @@ results = {
```python @@ -563,7 +587,7 @@ if not inputs.extrahop_tag_id:
```python
@@ -586,17 +610,17 @@ def main():
device_id = INPUTS.get("extrahop_device_ids")
tag_id = INPUTS.get("extrahop_tag_id")
note_text = "ExtraHop Reveal(x): Playbook {0}: Successfully assigned tag '{1}' with id {2} to device id {3} for SOAR " \
- "function {4} with parameters {5}.".format(PB_NAME, tag_name, tag_id, device_id, FN_NAME, ", ".join("{}:{}".format(k, v) for k, v in INPUTS.items()))
+ "function {4} with parameters:
{5}.".format(PB_NAME, tag_name, tag_id, device_id, FN_NAME, ", ".join("{}:{}".format(k, v) for k, v in INPUTS.items()))
elif result == "failed":
note_text = "ExtraHop Reveal(x): Playbook {0}: Failed to assign tag {1} with id {2} to device id {3} for " \
- "SOAR function {4} with parameters {5}.".format(PB_NAME, tag_name, tag_id, device_id, FN_NAME, ", ".join("{}:{}".format(k, v) for k, v in INPUTS.items()))
+ "SOAR function {4} with parameters:
{5}.".format(PB_NAME, tag_name, tag_id, device_id, FN_NAME, ", ".join("{}:{}".format(k, v) for k, v in INPUTS.items()))
else:
note_text = "ExtraHop Reveal(x): Playbook {0}: Assign tag {1} with id {2} to device id {3} failed with unexpected " \
- "response for SOAR function {4} with parameters {5}.".format(PB_NAME, tag_name, tag_id, device_id, FN_NAME, ", ".join("{}:{}".format(k, v) for k, v in INPUTS.items()))
+ "response for SOAR function {4} with parameters:
{5}.".format(PB_NAME, tag_name, tag_id, device_id, FN_NAME, ", ".join("{}:{}".format(k, v) for k, v in INPUTS.items()))
else:
note_text += "ExtraHop Reveal(x): Playbook {0}: There was no result returned while attempting " \
- "to assign tag {1} with id {2} to device id {3} for SOAR function {4} with parameters {5}."\
+ "to assign tag {1} with id {2} to device id {3} for SOAR function {4} with parameters:
{5}."\
.format(PB_NAME, tag_name, tag_id, device_id, FN_NAME, ", ".join("{}:{}".format(k, v) for k, v in INPUTS.items()))
incident.addNote(helper.createRichText(note_text))
@@ -654,14 +678,14 @@ results = {
"result": "success"
},
"inputs": {
- "extrahop_tag_name": "TEST_TAG_1"
+ "extrahop_tag_name": "SOAR-Testing-tag"
},
"metrics": {
- "execution_time_ms": 798,
- "host": "myhost.ibm.com",
+ "execution_time_ms": 7343,
+ "host": "MBP",
"package": "fn-extrahop",
"package_version": "1.0.0",
- "timestamp": "2022-04-13 17:22:37",
+ "timestamp": "2023-04-10 13:43:35",
"version": "1.0"
},
"raw": null,
@@ -674,7 +698,7 @@ results = {
```python @@ -682,10 +706,11 @@ inputs.extrahop_tag_name = playbook.inputs.extrahop_tag_name if inputs.extrahop_tag_name is None: raise ValueError("The tag name is not set") ``` +
```python
@@ -708,23 +733,26 @@ if CONTENT:
playbook.addProperty("tag_created", {})
tag = INPUTS.get("extrahop_tag_name")
note_text = "ExtraHop Reveal(x): Playbook {0}: Successfully created tag '{1}' for SOAR " \
- "function {2} with parameters {3}.".format(PB_NAME, tag, FN_NAME, ", ".join("{}:{}".format(k, v) for k, v in INPUTS.items()))
+ "function {2} with parameters:
{3}.".format(PB_NAME, tag, FN_NAME, ", ".join("{}:{}".format(k, v) for k, v in INPUTS.items()))
elif result == "failed":
note_text = "ExtraHop Reveal(x): Playbook {0}: Failed to create tag '{1}' for " \
- "SOAR function {2} with parameters {3}.".format(PB_NAME, tag, FN_NAME, ", ".join("{}:{}".format(k, v) for k, v in INPUTS.items()))
+ "SOAR function {2} with parameters:
{3}.".format(PB_NAME, tag, FN_NAME, ", ".join("{}:{}".format(k, v) for k, v in INPUTS.items()))
elif result == "exists":
note_text = "ExtraHop Reveal(x): Playbook {0}: A 422 (tag name exists) error was thrown while to create tag '{1}' for " \
- "SOAR function {2} with parameters {3}.".format(PB_NAME, tag, FN_NAME, ", ".join("{}:{}".format(k, v) for k, v in INPUTS.items()))
+ "SOAR function {2} with parameters:
{3}.".format(PB_NAME, tag, FN_NAME, ", ".join("{}:{}".format(k, v) for k, v in INPUTS.items()))
else:
note_text = "ExtraHop Reveal(x): Playbook {0}: Create tag '{1}' failed with unexpected " \
- "response for SOAR function {2} with parameters {3}.".format(PB_NAME, tag, FN_NAME, ", ".join("{}:{}".format(k, v) for k, v in INPUTS.items()))
+ "response for SOAR function {2} with parameters:
{3}.".format(PB_NAME, tag, FN_NAME, ", ".join("{}:{}".format(k, v) for k, v in INPUTS.items()))
else:
note_text += "ExtraHop Reveal(x): Playbook{0}: There was no result returned while attempting " \
- "to create a tag '{1}'for SOAR function {2} with parameters {3} ."\
+ "to create a tag '{1}'for SOAR function {2} with parameters:
{3} ."\
.format(PB_NAME, tag, FN_NAME, ", ".join("{}:{}".format(k, v) for k, v in INPUTS.items()))
incident.addNote(helper.createRichText(note_text))
+
+
```
+
```python @@ -843,14 +909,14 @@ None
```python ## ExtraHop - pb_extrahop_rx_get_activitymaps post processing script ## # Globals FN_NAME = "funct_extrahop_rx_get_activitymaps" -PB_NAME = "Extrahop Reveal(x): Get Activitymaps" +PB_NAME = "Extrahop Reveal(x): Get Activity Maps" results = playbook.functions.results.get_activitymap_results CONTENT = results.get("content", {}) INPUTS = results.get("inputs", {}) @@ -863,7 +929,7 @@ def main(): note_text = '' if CONTENT: ams = CONTENT.get("result") - note_text = "ExtraHop Reveal(x): Playbook {0}: There were {1} Activitymaps returned for SOAR " \ + note_text = "ExtraHop Reveal(x): Playbook {0}: There were {1} Activity Maps returned for SOAR " \ "function {2} with parameters {3}.".format(PB_NAME, len(ams), FN_NAME, ", ".join("{}:{}".format(k, v) for k, v in INPUTS.items())) if ams: for am in ams: @@ -921,7 +987,6 @@ def main(): main() - ```
@@ -964,20 +1029,20 @@ The automatic data table playbook `Extrahop Reveal(x): Update Detection (PB)` is results = { "content": { "result": { - "author": "setup", - "note": "\nIBM SOAR 16/05/2022 15:13:37\n[SOAR Case - 4305](https://127.0.0.1:1443/#incidents/4305)", - "update_time": 1652711350410 + "author": "rest_api_id_33ovi...", + "note": "\nIBM SOAR 10/04/2023 15:36:28\n[SOAR Case - 3080](https://host0.ibm.com:443/#incidents/3080)\nIBM SOAR 10/04/2023 14:00:50\n[SOAR Case - 3390](https://host1.ibm.com:443/#incidents/3390)", + "update_time": 1681150711820 } }, "inputs": { - "extrahop_detection_id": 3 + "extrahop_detection_id": 4294967305 }, "metrics": { - "execution_time_ms": 780, - "host": "myhost.ibm.com", + "execution_time_ms": 447, + "host": "MBP", "package": "fn-extrahop", "package_version": "1.0.0", - "timestamp": "2022-05-16 15:29:13", + "timestamp": "2023-04-10 14:18:35", "version": "1.0" }, "raw": null, @@ -990,29 +1055,25 @@ results = {```python inputs.extrahop_detection_id = incident.properties.extrahop_detection_id -inputs.incident_id = incident.id -inputs.soar_inc_owner_id = incident.owner_id -inputs.soar_inc_plan_status = incident.plan_status -inputs.soar_inc_resolution_id = incident.resolution_id ```
```python
-## ExtraHop - pb_extrahop_rx_update_setection post processing script ##
+## ExtraHop - pb_extrahop_rx_update_detection post processing script ##
# Globals
-FN_NAME = "funct_extrahop_rx_update_detection"
+FN_NAME = "funct_extrahop_rx_get_detection_note"
PB_NAME = "Extrahop Reveal(x): Update Detection"
-results = playbook.functions.results.update_detection_result
+results = playbook.functions.results.get_detection_note_result
CONTENT = results.get("content", {})
INPUTS = results.get("inputs", {})
@@ -1021,24 +1082,28 @@ def main():
note_text = ''
if CONTENT:
result = CONTENT.get("result", None)
- if result == "success":
- playbook.addProperty("update_detection_ok", {})
- note_text = "ExtraHop Integration: Playbook {0}: Successfully updated the detection status for SOAR " \
- "function {1} with parameters {2}.".format(PB_NAME, FN_NAME, ", ".join("{}:{}".format(k, v) for k, v in INPUTS.items()))
- elif result == "failed":
- note_text = "ExtraHop Integration: Playbook {0}: Failed to update the detection status for " \
- "SOAR function {1} with parameters {2}.".format(PB_NAME, FN_NAME, ", ".join("{}:{}".format(k, v) for k, v in INPUTS.items()))
- else:
- note_text = "ExtraHop Integration: Playbook {0}: Update detection status failed with unexpected " \
- "response for SOAR function {1} with parameters {2}.".format(PB_NAME, FN_NAME, ", ".join("{}:{}".format(k, v) for k, v in INPUTS.items()))
+ if result:
+ note = result.get("note", None)
+ if note:
+ playbook.addProperty("get_note_ok", {})
+ else:
+ note_text += "ExtraHop Integration: Playbook {0}: Get detection note failed for " \
+ "SOAR function {1} with parameters {2}."\
+ .format(PB_NAME, FN_NAME, ", ".join("{}:{}".format(k, v) for k, v in INPUTS.items()))
+ elif CONTENT.get("error", None):
+ note_text += u"ExtraHop Integration: Playbook {0}: Get detection note failed for " \
+ "SOAR function {1} with parameters {2}."\
+ .format(PB_NAME, FN_NAME, ", ".join("{}:{}".format(k, v) for k, v in INPUTS.items()))
+ note_text += "
Error code: {0}, Error {1}.".format(CONTENT.get("error"), CONTENT.get("text"))
else:
note_text += "ExtraHop Integration: Playbook {0}: There was no result returned while attempting " \
- "to update the detection status {1} for SOAR function {2} with parameters {3}."\
+ "to get a detection note for SOAR function {1} with parameters {2}."\
.format(PB_NAME, FN_NAME, ", ".join("{}:{}".format(k, v) for k, v in INPUTS.items()))
-
- incident.addNote(helper.createRichText(note_text))
+ if note_text:
+ incident.addNote(helper.createRichText(note_text))
main()
+
```
@@ -1090,54 +1156,101 @@ The following screenshot shows an example of a note added to a SOAR incident: results = { "content": { "result": { - "appliance_id": 0, - "assignee": "a@a.com", + "appliance_id": 1, + "assignee": "admin@example.com", "categories": [ "sec", "sec.caution" ], - "description": "Over the past week, servers negotiated SSL/TLS sessions with a cipher suite that includes an encryption algorithm that is known to be vulnerable. Cipher suites that contain weak encryption algorithms such as CBC, 3DES, RC4, null, anonymous, and export should be removed from servers and replaced with stronger cipher suites.", - "end_time": 1647051270000, - "id": 71, + "description": "[pc3](#/metrics/devices/44522fe6bb834d83a3b0a142b7da750a.0e3da802a0b30000/overview?from=1681140240\u0026interval_type=DT\u0026until=1681140270) sent an HTTP request that included a suspicious host in the request header. This host is considered suspicious based on threat intelligence found in your ExtraHop system. Confirm whether [pc3](#/metrics/devices/44522fe6bb834d83a3b0a142b7da750a.0e3da802a0b30000/overview?from=1681140240\u0026interval_type=DT\u0026until=1681140270) is the victim of a malware or phishing attack.\n\nSuspicious hostname linked to this detection:\n* zupertech.com", + "end_time": 1681140270000, + "id": 4294967305, "is_user_created": false, - "mitre_tactics": [], - "mitre_techniques": [], - "participants": [ + "mitre_tactics": [ { - "external": false, - "id": 175, - "object_id": 3, - "object_type": "device", - "role": "offender" + "id": "TA0001", + "name": "Initial Access", + "url": "https://attack.mitre.org/tactics/TA0001" + }, + { + "id": "TA0010", + "name": "Exfiltration", + "url": "https://attack.mitre.org/tactics/TA0010" + }, + { + "id": "TA0011", + "name": "Command and Control", + "url": "https://attack.mitre.org/tactics/TA0011" + } + ], + "mitre_techniques": [ + { + "id": "T1041", + "legacy_ids": [ + "T1041" + ], + "name": "Exfiltration Over C2 Channel", + "url": "https://attack.mitre.org/techniques/T1041" + }, + { + "id": "T1189", + "legacy_ids": [ + "T1189" + ], + "name": "Drive-by Compromise", + "url": "https://attack.mitre.org/techniques/T1189" }, + { + "id": "T1566", + "legacy_ids": [ + "T1192" + ], + "name": "Phishing", + "url": "https://attack.mitre.org/techniques/T1566" + }, + { + "id": "T1573", + "legacy_ids": [ + "T1024", + "T1032", + "T1079" + ], + "name": "Encrypted Channel", + "url": "https://attack.mitre.org/techniques/T1573" + } + ], + "mod_time": 1681144146129, + "participants": [ { "external": false, - "id": 179, - "object_id": 6, + "id": 1285, + "object_id": 4294967310, "object_type": "device", "role": "offender" } ], - "properties": {}, - "resolution": null, - "risk_score": 61, - "start_time": 1646559540000, - "status": "in_progress", - "ticket_id": "3055", - "title": "Weekly Summary: Weak Cipher Suites", - "type": "weak_cipher", - "update_time": 1647656040000 + "properties": { + "host": "zupertech.com" + }, + "resolution": "action_taken", + "risk_score": 60, + "start_time": 1681140240000, + "status": "closed", + "ticket_id": "3390", + "title": "HTTP Request to a Suspicious Host", + "type": "ti_http_host", + "update_time": 1681140270000 } }, "inputs": { - "extrahop_detection_id": 71 + "extrahop_detection_id": 4294967305 }, "metrics": { - "execution_time_ms": 1373, - "host": "myhost.ibm.com", + "execution_time_ms": 459, + "host": "MBP", "package": "fn-extrahop", "package_version": "1.0.0", - "timestamp": "2022-04-13 17:01:56", + "timestamp": "2023-04-10 14:18:51", "version": "1.0" }, "raw": null, @@ -1150,7 +1263,7 @@ results = {
```python @@ -1160,30 +1273,29 @@ inputs.extrahop_detection_id = incident.properties.extrahop_detection_id
```python ## ExtraHop - pb_extrahop_rx_search_detections post processing script ## -import datetime +# funct_extrahop_rx_get_detections # Globals -FN_NAME = "funct_extrahop_rx_search_detections" -PB_NAME = "Extrahop Revealx search detections" -results = playbook.functions.results.search_detections_results +FN_NAME = "funct_extrahop_rx_get_detections" +PB_NAME = "Extrahop Reveal(x): Refresh Case" +results = playbook.functions.results.get_detections_results CONTENT = results.get("content", {}) INPUTS = results.get("inputs", {}) QUERY_EXECUTION_DATE = results["metrics"]["timestamp"] DATA_TABLE = "extrahop_detections" -# Read CATEGORY_MAP and TYPE_MAP from workflow property. +# Read CATEGORY_MAP and TYPE_MAP from playbook property. CATEGORY_MAP = playbook.properties.category_map TYPE_MAP = playbook.properties.type_map - LINKBACK_URL = "/extrahop/#/detections/detail/{}" # Processing def process_dets(det): - detection_url = make_linkback_url(det["id"]) + detection_url = make_linkback_url(det.get("id", None)) detection_url_html = u'
' \ .format(detection_url, det.get("id", None)) newrow = incident.addRow(DATA_TABLE) @@ -1207,23 +1319,35 @@ def process_dets(det): newrow.resolution = det.get("resolution", None) #newrow.ticket_url = ''.format(det.get(f2, None), det.get(f2, None).split('/')[-1]) newrow.ticket_id = det.get("ticket_id", None) - newrow.properties = make_properties_string(det) + newrow.properties = make_json_string(det.get("properties", {})) newrow.participants = make_list_string(det.get("participants", [])) - newrow.mitre_tactics = make_list_string(det.get("mitre_tactics", [])) newrow.mitre_techniques = make_list_string(det.get("mitre_techniques", [])) - -def make_properties_string(det): + newrow.mitre_tactics = make_list_string(det.get("mitre_tactics", [])) + + # Update the "UPDATEABLE_FIELDS" custom fields also + incident.properties.extrahop_assignee = det.get("assignee", None) + incident.properties.extrahop_risk_score = det.get("risk_score", None) + incident.properties.extrahop_mod_time = det.get("mod_time", None) + incident.properties.extrahop_end_time = det.get("end_time", None) + incident.properties.extrahop_status = det.get("status", None) + + # Add participant artifacts + add_properties_artifacts(det.get("properties", {})) + + # Add participant artifacts + add_participants_artifacts(det.get("det_id", None), det.get("participants", [])) + +def make_json_string(detection_json): """_summary_ Args: - det (json object): ExtraHop detection object + det (json object): ExtraHop detection object Returns: str : properties json object converted to a formatted string """ tbl = '' - properties = det.get("properties", {}) - for i, j in properties.items(): + for i, j in detection_json.items(): if i == "suspicious_ipaddr": det_type = "Suspicious IP Addresses" value = j["value"] @@ -1231,14 +1355,14 @@ def make_properties_string(det): tbl = '{0}:- -```python -search_filters = [ - "extrahop_device_field", - "extrahop_device_operand", + }, + { + "analysis": "advanced", + "analysis_level": 1, + "auto_role": "custom", + "cdp_name": "", + "cloud_account": null, + "cloud_instance_description": null, + "cloud_instance_id": null, + "cloud_instance_name": null, + "cloud_instance_type": null, + "critical": false, + "custom_criticality": null, + "custom_make": null, + "custom_model": null, + "custom_name": "aws.vpc.dns", + "custom_type": "", + "default_name": "Custom ~aws.vpc.dns----", + "description": null, + "device_class": "custom", + "dhcp_name": "", + "discover_time": 1681139670000, + "discovery_id": "~aws.vpc.dns----", + "display_name": "aws.vpc.dns", + "dns_name": "", + "extrahop_id": "~aws.vpc.dns----", + "id": 4294967298, + "ipaddr4": null, + "ipaddr6": null, + "is_l3": false, + "last_seen_time": null, + "macaddr": null, + "mod_time": 1681139763633, + "model": null, + "model_override": null, + "netbios_name": "", + "node_id": 1, + "on_watchlist": false, + "parent_id": null, + "role": "custom", + "subnet_id": null, + "user_mod_time": 0, + "vendor": null, + "vlanid": 0, + "vpc_id": null + }, + { + "analysis": "advanced", + "analysis_level": 1, + "auto_role": "custom", + "cdp_name": "", + "cloud_account": null, + "cloud_instance_description": null, + "cloud_instance_id": null, + "cloud_instance_name": null, + "cloud_instance_type": null, + "critical": false, + "custom_criticality": null, + "custom_make": null, + "custom_model": null, + "custom_name": "aws.vpc.ntp", + "custom_type": "", + "default_name": "Custom ~aws.vpc.ntp----", + "description": null, + "device_class": "custom", + "dhcp_name": "", + "discover_time": 1681139640000, + "discovery_id": "~aws.vpc.ntp----", + "display_name": "aws.vpc.ntp", + "dns_name": "", + "extrahop_id": "~aws.vpc.ntp----", + "id": 4294967312, + "ipaddr4": null, + "ipaddr6": null, + "is_l3": false, + "last_seen_time": null, + "macaddr": null, + "mod_time": 1681139913487, + "model": null, + "model_override": null, + "netbios_name": "", + "node_id": 1, + "on_watchlist": false, + "parent_id": null, + "role": "custom", + "subnet_id": null, + "user_mod_time": 0, + "vendor": null, + "vlanid": 0, + "vpc_id": null + }, + { + "analysis": "advanced", + "analysis_level": 1, + "auto_role": "gateway", + "cdp_name": "", + "cloud_account": null, + "cloud_instance_description": null, + "cloud_instance_id": null, + "cloud_instance_name": null, + "cloud_instance_type": null, + "critical": false, + "custom_criticality": null, + "custom_make": null, + "custom_model": null, + "custom_name": null, + "custom_type": "", + "default_name": "Device 0eb9806c43070000", + "description": null, + "device_class": "gateway", + "dhcp_name": "", + "discover_time": 1681139640000, + "discovery_id": "0eb9806c43070000", + "display_name": "Device 0eb9806c43070000", + "dns_name": "", + "extrahop_id": "0eb9806c43070000", + "id": 4294967297, + "ipaddr4": null, + "ipaddr6": "fe80::cb9:80ff:fe6c:4307", + "is_l3": false, + "last_seen_time": null, + "macaddr": "0E:B9:80:6C:43:07", + "mod_time": 1681149396781, + "model": null, + "model_override": null, + "netbios_name": "", + "node_id": 1, + "on_watchlist": false, + "parent_id": null, + "role": "gateway", + "subnet_id": null, + "user_mod_time": 0, + "vendor": null, + "vlanid": 0, + "vpc_id": null + }, + { + "analysis": "advanced", + "analysis_level": 2, + "auto_role": "gateway", + "cdp_name": "", + "cloud_account": null, + "cloud_instance_description": null, + "cloud_instance_id": null, + "cloud_instance_name": null, + "cloud_instance_type": null, + "critical": false, + "custom_criticality": null, + "custom_make": null, + "custom_model": null, + "custom_name": null, + "custom_type": "", + "default_name": "Device 0e915f41761b0000", + "description": null, + "device_class": "gateway", + "dhcp_name": "", + "discover_time": 1681139610000, + "discovery_id": "0e915f41761b0000", + "display_name": "Device 0e915f41761b0000", + "dns_name": "", + "extrahop_id": "0e915f41761b0000", + "id": 4294967314, + "ipaddr4": "10.1.0.1", + "ipaddr6": null, + "is_l3": false, + "last_seen_time": null, + "macaddr": "0E:91:5F:41:76:1B", + "mod_time": 1681148735347, + "model": null, + "model_override": null, + "netbios_name": "", + "node_id": 1, + "on_watchlist": true, + "parent_id": null, + "role": "gateway", + "subnet_id": null, + "user_mod_time": 0, + "vendor": null, + "vlanid": 0, + "vpc_id": null + }, + { + "analysis": "advanced", + "analysis_level": 2, + "auto_role": "domain_controller", + "cdp_name": "", + "cloud_account": null, + "cloud_instance_description": null, + "cloud_instance_id": null, + "cloud_instance_name": null, + "cloud_instance_type": null, + "critical": false, + "custom_criticality": null, + "custom_make": null, + "custom_model": null, + "custom_name": null, + "custom_type": "", + "default_name": "Device 0e9ded7f42090000", + "description": null, + "device_class": "node", + "dhcp_name": "", + "discover_time": 1681139610000, + "discovery_id": "0e9ded7f42090000", + "display_name": "dc1.i.rx.tours", + "dns_name": "dc1.i.rx.tours", + "extrahop_id": "0e9ded7f42090000", + "id": 4294967313, + "ipaddr4": null, + "ipaddr6": "2600:1f10:44c7:3300:383d:6cd4:d4d5:3019", + "is_l3": false, + "last_seen_time": null, + "macaddr": "0E:9D:ED:7F:42:09", + "mod_time": 1681149485578, + "model": null, + "model_override": null, + "netbios_name": "DC1", + "node_id": 1, + "on_watchlist": true, + "parent_id": null, + "role": "domain_controller", + "subnet_id": null, + "user_mod_time": 0, + "vendor": null, + "vlanid": 0, + "vpc_id": null + }, + { + "analysis": "advanced", + "analysis_level": 1, + "auto_role": "http_server", + "cdp_name": "", + "cloud_account": null, + "cloud_instance_description": null, + "cloud_instance_id": null, + "cloud_instance_name": null, + "cloud_instance_type": null, + "critical": false, + "custom_criticality": null, + "custom_make": null, + "custom_model": null, + "custom_name": null, + "custom_type": "", + "default_name": "Device 0eda16c895d50000", + "description": null, + "device_class": "node", + "dhcp_name": "", + "discover_time": 1681139610000, + "discovery_id": "0eda16c895d50000", + "display_name": "web1.i.rx.tours", + "dns_name": "web1.i.rx.tours", + "extrahop_id": "0eda16c895d50000", + "id": 4294967311, + "ipaddr4": "10.1.1.64", + "ipaddr6": null, + "is_l3": false, + "last_seen_time": null, + "macaddr": "0E:DA:16:C8:95:D5", + "mod_time": 1681149485572, + "model": null, + "model_override": null, + "netbios_name": "", + "node_id": 1, + "on_watchlist": false, + "parent_id": null, + "role": "http_server", + "subnet_id": null, + "user_mod_time": 0, + "vendor": null, + "vlanid": 0, + "vpc_id": null + }, + { + "analysis": "advanced", + "analysis_level": 1, + "auto_role": "pc", + "cdp_name": "", + "cloud_account": null, + "cloud_instance_description": null, + "cloud_instance_id": null, + "cloud_instance_name": null, + "cloud_instance_type": null, + "critical": false, + "custom_criticality": null, + "custom_make": null, + "custom_model": null, + "custom_name": null, + "custom_type": "", + "default_name": "Device 0e3da802a0b30000", + "description": null, + "device_class": "node", + "dhcp_name": "pc3", + "discover_time": 1681139610000, + "discovery_id": "0e3da802a0b30000", + "display_name": "pc3", + "dns_name": "pc3.i.rx.tours", + "extrahop_id": "0e3da802a0b30000", + "id": 4294967310, + "ipaddr4": "10.1.0.161", + "ipaddr6": null, + "is_l3": false, + "last_seen_time": null, + "macaddr": "0E:3D:A8:02:A0:B3", + "mod_time": 1681149427474, + "model": null, + "model_override": null, + "netbios_name": "", + "node_id": 1, + "on_watchlist": false, + "parent_id": null, + "role": "pc", + "subnet_id": null, + "user_mod_time": 0, + "vendor": null, + "vlanid": 0, + "vpc_id": null + }, + { + "analysis": "advanced", + "analysis_level": 1, + "auto_role": "pc", + "cdp_name": "", + "cloud_account": null, + "cloud_instance_description": null, + "cloud_instance_id": null, + "cloud_instance_name": null, + "cloud_instance_type": null, + "critical": false, + "custom_criticality": null, + "custom_make": null, + "custom_model": null, + "custom_name": null, + "custom_type": "", + "default_name": "Device 0e6f5c9ccbcb0000", + "description": null, + "device_class": "node", + "dhcp_name": "pc2", + "discover_time": 1681139610000, + "discovery_id": "0e6f5c9ccbcb0000", + "display_name": "pc2", + "dns_name": "pc2.i.rx.tours", + "extrahop_id": "0e6f5c9ccbcb0000", + "id": 4294967309, + "ipaddr4": "10.1.0.189", + "ipaddr6": null, + "is_l3": false, + "last_seen_time": null, + "macaddr": "0E:6F:5C:9C:CB:CB", + "mod_time": 1681149427468, + "model": null, + "model_override": null, + "netbios_name": "PC2", + "node_id": 1, + "on_watchlist": false, + "parent_id": null, + "role": "pc", + "subnet_id": null, + "user_mod_time": 0, + "vendor": null, + "vlanid": 0, + "vpc_id": null + }, + { + "analysis": "advanced", + "analysis_level": 1, + "auto_role": "other", + "cdp_name": "", + "cloud_account": null, + "cloud_instance_description": null, + "cloud_instance_id": null, + "cloud_instance_name": null, + "cloud_instance_type": null, + "critical": false, + "custom_criticality": null, + "custom_make": null, + "custom_model": null, + "custom_name": null, + "custom_type": "", + "default_name": "Device 0e9d01dde7450000", + "description": null, + "device_class": "node", + "dhcp_name": "", + "discover_time": 1681139610000, + "discovery_id": "0e9d01dde7450000", + "display_name": "ssh1.i.rx.tours", + "dns_name": "ssh1.i.rx.tours", + "extrahop_id": "0e9d01dde7450000", + "id": 4294967307, + "ipaddr4": "10.1.100.187", + "ipaddr6": null, + "is_l3": false, + "last_seen_time": null, + "macaddr": "0E:9D:01:DD:E7:45", + "mod_time": 1681149396796, + "model": null, + "model_override": null, + "netbios_name": "", + "node_id": 1, + "on_watchlist": false, + "parent_id": null, + "role": "other", + "subnet_id": null, + "user_mod_time": 0, + "vendor": null, + "vlanid": 0, + "vpc_id": null + }, + { + "analysis": "advanced", + "analysis_level": 1, + "auto_role": "other", + "cdp_name": "", + "cloud_account": null, + "cloud_instance_description": null, + "cloud_instance_id": null, + "cloud_instance_name": null, + "cloud_instance_type": null, + "critical": false, + "custom_criticality": null, + "custom_make": null, + "custom_model": null, + "custom_name": null, + "custom_type": "", + "default_name": "Device 0e299a804a4d0000", + "description": null, + "device_class": "node", + "dhcp_name": "", + "discover_time": 1681139610000, + "discovery_id": "0e299a804a4d0000", + "display_name": "ftp1.i.rx.tours", + "dns_name": "ftp1.i.rx.tours", + "extrahop_id": "0e299a804a4d0000", + "id": 4294967306, + "ipaddr4": "10.1.100.57", + "ipaddr6": null, + "is_l3": false, + "last_seen_time": null, + "macaddr": "0E:29:9A:80:4A:4D", + "mod_time": 1681149396791, + "model": null, + "model_override": null, + "netbios_name": "", + "node_id": 1, + "on_watchlist": false, + "parent_id": null, + "role": "other", + "subnet_id": null, + "user_mod_time": 0, + "vendor": null, + "vlanid": 0, + "vpc_id": null + }, + { + "analysis": "advanced", + "analysis_level": 1, + "auto_role": "other", + "cdp_name": "", + "cloud_account": null, + "cloud_instance_description": null, + "cloud_instance_id": null, + "cloud_instance_name": null, + "cloud_instance_type": null, + "critical": false, + "custom_criticality": null, + "custom_make": null, + "custom_model": null, + "custom_name": null, + "custom_type": "", + "default_name": "Device 0ecacf92cfcf0000", + "description": null, + "device_class": "node", + "dhcp_name": "ip-10-1-100-212", + "discover_time": 1681139610000, + "discovery_id": "0ecacf92cfcf0000", + "display_name": "ip-10-1-100-212", + "dns_name": "vpn.i.rx.tours", + "extrahop_id": "0ecacf92cfcf0000", + "id": 4294967305, + "ipaddr4": "10.1.100.212", + "ipaddr6": null, + "is_l3": false, + "last_seen_time": null, + "macaddr": "0E:CA:CF:92:CF:CF", + "mod_time": 1681149366180, + "model": null, + "model_override": null, + "netbios_name": "", + "node_id": 1, + "on_watchlist": false, + "parent_id": null, + "role": "other", + "subnet_id": null, + "user_mod_time": 0, + "vendor": null, + "vlanid": 0, + "vpc_id": null + }, + { + "analysis": "advanced", + "analysis_level": 1, + "auto_role": "gateway", + "cdp_name": "", + "cloud_account": null, + "cloud_instance_description": null, + "cloud_instance_id": null, + "cloud_instance_name": null, + "cloud_instance_type": null, + "critical": false, + "custom_criticality": null, + "custom_make": null, + "custom_model": null, + "custom_name": null, + "custom_type": "", + "default_name": "Device 0ea63eed67fd0000", + "description": null, + "device_class": "gateway", + "dhcp_name": "", + "discover_time": 1681139610000, + "discovery_id": "0ea63eed67fd0000", + "display_name": "Device 0ea63eed67fd0000", + "dns_name": "", + "extrahop_id": "0ea63eed67fd0000", + "id": 4294967304, + "ipaddr4": "10.1.100.1", + "ipaddr6": null, + "is_l3": false, + "last_seen_time": null, + "macaddr": "0E:A6:3E:ED:67:FD", + "mod_time": 1681149366175, + "model": null, + "model_override": null, + "netbios_name": "", + "node_id": 1, + "on_watchlist": false, + "parent_id": null, + "role": "gateway", + "subnet_id": null, + "user_mod_time": 0, + "vendor": null, + "vlanid": 0, + "vpc_id": null + }, + { + "analysis": "advanced", + "analysis_level": 1, + "auto_role": "http_server", + "cdp_name": "", + "cloud_account": null, + "cloud_instance_description": null, + "cloud_instance_id": null, + "cloud_instance_name": null, + "cloud_instance_type": null, + "critical": false, + "custom_criticality": null, + "custom_make": null, + "custom_model": null, + "custom_name": null, + "custom_type": "", + "default_name": "Device 0e8d65dcbfe70000", + "description": null, + "device_class": "node", + "dhcp_name": "ip-10-1-100-35", + "discover_time": 1681139610000, + "discovery_id": "0e8d65dcbfe70000", + "display_name": "ip-10-1-100-35", + "dns_name": "echo1.i.rx.tours", + "extrahop_id": "0e8d65dcbfe70000", + "id": 4294967303, + "ipaddr4": "10.1.100.35", + "ipaddr6": null, + "is_l3": false, + "last_seen_time": null, + "macaddr": "0E:8D:65:DC:BF:E7", + "mod_time": 1681149335495, + "model": null, + "model_override": null, + "netbios_name": "", + "node_id": 1, + "on_watchlist": false, + "parent_id": null, + "role": "http_server", + "subnet_id": null, + "user_mod_time": 0, + "vendor": null, + "vlanid": 0, + "vpc_id": null + }, + { + "analysis": "advanced", + "analysis_level": 1, + "auto_role": "gateway", + "cdp_name": "", + "cloud_account": null, + "cloud_instance_description": null, + "cloud_instance_id": null, + "cloud_instance_name": null, + "cloud_instance_type": null, + "critical": false, + "custom_criticality": null, + "custom_make": null, + "custom_model": null, + "custom_name": null, + "custom_type": "", + "default_name": "Device 0ec8fcdae52b0000", + "description": null, + "device_class": "gateway", + "dhcp_name": "", + "discover_time": 1681139610000, + "discovery_id": "0ec8fcdae52b0000", + "display_name": "Device 0ec8fcdae52b0000", + "dns_name": "", + "extrahop_id": "0ec8fcdae52b0000", + "id": 4294967302, + "ipaddr4": null, + "ipaddr6": "fe80::cc8:fcff:feda:e52b", + "is_l3": false, + "last_seen_time": null, + "macaddr": "0E:C8:FC:DA:E5:2B", + "mod_time": 1681139793788, + "model": null, + "model_override": null, + "netbios_name": "", + "node_id": 1, + "on_watchlist": false, + "parent_id": null, + "role": "gateway", + "subnet_id": null, + "user_mod_time": 0, + "vendor": null, + "vlanid": 0, + "vpc_id": null + }, + { + "analysis": "advanced", + "analysis_level": 1, + "auto_role": "http_server", + "cdp_name": "", + "cloud_account": null, + "cloud_instance_description": null, + "cloud_instance_id": null, + "cloud_instance_name": null, + "cloud_instance_type": null, + "critical": false, + "custom_criticality": null, + "custom_make": null, + "custom_model": null, + "custom_name": null, + "custom_type": "", + "default_name": "Device 0e2d40a873950000", + "description": null, + "device_class": "node", + "dhcp_name": "", + "discover_time": 1681139610000, + "discovery_id": "0e2d40a873950000", + "display_name": "web3.i.rx.tours", + "dns_name": "web3.i.rx.tours", + "extrahop_id": "0e2d40a873950000", + "id": 4294967301, + "ipaddr4": null, + "ipaddr6": "2600:1f10:44c7:3300:f8b2:7031:96bb:ee9f", + "is_l3": false, + "last_seen_time": null, + "macaddr": "0E:2D:40:A8:73:95", + "mod_time": 1681149635567, + "model": null, + "model_override": null, + "netbios_name": "", + "node_id": 1, + "on_watchlist": false, + "parent_id": null, + "role": "http_server", + "subnet_id": null, + "user_mod_time": 0, + "vendor": null, + "vlanid": 0, + "vpc_id": null + }, + { + "analysis": "advanced", + "analysis_level": 1, + "auto_role": "pc", + "cdp_name": "", + "cloud_account": null, + "cloud_instance_description": null, + "cloud_instance_id": null, + "cloud_instance_name": null, + "cloud_instance_type": null, + "critical": false, + "custom_criticality": null, + "custom_make": null, + "custom_model": null, + "custom_name": null, + "custom_type": "", + "default_name": "Device 0e5c9467324b0000", + "description": null, + "device_class": "node", + "dhcp_name": "pc1", + "discover_time": 1681139610000, + "discovery_id": "0e5c9467324b0000", + "display_name": "pc1", + "dns_name": "pc1.i.rx.tours", + "extrahop_id": "0e5c9467324b0000", + "id": 4294967300, + "ipaddr4": "10.1.0.6", + "ipaddr6": null, + "is_l3": false, + "last_seen_time": null, + "macaddr": "0E:5C:94:67:32:4B", + "mod_time": 1681149635572, + "model": null, + "model_override": null, + "netbios_name": "", + "node_id": 1, + "on_watchlist": false, + "parent_id": null, + "role": "pc", + "subnet_id": null, + "user_mod_time": 0, + "vendor": null, + "vlanid": 0, + "vpc_id": null + }, + { + "analysis": "advanced", + "analysis_level": 1, + "auto_role": "http_server", + "cdp_name": "", + "cloud_account": null, + "cloud_instance_description": null, + "cloud_instance_id": null, + "cloud_instance_name": null, + "cloud_instance_type": null, + "critical": false, + "custom_criticality": null, + "custom_make": null, + "custom_model": null, + "custom_name": null, + "custom_type": "", + "default_name": "Device 0e7ff45eb0ed0000", + "description": null, + "device_class": "node", + "dhcp_name": "", + "discover_time": 1681139610000, + "discovery_id": "0e7ff45eb0ed0000", + "display_name": "web2.i.rx.tours", + "dns_name": "web2.i.rx.tours", + "extrahop_id": "0e7ff45eb0ed0000", + "id": 4294967299, + "ipaddr4": "10.1.1.94", + "ipaddr6": null, + "is_l3": false, + "last_seen_time": null, + "macaddr": "0E:7F:F4:5E:B0:ED", + "mod_time": 1681149635557, + "model": null, + "model_override": null, + "netbios_name": "", + "node_id": 1, + "on_watchlist": false, + "parent_id": null, + "role": "http_server", + "subnet_id": null, + "user_mod_time": 0, + "vendor": null, + "vlanid": 0, + "vpc_id": null + }, + { + "analysis": "advanced", + "analysis_level": 1, + "auto_role": "other", + "cdp_name": "", + "cloud_account": null, + "cloud_instance_description": null, + "cloud_instance_id": null, + "cloud_instance_name": null, + "cloud_instance_type": null, + "critical": false, + "custom_criticality": null, + "custom_make": null, + "custom_model": null, + "custom_name": null, + "custom_type": "", + "default_name": "Device 0e3332e223c10000", + "description": null, + "device_class": "node", + "dhcp_name": "", + "discover_time": 1681139610000, + "discovery_id": "0e3332e223c10000", + "display_name": "jump.i.rx.tours", + "dns_name": "jump.i.rx.tours", + "extrahop_id": "0e3332e223c10000", + "id": 4294967296, + "ipaddr4": null, + "ipaddr6": "2600:1f10:44c7:3304:2e55:c0b1:7f5f:4a5", + "is_l3": false, + "last_seen_time": null, + "macaddr": "0E:33:32:E2:23:C1", + "mod_time": 1681149577486, + "model": null, + "model_override": null, + "netbios_name": "", + "node_id": 1, + "on_watchlist": false, + "parent_id": null, + "role": "other", + "subnet_id": null, + "user_mod_time": 0, + "vendor": null, + "vlanid": 0, + "vpc_id": null + } + ] + }, + "inputs": {}, + "metrics": { + "execution_time_ms": 555, + "host": "MBP", + "package": "fn-extrahop", + "package_version": "1.0.0", + "timestamp": "2023-04-10 14:00:55", + "version": "1.0" + }, + "raw": null, + "reason": null, + "success": true, + "version": 2.0 +} +``` + +
++ +```python +search_filters = [ + "extrahop_device_field", + "extrahop_device_operand", "extrahop_device_operator" ] for p in search_filters: if hasattr(playbook.inputs, p) and playbook.inputs.get(p): raise ValueError("A search filter and Device ID are not allowed at the same time.") - + if playbook.inputs.extrahop_device_id: inputs.extrahop_device_id = playbook.inputs.extrahop_device_id - + if playbook.inputs.extrahop_active_from: inputs.extrahop_active_from = playbook.inputs.extrahop_active_from if playbook.inputs.extrahop_active_until: @@ -1458,21 +2512,23 @@ if playbook.inputs.extrahop_offset:
```python
## ExtraHop - pb_extrahop_rx_get_devices post processing script ##
-import datetime
# Globals
FN_NAME = "funct_extrahop_rx_get_devices"
-PB_NAME = "Extrahop Reveal(x) search devices"
-results = playbook.functions.results.get_devices_result
+PB_NAME = "Extrahop Reveal(x): Refresh Case"
+results = playbook.functions.results.get_devices_results
CONTENT = results.get("content", {})
INPUTS = results.get("inputs", {})
QUERY_EXECUTION_DATE = results["metrics"]["timestamp"]
# Display subset of fields
DATA_TABLE = "extrahop_devices"
+DATA_TBL_FIELDS = ["display_name", "devs_description", "default_name", "dns_name", "ipaddr4", "ipaddr6", "macaddr",
+ "role", "vendor", "devs_id", "extrahop_id", "activity", "mod_time", "user_mod_time", "discover_time",
+ "last_seen_time"]
LINKBACK_URL = "/extrahop/#/metrics/devices/{}.{}"
@@ -1485,15 +2541,7 @@ def make_linkback_url(dev_id):
Returns:
str: completed url for linkback
"""
- return incident.properties.extrahop_console_url + LINKBACK_URL.format(incident.properties.extrahop_site_uuid,
- dev_id)
-def format_input_params(input_params):
- input_params_formatted =''
- for k, v in input_params.items():
- if k == "extrahop_active_until" or k == "extrahop_active_from":
- v = datetime.datetime.fromtimestamp(v/1000).strftime('%Y-%m-%d %H:%M:%S')
- input_params_formatted += "{}: {}
@@ -1609,24 +2660,19 @@ results = {
"content": {
"result": [
{
- "id": 1,
- "mod_time": 1646045416014,
- "name": "TEST_TAG_1"
- },
- {
- "id": 2,
- "mod_time": 1646064909025,
- "name": "TEST_TAG_2"
+ "id": 21,
+ "mod_time": 1681148615537,
+ "name": "SOAR-Testing-tag"
}
]
},
"inputs": {},
"metrics": {
- "execution_time_ms": 969,
- "host": "myhost.ibm.com",
+ "execution_time_ms": 628,
+ "host": "MBP",
"package": "fn-extrahop",
"package_version": "1.0.0",
- "timestamp": "2022-04-13 17:19:40",
+ "timestamp": "2023-04-10 14:21:21",
"version": "1.0"
},
"raw": null,
@@ -1639,59 +2685,55 @@ results = {
```python
if playbook.inputs.extrahop_tag_name is None:
raise ValueError("The tag name is not set")
-
```
```python
## ExtraHop - pb_extrahop_rx_get_tags post processing script ##
# Globals
FN_NAME = "funct_extrahop_rx_get_tags"
-PB_NAME = "Extrahop Reveal(x): Get Tags"
+PB_NAME = "Extrahop Reveal(x): Assign Tag"
results = playbook.functions.results.get_tags_results
CONTENT = results.get("content", {})
INPUTS = results.get("inputs", {})
-QUERY_EXECUTION_DATE = results["metrics"]["timestamp"]
-DATA_TBL_FIELDS = ["am_description", "am_id", "mod_time", "mode", "name", "owner", "rights", "short_code", "show_alert_status", "walks", "weighting"]
-
# Processing
def main():
note_text = ''
+ tag_name = playbook.inputs.extrahop_tag_name
+ tag_id = None
+
if CONTENT:
tags = CONTENT.get("result", {})
- note_text = "ExtraHop Integration: Playbook{0}: There were {1} Tags returned for SOAR function {2} "\
- "with parameters {3}."\
- .format(PB_NAME, len(tags), FN_NAME, ", ".join("{}:{}".format(k, v) for k, v in INPUTS.items()))
- if tags:
- for tag in tags:
- newrow = incident.addRow("extrahop_tags")
- newrow.query_execution_date = QUERY_EXECUTION_DATE
- newrow.tag = tag.get("name")
- newrow.mod_time = tag.get("mod_time")
- newrow.tag_id = tag.get("id")
- note_text += "
@@ -1745,9 +2788,190 @@ results = {
{
"analysis": "advanced",
"analysis_level": 2,
- "auto_role": "http_server",
+ "auto_role": "custom",
+ "cdp_name": "",
+ "cloud_account": null,
+ "cloud_instance_description": null,
+ "cloud_instance_id": null,
+ "cloud_instance_name": null,
+ "cloud_instance_type": null,
+ "critical": false,
+ "custom_criticality": null,
+ "custom_make": null,
+ "custom_model": null,
+ "custom_name": "aws.vpc.ntp",
+ "custom_type": "",
+ "default_name": "Custom ~aws.vpc.ntp----",
+ "description": null,
+ "device_class": "custom",
+ "dhcp_name": "",
+ "discover_time": 1681158480000,
+ "discovery_id": "~aws.vpc.ntp----",
+ "display_name": "aws.vpc.ntp",
+ "dns_name": "",
+ "extrahop_id": "~aws.vpc.ntp----",
+ "id": 4294967313,
+ "ipaddr4": null,
+ "ipaddr6": null,
+ "is_l3": false,
+ "last_seen_time": null,
+ "macaddr": null,
+ "mod_time": 1681647107939,
+ "model": null,
+ "model_override": null,
+ "netbios_name": "",
+ "node_id": 1,
+ "on_watchlist": true,
+ "parent_id": null,
+ "role": "custom",
+ "subnet_id": null,
+ "user_mod_time": 0,
+ "vendor": null,
+ "vlanid": 0,
+ "vpc_id": null
+ },
+ {
+ "analysis": "advanced",
+ "analysis_level": 2,
+ "auto_role": "db_server",
+ "cdp_name": "",
+ "cloud_account": null,
+ "cloud_instance_description": null,
+ "cloud_instance_id": null,
+ "cloud_instance_name": null,
+ "cloud_instance_type": null,
+ "critical": false,
+ "custom_criticality": null,
+ "custom_make": null,
+ "custom_model": null,
+ "custom_name": null,
+ "custom_type": "",
+ "default_name": "Device 0e627f3316130000",
+ "description": null,
+ "device_class": "node",
+ "dhcp_name": "",
+ "discover_time": 1681158510000,
+ "discovery_id": "0e627f3316130000",
+ "display_name": "db1.i.rx.tours",
+ "dns_name": "db1.i.rx.tours",
+ "extrahop_id": "0e627f3316130000",
+ "id": 4294967298,
+ "ipaddr4": "10.1.1.7",
+ "ipaddr6": null,
+ "is_l3": false,
+ "last_seen_time": null,
+ "macaddr": "0E:62:7F:33:16:13",
+ "mod_time": 1681752256777,
+ "model": null,
+ "model_override": null,
+ "netbios_name": "",
+ "node_id": 1,
+ "on_watchlist": true,
+ "parent_id": null,
+ "role": "db_server",
+ "subnet_id": null,
+ "user_mod_time": 0,
+ "vendor": null,
+ "vlanid": 0,
+ "vpc_id": null
+ },
+ {
+ "analysis": "advanced",
+ "analysis_level": 2,
+ "auto_role": "pc",
+ "cdp_name": "",
+ "cloud_account": null,
+ "cloud_instance_description": null,
+ "cloud_instance_id": null,
+ "cloud_instance_name": null,
+ "cloud_instance_type": null,
+ "critical": false,
+ "custom_criticality": null,
+ "custom_make": null,
+ "custom_model": null,
+ "custom_name": null,
+ "custom_type": "",
+ "default_name": "Device 0e3da802a0b30000",
+ "description": null,
+ "device_class": "node",
+ "dhcp_name": "pc3",
+ "discover_time": 1681158480000,
+ "discovery_id": "0e3da802a0b30000",
+ "display_name": "pc3",
+ "dns_name": "pc3.i.rx.tours",
+ "extrahop_id": "0e3da802a0b30000",
+ "id": 4294967311,
+ "ipaddr4": "10.1.0.161",
+ "ipaddr6": null,
+ "is_l3": false,
+ "last_seen_time": null,
+ "macaddr": "0E:3D:A8:02:A0:B3",
+ "mod_time": 1681752406778,
+ "model": null,
+ "model_override": null,
+ "netbios_name": "PC3",
+ "node_id": 1,
+ "on_watchlist": true,
+ "parent_id": null,
+ "role": "pc",
+ "subnet_id": null,
+ "user_mod_time": 0,
+ "vendor": null,
+ "vlanid": 0,
+ "vpc_id": null
+ },
+ {
+ "analysis": "advanced",
+ "analysis_level": 2,
+ "auto_role": "other",
+ "cdp_name": "",
+ "cloud_account": null,
+ "cloud_instance_description": null,
+ "cloud_instance_id": null,
+ "cloud_instance_name": null,
+ "cloud_instance_type": null,
+ "critical": false,
+ "custom_criticality": null,
+ "custom_make": null,
+ "custom_model": null,
+ "custom_name": null,
+ "custom_type": "",
+ "default_name": "Device 0e2c7dd42fa50000",
+ "description": null,
+ "device_class": "node",
+ "dhcp_name": "",
+ "discover_time": 1681158720000,
+ "discovery_id": "0e2c7dd42fa50000",
+ "display_name": "oasis.i.rx.tours",
+ "dns_name": "oasis.i.rx.tours",
+ "extrahop_id": "0e2c7dd42fa50000",
+ "id": 4294967316,
+ "ipaddr4": null,
+ "ipaddr6": "2600:1f10:44c7:3304:1bb4:204b:45f3:30a0",
+ "is_l3": false,
+ "last_seen_time": null,
+ "macaddr": "0E:2C:7D:D4:2F:A5",
+ "mod_time": 1681752437427,
+ "model": null,
+ "model_override": null,
+ "netbios_name": "",
+ "node_id": 1,
+ "on_watchlist": true,
+ "parent_id": null,
+ "role": "other",
+ "subnet_id": null,
+ "user_mod_time": 0,
+ "vendor": null,
+ "vlanid": 0,
+ "vpc_id": null
+ },
+ {
+ "analysis": "advanced",
+ "analysis_level": 2,
+ "auto_role": "other",
"cdp_name": "",
"cloud_account": null,
+ "cloud_instance_description": null,
"cloud_instance_id": null,
"cloud_instance_name": null,
"cloud_instance_type": null,
@@ -1757,31 +2981,76 @@ results = {
"custom_model": null,
"custom_name": null,
"custom_type": "",
- "default_name": "Device 027437b63df40000",
+ "default_name": "Device 0e3332e223c10000",
"description": null,
"device_class": "node",
"dhcp_name": "",
- "discover_time": 1644418590000,
- "discovery_id": "027437b63df40000",
- "display_name": "Device 027437b63df40000",
+ "discover_time": 1681158450000,
+ "discovery_id": "0e3332e223c10000",
+ "display_name": "jump.i.rx.tours",
+ "dns_name": "jump.i.rx.tours",
+ "extrahop_id": "0e3332e223c10000",
+ "id": 4294967296,
+ "ipaddr4": null,
+ "ipaddr6": "fe80::c33:32ff:fee2:23c1",
+ "is_l3": false,
+ "last_seen_time": null,
+ "macaddr": "0E:33:32:E2:23:C1",
+ "mod_time": 1681752198592,
+ "model": null,
+ "model_override": null,
+ "netbios_name": "",
+ "node_id": 1,
+ "on_watchlist": true,
+ "parent_id": null,
+ "role": "other",
+ "subnet_id": null,
+ "user_mod_time": 0,
+ "vendor": null,
+ "vlanid": 0,
+ "vpc_id": null
+ },
+ {
+ "analysis": "advanced",
+ "analysis_level": 2,
+ "auto_role": "gateway",
+ "cdp_name": "",
+ "cloud_account": null,
+ "cloud_instance_description": null,
+ "cloud_instance_id": null,
+ "cloud_instance_name": null,
+ "cloud_instance_type": null,
+ "critical": false,
+ "custom_criticality": null,
+ "custom_make": null,
+ "custom_model": null,
+ "custom_name": null,
+ "custom_type": "",
+ "default_name": "Device 0e915f41761b0000",
+ "description": null,
+ "device_class": "gateway",
+ "dhcp_name": "",
+ "discover_time": 1681158480000,
+ "discovery_id": "0e915f41761b0000",
+ "display_name": "Device 0e915f41761b0000",
"dns_name": "",
- "extrahop_id": "027437b63df40000",
- "id": 6,
- "ipaddr4": "192.168.1.2",
+ "extrahop_id": "0e915f41761b0000",
+ "id": 4294967315,
+ "ipaddr4": "10.1.0.1",
"ipaddr6": null,
"is_l3": false,
- "last_seen_time": 1647052260000,
- "macaddr": "02:74:37:B6:3D:F4",
- "mod_time": 1647052291076,
+ "last_seen_time": null,
+ "macaddr": "0E:91:5F:41:76:1B",
+ "mod_time": 1681716728051,
"model": null,
"model_override": null,
"netbios_name": "",
- "node_id": null,
+ "node_id": 1,
"on_watchlist": true,
"parent_id": null,
- "role": "http_server",
+ "role": "gateway",
"subnet_id": null,
- "user_mod_time": 1646046972271,
+ "user_mod_time": 0,
"vendor": null,
"vlanid": 0,
"vpc_id": null
@@ -1790,11 +3059,11 @@ results = {
},
"inputs": {},
"metrics": {
- "execution_time_ms": 739,
- "host": "myhost.ibm.com",
+ "execution_time_ms": 688,
+ "host": "laptop.local",
"package": "fn-extrahop",
"package_version": "1.0.0",
- "timestamp": "2022-04-13 16:50:11",
+ "timestamp": "2023-04-17 13:27:24",
"version": "1.0"
},
"raw": null,
@@ -1807,7 +3076,7 @@ results = {
```python
@@ -1817,7 +3086,7 @@ None
```python
@@ -1904,6 +3173,7 @@ The following screenshot shows an example of a note added to a SOAR incident:
![screenshot: fn-extrahop-revealx-search-detections-note](./doc/screenshots/fn-extrahop-revealx-search-detections-note.png)
+
@@ -1912,7 +3182,7 @@ The following screenshot shows an example of a note added to a SOAR incident:
| `extrahop_active_from` | `number` | No | `-` | (Optional) The beginning timestamp for the request. Return only devices active after this time. Time is expressed in milliseconds since the epoch. 0 indicates the time of the request. |
| `extrahop_active_until` | `number` | No | `-` | (Optional) The ending timestamp for the request. Return only devices active before this time. |
| `extrahop_limit` | `number` | No | `-` | (Optional) Limit the number of devices returned to the specified maximum number. |
-| `extrahop_mod_time` | `number` | No | `-` | (Optional) Return detections that were modified on or after the specified date, expressed in milliseconds since the epoch. |
+| `extrahop_mod_time` | `number` | No | `-` | (Optional) Return detections that were updated on or after the specified date, expressed in milliseconds since the epoch. |
| `extrahop_offset` | `number` | No | `-` | (Optional) Skip the specified number of devices. This parameter is often combined with the limit parameter to paginate result sets. |
| `extrahop_search_filter` | `text` | No | `-` | The filter criteria for Extrahop search results. |
| `extrahop_sort` | `text` | No | `-` | Sorts returned detections by the specified fields. By default, detections are sorted by most recent update time and then ID in ascending order. |
@@ -1931,113 +3201,38 @@ results = {
"content": {
"result": [
{
- "appliance_id": 0,
+ "appliance_id": 1,
"assignee": null,
"categories": [
"sec",
- "sec.caution"
+ "sec.hardening"
],
- "description": "Over the past day, servers received connections from devices with suspicious IP addresses. These IP addresses are considered suspicious based on threat intelligence found in your Reveal(x) system. Investigate to determine if the IP addresses are from malicious endpoints.\n\nSuspicious IP addresses linked to this detection:\n* 109.237.103.9\n* 45.83.65.214\n* 45.83.67.186\n* 185.220.101.63\n* 185.220.101.191\n* 130.211.54.158\n* 192.241.212.103",
- "end_time": 1644556530000,
- "id": 3,
+ "description": "[pc2](#/metrics/devices/44522fe6bb834d83a3b0a142b7da750a.0e6f5c9ccbcb0000/overview?from=1681160178\u0026interval_type=DT\u0026until=1681749330) established a Server Message Block (SMB) connection with the SMBv1 dialect. This deprecated dialect of the SMB/CIFS protocol is known to be vulnerable to attacks.",
+ "id": 4294967308,
"is_user_created": false,
"mitre_tactics": [],
"mitre_techniques": [],
+ "mod_time": 1681749167977,
"participants": [
{
"external": false,
- "id": 8,
- "object_id": 2,
- "object_type": "device",
- "role": "victim"
- },
- {
- "external": false,
- "id": 11,
- "object_id": 6,
- "object_type": "device",
- "role": "victim"
- }
- ],
- "properties": {
- "suspicious_ipaddr": {
- "type": "ipaddr",
- "value": [
- "192.168.1.9",
- "192.168.1.214",
- "192.168.1.186",
- "192.168.1.63",
- "192.168.1.191",
- "192.168.1.158",
- "192.168.2.103"
- ]
- }
- },
- "resolution": null,
- "risk_score": 60,
- "start_time": 1644540480000,
- "status": "in_progress",
- "ticket_id": null,
- "title": "Daily Summary: Inbound Suspicious Connections",
- "type": "ti_tcp_incoming",
- "update_time": 1644642690000
- },
- {
- "appliance_id": 0,
- "assignee": "a@a.com",
- "categories": [
- "sec",
- "sec.exploit"
- ],
- "description": "[Device 02a1d541ff800000](#/metrics/devices/c708d037ae5a46b69ec4dcbf7e4555e5.02a1d541ff800000/overview?from=1646741073\u0026interval_type=DT\u0026until=1646741073) received a Remote Desktop Protocol (RDP) connection request that is consistent with a known vulnerability, also known as BlueKeep, in older versions of Microsoft Windows. This vulnerability allows an unauthenticated attacker to remotely run arbitrary code on an RDP server. The attacker can then tamper with data or install malware that could propagate to other Windows devices across the network. Investigate to determine if [Device 02a1d541ff800000](#/metrics/devices/c708d037ae5a46b69ec4dcbf7e4555e5.02a1d541ff800000/overview?from=1646741073\u0026interval_type=DT\u0026until=1646741073) is hosting a version affected by CVE-2019-0708: Windows 7, Windows XP, Windows Vista, Windows Server 2003, and Windows Server 2008.",
- "end_time": 1646741073962,
- "id": 79,
- "is_user_created": false,
- "mitre_tactics": [
- {
- "id": "TA0008",
- "name": "Lateral Movement",
- "url": "https://attack.mitre.org/tactics/TA0008"
- }
- ],
- "mitre_techniques": [
- {
- "id": "T1210",
- "legacy_ids": [
- "T1210"
- ],
- "name": "Exploitation of Remote Services",
- "url": "https://attack.mitre.org/techniques/T1210"
- }
- ],
- "participants": [
- {
- "external": false,
- "id": 194,
- "object_id": 2,
+ "hostname": "pc2.i.rx.tours",
+ "id": 1336,
+ "object_id": 4294967310,
"object_type": "device",
- "role": "victim"
- },
- {
- "external": true,
- "id": 195,
- "object_type": "ipaddr",
- "object_value": "216.218.206.66",
+ "object_value": "10.1.0.189",
"role": "offender"
}
],
- "properties": {
- "client_port": 45214,
- "server_port": 3389
- },
+ "properties": {},
"resolution": null,
- "risk_score": 98,
- "start_time": 1646741073962,
+ "risk_score": 30,
+ "start_time": 1681160178555,
"status": "in_progress",
- "ticket_id": "2529",
- "title": "CVE-2019-0708 RDP Exploit Attempt",
- "type": "cve_2019_0708",
- "update_time": 1646741073962
+ "ticket_id": "2118",
+ "title": "SMBv1 Connection",
+ "type": "smbv1_connection_individual",
+ "update_time": 1681749150000
}
]
},
@@ -2045,11 +3240,11 @@ results = {
"extrahop_search_filter": "{\"filter\": {\"status\": [\"in_progress\"]}}"
},
"metrics": {
- "execution_time_ms": 948,
- "host": "myhost.ibm.com",
+ "execution_time_ms": 907,
+ "host": "laptop.local",
"package": "fn-extrahop",
"package_version": "1.0.0",
- "timestamp": "2022-04-13 17:53:38",
+ "timestamp": "2023-04-17 12:37:03",
"version": "1.0"
},
"raw": null,
@@ -2062,12 +3257,12 @@ results = {
```python
## ExtraHop - wf_extrahop_rx_search_detections pre processing script ##
-# Read CATEGORY_MAP and TYPE_MAP from workflow propertyself.
+# Read CATEGORY_MAP and TYPE_MAP from workflow propertyself.
# Reverse the dict keys and values
CATEGORY_MAP = {v: k for k, v in playbook.properties.category_map.items()}
TYPE_MAP = {v: k for k, v in playbook.properties.type_map.items()}
@@ -2117,7 +3312,7 @@ filter = {k: v for k, v in filter_props.items() if v}
if filter:
if playbook.properties.extrahop_detection_id:
- raise ValueError("The search filter and Detecion ID are not allowed at the same time.")
+ raise ValueError("The search filter and Detection ID are not allowed at the same time.")
search_filter = {
"filter": filter
@@ -2136,13 +3331,12 @@ if playbook.inputs.extrahop_update_time:
inputs.extrahop_update_time = playbook.inputs.extrahop_update_time
if playbook.inputs.extrahop_mod_time:
inputs.extrahop_mod_time = playbook.inputs.extrahop_mod_time
-
```
```python
@@ -2198,7 +3392,7 @@ def make_properties_string(det):
"""_summary_
Args:
- det (json object): ExtraHop detection object
+ det (json object): ExtraHop detection object
Returns:
str : properties json object converted to a formatted string
@@ -2213,14 +3407,14 @@ def make_properties_string(det):
tbl = '{0}:
@@ -2347,10 +3542,11 @@ results = {
"result": [
{
"analysis": "advanced",
- "analysis_level": 2,
- "auto_role": "other",
+ "analysis_level": 1,
+ "auto_role": "pc",
"cdp_name": "",
"cloud_account": null,
+ "cloud_instance_description": null,
"cloud_instance_id": null,
"cloud_instance_name": null,
"cloud_instance_type": null,
@@ -2360,31 +3556,31 @@ results = {
"custom_model": null,
"custom_name": null,
"custom_type": "",
- "default_name": "Device 02f6b87341f00000",
+ "default_name": "Device 0e3da802a0b30000",
"description": null,
"device_class": "node",
- "dhcp_name": "",
- "discover_time": 1644418320000,
- "discovery_id": "02f6b87341f00000",
- "display_name": "Device 02f6b87341f00000",
- "dns_name": "",
- "extrahop_id": "02f6b87341f00000",
- "id": 3,
- "ipaddr4": "192.168.1.159",
+ "dhcp_name": "pc3",
+ "discover_time": 1681158480000,
+ "discovery_id": "0e3da802a0b30000",
+ "display_name": "pc3",
+ "dns_name": "pc3.i.rx.tours",
+ "extrahop_id": "0e3da802a0b30000",
+ "id": 4294967311,
+ "ipaddr4": "10.1.0.161",
"ipaddr6": null,
"is_l3": false,
- "last_seen_time": 1647052200000,
- "macaddr": "02:F6:B8:73:41:F0",
- "mod_time": 1649866540057,
+ "last_seen_time": null,
+ "macaddr": "0E:3D:A8:02:A0:B3",
+ "mod_time": 1681751806994,
"model": null,
"model_override": null,
- "netbios_name": "",
- "node_id": null,
- "on_watchlist": true,
+ "netbios_name": "PC3",
+ "node_id": 1,
+ "on_watchlist": false,
"parent_id": null,
- "role": "other",
+ "role": "pc",
"subnet_id": null,
- "user_mod_time": 1644418537403,
+ "user_mod_time": 0,
"vendor": null,
"vlanid": 0,
"vpc_id": null
@@ -2392,14 +3588,14 @@ results = {
]
},
"inputs": {
- "extrahop_search_filter": "{\"filter\": {\"operator\": \"=\", \"field\": \"ipaddr\", \"operand\": \"192.168.1.159\"}}"
+ "extrahop_search_filter": "{\"filter\": {\"field\": \"ipaddr\", \"operand\": \"10.1.0.161\", \"operator\": \"=\"}}"
},
"metrics": {
- "execution_time_ms": 965,
- "host": "myhost.ibm.com",
+ "execution_time_ms": 812,
+ "host": "laptop.local",
"package": "fn-extrahop",
"package_version": "1.0.0",
- "timestamp": "2022-04-13 17:17:19",
+ "timestamp": "2023-04-17 13:17:05",
"version": "1.0"
},
"raw": null,
@@ -2412,40 +3608,80 @@ results = {
```python
-search_filters = [
- "extrahop_device_field",
- "extrahop_device_operand",
- "extrahop_device_operator"
-]
-for p in search_filters:
- if hasattr(playbook.inputs, p) and playbook.inputs.get(p):
- raise ValueError("A search filter and Device ID are not allowed at the same time.")
+## ExtraHop - pb_extrahop_rx_search_devices pre processing script ##
-if playbook.inputs.extrahop_device_id:
- inputs.extrahop_device_id = playbook.inputs.extrahop_device_id
+def get_prop(prop, type=None):
+ if prop:
+ return '{}'.format(prop)
+ else:
+ return None
+
+
+def main():
+ filter = {}
+
+ search_filter = {}
+ filter_props = {
+ "field": get_prop(playbook.inputs.extrahop_device_field),
+ "operand": get_prop(playbook.inputs.extrahop_device_operand),
+ "operator": get_prop(playbook.inputs.extrahop_device_operator)
+ }
+ filter = {k: v for k, v in filter_props.items() if v}
+
+ if filter and playbook.inputs.extrahop_device_id:
+ raise ValueError("The device ID and search filter shouldn't be set at the same time.")
+
+ if filter:
+ missing_props = []
+ for f in ["field", "operand", "operator"]:
+ if not filter.get(f, None):
+ missing_props.append(f)
+ if missing_props:
+ raise ValueError("The filter is missing properties: '{}'.".format(", ".join(missing_props)))
+
+ search_filter = {
+ "filter": filter
+ }
+
+ if playbook.inputs.extrahop_device_id:
+ search_filter = {
+ "filter": {
+ "field": "discovery_id",
+ "operator": "=",
+ "operand": str(playbook.inputs.extrahop_device_id)
+ }
+ }
+ if search_filter:
+ inputs.extrahop_search_filter = str(search_filter).replace("'", '"')
+ if playbook.inputs.extrahop_active_from:
+ inputs.extrahop_active_from = playbook.inputs.extrahop_active_from
+ if playbook.inputs.extrahop_active_until:
+ inputs.extrahop_active_until = playbook.inputs.extrahop_active_until
+ if playbook.inputs.extrahop_limit:
+ inputs.extrahop_limit = playbook.inputs.extrahop_limit
+ if playbook.inputs.extrahop_offset:
+ inputs.extrahop_offset = playbook.inputs.extrahop_offset
+
+ if inputs == {}:
+ raise ValueError("At least one search criteria is required to search devices. inputs = {0}".format(inputs))
+
+main()
-if playbook.inputs.extrahop_active_from:
- inputs.extrahop_active_from = playbook.inputs.extrahop_active_from
-if playbook.inputs.extrahop_active_until:
- inputs.extrahop_active_until = playbook.inputs.extrahop_active_until
-if playbook.inputs.extrahop_limit:
- inputs.extrahop_limit = playbook.inputs.extrahop_limit
-if playbook.inputs.extrahop_offset:
- inputs.extrahop_offset = playbook.inputs.extrahop_offset
```
```python
## ExtraHop - pb_extrahop_rx_search_devices post processing script ##
+import datetime
# Globals
FN_NAME = "funct_extrahop_rx_search_devices"
PB_NAME = "Extrahop Reveal(x): Search Devices"
@@ -2470,6 +3706,7 @@ def make_linkback_url(dev_id):
"""
return incident.properties.extrahop_console_url + LINKBACK_URL.format(incident.properties.extrahop_site_uuid, dev_id)
+
def process_devs(dev):
# Process a device result.
newrow = incident.addRow(DATA_TABLE)
@@ -2488,7 +3725,7 @@ def process_devs(dev):
newrow.activity = dev.get("activity", None)
newrow.on_watchlist = str(dev.get("on_watchlist", None))
newrow.mod_time = dev.get("mod_time", None)
- newrow.user_mod_time = dev.get("user_mod_time", None)
+ newrow.user_mod_time = dev.get("user_mod_time", None)
newrow.discover_time = dev.get("discover_time", None)
newrow.last_seen_time = dev.get("last_seen_time", None)
device_url = make_linkback_url(dev["extrahop_id"])
@@ -2496,25 +3733,36 @@ def process_devs(dev):
.format("url", device_url, dev["extrahop_id"])
newrow.device_url = device_url_html
+def format_input_params(input_params):
+ input_params_formatted =''
+ for k, v in input_params.items():
+ if k == "extrahop_active_until" or k == "extrahop_active_from":
+ v = datetime.datetime.fromtimestamp(v/1000).strftime('%Y-%m-%d %H:%M:%S')
+ input_params_formatted += "{}: {}\n".format(k, v)
+ return input_params_formatted
+
def main():
note_text = ''
+ input_params_formatted = format_input_params(INPUTS)
if CONTENT:
if CONTENT.get("error", None):
note_text = "ExtraHop: Playbook {0}: Search devices failed with error '{1}' for " \
- "SOAR function {2} with parameters {3}.".format(PB_NAME, CONTENT["error"], FN_NAME, ", ".join(unicode("{}:{}").format(k, v) for k, v in INPUTS.items()))
+ "SOAR function {2} with parameters:
| Name | Type | Required | Example | Tooltip |
| ---- | :--: | :------: | ------- | ------- |
-| `extrahop_active_from` | `number` | No | `-` | (Optional) The beginning timestamp for the request. Return only devices active after this time. Time is expressed in milliseconds since the epoch. 0 indicates the time of the request. |
+| `extrahop_active_from` | `number` | Yes | `-` | (Always) The beginning timestamp for the request. Return only devices active after this time. Time is expressed in milliseconds since the epoch. 0 indicates the time of the request. |
| `extrahop_active_until` | `number` | No | `-` | (Optional) The ending timestamp for the request. Return only devices active before this time. |
| `extrahop_always_return_body` | `boolean` | No | `-` | If True return an empty packet capture file and an HTTP status of 200. |
| `extrahop_bpf` | `text` | No | `host 192.168.1.2 dst host 192.168.1.3` | Filter packets with Berkeley Packet Filter syntax. |
@@ -2574,7 +3823,9 @@ The following screenshot shows an example of notes added to a SOAR incident:
| `extrahop_output` | `text` | No | `-` | The output format. Valid values pcap , keylog_txt and zip |
| `extrahop_port1` | `text` | No | `-` | Return packets sent from or received on the specified port. |
| `extrahop_port2` | `text` | No | `-` | Return packets sent from or received on the specified port. |
-| `incident_id` | `number` | Yes | `-` | The ID for the incident in SOAR |
+| `extrahop_decrypt_files` | `boolean` | No | `-` | Specifies whether to decrypt extracted files with stored secrets. This option is valid only if the output parameter is extract. |
+| `extrahop_include_secrets` |`boolean` | No | `-` | Whether or not to include TLS secrets together with packet data in .pcapng files. Only valid if "output" is "pcapng". | Optional |
+| `incident_id` | `number` | Yes | `-` | - |
```python
inputs.incident_id = incident.id
-if artifact.type == "IP Address" or artifact.type == "DNS Name":
+if artifact.type == "IP Address":
inputs.extrahop_bpf = "host {}".format(artifact.value)
elif artifact.type == "MAC Address":
inputs.extrahop_bpf = "ether host {}".format(artifact.value)
@@ -2640,12 +3893,16 @@ inputs.extrahop_ip1 = playbook.inputs.extrahop_ip1
inputs.extrahop_port1 = playbook.inputs.extrahop_port1
inputs.extrahop_ip2 = playbook.inputs.extrahop_ip2
inputs.extrahop_port2 = playbook.inputs.extrahop_port2
+if inputs.extrahop_output == "extract":
+ inputs.extrahop_decrypt_files = playbook.inputs.extrahop_decrypt_files
+if inputs.extrahop_output == "pcapng":
+ inputs.extrahop_include_secrets = playbook.inputs.extrahop_include_secrets
```
```python
@@ -2685,7 +3942,6 @@ def main():
incident.addNote(helper.createRichText(note_text))
main()
-
```
@@ -2721,7 +3960,7 @@ The following screenshot shows an example of a note added to a SOAR incident:
| ---- | :--: | :------: | ------- | ------- |
| `extrahop_detection_id` | `number` | No | `-` | Extrahop detection ID |
| `extrahop_participants` | `text` | No | `{ "id": 0, "usernames": [], "origins": [] }` | A list of devices and applications associated with a detection. |
-| `incident_id` | `number` | Yes | `-` | The ID for the incident in SOAR |
+| `incident_id` | `number` | Yes | `-` | - |
| `soar_inc_owner_id` | `text` | No | `-` | - |
| `soar_inc_plan_status` | `text` | No | `-` | SOAR incident status |
| `soar_inc_resolution_id` | `text` | No | `-` | SOAR incident resolution |
@@ -2740,18 +3979,18 @@ results = {
"result": "success"
},
"inputs": {
- "extrahop_detection_id": 71,
- "incident_id": 3235,
- "soar_inc_owner_id": "a@a.com",
+ "extrahop_detection_id": 4294967305,
+ "incident_id": 3390,
+ "soar_inc_owner_id": "admin@example.com",
"soar_inc_plan_status": "C",
"soar_inc_resolution_id": "Resolved"
},
"metrics": {
- "execution_time_ms": 1084,
- "host": "myhost.ibm.com",
+ "execution_time_ms": 635,
+ "host": "MBP",
"package": "fn-extrahop",
"package_version": "1.0.0",
- "timestamp": "2022-04-13 17:21:32",
+ "timestamp": "2023-04-10 14:18:31",
"version": "1.0"
},
"raw": null,
@@ -2764,7 +4003,7 @@ results = {
```python
@@ -2779,7 +4018,7 @@ inputs.soar_inc_resolution_id = incident.resolution_id
```python
@@ -2823,42 +4062,15 @@ main()
## Function - Extrahop Reveal(x) update watchlist
Add or remove devices from the watchlist on Extrahop Reveal(x). Required parameter assign or unassign comma-seperated list of devices.
- ![screenshot: fn-extrahop-revealx-update-watchlist ](./doc/screenshots/fn-extrahop-revealx-update-watchlist.png)
-
-The function provides the following functionality.
-
-* Adds or removes devices to or from the ExtraHop watchlist of the target ExtraHop environment.
-
-An example playbook that uses this SOAR function is `ExtraHop Reveal(x): Update Watchlist (PB)`.
-
-* Adds a device or list ExtraHop devices to the watchlist of the target ExtraHop environment.
-* Refreshes the associated row of the data table `ExtraHop Devices`.
-* A note is added to the SOAR incident with the status of the action.
-
-The playbook is initiated by the manual data table menu item `ExtraHop Reveal(x): Assign Tag (PB)`.
-
-The following screenshot shows an example of the action inputs for the playbook:
-
- ![screenshot: fn-extrahop-revealx-update-watchlist-action](./doc/screenshots/fn-extrahop-revealx-update-watchlist-action.png)
-
- ![screenshot: fn-extrahop-revealx-update-watchlist-action_2](./doc/screenshots/fn-extrahop-revealx-update-watchlist-action_2.png)
-
-The following screenshot shows an example of the data table updated by the function:
-
- ![screenshot: fn-extrahop-revealx-update-watchlist-datatable](./doc/screenshots/fn-extrahop-revealx-update-watchlist-datatable.png)
-
-
-The following screenshot shows an example of a note added to a SOAR incident:
-
- ![screenshot: fn-extrahop-revealx-update-watchlist-note](./doc/screenshots/fn-extrahop-revealx-update-watchlist-note.png)
+ ![screenshot: fn-extrahop-revealx-update-watchlist ](./doc/screenshots/fn-extrahop-revealx-update-watchlist.png)
| Name | Type | Required | Example | Tooltip |
| ---- | :--: | :------: | ------- | ------- |
-| `extrahop_assign` | `text` | No | `-` | Comma or newline seperated list of devices to assign to a watchlist. |
-| `extrahop_unassign` | `text` | No | `-` | Comma or newline seperated list of devices to unassign from a watchlist. |
+| `extrahop_assign` | `text` | No | `-` | Comma or newline seperated list of device ids to assign to a watchlist. |
+| `extrahop_unassign` | `text` | No | `-` | Comma or newline seperated list of device ids to unassign from a watchlist. |
```python
@@ -2909,7 +4121,7 @@ elif action == "remove":
```python
@@ -2978,7 +4190,7 @@ PARAMS = {
"MAC Address": row.macaddr
}
# Both IP address V4 or V6 will be added as type "IP Address".
-if "v6" in playbook.inputs.extrahop_artifact_type:
+if "v6" in rule.properties.extrahop_artifact_type:
PARAMS.update({"IP Address": row.ipaddr6})
def addArtifact(artifact_type, artifact_value, description):
@@ -3491,7 +4703,6 @@ except:
workflow.addProperty("category_map", CATEGORY_MAP)
workflow.addProperty("type_map", TYPE_MAP)
script_inputs = rule.properties
-
```
".format(k, v)
- return input_params_formatted
+ return incident.properties.extrahop_console_url + LINKBACK_URL.format(incident.properties.extrahop_site_uuid, dev_id)
def process_devs(dev):
# Process a device result.
@@ -1513,7 +2561,7 @@ def process_devs(dev):
newrow.activity = dev.get("activity", None)
newrow.on_watchlist = str(dev.get("on_watchlist", None))
newrow.mod_time = dev.get("mod_time", None)
- newrow.user_mod_time = dev.get("user_mod_time", None)
+ newrow.user_mod_time = dev.get("user_mod_time", None)
newrow.discover_time = dev.get("discover_time", None)
newrow.last_seen_time = dev.get("last_seen_time", None)
device_url = make_linkback_url(dev["extrahop_id"])
@@ -1521,41 +2569,43 @@ def process_devs(dev):
.format("url", device_url, dev["extrahop_id"])
newrow.device_url = device_url_html
-# Processing
-def main():
- device_id = INPUTS.get("extrahop_device_id")
- note_text = ''
- input_params_formatted = format_input_params(INPUTS)
- if CONTENT:
- devs = CONTENT.get("result")
+def get_dev_ids():
+ # Get participant dev ids
+ dev_ids = []
+ get_devices_content = playbook.functions.results.get_detections_results.content
+ devs = get_devices_content.get("result", {})
+ participants = devs.get("participants", {})
+ for p in participants:
+ if p.get("object_type", None) == "device":
+ dev_ids.append(p.get("object_id", None))
+ return dev_ids
- if devs:
- note_text = "ExtraHop app: Playbook {0}: {1} Device(s) successfully returned for " \
- "Device ID {2} for SOAR function {3} with parameters:
{4}" \
- .format(PB_NAME, len(devs), device_id, FN_NAME, input_params_formatted)
- # Extrahop will return a list or a single json object
- if isinstance(devs, list):
- for dev in devs:
- process_devs(dev)
- else:
- process_devs(devs)
- note_text += "
The data table {0} has been updated".format(DATA_TABLE)
+# Processing
+participant_dev_ids = get_dev_ids()
+note_text = ''
+if CONTENT:
+ devs = [d for d in CONTENT.get("result") if d.get("id", None) in participant_dev_ids]
+ note_text = "ExtraHop Integration: Playbook {0}: There were {1} Devices returned for SOAR " \
+ "function {2} with parameters {3}.".format(PB_NAME, len(devs), FN_NAME, ", ".join(
+ "{}:{}".format(k, v) for k, v in INPUTS.items()))
+ if devs:
+ if isinstance(devs, list):
+ for dev in devs:
+ process_devs(dev)
else:
- note_text += "ExtraHop app: Playbook {0}: There was no result returned while attempting " \
- "to get device for device ID {1} for SOAR function {2} ." \
- " with parameters:
{3}" \
- .format(PB_NAME, device_id, FN_NAME, input_params_formatted)
- else:
- note_text += "ExtraHop app: Playbook {0}: There was no result returned while attempting " \
- "to get device for device ID {1} for SOAR function {2} ." \
- " with parameters:
{3}" \
- .format(PB_NAME, device_id, FN_NAME, input_params_formatted)
+ process_devs(devs)
+ note_text += "
The data table {0} has been updated".format(DATA_TABLE)
- incident.addNote(helper.createRichText(note_text))
+else:
+ note_text += "ExtraHop Integration: Playbook {0}: There was no result returned while attempting " \
+ "to get devices for SOAR function {1} with parameters {2}." \
+ .format(PB_NAME, FN_NAME, ", ".join("{}:{}".format(k, v) for k, v in INPUTS.items()))
+incident.addNote(helper.createRichText(note_text))
-main()
+#Unset the Detection update notification.
+incident.properties.extrahop_update_notification = None
```
@@ -1589,6 +2639,7 @@ The following screenshot shows an example of a note added to a SOAR case:
![screenshot: fn-extrahop-revealx-get-tags-note](./doc/screenshots/fn-extrahop-revealx-get-tags-note.png)
+
Inputs:
Example Pre-Process Script:
+Example Function Input Script:
Example Post-Process Script:
+Example Function Post Process Script:
The data table {0} has been updated".format("Extrahop Tags")
+ for tag in tags:
+ if tag_name == tag["name"]:
+ tag_id = tag["id"]
+ playbook.addProperty("tag_exists", {})
+ break
+ if not tag_id:
+ note_text = "ExtraHop Integration: Playbook {0}: Tag '{1}' not returned for SOAR function {2} "\
+ "with parameters:
{3}."\
+ .format(PB_NAME, tag_name, FN_NAME, ", ".join("{}:{}".format(k, v) for k, v in INPUTS.items()))
else:
note_text += "ExtraHop Integration: Playbook {0}: There was no result returned while attempting " \
- "to get tags for SOAR function {1} with parameters {2}."\
+ "to get tags for SOAR function {1} with parameters:
{2}."\
.format(PB_NAME, FN_NAME, ", ".join("{}:{}".format(k, v) for k, v in INPUTS.items()))
-
- incident.addNote(helper.createRichText(note_text))
+ if note_text:
+ incident.addNote(helper.createRichText(note_text))
main()
-
```
Inputs:
Example Pre-Process Script:
+Example Function Input Script:
Example Post-Process Script:
+Example Function Post Process Script:
Inputs:
Example Pre-Process Script:
+Example Function Input Script:
Example Post-Process Script:
+Example Function Post Process Script:
".format(k, v)
return input_params_formatted
-
+
# Processing
def main():
note_text = ''
@@ -2268,7 +3462,7 @@ def main():
if CONTENT:
dets = CONTENT.get("result", {})
note_text = "ExtraHop Reveal(x): Playbook {0}: There were {1} Detections returned for SOAR " \
- "function {2} with parameters:
{3}".format(PB_NAME, len(dets), FN_NAME, input_params_formatted)
+ "function {2} with parameters:
{3}".format(PB_NAME, len(dets), FN_NAME, input_params_formatted)
if dets:
for det in dets:
process_dets(det)
@@ -2276,11 +3470,11 @@ def main():
else:
note_text += "ExtraHop Reveal(x): Playbook {0}: There was no result returned while attempting " \
- "to search detections for SOAR function {1} with parameters:
{2}" \
+ "to search detections for SOAR function {1} with parameters:
{2}" \
.format(PB_NAME, FN_NAME, input_params_formatted)
incident.addNote(helper.createRichText(note_text))
-
+
# Start execution
main()
```
@@ -2322,6 +3516,7 @@ The following screenshot shows an example of a note added to a SOAR incident:
![screenshot: fn-extrahop-revealx-search-devices-note](./doc/screenshots/fn-extrahop-revealx-search-devices-note.png)
+
Inputs:
Example Pre-Process Script:
+Example Function Input Script:
Example Post-Process Script:
+Example Function Post Process Script:
{3}".format(PB_NAME, CONTENT["error"], FN_NAME, input_params_formatted)
else:
devs = CONTENT.get("result", None)
- note_text = "ExtraHop Integration: Workflow {0}: There were {1} Devices returned for SOAR " \
- "function {2} with parameters {3}.".format(PB_NAME, len(devs), FN_NAME, ", ".join("{}:{}".format(k, v) for k, v in INPUTS.items()))
+ note_text = "ExtraHop: Playbook {0}: There were {1} Devices returned for SOAR " \
+ "function {2} with parameters:
{3}".format(PB_NAME, len(devs), FN_NAME, input_params_formatted)
if devs:
for dev in devs:
process_devs(dev)
note_text += "
The data table {0} has been updated".format(DATA_TABLE)
+ else:
+ note_text += "
The data table {0} has NOT been updated".format(DATA_TABLE)
else:
- note_text += "ExtraHop Integration: Workflow {0}: There was no result returned while attempting " \
- "to search devices for SOAR function {1} with parameters {2}." \
- .format(PB_NAME, FN_NAME, ", ".join("{}:{}".format(k, v) for k, v in INPUTS.items()))
+ note_text += "ExtraHop: Playbook {0}: There was no result returned while attempting " \
+ "to search devices for SOAR function {1} with parameters:
{2}" \
+ .format(PB_NAME, FN_NAME, input_params_formatted)
incident.addNote(helper.createRichText(note_text))
@@ -2527,7 +3775,7 @@ main()
---
## Function - Extrahop Reveal(x) search packets
Search for and download packets stored on the ExtraHop Reveal(x) system.
-Valid output types are: pcap, keylog_txt or zip.
+Supported output formats: pcap, keylog_txt, pcapng, zip, extract.
![screenshot: fn-extrahop-revealx-search-packets ](./doc/screenshots/fn-extrahop-revealx-search-packets.png)
@@ -2558,12 +3806,13 @@ The following screenshot shows an example of notes added to a SOAR incident:
![screenshot: fn-extrahop-revealx-search-packets-note](./doc/screenshots/fn-extrahop-revealx-search-packets-note.png)
+
Inputs:
Example Pre-Process Script:
+Example Function Input Script:
Example Post-Process Script:
+Example Function Post Process Script:
Inputs:
Example Pre-Process Script:
+Example Function Input Script:
Example Post-Process Script:
+Example Function Post Process Script:
Inputs:
Example Pre-Process Script:
+Example Function Input Script:
Example Post-Process Script:
+Example Function Post Process Script:
For Support
Next
1.1.0
1.2.0
11/2024
Search Packet: function and playbook bug fix and enhancements
1.1.0
04/2023
Use mod_time instead of update_time in poller. Convert rules/workflows to playbooks
1.0.0
1.0.0
06/2022
Initial Release
In v1.2.0 the following updates are implemented in the Search Packets function and playbook:
+Handle non 200 status code correctly
Add 2 new ExtraHop parameters: decrypt_files and include_secrets
Write a note to the case when the search results attachment is greater than the maximum allowed by SOAR
Search Packets example playbook Active From
input parameter is now mandatory
When the limit_search_duration
is not specified in the search packets function, the function timeout
value is set to the maximum search duration allowed by ExtraHop: 5 minutes.
In v1.1, the existing rules and workflows have been replaced with playbooks. This change is made to support the ongoing, newer capabilities of playbooks. Each playbook has the same functionality as the previous, corresponding rule/workflow.
@@ -563,17 +638,17 @@The SOAR platform supports two app deployment mechanisms, App Host and integration server.
+The SOAR platform supports two app deployment mechanisms, Edge Gateway (also known as App Host) and integration server.
If deploying to a SOAR platform with an App Host, the requirements are:
SOAR platform >= 45.0.0
.
SOAR platform >= 51.0.0.0
.
The app is in a container-based format (available from the AppExchange as a zip
file).
If deploying to a SOAR platform with an integration server, the requirements are:
SOAR platform >= 45.0.0
.
SOAR platform >= 51.0.0.0
.
The app is in the older integration format (available from the AppExchange as a zip
file which contains a tar.gz
file).
Integration server is running resilient-circuits>=42.0.0
.
Integration server is running resilient-circuits>=51.0.2.2.0
.
If using an API key account, make sure the account provides the following minimum permissions:
results = {
"content": {
"result": {
- "attachment": "\u003cb\u003eextrahop 2022-05-11 16.00.00 to 2022-05-12 21.39.30 PDT.pcap\u003c/b\u003e"
+ "attachment": "\u003cb\u003eextrahop 2023-03-31 21.00.00 to 2023-04-08 21.00.00 PDT_20230410140142.pcap\u003c/b\u003e"
}
},
"inputs": {
- "extrahop_active_from": 1652310000000,
- "extrahop_active_until": null,
- "extrahop_bpf": "host 192.168.1.2",
+ "extrahop_active_from": 1680321600000,
+ "extrahop_active_until": 1681012800000,
+ "extrahop_bpf": "host dc1.attack.local",
+ "extrahop_decrypt_files": null,
+ "extrahop_include_secrets": null,
"extrahop_ip1": null,
"extrahop_ip2": null,
"extrahop_limit_bytes": null,
@@ -3308,14 +4599,14 @@ Function - Extrahop Reveal(x) search packets"extrahop_output": "pcap",
"extrahop_port1": null,
"extrahop_port2": null,
- "incident_id": 4307
+ "incident_id": 3389
},
"metrics": {
- "execution_time_ms": 20395,
- "host": "myhost.ibm.com",
+ "execution_time_ms": 28890,
+ "host": "MBP",
"package": "fn-extrahop",
"package_version": "1.0.0",
- "timestamp": "2022-05-17 11:24:39",
+ "timestamp": "2023-04-10 14:01:44",
"version": "1.0"
},
"raw": null,
@@ -3327,10 +4618,10 @@ Function - Extrahop Reveal(x) search packetsinputs.incident_id = incident.id
-if artifact.type == "IP Address" or artifact.type == "DNS Name":
+if artifact.type == "IP Address":
inputs.extrahop_bpf = "host {}".format(artifact.value)
elif artifact.type == "MAC Address":
inputs.extrahop_bpf = "ether host {}".format(artifact.value)
@@ -3343,11 +4634,15 @@ Function - Extrahop Reveal(x) search packetsinputs.extrahop_port1 = playbook.inputs.extrahop_port1
inputs.extrahop_ip2 = playbook.inputs.extrahop_ip2
inputs.extrahop_port2 = playbook.inputs.extrahop_port2
+if inputs.extrahop_output == "extract":
+ inputs.extrahop_decrypt_files = playbook.inputs.extrahop_decrypt_files
+if inputs.extrahop_output == "pcapng":
+ inputs.extrahop_include_secrets = playbook.inputs.extrahop_include_secrets
## ExtraHop - pb_extrahop_rx_search_packets post processing script ##
# Globals
@@ -3385,7 +4680,6 @@ Function - Extrahop Reveal(x) search packetsincident.addNote(helper.createRichText(note_text))
main()
-
Update a detection in Extrahop Reveal(x). Required parameter incident_id, detection_id, owner_id, plan_status, resolution. Optional parameters participants. -
-The function provides the following functionality.
-Updates the status, resolution, ticket ID, assignee and optionally participants of an ExtraHop detection.
An example playbook that uses this SOAR function is ExtraHop Reveal(x): Update Detection (PB)
.
Closes an ExtraHop detection if the equivalent SOAR incident is closed.
A note is added to the SOAR incident with the status of the action.
A note is added to the ExtraHop detection.
NOTE: Get or add ExtraHop detection note will fail if Detection Tracking
is enabled on ExtraHop but the playbook should still complete.
The playbook is initiated by an automatic incident menu item ExtraHop Reveal(x): Update Detection (PB)
The following screenshot shows an example of a note added to a SOAR incident:
- +Update a detection in Extrahop Reveal(x). Required parameter incident_id, detection_id, owner_id, plan_status, resolution. Optional parameters participants.
+
number
Yes
-
The ID for the incident in SOAR
-
soar_inc_owner_id
text
inputs.extrahop_detection_id = incident.properties.extrahop_detection_id
inputs.incident_id = incident.id
@@ -3509,7 +4789,7 @@ Function - Extrahop Reveal(x) update detection## ExtraHop - pb_extrahop_rx_update_detection post processing script ##
# Globals
@@ -3552,24 +4832,6 @@ Function - Extrahop Reveal(x) update detection¶
Add or remove devices from the watchlist on Extrahop Reveal(x). Required parameter assign or unassign comma-seperated list of devices.
-The function provides the following functionality.
-
-Adds or removes devices to or from the ExtraHop watchlist of the target ExtraHop environment.
-
-An example playbook that uses this SOAR function is ExtraHop Reveal(x): Update Watchlist (PB)
.
-
-Adds a device or list ExtraHop devices to the watchlist of the target ExtraHop environment.
-Refreshes the associated row of the data table ExtraHop Devices
.
-A note is added to the SOAR incident with the status of the action.
-
-The playbook is initiated by the manual data table menu item ExtraHop Reveal(x): Assign Tag (PB)
.
-The following screenshot shows an example of the action inputs for the playbook:
-
-
-The following screenshot shows an example of the data table updated by the function:
-
-The following screenshot shows an example of a note added to a SOAR incident:
-
Inputs:
@@ -3587,13 +4849,13 @@ Function - Extrahop Reveal(x) update watchlisttext
No
-
-Comma or newline seperated list of devices to assign to a watchlist.
+Comma or newline seperated list of device ids to assign to a watchlist.
extrahop_unassign
text
No
-
Comma or newline seperated list of devices to unassign from a watchlist.
Comma or newline seperated list of device ids to unassign from a watchlist.
dev_id = row.devs_id
action = playbook.inputs.extrahop_watchlist_action
@@ -3641,7 +4903,7 @@ Function - Extrahop Reveal(x) update watchlist## ExtraHop - pb_extrahop_rx_update_watchlist post processing script ##
# Globals
@@ -3704,7 +4966,7 @@ Script - ExtraHop script: add artifact from device"MAC Address": row.macaddr
}
# Both IP address V4 or V6 will be added as type "IP Address".
-if "v6" in playbook.inputs.extrahop_artifact_type:
+if "v6" in rule.properties.extrahop_artifact_type:
PARAMS.update({"IP Address": row.ipaddr6})
def addArtifact(artifact_type, artifact_value, description):
@@ -4214,16 +5476,138 @@ Script - ExtraHop script: detection property helperworkflow.addProperty("category_map", CATEGORY_MAP)
workflow.addProperty("type_map", TYPE_MAP)
script_inputs = rule.properties
-
Playbook Name |
+Description |
+Activation Type |
+Object |
+Status |
+Condition |
+
---|---|---|---|---|---|
ExtraHop Reveal(x): Add Artifact (PB) |
+Add Devices data table field as a SOAR artifact. |
+Manual |
+extrahop_devices |
+
|
+
|
+
ExtraHop Reveal(x): Assign Tag (PB) |
+Assign a tag to a list of devices ids for Extrahop Reveal(x). |
+Manual |
+extrahop_devices |
+
|
+
|
+
ExtraHop Reveal(x): Create Tag (PB) |
+Create a new tag for Extrahop Reveal(x). |
+Manual |
+incident |
+
|
+
|
+
ExtraHop Reveal(x): Get Activity Maps (PB) |
+Get activity maps information from Extrahop Reveal(x) and write to the ExtraHop Activitymaps data table. |
+Manual |
+incident |
+
|
+
|
+
ExtraHop Reveal(x): Get Tags (PB) |
+Get tags information from Extrahop Reveal(x) and write to the ExtraHop Tags data table. |
+Manual |
+incident |
+
|
+
|
+
ExtraHop Reveal(x): Get Watchlist (PB) |
+Retrieve all devices that are in the watchlist from Extrahop Reveal(x) . |
+Manual |
+incident |
+
|
+
|
+
ExtraHop Reveal(x): Refresh Case (PB) |
+Refresh SOAR case with detection and device information from Extrahop Reveal(x) . |
+Manual |
+incident |
+
|
+
|
+
ExtraHop Reveal(x): Search Detections (PB) |
+Search for detections information from Extrahop Reveal(x). |
+Manual |
+incident |
+
|
+
|
+
ExtraHop Reveal(x): Search Devices (PB) |
+Search for devices information from Extrahop Reveal(x) using a filter. |
+Manual |
+incident |
+
|
+
|
+
ExtraHop Reveal(x): Search Packets (PB) |
+Search for and download packets stored on the ExtraHop Reveal(x) system and add as an attachment. Valid output types are: pcap, keylog_txt or zip. |
+Manual |
+artifact |
+
|
+
|
+
ExtraHop Reveal(x): Update Case (PB) |
+Automatic playbook to update ExtraHop SOAR case with detection information from Extrahop Reveal(x) . |
+Automatic |
+incident |
+
|
+
|
+
ExtraHop Reveal(x): Update Detection (PB) |
+Automatic playbook to update ExtraHop detection if the status is changed on the associated SOAR incident. Add a resolution note to the detection. |
+Automatic |
+incident |
+
|
+
|
+
ExtraHop Reveal(x): Update Watchlist (PB) |
+Add or remove an ExtraHop device to or from the watchlist. |
+Manual |
+extrahop_devices |
+
|
+
|
+
Import the Data Tables and Custom Fields like the screenshot below:
+ +extrahop_activitymaps
@@ -4252,7 +5636,7 @@Mod time
mod_time
text
datetimepicker
-
Mode
-
extrahop_detections
Appliance ID |
|
|
-- |
+The identifier for a sensor. |
|||
Assignee |
|
@@ -4347,41 +5731,41 @@ - |
|||||
Detection URL |
+|||||||
Detection ID |
+
|
+
|
+- |
+||||
Detection URL |
|
|
- |
||||
End time |
+|||||||
End time |
|
|
- |
||||
Detection ID |
-
|
-
|
-- |
-||||
Is user created |
|
|
- |
||||
Mod time |
-
|
-
|
-- |
-||||
Mitre tactics |
+|||||||
Mitre tactics |
|
|
- |
||||
Mitre techniques |
+|||||||
Mitre techniques |
|
|
- |
||||
Mod time |
+
|
+
|
+Returns detections that were updated after the specified date, expressed in milliseconds since the epoch. |
+||||
Participants |
|
|
@@ -4440,7 +5824,7 @@ Update time |
|
|
-- |
+Returns detections related to events that occurred after the specified date, expressed in milliseconds since the epoch. Note that ExtraHop Machine Learning Services analyze historical data to generate detections, and so there is a time delay between when the events that cause those detections occur and when the detections are generated. If you search for detections in the same update_time window multiple times, the later search might return detections that were not returned by the earlier search. |
-
extrahop_devices
- |
-|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Device URL |
+|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Device ID |
+
|
+
|
+REST API ID |
+||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Device URL |
|
|
Linkback to device on ExtraHop. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Discovery time |
+|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Discovery time |
|
|
- |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Display name |
+|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Display name |
|
|
- |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DNS name |
+|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DNS name |
|
|
- |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ExtraHop ID |
+|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ExtraHop ID |
|
|
ExtraHop Discovery ID |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Device ID |
-
|
-
|
-REST API ID |
-||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
IPaddr4 |
|
|
@@ -4570,14 +5954,14 @@
Extrahop Assignee |
+|||||||||||||||||||||||||||||||||||||||||||
ExtraHop Assignee |
|
|
|
- |
- |
||||||||||||||||||||||||||||||||||||||
Extrahop Console URL |
+|||||||||||||||||||||||||||||||||||||||||||
ExtraHop Console URL |
|
|
|
- |
ExtraHop base console url. |
||||||||||||||||||||||||||||||||||||||
Extrahop Detection ID |
+|||||||||||||||||||||||||||||||||||||||||||
ExtraHop Detection ID |
|
|
|
- |
Extrahop detecion ID. |
||||||||||||||||||||||||||||||||||||||
Extrahop Detection Link |
+|||||||||||||||||||||||||||||||||||||||||||
ExtraHop Detection Link |
|
|
|
- |
Link back to ExtraHop detection |
||||||||||||||||||||||||||||||||||||||
Extrahop Detection Updated |
+|||||||||||||||||||||||||||||||||||||||||||
ExtraHop Detection Updated |
|
|
|
- |
Field to indicate detection has been updated |
||||||||||||||||||||||||||||||||||||||
Extrahop End Time |
+|||||||||||||||||||||||||||||||||||||||||||
ExtraHop End Time |
|
|
|
@@ -4732,35 +6116,35 @@ Extrahop Risk Score |
+|||||||||||||||||||||||||||||||||||||||
ExtraHop Risk Score |
|
|
|
- |
- |
||||||||||||||||||||||||||||||||||||||
Extrahop Site name |
+|||||||||||||||||||||||||||||||||||||||||||
ExtraHop Site Name |
|
|
|
- |
The name of the ExtraHop appliance. |
||||||||||||||||||||||||||||||||||||||
Extrahop Site UUID |
+|||||||||||||||||||||||||||||||||||||||||||
ExtraHop Site UUID |
|
|
|
- |
-The uuid of the ExtraHop appliance. |
+The uuidof the ExtraHop appliance. |
|||||||||||||||||||||||||||||||||||||
Extrahop Status |
+|||||||||||||||||||||||||||||||||||||||||||
ExtraHop Status |
|
|
|
- |
- |
||||||||||||||||||||||||||||||||||||||
Extrahop Ticket ID |
+|||||||||||||||||||||||||||||||||||||||||||
ExtraHop Ticket ID |
|
|
|
@@ -4774,13 +6158,20 @@ ExtraHop Update Time |
+
|
+
|
+
|
+- |
+- |
+
ExtraHop Reveal(x): Search Packets (PB) |
-Search for and download packets stored on the ExtraHop Reveal(x) system and add as an attachment. Valid output types are: pcap, keylog_txt or zip. |
+Search for and download packets stored on the ExtraHop Reveal(x) system and add as an attachment. Supported output formats: pcap, keylog_txt, pcapng, zip, extract. |
artifact |
|