Flashpoint Deprecated
Deprecated. Use Flashpoint Ignite instead.
Data Enrichment & Threat Intelligence · Flashpoint
Details
| ID | Flashpoint |
|---|---|
| Provider | Flashpoint |
| Category | Data Enrichment & Threat Intelligence |
| From Version | 5.0.0 |
| Docker Image | demisto/python3:3.12.8.1983910 |
| Supported Modules | Agentix XSIAM |
README
Deprecated. Use Flashpoint Ignite instead.
This integration was integrated and tested with API version 1.0.0 and 4.0.0 of Flashpoint.
Auto Extract Indicator
Both incident types Flashpoint Alerts and Flashpoint Compromised Credentials support auto extraction feature by default that extract indicators and enriches their reputations using commands and scripts defined for the indicator type (Refer Indicator extraction (Cortex XSOAR 6.13) or Indicator extraction (Cortex XSOAR 8 Cloud) or Indicator extraction (Cortex XSOAR 8.7 On-prem) for more detail).
Configure Flashpoint on Cortex XSOAR
- Navigate to Settings > Integrations > Servers & Services.
- Search for Flashpoint.
-
Click Add instance to create and configure a new integration instance.
Parameter Description Required Fetch incidents False Incident type False Server URL Server URL to connect to Flashpoint. True API Key True Maximum number of incidents per fetch The maximum limit is 100 for alerts and 1000 for compromised credentials. False First fetch time interval Date or relative timestamp to start fetching the incidents from. (Formats accepted: 2 minutes, 2 hours, 2 days, 2 weeks, 2 months, 2 years, yyyy-mm-dd, yyyy-mm-ddTHH:MM:SSZ, etc). False Fetch Type Whether to fetch the Flashpoint alerts or the compromised credentials. Would choose “Compromised Credentials” if nothing selected. False Fetch fresh compromised credentials alerts Whether to fetch the fresh compromised credentials alerts or not. False Trust any certificate (not secure) False Use system proxy settings False Create relationships Create relationships between indicators as part of Enrichment. False - Click Test to validate the URLs, token, and connection.
Commands
You can execute these commands from the Cortex XSOAR 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.
ip
Looks up details of an IP indicator. The reputation of the IP address is considered malicious if there’s at least one IOC event in the Flashpoint database that matches the IP indicator. Alternatively, the IP address is considered suspicious if it matches any one of the Torrent’s Peer IP Address or Forum Visit’s Peer IP Address.
Base Command
ip
Input
| Argument Name | Description | Required |
|---|---|---|
| ip | The IP address to check. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| DBotScore.Indicator | string | The indicator that was tested. |
| DBotScore.Score | number | The actual score. |
| DBotScore.Type | string | The indicator type. |
| DBotScore.Vendor | string | The vendor used to calculate the score. |
| IP.Address | string | The IP address. |
| IP.Malicious.Description | string | The description of the malicious indicator. |
| IP.Malicious.Vendor | string | The vendor used to calculate the severity of the IP address. |
| Flashpoint.IP.Event.Href | string | A list of reference links of the indicator. |
| Flashpoint.IP.Event.Address | string | The IP address of the indicator. |
| Flashpoint.IP.Event.EventDetails | string | The event details in which the indicator was observed. |
| Flashpoint.IP.Event.Category | string | The category of the indicator. |
| Flashpoint.IP.Event.Fpid | string | The Flashpoint ID of the indicator. |
| Flashpoint.IP.Event.Timestamp | string | The time and date that the indicator was observed. |
| Flashpoint.IP.Event.Type | string | The indicator type. |
| Flashpoint.IP.Event.Uuid | string | The UUID of the indicator. |
| Flashpoint.IP.Event.Comment | string | The comment that was provided when the indicator was observed. |
| IP.Relationships.EntityA | string | The source of the relationship. |
| IP.Relationships.EntityB | string | The destination of the relationship. |
| IP.Relationships.Relationship | string | The name of the relationship. |
| IP.Relationships.EntityAType | string | The type of the source of the relationship. |
| IP.Relationships.EntityBType | string | The type of the destination of the relationship. |
Command Example
!ip ip="210.122.7.129"
Context Example
{
"DBotScore": {
"Indicator": "210.122.7.129",
"Score": 3,
"Type": "ip",
"Vendor": "Flashpoint"
},
"Flashpoint.IP.Event": [
{
"Address": "210.122.7.129",
"Category": "Network activity",
"Comment": "",
"EventDetails": {
"RelatedEvent": null,
"Tags": [
"source:OSINT"
],
"attack_ids": null,
"fpid": "4J0I4NojWB2fm8IhKRJ6iw",
"href": "https://fp.tools/api/v4/indicators/event/4J0I4NojWB2fm8IhKRJ6iw",
"info": "Lazarus Resurfaces, Targets Global Banks and Bitcoin Users",
"reports": null,
"timestamp": "1518471985"
},
"Fpid": "KyhpGHc2XYKp2iUESO7ejA",
"Href": "https://fp.tools/api/v4/indicators/attribute/KyhpGHc2XYKp2iUESO7ejA",
"Timestamp": "1518471985",
"Type": "ip-dst",
"Uuid": "5a820b31-3894-4ed9-bd2a-29d6ac110002"
}
],
"IP": {
"Address": "210.122.7.129",
"Malicious": {
"Description": "Found in malicious indicators dataset",
"Vendor": "Flashpoint"
}
}
}
Human Readable Output
Flashpoint IP address reputation for 210.122.7.129
Reputation: Malicious
Events in which this IOC observed
| Date Observed (UTC) | Name | Tags |
|---|---|---|
| Feb 12, 2018 21:46 | Lazarus Resurfaces, Targets Global Banks and Bitcoin Users | source:OSINT |
All events and details (fp-tools):
https://fp.tools/home/search/iocs?group=indicator&ioc_type=ip-dst%2Cip-src&ioc_value=210.122.7.129
domain
Lookup the “Domain” type indicator details. The reputation of Domain is considered Malicious if there’s at least one IOC event in Flashpoint database matching the Domain indicator.
Base Command
domain
Input
| Argument Name | Description | Required |
|---|---|---|
| domain | The domain name to check. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| DBotScore.Indicator | string | The indicator that was tested. |
| DBotScore.Score | number | The actual score. |
| DBotScore.Type | string | The indicator type. |
| DBotScore.Vendor | string | The vendor used to calculate the score. |
| Flashpoint.Domain.Event.Href | string | A list of reference links of the indicator. |
| Flashpoint.Domain.Event.Domain | string | The domain of the indicator. |
| Flashpoint.Domain.Event.EventDetails | string | The event details in which the indicator was observed. |
| Flashpoint.Domain.Event.Category | string | The category of the indicator. |
| Flashpoint.Domain.Event.Fpid | string | The Flashpoint ID of the indicator. |
| Flashpoint.Domain.Event.Timestamp | string | The time and date that the indicator was observed. |
| Flashpoint.Domain.Event.Type | string | The indicator type. |
| Flashpoint.Domain.Event.Uuid | string | The UUID of the indicator. |
| Flashpoint.Domain.Event.Comment | string | The comment that was provided when the indicator was observed. |
| Domain.Malicious.Description | string | The description of the malicious indicator. |
| Domain.Malicious.Vendor | string | Vendor of malicious indicator. |
| Domain.Name | string | Name of domain. |
| Domain.Relationships.EntityA | string | The source of the relationship. |
| Domain.Relationships.EntityB | string | The destination of the relationship. |
| Domain.Relationships.Relationship | string | The name of the relationship. |
| Domain.Relationships.EntityAType | string | The type of the source of the relationship. |
| Domain.Relationships.EntityBType | string | The type of the destination of the relationship. |
Command Example
!domain domain="subaat.com"
Context Example
{
"DBotScore": {
"Indicator": "subaat.com",
"Score": 3,
"Type": "domain",
"Vendor": "Flashpoint"
},
"Domain": {
"Malicious": {
"Description": "Found in malicious indicators dataset",
"Vendor": "Flashpoint"
},
"Name": "subaat.com"
},
"Flashpoint.Domain.Event": [
{
"Category": "Network activity",
"Comment": "",
"Domain": "subaat.com",
"EventDetails": {
"RelatedEvent": null,
"Tags": [
"misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Spearphishing Attachment - T1193\"",
"misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Scripting - T1064\"",
"misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Command-Line Interface - T1059\"",
"misp-galaxy:mitre-enterprise-attack-attack-pattern=\"System Information Discovery - T1082\"",
"misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Remote Services - T1021\"",
"misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Exfiltration Over Command and Control Channel - T1041\"",
"os:Windows",
"source:phishing",
"type:RAT",
"malware:rat:Quasar",
"malware:banker:Lokibot",
"file_name: njrat.exe",
"file_name: excel_.exe"
],
"attack_ids": [
"T1193",
"T1064",
"T1059",
"T1082",
"T1021",
"T1041"
],
"fpid": "xTcVdG3mU2ayoTZATFTqJQ",
"href": "https://fp.tools/api/v4/indicators/event/xTcVdG3mU2ayoTZATFTqJQ",
"info": "Gorgon Group actor profile",
"reports": null,
"timestamp": "1569441099"
},
"Fpid": "ua5eL6q5W5CTmYcmAhS0XQ",
"Href": "https://fp.tools/api/v4/indicators/attribute/ua5eL6q5W5CTmYcmAhS0XQ",
"Timestamp": "1569436997",
"Type": "domain",
"Uuid": "5d8bb545-7ef0-4463-9595-02bac9bb0799"
}
]
}
Human Readable Output
Flashpoint Domain reputation for subaat.com
Reputation: Malicious
Events in which this IOC observed
| Date Observed (UTC) | Name | Tags |
|---|---|---|
| Sep 25, 2019 19:51 | Gorgon Group actor profile | misp-galaxy:mitre-enterprise-attack-attack-pattern=“Spearphishing Attachment - T1193”, misp-galaxy:mitre-enterprise-attack-attack-pattern=“Scripting - T1064”, misp-galaxy:mitre-enterprise-attack-attack-pattern=“Command-Line Interface - T1059”, misp-galaxy:mitre-enterprise-attack-attack-pattern=“System Information Discovery - T1082”, misp-galaxy:mitre-enterprise-attack-attack-pattern=“Remote Services - T1021”, misp-galaxy:mitre-enterprise-attack-attack-pattern=“Exfiltration Over Command and Control Channel - T1041”, os:Windows, source:phishing, type:RAT, malware:rat:Quasar, malware:banker:Lokibot, file_name: njrat.exe, file_name: excel_.exe |
All events and details (fp-tools):
https://fp.tools/home/search/iocs?group=indicator&ioc_type=domain&ioc_value=subaat.com
filename
Lookup the “Filename” type indicator details. The reputation of Filename is considered Malicious if there’s at least one IOC event in Flashpoint database matching the Filename indicator.
Base Command
filename
Input
| Argument Name | Description | Required |
|---|---|---|
| filename | The file name to check. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| DBotScore.Indicator | string | The indicator that was tested. |
| DBotScore.Score | number | The actual score. |
| DBotScore.Type | string | The indicator type. |
| DBotScore.Vendor | string | The vendor used to calculate the score. |
| Flashpoint.Filename.Event.Href | string | A list of reference links of the indicator. |
| Flashpoint.Filename.Event.Filename | string | Filename of the indicator |
| Flashpoint.Filename.Event.EventDetails | string | The event details in which the indicator was observed. |
| Flashpoint.Filename.Event.Category | string | The category of the indicator. |
| Flashpoint.Filename.Event.Fpid | string | The Flashpoint ID of the indicator. |
| Flashpoint.Filename.Event.Timestamp | string | The time and date that the indicator was observed. |
| Flashpoint.Filename.Event.Type | string | The indicator type. |
| Flashpoint.Filename.Event.Uuid | string | The UUID of the indicator. |
| Flashpoint.Filename.Event.Comment | string | The comment that was provided when the indicator was observed. |
Command Example
!filename filename=".locked"
Context Example
{
"DBotScore": {
"Indicator": ".locked",
"Score": 3,
"Type": "filename",
"Vendor": "Flashpoint"
},
"Filename": {
"Malicious": {
"Description": "Found in malicious indicators dataset",
"Vendor": "Flashpoint"
},
"Name": ".locked"
},
"Flashpoint.Filename.Event": [
{
"Category": "Artifacts dropped",
"Comment": "",
"EventDetails": {
"RelatedEvent": null,
"Tags": [
"malware:ransomware:lockergoga",
"report:lKyimEX1TWS8x6AtdiJ_vA",
"report:jEteM4YxQZCdm4macbE3vQ",
"report:w0fL5MgoQ_Wih8XyB6Lowg",
"report:7t-BsuFKTL-HJWbid8nupg"
],
"attack_ids": null,
"fpid": "iBUPRQOoU4SQrH64LGUbzw",
"href": "https://fp.tools/api/v4/indicators/event/iBUPRQOoU4SQrH64LGUbzw",
"info": "LockerGoga",
"reports": [
"https://fp.tools/home/intelligence/reports/report/lKyimEX1TWS8x6AtdiJ_vA",
"https://fp.tools/home/intelligence/reports/report/jEteM4YxQZCdm4macbE3vQ",
"https://fp.tools/home/intelligence/reports/report/w0fL5MgoQ_Wih8XyB6Lowg",
"https://fp.tools/home/intelligence/reports/report/7t-BsuFKTL-HJWbid8nupg"
],
"timestamp": "1571934618"
},
"Filename": ".locked",
"Fpid": "nFIUupaMWdSpJQZI03ryZA",
"Href": "https://fp.tools/api/v4/indicators/attribute/nFIUupaMWdSpJQZI03ryZA",
"Timestamp": "1553280019",
"Type": "filename",
"Uuid": "5c952c13-d048-4741-a769-05cd0a640c05"
}
]
}
Human Readable Output
Flashpoint Filename reputation for .locked
Reputation: Malicious
Events in which this IOC observed
| Date Observed (UTC) | Name | Tags |
|---|---|---|
| Oct 24, 2019 16:30 | LockerGoga | malware:ransomware:lockergoga, report:lKyimEX1TWS8x6AtdiJ_vA, report:jEteM4YxQZCdm4macbE3vQ, report:w0fL5MgoQ_Wih8XyB6Lowg, report:7t-BsuFKTL-HJWbid8nupg |
All events and details (fp-tools):
https://fp.tools/home/search/iocs?group=indicator&ioc_type=filename&ioc_value=.locked
url
Lookup the “URL” type indicator details. The reputation of Url is considered Malicious if there’s at least one IOC event in Flashpoint database matching the Url indicator.
Base Command
url
Input
| Argument Name | Description | Required |
|---|---|---|
| url | The url to check. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| DBotScore.Indicator | string | The indicator that was tested. |
| DBotScore.Score | number | The actual score. |
| DBotScore.Type | string | The indicator type. |
| DBotScore.Vendor | string | The vendor used to calculate the score. |
| Flashpoint.Url.Event.Href | string | A list of reference links of the indicator. |
| Flashpoint.Url.Event.Url | string | Url of the indicator |
| Flashpoint.Url.Event.EventDetails | string | The event details in which the indicator was observed. |
| Flashpoint.Url.Event.Category | string | The category of the indicator. |
| Flashpoint.Url.Event.Fpid | string | The Flashpoint ID of the indicator. |
| Flashpoint.Url.Event.Timestamp | string | The time and date that the indicator was observed. |
| Flashpoint.Url.Event.Type | string | The indicator type. |
| Flashpoint.Url.Event.Uuid | string | The UUID of the indicator. |
| Flashpoint.Url.Event.Comment | string | The comment that was provided when the indicator was observed. |
| URL.Malicious.Description | string | The description of the malicious indicator. |
| URL.Malicious.Vendor | string | Vendor of malicious url. |
| URL.Data | string | The URL |
| URL.Relationships.EntityA | string | The source of the relationship. |
| URL.Relationships.EntityB | string | The destination of the relationship. |
| URL.Relationships.Relationship | string | The name of the relationship. |
| URL.Relationships.EntityAType | string | The type of the source of the relationship. |
| URL.Relationships.EntityBType | string | The type of the destination of the relationship. |
Command Example
!url url="92.63.197.153/krabaldento.exe"
Context Example
{
"DBotScore": {
"Indicator": "92.63.197.153/krabaldento.exe",
"Score": 3,
"Type": "url",
"Vendor": "Flashpoint"
},
"Flashpoint.URL.Event": [
{
"Category": "Network activity",
"Comment": "Network Indicators",
"EventDetails": {
"RelatedEvent": null,
"Tags": [
"malware:ransomware:GandCrab",
"report:lKyimEX1TWS8x6AtdiJ_vA",
"report:7t-BsuFKTL-HJWbid8nupg"
],
"attack_ids": null,
"fpid": "tg9pLoOcXzmo36by0whRIA",
"href": "https://fp.tools/api/v4/indicators/event/tg9pLoOcXzmo36by0whRIA",
"info": "GandCrab 2019",
"reports": [
"https://fp.tools/home/intelligence/reports/report/lKyimEX1TWS8x6AtdiJ_vA",
"https://fp.tools/home/intelligence/reports/report/7t-BsuFKTL-HJWbid8nupg"
],
"timestamp": "1571934622"
},
"Fpid": "XEAP2wmHVqaHERj7E23gTg",
"Href": "https://fp.tools/api/v4/indicators/attribute/XEAP2wmHVqaHERj7E23gTg",
"Timestamp": "1551736985",
"Type": "url",
"Url": "92.63.197.153/krabaldento.exe",
"Uuid": "5c7da099-fe38-4cc5-a2f5-11200a640c05"
}
],
"URL": {
"Malicious": {
"Description": "Found in malicious indicators dataset",
"Vendor": "Flashpoint"
},
"Name": "92.63.197.153/krabaldento.exe"
}
}
Human Readable Output
Flashpoint URL reputation for 92.63.197.153/krabaldento.exe
Reputation: Malicious
Events in which this IOC observed
| Date Observed (UTC) | Name | Tags |
|---|---|---|
| Oct 24, 2019 16:30 | GandCrab 2019 | malware:ransomware:GandCrab, report:lKyimEX1TWS8x6AtdiJ_vA, report:7t-BsuFKTL-HJWbid8nupg |
All events and details (fp-tools):
https://fp.tools/home/search/iocs?group=indicator&ioc_type=url&ioc_value=92.63.197.153/krabaldento.exe
file
Lookup the “File” type indicator details. The reputation of File-hash is considered Malicious if there’s at least one IOC event in Flashpoint database matching the File-hash indicator.
Base Command
file
Input
| Argument Name | Description | Required |
|---|---|---|
| file | A list of hashes of the file to query. Supports MD5, SHA1 and SHA256. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| DBotScore.Indicator | string | The indicator that was tested. |
| DBotScore.Score | number | The actual score. |
| DBotScore.Type | string | The indicator type. |
| DBotScore.Vendor | string | The vendor used to calculate the score. |
| Flashpoint.File.Event.Href | string | A list of reference links of the indicator. |
| Flashpoint.File.Event.MD5 | string | MD5 file hash of the indicator |
| Flashpoint.File.Event.SHA1 | string | SHA1 file hash of the indicator |
| Flashpoint.File.Event.SHA256 | string | SHA256 file hash of the indicator |
| Flashpoint.File.Event.EventDetails | string | The event details in which the indicator was observed. |
| Flashpoint.File.Event.Category | string | The category of the indicator. |
| Flashpoint.File.Event.Fpid | string | The Flashpoint ID of the indicator. |
| Flashpoint.File.Event.Timestamp | string | The time and date that the indicator was observed. |
| Flashpoint.File.Event.Type | string | The indicator type. |
| Flashpoint.File.Event.Uuid | string | The UUID of the indicator. |
| Flashpoint.File.Event.Comment | string | The comment that was provided when the indicator was observed. |
| File.Malicious.Description | string | The description of the malicious indicator. |
| File.Malicious.Vendor | string | Vendor of malicious file. |
| File.MD5 | string | MD5 type file. |
| File.SHA1 | string | SHA1 type file. |
| File.SHA256 | string | SHA256 type file. |
| File.Relationships.EntityA | string | The source of the relationship. |
| File.Relationships.EntityB | string | The destination of the relationship. |
| File.Relationships.Relationship | string | The name of the relationship. |
| File.Relationships.EntityAType | string | The type of the source of the relationship. |
| File.Relationships.EntityBType | string | The type of the destination of the relationship. |
Command Example
!file file="ab09761ad832efb9359fac985d1a2ab74f8a8d182d7b71188a121b850b80dfe5"
Context Example
{
"DBotScore": {
"Indicator": "ab09761ad832efb9359fac985d1a2ab74f8a8d182d7b71188a121b850b80dfe5",
"Score": 3,
"Type": "SHA256",
"Vendor": "Flashpoint"
},
"File": {
"Malicious": {
"Description": "Found in malicious indicators dataset",
"Vendor": "Flashpoint"
},
"SHA256": "ab09761ad832efb9359fac985d1a2ab74f8a8d182d7b71188a121b850b80dfe5"
},
"Flashpoint.File.Event": [
{
"Category": "Payload delivery",
"Comment": "",
"EventDetails": {
"RelatedEvent": [
{
"Event": {
"fpid": "DHDkx7UaWX6bYoBo2dqxlA",
"info": "win_ransomware_generic"
}
}
],
"Tags": [
"source:VirusTotal",
"type:Ransomware",
"gandcrab",
"malware:GandCrab",
"os:Windows"
],
"attack_ids": null,
"fpid": "Lc3dCH1sXbOIYkKTyUQoow",
"href": "https://fp.tools/api/v4/indicators/event/Lc3dCH1sXbOIYkKTyUQoow",
"info": "Gandcrab",
"reports": null,
"timestamp": "1576735275"
},
"Fpid": "rqIX70QLVlC3aAydF8uECQ",
"Href": "https://fp.tools/api/v4/indicators/attribute/rqIX70QLVlC3aAydF8uECQ",
"SHA256": "ab09761ad832efb9359fac985d1a2ab74f8a8d182d7b71188a121b850b80dfe5",
"Timestamp": "1560826915",
"Type": "sha256",
"Uuid": "f161c532-26fa-422d-ad71-3781b6619894"
},
{
"Category": "Payload delivery",
"Comment": "",
"EventDetails": {
"RelatedEvent": [
{
"Event": {
"fpid": "6tTJ5r_nUoW5FGlEtGl_Yg",
"info": "crime_azorult_2"
}
},
{
"Event": {
"fpid": "4VTU1zY3V5qO0W7HvEgeig",
"info": "crime_azorult_1"
}
},
{
"Event": {
"fpid": "Lc3dCH1sXbOIYkKTyUQoow",
"info": "Gandcrab"
}
}
],
"Tags": [
"source:VirusTotal",
"type:Ransomware",
"win_ransomware_generic",
"os:Windows"
],
"attack_ids": null,
"fpid": "DHDkx7UaWX6bYoBo2dqxlA",
"href": "https://fp.tools/api/v4/indicators/event/DHDkx7UaWX6bYoBo2dqxlA",
"info": "win_ransomware_generic",
"reports": null,
"timestamp": "1563386535"
},
"Fpid": "9oi7LdmmWGuh1AG4fKv13g",
"Href": "https://fp.tools/api/v4/indicators/attribute/9oi7LdmmWGuh1AG4fKv13g",
"SHA256": "ab09761ad832efb9359fac985d1a2ab74f8a8d182d7b71188a121b850b80dfe5",
"Timestamp": "1560826913",
"Type": "sha256",
"Uuid": "08f5ac60-45cb-4bc1-be05-591eb51071dc"
}
]
}
Human Readable Output
Flashpoint File reputation for ab09761ad832efb9359fac985d1a2ab74f8a8d182d7b71188a121b850b80dfe5
Reputation: Malicious
Events in which this IOC observed
| Date Observed (UTC) | Name | Tags |
|---|---|---|
| Dec 19, 2019 06:01 | Gandcrab | source:VirusTotal, type:Ransomware, gandcrab, malware:GandCrab, os:Windows |
| Jul 17, 2019 18:02 | win_ransomware_generic | source:VirusTotal, type:Ransomware, win_ransomware_generic, os:Windows |
All events and details (fp-tools):
https://fp.tools/home/search/iocs?group=indicator&ioc_type=md5%2Csha1%2Csha256%2Csha512&ioc_value=ab09761ad832efb9359fac985d1a2ab74f8a8d182d7b71188a121b850b80dfe5
Lookup the “Email” type indicator details. The reputation of Email is considered Malicious if there’s at least one IOC event in Flashpoint database matching the Email indicator.
Base Command
email
Input
| Argument Name | Description | Required |
|---|---|---|
| The email to check. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| DBotScore.Indicator | string | The indicator that was tested. |
| DBotScore.Score | number | The actual score. |
| DBotScore.Type | string | The indicator type. |
| DBotScore.Vendor | string | The vendor used to calculate the score. |
| Flashpoint.Email.Event.Href | string | A list of reference links of the indicator. |
| Flashpoint.Email.Event.EventDetails | string | The event details in which the indicator was observed. |
| Flashpoint.Email.Event.Category | string | The category of the indicator. |
| Flashpoint.Email.Event.Fpid | string | The Flashpoint ID of the indicator. |
| Flashpoint.Email.Event.Timestamp | string | The time and date that the indicator was observed. |
| Flashpoint.Email.Event.Type | string | The indicator type. |
| Flashpoint.Email.Event.Uuid | string | The UUID of the indicator. |
| Flashpoint.Email.Event.Comment | string | The comment that was provided when the indicator was observed. |
| Account.Email.Malicious.Description | string | The description of the malicious indicator. |
| Account.Email.Malicious.Vendor | string | Vendor of Malicious email. |
| Account.Email.Name | string | Name of indicator. |
Command Example
!email email="qicifomuejijika@o2.pl"
Context Example
{
"Account.Email": {
"Malicious": {
"Description": "Found in malicious indicators dataset",
"Vendor": "Flashpoint"
},
"Name": "qicifomuejijika@o2.pl"
},
"DBotScore": {
"Indicator": "qicifomuejijika@o2.pl",
"Score": 3,
"Type": "email",
"Vendor": "Flashpoint"
},
"Flashpoint.Email.Event": [
{
"Category": "Network activity",
"Comment": "",
"EventDetails": {
"RelatedEvent": null,
"Tags": [
"malware:ransomware:lockergoga",
"report:lKyimEX1TWS8x6AtdiJ_vA",
"report:jEteM4YxQZCdm4macbE3vQ",
"report:w0fL5MgoQ_Wih8XyB6Lowg",
"report:7t-BsuFKTL-HJWbid8nupg"
],
"attack_ids": null,
"fpid": "iBUPRQOoU4SQrH64LGUbzw",
"href": "https://fp.tools/api/v4/indicators/event/iBUPRQOoU4SQrH64LGUbzw",
"info": "LockerGoga",
"reports": [
"https://fp.tools/home/intelligence/reports/report/lKyimEX1TWS8x6AtdiJ_vA",
"https://fp.tools/home/intelligence/reports/report/jEteM4YxQZCdm4macbE3vQ",
"https://fp.tools/home/intelligence/reports/report/w0fL5MgoQ_Wih8XyB6Lowg",
"https://fp.tools/home/intelligence/reports/report/7t-BsuFKTL-HJWbid8nupg"
],
"timestamp": "1571934618"
},
"Fpid": "TrwIYc5AWP-xtjODCXyp7w",
"Href": "https://fp.tools/api/v4/indicators/attribute/TrwIYc5AWP-xtjODCXyp7w",
"Timestamp": "1553280098",
"Type": "email-dst",
"Uuid": "5c952c62-ef38-4fcc-8b6e-0f140a640c05"
}
]
}
Human Readable Output
Flashpoint Email reputation for qicifomuejijika@o2.pl
Reputation: Malicious
Events in which this IOC observed
| Date Observed (UTC) | Name | Tags |
|---|---|---|
| Oct 24, 2019 16:30 | LockerGoga | malware:ransomware:lockergoga, report:lKyimEX1TWS8x6AtdiJ_vA, report:jEteM4YxQZCdm4macbE3vQ, report:w0fL5MgoQ_Wih8XyB6Lowg, report:7t-BsuFKTL-HJWbid8nupg |
All events and details (fp-tools):
https://fp.tools/home/search/iocs?group=indicator&ioc_type=email-dst%2Cemail-src%2Cemail-src-display-name%2Cemail-subject&ioc_value=qicifomuejijika%40o2.pl
flashpoint-search-intelligence-reports
Search for the Intelligence Reports using a keyword
Base Command
flashpoint-search-intelligence-reports
Input
| Argument Name | Description | Required |
|---|---|---|
| report_search | Search report using keyword or text. | Required |
Context Output
| Path | Type | Description |
|---|---|---|
| Flashpoint.Report | unknown | List of reports based on specified search query or keyword |
Command Example
!flashpoint-search-intelligence-reports report_search="isis"
Context Example
{
"Flashpoint.Report": [
{
"NotifiedAt": "2019-12-13T19:17:32.520+00:00",
"PlatformUrl": "https://fp.tools/home/intelligence/reports/report/urDeGGjbTwWOSDikhp9YDw#detail",
"PostedAt": "2019-12-13T19:17:32.520+00:00",
"ReportId": "urDeGGjbTwWOSDikhp9YDw",
"Summary": "On December 5, 2019, the al-Qaeda affiliated Global Islamic Media Front (GIMF) announced the launch of its server on the messaging platform RocketChat. The announcement follows the purge of jihadists from multiple social media and communication platforms, most notably Telegram.",
"Title": "Al-Qaeda Affiliated Unit Launches Private RocketChat Server",
"UpdatedAt": "2019-12-13T19:17:32.520+00:00"
},
{
"NotifiedAt": null,
"PlatformUrl": "https://fp.tools/home/intelligence/reports/report/WFhcFuASR3CbxbC6IzuKBA#detail",
"PostedAt": "2019-12-13T18:28:05.858+00:00",
"ReportId": "WFhcFuASR3CbxbC6IzuKBA",
"Summary": "WEEK OF DECEMBER 9 KEY DEVELOPMENTS ",
"Title": "Iran Global Spotlight (Analyst Knowledge Page)",
"UpdatedAt": "2019-12-13T18:28:05.858+00:00"
},
{
"NotifiedAt": "2019-12-02T21:13:08.271+00:00",
"PlatformUrl": "https://fp.tools/home/intelligence/reports/report/og0aVCYmSeS-mpSXOF21Rg#detail",
"PostedAt": "2019-12-02T21:13:08.271+00:00",
"ReportId": "og0aVCYmSeS-mpSXOF21Rg",
"Summary": "Despite Telegram?s aggressive and sustained targeting of jihadists on its platform, ISIS?s official media and supportive groups are beginning to rebuild on Telegram.",
"Title": "ISIS Media Rebuilds Following Sweeping Suspensions",
"UpdatedAt": "2019-12-02T21:13:08.271+00:00"
},
{
"NotifiedAt": "2019-11-25T21:21:41.647+00:00",
"PlatformUrl": "https://fp.tools/home/intelligence/reports/report/Kd1HMXJQRYmKDmECAmsPMA#detail",
"PostedAt": "2019-11-25T21:21:41.647+00:00",
"ReportId": "Kd1HMXJQRYmKDmECAmsPMA",
"Summary": "Between November 22 and 24, 2019, Telegram removed more than 7,000 jihadist channnels and bots from its platform?in the largest purge of ISIS propaganda in Telegram?s history. The takedown drastically impacted ISIS propaganda dissemination, knocking out critical channels and groups, many of which had operated uninterrupted for years.",
"Title": "Telegram Targets ISIS Propaganda in Largest Platform Purge",
"UpdatedAt": "2019-11-25T21:21:41.647+00:00"
},
{
"NotifiedAt": "2019-11-22T19:24:21.634+00:00",
"PlatformUrl": "https://fp.tools/home/intelligence/reports/report/mwpd9Dn7SuO_K7KLPzfJeA#detail",
"PostedAt": "2019-11-22T19:24:21.634+00:00",
"ReportId": "mwpd9Dn7SuO_K7KLPzfJeA",
"Summary": "",
"Title": "Global Spotlight - Iran: Key Developments This Week",
"UpdatedAt": "2019-11-22T19:24:21.634+00:00"
}
]
}
Human Readable Output
Flashpoint Intelligence reports related to search: isis
Top 5 reports:
-
ISIS Media Rebuilds Following Sweeping Suspensions
Summary: Despite Telegram?s aggressive and sustained targeting of
jihadists on its platform, ISIS?s official media and supportive groups
are beginning to rebuild on Telegram. -
Telegram Targets ISIS Propaganda in Largest Platform Purge
Summary: Between November 22 and 24, 2019, Telegram removed more than
7,000 jihadist channnels and bots from its platform?in the largest purge
of ISIS propaganda in Telegram?s history. The takedown drastically
impacted ISIS propaganda dissemination, knocking out critical channels
and groups, many of which had operated uninterrupted for years. -
Global Spotlight - Iran: Key Developments ThisWeek
Summary: N/A -
Dropbox Account Disseminates Far-Right Extremist Content
Summary: Flashpoint analysts have identified a Dropbox account called
?NS Library? belonging to a far-right extremist containing over 200
white supremacist publications and guides?including neo-Nazi literature
and propaganda, instruction manuals for making homemade weapons,
survival guides, attackers? manifestos, and workout manuals, among other
content. -
ISIS Activity Continues Unabated Following al-Baghdadi’s Death
Summary: On October 26, 2019, ISIS?s former leader Abu Bakr al-Baghdadi
killed himself in the midst of a US military operation. Less than a week
later, ISIS confirmed al-Baghdadi?s death, and announced that Abu
Ibrahim al-Hashimi al-Qurashi is the group?s new leader. Link to
Report-search on Flashpoint platform:
https://fp.tools/home/search/reports?query=isis
flashpoint-get-single-intelligence-report
Get single report details using the report id. The report id can be known from output context path (Flashpoint.Report.ReportId) of report-search command or some other investigation.
Base Command
flashpoint-get-single-intelligence-report
Input
| Argument Name | Description | Required |
|---|---|---|
| report_id | The report id of the report for which the details are to be fetched. The report id can be known from output context path (Flashpoint.Report.ReportId) of report-search command or some other investigation. | Required |
Context Output
| Path | Type | Description |
|---|---|---|
| Flashpoint.Report.NotifiedAt | string | Notify date of report. |
| Flashpoint.Report.PlatformUrl | string | Platform url of report. It helps to redirect flashpoint platform. |
| Flashpoint.Report.PostedAt | number | posted date of report. |
| Flashpoint.Report.Summary | string | Summary of report. |
| Flashpoint.Report.Title | string | Title of the report. |
| Flashpoint.Report.UpdatedAt | string | Last updated date of report. |
| Flashpoint.Report.ReportId | string | Unique id of the report. |
Command Example
!flashpoint-get-single-intelligence-report report_id="e-QdYuuwRwCntzRljzn9-A"
Context Example
{
"Flashpoint.Report": {
"NotifiedAt": "2019-09-23T20:27:20.638+00:00",
"PlatformUrl": "https://fp.tools/home/intelligence/reports/report/e-QdYuuwRwCntzRljzn9-A#detail",
"PostedAt": "2019-09-23T20:27:20.638+00:00",
"ReportId": "e-QdYuuwRwCntzRljzn9-A",
"Summary": "On September 17, 2019, multiple pro-ISIS Telegram groups disseminated a message warning of the dangers of exposed exif data?a type of metadata showing GPS coordinates, time, and date the image was taken and the make and model of the device used?that is typically captured from images taken by a phone or camera, unless the security settings are properly configured.",
"Title": "ISIS Supporters Warn of the Risks Associated with Exif Data",
"UpdatedAt": "2019-09-23T20:27:20.638+00:00"
}
}
Human Readable Output
Flashpoint Intelligence Report details
Below are the details found
| Title | Date Published (UTC) | Summary | Tags |
|---|---|---|---|
| ISIS Supporters Warn of the Risks Associated with Exif Data | Sep 23, 2019 20:27 | On September 17, 2019, multiple pro-ISIS Telegram groups disseminated a message warning of the dangers of exposed exif data?a type of metadata showing GPS coordinates, time, and date the image was taken and the make and model of the device used?that is typically captured from images taken by a phone or camera, unless the security settings are properly configured. | Intelligence Report, Law Enforcement & Military, Physical Threats, Jihadist, Propaganda, Terrorism, Global |
flashpoint-get-related-reports
Get related reports for a particular report using the report-id. The report id can be known from output context path (Flashpoint.Report.ReportId) of report-search command or some other investigation.
Base Command
flashpoint-get-related-reports
Input
| Argument Name | Description | Required |
|---|---|---|
| report_id | The report-id of the report of which the related reports are to be fetched. The report id can be known from output context path (Flashpoint.Report.ReportId) of report-search command or some other investigation. | Required |
Context Output
| Path | Type | Description |
|---|---|---|
| Flashpoint.Report | unknown | Display list of related report based on report fpid. |
Command Example
!flashpoint-get-related-reports report_id="tiPqg51OQpOTsoFyTaYa_w"
Context Example
{
"Flashpoint.Report": [
{
"NotifiedAt": "2019-10-02T19:31:41.625+00:00",
"PlatformUrl": "https://fp.tools/home/intelligence/reports/report/X6YSFdWWQ3yDa9_0r627sg#detail",
"PostedAt": "2019-10-02T19:31:41.625+00:00",
"ReportId": "X6YSFdWWQ3yDa9_0r627sg",
"Summary": "On September 30, 2019, the admin of ?The_Bowlcast? Telegram channel promoted the launch of the militant, white supremacist group ?Atomwaffen Division?s? (AWD) latest website and new video dubbed ?Nuclear Congress 2019,? which subtlely discusses the need for AWD to accomplish its goals?alluding to the need for new financing and recruitment.",
"Title": "Atomwaffen Division Resumes Recruitment Activity",
"UpdatedAt": "2019-10-02T19:31:41.625+00:00"
},
{
"NotifiedAt": "2019-09-26T19:52:21.089+00:00",
"PlatformUrl": "https://fp.tools/home/intelligence/reports/report/iQRHJvzySma6-aHNE973mA#detail",
"PostedAt": "2019-09-26T19:52:21.089+00:00",
"ReportId": "iQRHJvzySma6-aHNE973mA",
"Summary": "On June 14, 2019, a militant white supremacy group called ?Vorherrschaft Division? (VSD) announced its creation in its Telegram channel \"Vorherrschaft division propaganda posting.\"",
"Title": "\"Vorherrschaft Division\" (VSD): A Nascent Militant White Supremacy Group",
"UpdatedAt": "2019-09-26T19:52:21.089+00:00"
},
{
"NotifiedAt": "2019-11-04T21:14:28.506+00:00",
"PlatformUrl": "https://fp.tools/home/intelligence/reports/report/90paj4gCSBG8FT8R_SCtgQ#detail",
"PostedAt": "2019-11-04T21:14:28.506+00:00",
"ReportId": "90paj4gCSBG8FT8R_SCtgQ",
"Summary": "In August 2019, militant white supremacist channel ?Stack the Bodies to God? appeared on Telegram, inciting violence and providing a large quantity of informational resources?including extremist publications, tactical manuals, survival guides, guerrilla warfare tactics, instructions for making homemade explosives, weapons, and ricin, and internet security tips.",
"Title": "Neo-Nazi Telegram Channel Incites Violence, Spreads Extremist Content",
"UpdatedAt": "2019-11-04T21:14:28.506+00:00"
},
{
"NotifiedAt": "2019-11-25T19:12:47.634+00:00",
"PlatformUrl": "https://fp.tools/home/intelligence/reports/report/pQBUFAlfSce-xQd7Ignmyg#detail",
"PostedAt": "2019-11-25T19:12:47.634+00:00",
"ReportId": "pQBUFAlfSce-xQd7Ignmyg",
"Summary": "Members of the far-right community are preparing for what they call ?meme war 2020??content spread via social media focused on left-leaning targets?in the lead up to the 2020 U.S. presidential election. ",
"Title": "Far-Right Prepares for \"Meme War 2020\"",
"UpdatedAt": "2019-11-25T19:12:47.634+00:00"
},
{
"NotifiedAt": "2019-10-23T18:47:40.810+00:00",
"PlatformUrl": "https://fp.tools/home/intelligence/reports/report/iEOIjuPjREmCIJR7Krbpnw#detail",
"PostedAt": "2019-10-23T18:47:40.810+00:00",
"ReportId": "iEOIjuPjREmCIJR7Krbpnw",
"Summary": "The term ?boogaloo? (also known as ?the boogaloo? and ?big igloo?) is the latest term used by accelerationists?advocates of hastening the collapse of society through violence?to describe an armed revolution against society to rebuild a white-ethno state.",
"Title": "\"Boogaloo\": Accelerationists' Latest Call to Action",
"UpdatedAt": "2019-10-23T18:47:40.810+00:00"
}
]
}
Human Readable Output
Flashpoint Intelligence related reports
Top 5 related reports:
-
Neo-Nazi Telegram Channel Incites Violence, Spreads Extremist Content
Summary: In August 2019, militant white supremacist channel ?Stack the
Bodies to God? appeared on Telegram, inciting violence and providing a
large quantity of informational resources?including extremist
publications, tactical manuals, survival guides, guerrilla warfare
tactics, instructions for making homemade explosives, weapons, and
ricin, and internet security tips. -
Atomwaffen Division Resumes Recruitment Activity
Summary: On September 30, 2019, the admin of ?The_Bowlcast? Telegram
channel promoted the launch of the militant, white supremacist group
?Atomwaffen Division?s? (AWD) latest website and new video dubbed
?Nuclear Congress 2019,? which subtlely discusses the need for AWD to
accomplish its goals?alluding to the need for new financing and
recruitment. -
“Vorherrschaft Division” (VSD): A Nascent Militant White Supremacy Group
Summary: On June 14, 2019, a militant white supremacy group called
?Vorherrschaft Division? (VSD) announced its creation in its Telegram
channel “Vorherrschaft division propaganda posting.” -
“Boogaloo”: Accelerationists’ Latest Call to Action
Summary: The term ?boogaloo? (also known as ?the boogaloo? and ?big
igloo?) is the latest term used by accelerationists?advocates of
hastening the collapse of society through violence?to describe an armed
revolution against society to rebuild a white-ethno state. -
Far-Right Prepares for “Meme War 2020”
Summary: Members of the far-right community are preparing for what they
call ?meme war 2020??content spread via social media focused on
left-leaning targets?in the lead up to the 2020 U.S. presidential
election. Link to the given Report on Flashpoint platform:
https://fp.tools/home/intelligence/reports/report/tiPqg51OQpOTsoFyTaYa_w#detail
flashpoint-get-single-event
Retrieves the details of a single event using event UUID or FPID. To retrieve the event id, run the get-events command and see the value under the Flashpoint.Event.EventId context path. or indicator reputation command response or some other investigation.
Base Command
flashpoint-get-single-event
Input
| Argument Name | Description | Required |
|---|---|---|
| event_id | The UUID or FPID that identifies a particular event. The event id can be fetched from output context path (Flashpoint.Event.EventId) get-events command or indicator reputation command response or some other investigation. | Required |
Context Output
| Path | Type | Description |
|---|---|---|
| Flashpoint.Event.ObservedTime | string | The date that the event was triggered. |
| Flashpoint.Event.EventCreatorEmail | string | The email address of the event creator. |
| Flashpoint.Event.Href | string | The display event reference. |
| Flashpoint.Event.MalwareDescription | string | The description of the malware. |
| Flashpoint.Event.Tags | unknown | The display event tags. |
| Flashpoint.Event.EventId | string | The display event ID (event fpid). |
| Flashpoint.Event.Name | string | The name of the event. |
Command Example
!flashpoint-get-single-event event_id=Hu2SoTWJWteLrH9mR94JbQ
Context Example
{
"Flashpoint.Event": {
"EventCreatorEmail": "info@flashpoint-intel.com",
"EventId": "Hu2SoTWJWteLrH9mR94JbQ",
"Href": "https://fp.tools/api/v4/indicators/event/Hu2SoTWJWteLrH9mR94JbQ",
"MalwareDescription" : "<p>\"Quasar\" is a publicly available, open-source remote access trojan (RAT) for Microsoft Windows operating systems written in the C# programming language. Quasar is authored by GitHub user "MaxXor" and publicly hosted as a GitHub repository. The functionality of the Quasar malware includes remote file management on the infected machine, registry alterations, recording the actions of the victim, and establishing remote desktop connections.</p>"
"Name": "[CryptingService_4c0d570ecdf23529c91b8decf27107db5c5e9430_2019-06-17T03:01:03.000Z](https://fp.tools/home/technical_data/iocs/items/5d0960cc-6128-4416-9996-05d20a640c05)",
"ObservedTime": "Jun 18, 2019 22:08",
"Tags": "source:CryptingService2"
}
}
Human Readable Output
Flashpoint Event details
Below are the detail found
| Observed time (UTC) | Name | Tags | Malware Description |
|---|---|---|---|
| Jun 18, 2019 22:08 | CryptingService_4c0d570ecdf23529c91b8decf27107db5c5e9430_2019-06-17T03:01:03.000Z | source:CryptingService2 | <p>"Quasar" is a publicly available, open-source remote access trojan (RAT) for Microsoft Windows operating systems written in the C# programming language. Quasar is authored by GitHub user “MaxXor” and publicly hosted as a GitHub repository. The functionality of the Quasar malware includes remote file management on the infected machine, registry alterations, recording the actions of the victim, and establishing remote desktop connections.</p> |
flashpoint-get-events
Searches for events within the specified time-period, the report fpid, or attack IDs.
Base Command
flashpoint-get-events
Input
| Argument Name | Description | Required |
|---|---|---|
| time_period | The time period for the search. | Optional |
| report_fpid | The report fpid. To retrieve the report fpid, run the related-reports command. | Optional |
| limit | Specify the limit on the no. of record. Default is 10. | Optional |
| attack_ids | A comma-separated list of attack IDs for which to search. Attack IDs can be found in event information or on the Flashpoint platform by filtering events by attack IDs. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| Flashpoint.Event | unknown | A list of multiple events. |
Command Example
!flashpoint-get-events limit=20
Context Example
{
"Flashpoint.Event": [
{
"EventCreatorEmail": "info@flashpoint-intel.com",
"EventId": "nx7tsJYKWKm259vMLduWGw",
"Href": "https://fp.tools/api/v4/indicators/event/nx7tsJYKWKm259vMLduWGw",
"Malware Description": "dummy_malware_description1",
"Name": "[Loki](https://fp.tools/home/technical_data/iocs/items/5d087e04-1464-4a26-964e-05cd0a640c05)",
"ObservedTime": "Dec 18, 2019 12:00",
"Tags": "source:VirusTotal, type:Stealer, malware:Loki, loki, os:Windows"
},
{
"EventCreatorEmail": "info@flashpoint-intel.com",
"EventId": "yV-3FFFwXWW3xxB6IMnP0g",
"Href": "https://fp.tools/api/v4/indicators/event/yV-3FFFwXWW3xxB6IMnP0g",
"Malware Description": "dummy_malware_description2",
"Name": "[NetWire](https://fp.tools/home/technical_data/iocs/items/5d58176a-6020-418a-b5aa-05d20a640c05)",
"ObservedTime": "Dec 18, 2019 12:00",
"Tags": "source:VirusTotal, T1060, netwire, T1056, os:Windows, type:RAT, malware:NetWire, T1082, T1116, T1113, misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Registry Run Keys / Start Folder - T1060\", misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Input Capture - T1056\", misp-galaxy:mitre-enterprise-attack-attack-pattern=\"System Information Discovery - T1082\", misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Code Signing - T1116\", misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Screen Capture - T1113\""
},
{
"EventCreatorEmail": "info@flashpoint-intel.com",
"EventId": "PSP0k-dFUiWbX9YWV9pMag",
"Href": "https://fp.tools/api/v4/indicators/event/PSP0k-dFUiWbX9YWV9pMag",
"Malware Description": "dummy_malware_description3",
"Name": "[unpacked_cutwailv4](https://fp.tools/home/technical_data/iocs/items/5dfa14da-d190-48ab-80b6-23fe0a212040)",
"ObservedTime": "Dec 18, 2019 12:00",
"Tags": "source:VirusTotal, v:4, os:Windows, T1204, unpacked_cutwailv4, malware:Cutwail, T1060, type:Botnet"
},
{
"EventCreatorEmail": "info@flashpoint-intel.com",
"EventId": "hirKFHGUVAySCvUzchchgA",
"Href": "https://fp.tools/api/v4/indicators/event/hirKFHGUVAySCvUzchchgA",
"Malware Description": "dummy_malware_description4",
"Name": "[CyberGate](https://fp.tools/home/technical_data/iocs/items/5d07d55f-e9f8-4530-b57c-05cd0a640c05)",
"ObservedTime": "Dec 18, 2019 12:00",
"Tags": "source:VirusTotal, os:Windows, type:RAT, cybergate, malware:CyberGate"
},
{
"EventCreatorEmail": "info@flashpoint-intel.com",
"EventId": "E1EnVbazXKOoV6eIMwz68A",
"Href": "https://fp.tools/api/v4/indicators/event/E1EnVbazXKOoV6eIMwz68A",
"Malware Description": "dummy_malware_description5",
"Name": "[UNKN actor profile (distributor of Revil Ransomware)](https://fp.tools/home/technical_data/iocs/items/5dfa10af-7470-4ac5-af4e-dc260a21270c)",
"ObservedTime": "Dec 18, 2019 11:51",
"Tags": "malware:ransomware, ransomware:Revil, actor:UNKN, origin:Russia"
},
{
"EventCreatorEmail": "info@flashpoint-intel.com",
"EventId": "F8igomEDVVOG2bWhNcfBaQ",
"Href": "https://fp.tools/api/v4/indicators/event/F8igomEDVVOG2bWhNcfBaQ",
"Malware Description": "dummy_malware_description6",
"Name": "[win_snatch_loader_g2](https://fp.tools/home/technical_data/iocs/items/5db9a5f0-01a8-4f2b-867c-0a340a640c05)",
"ObservedTime": "Dec 18, 2019 11:00",
"Tags": "source:VirusTotal, win_snatch_loader_g2, malware:SnatchLoader, os:Windows, type:Downloader"
},
{
"EventCreatorEmail": "info@flashpoint-intel.com",
"EventId": "vjqRiYHvWnWBweTqiqNTBQ",
"Href": "https://fp.tools/api/v4/indicators/event/vjqRiYHvWnWBweTqiqNTBQ",
"Malware Description": "dummy_malware_description7",
"Name": "[Sofacy_CollectorStealer_Gen2](https://fp.tools/home/technical_data/iocs/items/5de6be25-b70c-4077-9f8a-00bd0a2120d6)",
"ObservedTime": "Dec 18, 2019 11:00",
"Tags": "source:VirusTotal, actor:APT28, sofacy_collectorstealer_gen2, origin:Russia, type:Stealer"
},
{
"EventCreatorEmail": "info@flashpoint-intel.com",
"EventId": "78hNTAcJWWezTL9t8WuUtg",
"Href": "https://fp.tools/api/v4/indicators/event/78hNTAcJWWezTL9t8WuUtg",
"Malware Description": "dummy_malware_description8",
"Name": "[crime_tinynuke_1](https://fp.tools/home/technical_data/iocs/items/5d0950fb-faa4-42f6-a116-05d00a640c05)",
"ObservedTime": "Dec 18, 2019 10:00",
"Tags": "source:VirusTotal, crime_tinynuke_1"
},
{
"EventCreatorEmail": "info@flashpoint-intel.com",
"EventId": "_0VfrtauWN6VpZ5d2QFiUA",
"Href": "https://fp.tools/api/v4/indicators/event/_0VfrtauWN6VpZ5d2QFiUA",
"Malware Description": "dummy_malware_description9",
"Name": "[win_tinba_g1](https://fp.tools/home/technical_data/iocs/items/5df9f8be-e188-4516-80f9-03030a21270c)",
"ObservedTime": "Dec 18, 2019 10:00",
"Tags": "source:VirusTotal, type:Banker, malware:tinba, win_tinba_g1, os:Windows, target: Russia, target:Japan"
},
{
"EventCreatorEmail": "info@flashpoint-intel.com",
"EventId": "Ajj-czMuVhO6MLsIYpcdUg",
"Href": "https://fp.tools/api/v4/indicators/event/Ajj-czMuVhO6MLsIYpcdUg",
"Malware Description": "dummy_malware_description10",
"Name": "[win_tinba_g0](https://fp.tools/home/technical_data/iocs/items/5d70500d-e88c-40ee-ae95-05cd0a640c05)",
"ObservedTime": "Dec 18, 2019 10:00",
"Tags": "source:VirusTotal, type:Banker, win_tinba_g0, target: Russia, malware:tinba, target:Japan, os:Windows"
},
{
"EventCreatorEmail": "info@flashpoint-intel.com",
"EventId": "f97cPO5dVqO74ttWZwbFqQ",
"Href": "https://fp.tools/api/v4/indicators/event/f97cPO5dVqO74ttWZwbFqQ",
"Malware Description": "dummy_malware_description11",
"Name": "[MegaCortex_Load_Dinkum_CLib](https://fp.tools/home/technical_data/iocs/items/5da01a84-b3fc-4eef-961d-0a340a640c05)",
"ObservedTime": "Dec 18, 2019 07:03",
"Tags": "source:VirusTotal, megacortex_load_dinkum_clib, malware:MegaCortex, type:Ransomware, os:Windows"
},
{
"EventCreatorEmail": "info@flashpoint-intel.com",
"EventId": "Y_0iIuFFXU-wuNBCs0kF_g",
"Href": "https://fp.tools/api/v4/indicators/event/Y_0iIuFFXU-wuNBCs0kF_g",
"Malware Description": "dummy_malware_description12",
"Name": "[Command_Line_Options](https://fp.tools/home/technical_data/iocs/items/5da01a75-0f20-41da-83e1-56550a640c05)",
"ObservedTime": "Dec 18, 2019 07:03",
"Tags": "source:VirusTotal, command_line_options"
},
{
"EventCreatorEmail": "info@flashpoint-intel.com",
"EventId": "Lc3dCH1sXbOIYkKTyUQoow",
"Href": "https://fp.tools/api/v4/indicators/event/Lc3dCH1sXbOIYkKTyUQoow",
"Malware Description": "dummy_malware_description13",
"Name": "[Gandcrab](https://fp.tools/home/technical_data/iocs/items/5d07d587-a9ac-4da1-9c72-05cd0a640c05)",
"ObservedTime": "Dec 18, 2019 07:03",
"Tags": "source:VirusTotal, type:Ransomware, gandcrab, malware:GandCrab, os:Windows"
},
{
"EventCreatorEmail": "info@flashpoint-intel.com",
"EventId": "Nc-OJiCGWaWqVgLbFHiotA",
"Href": "https://fp.tools/api/v4/indicators/event/Nc-OJiCGWaWqVgLbFHiotA",
"Malware Description": "dummy_malware_description14",
"Name": "[botox_lampeduza_amaterasu_output5E0600](https://fp.tools/home/technical_data/iocs/items/5d1504b4-572c-47dd-afb2-05d20a640c05)",
"ObservedTime": "Dec 18, 2019 07:00",
"Tags": "source:VirusTotal, botox_lampeduza_amaterasu_output5e0600"
},
{
"EventCreatorEmail": "info@flashpoint-intel.com",
"EventId": "Ut6zC32_VMSg6vB-cvwNmg",
"Href": "https://fp.tools/api/v4/indicators/event/Ut6zC32_VMSg6vB-cvwNmg",
"Malware Description": "dummy_malware_description15",
"Name": "[Sodinokibi_Unreachable_After_MZ_Check](https://fp.tools/home/technical_data/iocs/items/5da01a74-4b5c-4160-83c6-05d00a640c05)",
"ObservedTime": "Dec 18, 2019 06:02",
"Tags": "source:VirusTotal, sodinokibi_unreachable_after_mz_check"
},
{
"EventCreatorEmail": "info@flashpoint-intel.com",
"EventId": "w0B3dKLxX9aat0O0YyS-6A",
"Href": "https://fp.tools/api/v4/indicators/event/w0B3dKLxX9aat0O0YyS-6A",
"Malware Description": "dummy_malware_description16",
"Name": "[CryptingService_27a1ad076d1c155856c0ad08dd302018281aba1e_2019-12-18T02:01:02.000Z](https://fp.tools/home/technical_data/iocs/items/5df9a7f3-7260-44d7-bcdd-03010a21270c)",
"ObservedTime": "Dec 18, 2019 04:15",
"Tags": "source:CryptingService2"
},
{
"EventCreatorEmail": "info@flashpoint-intel.com",
"EventId": "8tWwTNyfWY2oBqSmmI0AUg",
"Href": "https://fp.tools/api/v4/indicators/event/8tWwTNyfWY2oBqSmmI0AUg",
"Malware Description": "dummy_malware_description17",
"Name": "[ryuk3_exe](https://fp.tools/home/technical_data/iocs/items/5dc0f4cc-cb70-44bf-bdbf-00540a2123fc)",
"ObservedTime": "Dec 18, 2019 01:00",
"Tags": "source:VirusTotal, type:Ransomware, ryuk3_exe, os:Windows, malware:Ryuk"
},
{
"EventCreatorEmail": "info@flashpoint-intel.com",
"EventId": "J7W0HoNDULyq7p6FqLEH6Q",
"Href": "https://fp.tools/api/v4/indicators/event/J7W0HoNDULyq7p6FqLEH6Q",
"Malware Description": "dummy_malware_description18",
"Name": "[Kovter](https://fp.tools/home/technical_data/iocs/items/5d0aa281-9768-4f33-9903-05d20a640c05)",
"ObservedTime": "Dec 18, 2019 00:00",
"Tags": "source:VirusTotal, actor:KovCoreG, kovter, os:Windows, type:Trojan, malware:Kovter"
},
{
"EventCreatorEmail": "info@flashpoint-intel.com",
"EventId": "zzc5kPgfUzeUO3epfZs6ug",
"Href": "https://fp.tools/api/v4/indicators/event/zzc5kPgfUzeUO3epfZs6ug",
"Malware Description": "dummy_malware_description19",
"Name": "[predatorthethief retrohunt](https://fp.tools/home/technical_data/iocs/items/5df9165e-0e34-4cc8-b7f5-004e0a21253a)",
"ObservedTime": "Dec 17, 2019 17:55",
"Tags": "malware:trojan:PredatorTheThief"
},
{
"EventCreatorEmail": "info@flashpoint-intel.com",
"EventId": "NXgn9Ty5VeiTzGMGNkHMnA",
"Href": "https://fp.tools/api/v4/indicators/event/NXgn9Ty5VeiTzGMGNkHMnA",
"Malware Description": "dummy_malware_description20",
"Name": "[Golang_Win](https://fp.tools/home/technical_data/iocs/items/5da90f11-2240-420f-849a-12a70a640c05)",
"ObservedTime": "Dec 17, 2019 05:02",
"Tags": "source:VirusTotal, golang_win"
}
]
}
Human Readable Output
Flashpoint Events
Below are the detail found
| Observed time (UTC) | Name | Tags | Malware Description |
|---|---|---|---|
| Dec 11, 2019 10:16 | CryptingService_4273f08ae5f229f6301e7e0cc9e9005cebc4da20_2019-12-11T03:01:01.000Z | source:CryptingService2 | dummy_malware_description1 |
| Dec 11, 2019 09:00 | NetWire | source:VirusTotal, T1060, netwire, T1056, os:Windows, type:RAT, malware:NetWire, T1082, T1116, T1113, misp-galaxy:mitre-enterprise-attack-attack-pattern=“Registry Run Keys / Start Folder - T1060”, misp-galaxy:mitre-enterprise-attack-attack-pattern=“Input Capture - T1056”, misp-galaxy:mitre-enterprise-attack-attack-pattern=“System Information Discovery - T1082”, misp-galaxy:mitre-enterprise-attack-attack-pattern=“Code Signing - T1116”, misp-galaxy:mitre-enterprise-attack-attack-pattern=“Screen Capture - T1113” | dummy_malware_description2 |
| Dec 11, 2019 08:00 | CyberGate | source:VirusTotal, os:Windows, type:RAT, cybergate, malware:CyberGate | dummy_malware_description3 |
| Dec 11, 2019 07:04 | ROKRAT_Nov17_1 | source:VirusTotal, T1057, T1105, T1063, os:Windows, target:SouthKorea, T1003, T1012, T1082, rokrat_nov17_1, malware:Rokrat, T1071, exfil:C2, T1102, T1041, T1056, type:RAT, T1497, T1113, misp-galaxy:mitre-enterprise-attack-attack-pattern=“Process Discovery - T1057”, misp-galaxy:mitre-enterprise-attack-attack-pattern=“Remote File Copy - T1105”, misp-galaxy:mitre-enterprise-attack-attack-pattern=“Security Software Discovery - T1063”, misp-galaxy:mitre-enterprise-attack-attack-pattern=“Credential Dumping - T1003”, misp-galaxy:mitre-enterprise-attack-attack-pattern=“Query Registry - T1012”, misp-galaxy:mitre-enterprise-attack-attack-pattern=“System Information Discovery - T1082”, misp-galaxy:mitre-enterprise-attack-attack-pattern=“Standard Application Layer Protocol - T1071”, misp-galaxy:mitre-enterprise-attack-attack-pattern=“Web Service - T1102”, misp-galaxy:mitre-enterprise-attack-attack-pattern=“Exfiltration Over Command and Control Channel - T1041”, misp-galaxy:mitre-enterprise-attack-attack-pattern=“Input Capture - T1056”, misp-galaxy:mitre-enterprise-attack-attack-pattern=“Screen Capture - T1113” | dummy_malware_description4 |
| Dec 11, 2019 07:04 | Sodinokibi_Unreachable_After_MZ_Check | source:VirusTotal, sodinokibi_unreachable_after_mz_check | dummy_malware_description5 |
| Dec 11, 2019 07:04 | MegaCortex_Load_Dinkum_CLib | source:VirusTotal, megacortex_load_dinkum_clib, malware:MegaCortex, type:Ransomware, os:Windows | dummy_malware_description6 |
| Dec 11, 2019 07:04 | Command_Line_Options | source:VirusTotal, command_line_options | dummy_malware_description7 |
| Dec 11, 2019 06:17 | CryptingService_74dd32ce57900738cba4d945e4619289ff040a9e_2019-12-11T03:01:01.000Z | source:CryptingService2 | dummy_malware_description8 |
| Dec 11, 2019 06:03 | Gandcrab | source:VirusTotal, type:Ransomware, gandcrab, malware:GandCrab, os:Windows | dummy_malware_description9 |
| Dec 11, 2019 06:00 | botox_lampeduza_amaterasu_output5E0600 | source:VirusTotal, botox_lampeduza_amaterasu_output5e0600 | dummy_malware_description10 |
| Dec 11, 2019 04:17 | CryptingService_e2f163c72837c6b4386ef9158d017418ab149b13_2019-12-11T03:01:01.000Z | source:CryptingService2 | dummy_malware_description11 |
| Dec 11, 2019 04:16 | CryptingService_2c13004c346bf79bbec61f6a65fb5b11d5c6f557_2019-12-11T02:01:02.000Z | source:CryptingService2 | dummy_malware_description12 |
| Dec 11, 2019 04:16 | CryptingService_5eda60cd7c1d4e5dd4fc5e0d3746bd4879de3959_2019-12-11T03:01:01.000Z | source:CryptingService2 | dummy_malware_description13 |
| Dec 11, 2019 04:16 | CryptingService_981ad08f56f265e9e7209e09e3842d8a6b7f7563_2019-12-11T03:01:01.000Z | source:CryptingService2 | dummy_malware_description14 |
| Dec 11, 2019 04:16 | CryptingService_7dbfe923559cbb91031dbe2b616c16f5aa40233f_2019-12-11T02:01:02.000Z | source:CryptingService2 | dummy_malware_description15 |
| Dec 11, 2019 04:00 | cobalt_beacon | source:VirusTotal, cobalt_beacon | dummy_malware_description16 |
| Dec 10, 2019 19:00 | Loki | source:VirusTotal, type:Stealer, malware:Loki, loki, os:Windows | dummy_malware_description17 |
| Dec 10, 2019 19:00 | crime_alina_pos_3 | source:VirusTotal, crime_alina_pos_3, type:POS, malware:Alina | dummy_malware_description18 |
| Dec 10, 2019 19:00 | Kovter | source:VirusTotal, actor:KovCoreG, kovter, os:Windows, type:Trojan, malware:Kovter | dummy_malware_description19 |
| Dec 10, 2019 17:24 | zeroclear Oilrig | origin:Iran, actor:APT34, malware:ransomware:zeroclear | dummy_malware_description20 |
All events and details (fp-tools):
https://fp.tools/home/search/iocs
flashpoint-common-lookup
Lookup any type of indicator
Base Command
flashpoint-common-lookup
Input
| Argument Name | Description | Required |
|---|---|---|
| indicator | The indicator type, for example, domain, ip, email, url, and so on. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| DBotScore.Indicator | string | The indicator that was tested. |
| DBotScore.Score | number | The actual score. |
| DBotScore.Type | string | The indicator type. |
| DBotScore.Vendor | string | The vendor used to calculate the score. |
Command Example
!flashpoint-common-lookup indicator="mondns.myftp.biz"
Context Example
{
"DBotScore": {
"Indicator": "mondns.myftp.biz",
"Score": 3,
"Type": "domain",
"Vendor": "Flashpoint"
}
}
Human Readable Output
Flashpoint reputation for mondns.myftp.biz
Reputation: Malicious
Events in which this IOC observed
| Date Observed (UTC) | Name | Tags |
|---|---|---|
| Oct 11, 2019 15:30 | ModiRAT | misp-galaxy:mitre-enterprise-attack-attack-pattern=“Deobfuscate/Decode Files or Information - T1140”, misp-galaxy:mitre-enterprise-attack-attack-pattern=“System Owner/User Discovery - T1033”, misp-galaxy:mitre-enterprise-attack-attack-pattern=“System Information Discovery - T1082”, misp-galaxy:mitre-enterprise-attack-attack-pattern=“Screen Capture - T1113”, misp-galaxy:mitre-enterprise-attack-attack-pattern=“Custom Command and Control Protocol - T1094”, misp-galaxy:mitre-enterprise-attack-attack-pattern=“Data Encoding - T1132”, misp-galaxy:mitre-enterprise-attack-attack-pattern=“Uncommonly Used Port - T1065”, malware:ModiRAT, type:RAT, os:Windows, report:FQmMHh1rR_WuGd_PNVv-bQ |
flashpoint-get-forum-details
Retrieves forum details using the forum ID. To retrieve the forum ID run the flashpoint-search-forum-posts command and see the value under the following context paths, Flashpoint.Forum.ForumId or Flashpoint.Forum.Post.Forum.id.
Base Command
flashpoint-get-forum-details
Input
| Argument Name | Description | Required |
|---|---|---|
| forum_id | Specify forum id of the forum for which the details are to be fetched. The forum id can be known from context path (Flashpoint.Forum.ForumId or Flashpoint.Forum.Post.Forum.id) of flashpoint-search-forum-posts command or some other investigation. | Required |
Context Output
| Path | Type | Description |
|---|---|---|
| Flashpoint.Forum.Description | string | The detailed information of the supplied forum ID. |
| Flashpoint.Forum.Hostname | string | The host details of the supplied forum ID. |
| Flashpoint.Forum.Name | string | The name of the forum. |
| Flashpoint.Forum.Stats | Unknown | The displayed statistical information such as the number of posts, rooms, threads and users details. |
| Flashpoint.Forum.Tags | Unknown | The displayed list of tags which include ID, name, parent_tag, and UUID. |
| Flashpoint.Forum.ForumId | string | The forum’s unique ID. |
Command Example
!flashpoint-get-forum-details forum_id=ifY5BsXeXQqdTx3fafZbIg
Context Example
{
"Flashpoint.Forum": {
"Description": "0hack (\u96f6\u9ed1\u8054\u76df) is a Chinese-language hacker training forum. The forum appears to be affiliated with \u975e\u51e1\u5b89\u5168\u7f51, 803389.com.",
"ForumId": "ifY5BsXeXQqdTx3fafZbIg",
"Hostname": "bbs.0hack.com",
"Name": "0hack",
"Stats": {
"posts": 1226,
"rooms": 11,
"threads": 226,
"users": 114
},
"Tags": [
{
"id": 31,
"name": "Chinese",
"parent_tag": 28,
"uuid": "e725fc5d-71f9-4403-ab00-ae609f2fd3bd"
},
{
"id": 6,
"name": "Cyber Threat",
"parent_tag": null,
"uuid": "09fb6a4a-e072-495d-97bf-d80f059828fd"
},
{
"id": 8,
"name": "Hacking",
"parent_tag": 6,
"uuid": "c88a0cd8-a259-46d7-b8b4-b6e0060f16a0"
},
{
"id": 28,
"name": "Language",
"parent_tag": null,
"uuid": "6d6719ac-9ead-4980-a783-1f32ac398e2b"
}
]
}
}
Human Readable Output
Flashpoint Forum details
Below are the details found
| Name | Hostname | Tags |
|---|---|---|
| 0hack | bbs.0hack.com | Chinese, Cyber Threat, Hacking, Language |
flashpoint-get-forum-room-details
Retrieves forum room details using the room ID. To retrieve the room ID run the flashpoint-search-forum-posts command and see the value under the Flashpoint.Forum.Post.Room.id context path.
Base Command
flashpoint-get-forum-room-details
Input
| Argument Name | Description | Required |
|---|---|---|
| room_id | The room ID for which to retrieve room information in a forum. To retrieve the room ID run the flashpoint-search-forum-posts command and see the value under the Flashpoint.Forum.Post.Room.id context path. | Required |
Context Output
| Path | Type | Description |
|---|---|---|
| Flashpoint.Forum.Room.Forum | unknown | Forum details, including forum name, hostname, platform url, stats, tags, and so on. |
| Flashpoint.Forum.Room.Title | string | The room title. You can use the same title in the forum search command. |
| Flashpoint.Forum.Room.Url | string | The forum room URL. |
| Flashpoint.Forum.Room.RoomId | string | The forum room ID. |
Command Example
!flashpoint-get-forum-room-details room_id="dBoQqur5XmGGYLxSrc8C9A"
Context Example
{
"Flashpoint.Forum.Room": {
"Forum": {
"description": "This is the restored 2013 database of the Carding.pro SQL dump. Crdpro was set up by the threat actor operating under the alias \"Makaka\" to drive traffic to their forum Crdclub.",
"hostname": "crdpro.su",
"id": "4aFfW6e7VVea1cP7G-Z7mw",
"legacy_id": "_OU09w6LVm69kgAyDaTv5A",
"name": "Crdpro",
"platform_url": "https://fp.tools/home/search/forums?forum_ids=4aFfW6e7VVea1cP7G-Z7mw",
"stats": {
"posts": 987018,
"rooms": 132,
"threads": 116115,
"users": 50902
},
"tags": [
{
"id": 6,
"name": "Cyber Threat",
"parent_tag": null,
"uuid": "09fb6a4a-e072-495d-97bf-d80f059828fd"
},
{
"id": 9,
"name": "Fraud",
"parent_tag": null,
"uuid": "fa9a9533-0cf1-42b6-9553-08ebbbaaa60b"
},
{
"id": 28,
"name": "Language",
"parent_tag": null,
"uuid": "6d6719ac-9ead-4980-a783-1f32ac398e2b"
},
{
"id": 29,
"name": "English",
"parent_tag": null,
"uuid": "2fb5aeb5-7afc-4e04-a5bc-465297456ffc"
},
{
"id": 30,
"name": "Russian",
"parent_tag": null,
"uuid": "c3815816-c639-4ea2-9e5c-aec29eee2b1a"
}
]
},
"RoomId": "dBoQqur5XmGGYLxSrc8C9A",
"Title": "Bank Carding",
"Url": "forumdisplay.php?f=70&s=6e25902255e1b57bfe37dd2749dafd66"
}
}
Human Readable Output
Flashpoint Room details
Below are the detail found
| Forum Name | Title | URL |
|---|---|---|
| Crdpro | Bank Carding | forumdisplay.php?f=70&s=6e25902255e1b57bfe37dd2749dafd66 |
flashpoint-get-forum-user-details
Retrieves user details using the user-id. To retrieve the user ID, run the flashpoint-search-forum-posts command and see the value under the Flashpoint.Forum.Post.User.id context path.
Base Command
flashpoint-get-forum-user-details
Input
| Argument Name | Description | Required |
|---|---|---|
| user_id | The user ID used to retrieve a user’s information. To retrieve the user ID, run the flashpoint-search-forum-posts command and see the value under the Flashpoint.Forum.Post.User.id context path. | Required |
Context Output
| Path | Type | Description |
|---|---|---|
| Flashpoint.Forum.User.Forum | unknown | Forum details, including id, hostname, description, stats, tags, and so on. |
| Flashpoint.Forum.User.Name | string | The name of the user. |
| Flashpoint.Forum.User.PlatformUrl | string | The platform URL of the user which is redirected to Flashpoint platform. |
| Flashpoint.Forum.User.Url | string | The URL of user. |
| Flashpoint.Forum.User.UserId | string | The unique ID of the forum user. |
Command Example
!flashpoint-get-forum-user-details user_id="P3au_EzEX4-uctmRfdUYeA"
Context Example
{
"Flashpoint.Forum.User": {
"Forum": {
"description": "This is the restored 2013 database of the Carding.pro SQL dump. Crdpro was set up by the threat actor operating under the alias \"Makaka\" to drive traffic to their forum Crdclub.",
"hostname": "crdpro.su",
"id": "4aFfW6e7VVea1cP7G-Z7mw",
"legacy_id": "_OU09w6LVm69kgAyDaTv5A",
"name": "Crdpro",
"platform_url": "https://fp.tools/home/search/forums?forum_ids=4aFfW6e7VVea1cP7G-Z7mw",
"stats": {
"posts": 987018,
"rooms": 132,
"threads": 116115,
"users": 50902
},
"tags": [
{
"id": 6,
"name": "Cyber Threat",
"parent_tag": null,
"uuid": "09fb6a4a-e072-495d-97bf-d80f059828fd"
},
{
"id": 9,
"name": "Fraud",
"parent_tag": null,
"uuid": "fa9a9533-0cf1-42b6-9553-08ebbbaaa60b"
},
{
"id": 28,
"name": "Language",
"parent_tag": null,
"uuid": "6d6719ac-9ead-4980-a783-1f32ac398e2b"
},
{
"id": 29,
"name": "English",
"parent_tag": null,
"uuid": "2fb5aeb5-7afc-4e04-a5bc-465297456ffc"
},
{
"id": 30,
"name": "Russian",
"parent_tag": null,
"uuid": "c3815816-c639-4ea2-9e5c-aec29eee2b1a"
}
]
},
"Name": "IllWillPub",
"PlatformUrl": "https://fp.tools/home/search/forums?author_id=P3au_EzEX4-uctmRfdUYeA",
"Url": "http://www.crdpro.su/member.php?s=9f099a0eebc5f7c79e36fc688af2f697&u=50678",
"UserId": "P3au_EzEX4-uctmRfdUYeA"
}
}
Human Readable Output
Flashpoint User details
Below are the detail found
| Forum Name | Name | URL |
|---|---|---|
| Crdpro | IllWillPub | http://www.crdpro.su/member.php?s=9f099a0eebc5f7c79e36fc688af2f697&u=50678 |
flashpoint-get-forum-post-details
Retrieves post details using the post-id. To retrieve the post ID, run the flashpoint-search-forum-posts command and see the value under the Flashpoint.Forum.Post.PostId context path. command or some other investigation.
Base Command
flashpoint-get-forum-post-details
Input
| Argument Name | Description | Required |
|---|---|---|
| post_id | The post ID, which gives post information embedded within the forum, room, user, and so on. To retrieve the post ID, run the flashpoint-search-forum-posts and see the value under the Flashpoint.Forum.Post.PostId context path. | Required |
Context Output
| Path | Type | Description |
|---|---|---|
| Flashpoint.Forum.Post.Forum | unknown | Forum details of the post, including id, hostname, stats, description, tags, and so on. |
| Flashpoint.Forum.Post.Room | unknown | Room details of the post, including room title, id, url, platform url, and so on. |
| Flashpoint.Forum.Post.User | unknown | User details of the post, including user id, name, url, platform url, and so on. |
| Flashpoint.Forum.Post.PlatformUrl | string | Using platform URL user can redirect to Flashpoint platform. |
| Flashpoint.Forum.Post.PublishedAt | unknown | The date that the post was published. |
| Flashpoint.Forum.Post.Url | unknown | The display URL of the post. |
| Flashpoint.Forum.Post.PostId | string | The forum post ID. |
Command Example
!flashpoint-get-forum-post-details post_id=PDo1xGiKXDebHGc8fZme6g
Context Example
{
"Flashpoint.Forum.Post": {
"Forum": {
"description": "Ukrainian forum with focus on Russian-Ukrainian conflict.",
"hostname": "ord-ua.com",
"id": "rJnT5ETuWcW9jTCnsobFZQ",
"legacy_id": null,
"name": "Ord-UA",
"platform_url": "https://fp.tools/home/search/forums?forum_ids=rJnT5ETuWcW9jTCnsobFZQ",
"stats": {
"posts": 163710,
"rooms": 1,
"threads": 13916,
"users": 71614
},
"tags": [
{
"id": 55,
"name": "Communities in Conflict",
"parent_tag": 17,
"uuid": "83a2e5d4-e591-42be-943f-4af7d5de30e4"
},
{
"id": 28,
"name": "Language",
"parent_tag": null,
"uuid": "6d6719ac-9ead-4980-a783-1f32ac398e2b"
},
{
"id": 30,
"name": "Russian",
"parent_tag": 28,
"uuid": "c3815816-c639-4ea2-9e5c-aec29eee2b1a"
},
{
"id": 98,
"name": "Ukrainian",
"parent_tag": null,
"uuid": "9bf8c176-3b2d-4445-a2f5-6fe92843a4a1"
}
]
},
"PlatformUrl": "https://fp.tools/home/ddw/forums/threads/M3NorvmYVoG6rVFHnP3T9w?id=PDo1xGiKXDebHGc8fZme6g",
"PostId": "PDo1xGiKXDebHGc8fZme6g",
"PublishedAt": "2019-12-10T01:17:00+00:00",
"Room": {
"forum": "/forums/sites/rJnT5ETuWcW9jTCnsobFZQ",
"id": "UWUdaSQ7VXCkHq4KDQalpQ",
"legacy_id": null,
"native_id": "forum",
"platform_url": "https://fp.tools/home/search/forums?room_title=\"%D0%A4%D0%BE%D1%80%D1%83%D0%BC\"",
"title": "\u0424\u043e\u0440\u0443\u043c",
"url": "forum"
},
"Url": "2014/10/22/dsns-na-choli-z-bochkovskim-i-k/?lpage=1&page=580",
"User": {
"id": "0vK-XB2KWaeYqXjXaO9ruA",
"legacy_id": null,
"name": "\u0414\u0443\u0431\u043e\u0432\u0438\u043a",
"native_id": "\u0414\u0443\u0431\u043e\u0432\u0438\u043a",
"platform_url": "https://fp.tools/home/search/forums?author_id=0vK-XB2KWaeYqXjXaO9ruA",
"url": null
}
}
}
Human Readable Output
Flashpoint Post details
Below are the detail found
| Published at | Forum Name | Room Title | Author Name | Thread Title | URL | Platform url |
|---|---|---|---|---|---|---|
| 2019-12-10T01:17:00+00:00 | Ord-UA | Форум | Дубовик | ДСНС на чолі з Бочковським і К…. | 2014/10/22/dsns-na-choli-z-bochkovskim-i-k/?lpage=1&page=580 | https://fp.tools/home/ddw/forums/threads/M3NorvmYVoG6rVFHnP3T9w?id=PDo1xGiKXDebHGc8fZme6g |
flashpoint-search-forum-sites
Searches forum sites using a keyword. it will search in site content like name, title, descripion etc.
Base Command
flashpoint-search-forum-sites
Input
| Argument Name | Description | Required |
|---|---|---|
| site_search | The site keyword or text for which to search. This keyword is used for search information in forum sites. This keyword or text is known by Flashpoint users. | Required |
Context Output
| Path | Type | Description |
|---|---|---|
| Flashpoint.Forum.Site | unknown | A list of forum site details based on the search keyword. |
Command Example
!flashpoint-search-forum-sites site_search="0hack"
Context Example
{
"Flashpoint.Forum.Site": [
{
"Description": "0hack (\u96f6\u9ed1\u8054\u76df) is a Chinese-language hacker training forum. The forum appears to be affiliated with \u975e\u51e1\u5b89\u5168\u7f51, 803389.com.",
"Hostname": "bbs.0hack.com",
"Name": "0hack"
}
]
}
Human Readable Output
Flashpoint Forum sites related to search: 0hack
Top 10 sites:
Below are the detail found
| Name | Hostname | Description |
|---|---|---|
| 0hack | bbs.0hack.com | 0hack (零黑联盟) is a Chinese-language hacker training forum. The forum appears to be affiliated with 非凡安全网, 803389.com. |
flashpoint-search-forum-posts
Search forum posts using a keyword
Base Command
flashpoint-search-forum-posts
Input
| Argument Name | Description | Required |
|---|---|---|
| post_search | The post keyword or text which is used for search information in forum posts, and is known by Flashpoint users. | Required |
Context Output
| Path | Type | Description |
|---|---|---|
| Flashpoint.Forum.Post | unknown | A list of forum posts based on the search keyword. |
Command Example
!flashpoint-search-forum-posts post_search="The Courtyard Café"
Context Example
{
"Flashpoint.Forum.Post": [
{
"Forum": {
"description": "The Sammyboy Times forum",
"hostname": "www.sammyboy.com",
"id": "TTIpsoLTW8m1AKn4qU52sQ",
"legacy_id": null,
"name": "The Sammyboy Times",
"platform_url": "https://fp.tools/home/search/forums?forum_ids=TTIpsoLTW8m1AKn4qU52sQ",
"stats": {
"posts": 459033,
"rooms": 14,
"threads": 21736,
"users": 6571
},
"tags": [
{
"id": 6,
"name": "Cyber Threat",
"parent_tag": null,
"uuid": "09fb6a4a-e072-495d-97bf-d80f059828fd"
},
{
"id": 29,
"name": "English",
"parent_tag": 28,
"uuid": "2fb5aeb5-7afc-4e04-a5bc-465297456ffc"
},
{
"id": 8,
"name": "Hacking",
"parent_tag": 6,
"uuid": "c88a0cd8-a259-46d7-b8b4-b6e0060f16a0"
},
{
"id": 28,
"name": "Language",
"parent_tag": null,
"uuid": "6d6719ac-9ead-4980-a783-1f32ac398e2b"
}
]
},
"PlatformUrl": "https://fp.tools/home/ddw/forums/threads/BTdC6qjzVQ63D7p810ea8g?id=Exe7t24dVfSUooUSbsOPsw",
"PostId": "Exe7t24dVfSUooUSbsOPsw",
"PublishedAt": "2019-12-18T11:43:00+00:00",
"Room": {
"forum": "/forums/sites/TTIpsoLTW8m1AKn4qU52sQ",
"id": "pVGplbH4XPGMwryH9g8L6g",
"legacy_id": "PB9r4WC8Xh-7vP109JAUZQ",
"native_id": "the-courtyard-caf%C3%A9.2",
"platform_url": "https://fp.tools/home/search/forums?room_title=\"The%20Courtyard%20Caf%C3%A9\"",
"title": "The Courtyard Caf\u00e9",
"url": "forums/the-courtyard-caf%C3%A9.2"
},
"Url": "threads/kfc-promotion-8-pieces-sour-cream-onion-chicken-for-4-18-20-dec.277554/post-3015468",
"User": {
"id": "f5xG_0M2Wl-XFOpvlZGQow",
"legacy_id": "oR-Cwv6DVF6tKAEr1g3ZjA",
"name": "syed putra",
"native_id": "4371",
"platform_url": "https://fp.tools/home/search/forums?author_id=f5xG_0M2Wl-XFOpvlZGQow",
"url": "https://www.sammyboy.com/members/syed-putra.4371"
}
},
{
"Forum": {
"description": "The Sammyboy Times forum",
"hostname": "www.sammyboy.com",
"id": "TTIpsoLTW8m1AKn4qU52sQ",
"legacy_id": null,
"name": "The Sammyboy Times",
"platform_url": "https://fp.tools/home/search/forums?forum_ids=TTIpsoLTW8m1AKn4qU52sQ",
"stats": {
"posts": 459033,
"rooms": 14,
"threads": 21736,
"users": 6571
},
"tags": [
{
"id": 6,
"name": "Cyber Threat",
"parent_tag": null,
"uuid": "09fb6a4a-e072-495d-97bf-d80f059828fd"
},
{
"id": 29,
"name": "English",
"parent_tag": 28,
"uuid": "2fb5aeb5-7afc-4e04-a5bc-465297456ffc"
},
{
"id": 8,
"name": "Hacking",
"parent_tag": 6,
"uuid": "c88a0cd8-a259-46d7-b8b4-b6e0060f16a0"
},
{
"id": 28,
"name": "Language",
"parent_tag": null,
"uuid": "6d6719ac-9ead-4980-a783-1f32ac398e2b"
}
]
},
"PlatformUrl": "https://fp.tools/home/ddw/forums/threads/BTdC6qjzVQ63D7p810ea8g?id=xaQRdIiRW1eQ4kS6TxAC5A",
"PostId": "xaQRdIiRW1eQ4kS6TxAC5A",
"PublishedAt": "2019-12-18T11:41:00+00:00",
"Room": {
"forum": "/forums/sites/TTIpsoLTW8m1AKn4qU52sQ",
"id": "pVGplbH4XPGMwryH9g8L6g",
"legacy_id": "PB9r4WC8Xh-7vP109JAUZQ",
"native_id": "the-courtyard-caf%C3%A9.2",
"platform_url": "https://fp.tools/home/search/forums?room_title=\"The%20Courtyard%20Caf%C3%A9\"",
"title": "The Courtyard Caf\u00e9",
"url": "forums/the-courtyard-caf%C3%A9.2"
},
"Url": "threads/kfc-promotion-8-pieces-sour-cream-onion-chicken-for-4-18-20-dec.277554/post-3015466",
"User": {
"id": "HzP04FFEX_663EPpm8C1OA",
"legacy_id": "Mm48bgjkWGGokSgpnl0kSQ",
"name": "horny",
"native_id": "153283",
"platform_url": "https://fp.tools/home/search/forums?author_id=HzP04FFEX_663EPpm8C1OA",
"url": "https://www.sammyboy.com/members/horny.153283"
}
},
{
"Forum": {
"description": "The Sammyboy Times forum",
"hostname": "www.sammyboy.com",
"id": "TTIpsoLTW8m1AKn4qU52sQ",
"legacy_id": null,
"name": "The Sammyboy Times",
"platform_url": "https://fp.tools/home/search/forums?forum_ids=TTIpsoLTW8m1AKn4qU52sQ",
"stats": {
"posts": 459033,
"rooms": 14,
"threads": 21736,
"users": 6571
},
"tags": [
{
"id": 6,
"name": "Cyber Threat",
"parent_tag": null,
"uuid": "09fb6a4a-e072-495d-97bf-d80f059828fd"
},
{
"id": 29,
"name": "English",
"parent_tag": 28,
"uuid": "2fb5aeb5-7afc-4e04-a5bc-465297456ffc"
},
{
"id": 8,
"name": "Hacking",
"parent_tag": 6,
"uuid": "c88a0cd8-a259-46d7-b8b4-b6e0060f16a0"
},
{
"id": 28,
"name": "Language",
"parent_tag": null,
"uuid": "6d6719ac-9ead-4980-a783-1f32ac398e2b"
}
]
},
"PlatformUrl": "https://fp.tools/home/ddw/forums/threads/BTdC6qjzVQ63D7p810ea8g?id=iEDOMDW7XHOLQpHJvqIubA",
"PostId": "iEDOMDW7XHOLQpHJvqIubA",
"PublishedAt": "2019-12-18T11:40:00+00:00",
"Room": {
"forum": "/forums/sites/TTIpsoLTW8m1AKn4qU52sQ",
"id": "pVGplbH4XPGMwryH9g8L6g",
"legacy_id": "PB9r4WC8Xh-7vP109JAUZQ",
"native_id": "the-courtyard-caf%C3%A9.2",
"platform_url": "https://fp.tools/home/search/forums?room_title=\"The%20Courtyard%20Caf%C3%A9\"",
"title": "The Courtyard Caf\u00e9",
"url": "forums/the-courtyard-caf%C3%A9.2"
},
"Url": "threads/kfc-promotion-8-pieces-sour-cream-onion-chicken-for-4-18-20-dec.277554/post-3015464",
"User": {
"id": "f5xG_0M2Wl-XFOpvlZGQow",
"legacy_id": "oR-Cwv6DVF6tKAEr1g3ZjA",
"name": "syed putra",
"native_id": "4371",
"platform_url": "https://fp.tools/home/search/forums?author_id=f5xG_0M2Wl-XFOpvlZGQow",
"url": "https://www.sammyboy.com/members/syed-putra.4371"
}
},
{
"Forum": {
"description": "The Sammyboy Times forum",
"hostname": "www.sammyboy.com",
"id": "TTIpsoLTW8m1AKn4qU52sQ",
"legacy_id": null,
"name": "The Sammyboy Times",
"platform_url": "https://fp.tools/home/search/forums?forum_ids=TTIpsoLTW8m1AKn4qU52sQ",
"stats": {
"posts": 459033,
"rooms": 14,
"threads": 21736,
"users": 6571
},
"tags": [
{
"id": 6,
"name": "Cyber Threat",
"parent_tag": null,
"uuid": "09fb6a4a-e072-495d-97bf-d80f059828fd"
},
{
"id": 29,
"name": "English",
"parent_tag": 28,
"uuid": "2fb5aeb5-7afc-4e04-a5bc-465297456ffc"
},
{
"id": 8,
"name": "Hacking",
"parent_tag": 6,
"uuid": "c88a0cd8-a259-46d7-b8b4-b6e0060f16a0"
},
{
"id": 28,
"name": "Language",
"parent_tag": null,
"uuid": "6d6719ac-9ead-4980-a783-1f32ac398e2b"
}
]
},
"PlatformUrl": "https://fp.tools/home/ddw/forums/threads/g2g0cO3JUeyFrRQxblYCxw?id=cAGx-p5-VzGxNhcH88CgVQ",
"PostId": "cAGx-p5-VzGxNhcH88CgVQ",
"PublishedAt": "2019-12-18T11:23:00+00:00",
"Room": {
"forum": "/forums/sites/TTIpsoLTW8m1AKn4qU52sQ",
"id": "pVGplbH4XPGMwryH9g8L6g",
"legacy_id": "PB9r4WC8Xh-7vP109JAUZQ",
"native_id": "the-courtyard-caf%C3%A9.2",
"platform_url": "https://fp.tools/home/search/forums?room_title=\"The%20Courtyard%20Caf%C3%A9\"",
"title": "The Courtyard Caf\u00e9",
"url": "forums/the-courtyard-caf%C3%A9.2"
},
"Url": "threads/ministry-of-defence-mindef-is-a.277563/post-3015459",
"User": {
"id": "42aVe_v5UuidpcA80eekoQ",
"legacy_id": "H16SdxrQVp6pmP-2sBO3lA",
"name": "sweetiepie",
"native_id": "64347",
"platform_url": "https://fp.tools/home/search/forums?author_id=42aVe_v5UuidpcA80eekoQ",
"url": "https://www.sammyboy.com/members/sweetiepie.64347"
}
},
{
"Forum": {
"description": "The Sammyboy Times forum",
"hostname": "www.sammyboy.com",
"id": "TTIpsoLTW8m1AKn4qU52sQ",
"legacy_id": null,
"name": "The Sammyboy Times",
"platform_url": "https://fp.tools/home/search/forums?forum_ids=TTIpsoLTW8m1AKn4qU52sQ",
"stats": {
"posts": 459033,
"rooms": 14,
"threads": 21736,
"users": 6571
},
"tags": [
{
"id": 6,
"name": "Cyber Threat",
"parent_tag": null,
"uuid": "09fb6a4a-e072-495d-97bf-d80f059828fd"
},
{
"id": 29,
"name": "English",
"parent_tag": 28,
"uuid": "2fb5aeb5-7afc-4e04-a5bc-465297456ffc"
},
{
"id": 8,
"name": "Hacking",
"parent_tag": 6,
"uuid": "c88a0cd8-a259-46d7-b8b4-b6e0060f16a0"
},
{
"id": 28,
"name": "Language",
"parent_tag": null,
"uuid": "6d6719ac-9ead-4980-a783-1f32ac398e2b"
}
]
},
"PlatformUrl": "https://fp.tools/home/ddw/forums/threads/b-m8neykUly5gSeufYEfyQ?id=r0yTgwVaUvm_L6t4Y8O8Fw",
"PostId": "r0yTgwVaUvm_L6t4Y8O8Fw",
"PublishedAt": "2019-12-18T11:21:00+00:00",
"Room": {
"forum": "/forums/sites/TTIpsoLTW8m1AKn4qU52sQ",
"id": "pVGplbH4XPGMwryH9g8L6g",
"legacy_id": "PB9r4WC8Xh-7vP109JAUZQ",
"native_id": "the-courtyard-caf%C3%A9.2",
"platform_url": "https://fp.tools/home/search/forums?room_title=\"The%20Courtyard%20Caf%C3%A9\"",
"title": "The Courtyard Caf\u00e9",
"url": "forums/the-courtyard-caf%C3%A9.2"
},
"Url": "threads/church-holds-100-billion-for-2nd-coming-of-jesus-guess-church.277562/post-3015458",
"User": {
"id": "eMgRtiHVUiWc2Do8qlG18g",
"legacy_id": "1Mh9MDBzUc-Vc7RBFwd3XA",
"name": "JohnTan",
"native_id": "106375",
"platform_url": "https://fp.tools/home/search/forums?author_id=eMgRtiHVUiWc2Do8qlG18g",
"url": "https://www.sammyboy.com/members/johntan.106375"
}
},
{
"Forum": {
"description": "The Sammyboy Times forum",
"hostname": "www.sammyboy.com",
"id": "TTIpsoLTW8m1AKn4qU52sQ",
"legacy_id": null,
"name": "The Sammyboy Times",
"platform_url": "https://fp.tools/home/search/forums?forum_ids=TTIpsoLTW8m1AKn4qU52sQ",
"stats": {
"posts": 459033,
"rooms": 14,
"threads": 21736,
"users": 6571
},
"tags": [
{
"id": 6,
"name": "Cyber Threat",
"parent_tag": null,
"uuid": "09fb6a4a-e072-495d-97bf-d80f059828fd"
},
{
"id": 29,
"name": "English",
"parent_tag": 28,
"uuid": "2fb5aeb5-7afc-4e04-a5bc-465297456ffc"
},
{
"id": 8,
"name": "Hacking",
"parent_tag": 6,
"uuid": "c88a0cd8-a259-46d7-b8b4-b6e0060f16a0"
},
{
"id": 28,
"name": "Language",
"parent_tag": null,
"uuid": "6d6719ac-9ead-4980-a783-1f32ac398e2b"
}
]
},
"PlatformUrl": "https://fp.tools/home/ddw/forums/threads/KCxhIFNzV3yDC1W7cJE5Lw?id=mUPvMlpZW8WjGNYmgbA5jQ",
"PostId": "mUPvMlpZW8WjGNYmgbA5jQ",
"PublishedAt": "2019-12-18T11:15:00+00:00",
"Room": {
"forum": "/forums/sites/TTIpsoLTW8m1AKn4qU52sQ",
"id": "pVGplbH4XPGMwryH9g8L6g",
"legacy_id": "PB9r4WC8Xh-7vP109JAUZQ",
"native_id": "the-courtyard-caf%C3%A9.2",
"platform_url": "https://fp.tools/home/search/forums?room_title=\"The%20Courtyard%20Caf%C3%A9\"",
"title": "The Courtyard Caf\u00e9",
"url": "forums/the-courtyard-caf%C3%A9.2"
},
"Url": "threads/stressed-uni-student-has-addiction-to-womens-buttocks-caught-taking-upskirt-videos-guess-race-and-university.277560/post-3015456",
"User": {
"id": "eMgRtiHVUiWc2Do8qlG18g",
"legacy_id": "1Mh9MDBzUc-Vc7RBFwd3XA",
"name": "JohnTan",
"native_id": "106375",
"platform_url": "https://fp.tools/home/search/forums?author_id=eMgRtiHVUiWc2Do8qlG18g",
"url": "https://www.sammyboy.com/members/johntan.106375"
}
},
{
"Forum": {
"description": "The Sammyboy Times forum",
"hostname": "www.sammyboy.com",
"id": "TTIpsoLTW8m1AKn4qU52sQ",
"legacy_id": null,
"name": "The Sammyboy Times",
"platform_url": "https://fp.tools/home/search/forums?forum_ids=TTIpsoLTW8m1AKn4qU52sQ",
"stats": {
"posts": 459033,
"rooms": 14,
"threads": 21736,
"users": 6571
},
"tags": [
{
"id": 6,
"name": "Cyber Threat",
"parent_tag": null,
"uuid": "09fb6a4a-e072-495d-97bf-d80f059828fd"
},
{
"id": 29,
"name": "English",
"parent_tag": 28,
"uuid": "2fb5aeb5-7afc-4e04-a5bc-465297456ffc"
},
{
"id": 8,
"name": "Hacking",
"parent_tag": 6,
"uuid": "c88a0cd8-a259-46d7-b8b4-b6e0060f16a0"
},
{
"id": 28,
"name": "Language",
"parent_tag": null,
"uuid": "6d6719ac-9ead-4980-a783-1f32ac398e2b"
}
]
},
"PlatformUrl": "https://fp.tools/home/ddw/forums/threads/CYIQywO-Wx2t-2xWZpBz4w?id=GJsY66RSV6KW5Y0A1U30Kg",
"PostId": "GJsY66RSV6KW5Y0A1U30Kg",
"PublishedAt": "2019-12-18T11:09:00+00:00",
"Room": {
"forum": "/forums/sites/TTIpsoLTW8m1AKn4qU52sQ",
"id": "pVGplbH4XPGMwryH9g8L6g",
"legacy_id": "PB9r4WC8Xh-7vP109JAUZQ",
"native_id": "the-courtyard-caf%C3%A9.2",
"platform_url": "https://fp.tools/home/search/forums?room_title=\"The%20Courtyard%20Caf%C3%A9\"",
"title": "The Courtyard Caf\u00e9",
"url": "forums/the-courtyard-caf%C3%A9.2"
},
"Url": "threads/sph-let-go-5-media-staff-as-net-profit-slumps-23-while-ceo-ng-still-paid-in-millions.277529/post-3015454",
"User": {
"id": "pofOSuuqVGi-UM9aar9mug",
"legacy_id": "_jef3w0FWEyoy8ka_1QyTw",
"name": "Valium",
"native_id": "155762",
"platform_url": "https://fp.tools/home/search/forums?author_id=pofOSuuqVGi-UM9aar9mug",
"url": "https://www.sammyboy.com/members/valium.155762"
}
},
{
"Forum": {
"description": "The Sammyboy Times forum",
"hostname": "www.sammyboy.com",
"id": "TTIpsoLTW8m1AKn4qU52sQ",
"legacy_id": null,
"name": "The Sammyboy Times",
"platform_url": "https://fp.tools/home/search/forums?forum_ids=TTIpsoLTW8m1AKn4qU52sQ",
"stats": {
"posts": 459033,
"rooms": 14,
"threads": 21736,
"users": 6571
},
"tags": [
{
"id": 6,
"name": "Cyber Threat",
"parent_tag": null,
"uuid": "09fb6a4a-e072-495d-97bf-d80f059828fd"
},
{
"id": 29,
"name": "English",
"parent_tag": 28,
"uuid": "2fb5aeb5-7afc-4e04-a5bc-465297456ffc"
},
{
"id": 8,
"name": "Hacking",
"parent_tag": 6,
"uuid": "c88a0cd8-a259-46d7-b8b4-b6e0060f16a0"
},
{
"id": 28,
"name": "Language",
"parent_tag": null,
"uuid": "6d6719ac-9ead-4980-a783-1f32ac398e2b"
}
]
},
"PlatformUrl": "https://fp.tools/home/ddw/forums/threads/YpOP1H1RWwuc4-Dov2Cwww?id=xT3N2UWEW-SR1Gb9vBoGLQ",
"PostId": "xT3N2UWEW-SR1Gb9vBoGLQ",
"PublishedAt": "2019-12-18T11:00:00+00:00",
"Room": {
"forum": "/forums/sites/TTIpsoLTW8m1AKn4qU52sQ",
"id": "pVGplbH4XPGMwryH9g8L6g",
"legacy_id": "PB9r4WC8Xh-7vP109JAUZQ",
"native_id": "the-courtyard-caf%C3%A9.2",
"platform_url": "https://fp.tools/home/search/forums?room_title=\"The%20Courtyard%20Caf%C3%A9\"",
"title": "The Courtyard Caf\u00e9",
"url": "forums/the-courtyard-caf%C3%A9.2"
},
"Url": "threads/oh-is-this-what-pofma-really-stands-for.277558/post-3015452",
"User": {
"id": "oWWKc07zUO-VGKR8BdVohw",
"legacy_id": "0ZN7piYkW9-0G00EgohtNQ",
"name": "TerrexLee",
"native_id": "120397",
"platform_url": "https://fp.tools/home/search/forums?author_id=oWWKc07zUO-VGKR8BdVohw",
"url": "https://www.sammyboy.com/members/terrexlee.120397"
}
},
{
"Forum": {
"description": "The Sammyboy Times forum",
"hostname": "www.sammyboy.com",
"id": "TTIpsoLTW8m1AKn4qU52sQ",
"legacy_id": null,
"name": "The Sammyboy Times",
"platform_url": "https://fp.tools/home/search/forums?forum_ids=TTIpsoLTW8m1AKn4qU52sQ",
"stats": {
"posts": 459033,
"rooms": 14,
"threads": 21736,
"users": 6571
},
"tags": [
{
"id": 6,
"name": "Cyber Threat",
"parent_tag": null,
"uuid": "09fb6a4a-e072-495d-97bf-d80f059828fd"
},
{
"id": 29,
"name": "English",
"parent_tag": 28,
"uuid": "2fb5aeb5-7afc-4e04-a5bc-465297456ffc"
},
{
"id": 8,
"name": "Hacking",
"parent_tag": 6,
"uuid": "c88a0cd8-a259-46d7-b8b4-b6e0060f16a0"
},
{
"id": 28,
"name": "Language",
"parent_tag": null,
"uuid": "6d6719ac-9ead-4980-a783-1f32ac398e2b"
}
]
},
"PlatformUrl": "https://fp.tools/home/ddw/forums/threads/KPNwvwZVXf-m79AGqquJ8Q?id=pFpDpiKgVWGixxAPKQqsyA",
"PostId": "pFpDpiKgVWGixxAPKQqsyA",
"PublishedAt": "2019-12-18T10:57:00+00:00",
"Room": {
"forum": "/forums/sites/TTIpsoLTW8m1AKn4qU52sQ",
"id": "pVGplbH4XPGMwryH9g8L6g",
"legacy_id": "PB9r4WC8Xh-7vP109JAUZQ",
"native_id": "the-courtyard-caf%C3%A9.2",
"platform_url": "https://fp.tools/home/search/forums?room_title=\"The%20Courtyard%20Caf%C3%A9\"",
"title": "The Courtyard Caf\u00e9",
"url": "forums/the-courtyard-caf%C3%A9.2"
},
"Url": "threads/workforce-sg-wsg-is-a.277557/post-3015451",
"User": {
"id": "42aVe_v5UuidpcA80eekoQ",
"legacy_id": "H16SdxrQVp6pmP-2sBO3lA",
"name": "sweetiepie",
"native_id": "64347",
"platform_url": "https://fp.tools/home/search/forums?author_id=42aVe_v5UuidpcA80eekoQ",
"url": "https://www.sammyboy.com/members/sweetiepie.64347"
}
},
{
"Forum": {
"description": "The Sammyboy Times forum",
"hostname": "www.sammyboy.com",
"id": "TTIpsoLTW8m1AKn4qU52sQ",
"legacy_id": null,
"name": "The Sammyboy Times",
"platform_url": "https://fp.tools/home/search/forums?forum_ids=TTIpsoLTW8m1AKn4qU52sQ",
"stats": {
"posts": 459033,
"rooms": 14,
"threads": 21736,
"users": 6571
},
"tags": [
{
"id": 6,
"name": "Cyber Threat",
"parent_tag": null,
"uuid": "09fb6a4a-e072-495d-97bf-d80f059828fd"
},
{
"id": 29,
"name": "English",
"parent_tag": 28,
"uuid": "2fb5aeb5-7afc-4e04-a5bc-465297456ffc"
},
{
"id": 8,
"name": "Hacking",
"parent_tag": 6,
"uuid": "c88a0cd8-a259-46d7-b8b4-b6e0060f16a0"
},
{
"id": 28,
"name": "Language",
"parent_tag": null,
"uuid": "6d6719ac-9ead-4980-a783-1f32ac398e2b"
}
]
},
"PlatformUrl": "https://fp.tools/home/ddw/forums/threads/CYIQywO-Wx2t-2xWZpBz4w?id=0guT14M-X2ixzc-MuDJPmw",
"PostId": "0guT14M-X2ixzc-MuDJPmw",
"PublishedAt": "2019-12-18T10:49:00+00:00",
"Room": {
"forum": "/forums/sites/TTIpsoLTW8m1AKn4qU52sQ",
"id": "pVGplbH4XPGMwryH9g8L6g",
"legacy_id": "PB9r4WC8Xh-7vP109JAUZQ",
"native_id": "the-courtyard-caf%C3%A9.2",
"platform_url": "https://fp.tools/home/search/forums?room_title=\"The%20Courtyard%20Caf%C3%A9\"",
"title": "The Courtyard Caf\u00e9",
"url": "forums/the-courtyard-caf%C3%A9.2"
},
"Url": "threads/sph-let-go-5-media-staff-as-net-profit-slumps-23-while-ceo-ng-still-paid-in-millions.277529/post-3015450",
"User": {
"id": "r__we_wyX3WZ0MOlSx_MQQ",
"legacy_id": "eve1h4-TU_mnlrgoYPCdqQ",
"name": "Loofydralb",
"native_id": "2174",
"platform_url": "https://fp.tools/home/search/forums?author_id=r__we_wyX3WZ0MOlSx_MQQ",
"url": "https://www.sammyboy.com/members/loofydralb.2174"
}
}
]
}
Human Readable Output
Flashpoint Forum posts related to search: The Courtyard Café
Top 10 posts:
Below are the detail found
| Forum Name | Thread Title | Room Title | Author Name | Platform URL |
|---|---|---|---|---|
| The Sammyboy Times | Fleeting Pleasures… | The Courtyard Café | glockman | https://fp.tools/home/ddw/foru… |
| The Sammyboy Times | smoke on the water, fire in th… | The Courtyard Café | syed putra | https://fp.tools/home/ddw/foru… |
| The Sammyboy Times | [Singapore] - French girl kena… | The Courtyard Café | laksaboy | https://fp.tools/home/ddw/foru… |
| The Sammyboy Times | smoke on the water, fire in th… | The Courtyard Café | laksaboy | https://fp.tools/home/ddw/foru… |
| The Sammyboy Times | smoke on the water, fire in th… | The Courtyard Café | Leongsam | https://fp.tools/home/ddw/foru… |
| The Sammyboy Times | smoke on the water, fire in th… | The Courtyard Café | rambo22 | https://fp.tools/home/ddw/foru… |
| The Sammyboy Times | Fleeting Pleasures… | The Courtyard Café | nightsafari | https://fp.tools/home/ddw/foru… |
| The Sammyboy Times | [Singapore] - French girl kena… | The Courtyard Café | nightsafari | https://fp.tools/home/ddw/foru… |
| The Sammyboy Times | [Singapore] - French girl kena… | The Courtyard Café | nightsafari | https://fp.tools/home/ddw/foru… |
| The Sammyboy Times | HTHT… | The Courtyard Café | Claire | https://fp.tools/home/ddw/foru… |
Follow this link to forum post-search on Flashpoint platform.
flashpoint-alert-list
Retrieves an alert or a list of alerts based on the filter values provided in the command arguments. Yields the alerts from Flashpoint collected sources and the alerts from data exposure.
Base Command
flashpoint-alert-list
Input
| Argument Name | Description | Required |
|---|---|---|
| since | Filters the alerts based on the earliest date when the alerts were created. Formats accepted: 2 minutes, 2 hours, 2 days, 2 weeks, 2 months, 2 years, yyyy-mm-dd, yyyy-mm-ddTHH:MM:SSZ, etc. |
Optional |
| until | Filters the alerts based on the latest date when the alerts were created. Formats accepted: 2 minutes, 2 hours, 2 days, 2 weeks, 2 months, 2 years, yyyy-mm-dd, yyyy-mm-ddTHH:MM:SSZ, etc. |
Optional |
| scroll_id | Retrieves the next batch of alerts (scroll_id retrieved in previous alerts response). | Optional |
| size | Number of alerts to retrieve in the response. (Maximum allowed size is 100). Default is 50. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| Flashpoint.Alerts.alert_id | String | The ID of the alert. |
| Flashpoint.Alerts.fpid | String | The ID of the resource that triggered the alert. |
| Flashpoint.Alerts.keyword.keyword_id | String | The ID of the keyword. |
| Flashpoint.Alerts.keyword.keyword_text | String | The value of the keyword. |
| Flashpoint.Alerts.highlights | Unknown | Snippets of the resource with the keywords highlighted. |
| Flashpoint.Alerts.basetypes | Unknown | The data types of the resource. |
| Flashpoint.Alerts.ts | Number | The timestamp of when the alert was created. |
| Flashpoint.Alerts.tags.archived | Boolean | Whether the alert was archived or not. |
| Flashpoint.Alerts.tags.flagged | Boolean | Whether the alert was starred or not. |
| Flashpoint.Alerts.source.basetypes | Unknown | The data types of the resource. |
| Flashpoint.Alerts.source.body.text/plain | String | The body of the alert in text/plain format. |
| Flashpoint.Alerts.source.container.basetypes | Unknown | The data types for the thread or channel in which the content was posted. |
| Flashpoint.Alerts.source.container.container.title | String | The title of the container. |
| Flashpoint.Alerts.source.container.container.name | String | The name of the container. |
| Flashpoint.Alerts.source.container.fpid | String | The ID of the thread or channel in which the content was posted. |
| Flashpoint.Alerts.source.container.title | String | The title of the thread or channel in which the content was posted. |
| Flashpoint.Alerts.source.created_at.date-time | Date | When the content was originally posted by its author. |
| Flashpoint.Alerts.source.created_at.raw | String | When the content was originally posted by its author, as raw format. |
| Flashpoint.Alerts.source.created_at.timestamp | Number | When the content was originally posted by its author, as a timestamp. |
| Flashpoint.Alerts.source.first_observed_at.date-time | Date | The first time this piece of data was observed by Flashpoint. |
| Flashpoint.Alerts.source.first_observed_at.raw | String | The first time this piece of data was observed by Flashpoint, as raw format. |
| Flashpoint.Alerts.source.first_observed_at.timestamp | Number | The first time this piece of data was observed by Flashpoint, as a timestamp. |
| Flashpoint.Alerts.source.fpid | String | The ID of the resource. |
| Flashpoint.Alerts.source.last_observed_at.date-time | Date | The last time this piece of data was observed by Flashpoint. |
| Flashpoint.Alerts.source.last_observed_at.raw | String | The last time this piece of data was observed by Flashpoint, as raw format. |
| Flashpoint.Alerts.source.last_observed_at.timestamp | Number | The last time this piece of data was observed by Flashpoint, as a timestamp. |
| Flashpoint.Alerts.source.native_id | String | The ID used by the original site for the resource. |
| Flashpoint.Alerts.source.parent_message._schema | String | The schema of the parent of this resource. |
| Flashpoint.Alerts.source.parent_message.basetypes | Unknown | The data types of the parent of this resource. |
| Flashpoint.Alerts.source.parent_message.fpid | String | The ID of the parent of this resource. |
| Flashpoint.Alerts.source.parent_message.native_id | String | The ID used by the original site for the parent of this resource. |
| Flashpoint.Alerts.source.parent_message.type | String | The type of the parent of this resource. |
| Flashpoint.Alerts.source.site.title | String | The original site or platform where the resource was published. |
| Flashpoint.Alerts.source.site_actor.names.aliases | Unknown | The alias of the user who created the message, authored the blog post, or posted a product for sale. |
| Flashpoint.Alerts.source.site_actor.names.handle | String | The handle of the user who created the message, authored the blog post, or posted a product for sale. |
| Flashpoint.Alerts.source.sort_date | Date | Sort date of the alert. |
| Flashpoint.Alerts.source.title | String | The title of the alert. |
| Flashpoint.Alerts.source.file | String | File name for the matched alert. |
| Flashpoint.Alerts.source.owner | String | Author of the repo. |
| Flashpoint.Alerts.source.repo | String | Repository name. |
| Flashpoint.Alerts.source.snippet | String | Small blob of code/text that matched the keyword. |
| Flashpoint.Alerts.source.source | String | Code repository platform. |
| Flashpoint.Alerts.source.url | String | Link to the alerted source. |
| Flashpoint.PageToken.Alert.scroll_id | String | The scroll_id for the next page. |
| Flashpoint.PageToken.Alert.size | String | The size for the next page. |
| Flashpoint.PageToken.Alert.since | String | The since date for the next page. |
| Flashpoint.PageToken.Alert.until | String | The until date for the next page. |
| Flashpoint.PageToken.Alert.name | String | The command name. |
Command Example
!flashpoint-alert-list
Context Example
{
"Flashpoint": {
"Alerts": [
{
"alert_id": "dummy_alert_id1",
"fpid": "dummy_fpid1",
"keyword": {
"keyword_id": "88120cf3-c015-47c9-b8ed-70770ba9c273",
"keyword_text": "\"user manager\""
},
"highlights": [
"Jul 06 14:08:40 rancher systemd[1]: Starting <x-fp-highlight>User</x-fp-highlight> <x-fp-highlight>Manager</x-fp-highlight> for UID 0...",
"Jul 06 14:08:40 rancher systemd[1]: Started <x-fp-highlight>User</x-fp-highlight> <x-fp-highlight>Manager</x-fp-highlight> for UID 0. Jul 06 14:08:40 rancher systemd[1]: Started Session 1 of user root."
],
"basetypes": [
"paste",
"post"
],
"ts": 1625589846.960317,
"tags": {
"archived": false,
"flagged": false
},
"source": {
"basetypes": [
"paste",
"post"
],
"body": {
"text/plain": "-- Logs begin at Tue 2021-07-06 14:08:15 UTC, end at Tue 2021-07-06 14:13:52 UTC. --\r Jul 06 14:08:15 localhost kernel: Linux version 5.3.18-57-default (geeko@buildhost) (gcc version 7.5.0 (SUSE Linux)) #1 SMP Wed Apr 28 10:54:41 UTC 2021 (ba3c2e9)\r Jul 06 14:08:15 localhost kernel: Command line: BOOT_IMAGE=(loop0)/boot/vmlinuz console=tty1 console=ttyS0 root=LABEL=COS_ACTIVE cos-img/filename=/cOS/active.img panic=5\r Jul 06 14:08:15 localhost kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'\r Jul 06 14:08:15 localhost kernel: x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'\r Jul 06 14:08:15 localhost kernel: x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers'\r Jul 06 14:08:15 localhost kernel: x86/fpu: xstate_offset[2]: 576, xstate_sizes[2]: 256\r Jul 06 14:08:15 localhost kernel: x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'compacted' format.\r Jul 06 14:08:15 localhost kernel: BIOS-provided physical RAM map:\r Jul 06 14:08:15 localhost kernel: BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable\r Jul 06 14:08:15 localhost kernel: BIOS-e820: [mem 0x000000000009fc00-0x000000000009ffff] reserved\r Jul 06 14:08:15 localhost kernel: BIOS-e820: [mem 0x00000000000f0000-0x00000000000fffff] reserved\r Jul 06 14:08:15 localhost kernel: BIOS-e820: [mem 0x0000000000100000-0x00000000bffdafff] usable\r Jul 06 14:08:15 localhost kernel: BIOS-e820: [mem 0x00000000bffdb000-0x00000000bfffffff] reserved\r Jul 06 14:08:15 localhost kernel: BIOS-e820: [mem 0x00000000feffc000-0x00000000feffffff] reserved\r Jul 06 14:08:15 localhost kernel: BIOS-e820: [mem 0x00000000fffc0000-0x00000000ffffffff] reserved\r Jul 06 14:08:15 localhost kernel: BIOS-e820: [mem 0x0000000100000000-0x000000023fffffff] usable\r Jul 06 14:08:15 localhost kernel: NX (Execute Disable) protection: active\r Jul 06 14:08:15 localhost kernel: SMBIOS 2.8 present.\r Jul 06 14:08:15 localhost kernel: DMI: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.14.0-0-g155821a-rebuilt.opensuse.org 04/01/2014\r Jul 06 14:08:15 localhost kernel: Hypervisor detected: KVM\r Jul 06 14:08:15 localhost kernel: kvm-clock: Using msrs 4b564d01 and 4b564d00\r Jul 06 14:08:15 localhost kernel:"
},
"container": {
"basetypes": [
"conversation",
"web",
"forum",
"container",
"thread"
],
"container": {
"title": "Software"
},
"fpid": "dummy_source_container_fpid",
"title": "Changalab-v1-1-Cryptocurrency-Exchange-Platform"
},
"created_at": {
"date-time": "2021-07-06T14:44:47+00:00",
"raw": "2021-07-06 14:44:47+00:00",
"timestamp": 1625582687
},
"first_observed_at": {
"date-time": "2021-07-06T16:43:51+00:00",
"raw": "1625589831.118695",
"timestamp": 1625589831
},
"fpid": "dummy_source_fpid",
"last_observed_at": {
"date-time": "2021-07-06T16:43:51+00:00",
"raw": "1625589831.118695",
"timestamp": 1625589831
},
"native_id": "ycURa34C",
"parent_message": {
"basetypes": [
"conversation",
"chan",
"web",
"comment",
"message"
],
"fpid": "dummy_parent_message_fpid",
"native_id": "82092804",
"type": "parent_comment"
},
"site": {
"title": "pastebin.com"
},
"site_actor": {
"names": {
"aliases": [
"a guest"
],
"handle": "a guest"
}
},
"sort_date": "2021-07-06T14:44:47Z",
"title": "Untitled"
}
},
{
"alert_id": "dummy_alert_id2",
"basetypes": [
"code",
"file",
"github",
"repository"
],
"fpid": "dummy_fpid2",
"highlights": [
"Contribute to <x-fp-highlight>onelogin</x-fp-highlight>/<x-fp-highlight>onelogin</x-fp-highlight>-java-sdk development by creating an account on GitHub."
],
"keyword": {
"keyword_id": "dummy_keyword_id2",
"keyword_text": "\"onelogin\""
},
"source": {
"basetypes": [
"code",
"file",
"github",
"repository"
],
"file": "dummy_file1",
"fpid": "dummy_source_fpid2",
"owner": "onelogin",
"repo": "dummy_repo1",
"snippet": "Contribute to onelogin/onelogin-java-sdk development by creating an account on GitHub.",
"source": "github",
"url": "dummy_url"
},
"tags": {
"archived": false,
"flagged": true
},
"ts": 1627491367.66599
}
],
"PageToken": {
"Alert": {
"name": "flashpoint-alert-list",
"scroll_id": "dummy_scroll_id",
"since": "2021-06-16T02:22:14Z",
"size": "10",
"until": "2021-06-16T02:45:00Z"
}
}
}
}
Human Readable Output
Alerts from Flashpoint collected sources
| FPID | Keyword Text | Site Title | Created Date (UTC) | Last Observed Date (UTC) |
|---|---|---|---|---|
| dummy_fpid1 | “user manager” | pastebin.com | July 6, 2021 14:44 | July 6, 2021 16:43 |
| dummy_fpid2 | “user manager” | pastebin.com | July 6, 2021 10:35 | July 6, 2021 15:55 |
Alerts with data exposures
| FPID | Keyword Text | File | Owner | Repo | Source |
|---|---|---|---|---|---|
| dummy_fpid1 | “onelogin” | dummy_file1 | onelogin | dummy_repo1 | github |
| dummy_fpid2 | “onelogin” | dummy_file2 | onelogin | dummy_repo2 | github |
To retrieve the next set of result use,
scroll_id = dummy_scroll_id
since = 2021-06-16T02:22:14Z
size = 1
until = 2021-06-16T02:45:00Z
flashpoint-compromised-credentials-list
Retrieves the compromised credentials based on the filter values provided in the command arguments.
Base Command
flashpoint-compromised-credentials-list
Input
| Argument Name | Description | Required |
|---|---|---|
| start_date | Filters the data based on the start date of the breach (UTC). Note: Will consider current time as default for end_date if start_date is initialized. Formats accepted: 2 minutes, 2 hours, 2 days, 2 weeks, 2 months, 2 years, yyyy-mm-dd, yyyy-mm-ddTHH:MM:SSZ, etc. |
Optional |
| end_date | Filters the data based on the end date of the breach (UTC). Note: Requires start_date along with the given argument. Formats accepted: 2 minutes, 2 hours, 2 days, 2 weeks, 2 months, 2 years, yyyy-mm-dd, yyyy-mm-ddTHH:MM:SSZ, etc. |
Optional |
| filter_date | Filters the compromised credential’s breach data by either created or first observed date. Note: Requires the argument value for at least ‘start_date’ and ‘end_date’. Possible values are: created_at, first_observed_at. |
Optional |
| page_size | The maximum number of result objects to return per page. Note: The maximum value is 1,000. Default is 50. | Optional |
| page_number | Specify a page number to retrieve the compromised credentials. Note: The multiplication of page_size and page_number parameters cannot exceed 10,000. Default is 1. | Optional |
| sort_date | Sort the compromised credential’s breach data by either created or first observed date. Note: Will consider ascending as default for sort_order if sort_date is initialized. Possible values are: created_at, first_observed_at. | Optional |
| sort_order | Specify the order to sort the data in. Note: Requires sort_date along with the given argument. Possible values are: asc, desc. | Optional |
| is_fresh | Whether to fetch the fresh compromised credentials or not. Possible values are: true, false. Possible values are: true, false. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| Flashpoint.CompromisedCredential._id | String | ID of the IoC. |
| Flashpoint.CompromisedCredential._source.affected_domain | String | Affected domain of the IoC. |
| Flashpoint.CompromisedCredential._source.basetypes | Unknown | The array contains the underlying type of the credentials object, in this case [“credential-sighting”]. |
| Flashpoint.CompromisedCredential._source.body.raw | String | This is the raw content captured from the breach Flashpoint discovered. |
| Flashpoint.CompromisedCredential._source.breach._header | String | This is the breach header object. |
| Flashpoint.CompromisedCredential._source.breach.basetypes | Unknown | Array containing underlying base type of breach object, i.e. [“breach”]. |
| Flashpoint.CompromisedCredential._source.breach.breach_type | String | Constant for future use. |
| Flashpoint.CompromisedCredential._source.breach.created_at.date-time | Date | Datetime object formatted as YYYY-mm-ddTHH:MM:SSZ. |
| Flashpoint.CompromisedCredential._source.breach.created_at.timestamp | Number | UNIX timestamp. |
| Flashpoint.CompromisedCredential._source.breach.first_observed_at.date-time | Date | Datetime object formatted as YYYY-mm-ddTHH:MM:SSZ. |
| Flashpoint.CompromisedCredential._source.breach.first_observed_at.timestamp | Number | UNIX timestamp. |
| Flashpoint.CompromisedCredential._source.breach.fpid | String | Flashpoint ID of the breach. |
| Flashpoint.CompromisedCredential._source.breach.source | String | Data source of breach (i.e. Analyst Research, CredentialStealer, etc.). |
| Flashpoint.CompromisedCredential._source.breach.source_type | String | Type of source of the breach. |
| Flashpoint.CompromisedCredential._source.breach.title | String | Title of breach. |
| Flashpoint.CompromisedCredential._source.breach.victim | String | Victim of the breach. |
| Flashpoint.CompromisedCredential._source.credential_record_fpid | String | This is the Flashpoint ID of the associated record object. This is used to retrieve sightings for a credential. |
| Flashpoint.CompromisedCredential._source.customer_id | String | Customer ID of the IoC. |
| Flashpoint.CompromisedCredential._source.domain | String | This is the domain object extracted off of the email address. |
| Flashpoint.CompromisedCredential._source.email | String | The email address for the compromised credential. |
| Flashpoint.CompromisedCredential._source.extraction_id | String | Extraction ID of the IoC. |
| Flashpoint.CompromisedCredential._source.extraction_record_id | String | Extraction record ID of the IoC. |
| Flashpoint.CompromisedCredential._source.fpid | String | The Flashpoint ID of this credentials object. |
| Flashpoint.CompromisedCredential.source.header.indexed_at | String | Timestamp for when this document was indexed into the Flashpoint database. |
| Flashpoint.CompromisedCredential.source.header.pipeline_duration | String | Pipeline duration header information of the IoC. |
| Flashpoint.CompromisedCredential._source.is_fresh | Boolean | This will be “true” if the credential has not been seen before, and it hasn’t been marked “not fresh” by an analyst. (Historical breaches are not “fresh”.). |
| Flashpoint.CompromisedCredential._source.last_observed_at.date-time | Date | If exists, time object for when the credential was previously observed. Datetime object formatted as YYYY-mm-ddTHH:MM:SSZ. |
| Flashpoint.CompromisedCredential._source.last_observed_at.timestamp | Number | UNIX timestamp. |
| Flashpoint.CompromisedCredential._source.password | String | The password for the credential (in plain text, if possible). |
| Flashpoint.CompromisedCredential._source.password_complexity.has_lowercase | Boolean | Boolean true/false if lowercase letters are present. |
| Flashpoint.CompromisedCredential._source.password_complexity.has_number | Boolean | Boolean true/false if numbers are present. |
| Flashpoint.CompromisedCredential._source.password_complexity.has_symbol | Boolean | Boolean true/false if symbols are present. |
| Flashpoint.CompromisedCredential._source.password_complexity.has_uppercase | Boolean | Boolean true/false if uppercase letters are present. |
| Flashpoint.CompromisedCredential._source.password_complexity.length | Number | Integer value that represents number of characters in password. |
| Flashpoint.CompromisedCredential._source.password_complexity.probable_hash_algorithms | Unknown | List of possible hash algorithms suspected based on textpattern of the password (May include values like “MD5”, “SHA-1”, “SHA-256”, “bcrypt”, etc.) |
| Flashpoint.CompromisedCredential._source.times_seen | Number | Integer representing the number of times the credential has been seen at Flashpoint. |
| Flashpoint.CompromisedCredential._type | String | Type of the IoC. |
| Flashpoint.CompromisedCredential.matched_queries | Unknown | Matching queries of the IoC. |
| Flashpoint.CompromisedCredential.sort | Unknown | Sort value of the IoC. |
Command Example
!flashpoint-compromised-credentials-list
Context Example
{
"Flashpoint": {
"CompromisedCredential": [
{
"_id": "dummy_id1",
"_source": {
"affected_domain": "learnable.com",
"basetypes": [
"credential-sighting"
],
"body": {
"raw": "magnov69gmail.com@example.com:$2a$10$Riq2qdHlq6ULnOaDJl52v.42X2dUGEmxeWcxmnP/51zq2ZDJ2I0uW"
},
"breach": {
"basetypes": [
"breach"
],
"breach_type": "credential",
"created_at": {
"date-time": "2021-01-26T12:00:00Z",
"timestamp": 1611662400
},
"first_observed_at": {
"date-time": "2021-01-27T18:50:36Z",
"timestamp": 1611773436
},
"fpid": "dummy_breach_fpid1",
"source": "Analyst Research",
"source_type": "Analyst Research",
"title": "Compromised Users from Learnable.com Jan262021",
"victim": "learnable.com"
},
"credential_record_fpid": "dummy_credential_record_fpid1",
"customer_id": "dummy_customer_id1",
"domain": "example.com",
"email": "dummy_email1",
"extraction_id": "u2iZ8ht-Xnyx8SMdKpksDg",
"extraction_record_id": "DJyV6XgsUeGUpwl_CXWnOw",
"fpid": "dummy_source_fpid1",
"header_": {
"indexed_at": 1617221192,
"pipeline_duration": 63791896256
},
"is_fresh": true,
"last_observed_at": {
"date-time": "2021-01-27T18:50:36Z",
"timestamp": 1611773436
},
"password": "dummy_password1",
"password_complexity": {
"has_lowercase": true,
"has_number": true,
"has_symbol": true,
"has_uppercase": true,
"length": 60,
"probable_hash_algorithms": [
"Blowfish(OpenBSD)",
"Woltlab Burning Board 4.x",
"bcrypt"
]
},
"times_seen": 1
},
"_type": "_doc",
"matched_queries": [
"dat.edm.org.r"
],
"sort": [
-9223372036854775808
]
},
{
"_id": "dummy_fpid2",
"_source": {
"basetypes": [
"credential-sighting"
],
"body": {
"raw": "admin@example.com:FSBQy5uiServer"
},
"breach": {
"basetypes": [
"breach"
],
"breach_type": "credential",
"created_at": {
"date-time": "2021-03-17T12:24:39Z",
"timestamp": 1615983879
},
"first_observed_at": {
"date-time": "2021-03-17T12:24:39Z",
"timestamp": 1615983879
},
"fpid": "dummy_breach_fpid2",
"source": "https://www.virustotal.com/gui/file/013cd8ffff502cba3b413a480d7f42f353b03388e764b8705de56d6ee7fefbba/details",
"source_type": "VirusTotal",
"title": "Compromised Users from VirusTotal: Compressed File \"013cd8ffff502cba3b413a480d7f42f353b03388e764b8705de56d6ee7fefbba\" Mar172021"
},
"credential_record_fpid": "dummy_credential_record_fpid2",
"customer_id": "dummy_customer_id2",
"domain": "example.com",
"email": "dummy_email2",
"extraction_id": "9Yl03sZsXZaJjYNc7ozSrQ",
"extraction_record_id": "3kPIO4i1W9-SMtYdGPZ_yw",
"fpid": "dummy_source_fpid2",
"header_": {
"indexed_at": 1617219857,
"pipeline_duration": 63791896269
},
"is_fresh": true,
"last_observed_at": {
"date-time": "2021-03-17T12:24:39Z",
"timestamp": 1615983879
},
"password": "dummy_password2",
"password_complexity": {
"has_lowercase": true,
"has_number": true,
"has_symbol": false,
"has_uppercase": true,
"length": 14,
"probable_hash_algorithms": [
"BigCrypt"
]
},
"times_seen": 1
},
"_type": "_doc",
"matched_queries": [
"dat.edm.org.r"
],
"sort": [
-9223372036854775808
]
}
]
}
}
Human Readable Output
Total number of records found: 1302
Compromised Credential(s)
| FPID | Breach Source | Breach Source Type | Password | Created Date (UTC) | First Observed Date (UTC) | |
|---|---|---|---|---|---|---|
| dummy_fpid1 | dummy_email1 | Analyst Research | Analyst Research | dummy_password1 | Jan 26, 2021 12:00 | Jan 27, 2021 18:50 |
| dummy_fpid2 | dummy_email2 | https://www.virustotal.com/gui/file/0e59531d9ebf1d695cb41c1afd443c22bfaef56dafa636c2cf157deb19b679fe/details | VirusTotal | dummy_password2 | Jun 6, 2021 20:47 | Jun 6, 2021 20:47 |
Configuration parameters
isFetch— Fetch incidentsincidentType— Incident typeurl— Server URL (required)api_key— API Key (required)max_fetch— Maximum number of incidents per fetchfirst_fetch— First fetch time intervalfetch_type— Fetch Typeis_fresh_compromised_credentials— Fetch fresh compromised credentials alertsinsecure— Trust any certificate (not secure)proxy— Use system proxy settingscreate_relationships— Create relationshipsintegrationReliability— Source ReliabilityfeedExpirationPolicy—feedExpirationInterval—
Commands (20)
-
domainLookup the "Domain" type indicator details. The reputation of Domain is considered Malicious if there's at least one IOC event in Flashpoint database matching the Domain indicator.
-
emailLookup the "Email" type indicator details. The reputation of Email is considered Malicious if there's at least one IOC event in Flashpoint database matching the Email indicator.
-
fileLookup the "File" type indicator details. The reputation of File-hash is considered Malicious if there's at least one IOC event in Flashpoint database matching the File-hash indicator.
-
filenameLookup the "Filename" type indicator details. The reputation of Filename is considered Malicious if there's at least one IOC event in Flashpoint database matching the Filename indicator.
-
flashpoint-alert-listRetrieves an alert or a list of alerts based on the filter values provided in the command arguments. Yields the alerts from Flashpoint collected sources and the alerts from data exposure.
-
flashpoint-common-lookupLookup any type of indicator.
-
flashpoint-compromised-credentials-listRetrieves the compromised credentials based on the filter values provided in the command arguments.
-
flashpoint-get-eventsSearches for events within the specified time-period, the report fpid, or attack IDs.
-
flashpoint-get-forum-detailsRetrieves forum details using the forum ID. To retrieve the forum ID run the flashpoint-search-forum-posts command and see the value under the following context paths, Flashpoint.Forum.ForumId or Flashpoint.Forum.Post.Forum.id.
-
flashpoint-get-forum-post-detailsRetrieves post details using the post-id. To retrieve the post ID, run the flashpoint-search-forum-posts command and see the value under the Flashpoint.Forum.Post.PostId context path. command or some other investigation.
-
flashpoint-get-forum-room-detailsRetrieves forum room details using the room ID. To retrieve the room ID run the flashpoint-search-forum-posts command and see the value under the Flashpoint.Forum.Post.Room.id context path.
-
flashpoint-get-forum-user-detailsRetrieves user details using the user-id. To retrieve the user ID, run the flashpoint-search-forum-posts command and see the value under the Flashpoint.Forum.Post.User.id context path.
-
flashpoint-get-related-reportsGet related reports for a particular report using the report-id. The report id can be known from output context path (Flashpoint.Report.ReportId) of report-search command or some other investigation.
-
flashpoint-get-single-eventRetrieves the details of a single event using event UUID or FPID. To retrieve the event id, run the get-events command and see the value under the Flashpoint.Event.EventId context path. or indicator reputation command response or some other investigation.
-
flashpoint-get-single-intelligence-reportGet single report details using the report id. The report id can be known from output context path (Flashpoint.Report.ReportId) of report-search command or some other investigation.
-
flashpoint-search-forum-postsSearch forum posts using a keyword.
-
flashpoint-search-forum-sitesSearches forum sites using a keyword. it will search in site content like name, title, descripion etc.
-
flashpoint-search-intelligence-reportsSearch for the Intelligence Reports using a keyword.
-
ipLooks up details of an IP indicator. The reputation of the IP address is considered malicious if there's at least one IOC event in the Flashpoint database that matches the IP indicator. Alternatively, the IP address is considered suspicious if it matches any one of the Torrent's Peer IP Address or Forum Visit's Peer IP Address.
-
urlLookup the "URL" type indicator details. The reputation of Url is considered Malicious if there's at least one IOC event in Flashpoint database matching the Url indicator.
"""Flashpoint Main File.""" from CommonServerPython import * import re import ipaddress import requests import urllib.parse from typing import Dict, Tuple, List, Any import urllib3 urllib3.disable_warnings() """ CONSTANTS """ INTEGRATION_VERSION = "v1.3.3" INTEGRATION_PLATFORM = "XSOAR Cortex" FIRST_FETCH = "3 days" MAX_FETCH = 15 DEFAULT_PAGE_SIZE = 50 MAX_PAGE_SIZE = 1000 MAX_PRODUCT = 10000 DEFAULT_SORT_ORDER = 'asc' DEFAULT_FETCH_TYPE = 'Compromised Credentials' DATE_FORMAT = '%Y-%m-%dT%H:%M:%SZ' # ISO8601 format with UTC, default in XSOAR READABLE_DATE_FORMAT = '%b %d, %Y %H:%M' BRAND = 'Flashpoint' IS_FRESH_VALUES = ['true', 'false'] SORT_ORDER_VALUES = ['asc', 'desc'] SORT_DATE_VALUES = ['created_at', 'first_observed_at'] FILTER_DATE_VALUES = ['created_at', 'first_observed_at'] DATE_OBSERVED = "Date Observed (UTC)" STRING_FORMAT = "[{}]({})" TIME_OBSERVED = "Observed time (UTC)" QUERY = r'+type:("ip-src","ip-dst","ip-dst|port") +value.\*:"' HR_TITLE = '### Flashpoint IP address reputation for ' REPUTATION_MALICIOUS = 'Reputation: Malicious\n\n' TABLE_TITLE = 'Events in which this IOC observed' ALL_DETAILS_LINK = '\nAll events and details (fp-tools): [{}]({})\n' MALICIOUS_DESCRIPTION = 'Found in malicious indicators dataset' STIX_ATTACK_PATTERN = 'STIX Attack Pattern' REPUTATION_UNKNOWN = 'Reputation: Unknown\n\n' FORUM_NAME = 'Forum Name' ROOM_TITLE = 'Room Title' AUTHOR_NAME = 'Author Name' THREAD_TITLE = 'Thread Title' FLASHPOINT_PATHS = { 'IP': 'Flashpoint.IP.Event(val.Fpid && val.Fpid == obj.Fpid)', 'Url': 'Flashpoint.URL.Event(val.Fpid && val.Fpid == obj.Fpid)', 'Domain': 'Flashpoint.Domain.Event(val.Fpid && val.Fpid == obj.Fpid)', 'Email': 'Flashpoint.Email.Event(val.Fpid && val.Fpid == obj.Fpid)', 'File': 'Flashpoint.File.Event(val.Fpid && val.Fpid == obj.Fpid)', 'Filename': 'Flashpoint.Filename.Event(val.Fpid && val.Fpid == obj.Fpid)', 'Event': 'Flashpoint.Event(val.EventId == obj.EventId)', 'Report': 'Flashpoint.Report(val.ReportId == obj.ReportId)', 'Forum': 'Flashpoint.Forum(val.ForumId == obj.ForumId)', 'Room': 'Flashpoint.Forum.Room(val.RoomId == obj.RoomId)', 'User': 'Flashpoint.Forum.User(val.UserId == obj.UserId)', 'Post': 'Flashpoint.Forum.Post(val.PostId == obj.PostId)', 'Site': 'Flashpoint.Forum.Site(val.SiteId == obj.SiteId)', 'ALERT': 'Flashpoint.Alerts(val.alert_id == obj.alert_id && val.fpid == obj.fpid)', 'TOKEN': 'Flashpoint.PageToken.Alert(val.name == obj.name)', } URL_SUFFIX = { 'COMPROMISED_CREDENTIALS': '/all/search' } URL_SUFFIX_V1 = { 'ALERTS': '/api/alerting/v1/alerts' } MESSAGES = { "INVALID_MAX_FETCH": "{} is an invalid value for maximum fetch. Maximum fetch must be between 1 to 100 for alerts " "and between 1 to 1000 for compromised credentials.", "INVALID_FIRST_FETCH": "Argument 'First fetch time interval' should be a valid date or relative timestamp such as " "'2 days', '2 months', 'yyyy-mm-dd', 'yyyy-mm-ddTHH:MM:SSZ'", "SIZE_ERROR": "{} is an invalid value for size. Size must be between 1 to 100.", "NO_RECORDS_FOUND": "No {} were found for the given argument(s).", "PAGE_SIZE_ERROR": "{} is an invalid value for the page size. The page size must be between 1 to {}.", "PAGE_NUMBER_ERROR": "{} is an invalid value for the page number. The page number must be greater than 0.", "PRODUCT_ERROR": "The multiplication of the page_size and the page_number parameters cannot exceed {}. " "Current multiplication is {}.", "START_DATE_ERROR": "Requires the start_date argument along with the end_date argument.", "FILTER_DATE_ERROR": "{} is an invalid value for filter date. Filter date value must be of {}.", "SORT_DATE_ERROR": "{} is an invalid value for the sort date. The sort date value must be of {}.", "SORT_ORDER_ERROR": "{} is an invalid value for the sort order. The sort order value must be of {}.", "MISSING_DATE_ERROR": "Requires the argument value for at least the 'start_date' argument.", "MISSING_FILTER_DATE_ERROR": "Requires the filter_date argument's value when the start_date or the " "end_date argument is provided.", "MISSING_SORT_DATE_ERROR": "Requires sort_date value when sort_order is provided.", "IS_FRESH_ERROR": "{} is an invalid value for is fresh. Is fresh value must be of {}.", "MISSING_DATA": "{} response contains incorrect or missing data.", "TIME_RANGE_ERROR": "The maximum records to fetch in first fetch can not exceed 10000. Current records are {}. " "Try decreasing the time interval." } class Client: """ Client to use in integration with powerful http_request. :type api_key: ``str`` :param api_key: Use to authenticate request in header :type url: ``str`` :param url: Base server address with suffix, for example: https://example.com. :type verify: ``Boolean`` :param verify: Use to indicate secure/insecure http request :type proxies: ``dict`` :param proxies: proxies dict for http request :type create_relationships: ``bool`` :param create_relationships: True if integration will create relationships :return response of request :rtype ``dict`` """ def __init__(self, api_key, url, verify, proxies, create_relationships): """Initialize class object.""" self.url = url self.api_key = api_key self.verify = verify self.proxies = proxies self.create_relationships = create_relationships def http_request(self, method, url_suffix, params=None): """ Get http response based on url and given parameters. :param method: Specify http methods :param url_suffix: url encoded url suffix :param params: None :return: http response on json """ base_url = self.url + "/api/v4" full_url = base_url + url_suffix # over writing full URL as we are adding support for v1 endpoints if url_suffix in URL_SUFFIX_V1.values(): full_url = self.url + url_suffix headers = { 'Authorization': f"Bearer {self.api_key}", 'X-FP-IntegrationPlatform': INTEGRATION_PLATFORM, 'X-FP-IntegrationPlatformVersion': get_demisto_version_as_str(), 'X-FP-IntegrationVersion': INTEGRATION_VERSION } resp = requests.request( method, full_url, verify=self.verify, proxies=self.proxies, params=params, headers=headers ) status_code = resp.status_code resp_json = resp.json() if status_code != 200: if status_code == 400: raise ValueError( "Invalid argument value while trying to get information from Flashpoint: " + resp_json.get( 'detail', resp_json.get('message', 'N/A'))) elif status_code == 401: raise ValueError( "Encountered error while trying to get information from Flashpoint: Invalid API Key is " "configured") elif status_code == 404: raise ValueError("No record found for given argument(s): Not Found") elif status_code in (521, 403): raise ValueError("Test connectivity failed. Please provide valid input parameters.") else: resp.raise_for_status() return resp_json ''' HELPER FUNCTIONS ''' def get_apikey(): """Get API Key from the command argument.""" api_key = demisto.params()["api_key"] return api_key def get_url_suffix(query): """ Create url-suffix using the query value with url encoding. :param query: value of query param :return: url-encoded url-suffix """ return r'/indicators/simple?query=' + urllib.parse.quote(query.encode('utf8')) def prepare_args_for_fetch_alerts(max_fetch: int, start_time: str, last_run: dict) -> dict: """ Prepare arguments for fetching alerts. :param max_fetch: Maximum number of incidents per fetch :param start_time: Date time to start fetching incidents from :param last_run: Dictionary containing last run objects :return: Dictionary of fetch arguments """ fetch_params: Dict[str, Any] = {} if max_fetch < 1 or max_fetch > 100: raise ValueError(MESSAGES['INVALID_MAX_FETCH'].format(max_fetch)) fetch_params['size'] = max_fetch fetch_params['since'] = last_run.get('since', start_time) fetch_params['scroll_id'] = last_run.get('scroll_id') return fetch_params def prepare_args_for_fetch_compromised_credentials(max_fetch: int, start_time: str, is_fresh: bool, last_run: dict) -> dict: """ Prepare arguments for fetching compromised credentials. :param max_fetch: Maximum number of incidents per fetch :param start_time: Date time to start fetching incidents from :param is_fresh: Boolean value showing whether to fetch the fresh compromised credentials or not :param last_run: Dictionary containing last run objects :return: Dictionary of fetch arguments """ fetch_params: Dict[str, Any] = {} if max_fetch < 1 or max_fetch > MAX_PAGE_SIZE: raise ValueError(MESSAGES['INVALID_MAX_FETCH'].format(max_fetch)) fetch_params['limit'] = max_fetch if not last_run.get('fetch_count'): last_run['fetch_count'] = 0 if not last_run.get('fetch_sum'): last_run['fetch_sum'] = 0 fetch_params['skip'] = last_run['fetch_sum'] total = last_run.get('total') if total: fetch_sum = fetch_params['limit'] + fetch_params['skip'] if fetch_sum > total: fetch_params['limit'] = total - fetch_params['skip'] last_run['fetch_sum'] = fetch_params['limit'] + fetch_params['skip'] start_time = arg_to_datetime(start_time) start_time = datetime.timestamp(start_time) # type: ignore if last_run['fetch_count'] == 0: end_time = arg_to_datetime('now') last_run['end_time'] = end_time.strftime(DATE_FORMAT) # type: ignore else: end_time = last_run['end_time'] end_time = arg_to_datetime(end_time) end_time = datetime.timestamp(end_time) # type: ignore query = '+basetypes:(credential-sighting)' query += f' +header_.indexed_at: [{int(start_time)} TO {int(end_time)}]' # type: ignore if is_fresh: query += ' +is_fresh:true' fetch_params['query'] = query fetch_params['sort'] = 'header_.indexed_at:asc' return fetch_params def validate_fetch_incidents_params(params: dict, last_run: dict) -> Dict: """ Validate the parameter list for fetch incidents. :param params: Dictionary containing demisto configuration parameters :param last_run: last run returned by function demisto.getLastRun :return: Dictionary containing validated configuration parameters in proper format. """ fetch_params = {} fetch_type = params.get('fetch_type', DEFAULT_FETCH_TYPE) if not fetch_type: fetch_type = DEFAULT_FETCH_TYPE first_fetch = arg_to_datetime(params.get('first_fetch', FIRST_FETCH)) if first_fetch is None: raise ValueError(MESSAGES['INVALID_FIRST_FETCH']) start_time = first_fetch.strftime(DATE_FORMAT) if last_run and 'start_time' in last_run: start_time = last_run.get('start_time') # type: ignore is_fresh = argToBoolean(params.get('is_fresh_compromised_credentials', 'true')) max_fetch = arg_to_number(params.get('max_fetch', MAX_FETCH)) if max_fetch is None: raise ValueError(MESSAGES['INVALID_MAX_FETCH'].format(max_fetch)) if fetch_type == 'Alerts': fetch_params = prepare_args_for_fetch_alerts(max_fetch, start_time, last_run) elif fetch_type == DEFAULT_FETCH_TYPE: fetch_params = prepare_args_for_fetch_compromised_credentials(max_fetch, start_time, is_fresh, last_run) # type: ignore remove_nulls_from_dictionary(fetch_params) return { 'fetch_type': fetch_type, 'start_time': start_time, 'fetch_params': fetch_params } def parse_indicator_response(indicators): """ Extract Flashpoint event details and href values from each of the indicator in an indicator list. :param indicators: list of indicators :return: dict containing event details and href """ events = [] hrefs = [] attack_ids = [] for indicator in indicators: hrefs.append(indicator.get('Attribute', {}).get('href', '')) event = indicator.get('Attribute', {}).get('Event', {}) attack_ids = event.get('attack_ids', []) tags_list = [tag for tag in event['Tags']] tags_value = ', '.join(tags_list) observed_time = time.strftime(READABLE_DATE_FORMAT, time.gmtime(float(event['timestamp']))) events.append({ DATE_OBSERVED: observed_time, 'Name': event.get('info', ''), 'Tags': tags_value, }) return {'events': events, 'href': hrefs, 'attack_ids': attack_ids} def parse_event_response(client, event, fpid, href): """ Prepare required event json object from event response. :param href: reference link of event :param fpid: unique id of event. i.e EventId :param client: object of client class :param event: event indicator from response :return: required event json object """ observed_time = time.strftime(READABLE_DATE_FORMAT, time.gmtime(float(event['timestamp']))) name = event.get('info', '') uuid = event.get('uuid', '') if uuid: fp_link = client.url + '/home/technical_data/iocs/items/' + uuid name_str = STRING_FORMAT.format(name, fp_link) else: name_str = name tags_list = [tag['name'] for tag in event.get('Tag', [])] tags_value = ', '.join(tags_list) event_creator_email = event.get('event_creator_email', '') event = { TIME_OBSERVED: observed_time, 'Name': name_str, 'Tags': tags_value, 'EventCreatorEmail': event_creator_email, 'EventId': fpid, 'Href': href } return event def parse_forum_response(resp): """ Prepare forum json object from forum response. :param resp: forum response :return: required forum json object """ name = resp.get('name', '') hostname = resp.get('hostname', '') tags_list = [tag['name'] for tag in resp['tags']] tags_value = ', '.join(tags_list) forum_details = { 'Name': name, 'Hostname': hostname, 'Tags': tags_value } return forum_details def get_post_context(resp): """ Prepare context data for forum post. :param resp: forum post api response :return: dict object """ post_ec = { 'PostId': resp['id'], 'PublishedAt': resp.get('published_at', ''), 'Url': resp.get('url', ''), 'PlatformUrl': resp.get('platform_url', ''), 'Forum': resp['embed']['forum'], 'Room': resp['embed']['room'], 'User': resp['embed']['author'] } return post_ec def reputation_operation_command(client, indicator, func, command_results=False): """ Call specific function for all reputation commands from this common method. :param client: object of client class :param indicator: comma-separated values or single value :param func: reputation command function. i.e file_lookup, domain_lookup etc. :param command_results: if the result of the func returns CommandResults object. :return: output of all value according to specified function. """ args = argToList(indicator, ',') for arg in args: if command_results: return_results(func(client, arg)) else: return_outputs(*func(client, arg)) def replace_key(dictionary, new_key, old_key): """ Replace key in dictionary. :param dictionary: dictionary object on which we wan to replace key. :param new_key: key which will replace in dictionary :param old_key: existing key in dictionary :return: dict object """ if dictionary.get(old_key): dictionary[new_key] = dictionary.pop(old_key) return dictionary def validate_alert_list_args(args: dict) -> dict: """ Validate arguments for flashpoint-alert-list command. :param args: The command arguments :return: Validated dictionary of arguments :raises: ValueError for invalid arguments """ params = {} size = arg_to_number(args.get('size', 50)) if size is None or size < 1 or size > 100: # type: ignore raise ValueError(MESSAGES['SIZE_ERROR'].format(size)) params['size'] = size since = arg_to_datetime(args.get('since')) if since: params['since'] = since.strftime(DATE_FORMAT) # type: ignore until = arg_to_datetime(args.get('until')) if until: params['until'] = until.strftime(DATE_FORMAT) # type: ignore params['scroll_id'] = args.get('scroll_id') # type: ignore remove_nulls_from_dictionary(params) return params def prepare_hr_for_alerts(alerts: List) -> str: """ Prepare human readable format for alerts. :param alerts: List of alerts :return: Human readable format of alerts """ table1_hr = [] table2_hr = [] for alert in alerts: fpid = alert.get('fpid', '') keyword_text = alert.get('keyword', {}).get('keyword_text') source_created_at = alert.get("source", {}).get("created_at", {}).get('date-time') source_last_observed_at = alert.get("source", {}).get("last_observed_at", {}).get('date-time') # For Flashpoint Collected sources, created_at or last_observed_at would be present under source. if source_created_at or source_last_observed_at: source_created_at = arg_to_datetime(source_created_at) if source_created_at: source_created_at = source_created_at.strftime(READABLE_DATE_FORMAT) source_last_observed_at = arg_to_datetime(source_last_observed_at) if source_last_observed_at: source_last_observed_at = source_last_observed_at.strftime(READABLE_DATE_FORMAT) data = { 'FPID': fpid, 'Keyword Text': keyword_text, 'Site Title': alert.get('source', {}).get('site', {}).get('title'), 'Created Date (UTC)': source_created_at, 'Last Observed Date (UTC)': source_last_observed_at } table1_hr.append(data) source_file = alert.get("source", {}).get("file") source_repo = alert.get("source", {}).get("repo") # Flashpoint Alerts with Data exposures expects file or repo under source if source_file or source_repo: data = { 'FPID': fpid, 'Keyword Text': keyword_text, 'File': alert.get('source', {}).get('file'), 'Owner': alert.get('source', {}).get('owner'), 'Repo': alert.get('source', {}).get('repo'), 'Source': alert.get('source', {}).get('source'), } table2_hr.append(data) elif not source_created_at and not source_last_observed_at and not source_file and not source_repo: raise ValueError(MESSAGES['MISSING_DATA'].format('Alerts')) headers1 = ['FPID', 'Keyword Text', 'Site Title', 'Created Date (UTC)', 'Last Observed Date (UTC)'] headers2 = ['FPID', 'Keyword Text', 'File', 'Owner', 'Repo', 'Source'] table1 = tableToMarkdown("Alerts from Flashpoint collected sources.", table1_hr, headers1, removeNull=True) table2 = tableToMarkdown("Alerts with data exposures.", table2_hr, headers2, removeNull=True) return table1 + table2 def validate_page_parameters_for_compromised_credentials(args: dict, params: dict) -> None: """ Validate page_size and page_number for flashpoint-compromised-credentials-list command. :param args: The command arguments :param params: Dictionary of parameters :return: None """ page_size = arg_to_number(args.get('page_size', DEFAULT_PAGE_SIZE)) if page_size is None or page_size < 1 or page_size > MAX_PAGE_SIZE: raise ValueError(MESSAGES['PAGE_SIZE_ERROR'].format(page_size, MAX_PAGE_SIZE)) page_number = arg_to_number(args.get('page_number', 1)) if page_number is None or page_number < 1: raise ValueError(MESSAGES['PAGE_NUMBER_ERROR'].format(page_number)) product = page_size * page_number if product > MAX_PRODUCT: raise ValueError(MESSAGES['PRODUCT_ERROR'].format(MAX_PRODUCT, product)) params['skip'] = page_size * (page_number - 1) # type: ignore params['limit'] = page_size # type: ignore def validate_date_parameters_for_compromised_credentials(args: dict, params: dict) -> None: """ Validate date params for flashpoint-compromised-credentials-list command. :param args: The command arguments :param params: Dictionary of parameters :return: None """ start_date = arg_to_datetime(args.get('start_date')) end_date = arg_to_datetime(args.get('end_date')) if end_date and not start_date: raise ValueError(MESSAGES['START_DATE_ERROR']) if start_date and not end_date: end_date = arg_to_datetime('now') filter_date = args.get('filter_date') if filter_date: if filter_date not in FILTER_DATE_VALUES: raise ValueError(MESSAGES['FILTER_DATE_ERROR'].format(filter_date, FILTER_DATE_VALUES)) if not (start_date or end_date): raise ValueError(MESSAGES['MISSING_DATE_ERROR']) date_query = ' +breach.{}.date-time: [{} TO {}]'.format(filter_date, start_date.strftime(DATE_FORMAT), # type: ignore end_date.strftime(DATE_FORMAT)) # type: ignore params['query'] += date_query elif start_date or end_date: raise ValueError(MESSAGES['MISSING_FILTER_DATE_ERROR']) def validate_sort_parameters_for_compromised_credentials(args: dict, params: dict) -> None: """ Validate sort_order and sort_date for flashpoint-compromised-credentials-list command. :param args: The command arguments :param params: Dictionary of parameters :return: None """ sort_order = args.get('sort_order') if sort_order and sort_order not in SORT_ORDER_VALUES: raise ValueError(MESSAGES['SORT_ORDER_ERROR'].format(sort_order, SORT_ORDER_VALUES)) sort_date = args.get('sort_date') if sort_date: if sort_date not in SORT_DATE_VALUES: raise ValueError(MESSAGES['SORT_DATE_ERROR'].format(sort_date, SORT_DATE_VALUES)) if not sort_order: sort_order = DEFAULT_SORT_ORDER params['sort'] = f'breach.{sort_date}.timestamp:{sort_order}' elif sort_order: raise ValueError(MESSAGES['MISSING_SORT_DATE_ERROR']) def validate_compromised_credentials_list_args(args: dict) -> dict: """ Validate arguments for flashpoint-compromised-credentials-list command. :param args: The command arguments :return: Validated dictionary of arguments :raises: ValueError on invalid arguments """ params = {'query': '+basetypes:(credential-sighting)'} validate_page_parameters_for_compromised_credentials(args, params) validate_date_parameters_for_compromised_credentials(args, params) validate_sort_parameters_for_compromised_credentials(args, params) is_fresh = args.get('is_fresh') if is_fresh: if is_fresh not in IS_FRESH_VALUES: raise ValueError(MESSAGES['IS_FRESH_ERROR'].format(is_fresh, IS_FRESH_VALUES)) params['query'] += f' +is_fresh:{is_fresh}' remove_nulls_from_dictionary(params) return params def prepare_hr_for_compromised_credentials(hits: list) -> str: """ Prepare human readable format for compromised credentials. :param hits: List of compromised credentials :return: Human readable format of compromised credentials """ hr = [] for hit in hits: source = hit.get('_source', {}) created_date = source.get('breach', {}).get('created_at', {}).get('date-time') created_date = arg_to_datetime(created_date) if created_date: created_date = created_date.strftime(READABLE_DATE_FORMAT) # type: ignore first_observed_date = source.get('breach', {}).get('first_observed_at', {}).get('date-time') first_observed_date = arg_to_datetime(first_observed_date) if first_observed_date: first_observed_date = first_observed_date.strftime(READABLE_DATE_FORMAT) # type: ignore data = { 'FPID': source.get('fpid', ''), 'Email': source.get('email', ''), 'Breach Source': source.get('breach', {}).get('source'), 'Breach Source Type': source.get('breach', {}).get('source_type'), 'Password': source.get('password'), 'Created Date (UTC)': created_date, 'First Observed Date (UTC)': first_observed_date } hr.append(data) return tableToMarkdown("Compromised Credential(s)", hr, ['FPID', 'Email', 'Breach Source', 'Breach Source Type', 'Password', 'Created Date (UTC)', 'First Observed Date (UTC)'], removeNull=True) def remove_duplicate_records(records: List, fetch_type: str, next_run: dict) -> List: """ Check for duplicate records and remove them from the list. :param records: List of records :param fetch_type: Type of the records :param next_run: Dictionary to set in last run :return: Updated list of alerts """ last_run_key = '' id_key = '' if fetch_type == 'Alerts': last_run_key = 'alert_ids' id_key = 'alert_id' elif fetch_type == DEFAULT_FETCH_TYPE: last_run_key = 'hit_ids' id_key = '_id' if next_run.get(last_run_key): prev_alert_ids = next_run[last_run_key] records = [i for i in records if i[id_key] not in prev_alert_ids] return records def update_alert_body(alert: dict) -> None: """ Add highlight to keyword text. :param alert: The alert object :return: None """ # Plain text might not contain quotes (and spaces) present in peripherals, thus stripping them keyword = alert.get("keyword", {}).get("keyword_text", "").strip("\" ") body = alert.get("source", {}).get("body", {}).get("text/plain") if body: alert["source"]["body"]["text/plain"] = re.sub(re.escape(keyword), f"<mark>{keyword}</mark>", body, flags=re.IGNORECASE) def prepare_context_from_next_href(links: str) -> Dict: """ Prepare context from href. :param links: Link with the arguments :return: Context data made from link """ arg_split = links.split('?') context = urllib.parse.parse_qs(arg_split[1]) return context def prepare_incidents_from_alerts_data(response: dict, next_run: dict, start_time: str) -> Tuple[dict, list]: """ Prepare incidents from the alerts data. :param response: Response from the alerts API :param next_run: Dictionary to set in last run :param start_time: Date time saved of the latest alert :return: Tuple of dictionary of next run and list of fetched incidents """ incidents = [] alerts = response.get('data', []) alert_ids = [alert['alert_id'] for alert in alerts] alerts = remove_duplicate_records(alerts, 'Alerts', next_run) for alert in alerts: created_timestamp = alert.get("ts") if created_timestamp: update_alert_body(alert) created_at = datetime.utcfromtimestamp(float(created_timestamp)) created_at = created_at.strftime(DATE_FORMAT) # type: ignore keyword_text = alert.get('keyword', {}).get('keyword_text', 'Flashpoint Alert') incidents.append({ 'name': f"{keyword_text}", 'occurred': created_at, 'rawJSON': json.dumps(alert) }) if created_at >= start_time: start_time = created_at else: demisto.error("The incident was ignored because it doesn't contain 'ts' timestamp") if alerts: next_run['start_time'] = start_time if not next_run.get('scroll_id'): next_run['alert_ids'] = alert_ids links = response.get('links', {}).get('next', {}).get('href') if links: context = prepare_context_from_next_href(links) for con in context: next_run[con] = context[con][0] else: # When no more data is present for current request. So, update the start time and make scroll_id as null. next_run['scroll_id'] = None next_run['since'] = start_time return next_run, incidents def check_value_of_total_records(total: Any, next_run: dict) -> None: """ Check if total number of records are more than the limit or not. :param total: Total number of records :param next_run: Dictionary to set in last run :return: None """ if total: if total > MAX_PRODUCT: # type: ignore raise ValueError(MESSAGES['TIME_RANGE_ERROR'].format(total)) next_run['total'] = total def prepare_checkpoint_and_related_objects(hits: List, hit_ids: List, next_run: dict) -> None: """ Prepare checkpoint and related objects for incidents of type compromised credentials. :param hits: List of compromised credentials :param hit_ids: List of ids of compromised credentials :param next_run: Dictionary to set in last run :return: None """ indexed_at = hits[-1].get('_source', {}).get('header_', {}).get('indexed_at') indexed_at_date = datetime.utcfromtimestamp(float(indexed_at)) indexed_at_date = indexed_at_date.strftime(DATE_FORMAT) next_run['last_time'] = indexed_at_date if next_run.get('last_timestamp'): if next_run['last_timestamp'] == indexed_at: next_run['hit_ids'] += hit_ids else: next_run['hit_ids'] = hit_ids else: next_run['hit_ids'] = hit_ids next_run['last_timestamp'] = indexed_at def prepare_next_run_when_data_is_present(next_run: dict, start_time: str) -> None: """ Prepare next run when data is present. :param next_run: Dictionary to set in last run :param start_time: Date time saved of the last fetch :return: None """ next_run['start_time'] = start_time next_run['fetch_count'] = next_run['fetch_count'] + 1 def prepare_next_run_when_data_is_empty(next_run: dict, hits: List) -> None: """ Prepare next run when data is present. :param next_run: Dictionary to set in last run :param hits: List of compromised credentials :return: None """ if hits: next_run['start_time'] = next_run['last_time'] next_run['fetch_count'] = 0 next_run['fetch_sum'] = 0 next_run['total'] = None def prepare_incidents_from_compromised_credentials_data(response: dict, next_run: dict, start_time: str) -> Tuple[dict, list]: """ Prepare incidents from the compromised credentials data. :param response: Response from the compromised credentials API :param next_run: Dictionary to set in last run :param start_time: Date time saved of the last fetch :return: Tuple of dictionary of next run and list of fetched incidents """ incidents = [] total = arg_to_number(response.get('hits', {}).get('total')) check_value_of_total_records(total, next_run) hits = response.get('hits', {}).get('hits', []) hit_ids = [hit['_id'] for hit in hits] hits = remove_duplicate_records(hits, DEFAULT_FETCH_TYPE, next_run) for hit in hits: name = hit.get('_source', {}).get('email') if not name: name = hit.get('_source', {}).get('fpid', 'Compromised Credential Alert') incidents.append({ 'name': name, 'occurred': hit.get('_source', {}).get('breach', {}).get('created_at', {}).get('date-time'), 'rawJSON': json.dumps(hit) }) if hits: prepare_checkpoint_and_related_objects(hits, hit_ids, next_run) if total > next_run['fetch_sum']: # If more records are available, then increase the fetch count prepare_next_run_when_data_is_present(next_run, start_time) else: prepare_next_run_when_data_is_empty(next_run, hits) return next_run, incidents def remove_space_from_args(args): """Remove space from args.""" for key in args.keys(): if isinstance(args[key], str): args[key] = args[key].strip() return args def create_relationships_list(client, events_details, ip): """Create relationships list from given data.""" relationships = [] if client.create_relationships and events_details.get('attack_ids'): for attack_id in events_details.get('attack_ids'): relationships.append( EntityRelationship(name='indicator-of', entity_a=ip, entity_a_type=FeedIndicatorType.IP, entity_b=attack_id, entity_b_type=FeedIndicatorType.indicator_type_by_server_version( STIX_ATTACK_PATTERN), brand=BRAND)) return relationships ''' FUNCTIONS ''' def test_module(client: Client, params: Dict) -> None: """ Test the Flashpoint instance configuration. :param: client: Object of Client class :param: params: Dictionary containing demisto configuration parameters :return: None """ client.http_request(method="GET", url_suffix='/indicators/simple', params={"limit": 1}) is_fetch = params.get('isFetch') if is_fetch: fetch_incidents(client, {}, params) def ip_lookup_command(client, ip): """ Lookup a particular ip-address. This command searches for the ip in Flashpoint's IOC Dataset. If found, mark it as Malicious. If not found, lookup in Torrents for matching peer ip. If found, mark it as Suspicious. If not found, lookup in Forums for matching ip. If found, mark it as Suspicious. :param client: object of client class :param ip: ip-address :return: command output """ if not is_ip_valid(ip, True): raise ValueError("Invalid ip - " + ip) query = QUERY + urllib.parse.quote(ip.encode('utf-8')) + '"' resp = client.http_request("GET", url_suffix=get_url_suffix(query)) indicators = [] if isinstance(resp, list): indicators = resp if len(indicators) > 0: hr = HR_TITLE + ip + '\n' hr += REPUTATION_MALICIOUS events_details = parse_indicator_response(indicators) hr += tableToMarkdown(TABLE_TITLE, events_details['events'], [DATE_OBSERVED, 'Name', 'Tags']) # Constructing FP Deeplink fp_link = \ client.url + '/home/search/iocs?group=indicator&ioc_type=ip-dst%2Cip-src%2Cip-dst%7Cport&ioc_value=' + ip hr += ALL_DETAILS_LINK.format(fp_link, fp_link) dbot_score = Common.DBotScore( indicator=ip, indicator_type=DBotScoreType.IP, integration_name=BRAND, score=3, malicious_description=MALICIOUS_DESCRIPTION, reliability=demisto.params().get('integrationReliability') ) relationships = create_relationships_list(client, events_details, ip) ip_ioc = Common.IP(ip=ip, dbot_score=dbot_score, relationships=relationships) flashpoint_ip_context = [] for indicator in resp: indicator = indicator.get("Attribute", {}) event = { 'Address': ip, 'EventDetails': indicator.get('Event'), 'Category': indicator.get('category', ''), 'Fpid': indicator.get('fpid', ''), 'Href': indicator.get('href', ''), 'Timestamp': indicator.get('timestamp', ''), 'Type': indicator.get('type', ''), 'Uuid': indicator.get('uuid', ''), 'Comment': indicator['value'].get('comment', '') } flashpoint_ip_context.append(event) command_results = CommandResults( outputs_prefix='Flashpoint.IP.Event', outputs_key_field='Fpid', outputs=flashpoint_ip_context, readable_output=hr, indicator=ip_ioc, raw_response=resp, relationships=relationships ) return command_results else: # Search for IP in torrents torrent_search_url_suffix = '/all/search?query=+basetypes:(+torrent) +is_verified:true ' \ '+ip_address:("' + urllib.parse.quote(ip.encode('utf-8')) + \ '")&limit=10&_source_includes=ip_address' torrent_resp = client.http_request("GET", url_suffix=torrent_search_url_suffix) torrent_result = torrent_resp.get('hits').get('hits', []) if torrent_result: torrent_search_link = client.url + '/home/search/torrents?ip_address=' + ip hr = HR_TITLE + ip + '\n' hr += 'Reputation: Suspicious\n\n' hr += 'FP tools link to torrent search: [{}]({})\n'.format(torrent_search_link, torrent_search_link) ec = { FLASHPOINT_PATHS['IP']: { "Address": ip }, 'DBotScore': { 'Indicator': ip, 'Type': 'ip', 'Vendor': 'Flashpoint', 'Score': 2, 'Reliability': demisto.params().get('integrationReliability') } } command_results = CommandResults( outputs=ec, readable_output=hr, raw_response=resp, ) else: # Search for IP in Forums forum_search_url_suffix = '/forums/visits?ip_address=' + urllib.parse.quote(ip.encode('utf-8')) forum_resp = client.http_request("GET", url_suffix=forum_search_url_suffix) forum_result = forum_resp.get('data', []) if forum_result: forum_search_link = client.url + '/home/search/visits?exclude_tor_nodes_and_known_proxies=true' \ '&ip_address=' + ip hr = HR_TITLE + ip + '\n' hr += 'Reputation: Suspicious\n\n' hr += 'FP tools link to Forum-visit search: [{}]({})\n'.format(forum_search_link, forum_search_link) ec = { FLASHPOINT_PATHS['IP']: { "Address": ip }, 'DBotScore': { 'Indicator': ip, 'Type': 'ip', 'Vendor': 'Flashpoint', 'Score': 2, 'Reliability': demisto.params().get('integrationReliability') } } command_results = CommandResults( outputs=ec, readable_output=hr, raw_response=resp, ) else: hr = HR_TITLE + ip + '\n' hr += REPUTATION_UNKNOWN ec = { 'DBotScore': { 'Indicator': ip, 'Type': 'ip', 'Vendor': 'Flashpoint', 'Score': 0, 'Reliability': demisto.params().get('integrationReliability') } } command_results = CommandResults( outputs=ec, readable_output=hr, raw_response=resp, ) return command_results def domain_lookup_command(client, domain): """ Lookup a particular domain. :param client: object of client class :param domain: domain :return: command output """ query = r'+type:("domain") +value.\*.keyword:"' + domain + '"' resp = client.http_request("GET", url_suffix=get_url_suffix(query)) if isinstance(resp, list): indicators = resp else: indicators = [] if len(indicators) > 0: hr = '### Flashpoint Domain reputation for ' + domain + '\n' hr += REPUTATION_MALICIOUS events_details = parse_indicator_response(indicators) hr += tableToMarkdown(TABLE_TITLE, events_details['events'], [DATE_OBSERVED, 'Name', 'Tags']) fp_link = client.url + '/home/search/iocs?group=indicator&ioc_type=domain&ioc_value=' + domain hr += ALL_DETAILS_LINK.format(fp_link, fp_link) dbot_score = Common.DBotScore( indicator=domain, indicator_type=DBotScoreType.DOMAIN, integration_name=BRAND, score=3, malicious_description=MALICIOUS_DESCRIPTION, reliability=demisto.params().get('integrationReliability') ) relationships = [] if client.create_relationships: if events_details.get('attack_ids'): for attack_id in events_details.get('attack_ids'): relationships.append( EntityRelationship(name='indicator-of', entity_a=domain, entity_a_type=FeedIndicatorType.Domain, entity_b=attack_id, entity_b_type=FeedIndicatorType.indicator_type_by_server_version( STIX_ATTACK_PATTERN), brand=BRAND)) domain_ioc = Common.Domain(domain=domain, dbot_score=dbot_score, relationships=relationships) flashpoint_domain_context = [] for indicator in resp: indicator = indicator.get("Attribute", {}) event = { 'Domain': domain, 'Category': indicator.get('category', ''), 'Fpid': indicator.get('fpid', ''), 'Href': indicator.get('href', ''), 'Timestamp': indicator.get('timestamp', ''), 'Type': indicator.get('type'), 'Uuid': indicator.get('uuid', ''), 'EventDetails': indicator.get('Event', []), 'Comment': indicator['value'].get('comment', '') } flashpoint_domain_context.append(event) command_results = CommandResults( outputs_prefix='Flashpoint.Domain.Event', outputs_key_field='Fpid', outputs=flashpoint_domain_context, readable_output=hr, indicator=domain_ioc, raw_response=resp, relationships=relationships ) return command_results else: hr = '### Flashpoint Domain reputation for ' + domain + '\n' hr += REPUTATION_UNKNOWN ec = { 'DBotScore': { 'Indicator': domain, 'Type': 'domain', 'Vendor': 'Flashpoint', 'Score': 0, 'Reliability': demisto.params().get('integrationReliability') } } command_results = CommandResults( outputs=ec, readable_output=hr, raw_response=resp, ) return command_results def filename_lookup_command(client, filename): """ Lookup a particular filename. :param client: object of client class :param filename: filename :return: command output """ query = r'+type:("filename") +value.\*.keyword:"' + filename.replace('\\', '\\\\') + '"' resp = client.http_request("GET", url_suffix=get_url_suffix(query)) if isinstance(resp, list): indicators = resp else: indicators = [] if len(indicators) > 0: hr = '### Flashpoint Filename reputation for ' + filename + '\n' hr += REPUTATION_MALICIOUS events_details = parse_indicator_response(indicators) hr += tableToMarkdown(TABLE_TITLE, events_details['events'], [DATE_OBSERVED, 'Name', 'Tags']) fp_link = client.url + '/home/search/iocs?query_i18n=en&query=%22' + urllib.parse.quote( filename.replace('\\', '\\\\').encode('utf8')) + '%22' hr += ALL_DETAILS_LINK.format(fp_link, fp_link) dbot_context = { 'Indicator': filename, 'Type': 'filename', 'Vendor': 'Flashpoint', 'Score': 3 } filename_context = { 'Name': filename, 'Malicious': { 'Vendor': 'Flashpoint', 'Description': MALICIOUS_DESCRIPTION } } flashpoint_filename_context = [] for indicator in resp: indicator = indicator.get("Attribute", {}) event = { 'Filename': filename, 'Category': indicator.get('category', ''), 'Fpid': indicator.get('fpid', ''), 'Href': indicator.get('href', ''), 'Timestamp': indicator.get('timestamp', ''), 'Type': indicator.get('type'), 'Uuid': indicator.get('uuid', ''), 'EventDetails': indicator.get('Event', []), 'Comment': indicator['value'].get('comment', '') } flashpoint_filename_context.append(event) ec = { 'DBotScore': dbot_context, 'Filename(val.Name == obj.Name)': filename_context, FLASHPOINT_PATHS['Filename']: flashpoint_filename_context } return hr, ec, resp else: hr = '### Flashpoint Filename reputation for ' + filename + '\n' hr += REPUTATION_UNKNOWN ec = { 'DBotScore': { 'Indicator': filename, 'Type': 'filename', 'Vendor': 'Flashpoint', 'Score': 0, 'Reliability': demisto.params().get('integrationReliability') } } return hr, ec, resp def url_lookup_command(client, url): """ Lookup a particular url. :param client: object of client class :param url: url as indicator :return: command output """ encoded_url = urllib.parse.quote(url.encode('utf8')) query = r'+type:("url") +value.\*:"' + url + '"' resp = client.http_request("GET", url_suffix=get_url_suffix(query)) if isinstance(resp, list): indicators = resp else: indicators = [] if len(indicators) > 0: hr = '### Flashpoint URL reputation for ' + url + '\n' hr += REPUTATION_MALICIOUS events_details = parse_indicator_response(indicators) hr += tableToMarkdown(TABLE_TITLE, events_details['events'], [DATE_OBSERVED, 'Name', 'Tags']) fp_link = client.url + '/home/search/iocs?query_i18n=en&query=%22' + encoded_url + '%22' hr += ALL_DETAILS_LINK.format(fp_link, fp_link) dbot_score = Common.DBotScore( indicator=url, indicator_type=DBotScoreType.URL, integration_name=BRAND, score=3, malicious_description=MALICIOUS_DESCRIPTION, reliability=demisto.params().get('integrationReliability') ) relationships = [] if client.create_relationships: if events_details.get('attack_ids'): for attack_id in events_details.get('attack_ids'): relationships.append( EntityRelationship(name='indicator-of', entity_a=url, entity_a_type=FeedIndicatorType.URL, entity_b=attack_id, entity_b_type=FeedIndicatorType.indicator_type_by_server_version( STIX_ATTACK_PATTERN), brand=BRAND)) url_ioc = Common.URL(url=url, dbot_score=dbot_score, relationships=relationships) flashpoint_url_context = [] for indicator in resp: indicator = indicator.get("Attribute", {}) event = { 'Fpid': indicator.get('fpid', ''), 'EventDetails': indicator['Event'], 'Category': indicator.get('category', ''), 'Href': indicator.get('href', ''), 'Timestamp': indicator.get('timestamp', ''), 'Type': indicator.get('type', ''), 'Uuid': indicator.get('uuid', ''), 'Comment': indicator['value'].get('comment', ''), 'Url': indicator['value']['url'] } flashpoint_url_context.append(event) command_results = CommandResults( outputs_prefix='Flashpoint.URL.Event', outputs_key_field='Fpid', outputs=flashpoint_url_context, readable_output=hr, indicator=url_ioc, raw_response=resp, relationships=relationships ) return command_results else: hr = '### Flashpoint URL reputation for ' + url + '\n' hr += REPUTATION_UNKNOWN ec = { 'DBotScore': { 'Indicator': url, 'Type': 'url', 'Vendor': 'Flashpoint', 'Score': 0, 'Reliability': demisto.params().get('integrationReliability') } } command_results = CommandResults( outputs=ec, readable_output=hr, raw_response=resp, ) return command_results def file_lookup_command(client, file): """ Lookup a particular file hash (md5, sha1, sha256, sha512). :param client: object of client class :param file: file as indicator :return: command output """ query = r'+type:("md5", "sha1", "sha256", "sha512") +value.\*.keyword:"' + file + '"' resp = client.http_request("GET", url_suffix=get_url_suffix(query)) indicators = [] if isinstance(resp, list): indicators = resp if len(indicators) > 0: indicator_type = (indicators[0].get('Attribute', {}).get('type')).upper() hr = '### Flashpoint File reputation for ' + file + '\n' hr += REPUTATION_MALICIOUS events_details = parse_indicator_response(indicators) hr += tableToMarkdown(TABLE_TITLE, events_details['events'], [DATE_OBSERVED, 'Name', 'Tags']) fp_link = client.url + '/home/search/iocs?group=indicator&ioc_type=md5%2Csha1%2Csha256%2Csha512' \ '&ioc_value=' + urllib.parse.quote(file.encode('utf8')) hr += ALL_DETAILS_LINK.format(fp_link, fp_link) dbot_score = Common.DBotScore( indicator=file, indicator_type=DBotScoreType.FILE, integration_name=BRAND, score=3, malicious_description=MALICIOUS_DESCRIPTION, reliability=demisto.params().get('integrationReliability') ) relationships = [] if client.create_relationships and events_details.get('attack_ids'): for attack_id in events_details.get('attack_ids'): relationships.append( EntityRelationship(name='indicator-of', entity_a=file, entity_a_type=DBotScoreType.FILE, entity_b=attack_id, entity_b_type=FeedIndicatorType.indicator_type_by_server_version( STIX_ATTACK_PATTERN), brand=BRAND)) hash_type = get_hash_type(file) # if file_hash found, has to be md5, sha1 or sha256 if hash_type == 'md5': file_ioc = Common.File(md5=file, dbot_score=dbot_score, relationships=relationships) elif hash_type == 'sha1': file_ioc = Common.File(sha1=file, dbot_score=dbot_score, relationships=relationships) else: file_ioc = Common.File(sha256=file, dbot_score=dbot_score, relationships=relationships) flashpoint_file_context = [] for indicator in resp: indicator = indicator.get("Attribute", {}) event = { str(indicator_type).upper(): file, 'EventDetails': indicator.get('Event'), 'Category': indicator.get('category', ''), 'Fpid': indicator.get('fpid', ''), 'Href': indicator.get('href', ''), 'Timestamp': indicator.get('timestamp', ''), 'Type': indicator.get('type', ''), 'Uuid': indicator.get('uuid', ''), 'Comment': indicator['value'].get('comment', '') } flashpoint_file_context.append(event) command_results = CommandResults( outputs_prefix='Flashpoint.File.Event', outputs_key_field='Fpid', outputs=flashpoint_file_context, readable_output=hr, indicator=file_ioc, raw_response=resp, relationships=relationships ) return command_results else: hr = '### Flashpoint File reputation for ' + file + '\n' hr += REPUTATION_UNKNOWN ec = { 'DBotScore': [ { 'Indicator': file, 'Type': 'file', 'Vendor': 'Flashpoint', 'Score': 0, 'Reliability': demisto.params().get('integrationReliability') }, { 'Indicator': file, 'Type': 'hash', 'Vendor': 'Flashpoint', 'Score': 0, 'Reliability': demisto.params().get('integrationReliability') } ] } command_results = CommandResults( outputs=ec, readable_output=hr, raw_response=resp, ) return command_results def email_lookup_command(client, email): """ Lookup a particular email address or subject. :param client: object of client class :param email: email address or subject :return: command output """ query = r'+type:("email-dst", "email-src", "email-src-display-name", "email-subject", "email") +value.\*.keyword:"' \ + email + '" ' resp = client.http_request("GET", url_suffix=get_url_suffix(query)) if isinstance(resp, list): indicators = resp else: indicators = [] if len(indicators) > 0: hr = '### Flashpoint Email reputation for ' + email + '\n' hr += REPUTATION_MALICIOUS events_details = parse_indicator_response(indicators) hr += tableToMarkdown(TABLE_TITLE, events_details['events'], [DATE_OBSERVED, 'Name', 'Tags']) fp_link = \ client.url + '/home/search/iocs?query_i18n=en&query=%22' + urllib.parse.quote(email.encode('utf8')) + '%22' hr += ALL_DETAILS_LINK.format(fp_link, fp_link) email_context = { 'Name': email, 'Malicious': { 'Vendor': 'Flashpoint', 'Description': MALICIOUS_DESCRIPTION } } dbot_context = { 'Indicator': email, 'Type': 'email', 'Vendor': 'Flashpoint', 'Score': 3 } flashpoint_email_context = [] for indicator in resp: indicator = indicator.get("Attribute", {}) event = { 'EventDetails': indicator.get('Event', ''), 'Category': indicator.get('category', ''), 'Fpid': indicator.get('fpid', ''), 'Href': indicator.get('href', ''), 'Timestamp': indicator.get('timestamp', ''), 'Type': indicator.get('type', ''), 'Uuid': indicator.get('uuid', ''), 'Comment': indicator['value'].get('comment', '') } flashpoint_email_context.append(event) ec = { 'DBotScore': dbot_context, outputPaths['email']: email_context, FLASHPOINT_PATHS['Email']: flashpoint_email_context } return hr, ec, resp else: hr = '### Flashpoint Email reputation for ' + email + '\n' hr += REPUTATION_UNKNOWN ec = { 'DBotScore': { 'Indicator': email, 'Type': 'email', 'Vendor': 'Flashpoint', 'Score': 0, 'Reliability': demisto.params().get('integrationReliability') } } return hr, ec, resp def common_lookup_command(client, indicator_value): """ Lookup all types of the indicators. :param client: object of client class :param indicator_value: value of the indicator to lookup :return: command output """ encoded_value = urllib.parse.quote(indicator_value.encode('utf8')) try: ipaddress.ip_address(indicator_value) query = QUERY + indicator_value + '"' except ValueError: try: ipaddress.IPv6Address(indicator_value) query = QUERY + indicator_value + '"' except ValueError: query = r'+value.\*.keyword:"' + indicator_value + '"' resp = client.http_request("GET", url_suffix=get_url_suffix(query)) if isinstance(resp, list): indicators = resp else: indicators = [] if len(indicators) > 0: indicator_type = indicators[0].get('Attribute', {}).get('type') hr = '### Flashpoint reputation for ' + indicator_value + '\n' hr += REPUTATION_MALICIOUS events_details = parse_indicator_response(indicators) hr += tableToMarkdown(TABLE_TITLE, events_details['events'], [DATE_OBSERVED, 'Name', 'Tags']) fp_link = client.url + '/home/search/iocs?query_i18n=en&query=%22' + encoded_value + '%22' hr += ALL_DETAILS_LINK.format(fp_link, fp_link) ec = {'DBotScore': { 'Indicator': indicator_value, 'Type': indicator_type, 'Vendor': 'Flashpoint', 'Score': 3, 'Reliability': demisto.params().get('integrationReliability') }} return hr, ec, resp else: hr = '### Flashpoint reputation for ' + indicator_value + '\n' hr += REPUTATION_UNKNOWN ec = {} return hr, ec, resp def get_reports_command(client, args): """ Get reports matching the given search term or query. :param client: object of client class :param args: demisto args :return: command output """ report_search = args.get('report_search') url_suffix = '/reports/?query=' + urllib.parse.quote(report_search) + '&limit=5' resp = client.http_request("GET", url_suffix=url_suffix) reports = resp.get("data", []) hr = '### Flashpoint Intelligence reports related to search: ' + report_search + '\n' ec: Dict[Any, Any] = {} if reports: hr += 'Top 5 reports:\n\n' report_details = [] index = 0 for report in reports: title = report.get('title', 'N/A') platform_url = report.get('platform_url', '') summary = report.get('summary', 'N/A') index += 1 hr += '' + str(index) + ') [{}]({})'.format(title, platform_url) + '\n' if report.get('summary'): hr += ' Summary: ' + str(summary) + '\n\n\n' else: hr += ' Summary: N/A\n\n\n' report_detail = { 'ReportId': report.get('id', 'N/A'), 'UpdatedAt': report.get('updated_at', ''), 'PostedAt': report.get('posted_at', ''), 'NotifiedAt': report.get('notified_at', ''), 'PlatformUrl': platform_url, 'Title': title, 'Summary': summary } report_details.append(report_detail) fp_url = client.url + '/home/search/reports?query=' + urllib.parse.quote(report_search) hr += 'Link to Report-search on Flashpoint platform: [{}]({})\n'.format(fp_url, fp_url) ec[FLASHPOINT_PATHS['Report']] = report_details else: hr += 'No reports found for the search.' return hr, ec, resp def get_report_by_id_command(client, args): """ Get specific report using its fpid. :param client: object of client class :param args: demisto args :return: command output """ report_id = args.get('report_id') url_suffix = '/reports/' + urllib.parse.quote(report_id.encode('utf-8')) resp = client.http_request("GET", url_suffix=url_suffix) report = resp hr = '### Flashpoint Intelligence Report details\n' ec: Dict[Any, Any] = {} if report: if report.get('tags') is None: raise ValueError("No record found for given argument(s): Not Found") timestamp = None try: time_str = report.get('posted_at', '')[:-10] + 'UTC' timestamp = time.strptime(time_str, '%Y-%m-%dT%H:%M:%S%Z') except TypeError: pass except ValueError: pass tags = report.get('tags', []) tag_string = "" for tag in tags: tag_string += ", " + str(tag) if tag_string: tag_string = tag_string[2:] if timestamp: timestamp_str = time.strftime(READABLE_DATE_FORMAT, timestamp) else: timestamp_str = 'N/A' report_details = [{ 'Title': STRING_FORMAT.format(report.get('title', 'N/A'), report.get('platform_url', '')), 'Date Published (UTC)': timestamp_str, 'Summary': report.get('summary', 'N/A'), 'Tags': tag_string }] hr += tableToMarkdown('Below are the details found:', report_details, ['Title', 'Date Published (UTC)', 'Summary', 'Tags']) hr += '\n' ec[FLASHPOINT_PATHS['Report']] = { 'ReportId': report.get('id', ''), 'UpdatedAt': report.get('updated_at', ''), 'PostedAt': report.get('posted_at', ''), 'NotifiedAt': report.get('notified_at', ''), 'PlatformUrl': report.get('platform_url', ''), 'Title': report.get('title', ''), 'Summary': report.get('summary', '') } else: hr += 'No report found for the given ID.' return hr, ec, resp def get_related_reports_command(client, args): """ Get reports related to given report. :param args: demisto args :param client: object of client class :return: command output """ report_id = args.get('report_id') url_suffix = '/reports/' + urllib.parse.quote(report_id.encode('utf-8')) + '/related?limit=5' resp = client.http_request("GET", url_suffix=url_suffix) reports = resp.get("data", []) hr = '### Flashpoint Intelligence related reports:\n' ec: Dict[Any, Any] = {} if reports: hr += 'Top 5 related reports:\n\n' report_details = [] index = 0 for report in reports: title = report.get('title', 'N/A') platform_url = report.get('platform_url', '') summary = report.get('summary', 'N/A') index += 1 hr += '' + str(index) + ') [{}]({})'.format(title, platform_url) + '\n' hr += ' Summary: ' + str(summary) + '\n\n\n' report_detail = { 'ReportId': report.get('id', 'N/A'), 'UpdatedAt': report.get('updated_at', ''), 'PostedAt': report.get('posted_at', ''), 'NotifiedAt': report.get('notified_at', ''), 'PlatformUrl': platform_url, 'Title': title, 'Summary': summary } report_details.append(report_detail) fp_url = client.url + '/home/intelligence/reports/report/' + report_id + '#detail' hr += 'Link to the given Report on Flashpoint platform: [{}]({})\n'.format(fp_url, fp_url) ec[FLASHPOINT_PATHS['Report']] = report_details else: hr += 'No related reports found for the search.' return hr, ec, resp def get_event_by_id_command(client, args): """ Get specific event using its event id. :param client: object of client class :param args: demisto args :return: command output """ event_id = args.get('event_id') url_suffix = '/indicators/event/' + urllib.parse.quote(event_id.encode('utf-8')) resp = client.http_request("GET", url_suffix=url_suffix) hr = '### Flashpoint Event details\n' ec: Dict[Any, Any] = {} if len(resp) <= 0: hr += 'No event found for the given ID.' return hr, ec, resp event = resp[0].get('Event', '') fpid = resp[0].get('fpid', '') href = resp[0].get('href', '') events = [] if event: event = parse_event_response(client, event, fpid, href) if resp[0].get('malware_description'): event['Malware Description'] = resp[0].get('malware_description', '') events.append(event) hr += tableToMarkdown('Below are the detail found:', events, [TIME_OBSERVED, 'Name', 'Tags', 'Malware Description']) ec[FLASHPOINT_PATHS['Event']] = { 'EventId': events[0]['EventId'], 'Name': events[0]['Name'], 'Tags': events[0]['Tags'], 'ObservedTime': events[0][TIME_OBSERVED], 'EventCreatorEmail': event['EventCreatorEmail'], 'Href': href } # if no key `malware_description` is present, it should not be included in context data if event.get('Malware Description'): ec[FLASHPOINT_PATHS['Event']]['MalwareDescription'] = event['Malware Description'] return hr, ec, resp def get_events_command(client, args): """ Get events matching the given parameters. :param client: object of client class :param args: demisto args :return: command output """ limit = args.get('limit', 10) report_fpid = args.get('report_fpid') attack_ids = args.get('attack_ids') time_period = args.get('time_period') url_suffix = '/indicators/event?sort_timestamp=desc&' getvars = {} if limit: getvars['limit'] = limit if report_fpid: getvars['report'] = report_fpid if attack_ids: getvars['attack_ids'] = attack_ids if time_period: getvars['time_period'] = time_period url_suffix = url_suffix + urllib.parse.urlencode(getvars) resp = client.http_request("GET", url_suffix=url_suffix) indicators = resp hr = '' ec: Dict[Any, Any] = {} if len(indicators) > 0: hr += '### Flashpoint Events\n\n' events = [] for indicator in indicators: href = indicator.get('href', '') event = indicator.get('Event', {}) fpid = indicator.get('fpid', '') event = parse_event_response(client, event, fpid, href) if indicator.get('malware_description'): event['Malware Description'] = indicator.get('malware_description') events.append(event) hr += tableToMarkdown('Below are the detail found:', events, [TIME_OBSERVED, 'Name', 'Tags', 'Malware Description']) fp_link = client.url + '/home/search/iocs' if attack_ids: fp_link = fp_link + '?attack_ids=' + urllib.parse.quote(attack_ids) hr += ALL_DETAILS_LINK.format(fp_link, fp_link) # Replacing the dict keys for ec to strip any white spaces and special charcters for event in events: replace_key(event, 'ObservedTime', TIME_OBSERVED) replace_key(event, 'MalwareDescription', 'Malware Description') ec[FLASHPOINT_PATHS['Event']] = events else: hr += 'No event found for the argument.' return hr, ec, resp def get_forum_details_by_id_command(client, args): """ Get specific forum details by its fpid. :param client: object of client class :param args: demisto args :return: command output """ forum_id = args.get('forum_id') url_suffix = '/forums/sites/' + urllib.parse.quote(forum_id.encode('utf-8')) resp = client.http_request("GET", url_suffix=url_suffix) hr = '### Flashpoint Forum details\n' ec = {} if resp: forum_details = parse_forum_response(resp) hr += tableToMarkdown('Below are the details found:', forum_details, ['Name', 'Hostname', 'Tags']) hr += '\n' ec[FLASHPOINT_PATHS['Forum']] = { 'ForumId': resp['id'], 'Hostname': resp['hostname'], 'Description': resp['description'], 'Name': resp['name'], 'Stats': resp['stats'], 'Tags': resp['tags'] } else: hr += 'No forum detail found for given forum id.' return hr, ec, resp def get_room_details_by_id_command(client, args): """ Get room details by its room id. :param client: object of client class :param args: demisto args :return: command output """ room_id = args.get('room_id') url_suffix = '/forums/rooms/' + urllib.parse.quote(room_id.encode('utf-8')) + '?embed=forum' resp = client.http_request("GET", url_suffix=url_suffix) hr = '### Flashpoint Room details\n' ec = {} if resp: forum_name = resp['embed']['forum']['name'] url = resp.get('url', '') title = resp.get('title', '') room_details = { FORUM_NAME: forum_name, 'Title': title, 'URL': url } hr += tableToMarkdown('Below are the detail found:', room_details, [FORUM_NAME, 'Title', 'URL']) hr += '\n' ec[FLASHPOINT_PATHS['Room']] = { 'RoomId': resp['id'], 'Title': title, 'Url': url, 'Forum': resp['embed']['forum'] } else: hr += 'No room details found for given room id' return hr, ec, resp def get_user_details_by_id_command(client, args): """ Get user details by user's fpid. :param client: object of client class :param args: demisto args :return: command output """ user_id = args.get('user_id') url_suffix = '/forums/users/' + urllib.parse.quote(user_id.encode('utf-8')) + '?embed=forum' resp = client.http_request("GET", url_suffix=url_suffix) hr = '### Flashpoint User details\n' ec = {} if resp: forum_name = resp['embed']['forum']['name'] url = resp.get('url', '') name = resp.get('name', '') user_details = { FORUM_NAME: forum_name, 'Name': name, 'URL': url } hr += tableToMarkdown('Below are the detail found:', user_details, [FORUM_NAME, 'Name', 'URL']) hr += '\n' ec[FLASHPOINT_PATHS['User']] = { 'UserId': resp['id'], 'Name': name, 'Url': url, 'PlatformUrl': resp.get('platform_url', ''), 'Forum': resp['embed']['forum'] } else: hr += 'No user details found for given user id' return hr, ec, resp def get_post_details_by_id_command(client, args): """ Get forum post details by post's fpid. :param client: object of client class :param args: demisto args :return: command output """ post_id = args.get('post_id') url_suffix = '/forums/posts/' + urllib.parse.quote( post_id.encode('utf-8')) + '?body_html=stripped&embed=author,room,forum,thread' resp = client.http_request("GET", url_suffix=url_suffix) hr = '### Flashpoint Post details\n' ec = {} if resp: published_at = resp.get('published_at', '') url = resp.get('url', '') platform_url = resp.get('platform_url', '') forum_name = resp['embed']['forum']['name'] room_title = resp['embed']['room']['title'] author_name = resp['embed']['author']['name'] thread_title = resp['embed']['thread']['title'] post_details = { 'Published at': published_at, FORUM_NAME: forum_name, ROOM_TITLE: room_title, AUTHOR_NAME: author_name, THREAD_TITLE: thread_title, 'URL': url, 'Platform url': "[{}]({})".format(platform_url, platform_url) } hr += tableToMarkdown('Below are the detail found:', post_details, ['Published at', FORUM_NAME, ROOM_TITLE, AUTHOR_NAME, THREAD_TITLE, 'URL', 'Platform url']) hr += '\n' post_ec = get_post_context(resp) ec[FLASHPOINT_PATHS['Post']] = post_ec else: hr += 'No post details found for given post id' return hr, ec, resp def get_forum_sites_command(client, args): """ Get forum sites matching search keyword or query. :param client: object of client class :param args: demisto args :return: command output """ site_search = args.get('site_search') url_suffix = '/forums/sites/?query=' + urllib.parse.quote(site_search.encode('utf8')) + '&limit=10' resp = client.http_request("GET", url_suffix=url_suffix) sites = resp.get("data", []) hr = '### Flashpoint Forum sites related to search: ' + site_search + '\n' ec: Dict[Any, Any] = {} if sites: hr += 'Top 10 sites:\n\n' site_details = [] for site in sites: site_detail = { 'SiteId': site.get('id', ''), 'Name': site.get('name', 'N/A'), 'Hostname': site.get('hostname', 'N/A'), 'Description': site.get('description', 'N/A'), 'PlatformUrl': site.get('platform_url', ''), 'Tags': site.get('tags', []) } site_details.append(site_detail) hr += tableToMarkdown('Below are the detail found:', site_details, ['Name', 'Hostname', 'Description']) hr += '\n' ec = { FLASHPOINT_PATHS['Site']: site_details } else: hr += 'No forum sites found for the search' return hr, ec, resp def get_forum_posts_command(client, args): """ Get forum posts details matching given keyword or query. :param client: object of client class :param args: demisto args :return: command output """ post_search = args.get('post_search') url_suffix = '/forums/posts/?query=' + urllib.parse.quote( post_search.encode('utf8')) + '&limit=10&embed=forum,room,author,thread' resp = client.http_request("GET", url_suffix=url_suffix) posts = resp.get("data", []) hr = '### Flashpoint Forum posts related to search: ' + post_search + '\n' ec: Dict[Any, Any] = {} if posts: hr += 'Top 10 posts:\n\n' post_details = [] post_entry_context = [] for post in posts: platform_url = post.get('platform_url', '') thread_title = post['embed']['thread']['title'] post_ec = get_post_context(post) post_entry_context.append(post_ec) post_detail = { FORUM_NAME: post['embed']['forum']['name'], THREAD_TITLE: thread_title[:30] + '....', ROOM_TITLE: post['embed']['room']['title'], AUTHOR_NAME: post['embed']['author']['name'], 'Platform URL': STRING_FORMAT.format(platform_url[:30] + '...', platform_url) } post_details.append(post_detail) hr += tableToMarkdown('Below are the detail found:', post_details, [FORUM_NAME, THREAD_TITLE, ROOM_TITLE, AUTHOR_NAME, 'Platform URL']) hr += '\n' fp_url = client.url + '/home/search/forums?query=' + urllib.parse.quote(post_search.encode('utf8')) hr += 'Link to forum post-search on Flashpoint platform: [{}]({})\n'.format(fp_url, fp_url) ec[FLASHPOINT_PATHS['Post']] = post_entry_context else: hr += 'No forum posts found for the search' return hr, ec, resp def flashpoint_alert_list_command(client: Client, args: dict) -> CommandResults: """ List alerts from Flashpoint. :param client: Client object :param args: The command arguments :return: Standard command result or no records found message. """ args = validate_alert_list_args(args) response = client.http_request("GET", url_suffix=URL_SUFFIX_V1['ALERTS'], params=args) alerts = response.get('data', []) if not alerts: return CommandResults(readable_output=MESSAGES['NO_RECORDS_FOUND'].format('alerts')) readable_output = prepare_hr_for_alerts(alerts) token_context = { 'since': 'N/A', 'until': 'N/A', 'size': 'N/A', 'scroll_id': 'N/A', 'name': 'flashpoint-alert-list' } links = response.get('links', {}).get('next', {}).get('href') if links: token_hr = "To retrieve the next set of result use," context = prepare_context_from_next_href(links) for con in context: token_context[con] = context[con][0] token_hr += "\n" + con + " = " + context[con][0] readable_output += token_hr for alert in alerts: tags = alert.get('tags', {}) if 'archived' in tags.keys(): alert['tags']['archived'] = True else: alert['tags']['archived'] = False if 'flagged' in tags.keys(): alert['tags']['flagged'] = True else: alert['tags']['flagged'] = False outputs = { FLASHPOINT_PATHS['ALERT']: alerts, FLASHPOINT_PATHS['TOKEN']: token_context } outputs = remove_empty_elements(outputs) return CommandResults( outputs=outputs, readable_output=readable_output, raw_response=response ) def flashpoint_compromised_credentials_list_command(client: Client, args: dict) -> CommandResults: """ List compromised credentials from Flashpoint. :param client: Client object :param args: The command arguments :return: Standard command result or no records found message. """ args = validate_compromised_credentials_list_args(args) response = client.http_request("GET", url_suffix=URL_SUFFIX['COMPROMISED_CREDENTIALS'], params=args) hits = response.get('hits', {}).get('hits', []) if not hits: return CommandResults(readable_output=MESSAGES['NO_RECORDS_FOUND'].format('compromised credentials')) readable_output = '' total_records = response.get('hits', {}).get('total') if total_records: readable_output += f'#### Total number of records found: {total_records}\n\n' readable_output += prepare_hr_for_compromised_credentials(hits) outputs = remove_empty_elements(hits) return CommandResults( outputs_prefix="Flashpoint.CompromisedCredential", outputs_key_field="_id", outputs=outputs, readable_output=readable_output, raw_response=response ) def fetch_incidents(client: Client, last_run: dict, params: dict) -> Tuple[dict, list]: """ Fetch incidents from Flashpoint. :param client: Client object :param last_run: Last run returned by function demisto.getLastRun :param params: Dictionary of parameters :return: Tuple of dictionary of next run and list of fetched incidents """ fetch_params = validate_fetch_incidents_params(params, last_run) fetch_type = fetch_params['fetch_type'] url_suffix = '' if fetch_type == 'Alerts': url_suffix = URL_SUFFIX_V1['ALERTS'] elif fetch_type == DEFAULT_FETCH_TYPE: url_suffix = URL_SUFFIX['COMPROMISED_CREDENTIALS'] response = client.http_request("GET", url_suffix=url_suffix, params=fetch_params['fetch_params']) incidents: List[Dict[str, Any]] = [] next_run = last_run start_time = fetch_params['start_time'] if fetch_type == "Alerts": next_run, incidents = prepare_incidents_from_alerts_data(response, next_run, start_time) elif fetch_type == DEFAULT_FETCH_TYPE: next_run, incidents = prepare_incidents_from_compromised_credentials_data(response, next_run, start_time) return next_run, incidents def main(): """Parse and validate integration params.""" params = demisto.params() api_key = get_apikey() url = params["url"] verify_certificate = not params.get('insecure', False) create_relationships = argToBoolean(params.get('create_relationships', True)) proxies = handle_proxy() args = remove_space_from_args(demisto.args()) command = demisto.command() try: client = Client(api_key, url, verify_certificate, proxies, create_relationships) COMMAND_TO_FUNCTION = { 'flashpoint-search-intelligence-reports': get_reports_command, 'flashpoint-get-single-intelligence-report': get_report_by_id_command, 'flashpoint-get-related-reports': get_related_reports_command, 'flashpoint-get-single-event': get_event_by_id_command, 'flashpoint-get-events': get_events_command, 'flashpoint-get-forum-details': get_forum_details_by_id_command, 'flashpoint-get-forum-room-details': get_room_details_by_id_command, 'flashpoint-get-forum-user-details': get_user_details_by_id_command, 'flashpoint-get-forum-post-details': get_post_details_by_id_command, 'flashpoint-search-forum-sites': get_forum_sites_command, 'flashpoint-search-forum-posts': get_forum_posts_command, } if demisto.command() == 'test-module': # This is the call made when pressing the integration Test button. test_module(client, params) # NOSONAR demisto.results('ok') elif command == 'fetch-incidents': last_run = demisto.getLastRun() next_run, incidents = fetch_incidents(client, last_run, params) demisto.setLastRun(next_run) demisto.incidents(incidents) elif demisto.command() == 'ip': ip = args.get('ip') reputation_operation_command(client, ip, ip_lookup_command, True) elif demisto.command() == 'domain': domain = args.get('domain') reputation_operation_command(client, domain, domain_lookup_command, True) elif demisto.command() == 'filename': filename = args.get('filename') reputation_operation_command(client, filename, filename_lookup_command) elif demisto.command() == 'url': url = args.get('url') reputation_operation_command(client, url, url_lookup_command, True) elif demisto.command() == 'file': file = args.get('file') reputation_operation_command(client, file, file_lookup_command, True) elif demisto.command() == 'email': email = args.get('email') reputation_operation_command(client, email, email_lookup_command) elif demisto.command() == 'flashpoint-common-lookup': indicator_value = args.get('indicator') reputation_operation_command(client, indicator_value, common_lookup_command) elif command == 'flashpoint-alert-list': return_results(flashpoint_alert_list_command(client, args)) elif command == 'flashpoint-compromised-credentials-list': return_results(flashpoint_compromised_credentials_list_command(client, args)) elif COMMAND_TO_FUNCTION.get(demisto.command()): return_outputs(*COMMAND_TO_FUNCTION[demisto.command()](client, args)) else: raise NotImplementedError(f'Command {demisto.command()} is not implemented') except requests.exceptions.ConnectionError as c: """ Caused mostly when URL is altered.""" return_error(f'Failed to execute {demisto.command()} command. Error: {str(c)}') # Log exceptions and return errors except Exception as e: demisto.error(traceback.format_exc()) # print the traceback return_error(f'Failed to execute {demisto.command()} command.\nError:\n{str(e)}') if __name__ in ['__main__', 'builtin', 'builtins']: main()