Intel471Credentials
Fetches leaked credentials from the Intel471 Credentials API and produces an indicator per credential. While building each indicator the integration also creates an associated incident.
Data Enrichment & Threat Intelligence · Intel471 Feed · Feed
Details
| ID | Intel471Credentials |
|---|---|
| Provider | Intel471 |
| Category | Data Enrichment & Threat Intelligence |
| From Version | 6.8.0 |
| Docker Image | demisto/py3-tools:1.0.0.11597437 |
| Supported Modules | Agentix XSIAM |
README
Intel471 Credentials
Fetches leaked credentials from the Intel471 Credentials API (/credentials/stream).
The primary command is fetch-indicators: each credential is converted into one Cortex indicator (Email if the login contains @, otherwise Account). While iterating the indicator-creation loop, the integration also creates an associated Cortex incident for the same credential and links it back via the indicator’s relatedIncidents field.
Notes
- On the first run, the integration fetches credentials with
last_updated_tsnewer than the configured “First fetch timestamp” (default: 7 days). - Subsequent runs continue from the stream cursor returned by the API.
Prerequisites
The integration authenticates to the Intel471 Credentials API with HTTP Basic auth (Username = API username, Password = API key). To obtain these credentials:
- Sign in to the Intel471 Developer Portal using your organization SSO account (or sign up if this is your first visit).
- Confirm that your organization has an active subscription that grants access to the Credentials Intelligence product. If it does not, contact your Intel471 account manager to enable it.
- In the portal, open API Keys (under your account menu) and click Create new API key.
- Copy the generated username and API key — the API key is shown only once.
- Use these values in the Username and Password fields of the configuration below.
Configure Intel471 Credentials in Cortex
| Parameter | Description | Required |
|---|---|---|
| Username | HTTP Basic auth credentials for the Intel471 Credentials API — enter your API username and API key. | True |
| Password | HTTP Basic auth credentials for the Intel471 Credentials API — enter your API username and API key. | True |
| Use system proxy settings | When enabled, requests are routed through the system proxy configured on the Cortex engine. | False |
| Trust any certificate (not secure) | When enabled, SSL certificate verification is skipped. Not recommended for production use. | False |
| Fetch indicators | False | |
| First fetch timestamp (<number> <time unit>, e.g., 12 hours, 7 days) | The time to go back when performing the first fetch. | False |
| Maximum items per fetch | The maximum number of credentials to pull per fetch (each one becomes one indicator and one incident). | False |
| Feed Fetch Interval | How often (in minutes) the integration polls the Intel471 API for new credentials. | False |
| Indicator Reputation | The reputation to apply to indicators from this integration instance. | False |
| Source Reliability | The reliability of the source providing the intelligence data. | True |
| Tags | A comma-separated list of tags. | False |
| Bypass exclusion list | Whether to ignore the exclusion list for indicators from this feed. | False |
| Credential set name | The credential set name to filter results by. | False |
| Credential set id | The credential set ID to filter results by. | False |
| Domain | The credential detection domain to filter results by. | False |
| Affiliation group | The affiliation group to filter results by. Possible values: my_employees, my_customers, third_parties, vip_emails. | False |
| Password strength | The password strength to filter results by. | False |
| Detected malware | The detected info stealer malware family to filter results by (e.g., agent_tesla, Lumma, VIDAR). | False |
| GIRs | A comma-separated list of custom GIRs (General Intelligence Requirements), my_girs or company_pirs, to filter results by. | 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.
intel471-credentials-get-indicators
Gets a preview of indicators that the feed would pull on the next run (no state is persisted).
Base Command
intel471-credentials-get-indicators
Input
| Argument Name | Description | Required |
|---|---|---|
| limit | The maximum number of indicators to return. Default is 50. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| Intel471Credentials.Indicators.value | String | The credential login value (email address or account username). |
| Intel471Credentials.Indicators.type | String | The indicator type — Email or Account. |
| Intel471Credentials.Indicators.fields.firstseenbysource | Date | Timestamp when the credential was first observed by Intel471. |
| Intel471Credentials.Indicators.fields.lastseenbysource | Date | Timestamp when the credential was last observed by Intel471. |
| Intel471Credentials.Indicators.fields.tags | Unknown | Aggregated tags — malware families, affiliations, and configured feed tags. |
| Intel471Credentials.Indicators.fields.intel471infostealerantivirussoftware | String | Antivirus software detected on the machine infected by the info stealer. |
| Intel471Credentials.Indicators.fields.intel471infostealercomputerusername | String | Operating-system username logged in on the infected machine. |
| Intel471Credentials.Indicators.fields.intel471infostealerinfectiontimestamp | Date | Timestamp when the info stealer infection was recorded. |
| Intel471Credentials.Indicators.fields.intel471infostealerip | String | IP address of the machine infected by the info stealer. |
| Intel471Credentials.Indicators.fields.intel471infostealerisp | String | Internet service provider associated with the infected machine. |
| Intel471Credentials.Indicators.fields.intel471infostealermachineid | String | Unique identifier fingerprinted by the info stealer for the infected host. |
| Intel471Credentials.Indicators.fields.intel471infostealermalwarefamily | String | Family of info stealer malware that captured the credential. |
| Intel471Credentials.Indicators.fields.intel471infostealermalwareinstallpath | String | Filesystem path where the info stealer malware was installed. |
| Intel471Credentials.Indicators.fields.intel471infostealeros | String | Operating system reported for the machine infected by the info stealer. |
| Intel471Credentials.Indicators.fields.intel471infostealerpcname | String | Hostname (PC name) of the machine infected by the info stealer. |
| Intel471Credentials.Indicators.fields.intel471infostealerscreenshotpath | String | Path to the desktop screenshot captured by the info stealer. |
| Intel471Credentials.Indicators.fields.intel471infostealerversion | String | Version identifier reported by the info stealer malware. |
Command example
!intel471-credentials-get-indicators limit=5
Context Example
{
"Intel471Credentials": {
"Indicators": [
{
"value": "victim@example.com",
"type": "Email",
"fields": {
"firstseenbysource": "2026-06-01T00:00:00Z",
"lastseenbysource": "2026-06-20T00:00:00Z",
"tags": ["lumma", "my_employees"],
"intel471infostealerantivirussoftware": "Defender",
"intel471infostealercomputerusername": "jdoe",
"intel471infostealerinfectiontimestamp": "2026-06-19T12:00:00Z",
"intel471infostealerip": "1.2.3.4, 5.6.7.8",
"intel471infostealerisp": "ExampleISP",
"intel471infostealermachineid": "m-1",
"intel471infostealermalwarefamily": "lumma",
"intel471infostealermalwareinstallpath": "C:/Users/jdoe/AppData/Roaming",
"intel471infostealeros": "Windows 11",
"intel471infostealerpcname": "DESKTOP-XYZ",
"intel471infostealerscreenshotpath": "screens/abc.png",
"intel471infostealerversion": "1.2.3"
}
}
]
}
}
Human Readable Output
Indicators from Intel471 Credentials
Value Type fields victim@example.com firstseenbysource: 2026-06-01T00:00:00Z
lastseenbysource: 2026-06-20T00:00:00Z
tags: lumma, my_employees
intel471infostealermalwarefamily: lumma
intel471infostealerip: 1.2.3.4, 5.6.7.8
intel471infostealeros: Windows 11
intel471infostealerpcname: DESKTOP-XYZ
intel471infostealerversion: 1.2.3
Configuration parameters
credentials— Username (required)proxy— Use system proxy settingsinsecure— Trust any certificate (not secure)feed— Fetch indicatorsfetch_time— First fetch timestamp (<number> <time unit>, e.g., 12 hours, 7 days)max_fetch— Maximum items per fetchfeedFetchInterval— Feed Fetch IntervalfeedReputation— Indicator ReputationfeedReliability— Source Reliability (required)tlp_color— Traffic Light Protocol ColorfeedExpirationPolicy—feedExpirationInterval—feedTags— TagsfeedBypassExclusionList— Bypass exclusion listcredential_set_name— Credential set namecredential_set_id— Credential set iddomain— Domainaffiliation_group— Affiliation grouppassword_strength— Password strengthdetected_malware— Detected malwaregirs— GIRs
Commands (1)
-
intel471-credentials-get-indicatorsGets a preview of indicators that the feed would pull on the next run (no state is persisted).
import json def util_load_json(path): with open(path, encoding="utf-8") as f: return json.loads(f.read()) def _sample_credential() -> dict: return { "id": "cred--00000000-0000-0000-0000-000000000001", "last_updated_ts": "2026-06-20T10:00:00Z", "activity": { "first_seen_ts": "2026-06-01T00:00:00Z", "last_seen_ts": "2026-06-20T00:00:00Z", }, "data": { "credential_login": "victim@example.com", "credential_domain": "example.com", "detection_domain": "example.com", "affiliations": ["my_employees"], "info_stealer": { "antivirus_software": ["Defender"], "computer_username": ["jdoe"], "infection_ts": ["2026-06-19T12:00:00Z"], "ip": ["1.2.3.4", "5.6.7.8"], "isp": ["ExampleISP"], "machine_id": ["m-1"], "malware_family": ["lumma"], "malware_install_path": ["C:/Users/jdoe/AppData/Roaming"], "os": ["Windows 11"], "pc_name": ["DESKTOP-XYZ"], "screenshot_path": ["screens/abc.png"], "version": ["1.2.3"], }, "password": {"strength": "weak"}, }, } def test_build_indicator_email(): from Intel471Credentials import build_indicator indicator = build_indicator(_sample_credential()) assert indicator["value"] == "victim@example.com" assert indicator["type"] == "Email" assert "lumma" in indicator["fields"]["tags"] assert "my_employees" in indicator["fields"]["tags"] def test_build_indicator_account_when_no_at_sign(): from Intel471Credentials import build_indicator cred = _sample_credential() cred["data"]["credential_login"] = "johndoe" indicator = build_indicator(cred) assert indicator["type"] == "Account" def test_build_indicator_returns_empty_when_no_login(): from Intel471Credentials import build_indicator cred = _sample_credential() cred["data"]["credential_login"] = "" assert build_indicator(cred) == {} def test_build_indicator_includes_info_stealer_fields(): from Intel471Credentials import build_indicator fields = build_indicator(_sample_credential())["fields"] # infection_ts uses the CLI_NAME_OVERRIDES mapping and is kept as a single ISO string. assert fields["intel471infostealerinfectiontimestamp"] == "2026-06-19T12:00:00Z" # Multi-value fields are comma-joined. assert fields["intel471infostealerip"] == "1.2.3.4, 5.6.7.8" # Single-value fields come through unchanged. assert fields["intel471infostealerantivirussoftware"] == "Defender" assert fields["intel471infostealercomputerusername"] == "jdoe" assert fields["intel471infostealerisp"] == "ExampleISP" assert fields["intel471infostealermachineid"] == "m-1" assert fields["intel471infostealermalwarefamily"] == "lumma" assert fields["intel471infostealermalwareinstallpath"] == "C:/Users/jdoe/AppData/Roaming" assert fields["intel471infostealeros"] == "Windows 11" assert fields["intel471infostealerpcname"] == "DESKTOP-XYZ" assert fields["intel471infostealerscreenshotpath"] == "screens/abc.png" assert fields["intel471infostealerversion"] == "1.2.3" def test_build_indicator_omits_info_stealer_fields_when_absent(): from Intel471Credentials import build_indicator cred = _sample_credential() cred["data"]["info_stealer"] = {} fields = build_indicator(cred)["fields"] assert not any(key.startswith("intel471infostealer") for key in fields) def test_build_incident_name_includes_login_and_domain(): from Intel471Credentials import build_incident incident = build_incident(_sample_credential()) assert "victim@example.com" in incident["name"] assert incident["occurred"] == "2026-06-20T10:00:00Z" payload = json.loads(incident["rawJSON"]) assert payload["id"] == "cred--00000000-0000-0000-0000-000000000001" def test_build_incident_includes_info_stealer_labels(): from Intel471Credentials import build_incident incident = build_incident(_sample_credential()) labels = {label["type"]: label["value"] for label in incident.get("labels", [])} assert labels["info_stealer.malware_family"] == "lumma" assert labels["info_stealer.ip"] == "1.2.3.4, 5.6.7.8" assert labels["info_stealer.os"] == "Windows 11" assert labels["info_stealer.pc_name"] == "DESKTOP-XYZ" assert labels["info_stealer.version"] == "1.2.3" def test_build_incident_omits_info_stealer_when_empty(): from Intel471Credentials import build_incident cred = _sample_credential() cred["data"]["info_stealer"] = {} incident = build_incident(cred) assert "labels" not in incident def test_fetch_credentials_paginates_until_cursor_exhausted(mocker, requests_mock): from Intel471Credentials import Client, FEED_URL_CREDENTIALS requests_mock.get( FEED_URL_CREDENTIALS, [ {"json": {"credentials": [_sample_credential()], "cursor_next": "abc"}}, {"json": {"credentials": [_sample_credential()], "cursor_next": ""}}, ], ) mocker.patch("Intel471Credentials.handle_proxy", return_value={}) client = Client(auth=("u", "p"), fetch_time="1 day") creds, next_cursor = client.fetch_credentials("0", "", limit=10) assert len(creds) == 2 assert next_cursor == "abc" def test_fetch_indicators_command_links_indicator_to_incident(monkeypatch): import demistomock as demisto import Intel471Credentials monkeypatch.setattr(Intel471Credentials, "handle_proxy", lambda **_: {}) monkeypatch.setattr(demisto, "getLastRun", dict) client = Intel471Credentials.Client(auth=("u", "p"), fetch_time="1 day") monkeypatch.setattr(client, "fetch_credentials", lambda *a, **kw: ([_sample_credential()], "next-cursor")) indicators, incidents, next_run = Intel471Credentials.fetch_indicators_command(client, max_items=10) assert len(indicators) == 1 assert len(incidents) == 1 # Indicator-to-incident association is set up inside the loop. assert indicators[0]["relatedIncidents"] == [incidents[0]["name"]] assert next_run["cursor"] == "next-cursor"