TopMaliciousRatioIndicators

Find the top malicious ratio indicators. Malicious ratio is defined by the ratio between the number of "bad" incidents divided by the number of total number of incidents that the indicators appears in.

python · Common Scripts

Source

import demistomock as demisto  # noqa: F401
from CommonServerPython import *  # noqa: F401


def select_indicator_columns(indicator: dict) -> Dict:
    display_indicator = {}
    display_indicator["ID"] = indicator["id"]
    display_indicator["Type"] = indicator["indicator_type"]
    display_indicator["Malicious Ratio"] = "%.2f" % float(indicator["maliciousRatio"])  # noqa: UP031
    display_indicator["Value"] = indicator["value"]
    display_indicator["Last Seen"] = indicator["lastSeen"]
    return display_indicator


def dedup_by_value(indicators: list) -> List:
    exist_values = set()
    result = []
    for e in indicators:
        value = e["value"]
        if value not in exist_values:
            exist_values.add(value)
            result.append(e)
    return result


def find_indicators_with_mal_ratio(
    max_indicators: int, min_number_of_invs: int, max_results: int, from_date: str
) -> tuple[str, list]:
    indicators = execute_command(
        "findIndicators", {"query": f"lastSeen:>={from_date} investigationsCount:>={min_number_of_invs}", "size": max_indicators}
    )

    if not indicators:
        return json.dumps({"total": 0, "data": []}), []

    indicators_map = {i["id"]: i for i in indicators}

    malicious_ratio_result = execute_command("maliciousRatio", {"id": ",".join(indicators_map)})

    for mr in malicious_ratio_result:
        indicators_map[mr["indicatorId"]]["maliciousRatio"] = mr["maliciousRatio"]
        indicators_map[mr["indicatorId"]]["from_date"] = from_date

    sorted_indicators = sorted(indicators_map.values(), key=lambda x: x["maliciousRatio"], reverse=True)
    sorted_indicators = [x for x in sorted_indicators if x["maliciousRatio"] > 0]
    sorted_indicators = dedup_by_value(sorted_indicators)
    sorted_indicators = sorted_indicators[:max_results]
    sorted_indicators = list(map(select_indicator_columns, sorted_indicators))
    widget_table = json.dumps({"total": len(sorted_indicators), "data": sorted_indicators})

    return widget_table, sorted_indicators


def main():
    try:
        args: dict = demisto.args()
        max_indicators = int(args["maxNumberOfIndicators"])
        min_number_of_invs = int(args["minimumNumberOfInvs"])
        max_results = int(args["maximumNumberOfResults"])
        from_date = args.get("from", '"30 days ago"')

        widget_table, sorted_indicators = find_indicators_with_mal_ratio(
            max_indicators, min_number_of_invs, max_results, from_date
        )

        demisto.results(
            {
                "Type": entryTypes["note"],
                "Contents": widget_table,
                "ContentsFormat": formats["text"],
                "ReadableContentsFormat": formats["markdown"],
                "HumanReadable": tableToMarkdown("Top Malicious Ratio Indicators", sorted_indicators),
            }
        )

    except Exception:
        demisto.error(traceback.format_exc())  # print the traceback
        return_error(f"Failed to execute TopMaliciousRatioIndicators. Error: {traceback.format_exc()}")


if __name__ in ("__builtin__", "builtins", "__main__"):  # pragma: no cover
    main()

README

Finds the top malicious ratio indicators. The malicious ratio is defined by the ratio between the number of “bad” incidents divided by the total number of incidents that the indicators appears in.

Script Data

Name Description
Script Type python
Tags widget
Cortex XSOAR Version 4.0.0+

Inputs

Argument Name Description
maxNumberOfIndicators The maximum number of indicators for malicious ratio calculation.
minimumNumberOfInvs The minimum number of investigations the indicator has to appear in.
maximumNumberOfResults The maximum number of results to display.

Outputs

There are no outputs for this script.