Anomali ThreatStream v2 Deprecated
Deprecated. Use Anomali ThreatStream v3 integration instead.
Data Enrichment & Threat Intelligence · Anomali ThreatStream
Details
| ID | Anomali ThreatStream v2 |
|---|---|
| Provider | Anomali |
| Category | Data Enrichment & Threat Intelligence |
| From Version | 5.0.0 |
| Docker Image | demisto/py3-tools:1.0.0.43697 |
| Supported Modules | Agentix XSIAM EDR Cortex Cloud Cloud Runtime Security |
README
Use Anomali ThreatStream to query and submit threats.
Anomali ThreatStream v2 Playbook
- Detonate File - ThreatStream
- Detonate URL - ThreatStream
Use Cases
- Get threat intelligence from the ThreatStream platform.
- Create and manage threat models.
- Import indicators to ThreatStream platform.
- Submit file or URL to sandbox and receive an analysis report.
Configure Anomali ThreatStream v2 in Cortex
| Parameter | Description | Required |
|---|---|---|
| url | Server URL (e.g., https://www.test.com) | True |
| username | Username | True |
| apikey | API Key | True |
| default_threshold | Threshold of the indicator. | True |
| Source Reliability | Reliability of the source providing the intelligence data. The default value is B - Usually reliable. | True |
| insecure | Trust any certificate (not secure) | False |
| proxy | Use system proxy settings | False |
Commands
You can execute these commands from the CLI, as part of an automation, or in a playbook.
After you successfully execute a command, a DBot message appears in the War Room with the command details.
ip
Checks the reputation of the given IP.
Base Command
ip
Input
| Argument Name | Description | Required |
|---|---|---|
| ip | The IP to check. | Required |
| threshold | If severity is greater than or equal to the threshold, then the IP address will be considered malicious. This argument will override the default threshold defined as a parameter. | Optional |
| include_inactive | Whether to include results with the status “Inactive”. Default is “False”. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| DBotScore.Indicator | String | The indicator that was tested. |
| DBotScore.Type | String | The indicator type. |
| DBotScore.Vendor | String | The vendor used to calculate the score. |
| IP.ASN | String | Autonomous System (AS) number associated with the indicator. |
| IP.Address | String | IP address of the indicator. |
| IP.Geo.Country | String | Country associated with the indicator. |
| IP.Geo.Location | String | Longitude and latitude of the IP address. |
| IP.Tags | Unknown | (List) Tags of the IP. |
| ThreatStream.IP.ASN | String | Autonomous System (AS) number associated with the indicator. |
| ThreatStream.IP.Address | String | IP address of the indicator. |
| ThreatStream.IP.Country | String | Country associated with the indicator. |
| ThreatStream.IP.Type | String | The indicator type. |
| ThreatStream.IP.Modified | String | Time when the indicator was last updated. The date format is: YYYYMMDDThhmmss, where “T” denotes the start of the value for time, in UTC time. |
| ThreatStream.IP.Severity | String | The indicator severity (“very-high”, “high”, “medium”, or “low”. |
| ThreatStream.IP.Confidence | String | Level of certainty that an observable is of the reported indicator type. Confidence score can range from 0-100, in increasing order of confidence. |
| ThreatStream.IP.Status | String | Status assigned to the indicator. |
| ThreatStream.IP.Organization | String | Name of the business that owns the IP address associated with the indicator. |
| ThreatStream.IP.Source | String | The source of the indicator. |
| ThreatStream.IP.Tags | Unknown | Tags assigned to the IP. |
| DBotScore.Score | Number | The actual score. |
| IP.Malicious.Vendor | String | Vendor that reported the indicator as malicious. |
Command Example
ip ip=39.41.26.166 using-brand="Anomali ThreatStream v2"
Context Example
{
"IP": {
"Geo": {
"Country": "PK",
"Location": "33.6007,73.0679"
},
"ASN": "45595",
"Address": "39.41.26.166",
"Tags": ["phish-target", "victim-hi-tech"]
},
"DBotScore": {
"Vendor": "TOR Exit Nodes",
"Indicator": "39.41.26.166",
"Score": 2,
"Type": "ip"
},
"ThreatStream.IP": {
"Status": "active",
"Confidence": 96,
"Severity": "low",
"Country": "PK",
"Modified": "2019-06-24T10:10:12.289Z",
"Source": "TOR Exit Nodes",
"Address": "39.41.26.166",
"Organization": "PTCL",
"Type": "ip",
"Tags": [{"id": "4wq", "name": "phish-target", "org_id": "88"}, {"id": "ezn", "name": "victim-hi-tech", "org_id": "88"}],
"ASN": "45595"
}
}
Human Readable Output
IP reputation for: 39.41.26.166
| Address | Confidence | Source | Type | Status | Modified | Organization | ASN | Country | Severity |
|---|---|---|---|---|---|---|---|---|---|
| 39.41.26.166 | 96 | TOR Exit Nodes | ip | active | 2019-06-24T10:10:12.289Z | PTCL | 45595 | PK | low |
domain
Checks the reputation of the given domain name.
Base Command
domain
Input
| Argument Name | Description | Required |
|---|---|---|
| domain | The domain name to check. | Required |
| threshold | If severity is greater than or equal to the threshold, then the IP address will be considered malicious. This argument will override the default threshold defined as a parameter. | Optional |
| include_inactive | Whether to include results with status of “Inactive”. Default is “False”. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| Domain.Name | String | The domain name. |
| Domain.DNS | String | IPs resolved by DNS. |
| Domain.Tags | Unknown | (List) Tags of the domain. |
| Domain.WHOIS.CreationDate | Date | Date the domain was created. The date format is: YYYYMMDDThhmmss. Where T denotes the start of the value for time, in UTC time. |
| Domain.WHOIS.UpdatedDate | Date | Date the domain was last updated. The date format is: YYYYMMDDThhmmss. Where T denotes the start of the value for time, in UTC time. |
| Domain.WHOIS.Registrant.Name | String | Name of the registrant. |
| Domain.WHOIS.Registrant.Email | String | Email address of the registrant. |
| Domain.WHOIS.Registrant.Phone | String | Phone number of the registrant. |
| ThreatStream.Domain.ASN | String | Autonomous System (AS) number associated with the indicator. |
| ThreatStream.Domain.Address | String | The domain name of the indicator. |
| ThreatStream.Domain.Country | String | Country associated with the indicator. |
| ThreatStream.Domain.Type | String | The indicator type. |
| ThreatStream.Domain.Modified | String | Date and time when the indicator was last updated. The date format is: YYYYMMDDThhmmss, where “T” denotes the start of the value for time, in UTC time. |
| ThreatStream.Domain.Severity | String | The indicator severity (“very-high”, “high”, “medium”, “low”). |
| ThreatStream.Domain.Confidence | String | Level of certainty that an observable is of the reported indicator type. Confidence score can range from 0-100, in increasing order of confidence. |
| ThreatStream.Domain.Status | String | Status assigned to the indicator. |
| ThreatStream.Domain.Organization | String | Name of the business that owns the IP address associated with the indicator. |
| ThreatStream.Domain.Source | String | The source of the indicator. |
| ThreatStream.Domain.Tags | Unknown | Tags assigned to the domain. |
| Domain.Malicious.Vendor | String | Vendor that reported the indicator as malicious. |
| DBotScore.Indicator | String | The indicator that was tested. |
| DBotScore.Type | String | The indicator type. |
| DBotScore.Vendor | String | The vendor used to calculate the score. |
| DBotScore.Score | Number | The actual score. |
Command Example
domain domain="microsoftfaq.com" using-brand="Anomali ThreatStream v2"
Context Example
{
"ThreatStream.Domain": {
"Status": "active",
"Confidence": 38,
"Severity": "high",
"Country": null,
"Modified": "2019-06-24T08:39:04.644Z",
"Source": "Analyst",
"Address": "microsoftfaq.com",
"Organization": "",
"Type": "domain",
"Tags": ["phish-target", "victim-hi-tech"],
"ASN": ""
},
"Domain": {
"Malicious": {
"Vendor": "ThreatStream"
},
"Name": "microsoftfaq.com",
"DNS": "127.0.0.1",
"WHOIS": {
"UpdatedDate": "2019-06-24T08:39:04.644Z",
"CreationDate": "2019-06-24T08:38:53.246Z",
"Registrant": {
"Phone": "",
"Email": "",
"Name": "Registrant City:"
}
},
"Tags": [{"id": "4wq", "name": "phish-target", "org_id": "88"}, {"id": "ezn", "name": "victim-hi-tech", "org_id": "88"}]
},
"DBotScore": {
"Vendor": "Analyst",
"Indicator": "microsoftfaq.com",
"Score": 3,
"Type": "domain"
}
}
Human Readable Output
Domain reputation for: microsoftfaq.com
| Address | Confidence | Source | Type | Status | Modified | Organization | ASN | Country | Severity |
|---|---|---|---|---|---|---|---|---|---|
| microsoftfaq.com | 38 | Analyst | domain | active | 2019-06-24T08:39:04.644Z | high |
file
Checks the reputation of the given hash of the file.
Base Command
file
Input
| Argument Name | Description | Required |
|---|---|---|
| file | The hash of file to check. | Required |
| threshold | If severity is greater than or equal to the threshold, then the hash of file will be considered malicious. This argument will override the default threshold defined as a parameter. | Optional |
| include_inactive | Whether to include results with the status “Inactive”. Default is “False”. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| File.MD5 | String | MD5 hash of the file. |
| File.SHA1 | String | SHA1 hash of the file. |
| File.SHA256 | String | SHA256 hash of the file. |
| File.SHA512 | String | SHA512 hash of the file. |
| File.Malicious.Vendor | String | Vendor that reported the indicator as malicious. |
| File.Tags | Unknown | (List) Tags of the file. |
| DBotScore.Indicator | String | The indicator that was tested. |
| DBotScore.Type | String | The indicator type. |
| DBotScore.Vendor | String | The vendor used to calculate the score. |
| DBotScore.Score | Number | The actual score. |
| ThreatStream.File.Severity | String | The indicator severity (“very-high”, “high”, “medium”, “low”). |
| ThreatStream.File.Confidence | String | Level of certainty that an observable is of the reported indicator type. Confidence score can range from 0-100, in increasing order of confidence. |
| ThreatStream.File.Status | String | Status assigned to the indicator. |
| ThreatStream.File.Type | String | The indicator type. |
| ThreatStream.File.MD5 | String | The MD5 hash of the indicator. |
| ThreatStream.File.SHA1 | String | The SHA1 hash of the indicator. |
| ThreatStream.File.SHA256 | String | The SHA256 hash of the indicator. |
| ThreatStream.File.SHA512 | String | The SHA512 hash of the indicator. |
| ThreatStream.File.Modified | String | Date and time when the indicator was last updated. The date format is: YYYYMMDDThhmmss, where “T” denotes the start of the value for time, in UTC time. |
| ThreatStream.File.Source | String | The source of the indicator. |
| ThreatStream.File.Tags | Unknown | Tags assigned to the file. |
Command Example
file file=07df6c1d9a76d81f191be288d463784b using-brand="Anomali ThreatStream v2"
Context Example
{
"DBotScore": {
"Vendor": "URLHaus Hashes",
"Indicator": "07df6c1d9a76d81f191be288d463784b",
"Score": 2,
"Type": "md5"
},
"ThreatStream.File": {
"Status": "active",
"Confidence": 75,
"Severity": "medium",
"Modified": "2019-06-24T10:13:27.284Z",
"Source": "URLHaus Hashes",
"Type": "md5",
"Tags": [{"id": "4wq", "name": "phish-target", "org_id": "88"}, {"id": "ezn", "name": "victim-hi-tech", "org_id": "88"}],
"MD5": "07df6c1d9a76d81f191be288d463784b"
},
"File": {
"MD5": "07df6c1d9a76d81f191be288d463784b",
"Tags": ["phish-target", "victim-hi-tech"]
}
}
Human Readable Output
MD5 reputation for: 07df6c1d9a76d81f191be288d463784b
| Confidence | Source | Type | Status | Modified | Severity | MD5 |
|---|---|---|---|---|---|---|
| 75 | URLHaus Hashes | md5 | active | 2019-06-24T10:13:27.284Z | medium | 07df6c1d9a76d81f191be288d463784b |
threatstream-email-reputation
Checks the reputation of the given email address.
Base Command
threatstream-email-reputation
Input
| Argument Name | Description | Required |
|---|---|---|
| The email address to check. | Required | |
| threshold | If severity is greater or equal than the threshold, then the IP address will be considered malicious. This argument will override the default threshold defined as a parameter. | Optional |
| include_inactive | Whether to include results with the status “Inactive”. Default is “False”. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| DBotScore.Indicator | String | The tested indicator. |
| DBotScore.Type | String | The indicator type. |
| DBotScore.Vendor | String | The vendor used to calculate the score. |
| DBotScore.Score | Number | The actual score. |
| ThreatStream.EmailReputation.Severity | String | The indicator severity (“very-high”, “high”, “medium”, “low”). |
| ThreatStream.EmailReputation.Confidence | String | Level of certainty that an observable is of the reported indicator type. Confidence score can range from 0-100, in increasing order of confidence. |
| ThreatStream.EmailReputation.Status | String | Status assigned to the indicator. |
| ThreatStream.EmailReputation.Type | String | The indicator type. |
| ThreatStream.EmailReputation.Email | String | The email address of the indicator. |
| ThreatStream.EmailReputation.Source | String | The source of the indicator. |
| ThreatStream.EmailReputation.Modified | String | Date and time when the indicator was last updated. The date format is: YYYYMMDDThhmmss, where “T” denotes the start of the value for time, in UTC time. |
| ThreatStream.EmailReputation.Tags | Unknown | Tags assigned to the email. |
Command Example
threatstream-email-reputation email=goo@test.com
Context Example
{
"DBotScore": {
"Vendor": "Anomali Labs Compromised Credentials",
"Indicator": "goo@test.com",
"Score": 2,
"Type": "email"
},
"ThreatStream.EmailReputation": {
"Status": "active",
"Confidence": 100,
"Severity": "low",
"Modified": "2019-06-24T09:50:23.810Z",
"Source": "Anomali Labs Compromised Credentials",
"Type": "email",
"Tags": [{"id": "4wq", "name": "phish-target", "org_id": "88"}, {"id": "ezn", "name": "victim-hi-tech", "org_id": "88"}],
"Email": "goo@test.com"
}
}
Human Readable Output
Email reputation for: foo@test.com
| Confidence | Source | Type | Status | Modified | Severity | |
|---|---|---|---|---|---|---|
| 100 | Anomali Labs Compromised Credentials | active | 2019-06-24T09:50:23.810Z | low | foo@test.com |
threatstream-get-passive-dns
Returns enrichment data for Domain or IP for availabe observables.
Base Command
threatstream-get-passive-dns
Input
| Argument Name | Description | Required |
|---|---|---|
| type | The type of passive DNS search (“ip”, “domain”). | Required |
| value | Possible values are “IP” or “Domain”. | Required |
| limit | Maximum number of results to return. Default is 50. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| ThreatStream.PassiveDNS.Domain | String | The domain value. |
| ThreatStream.PassiveDNS.Ip | String | The IP value. |
| ThreatStream.PassiveDNS.Rrtype | String | The Rrtype value. |
| ThreatStream.PassiveDNS.Source | String | The source value. |
| ThreatStream.PassiveDNS.FirstSeen | String | The first seen date. The date format is: YYYYMMDDThhmmss, where “T” denotes the start of the value for time, in UTC time. |
| ThreatStream.PassiveDNS.LastSeen | String | The last seen date. The date format is: YYYYMMDDThhmmss, where “T” denotes the start of the value for time, in UTC time. |
Command Example
threatstream-get-passive-dns type=domain value=discoverer.blog
Context Example
{
"ThreatStream.PassiveDNS": [
{
"Domain": "discoverer.blog",
"Ip": "184.168.221.52",
"Rrtype": "A",
"Source": "Spamhaus",
"LastSeen": "2019-06-23T08:09:54",
"FirstSeen": "2019-06-23T08:09:54"
},
{
"Domain": "discoverer.blog",
"Ip": "50.63.202.51",
"Rrtype": "A",
"Source": "Spamhaus",
"LastSeen": "2019-06-21T10:33:54",
"FirstSeen": "2019-06-21T10:33:54"
}
]
}
Human Readable Output
Passive DNS enrichment data for: discoverer.blog
| Domain | Ip | Rrtype | Source | FirstSeen | LastSeen |
|---|---|---|---|---|---|
| discoverer.blog | 184.168.221.52 | A | Spamhaus | 2019-06-23T08:09:54 | 2019-06-23T08:09:54 |
| discoverer.blog | 50.63.202.51 | A | Spamhaus | 2019-06-21T10:33:54 | 2019-06-21T10:33:54 |
threatstream-import-indicator-with-approval
Imports indicators (observables) into ThreatStream. Approval of the imported data is required, usingh the ThreatStream UI. The data can be imported using one of three methods: plain-text, file, or URL. Only one argument can be used.
Base Command
threatstream-import-indicator-with-approval
Input
| Argument Name | Description | Required |
|---|---|---|
| confidence | The level of certainty that an observable is of the reported indicator type. Default is 50. | Optional |
| classification | Denotes whether the indicator data is public or private to the organization. Default is “private”. | Optional |
| threat_type | Type of threat associated with the imported observables. Default is “exploit”. | Optional |
| severity | The potential impact of the indicator type with which the observable is thought to be associated. Default is “low”. | Optional |
| import_type | The import type of the indicator. Can be datatext, file-id, or url. | Required |
| import_value | The source of imported data. Can be one of the following: url, datatext of file-id of uploaded file to the War Rroom. Supported file types for file-id are: CSV, HTML, IOC, JSON, PDF, TXT. | Required |
| ip_mapping | Whether to include IP mapping. Whether to include url mapping. Can be yes or no. Default is no. | Optional |
| domain_mapping | Whether to include domain mapping. Whether to include url mapping. Can be yes or no. Default is no. | Optional |
| url_mapping | Whether to include url mapping. Can be yes or no. Default is no. | Optional |
| email_mapping | Whether to include email mapping. Whether to include url mapping. Can be yes or no. Default is no. | Optional |
| md5_mapping | Whether to include MD5 mapping. Whether to include url mapping. Can be yes or no. Default is no. | Optional |
Command Example
threatstream-import-indicator-with-approval import_type="file-id" import_value=5403@6cf3881e-1cfd-48b5-8fc3-0b9fcfb791f0
Context Example
{
"File": {
"EntryID": "5403@6cf3881e-1cfd-48b5-8fc3-0b9fcfb791f0",
"Extension": "csv",
"Info": "text/csv; charset=utf-8",
"MD5": "5b7ed7973e4deb3c98ee3a4bd6d911af",
"Name": "input.csv",
"SHA1": "055c5002eb5a4d4abe2eb1768e925bfc3a1a763e",
"SHA256": "fd16220852b39e2c8fa51766750e3991670766512836212c799c5a0537e3ef8c",
"SSDeep": "3:Wg8oEIjOH9+KS3qvRBTdRi690oVqzBUGyT0/n:Vx0HgKnTdE6eoVafY8",
"Size": 102,
"Type": "UTF-8 Unicode (with BOM) text, with CRLF line terminators\n"
},
"ThreatStream": {
"Import": {
"ImportID": "894516"
}
}
}
Human Readable Output
The data was imported successfully. The ID of imported job is: 894514
threatstream-import-indicator-without-approval
Imports indicators (observables) into ThreatStream. Approval is not required for the imported data. You must have the Approve Intel user permission to import without approval using the API.
Base Command
threatstream-import-indicator-without-approval
Input
| Argument Name | Description | Required |
|---|---|---|
| confidence | The level of certainty that an observable is of the reported indicator type. Default is 50. | Optional |
| source_confidence_weight | To use your specified confidence entirely, set source_confidence_ weight to 100. | Optional |
| expiration_ts | Time stamp of when intelligence will expire on ThreatStream, in ISO format. For example, 2020-12-24T00:00:00. | Optional |
| severity | Severity you want to assign to the observable when it is imported. | Optional |
| tags | Comma-separated list of tags. e.g. tag1,tag2. | Optional |
| trustedcircles | ID of the trusted circle with which this threat data should be shared. If you want to import the threat data to multiple trusted circles, enter a list of comma-separated IDs. | Optional |
| classification | Denotes whether the indicator data is public or private to the organization. | Required |
| allow_unresolved | When set to true, domain observables included in the file which do not resolve will be accepted as valid in ThreatStream and imported. | Optional |
| file_id | Entry id of uploaded file to war room containing a json with “objects” array and “meta” maps. | Required |
threatstream-get-model-list
Returns a list of threat model.
Base Command
threatstream-get-model-list
Input
| Argument Name | Description | Required |
|---|---|---|
| model | Threat model of the returned list. | Required |
| limit | Limits the list of models size. Specifying limit=0 will return up to a maximum of 1000 models. In case of limit=0 the output won’t be set in the context. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| ThreatStream.List.Type | String | The type of threat model. |
| ThreatStream.List.Name | String | The name of the threat model. |
| ThreatStream.List.ID | String | The ID of the threat model. |
| ThreatStream.List.CreatedTime | String | Date and time of threat model creation. The date format is: YYYYMMDDThhmmss, where “T” denotes the start of the value for time, in UTC time. |
Command Example
threatstream-get-model-list model=actor limit=10
Context Example
{
"ThreatStream.List": [
{
"CreatedTime": "2015-06-29T17:02:01.885011",
"Type": "Actor",
"ID": 2,
"Name": "Pirpi"
},
{
"CreatedTime": "2015-06-30T19:20:05.930697",
"Type": "Actor",
"ID": 3,
"Name": "TeamCyberGhost"
},
{
"CreatedTime": "2015-07-01T18:10:53.241301",
"Type": "Actor",
"ID": 4,
"Name": "Wekby"
},
{
"CreatedTime": "2015-07-01T19:27:06.180602",
"Type": "Actor",
"ID": 5,
"Name": "Axiom"
},
{
"CreatedTime": "2015-07-01T19:52:56.019862",
"Type": "Actor",
"ID": 7,
"Name": "Peace (Group) a/k/a C0d0s0"
},
{
"CreatedTime": "2015-07-01T19:58:50.741202",
"Type": "Actor",
"ID": 8,
"Name": "Nitro"
},
{
"CreatedTime": "2015-07-06T16:06:12.123839",
"Type": "Actor",
"ID": 9,
"Name": "Comment Crew"
},
{
"CreatedTime": "2015-07-07T17:40:04.920012",
"Type": "Actor",
"ID": 10,
"Name": "Comfoo"
},
{
"CreatedTime": "2015-07-07T18:53:12.331221",
"Type": "Actor",
"ID": 11,
"Name": "Syrian Electronic Army"
},
{
"CreatedTime": "2015-07-08T20:59:29.751919",
"Type": "Actor",
"ID": 12,
"Name": "DD4BC"
}
]
}
Human Readable Output
List of Actors
| CreatedTime | ID | Name | Type |
|---|---|---|---|
| 2015-06-29T17:02:01.885011 | 2 | Pirpi | Actor |
| 2015-06-30T19:20:05.930697 | 3 | TeamCyberGhost | Actor |
| 2015-07-01T18:10:53.241301 | 4 | Wekby | Actor |
| 2015-07-01T19:27:06.180602 | 5 | Axiom | Actor |
| 2015-07-01T19:52:56.019862 | 7 | Peace (Group) a/k/a C0d0s0 | Actor |
| 2015-07-01T19:58:50.741202 | 8 | Nitro | Actor |
| 2015-07-06T16:06:12.123839 | 9 | Comment Crew | Actor |
| 2015-07-07T17:40:04.920012 | 10 | Comfoo | Actor |
| 2015-07-07T18:53:12.331221 | 11 | Syrian Electronic Army | Actor |
| 2015-07-08T20:59:29.751919 | 12 | DD4BC | Actor |
threatstream-get-model-description
Returns an HTML file with a description of the threat model.
Base Command
threatstream-get-model-description
Input
| Argument Name | Description | Required |
|---|---|---|
| model | The threat model. | Required |
| id | The ID of the threat model. | Required |
Context Output
| Path | Type | Description |
|---|---|---|
| File.Name | String | The file name of the model desctiption. |
| File.EntryID | String | The entry ID of the model desctipton. |
Command Example
threatstream-get-model-description model=campaign id=1406
Context Example
{
"File": {
"EntryID": "5384@6cf3881e-1cfd-48b5-8fc3-0b9fcfb791f0",
"Extension": "html",
"Info": "text/html; charset=utf-8",
"MD5": "66eabc1c704fdac429939eb09bc5346f",
"Name": "campaign_1406.html",
"SHA1": "69f3dfe8ae037253e782dd201904aa583d83bcd7",
"SHA256": "49635483962b38a2fd5d50ebbb51b7002ecab3fd23e0f9f99e915f7b33d3f739",
"SSDeep": "96:XZcBqz4xqHC2AwALc+nvJN7GBoBGK1IW7h:XC40W/tixmoLTh",
"Size": 3686,
"Type": "HTML document text, ASCII text, with very long lines, with no line terminators\n"
}
}
threatstream-get-indicators-by-model
Returns a list of indicators associated with the specified model and ID of the model.
Base Command
threatstream-get-indicators-by-model
Input
| Argument Name | Description | Required |
|---|---|---|
| model | The threat model. | Required |
| id | The ID of the model. | Required |
| limit | Maximum number of results to return. Default is 20. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| ThreatStream.Model.ModelType | String | The type of the threat model. |
| ThreatStream.Model.ModelID | String | The ID of the threat model. |
| ThreatStream.Model.Indicators.Value | String | The value of indicator associated with the specified model. |
| ThreatStream.Model.Indicators.ID | String | The ID of indicator associated with the specified model. |
| ThreatStream.Model.Indicators.IType | String | The iType of the indicator associated with the specified model. |
| ThreatStream.Model.Indicators.Severity | String | The severity of the indicator associated with the specified model. |
| ThreatStream.Model.Indicators.Confidence | String | The confidence of the indicator associated with the specified model. |
| ThreatStream.Model.Indicators.Country | String | The courty of the indicator associated with the specified model |
| ThreatStream.Model.Indicators.Organization | String | The organization of the indicator associated with the specified model. |
| ThreatStream.Model.Indicators.ASN | String | The ASN of the indicator associated with the specified model. |
| ThreatStream.Model.Indicators.Status | String | The status of the indicator associated with the specified model. |
| ThreatStream.Model.Indicators.Tags | String | The tags of the indicator associated with the specified model. |
| ThreatStream.Model.Indicators.Modified | String | The date and time the indicator was last modified. |
| ThreatStream.Model.Indicators.Source | String | The source of the inidicator. |
| ThreatStream.Model.Indicators.Type | String | The type of the inidicator. |
Command Example
threatstream-get-indicators-by-model id=11885 model=incident
Context Example
{
"ThreatStream.Model": {
"Indicators": [
{
"Status": "active",
"Confidence": 100,
"IType": "mal_md5",
"Severity": "very-high",
"Tags": "FINSPY,FinSpy,community-threat-briefing,Weaponization",
"Country": null,
"Modified": "2017-09-25T11:43:54.446",
"Value": "417072b246af74647897978902f7d903562e0f6f",
"ID": "50117813617",
"Source": "ThreatStream",
"Organization": "",
"Type": "md5",
"ASN": ""
},
{
"Status": "active",
"Confidence": 100,
"IType": "mal_md5",
"Severity": "very-high",
"Tags": "FINSPY,FinSpy,community-threat-briefing,Weaponization",
"Country": null,
"Modified": "2017-09-25T11:43:54.455",
"Value": "d3c65377d39e97ab019f7f00458036ee0c7509a7",
"ID": "50117813616",
"Source": "ThreatStream",
"Organization": "",
"Type": "md5",
"ASN": ""
},
{
"Status": "active",
"Confidence": 100,
"IType": "mal_md5",
"Severity": "very-high",
"Tags": "FINSPY,FinSpy,community-threat-briefing,Weaponization",
"Country": null,
"Modified": "2017-09-25T11:43:54.462",
"Value": "5f51084a4b81b40a8fcf485b0808f97ba3b0f6af",
"ID": "50117813615",
"Source": "ThreatStream",
"Organization": "",
"Type": "md5",
"ASN": ""
},
{
"Status": "active",
"Confidence": 100,
"IType": "mal_md5",
"Severity": "very-high",
"Tags": "FINSPY,FinSpy,community-threat-briefing,Weaponization",
"Country": null,
"Modified": "2017-09-25T11:43:54.469",
"Value": "220a8eacd212ecc5a55d538cb964e742acf039c6",
"ID": "50117813614",
"Source": "ThreatStream",
"Organization": "",
"Type": "md5",
"ASN": ""
},
{
"Status": "active",
"Confidence": 100,
"IType": "mal_md5",
"Severity": "very-high",
"Tags": "FINSPY,FinSpy,community-threat-briefing,Weaponization",
"Country": null,
"Modified": "2017-09-25T11:43:54.477",
"Value": "a16ef7d96a72a24e2a645d5e3758c7d8e6469a55",
"ID": "50117813612",
"Source": "ThreatStream",
"Organization": "",
"Type": "md5",
"ASN": ""
},
{
"Status": "active",
"Confidence": 100,
"IType": "mal_md5",
"Severity": "very-high",
"Tags": "FINSPY,FinSpy,community-threat-briefing,Weaponization",
"Country": null,
"Modified": "2017-09-25T11:43:54.485",
"Value": "275e76fc462b865fe1af32f5f15b41a37496dd97",
"ID": "50117813611",
"Source": "ThreatStream",
"Organization": "",
"Type": "md5",
"ASN": ""
},
{
"Status": "active",
"Confidence": 100,
"IType": "mal_md5",
"Severity": "very-high",
"Tags": "FINSPY,FinSpy,community-threat-briefing,Weaponization",
"Country": null,
"Modified": "2017-09-25T11:43:54.493",
"Value": "df4b8c4b485d916c3cadd963f91f7fa9f509723f",
"ID": "50117813610",
"Source": "ThreatStream",
"Organization": "",
"Type": "md5",
"ASN": ""
},
{
"Status": "active",
"Confidence": 100,
"IType": "mal_md5",
"Severity": "very-high",
"Tags": "FINSPY,FinSpy,community-threat-briefing,Weaponization",
"Country": null,
"Modified": "2017-09-25T11:43:54.500",
"Value": "66eccea3e8901f6d5151b49bca53c126f086e437",
"ID": "50117813609",
"Source": "ThreatStream",
"Organization": "",
"Type": "md5",
"ASN": ""
},
{
"Status": "active",
"Confidence": 100,
"IType": "mal_md5",
"Severity": "very-high",
"Tags": "FINSPY,FinSpy,community-threat-briefing,Weaponization",
"Country": null,
"Modified": "2017-09-25T11:43:54.507",
"Value": "3d90630ff6c151fc2659a579de8d204d1c2f841a",
"ID": "50117813608",
"Source": "ThreatStream",
"Organization": "",
"Type": "md5",
"ASN": ""
},
{
"Status": "active",
"Confidence": 100,
"IType": "mal_md5",
"Severity": "very-high",
"Tags": "FINSPY,FinSpy,community-threat-briefing,Weaponization",
"Country": null,
"Modified": "2017-09-25T11:43:54.513",
"Value": "a6d14b104744188f80c6c6b368b589e0bd361607",
"ID": "50117813607",
"Source": "ThreatStream",
"Organization": "",
"Type": "md5",
"ASN": ""
},
{
"Status": "active",
"Confidence": 100,
"IType": "mal_md5",
"Severity": "very-high",
"Tags": "FINSPY,FinSpy,community-threat-briefing,Weaponization",
"Country": null,
"Modified": "2017-09-25T11:43:54.520",
"Value": "e3f183e67c818f4e693b69748962eecda53f7f88",
"ID": "50117813606",
"Source": "ThreatStream",
"Organization": "",
"Type": "md5",
"ASN": ""
},
{
"Status": "active",
"Confidence": 100,
"IType": "mal_md5",
"Severity": "very-high",
"Tags": "FINSPY,FinSpy,community-threat-briefing,Weaponization",
"Country": null,
"Modified": "2017-09-25T11:43:54.527",
"Value": "f326479a4aacc2aaf86b364b78ed5b1b0def1fbe",
"ID": "50117813605",
"Source": "ThreatStream",
"Organization": "",
"Type": "md5",
"ASN": ""
},
{
"Status": "active",
"Confidence": 100,
"IType": "mal_md5",
"Severity": "very-high",
"Tags": "FINSPY,FinSpy,community-threat-briefing,Weaponization",
"Country": null,
"Modified": "2017-09-25T11:43:54.534",
"Value": "c4d1fb784fcd252d13058dbb947645a902fc8935",
"ID": "50117813604",
"Source": "ThreatStream",
"Organization": "",
"Type": "md5",
"ASN": ""
},
{
"Status": "active",
"Confidence": 100,
"IType": "mal_md5",
"Severity": "very-high",
"Tags": "FINSPY,FinSpy,community-threat-briefing,Weaponization",
"Country": null,
"Modified": "2017-09-25T11:43:54.541",
"Value": "fb4a4143d4f32b0af4c2f6f59c8d91504d670b41",
"ID": "50117813603",
"Source": "ThreatStream",
"Organization": "",
"Type": "md5",
"ASN": ""
},
{
"Status": "active",
"Confidence": 100,
"IType": "mal_md5",
"Severity": "very-high",
"Tags": "FINSPY,FinSpy,community-threat-briefing,Weaponization",
"Country": null,
"Modified": "2017-09-25T11:43:54.548",
"Value": "400e4f843ff93df95145554b2d574a9abf24653f",
"ID": "50117813602",
"Source": "ThreatStream",
"Organization": "",
"Type": "md5",
"ASN": ""
},
{
"Status": "active",
"Confidence": 100,
"IType": "mal_md5",
"Severity": "very-high",
"Tags": "FINSPY,FinSpy,community-threat-briefing,Weaponization",
"Country": null,
"Modified": "2017-09-25T11:43:54.555",
"Value": "f82d18656341793c0a6b9204a68605232f0c39e7",
"ID": "50117813601",
"Source": "ThreatStream",
"Organization": "",
"Type": "md5",
"ASN": ""
},
{
"Status": "active",
"Confidence": 100,
"IType": "mal_md5",
"Severity": "very-high",
"Tags": "FINSPY,FinSpy,community-threat-briefing,Weaponization",
"Country": null,
"Modified": "2017-09-25T11:43:54.562",
"Value": "c33fe4c286845a175ee0d83db6d234fe24dd2864",
"ID": "50117813600",
"Source": "ThreatStream",
"Organization": "",
"Type": "md5",
"ASN": ""
},
{
"Status": "active",
"Confidence": 100,
"IType": "mal_md5",
"Severity": "very-high",
"Tags": "FINSPY,FinSpy,community-threat-briefing,Weaponization",
"Country": null,
"Modified": "2017-09-25T11:43:54.569",
"Value": "d9294b86b3976ddf89b66b8051ccf98cfae2e312",
"ID": "50117813599",
"Source": "ThreatStream",
"Organization": "",
"Type": "md5",
"ASN": ""
},
{
"Status": "active",
"Confidence": 100,
"IType": "mal_md5",
"Severity": "very-high",
"Tags": "FINSPY,FinSpy,community-threat-briefing,Weaponization",
"Country": null,
"Modified": "2017-09-25T11:43:54.576",
"Value": "9fc71853d3e6ac843bd36ce9297e398507e5b2bd",
"ID": "50117813597",
"Source": "ThreatStream",
"Organization": "",
"Type": "md5",
"ASN": ""
},
{
"Status": "active",
"Confidence": 100,
"IType": "mal_md5",
"Severity": "very-high",
"Tags": "FINSPY,FinSpy,community-threat-briefing,Weaponization",
"Country": null,
"Modified": "2017-09-25T11:43:54.583",
"Value": "c0ad9c242c533effd50b51e94874514a5b9f2219",
"ID": "50117813596",
"Source": "ThreatStream",
"Organization": "",
"Type": "md5",
"ASN": ""
}
],
"ModelType": "Incident",
"ModelID": "11885"
}
}
Human Readable Output
Indicators list for Threat Model Incident with id 11885
| IType | Value | ID | Confidence | Source | Type | Status | Tags | Modified | Organization | ASN | Country | Severity |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| mal_md5 | 417072b246af74647897978902f7d903562e0f6f | 50117813617 | 100 | ThreatStream | md5 | active | FINSPY,FinSpy,community-threat-briefing,Weaponization | 2017-09-25T11:43:54.446 | very-high | |||
| mal_md5 | d3c65377d39e97ab019f7f00458036ee0c7509a7 | 50117813616 | 100 | ThreatStream | md5 | active | FINSPY,FinSpy,community-threat-briefing,Weaponization | 2017-09-25T11:43:54.455 | very-high | |||
| mal_md5 | 5f51084a4b81b40a8fcf485b0808f97ba3b0f6af | 50117813615 | 100 | ThreatStream | md5 | active | FINSPY,FinSpy,community-threat-briefing,Weaponization | 2017-09-25T11:43:54.462 | very-high | |||
| mal_md5 | 220a8eacd212ecc5a55d538cb964e742acf039c6 | 50117813614 | 100 | ThreatStream | md5 | active | FINSPY,FinSpy,community-threat-briefing,Weaponization | 2017-09-25T11:43:54.469 | very-high | |||
| mal_md5 | a16ef7d96a72a24e2a645d5e3758c7d8e6469a55 | 50117813612 | 100 | ThreatStream | md5 | active | FINSPY,FinSpy,community-threat-briefing,Weaponization | 2017-09-25T11:43:54.477 | very-high | |||
| mal_md5 | 275e76fc462b865fe1af32f5f15b41a37496dd97 | 50117813611 | 100 | ThreatStream | md5 | active | FINSPY,FinSpy,community-threat-briefing,Weaponization | 2017-09-25T11:43:54.485 | very-high | |||
| mal_md5 | df4b8c4b485d916c3cadd963f91f7fa9f509723f | 50117813610 | 100 | ThreatStream | md5 | active | FINSPY,FinSpy,community-threat-briefing,Weaponization | 2017-09-25T11:43:54.493 | very-high | |||
| mal_md5 | 66eccea3e8901f6d5151b49bca53c126f086e437 | 50117813609 | 100 | ThreatStream | md5 | active | FINSPY,FinSpy,community-threat-briefing,Weaponization | 2017-09-25T11:43:54.500 | very-high | |||
| mal_md5 | 3d90630ff6c151fc2659a579de8d204d1c2f841a | 50117813608 | 100 | ThreatStream | md5 | active | FINSPY,FinSpy,community-threat-briefing,Weaponization | 2017-09-25T11:43:54.507 | very-high | |||
| mal_md5 | a6d14b104744188f80c6c6b368b589e0bd361607 | 50117813607 | 100 | ThreatStream | md5 | active | FINSPY,FinSpy,community-threat-briefing,Weaponization | 2017-09-25T11:43:54.513 | very-high | |||
| mal_md5 | e3f183e67c818f4e693b69748962eecda53f7f88 | 50117813606 | 100 | ThreatStream | md5 | active | FINSPY,FinSpy,community-threat-briefing,Weaponization | 2017-09-25T11:43:54.520 | very-high | |||
| mal_md5 | f326479a4aacc2aaf86b364b78ed5b1b0def1fbe | 50117813605 | 100 | ThreatStream | md5 | active | FINSPY,FinSpy,community-threat-briefing,Weaponization | 2017-09-25T11:43:54.527 | very-high | |||
| mal_md5 | c4d1fb784fcd252d13058dbb947645a902fc8935 | 50117813604 | 100 | ThreatStream | md5 | active | FINSPY,FinSpy,community-threat-briefing,Weaponization | 2017-09-25T11:43:54.534 | very-high | |||
| mal_md5 | fb4a4143d4f32b0af4c2f6f59c8d91504d670b41 | 50117813603 | 100 | ThreatStream | md5 | active | FINSPY,FinSpy,community-threat-briefing,Weaponization | 2017-09-25T11:43:54.541 | very-high | |||
| mal_md5 | 400e4f843ff93df95145554b2d574a9abf24653f | 50117813602 | 100 | ThreatStream | md5 | active | FINSPY,FinSpy,community-threat-briefing,Weaponization | 2017-09-25T11:43:54.548 | very-high | |||
| mal_md5 | f82d18656341793c0a6b9204a68605232f0c39e7 | 50117813601 | 100 | ThreatStream | md5 | active | FINSPY,FinSpy,community-threat-briefing,Weaponization | 2017-09-25T11:43:54.555 | very-high | |||
| mal_md5 | c33fe4c286845a175ee0d83db6d234fe24dd2864 | 50117813600 | 100 | ThreatStream | md5 | active | FINSPY,FinSpy,community-threat-briefing,Weaponization | 2017-09-25T11:43:54.562 | very-high | |||
| mal_md5 | d9294b86b3976ddf89b66b8051ccf98cfae2e312 | 50117813599 | 100 | ThreatStream | md5 | active | FINSPY,FinSpy,community-threat-briefing,Weaponization | 2017-09-25T11:43:54.569 | very-high | |||
| mal_md5 | 9fc71853d3e6ac843bd36ce9297e398507e5b2bd | 50117813597 | 100 | ThreatStream | md5 | active | FINSPY,FinSpy,community-threat-briefing,Weaponization | 2017-09-25T11:43:54.576 | very-high | |||
| mal_md5 | c0ad9c242c533effd50b51e94874514a5b9f2219 | 50117813596 | 100 | ThreatStream | md5 | active | FINSPY,FinSpy,community-threat-briefing,Weaponization | 2017-09-25T11:43:54.583 | very-high |
threatstream-submit-to-sandbox
Submits a file or URL to the ThreatStream-hosted Sandbox for detonation.
Base Command
threatstream-submit-to-sandbox
Input
| Argument Name | Description | Required |
|---|---|---|
| submission_classification | Classification of the Sandbox submission. | Optional |
| report_platform | Platform on which the submitted URL or file will be run. To obtain a list supported platforms run the threatstream-get-sandbox-platforms command. | Optional |
| submission_type | The detonation type (“file” or “url”. | Required |
| submission_value | The submission value. Possible values are a valid URL or a file ID that was uploaded to the War Room to detonate. | Required |
| premium_sandbox | Specifies whether the premium sandbox should be used for detonation. Default is “false”. | Optional |
| detail | A CSV list of additional details for the indicator. This information is displayed in the Tag column of the ThreatStream UI. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| ThreatStream.Analysis.ReportID | String | The report ID that was submitted to the sandbox. |
| ThreatStream.Analysis.Status | String | The analysis status. |
| ThreatStream.Analysis.Platform | String | The platform of the submission submitted to the sanbox. |
Command Example
threatstream-submit-to-sandbox submission_type=file submission_value=5358@6cf3881e-1cfd-48b5-8fc3-0b9fcfb791f0 premium_sandbox=false report_platform=WINDOWS7
Context Example
{
"File": {
"EntryID": "5358@6cf3881e-1cfd-48b5-8fc3-0b9fcfb791f0",
"Extension": "png",
"Info": "image/png",
"MD5": "a36544c75d1253d8dd32070908adebd0",
"Name": "input_file.png",
"SHA1": "15868fbe28e34f601b4e07b0f356ecb1f3a14876",
"SHA256": "5126eb938b3c2dc53837d4805df01c8522a3bd4e5e77e9bc4f825b9ee178e6ab",
"SSDeep": "98304:pKOjdLh3d35gcNMjnN+FOLEdhVb2t6lLPP9nuyxJ4iQzxKxOduLT/GzxS3UvtT:pHhhvglN+F+GwUlLPP9PxnQzxKxOdEUR",
"Size": 4938234,
"Type": "PNG image data, 2572 x 1309, 8-bit/color RGBA, non-interlaced\n"
},
"ThreatStream": {
"Analysis": {
"Platform": "WINDOWS7",
"ReportID": 422662,
"Status": "processing"
}
}
}
Human Readable Output
The submission info for 5358@6cf3881e-1cfd-48b5-8fc3-0b9fcfb791f0
| ReportID | Status | Platform |
|---|---|---|
| 422662 | processing | WINDOWS7 |
threatstream-get-analysis-status
Returns the current status of the report that was submitted to the sandbox. The report ID is returned from threatstream-submit-to-sandbox command.
Base Command
threatstream-get-analysis-status
Input
| Argument Name | Description | Required |
|---|---|---|
| report_id | Report ID for which to check the status. | Required |
Context Output
| Path | Type | Description |
|---|---|---|
| ThreatStream.Analysis.ReportID | String | The report ID of the file or URL that was detonated to sandbox. |
| ThreatStream.Analysis.Status | String | The report status of the file or URL that was detonated in the sandbox. |
| ThreatStream.Analysis.Platform | String | The platfrom that was used for detonation. |
| ThreatStream.Analysis.Verdict | String | The report verdict of the file or URL that was detonated in the sandbox. The verdict will remain “benign” until detonation is complete. |
Command Example
``````
Human Readable Output
Report 413336 analysis results
| Category | Started | Completed | Duration | VmName | VmID | ReportID | Verdict |
|---|---|---|---|---|---|---|---|
| File | 2019-05-30 14:05:25 | 2019-05-30 14:06:33 | 68 | 413336 | Benign |
threatstream-analysis-report
Returns the report of a file or URL that was submitted to the sandbox.
Base Command
threatstream-analysis-report
Input
| Argument Name | Description | Required |
|---|---|---|
| report_id | Report ID to return. | Required |
Context Output
| Path | Type | Description |
|---|---|---|
| ThreatStream.Analysis.ReportID | String | The ID of the report submitted to the sandbox. |
| ThreatStream.Analysis.Category | String | The report category. |
| ThreatStream.Analysis.Started | String | Detonation start time. |
| ThreatStream.Analysis.Completed | String | Detonation completion time. |
| ThreatStream.Analysis.Duration | Number | Duration of the detonation (in seconds). |
| ThreatStream.Analysis.VmName | String | The name of the VM. |
| ThreatStream.Analysis.VmID | String | The ID of the VM. |
| ThreatStream.Analysis.Network.UdpSource | String | The source of UDP. |
| ThreatStream.Analysis.Network.UdpDestination | String | The destination of UDP. |
| ThreatStream.Analysis.Network.UdpPort | String | The port of the UDP. |
| ThreatStream.Analysis.Network.IcmpSource | String | The ICMP source. |
| ThreatStream.Analysis.Network.IcmpDestination | String | The destinaton of ICMP. |
| ThreatStream.Analysis.Network.IcmpPort | String | The port of the ICMP. |
| ThreatStream.Analysis.Network.TcpSource | String | The source of TCP. |
| ThreatStream.Analysis.Network.TcpDestination | String | The destination of TCP. |
| ThreatStream.Analysis.Network.TcpPort | String | The port of TCP. |
| ThreatStream.Analysis.Network.HttpSource | String | The source of HTTP. |
| ThreatStream.Analysis.Network.HttpDestinaton | String | The destination of HTTP. |
| ThreatStream.Analysis.Network.HttpPort | String | The port of HTTP. |
| ThreatStream.Analysis.Network.HttpsSource | String | The source of HTTPS. |
| ThreatStream.Analysis.Network.HttpsDestinaton | String | The destination of HTTPS. |
| ThreatStream.Analysis.Network.HttpsPort | String | The port of HTTPS. |
| ThreatStream.Analysis.Network.Hosts | String | The hosts of network analysis. |
| ThreatStream.Analysis.Verdict | String | The verdict of the sandbox detonation. |
Command Example
threatstream-get-analysis-status report_id=422662
Context Example
{
"ThreatStream": {
"Analysis": {
"Platform": "WINDOWS7",
"ReportID": "422662",
"Status": "processing",
"Verdict": "Benign"
}
}
}
Human Readable Output
The analysis status for id 422662
| Category | Started | Completed | Duration | VmName | VmID | ReportID | Verdict |
|---|---|---|---|---|---|---|---|
| File | 2019-05-30 14:05:25 | 2019-05-30 14:06:33 | 68 | 413336 | Benign |
threatstream-get-indicators
Return filtered indicators from ThreatStream. If a query is defined, it overides all othe arguments that were passed to the command.
Base Command
threatstream-get-indicators
Input
| Argument Name | Description | Required |
|---|---|---|
| query | Anomali Observable Search Filter Language query to filter indicatorts results. If a query is passed as an argument, it overides all other arguments. | Optional |
| asn | Autonomous System (AS) number associated with the indicator. | Optional |
| confidence | Level of certainty that an observable is of the reported indicator type. Confidence scores range from 0-100, in increasing order of confidence, and is assigned by ThreatStream based on several factors. |
Optional |
| country | Country associated with the indicator. | Optional |
| created_ts | When the indicator was first seen on the ThreatStream cloud platform. Date must be specified in this format: YYYYMMDDThhmmss, where “T” denotes the start of the value for time, in UTC time. For example, 2014-10-02T20:44:35. |
Optional |
| id | Unique ID for the indicator. | Optional |
| is_public | Classification of the indicator. | Optional |
| indicator_severity | Severity assigned to the indicator by ThreatStream. | Optional |
| org | Registered owner (organization) of the IP address associated with the indicator. | Optional |
| status | Status assigned to the indicator. | Optional |
| tags_name | Tag assigned to the indicator. | Optional |
| type | Type of indicator. | Optional |
| indicator_value | Value of the indicator. | Optional |
| limit | Maximum number of results to return from ThreatStrem. Default is 20. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| ThreatStream.Indicators.IType | String | The indicator type. |
| ThreatStream.Indicators.Modified | String | Date and time when the indicator was last updated on the ThreatStream. Format: YYYYMMDDThhmmss, where T denotes the start of the value for time, in UTC time. |
| ThreatStream.Indicators.Confidence | String | Level of certainty that an observable is of the reported indicator type. |
| ThreatStream.Indicators.Value | String | The indicator value. |
| ThreatStream.Indicators.Status | String | The indicator status. |
| ThreatStream.Indicators.Organization | String | Registered owner (organization) of the IP address associated with the indicator. |
| ThreatStream.Indicators.Country | String | Country associated with the indicator. |
| ThreatStream.Indicators.Tags | String | Tag assigned to the indicator. |
| ThreatStream.Indicators.Source | String | The source of the indicator. |
| ThreatStream.Indicators.ID | String | The ID of the indicator. |
| ThreatStream.Indicators.ASN | String | Autonomous System (AS) number associated with the indicator. |
| ThreatStream.Indicators.Severity | String | The severity assigned to the indicator. |
Command Example
threatstream-get-indicators type=ip status=active asn=4837 country=CN confidence=84 indicator_severity=medium org="China Unicom Guangxi" limit=5
Context Example
{
"ThreatStream.Indicators": [
{
"Status": "active",
"Confidence": 84,
"IType": "scan_ip",
"Severity": "medium",
"Tags": null,
"Country": "CN",
"Modified": "2019-06-24T10:19:52.077Z",
"Value": "121.31.166.99",
"ID": 53042398831,
"Source": "Anomali Labs MHN",
"Organization": "China Unicom Guangxi",
"Type": "ip",
"ASN": "4837"
},
{
"Status": "active",
"Confidence": 84,
"IType": "scan_ip",
"Severity": "medium",
"Tags": "port-1433,suricata,TCP",
"Country": "CN",
"Modified": "2019-06-24T09:51:04.804Z",
"Value": "121.31.166.99",
"ID": 53042253345,
"Source": "Anomali Labs MHN Tagged",
"Organization": "China Unicom Guangxi",
"Type": "ip",
"ASN": "4837"
},
{
"Status": "active",
"Confidence": 84,
"IType": "scan_ip",
"Severity": "medium",
"Tags": null,
"Country": "CN",
"Modified": "2019-06-24T06:08:12.585Z",
"Value": "182.88.27.168",
"ID": 53016547378,
"Source": "DShield Scanning IPs",
"Organization": "China Unicom Guangxi",
"Type": "ip",
"ASN": "4837"
},
{
"Status": "active",
"Confidence": 84,
"IType": "scan_ip",
"Severity": "medium",
"Tags": "AlienVault,OTX",
"Country": "CN",
"Modified": "2019-06-23T19:38:05.782Z",
"Value": "182.91.129.165",
"ID": 53038621037,
"Source": "Alien Vault OTX Malicious IPs",
"Organization": "China Unicom Guangxi",
"Type": "ip",
"ASN": "4837"
},
{
"Status": "active",
"Confidence": 84,
"IType": "scan_ip",
"Severity": "medium",
"Tags": null,
"Country": "CN",
"Modified": "2019-06-23T17:52:51.165Z",
"Value": "182.91.129.207",
"ID": 52970998522,
"Source": "DShield Scanning IPs",
"Organization": "China Unicom Guangxi",
"Type": "ip",
"ASN": "4837"
}
]
}
Human Readable Output
The indicators results
| IType | Value | Confidence | ID | Source | Type | Status | Tags | Modified | Organization | ASN | Country | Severity |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| scan_ip | 121.31.166.99 | 84 | 53042398831 | Anomali Labs MHN | ip | active | 2019-06-24T10:19:52.077Z | China Unicom Guangxi | 4837 | CN | medium | |
| scan_ip | 121.31.166.99 | 84 | 53042253345 | Anomali Labs MHN Tagged | ip | active | port-1433,suricata,TCP | 2019-06-24T09:51:04.804Z | China Unicom Guangxi | 4837 | CN | medium |
| scan_ip | 182.88.27.168 | 84 | 53016547378 | DShield Scanning IPs | ip | active | 2019-06-24T06:08:12.585Z | China Unicom Guangxi | 4837 | CN | medium | |
| scan_ip | 182.91.129.165 | 84 | 53038621037 | Alien Vault OTX Malicious IPs | ip | active | AlienVault,OTX | 2019-06-23T19:38:05.782Z | China Unicom Guangxi | 4837 | CN | medium |
| scan_ip | 182.91.129.207 | 84 | 52970998522 | DShield Scanning IPs | ip | active | 2019-06-23T17:52:51.165Z | China Unicom Guangxi | 4837 | CN | medium |
threatstream-add-tag-to-model
Add tags to intelligence for purposes of filtering for related entities.
Base Command
threatstream-add-tag-to-model
Input
| Argument Name | Description | Required |
|---|---|---|
| model | The type of threat model entity on which to add the tag. Default is “intelligence” (indicator). | Optional |
| tags | A CSV list of tags applied to the specified threat model entities or observable. | Required |
| model_id | The ID of the model on which to add the tag. | Required |
Context Output
There is no context output for this command.
threatstream-add-tag-to-model model=intelligence model_id=51375607503 tags="suspicious,not valid"
Human Readable Output
Added successfully tags: [‘suspicious’, ‘not valid’] to intelligence
with 51375607503
threatstream-create-model
Creates a threat model with the specified parameters.
Base Command
threatstream-create-model
Input
| Argument Name | Description | Required |
|---|---|---|
| model | The type of threat model to create. | Required |
| name | The name of the threat model to create. | Required |
| is_public | The scope of threat model visibility. | Optional |
| tlp | Traffic Light Protocol designation for the threat model. | Optional |
| tags | A CSV list of tags. | Optional |
| intelligence | A CSV list of indicators IDs associated with the threat model on the ThreatStream platform. | Optional |
| description | The description of the threat model. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| ThreatStream.Model.ModelType | String | The type of the threat model. |
| ThreatStream.Model.ModelID | String | The ID of the threat model. |
| ThreatStream.Model.Indicators.Value | String | The value of indicator associated with the specified model. |
| ThreatStream.Model.Indicators.ID | String | The ID of indicator associated with the specified model. |
| ThreatStream.Model.Indicators.IType | String | The iType of the indicator associated with the specified model. |
| ThreatStream.Model.Indicators.Severity | String | The severity of the indicator associated with the specified model. |
| ThreatStream.Model.Indicators.Confidence | String | The confidence of the indicator associated with the specified model. |
| ThreatStream.Model.Indicators.Country | String | The courty of the indicator associated with the specified model |
| ThreatStream.Model.Indicators.Organization | String | The organization of the indicator associated with the specified model. |
| ThreatStream.Model.Indicators.ASN | String | The ASN of the indicator associated with the specified model. |
| ThreatStream.Model.Indicators.Status | String | The status of the indicator associated with the specified model. |
| ThreatStream.Model.Indicators.Tags | String | The tags of the indicator associated with the specified model. |
| ThreatStream.Model.Indicators.Modified | String | The date and time the indicator was last modified. |
| ThreatStream.Model.Indicators.Source | String | The source of the inidicator. |
| ThreatStream.Model.Indicators.Type | String | The type of the inidicator. |
Command Example
threatstream-create-model model=actor name="New_Created_Actor" description="Description of the actor threat model" intelligence=53042425466,53042425532,53042425520 tags="new actor,test" tlp=red
Context Example
{
"ThreatStream.Model": {
"Indicators": [
{
"Status": "active",
"Confidence": 86,
"IType": "suspicious_domain",
"Severity": "high",
"Tags": "Suspicious-Domain-Registration,TSLABS,victim-Hi-Tech",
"Country": "US",
"Modified": "2019-06-24T10:51:16.384",
"Value": "chatbotshq.com",
"ID": "53042425532",
"Source": "Analyst",
"Organization": "Hostinger International Limited",
"Type": "domain",
"ASN": "12769"
},
{
"Status": "active",
"Confidence": 85,
"IType": "suspicious_domain",
"Severity": "high",
"Tags": "Suspicious-Domain-Registration,TSLABS,victim-Hi-Tech",
"Country": "US",
"Modified": "2019-06-24T10:51:16.589",
"Value": "marketshq.com",
"ID": "53042425520",
"Source": "Analyst",
"Organization": "GoDaddy.com, LLC",
"Type": "domain",
"ASN": "26496"
},
{
"Status": "active",
"Confidence": 77,
"IType": "suspicious_domain",
"Severity": "high",
"Tags": "Suspicious-Domain-Registration,TSLABS,victim-Hi-Tech",
"Country": "US",
"Modified": "2019-06-24T10:54:31.318",
"Value": "leanomalie.com",
"ID": "53042425466",
"Source": "Analyst",
"Organization": "GoDaddy.com, LLC",
"Type": "domain",
"ASN": "26496"
}
],
"ModelType": "Actor",
"ModelID": 26697
}
}
Human Readable Output
Indicators list for Threat Model Actor with id 26697
| IType | Value | ID | Confidence | Source | Type | Status | Tags | Modified | Organization | ASN | Country | Severity |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| suspicious_domain | chatbotshq.com | 53042425532 | 86 | Analyst | domain | active | Suspicious-Domain-Registration,TSLABS,victim-Hi-Tech | 2019-06-24T10:51:16.384 | Hostinger International Limited | 12769 | US | high |
| suspicious_domain | marketshq.com | 53042425520 | 85 | Analyst | domain | active | Suspicious-Domain-Registration,TSLABS,victim-Hi-Tech | 2019-06-24T10:51:16.589 | GoDaddy.com, LLC | 26496 | US | high |
| suspicious_domain | leanomalie.com | 53042425466 | 77 | Analyst | domain | active | Suspicious-Domain-Registration,TSLABS,victim-Hi-Tech | 2019-06-24T10:54:31.318 | GoDaddy.com, LLC | 26496 | US | high |
threatstream-update-model
Updates a threat model with specific parameters. If one or more optional parameters are defined, the command overides previous data stored in ThreatStream.
Base Command
threatstream-update-model
Input
| Argument Name | Description | Required |
|---|---|---|
| model | The type of threat model to update. | Required |
| model_id | The ID of the threat model to update. | Required |
| name | The name of the threat model to update. | Optional |
| is_public | The scope of threat model visibility. | Optional |
| tlp | Traffic Light Protocol designation for the threat model. | Optional |
| tags | A CSV list of tags. | Optional |
| intelligence | A CSV list of indicators IDs associated with the threat model on the ThreatStream platform. | Optional |
| description | The description of the threat model. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| ThreatStream.Model.ModelType | String | The type of the threat model. |
| ThreatStream.Model.ModelID | String | The ID of the threat model. |
| ThreatStream.Model.Indicators.Value | String | The value of indicator associated with the specified model. |
| ThreatStream.Model.Indicators.ID | String | The ID of indicator associated with the specified model. |
| ThreatStream.Model.Indicators.IType | String | The iType of the indicator associated with the specified model. |
| ThreatStream.Model.Indicators.Severity | String | The severity of the indicator associated with the specified model. |
| ThreatStream.Model.Indicators.Confidence | String | The confidence of the indicator associated with the specified model. |
| ThreatStream.Model.Indicators.Country | String | The courty of the indicator associated with the specified model |
| ThreatStream.Model.Indicators.Organization | String | The organization of the indicator associated with the specified model. |
| ThreatStream.Model.Indicators.ASN | String | The ASN of the indicator associated with the specified model. |
| ThreatStream.Model.Indicators.Status | String | The status of the indicator associated with the specified model. |
| ThreatStream.Model.Indicators.Tags | String | The tags of the indicator associated with the specified model. |
| ThreatStream.Model.Indicators.Modified | String | The date and time the indicator was last modified. |
| ThreatStream.Model.Indicators.Source | String | The source of the inidicator. |
| ThreatStream.Model.Indicators.Type | String | The type of the inidicator. |
Command Example
threatstream-update-model model=actor model_id=26697 intelligence=53042694591 tags="updated tag,gone"
Context Example
{
"ThreatStream": {
"Model": {
"Indicators": [
{
"ASN": "",
"Confidence": 36,
"Country": "CA",
"ID": "53042694591",
"IType": "exploit_ip",
"Modified": "2019-06-24T11:28:31.185",
"Organization": "OVH Hosting",
"Severity": "high",
"Source": "Analyst",
"Status": "active",
"Tags": "HoneyDB",
"Type": "ip",
"Value": "54.39.20.14"
}
],
"ModelID": "26697",
"ModelType": "Actor"
}
}
}
Human Readable Output
Indicators list for Threat Model Actor with id 26697
| IType | Value | ID | Confidence | Source | Type | Status | Tags | Modified | Organization | ASN | Country | Severity |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| exploit_ip | 54.39.20.14 | 53042694591 | 36 | Analyst | ip | active | HoneyDB | 2019-06-24T11:28:31.185 | OVH Hosting | CA | high |
threatstream-supported-platforms
Returns list of supported platforms for default or premium sandbox.
Base Command
threatstream-supported-platforms
Input
| Argument Name | Description | Required |
|---|---|---|
| sandbox_type | The type of sandbox (“default” or “premium”). | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| ThreatStream.PremiumPlatforms.Name | String | Name of the supported platform for premium sadnbox. |
| ThreatStream.PremiumPlatforms.Types | String | Type of supported submissions for premium sanbox. |
| ThreatStream.PremiumPlatforms.Label | String | The display name of the supported platform of premium sandbox. |
| ThreatStream.DefaultPlatforms.Name | String | Name of the supported platform for standard sadnbox. |
| ThreatStream.DefaultPlatforms.Types | String | Type of supported submissions for standard sanbox. |
| ThreatStream.DefaultPlatforms.Label | String | The display name of the supported platform of standard sandbox. |
Command Example
threatstream-supported-platforms sandbox_type=default
Context Example
{
"ThreatStream.DefaultPlatforms": [
{
"Name": "WINDOWSXP",
"Types": [
"file",
"url"
],
"Label": "Windows XP"
},
{
"Name": "WINDOWS7",
"Types": [
"file",
"url"
],
"Label": "Windows 7"
},
{
"Name": "ALL",
"Types": [
"file",
"url"
],
"Label": "All"
}
]
}
Human Readable Output
Supported platforms for default sandbox
| Name | Types | Label |
|---|---|---|
| WINDOWSXP | file, url | Windows XP |
| WINDOWS7 | file, url | Windows 7 |
| ALL | file, url | All |
url
Checks the reputation of the given URL.
Base Command
url
Input
| Argument Name | Description | Required |
|---|---|---|
| url | The URL to check. | Required |
| threshold | If severity is greater than or equal to the threshold, then the URL will be considered malicious. This argument will override the default threshold defined as a parameter. | Optional |
| include_inactive | Whether to include results with the status “Inactive”. Default is “False”. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| DBotScore.Indicator | String | The indicator that was tested. |
| DBotScore.Type | String | The indicator type. |
| DBotScore.Vendor | String | The vendor used to calculate the score. |
| DBotScore.Score | Number | The actual score. |
| URL.Data | String | The URL of the indicator. |
| URL.Tags | Unknown | (List) Tags of the URL. |
| URL.Malicious.Vendor | String | Vendor that reported the indicator as malicious. |
| ThreatStream.URL.Modified | String | Date and time when the indicator was last updated. The date format is: YYYYMMDDThhmmss, where “T” denotes the start of the value for time, in UTC time. |
| ThreatStream.URL.Confidence | String | Level of certainty that an observable is of the reported indicator type. Confidence score can range from 0-100, in increasing order of confidence. |
| ThreatStream.URL.Status | String | The status of the indicator. |
| ThreatStream.URL.Organization | String | Name of the business that owns the IP address associated with the indicator. |
| ThreatStream.URL.Address | String | URL of the indicator. |
| ThreatStream.URL.Country | String | Country associated with the indicator. |
| ThreatStream.URL.Type | String | The indicator type. |
| ThreatStream.URL.Source | String | The source of the indicator. |
| ThreatStream.URL.Severity | String | The indicator severity (“very-high”, “high”, “medium”, or “low”). |
| ThreatStream.URL.Tags | Unknown | Tags assigned to the URL. |
Command Example
url url=http://194.147.35.172/mikey.mpsl using-brand="Anomali ThreatStream v2"
Context Example
{
"URL": {
"Malicious": {
"Vendor": "ThreatStream"
},
"Data": "http://194.147.35.172/mikey.mpsl",
"Tags": ["phish-target", "victim-hi-tech"]
},
"ThreatStream.URL": {
"Status": "active",
"Confidence": 90,
"Severity": "very-high",
"Country": "RU",
"Modified": "2019-06-24T10:10:05.890Z",
"Source": "H3X Tracker",
"Address": "http://194.147.35.172/mikey.mpsl",
"Organization": "LLC Baxet",
"Type": "url",
"Tags": [{"id": "4wq", "name": "phish-target", "org_id": "88"}, {"id": "ezn", "name": "victim-hi-tech", "org_id": "88"}]
},
"DBotScore": {
"Vendor": "H3X Tracker",
"Indicator": "http://194.147.35.172/mikey.mpsl",
"Score": 3,
"Type": "url"
}
}
Human Readable Output
URL reputation for: http://194.147.35.172/mikey.mpsl
| Address | Confidence | Source | Type | Status | Modified | Organization | Country | Severity |
|---|---|---|---|---|---|---|---|---|
http://194.147.35.172/mikey.mpsl |
90 | H3X Tracker | url | active | 2019-06-24T10:10:05.890Z | LLC Baxet | RU | very-high |
Configuration parameters
url— Server URL (e.g., https://www.test.com) (required)credentials— Usernameusername— Usernameapikey— API Keydefault_threshold— Threshold of the indicator. (required)integrationReliability— Source Reliability (required)insecure— Trust any certificate (not secure)proxy— Use system proxy settings
Commands (19)
-
domainChecks the reputation of the given domain name.
-
fileChecks the reputation of the given hash of the file.
-
ipChecks the reputation of the given IP address.
-
threatstream-add-tag-to-modelAdds tags to intelligence for purposes of filtering for related entities.
-
threatstream-analysis-reportReturns the report of a file or URL that was submitted to the sandbox.
-
threatstream-create-modelCreates a threat model with the specified parameters.
-
threatstream-email-reputationChecks the reputation of the given email address.
-
threatstream-get-analysis-statusReturns the current status of the report that was submitted to the sandbox. The report ID is returned from the threatstream-submit-to-sandbox command.
-
threatstream-get-indicatorsReturn filtered indicators from ThreatStream. If a query is defined, it overrides all other arguments that were passed to the command.
-
threatstream-get-indicators-by-modelReturns a list of indicators associated with the specified model and ID of the model.
-
threatstream-get-model-descriptionReturns an HTML file with a description of the threat model.
-
threatstream-get-model-listReturns a list of threat models.
-
threatstream-get-passive-dnsReturns enrichment data for Domain or IP for available observables.
-
threatstream-import-indicator-with-approvalImports indicators (observables) into ThreatStream. Approval of the imported data is required, using the ThreatStream UI. The data can be imported using one of three methods: plain-text, file, or URL. Only one argument can be used.
-
threatstream-import-indicator-without-approvalImports indicators (observables) into ThreatStream. Approval is not required for the imported data. You must have the Approve Intel user permission to import without approval using the API.
-
threatstream-submit-to-sandboxSubmits a file or URL to the ThreatStream-hosted Sandbox for detonation.
-
threatstream-supported-platformsReturns a list of supported platforms for default or premium sandbox.
-
threatstream-update-modelUpdates a threat model with specific parameters. If one or more optional parameters are defined, the command overrides previous data stored in ThreatStream.
-
urlChecks the reputation of the given URL.
import demistomock as demisto from CommonServerPython import * from CommonServerUserPython import * ''' IMPORTS ''' import json import requests import urllib3 from requests.exceptions import MissingSchema, ConnectionError # Disable insecure warnings urllib3.disable_warnings() ''' GLOBALS/PARAMS ''' VENDOR_NAME = 'ThreatStream' HEADERS = { 'Content-Type': 'application/json' } CREDENTIALS: dict = {} DBOT_SCORE = { 'low': 2, 'medium': 2, 'high': 3, 'very-high': 3 } SEVERITY_SCORE = { 'low': 0, 'medium': 1, 'high': 2, 'very-high': 3 } DBOT_MAPPING = { 'value': 'Indicator', 'type': 'Type', 'source': 'Vendor', } DEFAULT_INDICATOR_MAPPING = { 'asn': 'ASN', 'value': 'Address', 'country': 'Country', 'type': 'Type', 'modified_ts': 'Modified', 'confidence': 'Confidence', 'status': 'Status', 'org': 'Organization', 'source': 'Source', 'tags': 'Tags', } INDICATOR_EXTENDED_MAPPING = { 'value': 'Value', 'id': 'ID', 'itype': 'IType', 'meta': 'Meta', 'confidence': 'Confidence', 'country': 'Country', 'org': 'Organization', 'asn': 'ASN', 'status': 'Status', 'tags': 'Tags', 'modified_ts': 'Modified', 'source': 'Source', 'type': 'Type', } THREAT_MODEL_MAPPING = { 'name': 'Name', 'id': 'ID', 'created_ts': 'CreatedTime', } ''' HELPER FUNCTIONS ''' class Client: def __init__(self, base_url, use_ssl, default_threshold, reliability): self.base_url = base_url self.use_ssl = use_ssl self.default_threshold = default_threshold self.reliability = reliability def http_request(self, method, url_suffix, params=None, data=None, headers=None, files=None, json=None, text_response=None): """ A wrapper for requests lib to send our requests and handle requests and responses better. """ res = requests.request( method, self.base_url + url_suffix, verify=self.use_ssl, params=params, data=data, headers=headers, files=files, json=json ) # Handle error responses gracefully if res.status_code in {401}: raise Exception(f"{VENDOR_NAME} - Got unauthorized from the server. Check the credentials.") elif res.status_code in {404}: command = demisto.command() if command in ['threatstream-get-model-description', 'threatstream-get-indicators-by-model', 'threatstream-get-analysis-status', 'threatstream-analysis-report']: # in order to prevent raising en error in case model/indicator/report was not found return {} else: raise Exception(f"{VENDOR_NAME} - The resource not found. Check the endpoint.") elif res.status_code not in {200, 201, 202}: raise Exception(F"{VENDOR_NAME} - Error in API call to ThreatStream {res.status_code} - {res.text}") if text_response: return res.text return res.json() def get_dbot_context(self, indicator, threshold, mapping=None): """ Builds and returns dictionary with Indicator, Type, Vendor and Score keys and values from the indicator that will be returned to context. """ if not mapping: mapping = DBOT_MAPPING dbot_context = {mapping[k]: v for (k, v) in indicator.items() if k in mapping.keys()} indicator_score = DBOT_SCORE[indicator.get('meta', {}).get('severity', 'low')] # the indicator will be considered as malicious in case it's score is greater or equal to threshold dbot_context['Score'] = 3 if indicator_score >= DBOT_SCORE[threshold] else indicator_score dbot_context['Vendor'] = VENDOR_NAME dbot_context['Reliability'] = self.reliability return dbot_context def find_worst_indicator(indicators): """ Sorts list of indicators by severity score and returns one indicator with the highest severity. In case the indicator has no severity value, the indicator severity score is set to 0 (low). """ indicators.sort(key=lambda ioc: SEVERITY_SCORE[ioc.get('meta', {}).get('severity', 'low')], reverse=True) return indicators[0] def prepare_args(args): # removing empty keys that can be passed from playbook input args = {k: v for (k, v) in args.items() if v} if 'include_inactive' in args: # special handling for ip, domain, file, url and threatstream-email-reputation commands args['status'] = "active,inactive" if args.pop('include_inactive') == 'True' else "active" if 'indicator_severity' in args: # special handling for threatstream-get-indicators args['meta.severity'] = args.pop('indicator_severity', None) if 'tags_name' in args: # special handling for threatstream-get-indicators args['tags.name'] = args.pop('tags_name', None) if 'indicator_value' in args: # special handling for threatstream-get-indicators args['value'] = args.pop('indicator_value', None) return args def build_params(**params): """ Builds query string from key word arguments and appends to it username and api key. """ params.update(CREDENTIALS) return params def mark_as_malicious(indicator, threshold, context): """ Marks indicator as malicious if severity of indicator is greater/equals to threshold and adds Malicious key to returned dictionary (context) in such case. """ severity = indicator.get('meta', {}).get('severity', 'low') if SEVERITY_SCORE[severity] >= SEVERITY_SCORE[threshold]: context['Malicious'] = { 'Vendor': 'ThreatStream' } def search_indicator_by_params(client: Client, params, searchable_value): """ Generic function that searches for indicators from ThreatStream by given query string. Returns indicator with the highest severity score. """ indicators_data = client.http_request("Get", "v2/intelligence/", params=params, headers=HEADERS) if not indicators_data['objects']: demisto.results(F"No intelligence has been found for {searchable_value}") return None return find_worst_indicator(indicators_data['objects']) def get_ip_context(indicator, threshold): """ Builds and returns dictionary that will be set to IP generic context. """ ip_context = {} ip_context['ASN'] = indicator.get('asn', '') ip_context['Address'] = indicator.get('value', '') ip_context['Geo'] = { 'Country': indicator.get('country', ''), 'Location': F"{indicator.get('latitude', '')},{indicator.get('longitude', '')}" } indicator_tags = indicator.get('tags', []) if indicator_tags: ip_context['Tags'] = [str(tag.get('name', '')) for tag in indicator_tags] mark_as_malicious(indicator, threshold, ip_context) return ip_context def get_domain_context(indicator, threshold): """ Builds and returns dictionary that will be set to Domain generic context. """ domain_context = {} whois_context = {} domain_context['Name'] = indicator.get('value', '') domain_context['DNS'] = indicator.get('ip', '') whois_context['CreationDate'] = indicator.get('created_ts', '') whois_context['UpdatedDate'] = indicator.get('modified_ts', '') meta = indicator.get('meta', None) if meta: registrant = {} registrant['Name'] = meta.get('registrant_name', '') registrant['Email'] = meta.get('registrant_email', '') registrant['Phone'] = meta.get('registrant_phone', '') whois_context['Registrant'] = registrant domain_context['WHOIS'] = whois_context indicator_tags = indicator.get('tags', []) if indicator_tags: domain_context['Tags'] = [str(tag.get('name', '')) for tag in indicator_tags] mark_as_malicious(indicator, threshold, domain_context) return domain_context def get_file_type(file_indicator): """ The function gets a file indicator data and returns it's subtype. """ indicator_type = file_indicator.get('subtype', '') return indicator_type def get_file_context(indicator, threshold): """ Builds and returns dictionary that will be set to File generic context. """ indicator_type = get_file_type(indicator) indicator_value = indicator.get('value', '') file_context = {} if indicator_type: file_context = {indicator_type: indicator_value} indicator_tags = indicator.get('tags', []) if indicator_tags: file_context['Tags'] = [str(tag.get('name', '')) for tag in indicator_tags] mark_as_malicious(indicator, threshold, file_context) return file_context def get_url_context(indicator, threshold): """ Builds and returns dictionary that will be set to URL generic context. """ url_context = {'Data': indicator.get('value', '')} indicator_tags = indicator.get('tags', []) if indicator_tags: url_context['Tags'] = [str(tag.get('name', '')) for tag in indicator_tags] mark_as_malicious(indicator, threshold, url_context) return url_context def get_threat_generic_context(indicator, indicator_mapping=None): """ Receives indicator and builds new dictionary from values that were defined in DEFAULT_INDICATOR_MAPPING keys and adds the Severity key with indicator severity value. """ # True when the indicator isn't a file (file indicator has a modified indicator_mapping). if not indicator_mapping: indicator_mapping = DEFAULT_INDICATOR_MAPPING threat_ip_context = {indicator_mapping[k]: v for (k, v) in indicator.items() if k in indicator_mapping.keys()} try: threat_ip_context['Severity'] = indicator['meta']['severity'] except KeyError: threat_ip_context['Severity'] = 'low' finally: return threat_ip_context def parse_network_elem(element_list, context_prefix): """ Parses the network elements list and returns a new dictionary. """ return list(map(lambda e: { F'{context_prefix}Source': e.get('src', ''), F'{context_prefix}Destination': e.get('dst', ''), F'{context_prefix}Port': e.get('dport', ''), }, element_list)) def parse_network_lists(network): """ Parses the network part that was received from sandbox report json. In each list, only sublist of 10 elements is taken. """ hosts = [{'Hosts': h} for h in network.get('hosts', [])[:10]] if 'packets' in network: network = network['packets'] udp_list = parse_network_elem(network.get('udp', [])[:10], 'Udp') icmp_list = parse_network_elem(network.get('icmp', [])[:10], 'Icmp') tcp_list = parse_network_elem(network.get('tcp', [])[:10], 'Tcp') http_list = parse_network_elem(network.get('http', [])[:10], 'Http') https_list = parse_network_elem(network.get('https', [])[:10], 'Https') network_result = udp_list + icmp_list + tcp_list + http_list + https_list + hosts return network_result def parse_info(info): """ Parses the info part that was received from sandbox report json """ info.update(info.pop('machine', {})) parsed_info = { 'Category': info.get('category', '').title(), 'Started': info.get('started', ''), 'Completed': info.get('ended', ''), 'Duration': info.get('duration', ''), 'VmName': info.get('name', ''), 'VmID': info.get('id', '') } return parsed_info def get_report_outputs(report, report_id): """ Returns human readable and entry context of the sandbox report """ info = parse_info(report.get('info', {})) info['ReportID'] = report_id _, info['Verdict'] = get_submission_status(report_id, False) network = parse_network_lists(report.get('network', {})) hm = tableToMarkdown(F"Report {report_id} analysis results", info) ec = { 'ThreatStream.Analysis': info, 'ThreatStream.Analysis.Network': network } return hm, ec def parse_indicators_list(iocs_list): """ Parses the indicator list and returns dictionary that will be set to context. """ for indicator in iocs_list: if indicator.get('type', '') == 'md5': indicator['type'] = indicator.get('subtype', '') iocs_context = list(map(lambda i: {INDICATOR_EXTENDED_MAPPING[k]: v for (k, v) in i.items() if k in INDICATOR_EXTENDED_MAPPING.keys()}, iocs_list)) for indicator in iocs_context: meta = indicator.pop('Meta', None) if meta: indicator['Severity'] = meta.get('severity', 'low') tags = indicator.get('Tags', []) if isinstance(tags, list): indicator['Tags'] = ",".join(list(map(lambda t: t.get('name', ''), tags))) return iocs_context def build_model_data(model, name, is_public, tlp, tags, intelligence, description): """ Builds data dictionary that is used in Threat Model creation/update request. """ if model == 'tipreport': description_field_name = 'body' else: description_field_name = 'description' data = {k: v for (k, v) in (('name', name), ('is_public', is_public), ('tlp', tlp), (description_field_name, description)) if v} if tags: data['tags'] = tags if isinstance(tags, list) else [t.strip() for t in tags.split(',')] if intelligence: data['intelligence'] = intelligence if isinstance(intelligence, list) else [i.strip() for i in intelligence.split(',')] return data def get_file_mapping(): """ Returns the file indicator mapping after changing it's type field to subtype. """ file_indicator_mapping = DEFAULT_INDICATOR_MAPPING.copy() # The real type of the hash is in subtype field. file_indicator_mapping.pop('type', '') file_indicator_mapping['subtype'] = 'Type' return file_indicator_mapping ''' COMMANDS + REQUESTS FUNCTIONS ''' def test_module(client: Client): """ Performs basic get request to get item samples """ params = build_params(limit=1) client.http_request('GET', 'v2/intelligence/', params=params) demisto.results('ok') def ips_reputation_command(client: Client, ip, threshold=None, status="active,inactive"): ips = argToList(ip, ',') for single_ip in ips: if is_ip_address_internal(single_ip): demisto.info(f"Skipping internal IP: {single_ip}") continue get_ip_reputation(client, single_ip, threshold, status) def get_ip_reputation(client: Client, ip, threshold=None, status="active,inactive"): """ Checks the reputation of given ip from ThreatStream and returns the indicator with highest severity score. """ params = build_params(value=ip, type="ip", status=status, limit=0) indicator = search_indicator_by_params(client, params, ip) if not indicator: return_results(create_indicator_result_with_dbotscore_unknown(indicator=ip, indicator_type=DBotScoreType.IP, reliability=client.reliability)) return threshold = threshold or client.default_threshold dbot_context = client.get_dbot_context(indicator, threshold) ip_context = get_ip_context(indicator, threshold) threat_ip_context = get_threat_generic_context(indicator) threat_ip_tags = threat_ip_context.pop('Tags', []) if threat_ip_tags: # Convert the tags objects into s string for the human readable and then override it with the original objects # for the context. threat_ip_context['Tags'] = ', '.join(str(tag.get('name', '')) for tag in threat_ip_tags) human_readable = tableToMarkdown(F"IP reputation for: {ip}", threat_ip_context) threat_ip_context['Tags'] = threat_ip_tags ec = { 'DBotScore': dbot_context, 'IP(val.Address == obj.Address)': ip_context, 'ThreatStream.IP(val.Address == obj.Address)': threat_ip_context } return_outputs(human_readable, ec, indicator) def domains_reputation_command(client: Client, domain, threshold=None, status="active,inactive"): """ Wrapper function for get_domain_reputation. """ domains = argToList(domain, ',') for single_domain in domains: get_domain_reputation(client, single_domain, threshold, status) def get_domain_reputation(client: Client, domain, threshold=None, status="active,inactive"): """ Checks the reputation of given domain from ThreatStream and returns the indicator with highest severity score. """ params = build_params(value=domain, type="domain", status=status, limit=0) indicator = search_indicator_by_params(client, params, domain) if not indicator: return_results(create_indicator_result_with_dbotscore_unknown(indicator=domain, indicator_type=DBotScoreType.DOMAIN, reliability=client.reliability)) return threshold = threshold or client.default_threshold dbot_context = client.get_dbot_context(indicator, threshold) domain_context = get_domain_context(indicator, threshold) threat_domain_context = get_threat_generic_context(indicator) threat_domain_tags = threat_domain_context.pop('Tags', []) if threat_domain_tags: # Convert the tags objects into s string for the human readable and then override it with the original objects # for the context. threat_domain_context['Tags'] = ', '.join(str(tag.get('name', '')) for tag in threat_domain_tags) human_readable = tableToMarkdown(F"Domain reputation for: {domain}", threat_domain_context) threat_domain_context['Tags'] = threat_domain_tags ec = { 'DBotScore': dbot_context, 'Domain(val.Name == obj.Name)': domain_context, 'ThreatStream.Domain(val.Address == obj.Address)': threat_domain_context } return_outputs(human_readable, ec, indicator) def files_reputation_command(client: Client, file, threshold=None, status="active,inactive"): """ Wrapper function for get_file_reputation. """ files = argToList(file, ',') for single_file in files: get_file_reputation(client, single_file, threshold, status) def get_file_reputation(client: Client, file, threshold=None, status="active,inactive"): """ Checks the reputation of given hash of the file from ThreatStream and returns the indicator with highest severity score. """ params = build_params(value=file, type="md5", status=status, limit=0) indicator = search_indicator_by_params(client, params, file) if not indicator: return_results(create_indicator_result_with_dbotscore_unknown(indicator=file, indicator_type=DBotScoreType.FILE, reliability=client.reliability)) return threshold = threshold or client.default_threshold file_dbot_mapping = { 'value': 'Indicator', 'subtype': 'Type', 'source': 'Vendor', } dbot_context = client.get_dbot_context(indicator, threshold, file_dbot_mapping) file_type = get_file_type(indicator) file_context = get_file_context(indicator, threshold) file_indicator_mapping = get_file_mapping() threat_file_context = get_threat_generic_context(indicator, file_indicator_mapping) threat_file_context[file_type] = threat_file_context.pop('Address') threat_file_context.pop("ASN", None) threat_file_context.pop("Organization", None) threat_file_context.pop("Country", None) threat_file_tags = threat_file_context.pop('Tags', []) if threat_file_tags: # Convert the tags objects into s string for the human readable and then override it with the original objects # for the context. threat_file_context['Tags'] = ', '.join(str(tag.get('name', '')) for tag in threat_file_tags) human_readable = tableToMarkdown(F"{file_type} reputation for: {file}", threat_file_context) threat_file_context['Tags'] = threat_file_tags ec = { 'DBotScore': dbot_context, Common.File.CONTEXT_PATH: file_context, f'ThreatStream.{Common.File.CONTEXT_PATH}': threat_file_context } return_outputs(human_readable, ec, indicator) def urls_reputation_command(client: Client, url, threshold=None, status="active,inactive"): """ Wrapper function for get_url_reputation. """ urls = argToList(url, ',') for single_url in urls: get_url_reputation(client, single_url, threshold, status) def get_url_reputation(client: Client, url, threshold=None, status="active,inactive"): """ Checks the reputation of given url address from ThreatStream and returns the indicator with highest severity score. """ params = build_params(value=url, type="url", status=status, limit=0) indicator = search_indicator_by_params(client, params, url) if not indicator: return_results(create_indicator_result_with_dbotscore_unknown(indicator=url, indicator_type=DBotScoreType.URL, reliability=client.reliability)) return threshold = threshold or client.default_threshold dbot_context = client.get_dbot_context(indicator, threshold) domain_context = get_url_context(indicator, threshold) threat_url_context = get_threat_generic_context(indicator) del threat_url_context['ASN'] threat_url_tags = threat_url_context.pop('Tags', []) if threat_url_tags: # Convert the tags objects into s string for the human readable and then override it with the original objects # for the context. threat_url_context['Tags'] = ', '.join(str(tag.get('name', '')) for tag in threat_url_tags) human_readable = tableToMarkdown(F"URL reputation for: {url}", threat_url_context) threat_url_context['Tags'] = threat_url_tags ec = { 'DBotScore': dbot_context, 'URL(val.Data == obj.Data)': domain_context, 'ThreatStream.URL(val.Address == obj.Address)': threat_url_context } return_outputs(human_readable, ec, indicator) def get_email_reputation(client: Client, email, threshold=None, status="active,inactive"): """ Checks the reputation of given email address from ThreatStream and returns the indicator with highest severity score. """ params = build_params(value=email, type="email", status=status, limit=0) indicator = search_indicator_by_params(client, params, email) if not indicator: return threshold = threshold or client.default_threshold dbot_context = client.get_dbot_context(indicator, threshold) threat_email_context = get_threat_generic_context(indicator) threat_email_context['Email'] = threat_email_context.pop('Address') threat_email_context.pop("ASN", None) threat_email_context.pop("Organization", None) threat_email_context.pop("Country", None) threat_email_tags = threat_email_context.pop('Tags', []) if threat_email_tags: # Convert the tags objects into s string for the human readable and then override it with the original objects # for the context. threat_email_context['Tags'] = ', '.join(str(tag.get('name', '')) for tag in threat_email_tags) human_readable = tableToMarkdown(F"Email reputation for: {email}", threat_email_context) threat_email_context['Tags'] = threat_email_tags ec = { 'DBotScore': dbot_context, 'ThreatStream.EmailReputation(val.Email == obj.Email)': threat_email_context } return_outputs(human_readable, ec, indicator) def get_passive_dns(client: Client, value, type="ip", limit=50): """ Receives value and type of indicator and returns enrichment data for domain or ip. """ dns_results = client.http_request("GET", F"v1/pdns/{type}/{value}/", params=CREDENTIALS).get('results', None) if not dns_results: demisto.results(F"No Passive DNS enrichment data found for {value}") sys.exit() dns_results = dns_results[:int(limit)] output = camelize(dns_results, delim='_') ec = ({ 'ThreatStream.PassiveDNS': output }) human_readable = tableToMarkdown(F"Passive DNS enrichment data for: {value}", output) return_outputs(human_readable, ec, dns_results) def import_ioc_with_approval(client: Client, import_type, import_value, confidence="50", classification="Private", threat_type="exploit", severity="low", ip_mapping=None, domain_mapping=None, url_mapping=None, email_mapping=None, md5_mapping=None): """ Imports indicators data to ThreatStream. The data can be imported using one of three import_types: data-text (plain-text), file-id of uploaded file to war room or URL. """ files = None uploaded_file = None data = assign_params( classification=classification, confidence=int(confidence), ip_mapping=ip_mapping, domain_mapping=domain_mapping, url_mapping=url_mapping, email_mapping=email_mapping, md5_mapping=md5_mapping, threat_type=threat_type, severity=severity, ) if import_type == 'file-id': try: # import_value will be entry id of uploaded file to war room file_info = demisto.getFilePath(import_value) except Exception: raise DemistoException(f"Entry {import_value} does not contain a file.") uploaded_file = open(file_info['path'], 'rb') files = {'file': (file_info['name'], uploaded_file)} elif import_type == 'url': data['url'] = import_value else: data['datatext'] = import_value params = build_params() # in case import_type is not file-id, http_requests will receive None as files res = client.http_request("POST", "v1/intelligence/import/", params=params, data=data, files=files) # closing the opened file if exist if uploaded_file: uploaded_file.close() # checking that response contains success key if res.get('success', False): imported_id = res.get('import_session_id', '') ec = {'ThreatStream.Import.ImportID': imported_id} return_outputs(F"The data was imported successfully. The ID of imported job is: {imported_id}", ec, res) else: return_outputs("The data was not imported. Check if valid arguments were passed", None) def import_ioc_without_approval(client: Client, file_id, classification, confidence=None, allow_unresolved=None, source_confidence_weight=None, expiration_ts=None, severity=None, tags=None, trustedcircles=None): """ Imports indicators data to ThreatStream. file_id of uploaded file to war room or URL. Other fields are """ if allow_unresolved: allow_unresolved = allow_unresolved == 'yes' if tags: tags = argToList(tags) if trustedcircles: trustedcircles = argToList(trustedcircles) try: # entry id of uploaded file to war room file_info = demisto.getFilePath(file_id) with open(file_info['path'], 'rb') as uploaded_file: ioc_to_import = json.load(uploaded_file) except json.JSONDecodeError: raise DemistoException(F"Entry {file_id} does not contain a valid json file.") except Exception: raise DemistoException(F"Entry {file_id} does not contain a file.") ioc_to_import.update({'meta': assign_params( classification=classification, confidence=confidence, allow_unresolved=allow_unresolved, source_confidence_weight=source_confidence_weight, expiration_ts=expiration_ts, severity=severity, tags=tags, trustedcircles=trustedcircles )}) params = build_params() res = client.http_request("PATCH", "v1/intelligence/", params=params, json=ioc_to_import, text_response=True) return_outputs("The data was imported successfully.", {}, res) def get_model_list(client: Client, model, limit="50"): """ Returns list of Threat Model that was specified. By default limit is set to 50 results. Possible values for model are : actor, campaign, incident, signature, ttp, vulnerability, tipreport """ # if limit=0 don't put to context params = build_params(limit=limit, skip_intelligence="true", skip_associations="true") model_list = client.http_request("GET", F"v1/{model}/", params=params).get('objects', None) if not model_list: demisto.results(F"No Threat Model {model.title()} found.") sys.exit() threat_list_context = list(map(lambda m: {THREAT_MODEL_MAPPING[k]: v for (k, v) in m.items() if k in THREAT_MODEL_MAPPING.keys()}, model_list)) for m in threat_list_context: m['Type'] = model.title() # in case that no limit was passed, the stage of set to context is skipped ec = {'ThreatStream.List': threat_list_context} if limit != '0' else None human_readable = tableToMarkdown(F"List of {model.title()}s", threat_list_context) return_outputs(human_readable, ec, model_list) def get_model_description(client: Client, model, id): """ Returns a description of Threat Model as html file to the war room. """ params = build_params(skip_intelligence="true", skip_associations="true") description = client.http_request("GET", F"v1/{model}/{id}", params=params) if model == 'signature': description = description.get('notes', None) elif model == 'tipreport': description = description.get('body', None) else: description = description.get('description', None) if not description: demisto.results(F"No description found for Threat Model {model.title()} with id {id}") sys.exit() demisto.results(fileResult(F"{model}_{id}.html", description.encode(encoding='UTF-8'))) def get_iocs_by_model(client: Client, model, id, limit="20"): """ Returns list of indicators associated with specific Threat Model by model id. """ params = build_params(limit=limit) iocs_list = client.http_request("GET", F"v1/{model}/{id}/intelligence/", params=params).get('objects', None) if not iocs_list: demisto.results(F"No indicators found for Threat Model {model.title()} with id {id}") sys.exit() iocs_context = parse_indicators_list(iocs_list) ec = { 'ThreatStream.Model(val.ModelID == obj.ModelID && val.ModelType == obj.ModelType)': {'ModelType': model.title(), 'ModelID': id, 'Indicators': iocs_context}, } human_readable = tableToMarkdown(F"Indicators list for Threat Model {model.title()} with id {id}", iocs_context) return_outputs(human_readable, ec, iocs_list) def create_model(client: Client, model, name, is_public="false", tlp=None, tags=None, intelligence=None, description=None): """ Creates Threat Model with basic parameters. """ data = build_model_data(model, name, is_public, tlp, tags, intelligence, description) model_id = client.http_request("POST", F"v1/{model}/", data=json.dumps(data), params=CREDENTIALS).get('id', None) if model_id: get_iocs_by_model(client, model, model_id, limit="50") else: demisto.results(F"{model.title()} Threat Model was not created. Check the input parameters") def update_model(client: Client, model, model_id, name=None, is_public="false", tlp=None, tags=None, intelligence=None, description=None): """ Updates a ThreatStream model with parameters. In case one or more optional parameters are defined, the previous data is overridden. """ data = build_model_data(model, name, is_public, tlp, tags, intelligence, description) client.http_request("PATCH", F"v1/{model}/{model_id}/", data=json.dumps(data), params=CREDENTIALS) get_iocs_by_model(client, model, model_id, limit="50") def supported_platforms(client: Client, sandbox_type="default"): """ Returns list of supported platforms for premium sandbox or default sandbox. """ platform_data = client.http_request("GET", "v1/submit/parameters/", params=CREDENTIALS) available_platforms = platform_data.get('platform_choices', []) if sandbox_type == 'default' else platform_data.get( 'premium_platform_choices', []) if available_platforms: supported_output = camelize(available_platforms) context_path = "ThreatStream.DefaultPlatforms" if sandbox_type == 'default' else "ThreatStream.PremiumPlatforms" return_outputs(tableToMarkdown(F"Supported platforms for {sandbox_type} sandbox", supported_output), {context_path: supported_output}, platform_data) else: demisto.results(F"No supported platforms found for {sandbox_type} sandbox") def get_submission_status(client: Client, report_id, output=True): """ Returns the sandbox submission status. If status is not received in report_info then status is set to done. Receives output boolean that prints the result to the war room. By default the output boolean is set to True. """ report_info = client.http_request("GET", F"v1/submit/{report_id}/", params=CREDENTIALS, headers=HEADERS) if not report_info: demisto.results(F"No report found with id {report_id}") sys.exit() status = report_info.get('status', "done") verdict = report_info.get('verdict', '').title() platform = report_info.get('platform', '') if output: report_outputs = {'ReportID': report_id, 'Status': status, 'Platform': platform, 'Verdict': verdict} ec = {'ThreatStream.Analysis(val.ReportID == obj.ReportID)': report_outputs} return_outputs(tableToMarkdown(F"The analysis status for id {report_id}", report_outputs), ec, report_info) return status, verdict def file_name_to_valid_string(file_name): try: # In case the user uses Demisto version < 5.0 and the new docker image will not be automatically changed import emoji if emoji.emoji_count(file_name): # type: ignore return emoji.demojize(file_name) # type: ignore except Exception: pass return file_name def submit_report(client: Client, submission_type, submission_value, submission_classification="private", report_platform="WINDOWS7", premium_sandbox="false", detail=None): """ Detonates URL or file that was uploaded to war room to ThreatStream sandbox. """ uploaded_file = None files = None data = { 'report_radio-classification': submission_classification, 'report_radio-platform': report_platform, 'use_premium_sandbox': premium_sandbox, } if detail: data['detail'] = detail if submission_type == 'file': try: # submission_value will be entry id of uploaded file to war room file_info = demisto.getFilePath(submission_value) except Exception: raise Exception(F"{VENDOR_NAME} - Entry {submission_value} does not contain a file.") uploaded_file = open(file_info['path'], 'rb') file_name = file_name_to_valid_string(file_info.get('name')) files = {'report_radio-file': (file_name, uploaded_file)} else: data['report_radio-url'] = submission_value res = client.http_request("POST", "v1/submit/new/", params=CREDENTIALS, data=data, files=files) # closing the opened file if exist if uploaded_file: uploaded_file.close() if str(res.get('success', '')).lower() == 'true': report_info = res['reports'][report_platform] report_id = report_info['id'] report_status, _ = get_submission_status(client, report_id, False) report_outputs = {'ReportID': report_id, 'Status': report_status, 'Platform': report_platform} ec = {'ThreatStream.Analysis': report_outputs} return_outputs(tableToMarkdown(F"The submission info for {submission_value}", report_outputs), ec, report_info) else: demisto.results(F"The submission of {submission_value} failed") def get_report(client: Client, report_id): """ Returns the report from ThreatStream sandbox by id. """ report = client.http_request("GET", F"v1/submit/{report_id}/report", params=CREDENTIALS, headers=HEADERS) if not report: demisto.results(F"No report found with id {report_id}") sys.exit() hm, ec = get_report_outputs(report.get('results', {}), report_id) return_outputs(hm, ec, report) def add_tag_to_model(client: Client, model_id, tags, model="intelligence"): """ Adds tag to specific Threat Model. By default is set to intelligence (indicators). """ tags = tags if isinstance(tags, list) else tags.split(',') data = { 'tags': [{'name': t, 'tlp': 'red'} for t in tags] } res = client.http_request("POST", F"v1/{model}/{model_id}/tag/", params=CREDENTIALS, data=json.dumps(data)) if str(res.get('success', '')).lower() == 'true': return_outputs(F"Added successfully tags: {tags} to {model} with {model_id}", None, res) else: return_outputs(F"Failed to add {tags} to {model} with {model_id}", None, res) def get_indicators(client: Client, **kwargs): """ Returns filtered indicators by parameters from ThreatStream. By default the limit of indicators result is set to 20. """ limit = kwargs['limit'] = int(kwargs.get('limit', 20)) offset = kwargs['offset'] = 0 if 'query' in kwargs: kwargs['q'] = kwargs['query'] kwargs.pop('query', None) params = build_params(**kwargs) iocs_list = client.http_request("GET", "v2/intelligence/", params=params).get('objects', None) if not iocs_list: demisto.results('No indicators found from ThreatStream') sys.exit() iocs_context = parse_indicators_list(iocs_list) # handle the issue that the API does not return more than 1000 indicators. if limit > 1000: while len(iocs_context) < limit: offset += len(iocs_list) kwargs['limit'] = limit kwargs['offset'] = offset params = build_params(**kwargs) iocs_list = client.http_request("GET", "v2/intelligence/", params=params).get('objects', None) if iocs_list: iocs_context.extend(parse_indicators_list(iocs_list)) else: break ec = {'ThreatStream.Indicators': iocs_context} return_outputs(tableToMarkdown("The indicators results", iocs_context), ec, iocs_list) def main(): """ Initiate integration command """ command = demisto.command() LOG(f'Command being called is {command}') params = demisto.params() user_name = params.get('credentials', {}).get('identifier', '') or params.get('username', '') api_key = params.get('credentials', {}).get('password', '') or params.get('apikey', '') server_url = params.get('url', '').strip('/') CREDENTIALS['username'] = user_name CREDENTIALS['api_key'] = api_key reliability = params.get('integrationReliability') reliability = reliability if reliability else DBotScoreReliability.B if DBotScoreReliability.is_valid_type(reliability): reliability = DBotScoreReliability.get_dbot_score_reliability_from_str(reliability) else: Exception("Please provide a valid value for the Source Reliability parameter.") try: client = Client( base_url=f'{server_url}/api/', use_ssl=not params.get('insecure', False), default_threshold=params.get('default_threshold', 'high'), reliability=reliability ) handle_proxy() args = prepare_args(demisto.args()) if command == 'test-module': test_module(client) elif command == 'ip': ips_reputation_command(client, **args) elif command == 'domain': domains_reputation_command(client, **args) elif command == 'file': files_reputation_command(client, **args) elif command == 'url': urls_reputation_command(client, **args) elif command == 'threatstream-email-reputation': get_email_reputation(client, **args) elif command == 'threatstream-get-passive-dns': get_passive_dns(client, **args) elif command == 'threatstream-import-indicator-with-approval': import_ioc_with_approval(client, **args) elif command == 'threatstream-import-indicator-without-approval': import_ioc_without_approval(client, **args) elif command == 'threatstream-get-model-list': get_model_list(client, **args) elif command == 'threatstream-get-model-description': get_model_description(client, **args) elif command == 'threatstream-get-indicators-by-model': get_iocs_by_model(client, **args) elif command == 'threatstream-create-model': create_model(client, **args) elif command == 'threatstream-update-model': update_model(client, **args) elif command == 'threatstream-submit-to-sandbox': submit_report(client, **args) elif command == 'threatstream-get-analysis-status': get_submission_status(client, **args) elif command == 'threatstream-analysis-report': get_report(client, **args) elif command == 'threatstream-supported-platforms': supported_platforms(client, **args) elif command == 'threatstream-get-indicators': get_indicators(client, **args) elif command == 'threatstream-add-tag-to-model': add_tag_to_model(client, **args) except Exception as err: if isinstance(err, MissingSchema): return_error("Not valid server url. Check url format") elif isinstance(err, ConnectionError): return_error("The server is not reachable.") else: return_error(err) # python2 uses __builtin__ python3 uses builtins if __name__ in ("builtins", "__builtin__", "__main__"): main()