ExtractIndicatorsFromTextFile

Extract indicators from a text-based file. Indicators that can be extracted: * IP * Domain * URL * File Hash * Email Address 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 · Common Scripts

Source

import json

import demistomock as demisto
from CommonServerPython import *

from CommonServerUserPython import *


def string_to_markdown(indicators: str) -> str:
    """
    Converts the JSON to a human-readable markdown structure

    Args:
        indicators (str): JSON of the indicators extracted by the server as a string.

    Returns:
        str: Markdown list of the indicators extracted
    """
    try:
        indicators_dict = json.loads(indicators)

        md = ""

        for key, values in indicators_dict.items():
            md += f"### {key}\n"

            for value in values:
                md += f"- {value}\n"

    except json.JSONDecodeError:
        demisto.error(f'JSON Decode failed on "{indicators}"')
        md = f'JSON Decode failed on "{indicators}"'

    return md


def read_file_with_encoding_detection(filePath, maxFileSize):
    encoding_types = ["utf-8", "ISO-8859-9"]
    for encoding in encoding_types:
        try:
            with open(filePath, encoding=encoding) as file:
                return file.read(maxFileSize)
        except Exception:
            continue

    raise ValueError(f"Can't read file with {filePath}")


def extract_indicators_from_file(args):
    try:
        maxFileSize = int(args.get("maxFileSize"))
    except Exception:
        maxFileSize = 1024**2

    res = demisto.executeCommand("getFilePath", {"id": args.get("entryID")})

    try:
        filePath = res[0]["Contents"]["path"]
    except Exception:
        raise FileNotFoundError

    data = read_file_with_encoding_detection(filePath, maxFileSize)

    # Extract indicators (omitting context output, letting auto-extract work)
    indicators_hr = demisto.executeCommand("extractIndicators", {"text": data})[0]["Contents"]
    return {
        "Type": entryTypes["note"],
        "ContentsFormat": formats["text"],
        "Contents": indicators_hr,
        "HumanReadable": string_to_markdown(indicators_hr),
        "EntryContext": json.loads(indicators_hr),
    }


def main():
    try:
        args = demisto.args()
        demisto.results(extract_indicators_from_file(args))
    except FileNotFoundError:
        return_error("File was not found")


if __name__ in ["__main__", "builtin", "builtins"]:
    main()

README

Extract indicators from a text-based file.
Indicators that can be extracted:

  • IP
  • Domain
  • URL
  • File Hash
  • Email Address

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 the https://docs-cortex.paloaltonetworks.com/r/Cortex-XSOAR/6.x/Cortex-XSOAR-Playbook-Design-Guide/Automations for Cortex XSOAR 8 Cloud, see the https://docs-cortex.paloaltonetworks.com/r/Cortex-XSOAR/8/Cortex-XSOAR-Cloud-Documentation/Create-a-script for Cortex XSOAR 8 On-prem, see the https://docs-cortex.paloaltonetworks.com/r/Cortex-XSOAR/8.7/Cortex-XSOAR-On-prem-Documentation/Create-a-script.

Script Data


Name Description
Script Type python2
Cortex XSOAR Version 5.0.0

Used In


This script is used in the following playbooks and scripts.

  • Extract Indicators From File - Generic
  • Extract Indicators From File - Generic v2

Inputs


Argument Name Description
entryID The War-Room entryID of the file to read.
maxFileSize Maximal file size to load, in bytes. Default is 1000000 (1MB).

Outputs


Path Description Type
Domain.Name Extracted domains string
Account.Email.Address Extracted emails string
File.MD5 Extracted MD5 string
File.SHA1 Extracted SHA1 string
File.SHA256 Extracted SHA256 string
IP.Address Extracted IPs string
URL.Data Extracted URLs string