ProofpointFeed

Detailed feed of domains and IP addresses classified in different categories. You need a valid authorization code from Proofpoint ET to access this feed.

Data Enrichment & Threat Intelligence · Proofpoint Feed · Feed

Details

IDProofpointFeed
ProviderThoma Bravo
CategoryData Enrichment & Threat Intelligence
From Version5.5.0
Docker Imagedemisto/python3:3.12.13.10116658

README

Detailed feed of domains and ips classified in different categories. You need a valid authorization code from Proofpoint ET to access this feed

Configure Proofpoint Feed in Cortex

Parameter Description Required
Fetch indicators   False
Authorization Code   True
Indicator Reputation Indicators from this integration instance will be marked with this reputation False
Source Reliability Reliability of the source providing the intelligence data True
Traffic Light Protocol Color The Traffic Light Protocol (TLP) designation to apply to indicators fetched from the feed False
    False
    False
Feed Fetch Interval   False
Bypass exclusion list When selected, the exclusion list is ignored for indicators from this feed. This means that if an indicator from this feed is on the exclusion list, the indicator might still be added to the system. False
Indicator Type The indicator type in the feed to fetch. Domain is referring to “https://rules.emergingthreats.net/auth_code/reputation/detailed-iprepdata.txt”, IP is referring to “https://rules.emergingthreats.net/auth_code/reputation/detailed-domainrepdata.txt”. True
Tags Supports CSV values. False
Trust any certificate (not secure)   False
Use system proxy settings   False

Commands

You can execute these commands from the CLI, as part of an automation, or in a playbook.
After you successfully execute a command, a DBot message appears in the War Room with the command details.

proofpoint-get-indicators


Gets indicators from the feed.

Base Command

proofpoint-get-indicators

Input

Argument Name Description Required
limit The maximum number of results to return to the output. The default value is “50”. Default is 50. Optional
indicator_type The indicator type to fetch. Possible values are: all, domain, ip. Default is all. Optional

Context Output

There is no context output for this command.

Configuration parameters

  • feed — Fetch indicators
  • auth_code — Authorization Code
  • credentials_auth_code
  • feedReputation — Indicator Reputation
  • feedReliability — Source Reliability (required)
  • tlp_color — Traffic Light Protocol Color
  • feedExpirationPolicy
  • feedExpirationInterval
  • feedFetchInterval — Feed Fetch Interval
  • feedBypassExclusionList — Bypass exclusion list
  • indicator_type — Indicator Type (required)
  • feedTags — Tags
  • insecure — Trust any certificate (not secure)
  • proxy — Use system proxy settings

Commands (1)

  • proofpoint-get-indicators

    Gets indicators from the feed.

import pytest
from CommonServerPython import FeedIndicatorType
from FeedProofpoint import Client, fetch_indicators_command, get_indicators_command

url = "https://example.com"
auth_code = "cool"
client = Client(url, auth_code)


def test_fetch_ips(requests_mock):
    ip_path = "./TestData/detailed-iprep.txt"
    with open(ip_path) as f:
        data = f.read()
    requests_mock.get("https://example.com/cool/reputation/detailed-iprepdata.txt", text=data)
    indicators = fetch_indicators_command(client, client.IP_TYPE)
    assert len(indicators) == 4


def test_fetch_domains(requests_mock):
    ip_path = "./TestData/detalied-domainrepdata.txt"
    with open(ip_path) as f:
        data = f.read()
    requests_mock.get("https://example.com/cool/reputation/detailed-domainrepdata.txt", text=data)
    indicators = fetch_indicators_command(client, client.DOMAIN_TYPE)
    assert len(indicators) == 12
    # making sure all domains are not of type domain glob
    domains = [ind for ind in indicators if ind.get("type") == FeedIndicatorType.Domain]
    domain_globs = [ind for ind in indicators if ind.get("type") == FeedIndicatorType.DomainGlob]
    assert len(domains) == 9
    assert len(domain_globs) == 3
    assert any("*" not in ind.get("value") for ind in domains)
    assert all("*" in ind.get("value") for ind in domain_globs)


def test_fetch_domains_with_invalid_category(requests_mock):
    """
    Given:
    - A domain feed with invalid (non-numeric) category values
    When:
    - Executing fetch_indicators_command
    Then:
    - Validate that the function handles invalid category values gracefully
    - Verify that indicators with invalid categories have "Unknown" as category_name
    """
    test_path = "./TestData/domain-with-invalid-category.txt"
    with open(test_path) as f:
        data = f.read()
    requests_mock.get("https://example.com/cool/reputation/detailed-domainrepdata.txt", text=data)
    indicators = fetch_indicators_command(client, client.DOMAIN_TYPE)

    # Verify we got all indicators including those with invalid categories
    assert len(indicators) == 5

    # Test case 1: Non-numeric category (domain name)
    invalid_category_indicator = next((ind for ind in indicators if ind.get("value") == "malicious.com"), None)
    assert invalid_category_indicator is not None
    assert invalid_category_indicator["rawJSON"]["category_name"] == "Unknown"

    # Test case 2: Out of bounds category index
    out_of_bounds_indicator = next((ind for ind in indicators if ind.get("value") == "outofbounds.com"), None)
    assert out_of_bounds_indicator is not None
    assert out_of_bounds_indicator["rawJSON"]["category_name"] == "Unknown"

    # Test case 3: Empty category
    empty_category_indicator = next((ind for ind in indicators if ind.get("value") == "empty-category.com"), None)
    assert empty_category_indicator is not None
    assert empty_category_indicator["rawJSON"]["category_name"] == "Unknown"


@pytest.mark.parametrize("tags", (["tag1, tag2"], []))
def test_feed_param(tags, requests_mock):
    """
    Given:
    - tags parameters
    When:
    - Executing any command on feed
    Then:
    - Validate the tags supplied exists in the indicators
    """
    client._tags = tags
    ip_path = "./TestData/detailed-iprep.txt"
    with open(ip_path) as f:
        data = f.read()
    requests_mock.get("https://example.com/cool/reputation/detailed-iprepdata.txt", text=data)
    indicators = fetch_indicators_command(client, client.IP_TYPE)
    assert tags == indicators[0]["fields"]["tags"]


def test_get_indicators_command(mocker):
    """
    Given:
    - tags parameters
    When:
    - Executing get_indicators_command
    Then:
    - Validate that the function returns expected markdown table,
        empty dictionary as context, and list of fetched indicators
        for a valid indicator type and limit value.
    """
    mocker.patch.object(
        client, "get_indicators", return_value=[{"type": "domain", "value": "example.com"}, {"type": "ip", "value": "1.2.3.4"}]
    )
    args = {"indicator_type": "all", "limit": "2"}
    expected_hr = "### Indicators from Proofpoint Feed\n|type|value|\n|---|---|\n| domain | example.com |\n| ip | 1.2.3.4 |\n"
    expected_indicators = [{"type": "domain", "value": "example.com"}, {"type": "ip", "value": "1.2.3.4"}]
    hr, context, indicators = get_indicators_command(client, args)
    assert hr == expected_hr
    assert context == {}
    assert indicators == expected_indicators