GetIndicatorDBotScore

Add into the incident's context the system internal DBot score for the input indicator.

python · Common Scripts

Details

IDGetIndicatorDBotScore
Languagepython
From Version5.0.0
Docker Imagedemisto/python3:3.12.13.10116658
TagsDBot Enrichment

README

Add into the incident’s context the system internal DBot score for the input indicator.

Script Data


Name Description
Script Type python2
Tags DBot, Enrichment
Cortex XSOAR Version 5.0.0

Used In


This script is used in the following playbooks and scripts.

  • DBot Indicator Enrichment - Generic

Inputs


Argument Name Description
indicator The indicator to get the reputation of. Only system indicator types are supported. In order to send multiple indicators, use either a list or a JSON formatted string representation (e.g., ["indicator1", "indicator2"]).

Outputs


Path Description Type
DBotScore.Indicator The indicator. string
DBotScore.Type The indicator type. string
DBotScore.Vendor The DBot score vendor. string
DBotScore.Score The DBot score. number
import CommonServerPython
import demistomock as demisto
import pytest

GetIndicatorDBotScoreFunc = "GetIndicatorDBotScore.get_dbot_score_data"


@pytest.fixture(autouse=True)
def handle_calling_context(mocker):
    mocker.patch.object(demisto, "callingContext", {"script": True})


@pytest.mark.parametrize(
    "indicator, indicator_type, expected",
    [
        ("test_indicator", "File SHA-256", "file"),
        ("test_indicator", "File SHA256", "file"),
        ("test_indicator", "File", "file"),
        ("test_indicator", "CVE", "cve"),
        ("test_indicator", "IP", "ip"),
        ("test_indicator", "Email", "email"),
        ("test_indicator", "Url", "url"),
        ("test_indicator", "IPv6", "ip"),
    ],
)
def test_validate_indicator_type(indicator, indicator_type, expected):
    """
    Given:
        - an indicator's data

    When:
        - running the script

    Then:
        - validating the dbotScoreType matches the correct indicator type
    """
    from GetIndicatorDBotScore import INDICATOR_TYPES, get_dbot_score_data

    indicator_type_after_mapping = INDICATOR_TYPES.get(indicator_type, indicator_type).lower()
    res = get_dbot_score_data(indicator, indicator_type_after_mapping, "source", 0)
    assert res.get("Type") == expected


RESPONSE = [
    {
        "Contents": [
            {
                "indicator_type": "IP",
                "manualScore": True,
                "moduleToFeedMap": {
                    "VirusTotal": {"score": 1, "type": "IP", "value": "8.8.8.8"},
                    "ipinfo": {"score": 0, "type": "IP", "value": "8.8.8.8"},
                },
                "score": 2,
                "value": "8.8.8.8",
            }
        ],
        "Type": 1,
    }
]


@pytest.mark.parametrize(
    "indicator_input, expected_count",
    [
        ("test1", 1),
        (["test1", "test2"], 2),
        (["test1", "test2", "test3"], 3),
        ("test1,test2", 1),
        ("https://expired.badssl.com/?q=1,2,3", 1),
        ('["https://expired.badssl.com/?q=1,2,3", "indicator2"]', 2),
    ],
)
def test_multiple_indicators(mocker, indicator_input, expected_count):
    """
    Given:
            - indicator list as input

        When:
            - running the script

        Then:
            - ensures that every indicator in the input returns one valid result (multiple indicators have multiple results)
    """

    from GetIndicatorDBotScore import main

    mocker.patch.object(CommonServerPython, "appendContext")
    execute_command = mocker.patch.object(demisto, "executeCommand", return_value=RESPONSE)
    mocker.patch.object(demisto, "args", return_value={"indicator": indicator_input})
    main()
    assert execute_command.call_count == expected_count


class TestIterateIndicatorEntry:
    @staticmethod
    def set_input(score=2, indicator="8.8.8.8", indicator_type="IP", vendors="ipinfo", set_by=None):
        module_to_feed_map = {}
        vendors = [vendors] if not isinstance(vendors, list) else vendors
        for i, vendor in enumerate(vendors):
            module_to_feed_map[vendor] = {"score": i % 4, "type": indicator_type, "value": indicator}

        res = {"indicator_type": indicator_type, "moduleToFeedMap": module_to_feed_map, "score": score, "value": indicator}
        if set_by:
            res.update({"manualScore": bool(set_by), "setBy": set_by})
        return res

    def test_iterate_indicator_entry_without_vendor(self):
        from GetIndicatorDBotScore import iterate_indicator_entry

        input_data = self.set_input(vendors="")
        output = [x[0] for x in iterate_indicator_entry("8.8.8.8", input_data)]
        assert output == [{"Vendor": "Cortex XSOAR", "Indicator": "8.8.8.8", "Score": 0, "Type": "ip"}]

    def test_iterate_indicator_entry_with_1_vendor(self):
        from GetIndicatorDBotScore import iterate_indicator_entry

        input_data = self.set_input(vendors="test")
        output = [x[0] for x in iterate_indicator_entry("8.8.8.8", input_data)]
        assert output == [{"Vendor": "test", "Indicator": "8.8.8.8", "Score": 0, "Type": "ip"}]

    def test_iterate_indicator_entry_with_corupted_vendor(self):
        from GetIndicatorDBotScore import iterate_indicator_entry

        input_data = self.set_input(vendors=None)
        output = [x[0] for x in iterate_indicator_entry("8.8.8.8", input_data)]
        assert output == [{"Vendor": "Cortex XSOAR", "Indicator": "8.8.8.8", "Score": 0, "Type": "ip"}]

    def test_iterate_indicator_entry_with_1_vendor_and_manual_edit(self):
        from GetIndicatorDBotScore import iterate_indicator_entry

        input_data = self.set_input(vendors="test", set_by="admin")
        output = [x[0] for x in iterate_indicator_entry("8.8.8.8", input_data)]
        assert output == [
            {"Vendor": "test", "Indicator": "8.8.8.8", "Score": 0, "Type": "ip"},
            {"Vendor": "admin", "Indicator": "8.8.8.8", "Score": 2, "Type": "ip"},
        ]

    def test_iterate_indicator_entry_with_2_vendors(self):
        from GetIndicatorDBotScore import iterate_indicator_entry

        input_data = self.set_input(vendors=["test1", "test2"])
        output = [x[0] for x in iterate_indicator_entry("8.8.8.8", input_data)]
        assert output == [
            {"Vendor": "test1", "Indicator": "8.8.8.8", "Score": 0, "Type": "ip"},
            {"Vendor": "test2", "Indicator": "8.8.8.8", "Score": 1, "Type": "ip"},
        ]