PhishLabsPopulateIndicators
Populate indicators by the PhishLabs IOC global feed. This automation runs using the default Limited User role, unless you explicitly change the permissions. For more information, see the section about permissions here: - For Cortex XSOAR 6 see https://docs-cortex.paloaltonetworks.com/r/Cortex-XSOAR/6.x/Cortex-XSOAR-Playbook-Design-Guide/Automations - For Cortex XSOAR 8 Cloud see https://docs-cortex.paloaltonetworks.com/r/Cortex-XSOAR/8/Cortex-XSOAR-Cloud-Documentation/Create-a-script - For Cortex XSOAR 8.7 On-prem see https://docs-cortex.paloaltonetworks.com/r/Cortex-XSOAR/8.7/Cortex-XSOAR-On-prem-Documentation/Create-a-script
python · PhishLabs
Source
import demistomock as demisto from CommonServerPython import * from CommonServerUserPython import * def indicator_type_and_value_finder(indicator_data: dict): """Find the indicator type and value of the given indicator Args: indicator_data(dict): The data about the indicator Returns: Tuple[str,str]. The indicator type and value """ indicator_value = indicator_data.get("value") # PhishLabs IOC does not classify Email indicators correctly giving them typing of "ReplayTo", "HeaderReplyTo" # "ReturnPath" and so on - to combat that we find the Email indicator type by regex # returned URLs could fit the email regex at some cases so we exclude them if re.match(str(emailRegex), str(indicator_value)) and str(indicator_data.get("type")).lower() != "url": return FeedIndicatorType.Email, indicator_value if indicator_data.get("type") == "Attachment": indicator_type = FeedIndicatorType.File file_md5_attribute = list(filter(lambda f: f.get("name") == "md5", indicator_data.get("attributes", []))) indicator_value = file_md5_attribute[0].get("value") if file_md5_attribute else "" return indicator_type, indicator_value else: return indicator_data.get("type"), indicator_value def main(): since = demisto.args().get("since") delete_false_positive = argToBoolean(demisto.args().get("delete_false_positive", "false")) limit = demisto.args().get("limit") indicator_type = demisto.args().get("indicator_type") remove_protocol = demisto.args().get("remove_protocol") remove_query = demisto.args().get("remove_query") command_args = {} if since: command_args["since"] = since if limit: command_args["limit"] = int(limit) if indicator_type: command_args["indicator_type"] = indicator_type if remove_protocol: command_args["remove_protocol"] = remove_protocol if remove_query: command_args["remove_query"] = remove_query if delete_false_positive: command_args["false_positive"] = "true" entry = demisto.executeCommand("phishlabs-global-feed", command_args)[0] if isError(entry): demisto.results("Failed getting the global feed from PhishLabs - {}".format(entry["Contents"])) else: content = entry.get("Contents") if not content or not isinstance(content, dict): return_error("No indicators found") feed = content.get("data", []) if delete_false_positive: false_positives = list(filter(lambda f: argToBoolean(str(f.get("falsePositive", "false"))) is True, feed)) for false_positive in false_positives: delete_res = demisto.executeCommand( "deleteIndicators", { "query": 'source:"PhishLabs" and value:"{}"'.format(false_positive.get("value")), "reason": "Classified as false positive by PhishLabs", }, ) if isError(delete_res[0]): return_error("Error deleting PhishLabs indicators - {}".format(delete_res[0]["Contents"])) else: for indicator in feed: indicator_type, indicator_value = indicator_type_and_value_finder(indicator) indicator_timestamp = None if indicator.get("createdAt"): indicator_timestamp = datetime.strptime(indicator["createdAt"], "%Y-%m-%dT%H:%M:%SZ") demisto_indicator = { "type": indicator_type, "value": indicator_value, "source": "PhishLabs", "reputation": "Bad", "seenNow": "true", "comment": "From PhishLabs Global Feed", } if indicator_timestamp: demisto_indicator["sourceTimeStamp"] = datetime.strftime(indicator_timestamp, "%Y-%m-%dT%H:%M:%SZ") indicator_res = demisto.executeCommand("createNewIndicator", demisto_indicator) if isError(indicator_res[0]): return_error("Error creating indicator - {}".format(indicator_res[0]["Contents"])) demisto.results("Successfully populated indicators") if __name__ in ["__main__", "__builtin__", "builtins"]: main()