From 2d6debdd77189e864457a7499e63ec4cc9a19d3b Mon Sep 17 00:00:00 2001 From: Dinko Jakovljevic <141251667+DinkoReversingLabs@users.noreply.github.com> Date: Tue, 14 Nov 2023 14:30:06 +0100 Subject: [PATCH 01/11] ReversingLabs TitaniumCloud v2: Bugfix - Widget data render (#7) * Fixed data rendering issue in investigation widget * Added info in release notes for new version * Reworked data render for list_user_override to table * Reworked data display for aggregated user override * Connector data output adjusted for list_overrides * Increased version on user agent * Removed global widget css style * ReversingLabs logo update * Updated network_reputation action * Updated json config for user overrides * Removed custom views reference * Highlight associated malware status * Adjusted code to flake8 * Added minimal_data_paths to json --- README.md | 4 +- logo_reversinglabs_ticloudv2.svg | 24 +- logo_reversinglabs_ticloudv2_dark.svg | 15 +- release_notes/unreleased.md | 8 + reversinglabs_ticloudv2.json | 139 +++++++-- reversinglabs_ticloudv2_connector.py | 16 +- reversinglabs_ticloudv2_views.py | 38 +-- ...versinglabs_ticloudv2_advanced_search.html | 13 - .../reversinglabs_ticloudv2_analyze_url.html | 13 - .../reversinglabs_ticloudv2_av_scanners.html | 13 - ...bs_ticloudv2_dynamic_analysis_results.html | 13 - ...reversinglabs_ticloudv2_file_analysis.html | 13 - ...versinglabs_ticloudv2_file_reputation.html | 13 - ...glabs_ticloudv2_functional_similarity.html | 13 - ...singlabs_ticloudv2_imphash_similarity.html | 13 - ...2_list_user_overrides_aggregated_view.html | 121 -------- ...bs_ticloudv2_list_user_overrides_view.html | 121 -------- ...network_reputation_user_override_view.html | 15 +- ...abs_ticloudv2_network_reputation_view.html | 272 ++++++++---------- ...singlabs_ticloudv2_submit_for_dynamic.html | 13 - views/reversinglabs_ticloudv2_uri_index.html | 13 - ...eversinglabs_ticloudv2_uri_statistics.html | 13 - ...rsinglabs_ticloudv2_url_analysis_feed.html | 13 - ...nglabs_ticloudv2_url_downloaded_files.html | 25 +- ...eversinglabs_ticloudv2_url_reputation.html | 13 - 25 files changed, 303 insertions(+), 664 deletions(-) delete mode 100644 views/reversinglabs_ticloudv2_list_user_overrides_aggregated_view.html delete mode 100644 views/reversinglabs_ticloudv2_list_user_overrides_view.html diff --git a/README.md b/README.md index 24c4def..67ed845 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # Reversinglabs TitaniumCloud v2 Publisher: ReversingLabs -Connector Version: 1.2.0 +Connector Version: 1.2.1 Product Vendor: Reversinglabs Product Name: TitaniumCloud Product Version Supported (regex): ".\*" @@ -1733,4 +1733,4 @@ action_result.parameter.remove_overrides_list | string | | action_result.status | string | | action_result.message | string | | summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | \ No newline at end of file +summary.total_objects_successful | numeric | | diff --git a/logo_reversinglabs_ticloudv2.svg b/logo_reversinglabs_ticloudv2.svg index 6f1aab4..aaef305 100644 --- a/logo_reversinglabs_ticloudv2.svg +++ b/logo_reversinglabs_ticloudv2.svg @@ -1 +1,23 @@ -Asset 1 + + + + + + + + + + + + + + + + + + + + + + + diff --git a/logo_reversinglabs_ticloudv2_dark.svg b/logo_reversinglabs_ticloudv2_dark.svg index ee85799..a4fb977 100644 --- a/logo_reversinglabs_ticloudv2_dark.svg +++ b/logo_reversinglabs_ticloudv2_dark.svg @@ -1 +1,14 @@ -Asset 2 + + + + + + + + + + + + + + diff --git a/release_notes/unreleased.md b/release_notes/unreleased.md index fbcb2fd..372c70a 100644 --- a/release_notes/unreleased.md +++ b/release_notes/unreleased.md @@ -1 +1,9 @@ **Unreleased** + +* Bug fixes: + * Applied fixes to the data rendering on executed action within application widget in investigation pane + * Removed duplicate jQuery reference in network reputation view + +* Enhancements: + * Unified CSS style in widget and custom views + * Updated ReversingLabs branding diff --git a/reversinglabs_ticloudv2.json b/reversinglabs_ticloudv2.json index c5b4613..43a452a 100644 --- a/reversinglabs_ticloudv2.json +++ b/reversinglabs_ticloudv2.json @@ -16,8 +16,8 @@ } ], "license": "Copyright (c) ReversingLabs, 2023", - "app_version": "1.2.0", - "utctime_updated": "2023-10-20T11:31:29.572259Z", + "app_version": "1.2.1", + "utctime_updated": "2023-11-10T13:13:00.593313Z", "package_name": "phantom_reversinglabs_ticloudv2", "main_module": "reversinglabs_ticloudv2_connector.py", "min_phantom_version": "5.5.0", @@ -2226,7 +2226,11 @@ "data_type": "string", "required": true, "primary": false, - "contains": [], + "contains": [ + "domain", + "url", + "ip" + ], "value_list": [], "default": "", "order": 0, @@ -2237,18 +2241,69 @@ }, "output": [ { - "data_path": "action_result.parameter.network_locations", + "data_path": "action_result.data.*.requested_network_location", "data_type": "string", - "contains": [], - "column_name": "network_locations", + "contains": [ + "domain", + "url", + "ip" + ], + "column_name": "network_location", "column_order": 0 }, { - "data_path": "action_result.status", + "data_path": "action_result.data.*.type", "data_type": "string", - "column_name": "status", + "column_name": "type", "column_order": 1 }, + { + "data_path": "action_result.data.*.last_seen", + "data_type": "string", + "column_name": "last seen", + "column_order": 2 + }, + { + "data_path": "action_result.data.*.first_seen", + "data_type": "string", + "column_name": "first seen", + "column_order": 3 + }, + { + "data_path": "action_result.data.*.associated_malware", + "data_type": "string", + "column_name": "associated malware", + "column_order": 4 + }, + { + "data_path": "action_result.data.*.third_party_reputations.total", + "data_type": "string", + "column_name": "total", + "column_order": 5 + }, + { + "data_path": "action_result.data.*.third_party_reputations.clean", + "data_type": "string", + "column_name": "clean", + "column_order": 6 + }, + { + "data_path": "action_result.data.*.third_party_reputations.malicious", + "data_type": "string", + "column_name": "malicious", + "column_order": 7 + }, + { + "data_path": "action_result.data.*.third_party_reputations.undetected", + "data_type": "string", + "column_name": "undetected", + "column_order": 8 + }, + { + "data_path": "action_result.status", + "data_type": "string", + "column_name": "status" + }, { "data_path": "action_result.message", "data_type": "string" @@ -2265,7 +2320,7 @@ "render": { "type": "custom", "width": 10, - "height": 5, + "height": 10, "view": "reversinglabs_ticloudv2_views.network_reputation", "title": "TitaniumCloud Network Reputation" }, @@ -2284,7 +2339,9 @@ "data_type": "string", "required": false, "primary": false, - "contains": [], + "contains": [ + "sha1" + ], "value_list": [], "default": "", "order": 0, @@ -2293,18 +2350,32 @@ }, "output": [ { - "data_path": "action_result.parameter.next_page_sha1", + "data_path": "action_result.data.*.user_override.network_locations.*.network_location", "data_type": "string", - "contains": [], - "column_name": "next_page_sha1", + "contains": [ + "url", + "domain", + "ip" + ], + "column_name": "network_location", "column_order": 0 }, { - "data_path": "action_result.status", + "data_path": "action_result.data.*.user_override.network_locations.*.type", "data_type": "string", - "column_name": "status", + "contains": [ + "url", + "domain", + "ip" + ], + "column_name": "type", "column_order": 1 }, + { + "data_path": "action_result.status", + "data_type": "string", + "column_name": "status" + }, { "data_path": "action_result.message", "data_type": "string" @@ -2319,11 +2390,7 @@ } ], "render": { - "type": "custom", - "width": 10, - "height": 5, - "view": "reversinglabs_ticloudv2_views.list_user_overrides", - "title": "TitaniumCloud List User Overrides" + "type": "table" }, "versions": "EQ(*)" }, @@ -2349,18 +2416,32 @@ }, "output": [ { - "data_path": "action_result.parameter.max_results", - "data_type": "numeric", - "contains": [], - "column_name": "max_results", + "data_path": "action_result.data.*.*.network_location", + "data_type": "string", + "contains": [ + "url", + "domain", + "ip" + ], + "column_name": "network_location", "column_order": 0 }, { - "data_path": "action_result.status", + "data_path": "action_result.data.*.*.type", "data_type": "string", - "column_name": "status", + "contains": [ + "url", + "domain", + "ip" + ], + "column_name": "type", "column_order": 1 }, + { + "data_path": "action_result.status", + "data_type": "string", + "column_name": "status" + }, { "data_path": "action_result.message", "data_type": "string" @@ -2375,11 +2456,7 @@ } ], "render": { - "type": "custom", - "width": 10, - "height": 5, - "view": "reversinglabs_ticloudv2_views.list_user_overrides_aggregated", - "title": "TitaniumCloud List User Overrides Aggregated" + "type": "table" }, "versions": "EQ(*)" }, diff --git a/reversinglabs_ticloudv2_connector.py b/reversinglabs_ticloudv2_connector.py index 2fc3092..85b42c0 100644 --- a/reversinglabs_ticloudv2_connector.py +++ b/reversinglabs_ticloudv2_connector.py @@ -40,7 +40,6 @@ def new_get(url, **kwargs): phantom.requests.get = new_get - old_post = phantom.requests.post @@ -49,7 +48,6 @@ def new_post(url, **kwargs): phantom.requests.post = new_post - old_delete = phantom.requests.delete @@ -62,7 +60,7 @@ def new_delete(url, **kwargs): class ReversinglabsTitaniumCloudV2Connector(BaseConnector): ticloud_spex_url = "/api/spex/upload/" - USER_AGENT = "ReversingLabs Splunk SOAR TitaniumCloudv2 v1.2.0" + USER_AGENT = "ReversingLabs Splunk SOAR TitaniumCloudv2 v1.2.1" # The actions supported by this connector ACTION_ID_TEST_CONNECTIVITY = "test_connectivity" @@ -337,6 +335,8 @@ def _handle_get_latest_url_analysis_feed(self, action_result, param): for x in response: action_result.add_data(x) + self.debug_print("ACTION RESULT DATA:", action_result) + def _handle_get_url_analysis_feed_from_date(self, action_result, param): self.debug_print("Action handler", self.get_action_identifier()) @@ -702,7 +702,11 @@ def _handle_get_network_reputation(self, action_result, param): ) self.debug_print("Executed", self.get_action_identifier()) - action_result.add_data(response.json()) + + for x in response.json()["rl"]["entries"]: + action_result.add_data(x) + + return action_result.get_status() def _handle_get_list_user_overrides(self, action_result, param): self.debug_print("Action handler", self.get_action_identifier()) @@ -719,7 +723,9 @@ def _handle_get_list_user_overrides(self, action_result, param): ) self.debug_print("Executed", self.get_action_identifier()) - action_result.add_data(response.json()) + action_result.add_data(response.json()["rl"]) + + return action_result.get_status() def _handle_get_list_user_overrides_aggregated(self, action_result, param): self.debug_print("Action handler", self.get_action_identifier()) diff --git a/reversinglabs_ticloudv2_views.py b/reversinglabs_ticloudv2_views.py index 8485fc6..a1025ed 100644 --- a/reversinglabs_ticloudv2_views.py +++ b/reversinglabs_ticloudv2_views.py @@ -13,7 +13,6 @@ # CONDITIONS OF ANY KIND, either express or implied. See the License for the # specific language governing permissions and limitations under the License. - def file_reputation(provides, all_app_runs, context): for summary, action_results in all_app_runs: for result in action_results: @@ -104,8 +103,7 @@ def latest_url_analysis_feed(provides, all_app_runs, context): for summary, action_results in all_app_runs: for result in action_results: context['data'] = result.get_data() - - context['param'] = result.get_param() + context['param'] = result.get_param() return 'views/reversinglabs_ticloudv2_url_analysis_feed.html' @@ -214,42 +212,14 @@ def uri_index(provides, all_app_runs, context): def network_reputation(provides, all_app_runs, context): - for summary, action_results in all_app_runs: - for result in action_results: - data = {} - - entries = result.get_data()[0].get("rl", {}).get("entries") - data["entries"] = entries - - context["data"] = data - - return 'views/reversinglabs_ticloudv2_network_reputation_view.html' - - -def list_user_overrides(provides, all_app_runs, context): - for summary, action_results in all_app_runs: - for result in action_results: - data = {} - - user_override = result.get_data()[0].get("rl", {}).get("user_override") - data["user_override"] = user_override - - context["data"] = data - - return 'views/reversinglabs_ticloudv2_list_user_overrides_view.html' - -def list_user_overrides_aggregated(provides, all_app_runs, context): for summary, action_results in all_app_runs: for result in action_results: - data = {} - - network_locations = result.get_data()[0] - data["network_locations"] = network_locations + context['data'] = result.get_data() - context["data"] = data + context['param'] = result.get_param() - return 'views/reversinglabs_ticloudv2_list_user_overrides_aggregated_view.html' + return 'views/reversinglabs_ticloudv2_network_reputation_view.html' def network_reputation_user_override(provides, all_app_runs, context): diff --git a/views/reversinglabs_ticloudv2_advanced_search.html b/views/reversinglabs_ticloudv2_advanced_search.html index 619dda9..13ebb6d 100644 --- a/views/reversinglabs_ticloudv2_advanced_search.html +++ b/views/reversinglabs_ticloudv2_advanced_search.html @@ -16,19 +16,6 @@ background-repeat: no-repeat; background-image: url('/app_resource/{{ title_logo }}');"{% endif %}{% endblock %} {% block widget_content %} -
- {% if data.network_locations == None %} - There is no network location overrides object in the response JSON. - {% else %} - - - - - {% for net_loc in data.network_locations %} - - - - - - - - - - {% endfor %} -
Network location {{net_loc.network_location}}
Type {{net_loc.type}}
- {% endif %} -
-{% endblock %} \ No newline at end of file diff --git a/views/reversinglabs_ticloudv2_list_user_overrides_view.html b/views/reversinglabs_ticloudv2_list_user_overrides_view.html deleted file mode 100644 index b93df92..0000000 --- a/views/reversinglabs_ticloudv2_list_user_overrides_view.html +++ /dev/null @@ -1,121 +0,0 @@ - - -{% extends 'widgets/widget_template.html' %} -{% load custom_template %} -{% block custom_title_prop %}{% if title_logo %}style="background-size: auto 60%; background-position: 50%; -background-repeat: no-repeat; background-image: url('/app_resource/{{ title_logo }}');"{% endif %}{% endblock %} -{% block widget_content %} - -
- {% if data.user_override == None %} - There is no overrides for network locations object in the response JSON. - {% else %} - - - - - {% for net_loc in data.user_override.network_locations %} - - - - - - - - - - {% endfor %} -
Network location {{net_loc.network_location}}
Type {{net_loc.type}}
- {% endif %} -
-{% endblock %} \ No newline at end of file diff --git a/views/reversinglabs_ticloudv2_network_reputation_user_override_view.html b/views/reversinglabs_ticloudv2_network_reputation_user_override_view.html index d7e314e..19564a0 100644 --- a/views/reversinglabs_ticloudv2_network_reputation_user_override_view.html +++ b/views/reversinglabs_ticloudv2_network_reputation_user_override_view.html @@ -16,19 +16,6 @@ background-repeat: no-repeat; background-image: url('/app_resource/{{ title_logo }}');"{% endif %}{% endblock %} {% block widget_content %} -
- {% if data.entries == None %} - There is no network location object in the response JSON. - {% else %} - {% for net_loc in data.entries %} -
- - - - + {% for x in data %} +
+
+ - + + + + - - + + - - + + - - + + - - + + {% if x.associated_malware == True %} + + {% else %} + + {% endif %} - - + + - - + + - - + + + - -
ReversingLabs Network Reputation for {{net_loc.type}}Requested Network Location{{ x.requested_network_location }} 
Requested network location {{net_loc.requested_network_location}}Type{{ x.type }}
Type {{net_loc.type}}Last Seen{{ x.last_seen }}
Associated malware {{net_loc.associated_malware}}First Seen{{ x.first_seen }}
First seen {{net_loc.first_seen}}Associated Malware{{ x.associated_malware }}{{ x.associated_malware }}
Last seen {{net_loc.last_seen}}Total{{ x.third_party_reputations.total }}
Third party reputations - Total: {{net_loc.third_party_reputations.total}} - Clean: {{net_loc.third_party_reputations.clean}} - Malicious: {{net_loc.third_party_reputations.malicious}} - Undetected: {{net_loc.third_party_reputations.undetected}} - Clean{{ x.third_party_reputations.clean }}
Malicious{{ x.third_party_reputations.malicious }}
- + + Undetected + {{ x.third_party_reputations.undetected }} + + + +
+
- + }); + } + {% endfor %} - {% endif %}
- {% endblock %} diff --git a/views/reversinglabs_ticloudv2_submit_for_dynamic.html b/views/reversinglabs_ticloudv2_submit_for_dynamic.html index 19a9482..bdad243 100644 --- a/views/reversinglabs_ticloudv2_submit_for_dynamic.html +++ b/views/reversinglabs_ticloudv2_submit_for_dynamic.html @@ -16,19 +16,6 @@ background-repeat: no-repeat; background-image: url('/app_resource/{{ title_logo }}');"{% endif %}{% endblock %} {% block widget_content %}
{% if data.report_base == None %} - There is no rl object in the response JSON. + There is no rl object in the response JSON. {% else %} - @@ -84,20 +132,24 @@ + + + + - + - + - + {% if param.latest == True or param.analysis_id != None%} @@ -134,7 +186,363 @@ {% endif %} + + + + + + + + + {% if data.report_base.report.dropped_files %} + + + + + + + + + + {% endif %} + {% if data.report_base.report.snort_alerts %} + + + + + + + + + + {% endif %} + {% if data.report_base.report.signatures %} + + + + + + + + + + {% endif %} + + + + {% if data.report_base.report.network.dns %} + + + + + + + {% endif %} + {% if data.report_base.report.network.tcp %} + + + + + + + {% endif %} + {% if data.report_base.report.network.udp %} + + + + + + + {% endif %} + {% if data.report_base.report.network.url %} + + + + + + + {% endif %} + {% if data.report_base.report.network.http %} + + + + + + + {% endif %} + + + + + + + + + + + + + + + + +
ReversingLabs dynamic analysis for + ReversingLabs dynamic analysis for File
{{data.report_base.requested_hash}}
Classification - {{data.report_base.report.classification}} + {{data.report_base.report.classification}}
Requested SHA1 of file{{ data.report_base.requested_hash }} 
MD5{{data.report_base.report.md5}}{{ data.report_base.report.md5 }} 
SHA-1{{data.report_base.report.sha1}}{{ data.report_base.report.sha1 }} 
SHA-256{{data.report_base.report.sha256}}{{ data.report_base.report.sha256 }} 
Configuration{{data.report_base.report.configuration}}
Risk score{{data.report_base.report.risk_score}}
Dropped files
+
+ {% for y in data.report_base.report.dropped_files %} + + {% endfor %} +
+
+ {% for y in data.report_base.report.dropped_files %} +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
md5{{y.md5}} 
sha1{{y.sha1}} 
sha256{{y.sha256}} 
file name{{ y.file_name }} 
file path{{ y.file_path }} 
sample type{{y.sample_type}}
sample classification{{y.classification}}
+
+ {% endfor %} +
Snort alerts
+
+ {% for y in data.report_base.report.snort_alerts %} + + {% endfor %} +
+
+ {% for y in data.report_base.report.snort_alerts %} +
+ + + + + + + + + + + + + + + + + + + +
message{{ y.message }}
classification type{{ y.classification_type }}
destination ip{{ y.destination_ip }} 
rule{{ y.rule }}
+
+ {% endfor %} +
Signatures
+
+ {% for y in data.report_base.report.signatures %} + + {% endfor %} +
+
+ {% for y in data.report_base.report.signatures %} +
+ + + + + + + + + + + + + + + +
signature id{{y.sig_id}}
description{{y.description}}
risk factor{{y.risk_factor}}
+
+ {% endfor %} +
Network
+
+ {% for y in data.report_base.report.network.dns %} + + {% endfor %} +
+
+ {% for y in data.report_base.report.network.dns %} +
+ + + + + + + + + + + + + + + + + + + +
type{{y.type}}
value{{y.value}} 
address{{y.address}} 
process id{{y.process_id}}
+
+ {% endfor %} +
+
+ {% for y in data.report_base.report.network.tcp %} + + {% endfor %} +
+
+ {% for y in data.report_base.report.network.tcp %} +
+ + + + + + + + + + + + + + + +
process id{{y.process_id}}
destination ip{{y.destination_ip}} 
destination port{{y.destination_port}}
+
+ {% endfor %} +
+
+ {% for y in data.report_base.report.network.udp %} + + {% endfor %} +
+
+ {% for y in data.report_base.report.network.udp %} +
+ + + + + + + + + + + + + + + +
process id{{y.process_id}}
destination ip{{y.destination_ip}} 
destination port{{y.destination_port}}
+
+ {% endfor %} +
+
+ {% for y in data.report_base.report.network.url %} + + {% endfor %} +
+
+ {% for y in data.report_base.report.network.url %} +
+ + + + + + + + + + + +
url{{y.url}} 
source{{y.source}}
+
+ {% endfor %} +
+
+ {% for y in data.report_base.report.network.http %} + + {% endfor %} +
+
+ {% for y in data.report_base.report.network.http %} +
+ + + + + + + + + + + + + + + +
url{{y.url}} 
method{{y.method}}
process id{{y.process_id}}
+
+ {% endfor %} +
PcapDownload link
ScreenshotDownload link
Memory stringsDownload link
Dropped Files URLDownload link
{% endif %}
+ {% endblock %} diff --git a/views/reversinglabs_ticloudv2_dynamic_url_analysis_results.html b/views/reversinglabs_ticloudv2_dynamic_url_analysis_results.html new file mode 100644 index 0000000..340d117 --- /dev/null +++ b/views/reversinglabs_ticloudv2_dynamic_url_analysis_results.html @@ -0,0 +1,652 @@ +{% extends 'widgets/widget_template.html' %} +{% load custom_template %} +{% block custom_title_prop %}{% if title_logo %}style="background-size: auto 60%; background-position: 50%; +background-repeat: no-repeat; background-image: url('/app_resource/{{ title_logo }}');"{% endif %}{% endblock %} +{% block widget_content %} + + + + +
+ {% if data == None %} + There is no rl object in the response JSON. + {% else %} + + + {% if data.requested_sha1_url != None %} + + + + {% endif %} + {% if data.requested_base64_url != None %} + + + + {% endif %} + + + + + + + {% if data.report.classification_version %} + + + + + {% endif %} + {% if data.requested_sha1_url != None %} + + + + + {% endif %} + {% if data.requested_base64_url != None %} + + + + + {% endif %} + {% if param.latest == True or param.analysis_id != None%} + + + + + + + + + + + + + + + + + {% if data.report.browser %} + + + + + {% endif %} + {% if data.report.configuration %} + + + + + {% endif %} + + + + + {% else %} + + + + + + + + + + + + + {% if data.report.browser %} + + + + + {% endif %} + {% if data.report.configuration %} + + + + + {% endif %} + + + + + {% endif %} + {% if data.report.dropped_files %} + + + + + + + + + + {% endif %} + {% if data.report.snort_alerts %} + + + + + + + + + + {% endif %} + {% if data.report.signatures %} + + + + + + + + + + {% endif %} + + + + {% if data.report.network.dns %} + + + + + + + {% endif %} + {% if data.report.network.tcp %} + + + + + + + {% endif %} + {% if data.report.network.udp %} + + + + + + + {% endif %} + {% if data.report.network.url %} + + + + + + + {% endif %} + {% if data.report.network.http %} + + + + + + + {% endif %} + {% if data.report.pcap %} + + + + + {% endif %} + {% if data.report.screenshots %} + + + + + {% endif %} + {% if data.report.memory_strings %} + + + + + {% endif %} + {% if data.report.dropped_files_url %} + + + + + {% endif %} + +
ReversingLabs dynamic analysis for URL +
{{data.requested_sha1_url}}
ReversingLabs dynamic analysis for URL +
{{data.requested_base64_url}}
Classification + {{data.report.classification}} +
Classification version{{data.report.classification_version}}
Requested SHA1 of url{{ data.requested_sha1_url }} 
Requested Base64 of url{{ data.requested_base64_url }} 
Analysis ID{{data.report.analysis_id}}
Analysis time{{data.report.analysis_time}}
Analysis duration{{data.report.analysis_duration}}
Platform{{data.report.platform}}
Browser{{data.report.browser}}
Configuration{{data.report.configuration}}
Risk score{{data.report.risk_score}}
First Analysis{{data.report.first_analysis}}
Last Analysis{{data.report.last_analysis}}
Platforms + {% for x in data.report.platforms %} + {{x}}
+ {% endfor %} +
Browser{{data.report.browser}}
Configuration{{data.report.configuration}}
Risk score{{data.report.risk_score}}
Dropped files
+
+ {% for y in data.report.dropped_files %} + + {% endfor %} +
+
+ {% for y in data.report.dropped_files %} +
+ + + + + + + + + + + + + + + + + + + {% if y.file_path %} + + + + + {% endif %} + + + + + {% if y.analysis_ids %} + {% for z in y.analysis_ids %} + + + + + + + + + {% endfor %} + {% endif %} + + + + + +
md5{{y.md5}} 
sha1{{y.sha1}} 
sha256{{y.sha256}} 
file name{{ y.file_name }} 
file path{{ y.file_path }} 
sample type{{y.sample_type}}
Analysis id{{z.analysis_id}}
Classification{{z.classification}}
sample classification{{y.classification}}
+
+ {% endfor %} +
Snort alerts
+
+ {% for y in data.report.snort_alerts %} + + {% endfor %} +
+
+ {% for y in data.report.snort_alerts %} +
+ + + + + + + + + + + + + + + + + + + +
message{{ y.message }}
classification type{{ y.classification_type }}
destination ip{{ y.destination_ip }} 
rule{{ y.rule }}
+
+ {% endfor %} +
Signatures
+
+ {% for y in data.report.signatures %} + + {% endfor %} +
+
+ {% for y in data.report.signatures %} +
+ + + + + + + + + + + + + + + {% if y.analysis_ids %} + + + {% for z in y.analysis_ids %} + + {% endfor %} + + {% endif %} + +
signature id{{y.sig_id}}
description{{y.description}}
risk factor{{y.risk_factor}}
Analysis id{{ z }}
+
+ {% endfor %} +
Network
+
+ {% for y in data.report.network.dns %} + + {% endfor %} +
+
+ {% for y in data.report.network.dns %} +
+ + + + + + + + + + + + + + + + + + + {% if y.analysis_ids %} + {% for z in y.analysis_ids %} + + + + + {% endfor %} + {% endif %} + +
type{{y.type}}
value{{y.value}} 
address{{y.address}} 
process id{{y.process_id}}
Analysis id{{ z }}
+
+ {% endfor %} +
+
+ {% for y in data.report.network.tcp %} + + {% endfor %} +
+
+ {% for y in data.report.network.tcp %} +
+ + + + + + + + + + + + + + + {% if y.analysis_ids %} + {% for z in y.analysis_ids %} + + + + + {% endfor %} + {% endif %} + +
process id{{y.process_id}}
destination ip{{y.destination_ip}} 
destination port{{y.destination_port}}
Analysis id{{ z }}
+
+ {% endfor %} +
+
+ {% for y in data.report.network.udp %} + + {% endfor %} +
+
+ {% for y in data.report.network.udp %} +
+ + + + + + + + + + + + + + + {% if y.analysis_ids %} + {% for z in y.analysis_ids %} + + + + + {% endfor %} + {% endif %} + +
process id{{y.process_id}}
destination ip{{y.destination_ip}} 
destination port{{y.destination_port}}
Analysis id{{ z }}
+
+ {% endfor %} +
+
+ {% for y in data.report.network.url %} + + {% endfor %} +
+
+ {% for y in data.report.network.url %} +
+ + + + + + + + + + + {% if y.analysis_ids %} + {% for z in y.analysis_ids %} + + + + + {% endfor %} + {% endif %} + +
url{{y.url}} 
source{{y.source}}
Analysis id{{ z }}
+
+ {% endfor %} +
+
+ {% for y in data.report.network.http %} + + {% endfor %} +
+
+ {% for y in data.report.network.http %} +
+ + + + + + + + + + + + + + + {% if y.analysis_ids %} + {% for z in y.analysis_ids %} + + + + + {% endfor %} + {% endif %} + +
url{{y.url}} 
method{{y.method}}
process id{{y.process_id}}
Analysis id{{ z }}
+
+ {% endfor %} +
PcapDownload link (Note: This link expires in 60 minutes; refresh or regenerate for a new one after expiry!)
ScreenshotDownload link (Note: This link expires in 60 minutes; refresh or regenerate for a new one after expiry!)
Memory stringsDownload link (Note: This link expires in 60 minutes; refresh or regenerate for a new one after expiry!)
Dropped Files URLDownload link (Note: This link expires in 60 minutes; refresh or regenerate for a new one after expiry!)
+
+ {% endif %} + +{% endblock %} diff --git a/views/reversinglabs_ticloudv2_file_analysis.html b/views/reversinglabs_ticloudv2_file_analysis.html index dd69e2e..6887cfb 100644 --- a/views/reversinglabs_ticloudv2_file_analysis.html +++ b/views/reversinglabs_ticloudv2_file_analysis.html @@ -1,3 +1,9 @@ +{% extends 'widgets/widget_template.html' %} +{% load custom_template %} +{% block custom_title_prop %}{% if title_logo %}style="background-size: auto 60%; background-position: 50%; +background-repeat: no-repeat; background-image: url('/app_resource/{{ title_logo }}');"{% endif %}{% endblock %} +{% block widget_content %} + -{% extends 'widgets/widget_template.html' %} -{% load custom_template %} -{% block custom_title_prop %}{% if title_logo %}style="background-size: auto 60%; background-position: 50%; -background-repeat: no-repeat; background-image: url('/app_resource/{{ title_logo }}');"{% endif %}{% endblock %} -{% block widget_content %} - + +
+ {% for x in data %}
diff --git a/views/reversinglabs_ticloudv2_submit_for_dynamic.html b/views/reversinglabs_ticloudv2_submit_for_dynamic.html index bdad243..ebcc7f0 100644 --- a/views/reversinglabs_ticloudv2_submit_for_dynamic.html +++ b/views/reversinglabs_ticloudv2_submit_for_dynamic.html @@ -1,3 +1,9 @@ +{% extends 'widgets/widget_template.html' %} +{% load custom_template %} +{% block custom_title_prop %}{% if title_logo %}style="background-size: auto 60%; background-position: 50%; +background-repeat: no-repeat; background-image: url('/app_resource/{{ title_logo }}');"{% endif %}{% endblock %} +{% block widget_content %} + -{% extends 'widgets/widget_template.html' %} -{% load custom_template %} -{% block custom_title_prop %}{% if title_logo %}style="background-size: auto 60%; background-position: 50%; -background-repeat: no-repeat; background-image: url('/app_resource/{{ title_logo }}');"{% endif %}{% endblock %} -{% block widget_content %} +
+{% if data == None %} + There is no Usage reports for requested user in the response JSON. +{% else %} +
+ + + + + + {% for report in data %} + + + + {% for item in report.usage_report %} + + + + + + + + + {% if item.used_bytes != None %} + + + + + {% endif %} + {% endfor %} + + + + {% endfor %} + +
ReversingLabs API Usage report
Usage report for {{report.date}}
Product{{item.product}}
Number of queries{{item.number_of_queries}}
Used bytes{{item.used_bytes}}
+{% endif %} +
+{% endblock %} diff --git a/views/reversinglabs_ticloudv2_customer_monthrange_usage.html b/views/reversinglabs_ticloudv2_customer_monthrange_usage.html new file mode 100644 index 0000000..e56f143 --- /dev/null +++ b/views/reversinglabs_ticloudv2_customer_monthrange_usage.html @@ -0,0 +1,118 @@ +{% extends 'widgets/widget_template.html' %} +{% load custom_template %} +{% block custom_title_prop %}{% if title_logo %}style="background-size: auto 60%; background-position: 50%; +background-repeat: no-repeat; background-image: url('/app_resource/{{ title_logo }}');"{% endif %}{% endblock %} +{% block widget_content %} + + + + +
+{% if data == None %} + There is no Usage reports for requested user in the response JSON. +{% else %} + + + + + + + {% for report in data %} + + + + {% for item in report.usage_report %} + + + + + + + + + {% if item.used_bytes != None %} + + + + + {% endif %} + {% endfor %} + + + + {% endfor %} + +
ReversingLabs API Usage report
Usage report for {{report.month}}
Product{{item.product}}
Number of queries{{item.number_of_queries}}
Used bytes{{item.used_bytes}}
+{% endif %} +
+{% endblock %} diff --git a/views/reversinglabs_ticloudv2_domain_downloaded_files.html b/views/reversinglabs_ticloudv2_domain_downloaded_files.html new file mode 100644 index 0000000..d6d040c --- /dev/null +++ b/views/reversinglabs_ticloudv2_domain_downloaded_files.html @@ -0,0 +1,213 @@ +{% extends 'widgets/widget_template.html' %} +{% load custom_template %} +{% block custom_title_prop %}{% if title_logo %}style="background-size: auto 60%; background-position: 50%; +background-repeat: no-repeat; background-image: url('/app_resource/{{ title_logo }}');"{% endif %}{% endblock %} +{% block widget_content %} + + + + + +
+ {% if data.report_base == None %} + There is no report object in the response JSON. + {% else %} + + + + + + + + {% if data.report_base.downloaded_files %} + + {% for item in data.report_base.downloaded_files %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {% if item.threat_level %} + + + + + {% endif %} + {% if item.trust_factor %} + + + + + {% endif %} + {% if item.threat_name %} + + + + + {% endif %} + {% if item.malware_type %} + + + + + {% endif %} + {% if item.malware_family %} + + + + + {% endif %} + {% if item.platform %} + + + + + {% endif %} + {% if item.subplatform %} + + + + + {% endif %} + + + + + + + + + + + + + + + + + + {% endfor %} + {% endif %} + +
TitaniumCloud Downloaded files for requested domain + +
Downloaded files
md5{{item.md5}} 
sha1{{item.sha1}} 
sha256{{item.sha256}} 
First Seen{{item.first_seen}}
Last Seen{{item.last_seen}}
Sample size{{item.sample_size}}
Sample Type{{item.sample_type}}
Classification{{item.classification}}
Threat Level{{item.threat_level}}
Trust Factor{{item.trust_factor}}
Threat Name{{item.threat_name}}
Malware Type{{item.malware_type}}
Malware Family{{item.malware_family}}
Platform{{item.platform}}
Subplatform{{item.subplatform}}
First Download{{item.first_download}}
Last Download{{item.last_download}}
Last Download Url{{item.last_download_url}} 
Sample Available{{item.sample_available}}
+ {% endif %} +
+{% endblock %} diff --git a/views/reversinglabs_ticloudv2_domain_report.html b/views/reversinglabs_ticloudv2_domain_report.html new file mode 100644 index 0000000..9d3c00d --- /dev/null +++ b/views/reversinglabs_ticloudv2_domain_report.html @@ -0,0 +1,292 @@ +{% extends 'widgets/widget_template.html' %} +{% load custom_template %} +{% block custom_title_prop %}{% if title_logo %}style="background-size: auto 60%; background-position: 50%; +background-repeat: no-repeat; background-image: url('/app_resource/{{ title_logo }}');"{% endif %}{% endblock %} +{% block widget_content %} + + + + + + + +
+ {% if data.report_base == None %} + There is no report object in the response JSON. + {% else %} +
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + {% if data.report_base.top_threats %} + + {% for item in data.report_base.top_threats %} + + + + + + + + + + + + + {% endfor %} + {% endif %} + {% if data.report_base.last_dns_records != None %} + + {% for item in data.report_base.last_dns_records %} + + + + + + + + + + + + + {% endfor %} + {% endif %} + {% if data.report_base.third_party_reputations.statistics != None %} + + + + + + + + + + + + + + + + + + {% endif %} + {% if data.report_base.third_party_reputations.sources != None %} + + {% for item in data.report_base.third_party_reputations.sources %} + + + + + + + + + + + + + {% endfor %} + {% endif %} + +
TitaniumCloud Get Domain Report for + +
Last Seen{{data.report_base.last_seen}}
Modified time{{data.report_base.modified_time}}
Last DNS records time{{data.report_base.last_dns_records_time}}
Top Threats List
Threat name{{item.threat_name}}
Threat level{{item.threat_level}}
Files count{{item.files_count}}
Last DNS Records
Type{{item.type}}
Value{{item.value}}
Provider{{item.provider}}
Third Party Reputations Statistics
Total{{data.report_base.third_party_reputations.statistics.total}}
Clean{{data.report_base.third_party_reputations.statistics.clean}}
Malicious{{data.report_base.third_party_reputations.statistics.malicious}}
Undetected{{data.report_base.third_party_reputations.statistics.undetected}}
Third Party Reputation Sources
Source{{item.source}}
Detection{{item.detection}}
Update Time{{item.update_time}}
+ {% endif %} +
+ + +{% endblock %} diff --git a/views/reversinglabs_ticloudv2_dynamic_analysis_results.html b/views/reversinglabs_ticloudv2_dynamic_analysis_results.html index 1df1e70..11ce6bc 100644 --- a/views/reversinglabs_ticloudv2_dynamic_analysis_results.html +++ b/views/reversinglabs_ticloudv2_dynamic_analysis_results.html @@ -17,7 +17,7 @@ --> + + +
{% if data.malware_presence == None %} There is no malware_presence object in the response JSON. {% else %} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {% if data.malware_presence.status in "MALICIOUS,SUSPICIOUS" %} - - - - - - - - - {% elif data.malware_presence.status == "KNOWN" %} - - - - - {% endif %} - - - - -
ReversingLabs TitaniumCloud File Reputation for -
{{data.malware_presence.sha1}} -
Classification - {{data.malware_presence.status}} -
Classification reason: {{data.malware_presence.reason}}
First seen{{data.malware_presence.first_seen}}
Last seen{{data.malware_presence.last_seen}}
AV scanner hits / total number of scanners{{data.malware_presence.scanner_match}} / {{data.malware_presence.scanner_count}}
AV scanner hit percentage{{data.malware_presence.scanner_percent}}
MD5 hash{{data.malware_presence.md5}}
SHA-1 hash{{data.malware_presence.sha1}}
SHA-256 hash{{data.malware_presence.sha256}}
Threat name{{data.malware_presence.threat_name}}
Threat level{{data.malware_presence.threat_level}}
Trust factor{{data.malware_presence.trust_factor}}
Classification reason{{data.malware_presence.reason}}
- {% endif %} +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {% if data.malware_presence.status in "MALICIOUS,SUSPICIOUS" %} + + + + + + + + + {% elif data.malware_presence.status == "KNOWN" %} + + + + + {% endif %} + + + + +
ReversingLabs TitaniumCloud File Reputation for +
{{data.malware_presence.sha1}} +
Classification + {{data.malware_presence.status}} +
Classification reason: {{data.malware_presence.reason}}
First seen{{data.malware_presence.first_seen}}
Last seen{{data.malware_presence.last_seen}}
AV scanner hits / total number of scanners{{data.malware_presence.scanner_match}} / {{data.malware_presence.scanner_count}}
AV scanner hit percentage{{data.malware_presence.scanner_percent}}
MD5 hash{{ data.malware_presence.md5 }} 
SHA-1 hash{{ data.malware_presence.sha1 }} 
SHA-256 hash{{ data.malware_presence.sha256 }} 
Threat name{{data.malware_presence.threat_name}}
Threat level{{data.malware_presence.threat_level}}
Trust factor{{data.malware_presence.trust_factor}}
Classification reason{{data.malware_presence.reason}}
+ {% endif %} +
+
+
+ +
+
+ + {% endblock %} diff --git a/views/reversinglabs_ticloudv2_file_reputation_user_overrides.html b/views/reversinglabs_ticloudv2_file_reputation_user_overrides.html new file mode 100644 index 0000000..b4f7021 --- /dev/null +++ b/views/reversinglabs_ticloudv2_file_reputation_user_overrides.html @@ -0,0 +1,204 @@ +{% extends 'widgets/widget_template.html' %} +{% load custom_template %} +{% block custom_title_prop %}{% if title_logo %}style="background-size: auto 60%; background-position: 50%; +background-repeat: no-repeat; background-image: url('/app_resource/{{ title_logo }}');"{% endif %}{% endblock %} +{% block widget_content %} + + + + +
+ {% if data.user_override == None %} + There is no File reputation user override object in the response JSON. + {% else %} + + + + + + + {% for over in data.user_override.create_override %} + + + + + + + + + + + + + + + + + + + + {% if over.status == "KNOWN" %} + + + + + {% endif %} + {% if over.status != "KNOWN" %} + + + + + + + + + {% endif %} + {% endfor %} + + {% for over in data.user_override.replace_override %} + + + + + + + + + + + + + + + + + + + + {% if over.status == "KNOWN" %} + + + + + {% endif %} + {% if over.status != "KNOWN" %} + + + + + + + + + {% endif %} + {% endfor %} + + {% for over in data.user_override.remove_override %} + + + + + + + + + + + + + + + + + + + + {% if over.status == "KNOWN" %} + + + + + {% endif %} + {% if over.status != "KNOWN" %} + + + + + + + + + {% endif %} + {% endfor %} + +
File reputation user overrides
Created user overrides
SHA1{{over.sha1}} 
MD5{{over.md5}} 
SHA256{{over.sha256}} 
Status{{over.status}}
Trust Factor{{over.trust_factor}}
Threat Level{{over.threat_level}}
Threat Name{{over.threat_name}}
Replaced user overrides
SHA1{{over.sha1}} 
MD5{{over.md5}} 
SHA256{{over.sha256}} 
Status{{over.status}}
Trust Factor{{over.trust_factor}}
Threat Level{{over.threat_level}}
Threat Name{{over.threat_name}}
Removed user overrides
SHA1{{over.sha1}} 
MD5{{over.md5}} 
SHA256{{over.sha256}} 
Status{{over.status}}
Trust Factor{{over.trust_factor}}
Threat Level{{over.threat_level}}
Threat Name{{over.threat_name}}
+ {% endif %} +
+{% endblock %} diff --git a/views/reversinglabs_ticloudv2_functional_similarity.html b/views/reversinglabs_ticloudv2_functional_similarity.html index bda0923..0dd972b 100644 --- a/views/reversinglabs_ticloudv2_functional_similarity.html +++ b/views/reversinglabs_ticloudv2_functional_similarity.html @@ -17,7 +17,7 @@ -->
- - - - - - - - - - - - - - - - - {% for x in data %} - - - - - - - - - - {% endfor %} - - -
ReversingLabs RHA1 Functional Similarity for -
{{param.hash}}
-
{{results_found}}
-
SHA1 Sample type Threat name Threat level Trust factor Classification
{{ forloop.counter}}.{{ x.sha1}}{{ x.sample_type }}{{ x.threat_name }}{{ x.threat_level }}{{ x.trust_factor }} - {{ x.classification }} -
+ + + + + + + + + + + + + + + + + {% for x in data %} + + + + + + + + + + {% endfor %} + +
ReversingLabs RHA1 Functional Similarity for + +
{{results_found}}
+
SHA1 Sample type Threat name Threat level Trust factor Classification
{{ forloop.counter}}.{{ x.sha1}} {{ x.sample_type }}{{ x.threat_name }}{{ x.threat_level }}{{ x.trust_factor }} + {{ x.classification }} +
{% endblock %} diff --git a/views/reversinglabs_ticloudv2_imphash_similarity.html b/views/reversinglabs_ticloudv2_imphash_similarity.html index 27f5ef1..f0eee4f 100644 --- a/views/reversinglabs_ticloudv2_imphash_similarity.html +++ b/views/reversinglabs_ticloudv2_imphash_similarity.html @@ -17,7 +17,7 @@ -->
- - - - - - - - - - - {% for x in data %} - - - - - {% endfor %} +
- ReversingLabs Imphash Similarity for -
{{param.uri}}
-
{{results_found}}
-
SHA1
{{ forloop.counter}}.{{ x }}
+ + + + + + + + + + {% for x in data %} + + + + + {% endfor %} - -
+ ReversingLabs Imphash Similarity for + +
{{results_found}}
+
SHA1
{{ forloop.counter}}.{{ x }} 
+ +
{% endblock %} diff --git a/views/reversinglabs_ticloudv2_ip_downloaded_files.html b/views/reversinglabs_ticloudv2_ip_downloaded_files.html new file mode 100644 index 0000000..7342135 --- /dev/null +++ b/views/reversinglabs_ticloudv2_ip_downloaded_files.html @@ -0,0 +1,213 @@ +{% extends 'widgets/widget_template.html' %} +{% load custom_template %} +{% block custom_title_prop %}{% if title_logo %}style="background-size: auto 60%; background-position: 50%; +background-repeat: no-repeat; background-image: url('/app_resource/{{ title_logo }}');"{% endif %}{% endblock %} +{% block widget_content %} + + + + + +
+ {% if data.report_base == None %} + There is no report object in the response JSON. + {% else %} + + + + + + + + {% if data.report_base.downloaded_files %} + + {% for item in data.report_base.downloaded_files %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {% if item.threat_level %} + + + + + {% endif %} + {% if item.trust_factor %} + + + + + {% endif %} + {% if item.threat_name %} + + + + + {% endif %} + {% if item.malware_type %} + + + + + {% endif %} + {% if item.malware_family %} + + + + + {% endif %} + {% if item.platform %} + + + + + {% endif %} + {% if item.subplatform %} + + + + + {% endif %} + + + + + + + + + + + + + + + + + + {% endfor %} + {% endif %} + +
TitaniumCloud Downloaded files for requested IP address
+ +
Downloaded files
md5{{item.md5}} 
sha1{{item.sha1}} 
sha256{{item.sha256}} 
First Seen{{item.first_seen}}
Last Seen{{item.last_seen}}
Sample size{{item.sample_size}}
Sample Type{{item.sample_type}}
Classification{{item.classification}}
Threat Level{{item.threat_level}}
Trust Factor{{item.trust_factor}}
Threat Name{{item.threat_name}}
Malware Type{{item.malware_type}}
Malware Family{{item.malware_family}}
Platform{{item.platform}}
Subplatform{{item.subplatform}}
First Download{{item.first_download}}
Last Download{{item.last_download}}
Last Download Url{{item.last_download_url}} 
Sample Available{{item.sample_available}}
+ {% endif %} +
+{% endblock %} diff --git a/views/reversinglabs_ticloudv2_ip_report.html b/views/reversinglabs_ticloudv2_ip_report.html new file mode 100644 index 0000000..f68bd4a --- /dev/null +++ b/views/reversinglabs_ticloudv2_ip_report.html @@ -0,0 +1,291 @@ +{% extends 'widgets/widget_template.html' %} +{% load custom_template %} +{% block custom_title_prop %}{% if title_logo %}style="background-size: auto 60%; background-position: 50%; +background-repeat: no-repeat; background-image: url('/app_resource/{{ title_logo }}');"{% endif %}{% endblock %} +{% block widget_content %} + + + + + + + +
+ {% if data.report_base == None %} + There is no report object in the response JSON. + {% else %} +
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + {% if data.report_base.top_threats %} + + {% for item in data.report_base.top_threats %} + + + + + + + + + + + + + {% endfor %} + {% endif %} + {% if data.report_base.downloaded_files_statistics != None %} + + + + + + + + + + + + + + + + + + + + + + {% endif %} + {% if data.report_base.third_party_reputations.statistics != None %} + + + + + + + + + + + + + + + + + + {% endif %} + {% if data.report_base.third_party_reputations.sources != None %} + + {% for item in data.report_base.third_party_reputations.sources %} + + + + + + + + + + + + + {% endfor %} + {% endif %} + +
TitaniumCloud Get IP Report for + +
Last Seen{{data.report_base.last_seen}}
Modified time{{data.report_base.modified_time}}
Top Threats List
Threat name{{item.threat_name}}
Threat level{{item.threat_level}}
Files count{{item.files_count}}
Downloaded Files Statistics
Total{{data.report_base.downloaded_files_statistics.total}}
Known{{data.report_base.downloaded_files_statistics.known}}
Malicious{{data.report_base.downloaded_files_statistics.malicious}}
Unknown{{data.report_base.downloaded_files_statistics.unknown}}
Suspicious{{data.report_base.downloaded_files_statistics.suspicious}}
Third Party Reputations Statistics
Total{{data.report_base.third_party_reputations.statistics.total}}
Clean{{data.report_base.third_party_reputations.statistics.clean}}
Malicious{{data.report_base.third_party_reputations.statistics.malicious}}
Undetected{{data.report_base.third_party_reputations.statistics.undetected}}
Third Party Reputation Sources
Source{{item.source}}
Detection{{item.detection}}
Update Time{{item.update_time}}
+ {% endif %} +
+ + +{% endblock %} diff --git a/views/reversinglabs_ticloudv2_list_active_file_user_overrides.html b/views/reversinglabs_ticloudv2_list_active_file_user_overrides.html new file mode 100644 index 0000000..4354569 --- /dev/null +++ b/views/reversinglabs_ticloudv2_list_active_file_user_overrides.html @@ -0,0 +1,106 @@ +{% extends 'widgets/widget_template.html' %} +{% load custom_template %} +{% block custom_title_prop %}{% if title_logo %}style="background-size: auto 60%; background-position: 50%; +background-repeat: no-repeat; background-image: url('/app_resource/{{ title_logo }}');"{% endif %}{% endblock %} +{% block widget_content %} + + + + +
+ + + + + + + + + + + {% for x in data %} + + + + + {% endfor %} + + +
+ ReversingLabs Active File Reputation User Overrides +
{{results_found}}
+
SHA1
{{ forloop.counter }}.{{ x }} 
+
+{% endblock %} diff --git a/views/reversinglabs_ticloudv2_network_reputation_user_override_view.html b/views/reversinglabs_ticloudv2_network_reputation_user_override_view.html index 39d21dc..fb7786c 100644 --- a/views/reversinglabs_ticloudv2_network_reputation_user_override_view.html +++ b/views/reversinglabs_ticloudv2_network_reputation_user_override_view.html @@ -17,7 +17,7 @@ --> +
- {% if data.user_override == None %} - There is no network location object in the response JSON. - {% else %} - - - - - {% for over in data.user_override.created_overrides %} - - - - - - - - - - - - - - - - - - - - - - - - - {% endfor %} -
Network reputation user override
Network location {{over.network_location}}
Type {{over.type}}
Classification {{over.classification}}
Categories {{over.categories}}
Reason {{over.reason}}
- {% endif %} +{% if data.user_override == None %} + There is no network location object in the response JSON. +{% else %} + + + + + + + {% for over in data.user_override.created_overrides %} + + + + + + + + + + + + + + + + + + + + + + + + {% endfor %} + + {% for over in data.user_override.removed_overrides %} + + + + + + + + + + + + {% endfor %} + +
Network reputation user overrides
Created user overrides
Network location{{ over.network_location }} 
Type {{over.type}}
Classification {{over.classification}}
Categories {{over.categories}}
Reason {{over.reason}}
Removed user overrides
Network location{{ over.network_location }} 
Type {{over.type}}
+{% endif %}
{% endblock %} diff --git a/views/reversinglabs_ticloudv2_network_reputation_view.html b/views/reversinglabs_ticloudv2_network_reputation_view.html index 970f994..a4bd1d6 100644 --- a/views/reversinglabs_ticloudv2_network_reputation_view.html +++ b/views/reversinglabs_ticloudv2_network_reputation_view.html @@ -17,7 +17,7 @@ --> -
- - - - - - - - - - - {% for x in data %} - - - - - {% endfor %} - -
- ReversingLabs URI Index for -
{{param.uri}}
-
{{results_found}}
-
SHA1
{{ forloop.counter}}.{{ x }}
+
+ + + + + + + + + + + {% for x in data %} + + + + + {% endfor %} + +
+ ReversingLabs URI Index for + +
{{results_found}}
+
List of available SHA1 hashes associated with the requested URI
{{ forloop.counter}}.{{ x }} 
{% endblock %} diff --git a/views/reversinglabs_ticloudv2_uri_statistics.html b/views/reversinglabs_ticloudv2_uri_statistics.html index 24334fe..96d07ff 100644 --- a/views/reversinglabs_ticloudv2_uri_statistics.html +++ b/views/reversinglabs_ticloudv2_uri_statistics.html @@ -17,7 +17,7 @@ -->
- {% if data.uri_state == None %} + {% if data.uri_state == None %} There is no uri_state object in the response JSON. - {% else %} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ReversingLabs URI Statistics results for -
{{data.uri}}
SHA-1 {{data.uri_state.sha1}}
URI type {{data.uri_type}}
{{data.uri_type}} {{data.uri}}
Sample counters -
- KNOWN - {{data.uri_state.counters.known}}
- MALICIOUS - {{data.uri_state.counters.malicious}}
- SUSPICIOUS - {{data.uri_state.counters.suspicious}}
- {% endif %} + {% else %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ReversingLabs URI Statistics results for + +
SHA-1{{ data.uri_state.sha1 }} 
URI type {{data.uri_type}}
{{data.uri_type}}{{ data.uri }} 
Sample counters +
+ KNOWN + {{data.uri_state.counters.known}}
+ MALICIOUS + {{data.uri_state.counters.malicious}}
+ SUSPICIOUS + {{data.uri_state.counters.suspicious}}
+ {% endif %}
{% endblock %} diff --git a/views/reversinglabs_ticloudv2_url_analysis_feed.html b/views/reversinglabs_ticloudv2_url_analysis_feed.html index fd682b8..becb975 100644 --- a/views/reversinglabs_ticloudv2_url_analysis_feed.html +++ b/views/reversinglabs_ticloudv2_url_analysis_feed.html @@ -17,7 +17,7 @@ -->
- - - - - - - - - - - - - - {% for x in data %} - - - - - - - - {% endfor %} - - -
ReversingLabs TitaniumCLoud Url Analysis Feed
- {% if param.time_format != None %} -
{{param.time_format}}: {{param.start_time}}
- {% endif %} -
Results found: {{data|length}}
-
Url Analysis id Analysis time Availability status
{{ forloop.counter}}.{{ x.url}} {{ x.analysis_id }}{{ x.analysis_time }}{{ x.availability_status }}
+ + + + + + + + + + + + + + + {% for x in data %} + + + + + + + + {% endfor %} + +
ReversingLabs TitaniumCLoud Url Analysis Feed
+ {% if param.time_format != None %} +
{{param.time_format}}: {{param.start_time}}
+ {% endif %} +
Results found: {{data|length}}
+
Url Analysis id Analysis time Availability status
{{ forloop.counter }}.{{ x.url }} {{ x.analysis_id }}{{ x.analysis_time }}{{ x.availability_status }}
{% endblock %} diff --git a/views/reversinglabs_ticloudv2_url_downloaded_files.html b/views/reversinglabs_ticloudv2_url_downloaded_files.html index 326e3f1..2df8952 100644 --- a/views/reversinglabs_ticloudv2_url_downloaded_files.html +++ b/views/reversinglabs_ticloudv2_url_downloaded_files.html @@ -17,7 +17,7 @@ -->
- - - - - - - - - - - - - - - - - {% for x in data %} - - - - - - - - - - - {% endfor %} - - -
ReversingLabs TitaniumCloud Downloaded Files From Url
-
{{param.url}}
-
Results found: {{data|length}}
-
SHA1 Sample type Threat name Malware type Threat level Trust factor Classification
{{ forloop.counter}}.{{ x.sha1}}{{ x.sample_type }}{{ x.threat_name }}{{ x.malware_type }}{{ x.threat_level }}{{ x.trust_factor }} - {{ x.classification }} -
+ + + + + + + + + + + + + + + + + + {% for x in data %} + + + + + + + + + + + {% endfor %} + +
ReversingLabs TitaniumCloud Downloaded Files From Url
+ +
Results found: {{data|length}}
+
SHA1 Sample type Threat name Malware type Threat level Trust factor Classification
{{ forloop.counter }}.{{ x.sha1 }} {{ x.sample_type }}{{ x.threat_name }}{{ x.malware_type }}{{ x.threat_level }}{{ x.trust_factor }} + {{ x.classification }} +
{% endblock %} diff --git a/views/reversinglabs_ticloudv2_url_reputation.html b/views/reversinglabs_ticloudv2_url_reputation.html index bc25ee0..71c1faf 100644 --- a/views/reversinglabs_ticloudv2_url_reputation.html +++ b/views/reversinglabs_ticloudv2_url_reputation.html @@ -17,7 +17,7 @@ --> + + +
{% if data.report_base == None %} There is no rl object in the response JSON. {% else %} + +
+
+ +
+
+ +
+
+ @@ -87,6 +123,22 @@ {{data.classification}} + + + + + + + + + + + + + + + + {% if data.report_base.analysis != None %} @@ -97,6 +149,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -119,54 +204,270 @@ + + + + - + - + - + + {% for item in data.report_base.analysis.analysis_history %} - - + - - + + - - + + - - + + - - + + + + + + + + + + + + + + {% endfor %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {% for item in data.report_base.dynamic_analysis.analysis_history %} + + + + + + + + + + + + + + + + + + + + + + + + + + + {% endfor %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {% for item in data.report_base.third_party_reputations.sources %} + + + + + + + + + + + + + + + + + + + {% endfor %}
ReversingLabs URL Threat Intelligence for -
{{data.report_base.requested_url}}
+
Sha1{{data.report_base.sha1}} 
base64{{data.report_base.base64}}
Reason{{data.report_base.reason}}
Last Seen{{data.report_base.last_seen}}
First analysis{{data.report_base.analysis.analysis_count}}
Statistics
+ KNOWN + {{data.report_base.analysis.statistics.known}}
+ SUSPICIOUS + {{data.report_base.analysis.statistics.suspicious}}
+ MALICIOUS + {{data.report_base.analysis.statistics.malicious}}
UNKNOWN{{data.report_base.analysis.statistics.unknown}}
TOTAL{{data.report_base.analysis.statistics.total}}
Last analysisAvailability status {{data.report_base.analysis.last_analysis.availability_status}}
HTTP Response Code{{data.report_base.analysis.last_analysis.http_response_code}}
Domain{{data.report_base.analysis.last_analysis.domain}}{{data.report_base.analysis.last_analysis.domain}} 
Serving IP Address{{data.report_base.analysis.last_analysis.serving_ip_address}}{{data.report_base.analysis.last_analysis.serving_ip_address}} 
StatisticsAnalysis history
- KNOWN - {{data.report_base.analysis.statistics.known}}Analysis #{{ forloop.counter }}
- SUSPICIOUS - {{data.report_base.analysis.statistics.suspicious}}Domain{{item.domain}} 
- MALICIOUS - {{data.report_base.analysis.statistics.malicious}}Analysis ID{{item.analysis_id}}
UNKNOWN{{data.report_base.analysis.statistics.unknown}}Analysis time{{item.analysis_time}}
TOTAL{{data.report_base.analysis.statistics.total}}HTTP Response Code{{item.http_response_code}}
Serving IP address{{item.serving_ip_address}} 
Availability status{{item.availability_status}}
Latest Dynamic Analysis Result
Classification{{data.report_base.dynamic_analysis.last_analysis.classification}}
Browser{{data.report_base.dynamic_analysis.last_analysis.browser}}
Platform{{data.report_base.dynamic_analysis.last_analysis.platform}}
Risk score{{data.report_base.dynamic_analysis.last_analysis.risk_score}}
Analysis ID{{data.report_base.dynamic_analysis.last_analysis.analysis_id}}
Analysis time{{data.report_base.dynamic_analysis.last_analysis.analysis_time}}
Dynamic Analysis history
Dynamic Analysis #{{ forloop.counter }}
Platform{{item.platform}}
Risk Score{{item.risk_score}}
Analysis ID{{item.analysis_id}}
Analysis time{{item.analysis_time}}
Classification{{item.classification}}
Third party reputation Statistics
Total{{data.report_base.third_party_reputations.statistics.total}}
Clean{{data.report_base.third_party_reputations.statistics.clean}}
Malicious{{data.report_base.third_party_reputations.statistics.malicious}}
Undetected{{data.report_base.third_party_reputations.statistics.undetected}}
Third Party Reputation Sources
Source #{{ forloop.counter }}
Source{{item.source}}
Detection{{item.detection}}
Update time{{item.update_time}}
+
+ +
+ {% endif %} {% endif %} +
- {% endif %} + - -
{% endblock %} diff --git a/wheels/py3/reversinglabs_sdk_py3-2.4.2-py3-none-any.whl b/wheels/py3/reversinglabs_sdk_py3-2.4.2-py3-none-any.whl deleted file mode 100644 index e85ef933e2f3cd1d398a00238e9afdbd3d26fe98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67343 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 literal 0 HcmV?d00001 From 0a8f48944159570a2431bf06f414aa008cc84226 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 13 May 2024 04:42:29 -0700 Subject: [PATCH 07/11] Release notes for version 1.4.0 --- LICENSE | 2 +- README.md | 2308 ++++++++++++++++++++++++----------- release_notes/1.4.0.md | 50 + release_notes/unreleased.md | 50 - 4 files changed, 1639 insertions(+), 771 deletions(-) create mode 100644 release_notes/1.4.0.md diff --git a/LICENSE b/LICENSE index 7807c21..9123fa1 100644 --- a/LICENSE +++ b/LICENSE @@ -198,4 +198,4 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. + limitations under the License. \ No newline at end of file diff --git a/README.md b/README.md index 6fa9676..0f26828 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # Reversinglabs TitaniumCloud v2 Publisher: ReversingLabs -Connector Version: 1.3.0 +Connector Version: 1.4.0 Product Vendor: Reversinglabs Product Name: TitaniumCloud Product Version Supported (regex): ".\*" @@ -33,40 +33,58 @@ VARIABLE | REQUIRED | TYPE | DESCRIPTION ### Supported Actions [test connectivity](#action-test-connectivity) - Validate the asset configuration for connectivity using supplied configuration -[yara create ruleset](#action-yara-create-ruleset) - TCA-0303 - Create a new YARA ruleset -[yara delete ruleset](#action-yara-delete-ruleset) - TCA-0303 - Delete YARA ruleset -[yara get ruleset info](#action-yara-get-ruleset-info) - TCA-0303 - Get YARA ruleset info -[yara get ruleset text](#action-yara-get-ruleset-text) - TCA-0303 - Get YARA ruleset text -[get yara matches](#action-get-yara-matches) - TCA-0303 - Get a recordset of YARA ruleset matches in the specified time range -[yara retro enable hunt](#action-yara-retro-enable-hunt) - TCA-0319 - Enable YARA retro hunt -[yara retro start hunt](#action-yara-retro-start-hunt) - TCA-0319 - Start YARA retro hunt for the specified ruleset -[yara retro check status](#action-yara-retro-check-status) - TCA-0319 - Check the retro hunt status for the specified ruleset -[yara retro cancel hunt](#action-yara-retro-cancel-hunt) - TCA-0319 - Cancel the retro hunt for the specified ruleset -[get yara retro matches](#action-get-yara-retro-matches) - TCA-0319 - Get a recordset of YARA ruleset matches in the specified time range -[imphash similarity](#action-imphash-similarity) - TCA-0302 - Get a a list of all available SHA1 hashes for files sharing the same import hash (imphash) [advanced search](#action-advanced-search) - TCA-0320 - Search for hashes using multi-part search criteria -[av scanners](#action-av-scanners) - TCA-0103 - Retrieve AV Scanner data from TitaniumCloud -[file reputation](#action-file-reputation) - TCA-0101 - Queries for file reputation info -[file analysis](#action-file-analysis) - TCA-0104 - Retrieve File Analysis by hash data from TitaniumCloud -[functional similarity](#action-functional-similarity) - TCA-0301 - Retrieve a list of functionally similar hashes to the provided one -[url reputation](#action-url-reputation) - TCA-0403 - Queries URL Threat Intelligence -[get downloaded files](#action-get-downloaded-files) - TCA - 0403 - Get files downloaded from url -[get latest url analysis feed](#action-get-latest-url-analysis-feed) - TCA - 0403 - Get latest url analysis feed -[get url analysis feed from date](#action-get-url-analysis-feed-from-date) - TCA - 0403 - Get url analysis feed from date [analyze url](#action-analyze-url) - TCA-0404 - Analyze a given URL -[uri statistics](#action-uri-statistics) - TCA-0402 - Retrieve the number of MALICIOUS, SUSPICIOUS and KNOWN files associated with a specific URI -[uri index](#action-uri-index) - TCA-0401 - Retrieve a list of all available file hashes associated with a given URI -[submit for dynamic analysis](#action-submit-for-dynamic-analysis) - TCA-0207 - Submit an existing sample for dynamic analysis -[submit url for dynamic analysis](#action-submit-url-for-dynamic-analysis) - TCA-0207 - Submit an existing url sample for dynamic analysis +[av scanners](#action-av-scanners) - TCA-0103 - Retrieve AV Scanner data from TitaniumCloud +[customer daily usage](#action-customer-daily-usage) - TCA-9999 - Check daily usage of ReversingLabs API +[customer dayrange usage](#action-customer-dayrange-usage) - TCA-9999 - Check ReversingLabs API usage for specified time range (in days) +[customer month range usage](#action-customer-month-range-usage) - TCA-9999 - Check ReversingLabs API usage for specified time range (in months) +[customer monthly usage](#action-customer-monthly-usage) - TCA-9999 - Check Monthly usage of ReversingLabs API +[customer quota limits](#action-customer-quota-limits) - TCA-9999 - Returns current quota limits for APIs accessible to the authenticated user or users belonging to the authenticated user's company. +[customer yara api usage](#action-customer-yara-api-usage) - TCA-9999 - Check Yara usage on ReversingLabs API [dynamic analysis results](#action-dynamic-analysis-results) - TCA-0106 - Retrieve a file dynamic analysis results [dynamic url analysis results](#action-dynamic-url-analysis-results) - TCA-0106 - Retrieve an url dynamic analysis results -[reanalyze file](#action-reanalyze-file) - TCA-0205 - Reanalyze sample -[upload file](#action-upload-file) - TCA-0202 - Upload file to TitaniumCloud +[file analysis](#action-file-analysis) - TCA-0104 - Retrieve File Analysis by hash data from TitaniumCloud +[file reputation](#action-file-reputation) - TCA-0101 - Queries for file reputation info +[file reputation user override](#action-file-reputation-user-override) - TCA-0102 - File Reputation User Override +[functional similarity](#action-functional-similarity) - TCA-0301 - Retrieve a list of functionally similar hashes to the provided one +[get domain downloaded files](#action-get-domain-downloaded-files) - TCA-0405 - Retrieve a list of files downloaded from the submitted domain +[get domain report](#action-get-domain-report) - TCA-0405 - API returns threat intelligence data for the submitted domain +[get downloaded files](#action-get-downloaded-files) - TCA-0403 - Get files downloaded from url [get file](#action-get-file) - TCA-0201 - Download a sample from TitaniumCloud -[get network reputation](#action-get-network-reputation) - TCA-0407 - Get reputation of a requested URL, domain or IP address +[get ip downloaded files](#action-get-ip-downloaded-files) - TCA-0406 - Retrieve a list of files downloaded from the submitted IP address +[get ip report](#action-get-ip-report) - TCA-0406 - API returns threat intelligence data for the submitted ip address +[get latest url analysis feed](#action-get-latest-url-analysis-feed) - TCA - 0403 - Get latest url analysis feed [get list user overrides](#action-get-list-user-overrides) - TCA-0408 - Get user URL classification overrides [get list user overrides aggregated](#action-get-list-user-overrides-aggregated) - TCA-0408 - Get user URL classification overrides aggregated +[get network reputation](#action-get-network-reputation) - TCA-0407 - Get reputation of a requested URL, domain or IP address +[get related domains](#action-get-related-domains) - TCA-0405 - API provides a list of domains that have the same top parent domain as the requested domain +[get resolutions from domain](#action-get-resolutions-from-domains) - TCA-0405 - API provides a list of domain-to-IP mappings for the requested domain +[get resolutions from ip](#action-get-resolutions-from-ip) - TCA-0406 - API provides a list of IP-to-domain mappings for the requested IP address +[get url analysis feed from date](#action-get-url-analysis-feed-from-date) - TCA-0403 - Get url analysis feed from date +[get urls from domain](#action-get-urls-from-domain) - TCA-0405 - API provides a list of URLs associated with the requested domain +[get urls from ip](#action-get-urls-from-ip) - TCA-0406 - API provides a list of URLs associated with the requested IP address +[get yara matches](#action-get-yara-matches) - TCA-0303 - Get a recordset of YARA ruleset matches in the specified time range +[get yara retro matches](#action-get-yara-retro-matches) - TCA-0319 - Get a recordset of YARA ruleset matches in the specified time range +[imphash similarity](#action-imphash-similarity) - TCA-0302 - Get a a list of all available SHA1 hashes for files sharing the same import hash (imphash) +[list active file reputation user overrides](#action-list-active-file-reputation-user-overrides) - TCA-0102 - List Active File Reputation User Overrides [network reputation user override](#action-network-reputation-user-override) - TCA-0408 - Override user network location reputation +[reanalyze file](#action-reanalyze-file) - TCA-0205 - Reanalyze sample +[submit for dynamic analysis](#action-submit-for-dynamic-analysis) - TCA-0207 - Submit an existing sample for dynamic analysis +[submit url for dynamic analysis](#action-submit-url-for-dynamic-analysis) - TCA-0207 - Submit an existing url sample for dynamic analysis +[upload file](#action-upload-file) - TCA-0202 - Upload file to TitaniumCloud +[uri index](#action-uri-index) - TCA-0401 - Retrieve a list of all available file hashes associated with a given URI +[uri statistics](#action-uri-statistics) - TCA-0402 - Retrieve the number of MALICIOUS, SUSPICIOUS and KNOWN files associated with a specific URI +[url reputation](#action-url-reputation) - TCA-0403 - Queries URL Threat Intelligence +[yara create ruleset](#action-yara-create-ruleset) - TCA-0303 - Create a new YARA ruleset +[yara delete ruleset](#action-yara-delete-ruleset) - TCA-0303 - Delete YARA ruleset +[yara get ruleset info](#action-yara-get-ruleset-info) - TCA-0303 - Get YARA ruleset info +[yara get ruleset text](#action-yara-get-ruleset-text) - TCA-0303 - Get YARA ruleset text +[yara retro enable hunt](#action-yara-retro-enable-hunt) - TCA-0319 - Enable YARA retro hunt +[yara retro start hunt](#action-yara-retro-start-hunt) - TCA-0319 - Start YARA retro hunt for the specified ruleset +[yara retro check status](#action-yara-retro-check-status) - TCA-0319 - Check the retro hunt status for the specified ruleset +[yara retro cancel hunt](#action-yara-retro-cancel-hunt) - TCA-0319 - Cancel the retro hunt for the specified ruleset + ## action: 'test connectivity' Validate the asset configuration for connectivity using supplied configuration @@ -82,438 +100,421 @@ No parameters are required for this action #### Action Output No Output -## action: 'yara create ruleset' -TCA-0303 - Create a new YARA ruleset +## action: 'advanced search' +TCA-0320 - Search for hashes using multi-part search criteria -Type: **generic** +Type: **investigate** Read only: **False** -TCA-0303 - Create a new YARA ruleset. +TCA-0320 - Search for hashes using multi-part search criteria. Supported criteria include more than 60 keywords, 35 antivirus vendors, 137 sample types and subtypes, and 283 tags that enable creating 510 unique search expressions with support for Boolean operators and case-insensitive wildcard matching. A number of search keywords support relational operators '<=' and '>='. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**ruleset_name** | required | YARA ruleset name | string | -**ruleset_text** | required | Stringified YARA ruleset / a Unicode string | string | +**query** | required | Advanced Search query | string | +**limit** | optional | Maximum number of results | numeric | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success or failed -action_result.parameter.ruleset_name | string | | -action_result.parameter.ruleset_text | string | | +action_result.status | string | | success or failed +action_result.parameter.limit | numeric | | +action_result.parameter.query | string | | action_result.data | string | | action_result.summary | string | | action_result.message | string | | summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +summary.total_objects_successful | numeric | | -## action: 'yara delete ruleset' -TCA-0303 - Delete YARA ruleset +## action: 'analyze url' +TCA-0404 - Analyze a given URL -Type: **generic** +Type: **investigate** Read only: **False** -TCA-0303 - Delete YARA ruleset. +TCA-0404 - This service allows users to submit a URL for analysis. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**ruleset_name** | required | YARA ruleset name | string | +**url** | required | URL to analyze | string | `url` #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success or failed -action_result.parameter.ruleset_name | string | | +action_result.status | string | | success or failed +action_result.parameter.url | string | | action_result.data | string | | action_result.summary | string | | action_result.message | string | | summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +summary.total_objects_successful | numeric | | -## action: 'yara get ruleset info' -TCA-0303 - Get YARA ruleset info +## action: 'av scanners' +TCA-0103 - Retrieve AV Scanner data from TitaniumCloud -Type: **generic** +Type: **investigate** Read only: **False** -TCA-0303 - Get information for a specific YARA ruleset or all YARA rulesets in the collection. +TCA-0103 - Provides AV vendor cross-reference data for a desired sample from multiple AV scanners. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**ruleset_name** | optional | YARA ruleset name | string | +**hash** | required | File hash | string | `sha1` `sha256` `md5` #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success or failed -action_result.data.*.ruleset_name | string | | -action_result.data.*.valid | string | | -action_result.data.*.approved | string | | +action_result.status | string | | success or failed +action_result.parameter.hash | string | | action_result.data | string | | action_result.summary | string | | action_result.message | string | | summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +summary.total_objects_successful | numeric | | -## action: 'yara get ruleset text' -TCA-0303 - Get YARA ruleset text +## action: 'customer daily usage' +TCA-9999 - Check daily usage of ReversingLabs API Type: **generic** Read only: **False** -TCA-0303 - Get the text of a YARA ruleset. +TCA-9999 - API allows ReversingLabs customers to track the usage of TitaniumCloud services provisioned to all accounts in a company #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**ruleset_name** | required | YARA ruleset name | string | +**date** | required | Specifies the date for which customer usage information should be returned | string | | +**company** | optional | When this parameter is checked, the API will return usage for all accounts within the company | string | | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success or failed -action_result.parameter.ruleset_name | string | | -action_result.data.*.text | string | | -action_result.data | string | | -action_result.summary | string | | +action_result.data.*.date | Date | | YYYY-MM-DD +action_result.data.*.usage_report.*.product | string | | +action_result.data.*.usage_report.*.number_of_queries | string | | +action_result.data.*.usage_report.*.used_bytes | string | | +action_result.status | string | | success or failed action_result.message | string | | summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +summary.total_objects_successful | numeric | | -## action: 'get yara matches' -TCA-0303 - Get a recordset of YARA ruleset matches in the specified time range +## action: 'customer dayrange usage' +TCA-9999 - Check ReversingLabs API usage for specified time range (in days) Type: **generic** Read only: **False** -TCA-0303 - Get a recordset of YARA ruleset matches in the specified time range. +TCA-9999 - API allows ReversingLabs customers to track the usage of TitaniumCloud services provisioned to all accounts in a company #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**time_format** | required | 'utc' or 'timestamp' | string | -**time_value** | required | 'YYYY-MM-DDThh:mm:ss' or Unix timestamp string | string | +**from_date** | required | Specifies the from date for which customer usage information should be returned. Users can submit one value per request in the YYYY-MM-DD format. | string | | +**to_date** | required | Specifies the to date for which customer usage information should be returned. Users can submit one value per request in the YYYY-MM-DD format. | string | | +**company** | optional | When this parameter is checked, the API will return usage for all accounts within the company | string | | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success or failed -action_result.parameter.time_format | string | | -action_result.parameter.time_value | string | | -action_result.data | string | | -action_result.summary | string | | +action_result.status | string | | success or failed action_result.message | string | | summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +summary.total_objects_successful | numeric | | -## action: 'yara retro enable hunt' -TCA-0319 - Enable YARA retro hunt +## action: 'customer month range usage' +TCA-9999 - Check ReversingLabs API usage for specified time range (in months) Type: **generic** Read only: **False** -TCA-0319 - Enable the retro hunt for the specified ruleset that has been submitted to TitaniumCloud prior to deployment of YARA retro. +TCA-9999 - API allows ReversingLabs customers to track the usage of TitaniumCloud services provisioned to all accounts in a company #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**ruleset_name** | required | YARA ruleset name | string | +**from_month** | required | Specifies the from date for which customer usage information should be returned. Users can submit one value per request in the YYYY-MM format. | string | | +**to_month** | required | Specifies the to date for which customer usage information should be returned. Users can submit one value per request in the YYYY-MM format. | string | | +**company** | optional | When this parameter is checked, the API will return usage for all accounts within the company | string | | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success or failed -action_result.parameter.ruleset_name | string | | -action_result.data | string | | -action_result.summary | string | | +action_result.status | string | | success or failed action_result.message | string | | summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +summary.total_objects_successful | numeric | | -## action: 'yara retro start hunt' -TCA-0319 - Start YARA retro hunt for the specified ruleset +## action: 'customer monthly usage' +TCA-9999 - Check Monthly usage of ReversingLabs API Type: **generic** Read only: **False** -TCA-0319 - Start YARA retro hunt for the specified ruleset. +TCA-9999 - API allows ReversingLabs customers to track the usage of TitaniumCloud services provisioned to all accounts in a company #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**ruleset_name** | required | YARA ruleset name | string | +**month** | required | Specifies the month for which customer usage information should be returned. Users can submit one value per request in the YYYY-MM format. | string | | +**company** | optional | When this parameter is checked, the API will return usage for all accounts within the company | string | | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success or failed -action_result.parameter.ruleset_name | string | | -action_result.data.*.ruleset_sha1 | string | | -action_result.data | string | | -action_result.summary | string | | -action_result.message | string | | -summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +action_result.data.*.month | string | | YYYY-MM +action_result.data.*.usage_report.*.product | string | +action_result.data.*.usage_report.*.number_of_queries | string | +action_result.data.*.usage_report.*.used_bytes | string | +action_result.status | string | | success or failed +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | -## action: 'yara retro check status' -TCA-0319 - Check the retro hunt status for the specified ruleset +## action: 'customer quota limits' +TCA-9999 - Returns current quota limits for APIs accessible to the authenticated user or users belonging to the authenticated user's company. Type: **generic** Read only: **False** -TCA-0319 - Check the retro hunt status for the specified ruleset. +TCA-9999 - API allows ReversingLabs customers to track quota limits of TitaniumCloud services provisioned to all accounts in a company #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**ruleset_name** | required | YARA ruleset name | string | +**company** | optional | When this parameter is checked, the API will return usage for all accounts within the company | string | | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success or failed -action_result.parameter.ruleset_name | string | | -action_result.data.*.retro_status | string | | -action_result.data.*.start_time | string | | -action_result.data.*.finish_time | string | | -action_result.data.*.reason | string | | -action_result.data.*.progress | string | | -action_result.data.*.estimated_finish_time | string | | -action_result.data | string | | -action_result.summary | string | | -action_result.message | string | | -summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +action_result.data.*.limits.*.limit | numeric | | +action_result.data.*limits.*.limit_type | string | | +action_result.data.*limits.*.limit_exceeded | boolean | | +action_result.data.*limits.*.products | string | | +action_result.data.*limits.*.users | string | | +action_result.status | string | | success or failed +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | -## action: 'yara retro cancel hunt' -TCA-0319 - Cancel the retro hunt for the specified ruleset +## action: 'customer yara api usage' +TCA-9999 - Check Yara usage on ReversingLabs API. Type: **generic** Read only: **False** -TCA-0319 - Cancel the retro hunt for the specified ruleset. +TCA-9999 - This query returns information about the number of active YARA rulesets for the TitaniumCloud account that sent the request. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**ruleset_name** | required | YARA ruleset name | string | +**format** | optional | Specify the response format. Supported values are xml and json. The default is JSON. | string | json | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success or failed -action_result.parameter.ruleset_name | string | | -action_result.data.*.ruleset_sha1 | string | | -action_result.data | string | | -action_result.summary | string | | +action_result.data.*.product | string | | +action_result.data.*.number_of_active_rulesets | string | | +action_result.status | string | | success or failed action_result.message | string | | -summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | -## action: 'get yara retro matches' -TCA-0319 - Get a recordset of YARA ruleset matches in the specified time range +## action: 'dynamic analysis results' +TCA-0106 - Retrieve dynamic analysis results Type: **generic** Read only: **False** -TCA-0319 - Get a recordset of YARA ruleset matches in the specified time range. +TCA-0106 - This service allows users to retrieve dynamic analysis results for a file that was submitted for dynamic analysis. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**time_format** | required | 'utc' or 'timestamp' | string | -**time_value** | required | 'YYYY-MM-DDThh:mm:ss' or Unix timestamp string | string | +**sha1** | required | Selected sample's SHA-1 hash | string | `sha1` +**analysis_id** | optional | Return only the results of this analysis | string | +**latest** | optional | Return only the latest analysis results | boolean | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success or failed -action_result.data.*.rl.feed.name | string | | -action_result.data.*.rl.feed.time_range.from | string | | -action_result.data.*.rl.feed.time_range.to | string | | -action_result.data.*.rl.feed.last_timestamp | string | | +action_result.status | string | | success or failed +action_result.parameter.analysis_id | string | | +action_result.parameter.latest | boolean | | +action_result.parameter.sha1 | string | | action_result.data | string | | action_result.summary | string | | action_result.message | string | | summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +summary.total_objects_successful | numeric | | -## action: 'imphash similarity' -TCA-0302 - Get a a list of all available SHA1 hashes for files sharing the same import hash (imphash) +## action: 'dynamic url analysis results' +TCA-0106 - Retrieve dynamic analysis results for url Type: **investigate** -Read only: **True** +Read only: **true** -TCA-0302 - Imphash Index provides a list of all available SHA1 hashes for files sharing the same import hash (imphash). An imphash is a hash calculated from a string which contains the libraries imported by a Windows Portable Executable (PE) file. +TCA-0106 - This service allows users to retrieve dynamic analysis results for an url that was submitted for dynamic analysis. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**imphash** | required | Imphash | string | `hash` -**limit** | optional | Maximum number of results | numeric | +**url** | required | Provide one of the following: sha1, base64 or url | string | `sha1` `url` | +**analysis_id** | optional | Return only the results of this analysis | string | +**latest** | optional | Return only the latest analysis results | boolean | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success or failed -action_result.parameter.imphash | string | | -action_result.parameter.limit | numeric | | -action_result.data | string | | -action_result.summary | string | | -action_result.message | string | | -summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +action_result.parameter.analysis_id | string | | +action_result.parameter.data.0.requested_sha1_url | string | | -## action: 'advanced search' -TCA-0320 - Search for hashes using multi-part search criteria +## action: 'file analysis' +TCA-0104 - Retrieve File Analysis by hash data from TitaniumCloud -Type: **generic** +Type: **investigate** Read only: **False** -TCA-0320 - Search for hashes using multi-part search criteria. Supported criteria include more than 60 keywords, 35 antivirus vendors, 137 sample types and subtypes, and 283 tags that enable creating 510 unique search expressions with support for Boolean operators and case-insensitive wildcard matching. A number of search keywords support relational operators '<=' and '>='. +TCA-0104 - Provides file analysis data on hashes. Metadata can include relevant portions of static analysis, AV scan information, file sources and any related IP/domain information. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**query** | required | Advanced Search query | string | -**limit** | optional | Maximum number of results | numeric | +**hash** | required | File hash | string | `sha1` `sha256` `md5` `vault id` #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- action_result.status | string | | success or failed -action_result.parameter.limit | numeric | | -action_result.parameter.query | string | | +action_result.parameter.hash | string | | action_result.data | string | | action_result.summary | string | | action_result.message | string | | summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +summary.total_objects_successful | numeric | | -## action: 'av scanners' -TCA-0103 - Retrieve AV Scanner data from TitaniumCloud +## action: 'file reputation' +TCA-0101 - Queries for file reputation info Type: **investigate** -Read only: **False** +Read only: **True** -TCA-0103 - Provides AV vendor cross-reference data for a desired sample from multiple AV scanners. +TCA-0101 - Queries for file reputation info. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**hash** | required | File hash | string | `sha1` `sha256` `md5` +**hash** | required | File hash to query | string | `hash` `sha256` `sha1` `md5` #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- action_result.status | string | | success or failed -action_result.parameter.hash | string | | +action_result.parameter.hash | string | `hash` `sha256` `sha1` `md5` | action_result.data | string | | action_result.summary | string | | action_result.message | string | | summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +summary.total_objects_successful | numeric | | -## action: 'file reputation' -TCA-0101 - Queries for file reputation info +## action: 'file reputation user override' +TCA-0102 - File Reputation User Override -Type: **investigate** -Read only: **True** +Type: **generic** +Read only: **False** -TCA-0101 - Queries for file reputation info. +TCA-0102 - The File Reputation User Override service enables File sample classification overrides. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**hash** | required | File hash to query | string | `hash` `sha256` `sha1` `md5` +**override_samples** | required | List of samples to override structured in JSON format. Visit documentation for guidance. | string | +**remove_overrides** | optional | List of samples whose classification override needs to be removed structured in JSON format. Visit documentation for guidance | string | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- +action_result.parameter.override_samples | string | | +action_result.parameter.remove_overrides | string | | action_result.status | string | | success or failed -action_result.parameter.hash | string | `hash` `sha256` `sha1` `md5` | +action_result.parameter.hash | string | | action_result.data | string | | action_result.summary | string | | action_result.message | string | | summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +summary.total_objects_successful | numeric | | -## action: 'file analysis' -TCA-0104 - Retrieve File Analysis by hash data from TitaniumCloud +## action: 'functional similarity' +TCA-0301 - Retrieve a list of functionally similar hashes to the provided one Type: **investigate** Read only: **False** -TCA-0104 - Provides file analysis data on hashes. Metadata can include relevant portions of static analysis, AV scan information, file sources and any related IP/domain information. +TCA-0301 - Provides a list of SHA1 hashes of files that are functionally similar to the provided file (SHA1 hash) at the selected precision level. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**hash** | required | File hash | string | `sha1` `sha256` `md5` `vault id` +**hash** | required | File hash | string | `sha1` +**limit** | optional | Maximum number of results | numeric | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- action_result.status | string | | success or failed action_result.parameter.hash | string | | +action_result.parameter.limit | numeric | | action_result.data | string | | action_result.summary | string | | action_result.message | string | | summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +summary.total_objects_successful | numeric | | -## action: 'functional similarity' -TCA-0301 - Retrieve a list of functionally similar hashes to the provided one +## action: 'get domain downloaded files' +TCA-0405 - Retrieve a list of files downloaded from the submitted domain -Type: **investigate** +Type: **generic** Read only: **False** -TCA-0301 - Provides a list of SHA1 hashes of files that are functionally similar to the provided file (SHA1 hash) at the selected precision level. +TCA-0405 - The response will contain metadata for files downloaded from the submitted domain. Empty fields are not included in the response. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**hash** | required | File hash | string | `sha1` -**limit** | optional | Maximum number of results | numeric | +**domain** | required | The domain for which to retrieve the downloaded files | string | domain +**extended** | optional | Chose whether you want extended result data set | boolean | +**limit** | optional | The number of files to return in the response. Default is 1000 | numeric | +**classification** | optional | Return only samples that match the requested classification for given domain | string | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success or failed -action_result.parameter.hash | string | | -action_result.parameter.limit | numeric | | -action_result.data | string | | -action_result.summary | string | | +action_result.status | string | | success or failed action_result.message | string | | summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +summary.total_objects_successful | numeric | | -## action: 'url reputation' -TCA-0403 - Queries URL Threat Intelligence +## action: 'get domain report' +TCA-0405 - API returns threat intelligence data for the submitted domain -Type: **investigate** -Read only: **True** +Type: **generic** +Read only: **False** -TCA-0403 - Queries URL Threat Intelligence. +TCA-0405 - The report contains domain reputation from various reputation sources, classification statistics for files downloaded from the domain, the most common threats found on the domain DNS information about the domain, and parent domain information. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**url** | required | URL to query | string | `url` +**domain** | required | The domain for which to retrieve the report | string | `domain` #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success or failed -action_result.parameter.url | string | `url` | -action_result.data | string | | -action_result.summary | string | | +action_result.status | string | | success or failed action_result.message | string | | summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +summary.total_objects_successful | numeric | | ## action: 'get downloaded files' TCA - 0403 - Get files downloaded from url @@ -547,373 +548,430 @@ action_result.parameter.max_results | numeric | | action_result.status | string | | action_result.message | string | | summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +summary.total_objects_successful | numeric | | -## action: 'get latest url analysis feed' -TCA - 0403 - Get latest url analysis feed +## action: 'get file' +TCA-0201 - Download a sample from TitaniumCloud -Type: **generic** -Read only: **False** +Type: **investigate** +Read only: **True** -Returns the latest URL analyses reports aggregated as list. +TCA-0201 - Download a sample from TitaniumCloud and add it to the vault. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**results_per_page** | optional | Number of results to be returned in one page, maximum value is 1000 | numeric | -**max_results** | optional | Maximum results to be returned in the list | numeric | +**hash** | required | Hash of file/sample to download | string | `md5` `sha1` `sha256` #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.parameter.results_per_page | numeric | | -action_result.parameter.max_results | numeric | | -action_result.status | string | | +action_result.status | string | | success or failed +action_result.parameter.hash | string | `md5` `sha1` `sha256` | +action_result.data | string | | +action_result.summary | string | | action_result.message | string | | summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +summary.total_objects_successful | numeric | | -## action: 'get url analysis feed from date' -TCA - 0403 - Get url analysis feed from date +## action: 'get ip downloaded files' +TCA-0406 - Retrieve a list of files downloaded from the submitted IP address Type: **generic** -Read only: **False** +Read only: **True** -Accepts time format and a start time and returns URL analyses reports from that defined time onward aggregated as a list. +TCA-0406 - The response will contain metadata for files downloaded from the submitted IP address. Empty fields are not included in the response. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**time_format** | required | Possible values: 'utc' or 'timestamp' | string | -**start_time** | required | Time from which to retrieve results onwards | string | -**results_per_page** | optional | Number of results to be returned in one page, maximum value is 1000 | numeric | -**max_results** | optional | Maximum results to be returned in the list | numeric | +**ip_address** | required | The IP address for which to retrieve the downloaded files | string | `ip` +**extended** | optional | Chose whether you want extended result data set | boolean | +**page** | optional | String representing a page of results | string | +**limit** | optional | The number of files to return in the response. Default is 1000 | numeric | +**classification** | optional | Return only samples that match the requested classification for given domain | string | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.parameter.time_format | string | | -action_result.parameter.start_time | string | | -action_result.parameter.results_per_page | numeric | | -action_result.parameter.max_results | numeric | | -action_result.status | string | | +action_result.status | string | | success or failed action_result.message | string | | summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +summary.total_objects_successful | numeric | | -## action: 'analyze url' -TCA-0404 - Analyze a given URL +## action: 'get ip report' +TCA-0406 - API returns threat intelligence data for the submitted ip address -Type: **investigate** -Read only: **False** +Type: **generic** +Read only: **True** -TCA-0404 - This service allows users to submit a URL for analysis. +TCA-0406 - The report contains IP reputation from various reputation sources, classification statistics for files downloaded from the IP, and the top threats hosted on the submitted IP. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**url** | required | URL to analyze | string | `url` +**ip_address** | required | The IP address for which to retrieve the report | string | `ip` #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- action_result.status | string | | success or failed -action_result.parameter.url | string | | -action_result.data | string | | -action_result.summary | string | | action_result.message | string | | summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +summary.total_objects_successful | numeric | | -## action: 'uri statistics' -TCA-0402 - Retrieve the number of MALICIOUS, SUSPICIOUS and KNOWN files associated with a specific URI +## action: 'get latest url analysis feed' +TCA - 0403 - Get latest url analysis feed Type: **generic** Read only: **False** -TCA-0402 - Provides the number of MALICIOUS, SUSPICIOUS and KNOWN files associated with a specific URI (domain, IP address, email or URL). +Returns the latest URL analyses reports aggregated as list. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**uri** | required | Uri | string | `sha1` +**results_per_page** | optional | Number of results to be returned in one page, maximum value is 1000 | numeric | +**max_results** | optional | Maximum results to be returned in the list | numeric | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success or failed -action_result.parameter.uri | string | | -action_result.data | string | | -action_result.summary | string | | +action_result.parameter.results_per_page | numeric | | +action_result.parameter.max_results | numeric | | +action_result.status | string | | action_result.message | string | | summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +summary.total_objects_successful | numeric | | -## action: 'uri index' -TCA-0401 - Retrieve a list of all available file hashes associated with a given URI +## action: 'get list user overrides' +TCA-0408 - Get user URL classification overrides Type: **generic** Read only: **False** -TCA-0401 - Provides a list of all available file hashes associated with a given URI (domain, IP address, email or URL) regardless of file classification. +TCA-0408 - Get user URL classification overrides #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**uri** | required | Desired URI string | string | `url` `domain` -**limit** | optional | Maximum number of results | numeric | +**next_page_sha1** | optional | Optional parameter used for pagination | string | `sha1` #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- +action_result.data.*.user_override.network_locations.*.network_location | string | `url` `domain` `ip` | +action_result.data.*.user_override.network_locations.*.type | string | `url` `domain` `ip` | action_result.status | string | | success or failed -action_result.parameter.limit | numeric | | -action_result.parameter.uri | string | | -action_result.data | string | | -action_result.summary | string | | -action_result.message | string | | +action_result.message | string | | summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +summary.total_objects_successful | numeric | | -## action: 'submit for dynamic analysis' -TCA-0207 - Submit an existing sample for dynamic analysis +## action: 'get list user overrides aggregated' +TCA-0408 - Get user URL classification overrides aggregated -Type: **investigate** +Type: **generic** Read only: **False** -TCA-0207 - This service allows users to detonate a file in the ReversingLabs TitaniumCloud sandbox. To submit a file for analysis, it must exist in TitaniumCloud. +This API automatically handles paging and returns a list of results instead of a Response object. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**sha1** | required | Selected sample's SHA-1 hash | string | `sha1` `vault id` -**platform** | required | Selected platform on which the analysis will be performed. See TCA-0207 API documentation for available options | string | +**max_results** | optional | | numeric | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success or failed -action_result.parameter.platform | string | | -action_result.parameter.sha1 | string | | -action_result.data | string | | -action_result.summary | string | | -action_result.message | string | | +action_result.data.*.*.network_location | string | `url` `domain` `ip` | +action_result.data.*.*.type | string | `url` `domain` `ip` | +action_result.status | string | | success or failed +action_result.message | string | | summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +summary.total_objects_successful | numeric | | -## action: 'submit url for dynamic analysis' -TCA-0207 - Submit an existing URL sample for dynamic analysis +## action: 'get network reputation' +TCA-0407 - Get reputation of a requested URL, domain or IP address Type: **investigate** Read only: **False** -TCA-0207 - This service allows users to detonate an URL in the ReversingLabs TitaniumCloud sandbox. To submit an url for analysis, it must exist in TitaniumCloud. +Service provides information regarding the reputation of a requested URL, domain or IP address. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**sha1** | required | Selected sample's url string | string | `url` `domain` -**platform** | required | Selected platform on which the analysis will be performed. See TCA-0207 API documentation for available options | string | +**network_locations** | required | domain, url or ip | string | `domain` `url` `ip` #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.data.*.rl.url | string | url | -action_result.data.*.rl.sha1 | string | sha1 | -action_result.data.*.rl.status | string | | -action_result.data.*.rl.url_base64 | string | | -action_result.data.*.rl.analysis_id | string | | +action_result.status | string | | success or failed +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | -## action: 'dynamic analysis results' -TCA-0106 - Retrieve dynamic analysis results +## action: 'get related domains' +TCA - 0405 - API provides a list of domains that have the same top parent domain as the requested domain -Type: **generic** +Type: **investigate** Read only: **False** -TCA-0106 - This service allows users to retrieve dynamic analysis results for a file that was submitted for dynamic analysis. +TCA - 0405 - API provides a list of domains that have the same top parent domain as the requested domain. If the requested domain is a top parent domain, the API will return all subdomains. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**sha1** | required | Selected sample's SHA-1 hash | string | `sha1` -**analysis_id** | optional | Return only the results of this analysis | string | -**latest** | optional | Return only the latest analysis results | boolean | +**domain** | required | The domain for which to retrieve the downloaded files | string | `domain` +**page** | optional | String representing a page of results | string | +**limit** | optional | The number of files to return in the response. Default is 1000 | numeric | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success or failed -action_result.parameter.analysis_id | string | | -action_result.parameter.latest | boolean | | -action_result.parameter.sha1 | string | | -action_result.data | string | | -action_result.summary | string | | +action_result.data.*.requested_domain | string | `domain` | +action_result.data.*.related_domains.*.domain | string | `domain` | +action_result.status | string | | action_result.message | string | | summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +summary.total_objects_successful | numeric | | -## action: 'dynamic url analysis results' -TCA-0106 - Retrieve dynamic analysis results for url +## action: 'get resolutions from domain' +TCA - 0405 - API provides a list of domain-to-IP mappings for the requested domain Type: **investigate** -Read only: **true** +Read only: **False** -TCA-0106 - This service allows users to retrieve dynamic analysis results for an url that was submitted for dynamic analysis. +TCA - 0405 - API provides a list of domain-to-IP mappings for the requested domain. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**url** | required | Provide one of the following: sha1, base64 or url | string | `sha1` `url` | -**analysis_id** | optional | Return only the results of this analysis | string | -**latest** | optional | Return only the latest analysis results | boolean | +**domain** | required | The domain for which to retrieve the domain to IP mappings | string | `domain` +**page** | optional | String representing a page of results | string | +**limit** | optional | The number of files to return in the response. Default is 1000 | numeric | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.parameter.analysis_id | string | | -action_result.parameter.data.0.requested_sha1_url | string | | +action_result.data.*.requested_domain | string | `domain` | +action_result.data.*.resolutions.*.record_type | string | | +action_result.data.*.resolutions.*.answer | string | | +action_result.data.*.resolutions.*.last_resolution_time | string | | +action_result.data.*.resolutions.*.provider | string | | +action_result.status | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | -## action: 'reanalyze file' -TCA-0205 - Reanalyze sample +## action: 'get resolutions from ip' +TCA - 0406 - API provides a list of IP-to-domain mappings for the requested IP address Type: **investigate** Read only: **False** -TCA-0205 - This query sends a sample with the requested hash for rescanning. +TCA - 0406 - API provides a list of IP-to-domain mappings for the requested IP address #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**hash** | required | File hash | string | +**ip_address** | required | The IP address for which to retrieve resolutions | string | `ip` +**page** | optional | String representing a page of results | string | +**limit** | optional | The number of files to return in the response. Default is 1000 | numeric | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success or failed -action_result.parameter.hash | string | | -action_result.data | string | | -action_result.summary | string | | +action_result.data.*.requested_ip | string | `ip` | +action_result.data.*.resolutions.*.host_name | string | `domain` | +action_result.data.*.resolutions.*.last_resolution_time | string | | +action_result.data.*.resolutions.*.provider | string | | +action_result.status | string | | action_result.message | string | | summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +summary.total_objects_successful | numeric | | -## action: 'upload file' -TCA-0202 - Upload file to TitaniumCloud +## action: 'get url analysis feed from date' +TCA - 0403 - Get url analysis feed from date Type: **generic** Read only: **False** -TCA-0202 - Upload file to TitaniumCloud. +Accepts time format and a start time and returns URL analyses reports from that defined time onward aggregated as a list. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**vault_id** | required | Vault ID of file to upload | string | `vault id` -**file_name** | optional | Filename to use | string | `file name` +**time_format** | required | Possible values: 'utc' or 'timestamp' | string | +**start_time** | required | Time from which to retrieve results onwards | string | +**results_per_page** | optional | Number of results to be returned in one page, maximum value is 1000 | numeric | +**max_results** | optional | Maximum results to be returned in the list | numeric | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success or failed -action_result.parameter.file_name | string | `file name` | -action_result.parameter.vault_id | string | `pe file` `pdf` `flash` `apk` `jar` `doc` `xls` `ppt` | -action_result.data | string | | -action_result.summary | string | | +action_result.parameter.time_format | string | | +action_result.parameter.start_time | string | | +action_result.parameter.results_per_page | numeric | | +action_result.parameter.max_results | numeric | | +action_result.status | string | | action_result.message | string | | summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +summary.total_objects_successful | numeric | | -## action: 'get file' -TCA-0201 - Download a sample from TitaniumCloud +## action: 'get urls from domain' +TCA - 0405 - API provides a list of URLs associated with the requested domain. Type: **investigate** -Read only: **True** +Read only: **False** -TCA-0201 - Download a sample from TitaniumCloud and add it to the vault. +TCA - 0405 - API provides a list of URLs associated with the requested domain. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**hash** | required | Hash of file/sample to download | string | `md5` `sha1` `sha256` +**domain** | required | The domain for which to retrieve the resolved IP addresses | string | `domain` +**page** | optional | String representing a page of results | string | +**limit** | optional | The number of files to return in the response. Default is 1000 | numeric | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success or failed -action_result.parameter.hash | string | `md5` `sha1` `sha256` | -action_result.data | string | | -action_result.summary | string | | +action_result.data.*.requested_domain | string | `domain` | +action_result.data.*.urls.*.url | string | `url` | +action_result.status | string | | action_result.message | string | | summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +summary.total_objects_successful | numeric | | -## action: 'get network reputation' -TCA-0407 - Get reputation of a requested URL, domain or IP address +## action: 'get urls from ip' +TCA - 0406 - API provides a list of URLs associated with the requested IP address. Type: **investigate** Read only: **False** -Service provides information regarding the reputation of a requested URL, domain or IP address. +TCA - 0406 - API provides a list of URLs associated with the requested IP address. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**network_locations** | required | domain, url or ip | string | `domain` `url` `ip` +**ip_address** | required | The IP for which to retrieve the domain resolutions | string | `ip` +**page** | optional | String representing a page of results | string | +**limit** | optional | The number of files to return in the response. Default is 1000 | numeric | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success or failed +action_result.data.*.requested_ip | string | `ip` | +action_result.data.*.urls.*.url | string | `url` | +action_result.status | string | | action_result.message | string | | summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +summary.total_objects_successful | numeric | | -## action: 'get list user overrides' -TCA-0408 - Get user URL classification overrides +## action: 'get yara matches' +TCA-0303 - Get a recordset of YARA ruleset matches in the specified time range Type: **generic** Read only: **False** -TCA-0408 - Get user URL classification overrides +TCA-0303 - Get a recordset of YARA ruleset matches in the specified time range. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**next_page_sha1** | optional | Optional parameter used for pagination | string | `sha1` +**time_format** | required | 'utc' or 'timestamp' | string | +**time_value** | required | 'YYYY-MM-DDThh:mm:ss' or Unix timestamp string | string | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.data.*.user_override.network_locations.*.network_location | string | `url` `domain` `ip` | -action_result.data.*.user_override.network_locations.*.type | string | `url` `domain` `ip` | action_result.status | string | | success or failed -action_result.message | string | | +action_result.parameter.time_format | string | | +action_result.parameter.time_value | string | | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | summary.total_objects | numeric | | -summary.total_objects_successful | numeric | | +summary.total_objects_successful | numeric | | -## action: 'get list user overrides aggregated' -TCA-0408 - Get user URL classification overrides aggregated +## action: 'get yara retro matches' +TCA-0319 - Get a recordset of YARA ruleset matches in the specified time range Type: **generic** Read only: **False** -This API automatically handles paging and returns a list of results instead of a Response object. +TCA-0319 - Get a recordset of YARA ruleset matches in the specified time range. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**max_results** | optional | | numeric | +**time_format** | required | 'utc' or 'timestamp' | string | +**time_value** | required | 'YYYY-MM-DDThh:mm:ss' or Unix timestamp string | string | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.data.*.*.network_location | string | `url` `domain` `ip` | -action_result.data.*.*.type | string | `url` `domain` `ip` | -action_result.status | string | | success or failed -action_result.message | string | | +action_result.status | string | | success or failed +action_result.data.*.rl.feed.name | string | | +action_result.data.*.rl.feed.time_range.from | string | | +action_result.data.*.rl.feed.time_range.to | string | | +action_result.data.*.rl.feed.last_timestamp | string | | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | +## action: 'imphash similarity' +TCA-0302 - Get a a list of all available SHA1 hashes for files sharing the same import hash (imphash) + +Type: **investigate** +Read only: **True** + +TCA-0302 - Imphash Index provides a list of all available SHA1 hashes for files sharing the same import hash (imphash). An imphash is a hash calculated from a string which contains the libraries imported by a Windows Portable Executable (PE) file. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**imphash** | required | Imphash | string | `hash` +**limit** | optional | Maximum number of results | numeric | + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success or failed +action_result.parameter.imphash | string | | +action_result.parameter.limit | numeric | | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + +## action: 'list active file reputation user overrides' +TCA-0102 - List Active File Reputation User Overrides + +Type: **generic** +Read only: **False** + +TCA-0102 - The File Reputation User Override service enables sample classification overrides. Any sample can be overridden to malicious, suspicious, or known. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**hash_type** | required | Required parameter that defines the type of hash | string | `sha1` `sha256` `md5` +**start_hash** | optional | When this parameter is present, the API will return up to 1000 hashes with a classification override starting from the start_hash value | string | `sha1` `sha256` `md5` + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.data.*.user_override.hash_values | string | `sha1` `sha256` `md5` | +action_result.status | string | | success or failed +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + ## action: 'network reputation user override' TCA-0408 - Override user network location reputation @@ -938,854 +996,1657 @@ action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | +## action: 'reanalyze file' +TCA-0205 - Reanalyze sample -### Configuration Variables -The below configuration variables are required for this Connector to operate. These variables are specified when configuring a TitaniumCloud asset in SOAR. +Type: **investigate** +Read only: **False** -VARIABLE | REQUIRED | TYPE | DESCRIPTION --------- | -------- | ---- | ----------- -**url** | required | string | TitaniumCloud URL -**username** | required | string | TitaniumCloud username -**password** | required | password | TitaniumCloud password +TCA-0205 - This query sends a sample with the requested hash for rescanning. -### Supported Actions -[test connectivity](#action-test-connectivity) - Validate the asset configuration for connectivity using supplied configuration -[yara create ruleset](#action-yara-create-ruleset) - TCA-0303 - Create a new YARA ruleset -[yara delete ruleset](#action-yara-delete-ruleset) - TCA-0303 - Delete YARA ruleset -[yara get ruleset info](#action-yara-get-ruleset-info) - TCA-0303 - Get YARA ruleset info -[yara get ruleset text](#action-yara-get-ruleset-text) - TCA-0303 - Get YARA ruleset text -[get yara matches](#action-get-yara-matches) - TCA-0303 - Get a recordset of YARA ruleset matches in the specified time range -[yara retro enable hunt](#action-yara-retro-enable-hunt) - TCA-0319 - Enable YARA retro hunt -[yara retro start hunt](#action-yara-retro-start-hunt) - TCA-0319 - Start YARA retro hunt for the specified ruleset -[yara retro check status](#action-yara-retro-check-status) - TCA-0319 - Check the retro hunt status for the specified ruleset -[yara retro cancel hunt](#action-yara-retro-cancel-hunt) - TCA-0319 - Cancel the retro hunt for the specified ruleset -[get yara retro matches](#action-get-yara-retro-matches) - TCA-0319 - Get a recordset of YARA ruleset matches in the specified time range -[imphash similarity](#action-imphash-similarity) - TCA-0302 - Get a a list of all available SHA1 hashes for files sharing the same import hash (imphash) -[advanced search](#action-advanced-search) - TCA-0320 - Search for hashes using multi-part search criteria -[av scanners](#action-av-scanners) - TCA-0103 - Retrieve AV Scanner data from TitaniumCloud -[file reputation](#action-file-reputation) - TCA-0101 - Queries for file reputation info -[file analysis](#action-file-analysis) - TCA-0104 - Retrieve File Analysis by hash data from TitaniumCloud -[functional similarity](#action-functional-similarity) - TCA-0301 - Retrieve a list of functionally similar hashes to the provided one -[url reputation](#action-url-reputation) - TCA-0403 - Queries URL Threat Intelligence -[get downloaded files](#action-get-downloaded-files) - TCA - 0403 - Get files downloaded from url -[get latest url analysis feed](#action-get-latest-url-analysis-feed) - TCA - 0403 - Get latest url analysis feed -[get url analysis feed from date](#action-get-url-analysis-feed-from-date) - TCA - 0403 - Get url analysis feed from date -[analyze url](#action-analyze-url) - TCA-0404 - Analyze a given URL -[uri statistics](#action-uri-statistics) - TCA-0402 - Retrieve the number of MALICIOUS, SUSPICIOUS and KNOWN files associated with a specific URI -[uri index](#action-uri-index) - TCA-0401 - Retrieve a list of all available file hashes associated with a given URI -[submit for dynamic analysis](#action-submit-for-dynamic-analysis) - TCA-0207 - Submit an existing sample for dynamic analysis -[submit url for dynamic analysis](#action-submit-url-for-dynamic-analysis) - TCA-0207 - Submit an url sample for dynamic analysis -[dynamic analysis results](#action-dynamic-analysis-results) - TCA-0106 - Retrieve dynamic analysis results -[dynamic url analysis results](#action-dynamic-url-analysis-results) - TCA-0106 - Retrieve dynamic analysis results for url -[reanalyze file](#action-reanalyze-file) - TCA-0205 - Reanalyze sample -[upload file](#action-upload-file) - TCA-0202 - Upload file to TitaniumCloud -[get file](#action-get-file) - TCA-0201 - Download a sample from TitaniumCloud -[get network reputation](#action-get-network-reputation) - Network Reputation API -[get list user overrides](#action-get-list-user-overrides) - List User Overrides -[get list user overrides aggregated](#action-get-list-user-overrides-aggregated) - Returns a list of overrides that the user has made -[network reputation user override](#action-network-reputation-user-override) - Network Reputation User Override +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**hash** | required | File hash | string | + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success or failed +action_result.parameter.hash | string | | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + +## action: 'submit for dynamic analysis' +TCA-0207 - Submit an existing sample for dynamic analysis + +Type: **investigate** +Read only: **False** + +TCA-0207 - This service allows users to detonate a file in the ReversingLabs TitaniumCloud sandbox. To submit a file for analysis, it must exist in TitaniumCloud. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**sha1** | required | Selected sample's SHA-1 hash | string | `sha1` `vault id` +**platform** | required | Selected platform on which the analysis will be performed. See TCA-0207 API documentation for available options | string | + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success or failed +action_result.parameter.platform | string | | +action_result.parameter.sha1 | string | | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + +## action: 'submit url for dynamic analysis' +TCA-0207 - Submit an existing URL sample for dynamic analysis + +Type: **investigate** +Read only: **False** + +TCA-0207 - This service allows users to detonate an URL in the ReversingLabs TitaniumCloud sandbox. To submit an url for analysis, it must exist in TitaniumCloud. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**sha1** | required | Selected sample's url string | string | `url` `domain` +**platform** | required | Selected platform on which the analysis will be performed. See TCA-0207 API documentation for available options | string | + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.data.*.rl.url | string | url | +action_result.data.*.rl.sha1 | string | sha1 | +action_result.data.*.rl.status | string | | +action_result.data.*.rl.url_base64 | string | | +action_result.data.*.rl.analysis_id | string | | + +## action: 'upload file' +TCA-0202 - Upload file to TitaniumCloud + +Type: **generic** +Read only: **False** + +TCA-0202 - Upload file to TitaniumCloud. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**vault_id** | required | Vault ID of file to upload | string | `vault id` +**file_name** | optional | Filename to use | string | `file name` + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success or failed +action_result.parameter.file_name | string | `file name` | +action_result.parameter.vault_id | string | `pe file` `pdf` `flash` `apk` `jar` `doc` `xls` `ppt` | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + +## action: 'uri index' +TCA-0401 - Retrieve a list of all available file hashes associated with a given URI + +Type: **generic** +Read only: **False** + +TCA-0401 - Provides a list of all available file hashes associated with a given URI (domain, IP address, email or URL) regardless of file classification. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**uri** | required | Desired URI string | string | `url` `domain` +**limit** | optional | Maximum number of results | numeric | + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success or failed +action_result.parameter.limit | numeric | | +action_result.parameter.uri | string | | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + +## action: 'uri statistics' +TCA-0402 - Retrieve the number of MALICIOUS, SUSPICIOUS and KNOWN files associated with a specific URI + +Type: **generic** +Read only: **False** + +TCA-0402 - Provides the number of MALICIOUS, SUSPICIOUS and KNOWN files associated with a specific URI (domain, IP address, email or URL). + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**uri** | required | Uri | string | `sha1` + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success or failed +action_result.parameter.uri | string | | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + +## action: 'url reputation' +TCA-0403 - Queries URL Threat Intelligence + +Type: **investigate** +Read only: **True** + +TCA-0403 - Queries URL Threat Intelligence. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**url** | required | URL to query | string | `url` + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success or failed +action_result.parameter.url | string | `url` | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + +## action: 'yara create ruleset' +TCA-0304 - Create a new YARA ruleset + +Type: **generic** +Read only: **False** + +TCA-0304 - Create a new YARA ruleset. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**ruleset_name** | required | YARA ruleset name | string | +**ruleset_text** | required | Stringified YARA ruleset / a Unicode string | string | + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success or failed +action_result.parameter.ruleset_name | string | | +action_result.parameter.ruleset_text | string | | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + +## action: 'yara delete ruleset' +TCA-0303 - Delete YARA ruleset + +Type: **generic** +Read only: **False** + +TCA-0303 - Delete YARA ruleset. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**ruleset_name** | required | YARA ruleset name | string | + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success or failed +action_result.parameter.ruleset_name | string | | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + +## action: 'yara get ruleset info' +TCA-0303 - Get YARA ruleset info + +Type: **generic** +Read only: **False** + +TCA-0303 - Get information for a specific YARA ruleset or all YARA rulesets in the collection. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**ruleset_name** | optional | YARA ruleset name | string | + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success or failed +action_result.data.*.ruleset_name | string | | +action_result.data.*.valid | string | | +action_result.data.*.approved | string | | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + +## action: 'yara get ruleset text' +TCA-0303 - Get YARA ruleset text + +Type: **generic** +Read only: **False** + +TCA-0303 - Get the text of a YARA ruleset. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**ruleset_name** | required | YARA ruleset name | string | + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success or failed +action_result.parameter.ruleset_name | string | | +action_result.data.*.text | string | | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + +## action: 'yara retro cancel hunt' +TCA-0319 - Cancel the retro hunt for the specified ruleset + +Type: **generic** +Read only: **False** + +TCA-0319 - Cancel the retro hunt for the specified ruleset. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**ruleset_name** | required | YARA ruleset name | string | + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success or failed +action_result.parameter.ruleset_name | string | | +action_result.data.*.ruleset_sha1 | string | | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + +## action: 'yara retro check status' +TCA-0319 - Check the retro hunt status for the specified ruleset + +Type: **generic** +Read only: **False** + +TCA-0319 - Check the retro hunt status for the specified ruleset. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**ruleset_name** | required | YARA ruleset name | string | + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success or failed +action_result.parameter.ruleset_name | string | | +action_result.data.*.retro_status | string | | +action_result.data.*.start_time | string | | +action_result.data.*.finish_time | string | | +action_result.data.*.reason | string | | +action_result.data.*.progress | string | | +action_result.data.*.estimated_finish_time | string | | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + +## action: 'yara retro enable hunt' +TCA-0319 - Enable YARA retro hunt + +Type: **generic** +Read only: **False** + +TCA-0319 - Enable the retro hunt for the specified ruleset that has been submitted to TitaniumCloud prior to deployment of YARA retro. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**ruleset_name** | required | YARA ruleset name | string | + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success or failed +action_result.parameter.ruleset_name | string | | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + +## action: 'yara retro start hunt' +TCA-0319 - Start YARA retro hunt for the specified ruleset + +Type: **generic** +Read only: **False** + +TCA-0319 - Start YARA retro hunt for the specified ruleset. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**ruleset_name** | required | YARA ruleset name | string | + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success or failed +action_result.parameter.ruleset_name | string | | +action_result.data.*.ruleset_sha1 | string | | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + + +### Configuration Variables +The below configuration variables are required for this Connector to operate. These variables are specified when configuring a TitaniumCloud asset in SOAR. + +VARIABLE | REQUIRED | TYPE | DESCRIPTION +-------- | -------- | ---- | ----------- +**url** | required | string | TitaniumCloud URL +**username** | required | string | TitaniumCloud username +**password** | required | password | TitaniumCloud password + +### Supported Actions +[test connectivity](#action-test-connectivity) - Validate the asset configuration for connectivity using supplied configuration +[yara create ruleset](#action-yara-create-ruleset) - TCA-0303 - Create a new YARA ruleset +[yara delete ruleset](#action-yara-delete-ruleset) - TCA-0303 - Delete YARA ruleset +[yara get ruleset info](#action-yara-get-ruleset-info) - TCA-0303 - Get YARA ruleset info +[yara get ruleset text](#action-yara-get-ruleset-text) - TCA-0303 - Get YARA ruleset text +[get yara matches](#action-get-yara-matches) - TCA-0303 - Get a recordset of YARA ruleset matches in the specified time range +[yara retro enable hunt](#action-yara-retro-enable-hunt) - TCA-0319 - Enable YARA retro hunt +[yara retro start hunt](#action-yara-retro-start-hunt) - TCA-0319 - Start YARA retro hunt for the specified ruleset +[yara retro check status](#action-yara-retro-check-status) - TCA-0319 - Check the retro hunt status for the specified ruleset +[yara retro cancel hunt](#action-yara-retro-cancel-hunt) - TCA-0319 - Cancel the retro hunt for the specified ruleset +[get yara retro matches](#action-get-yara-retro-matches) - TCA-0319 - Get a recordset of YARA ruleset matches in the specified time range +[imphash similarity](#action-imphash-similarity) - TCA-0302 - Get a a list of all available SHA1 hashes for files sharing the same import hash (imphash) +[advanced search](#action-advanced-search) - TCA-0320 - Search for hashes using multi-part search criteria +[av scanners](#action-av-scanners) - TCA-0103 - Retrieve AV Scanner data from TitaniumCloud +[file reputation](#action-file-reputation) - TCA-0101 - Queries for file reputation info +[file analysis](#action-file-analysis) - TCA-0104 - Retrieve File Analysis by hash data from TitaniumCloud +[functional similarity](#action-functional-similarity) - TCA-0301 - Retrieve a list of functionally similar hashes to the provided one +[url reputation](#action-url-reputation) - TCA-0403 - Queries URL Threat Intelligence +[get downloaded files](#action-get-downloaded-files) - TCA - 0403 - Get files downloaded from url +[get latest url analysis feed](#action-get-latest-url-analysis-feed) - TCA - 0403 - Get latest url analysis feed +[get url analysis feed from date](#action-get-url-analysis-feed-from-date) - TCA - 0403 - Get url analysis feed from date +[analyze url](#action-analyze-url) - TCA-0404 - Analyze a given URL +[uri statistics](#action-uri-statistics) - TCA-0402 - Retrieve the number of MALICIOUS, SUSPICIOUS and KNOWN files associated with a specific URI +[uri index](#action-uri-index) - TCA-0401 - Retrieve a list of all available file hashes associated with a given URI +[submit for dynamic analysis](#action-submit-for-dynamic-analysis) - TCA-0207 - Submit an existing sample for dynamic analysis +[submit url for dynamic analysis](#action-submit-url-for-dynamic-analysis) - TCA-0207 - Submit an url sample for dynamic analysis +[dynamic analysis results](#action-dynamic-analysis-results) - TCA-0106 - Retrieve dynamic analysis results +[dynamic url analysis results](#action-dynamic-url-analysis-results) - TCA-0106 - Retrieve dynamic analysis results for url +[reanalyze file](#action-reanalyze-file) - TCA-0205 - Reanalyze sample +[upload file](#action-upload-file) - TCA-0202 - Upload file to TitaniumCloud +[get file](#action-get-file) - TCA-0201 - Download a sample from TitaniumCloud +[get network reputation](#action-get-network-reputation) - Network Reputation API +[get list user overrides](#action-get-list-user-overrides) - List User Overrides +[get list user overrides aggregated](#action-get-list-user-overrides-aggregated) - Returns a list of overrides that the user has made +[network reputation user override](#action-network-reputation-user-override) - Network Reputation User Override +[file reputation user override](#action-file-reputation-user-override) - File Reputation User Override +[list active file reputation user overrides](#action-list-active-file-reputation-user-overrides) - List Active File Reputation User Overrides +[customer daily usage](#action-customer-daily-usage) - Check daily usage of ReversingLabs API +[customer dayrange usage](#action-customer-dayrange-usage) - Check ReversingLabs API usage for specified time range (in days) +[customer monthly usage](#action-customer-monthly-usage) - Check Monthly usage of ReversingLabs API +[customer month range usage](#action-customer-month-range-usage) - Check ReversingLabs API usage for specified time range (in months) +[customer yara api usage](#action-customer-yara-api-usage) - Check Yara usage on ReversingLabs API +[customer quota limits](#action-customer-quota-limits) - Returns current quota limits for APIs accessible to the authenticated user or users belonging to the authenticated user's company +[get domain report](#action-get-domain-report) - API returns threat intelligence data for the submitted domain +[get domain downloaded files](#action-get-domain-downloaded-files) - Retrieve a list of files downloaded from the submitted domain +[get urls from domain](#action-get-urls-from-domain) - API provides a list of URLs associated with the requested domain +[get resolutions from domain](#action-get-resolutions-from-domain) - API provides a list of domain-to-IP mappings for the requested domain +[get related domains](#action-get-related-domains) - API provides a list of domains that have the same top parent domain as the requested domain +[get ip report](#action-get-ip-report) - API returns threat intelligence data for the submitted ip address +[get ip downloaded files](#action-get-ip-downloaded-files) - Retrieve a list of files downloaded from the submitted IP address +[get urls from ip](#action-get-urls-from-ip) - API provides a list of URLs associated with the requested IP address +[get resolutions from ip](#action-get-resolutions-from-ip) - API provides a list of IP-to-domain mappings for the requested IP address + +## action: 'test connectivity' +Validate the asset configuration for connectivity using supplied configuration + +Type: **test** +Read only: **True** + +Validate the asset configuration for connectivity using supplied configuration. + +#### Action Parameters +No parameters are required for this action + +#### Action Output +No Output + +## action: 'yara create ruleset' +TCA-0303 - Create a new YARA ruleset + +Type: **generic** +Read only: **False** + +TCA-0303 - Create a new YARA ruleset. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**ruleset_name** | required | YARA ruleset name | string | +**ruleset_text** | required | Stringified YARA ruleset / a Unicode string | string | + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success failed +action_result.parameter.ruleset_name | string | | +action_result.parameter.ruleset_text | string | | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + +## action: 'yara delete ruleset' +TCA-0303 - Delete YARA ruleset + +Type: **generic** +Read only: **False** + +TCA-0303 - Delete YARA ruleset. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**ruleset_name** | required | YARA ruleset name | string | + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success failed +action_result.parameter.ruleset_name | string | | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + +## action: 'yara get ruleset info' +TCA-0303 - Get YARA ruleset info + +Type: **generic** +Read only: **False** + +TCA-0303 - Get information for a specific YARA ruleset or all YARA rulesets in the collection. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**ruleset_name** | optional | YARA ruleset name | string | + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success failed +action_result.data.\*.ruleset_name | string | | +action_result.data.\*.valid | string | | +action_result.data.\*.approved | string | | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + +## action: 'yara get ruleset text' +TCA-0303 - Get YARA ruleset text + +Type: **generic** +Read only: **False** + +TCA-0303 - Get the text of a YARA ruleset. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**ruleset_name** | required | YARA ruleset name | string | + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.parameter.ruleset_name | string | | +action_result.data.\*.text | string | | +action_result.status | string | | success failed +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + +## action: 'get yara matches' +TCA-0303 - Get a recordset of YARA ruleset matches in the specified time range + +Type: **investigate** +Read only: **False** + +TCA-0303 - Get a recordset of YARA ruleset matches in the specified time range. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**time_format** | required | 'utc' or 'timestamp' | string | +**time_value** | required | 'YYYY-MM-DDThh:mm:ss' or Unix timestamp string | string | + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success failed +action_result.parameter.time_format | string | | +action_result.parameter.time_value | string | | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + +## action: 'yara retro enable hunt' +TCA-0319 - Enable YARA retro hunt + +Type: **investigate** +Read only: **False** + +TCA-0319 - Enable the retro hunt for the specified ruleset that has been submitted to TitaniumCloud prior to deployment of YARA retro. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**ruleset_name** | required | YARA ruleset name | string | + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success failed +action_result.parameter.ruleset_name | string | | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + +## action: 'yara retro start hunt' +TCA-0319 - Start YARA retro hunt for the specified ruleset + +Type: **investigate** +Read only: **False** + +TCA-0319 - Start YARA retro hunt for the specified ruleset. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**ruleset_name** | required | YARA ruleset name | string | + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success failed +action_result.parameter.ruleset_name | string | | +action_result.data.\*.ruleset_sha1 | string | | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + +## action: 'yara retro check status' +TCA-0319 - Check the retro hunt status for the specified ruleset + +Type: **generic** +Read only: **False** + +TCA-0319 - Check the retro hunt status for the specified ruleset. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**ruleset_name** | required | YARA ruleset name | string | + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.parameter.ruleset_name | string | | +action_result.data.\*.retro_status | string | | +action_result.data.\*.start_time | string | | +action_result.data.\*.finish_time | string | | +action_result.data.\*.reason | string | | +action_result.data.\*.progress | string | | +action_result.data.\*.estimated_finish_time | string | | +action_result.status | string | | success failed +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + +## action: 'yara retro cancel hunt' +TCA-0319 - Cancel the retro hunt for the specified ruleset + +Type: **generic** +Read only: **False** + +TCA-0319 - Cancel the retro hunt for the specified ruleset. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**ruleset_name** | required | YARA ruleset name | string | + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success failed +action_result.parameter.ruleset_name | string | | +action_result.data.\*.ruleset_sha1 | string | | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + +## action: 'get yara retro matches' +TCA-0319 - Get a recordset of YARA ruleset matches in the specified time range + +Type: **investigate** +Read only: **False** + +TCA-0319 - Get a recordset of YARA ruleset matches in the specified time range. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**time_format** | required | 'utc' or 'timestamp' | string | +**time_value** | required | 'YYYY-MM-DDThh:mm:ss' or Unix timestamp string | string | + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success failed +action_result.data.\*.rl.feed.name | string | | +action_result.data.\*.rl.feed.time_range.from | string | | +action_result.data.\*.rl.feed.time_range.to | string | | +action_result.data.\*.rl.feed.last_timestamp | string | | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + +## action: 'imphash similarity' +TCA-0302 - Get a a list of all available SHA1 hashes for files sharing the same import hash (imphash) + +Type: **investigate** +Read only: **True** + +TCA-0302 - Imphash Index provides a list of all available SHA1 hashes for files sharing the same import hash (imphash). An imphash is a hash calculated from a string which contains the libraries imported by a Windows Portable Executable (PE) file. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**imphash** | required | Imphash | string | `hash` +**limit** | optional | Maximum number of results | numeric | + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success failed +action_result.parameter.imphash | string | | +action_result.parameter.limit | numeric | | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + +## action: 'advanced search' +TCA-0320 - Search for hashes using multi-part search criteria + +Type: **investigate** +Read only: **False** + +TCA-0320 - Search for hashes using multi-part search criteria. Supported criteria include more than 60 keywords, 35 antivirus vendors, 137 sample types and subtypes, and 283 tags that enable creating 510 unique search expressions with support for Boolean operators and case-insensitive wildcard matching. A number of search keywords support relational operators '<=' and '>='. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**query** | required | Advanced Search query | string | +**limit** | optional | Maximum number of results | numeric | + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success failed +action_result.parameter.limit | numeric | | +action_result.parameter.query | string | | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + +## action: 'av scanners' +TCA-0103 - Retrieve AV Scanner data from TitaniumCloud + +Type: **investigate** +Read only: **False** + +TCA-0103 - Provides AV vendor cross-reference data for a desired sample from multiple AV scanners. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**hash** | required | File hash | string | `sha1` `sha256` `md5` + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success failed +action_result.parameter.hash | string | | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + +## action: 'file reputation' +TCA-0101 - Queries for file reputation info + +Type: **investigate** +Read only: **True** + +TCA-0101 - Queries for file reputation info. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**hash** | required | File hash to query | string | `hash` `sha256` `sha1` `md5` + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success failed +action_result.parameter.hash | string | `hash` `sha256` `sha1` `md5` | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + +## action: 'file analysis' +TCA-0104 - Retrieve File Analysis by hash data from TitaniumCloud + +Type: **investigate** +Read only: **False** + +TCA-0104 - Provides file analysis data on hashes. Metadata can include relevant portions of static analysis, AV scan information, file sources and any related IP/domain information. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**hash** | required | File hash | string | `sha1` `sha256` `md5` `vauld id` + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success failed +action_result.parameter.hash | string | | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + +## action: 'functional similarity' +TCA-0301 - Retrieve a list of functionally similar hashes to the provided one + +Type: **investigate** +Read only: **False** + +TCA-0301 - Provides a list of SHA1 hashes of files that are functionally similar to the provided file (SHA1 hash) at the selected precision level. + +#### Action Parameters +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**hash** | required | File hash | string | `sha1` +**limit** | optional | Maximum number of results | numeric | + +#### Action Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success failed +action_result.parameter.hash | string | | +action_result.parameter.limit | numeric | | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | -## action: 'test connectivity' -Validate the asset configuration for connectivity using supplied configuration +## action: 'url reputation' +TCA-0403 - Queries URL Threat Intelligence -Type: **test** +Type: **investigate** Read only: **True** -Validate the asset configuration for connectivity using supplied configuration. +TCA-0403 - Queries URL Threat Intelligence. #### Action Parameters -No parameters are required for this action +PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS +--------- | -------- | ----------- | ---- | -------- +**url** | required | URL to query | string | `url` #### Action Output -No Output +DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES +--------- | ---- | -------- | -------------- +action_result.status | string | | success failed +action_result.parameter.url | string | `url` | +action_result.data | string | | +action_result.summary | string | | +action_result.message | string | | +summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | -## action: 'yara create ruleset' -TCA-0303 - Create a new YARA ruleset +## action: 'get downloaded files' +TCA - 0403 - Get files downloaded from url -Type: **generic** +Type: **investigate** Read only: **False** -TCA-0303 - Create a new YARA ruleset. +Accepts a URL string and returns a list of downloaded files aggregated through multiple pages of results. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**ruleset_name** | required | YARA ruleset name | string | -**ruleset_text** | required | Stringified YARA ruleset / a Unicode string | string | +**url** | required | URL string | string | `url` +**extended** | optional | Return extended report | boolean | +**classification** | optional | Return only files of this classification | string | +**last_analysis** | optional | Return only files from the last analysis | boolean | +**analysis_id** | optional | Return only files from this analysis | string | +**results_per_page** | optional | Number of results to be returned in one page, maximum value is 1000 | numeric | +**max_results** | optional | Maximum results to be returned in the list | numeric | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success failed -action_result.parameter.ruleset_name | string | | -action_result.parameter.ruleset_text | string | | -action_result.data | string | | -action_result.summary | string | | +action_result.parameter.url | string | | +action_result.parameter.extended | boolean | | +action_result.parameter.classification | string | | +action_result.parameter.last_analysis | boolean | | +action_result.parameter.analysis_id | string | | +action_result.parameter.results_per_page | numeric | | +action_result.parameter.max_results | numeric | | +action_result.status | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'yara delete ruleset' -TCA-0303 - Delete YARA ruleset +## action: 'get latest url analysis feed' +TCA - 0403 - Get latest url analysis feed Type: **generic** Read only: **False** -TCA-0303 - Delete YARA ruleset. +Returns the latest URL analyses reports aggregated as list. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**ruleset_name** | required | YARA ruleset name | string | +**results_per_page** | optional | Number of results to be returned in one page, maximum value is 1000 | numeric | +**max_results** | optional | Maximum results to be returned in the list | numeric | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success failed -action_result.parameter.ruleset_name | string | | -action_result.data | string | | -action_result.summary | string | | +action_result.parameter.results_per_page | numeric | | +action_result.parameter.max_results | numeric | | +action_result.status | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'yara get ruleset info' -TCA-0303 - Get YARA ruleset info +## action: 'get url analysis feed from date' +TCA - 0403 - Get url analysis feed from date Type: **generic** Read only: **False** -TCA-0303 - Get information for a specific YARA ruleset or all YARA rulesets in the collection. +Accepts time format and a start time and returns URL analyses report from that defined time onward aggregated as a list. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**ruleset_name** | optional | YARA ruleset name | string | +**time_format** | required | Possible values: 'utc' or 'timestamp' | string | +**start_time** | required | Time from which to retrieve results onwards. Needs to be less than 90 days from now | string | +**results_per_page** | optional | Number of results to be returned in one page, maximum value is 1000 | numeric | +**max_results** | optional | Maximum results to be returned in the list | numeric | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success failed -action_result.data.\*.ruleset_name | string | | -action_result.data.\*.valid | string | | -action_result.data.\*.approved | string | | -action_result.data | string | | -action_result.summary | string | | +action_result.parameter.time_format | string | | +action_result.parameter.start_time | string | | +action_result.parameter.results_per_page | numeric | | +action_result.parameter.max_results | numeric | | +action_result.status | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'yara get ruleset text' -TCA-0303 - Get YARA ruleset text +## action: 'analyze url' +TCA-0404 - Analyze a given URL -Type: **generic** +Type: **investigate** Read only: **False** -TCA-0303 - Get the text of a YARA ruleset. +TCA-0404 - This service allows users to submit a URL for analysis. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**ruleset_name** | required | YARA ruleset name | string | +**url** | required | URL to analyze | string | `url` #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.parameter.ruleset_name | string | | -action_result.data.\*.text | string | | action_result.status | string | | success failed +action_result.parameter.url | string | | action_result.data | string | | action_result.summary | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'get yara matches' -TCA-0303 - Get a recordset of YARA ruleset matches in the specified time range +## action: 'uri statistics' +TCA-0402 - Retrieve the number of MALICIOUS, SUSPICIOUS and KNOWN files associated with a specific URI -Type: **generic** +Type: **investigate** Read only: **False** -TCA-0303 - Get a recordset of YARA ruleset matches in the specified time range. +TCA-0402 - Provides the number of MALICIOUS, SUSPICIOUS and KNOWN files associated with a specific URI (domain, IP address, email or URL). #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**time_format** | required | 'utc' or 'timestamp' | string | -**time_value** | required | 'YYYY-MM-DDThh:mm:ss' or Unix timestamp string | string | +**uri** | required | Uri | string | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- action_result.status | string | | success failed -action_result.parameter.time_format | string | | -action_result.parameter.time_value | string | | +action_result.parameter.uri | string | | action_result.data | string | | action_result.summary | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'yara retro enable hunt' -TCA-0319 - Enable YARA retro hunt +## action: 'uri index' +TCA-0401 - Retrieve a list of all available file hashes associated with a given URI -Type: **generic** +Type: **investigate** Read only: **False** -TCA-0319 - Enable the retro hunt for the specified ruleset that has been submitted to TitaniumCloud prior to deployment of YARA retro. +TCA-0401 - Provides a list of all available file hashes associated with a given URI (domain, IP address, email or URL) regardless of file classification. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**ruleset_name** | required | YARA ruleset name | string | +**uri** | required | Desired URI string | string | `url` `domain` +**limit** | optional | Maximum number of results | numeric | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- action_result.status | string | | success failed -action_result.parameter.ruleset_name | string | | +action_result.parameter.limit | numeric | | +action_result.parameter.uri | string | | action_result.data | string | | action_result.summary | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'yara retro start hunt' -TCA-0319 - Start YARA retro hunt for the specified ruleset +## action: 'submit for dynamic analysis' +TCA-0207 - Submit an existing sample for dynamic analysis -Type: **generic** +Type: **investigate** Read only: **False** -TCA-0319 - Start YARA retro hunt for the specified ruleset. +TCA-0207 - This service allows users to detonate a file in the ReversingLabs TitaniumCloud sandbox. To submit a file for analysis, it must exist in TitaniumCloud. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**ruleset_name** | required | YARA ruleset name | string | +**sha1** | required | Selected sample's SHA-1 hash | string | `sha1` `vault id` +**platform** | required | Selected platform on which the analysis will be performed. See TCA-0207 API documentation for available options | string | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- action_result.status | string | | success failed -action_result.parameter.ruleset_name | string | | -action_result.data.\*.ruleset_sha1 | string | | +action_result.parameter.platform | string | | +action_result.parameter.sha1 | string | | action_result.data | string | | action_result.summary | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'yara retro check status' -TCA-0319 - Check the retro hunt status for the specified ruleset +## action: 'submit url for dynamic analysis' +TCA-0207 - Submit an url sample for dynamic analysis -Type: **generic** +Type: **investigate** Read only: **False** -TCA-0319 - Check the retro hunt status for the specified ruleset. +TCA-0207 - This service allows users to analyze a url in the ReversingLabs TitaniumCloud sandbox. To submit an url for analysis, it must exist in TitaniumCloud. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**ruleset_name** | required | YARA ruleset name | string | +**url** | required | Selected sample's url string | string | `url` `domain` +**platform** | required | Selected platform on which the analysis will be performed. See TCA-0207 API documentation for available options | string | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.parameter.ruleset_name | string | | -action_result.data.\*.retro_status | string | | -action_result.data.\*.start_time | string | | -action_result.data.\*.finish_time | string | | -action_result.data.\*.reason | string | | -action_result.data.\*.progress | string | | -action_result.data.\*.estimated_finish_time | string | | -action_result.status | string | | success failed -action_result.data | string | | +action_result.data.\*.rl.url | string | `url` | +action_result.data.\*.rl.sha1 | string | `sha1` | +action_result.data.\*.rl.status | string | | +action_result.data.\*.rl.url_base64 | string | | +action_result.data.\*.rl.analysis_id | string | | +action_result.status | string | | action_result.summary | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'yara retro cancel hunt' -TCA-0319 - Cancel the retro hunt for the specified ruleset +## action: 'dynamic analysis results' +TCA-0106 - Retrieve dynamic analysis results -Type: **generic** +Type: **investigate** Read only: **False** -TCA-0319 - Cancel the retro hunt for the specified ruleset. +TCA-0106 - This service allows users to retrieve dynamic analysis results for a file that was submitted for dynamic analysis. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**ruleset_name** | required | YARA ruleset name | string | +**sha1** | required | Selected sample's SHA-1 hash | string | `sha1` +**analysis_id** | optional | Return only the results of this analysis | string | +**latest** | optional | Return only the latest analysis results | boolean | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- action_result.status | string | | success failed -action_result.parameter.ruleset_name | string | | -action_result.data.\*.ruleset_sha1 | string | | +action_result.parameter.analysis_id | string | | +action_result.parameter.latest | boolean | | +action_result.parameter.sha1 | string | | action_result.data | string | | action_result.summary | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'get yara retro matches' -TCA-0319 - Get a recordset of YARA ruleset matches in the specified time range +## action: 'dynamic url analysis results' +TCA-0106 - Retrieve dynamic analysis results for url -Type: **generic** -Read only: **False** +Type: **investigate** +Read only: **True** -TCA-0319 - Get a recordset of YARA ruleset matches in the specified time range. +TCA-0106 - This service allows users to retrieve dynamic analysis results for an url that was submitted for dynamic analysis. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**time_format** | required | 'utc' or 'timestamp' | string | -**time_value** | required | 'YYYY-MM-DDThh:mm:ss' or Unix timestamp string | string | +**url** | required | Provide one of the following: sha1, base64 or url | string | `sha1` `url` +**analysis_id** | optional | Return only the results of this analysis | string | +**latest** | optional | Return only the latest analysis results | boolean | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success failed -action_result.data.\*.rl.feed.name | string | | -action_result.data.\*.rl.feed.time_range.from | string | | -action_result.data.\*.rl.feed.time_range.to | string | | -action_result.data.\*.rl.feed.last_timestamp | string | | -action_result.data | string | | +action_result.parameter.analysis_id | string | | +action_result.data.0.requested_sha1_url | string | | +action_result.status | string | | action_result.summary | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'imphash similarity' -TCA-0302 - Get a a list of all available SHA1 hashes for files sharing the same import hash (imphash) +## action: 'reanalyze file' +TCA-0205 - Reanalyze sample Type: **investigate** -Read only: **True** +Read only: **False** -TCA-0302 - Imphash Index provides a list of all available SHA1 hashes for files sharing the same import hash (imphash). An imphash is a hash calculated from a string which contains the libraries imported by a Windows Portable Executable (PE) file. +TCA-0205 - This query sends a sample with the requested hash for rescanning. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**imphash** | required | Imphash | string | `hash` -**limit** | optional | Maximum number of results | numeric | +**hash** | required | File hash | string | `md5` `sha1` `sha256` #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- action_result.status | string | | success failed -action_result.parameter.imphash | string | | -action_result.parameter.limit | numeric | | +action_result.parameter.hash | string | | action_result.data | string | | action_result.summary | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'advanced search' -TCA-0320 - Search for hashes using multi-part search criteria +## action: 'upload file' +TCA-0202 - Upload file to TitaniumCloud Type: **generic** Read only: **False** -TCA-0320 - Search for hashes using multi-part search criteria. Supported criteria include more than 60 keywords, 35 antivirus vendors, 137 sample types and subtypes, and 283 tags that enable creating 510 unique search expressions with support for Boolean operators and case-insensitive wildcard matching. A number of search keywords support relational operators '<=' and '>='. +TCA-0202 - Upload file to TitaniumCloud. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**query** | required | Advanced Search query | string | -**limit** | optional | Maximum number of results | numeric | +**vault_id** | required | Vault ID of file to upload | string | `vault id` +**file_name** | optional | Filename to use | string | `file name` #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- action_result.status | string | | success failed -action_result.parameter.limit | numeric | | -action_result.parameter.query | string | | +action_result.parameter.file_name | string | `file name` | +action_result.parameter.vault_id | string | `pe file` `pdf` `flash` `apk` `jar` `doc` `xls` `ppt` | action_result.data | string | | action_result.summary | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'av scanners' -TCA-0103 - Retrieve AV Scanner data from TitaniumCloud +## action: 'get file' +TCA-0201 - Download a sample from TitaniumCloud Type: **investigate** -Read only: **False** +Read only: **True** -TCA-0103 - Provides AV vendor cross-reference data for a desired sample from multiple AV scanners. +TCA-0201 - Download a sample from TitaniumCloud and add it to the vault. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**hash** | required | File hash | string | `sha1` `sha256` `md5` +**hash** | required | Hash of file/sample to download | string | `md5` `sha1` `sha256` #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- action_result.status | string | | success failed -action_result.parameter.hash | string | | +action_result.parameter.hash | string | `md5` `sha1` `sha256` | action_result.data | string | | action_result.summary | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'file reputation' -TCA-0101 - Queries for file reputation info +## action: 'get network reputation' +Network Reputation API Type: **investigate** -Read only: **True** +Read only: **False** -TCA-0101 - Queries for file reputation info. +Service provides information regarding the reputation of a requested URL, domain, or IP address. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**hash** | required | File hash to query | string | `hash` `sha256` `sha1` `md5` +**network_locations** | required | Network location to check (URL,DNS,IP) | string | `domain` `url` `ip` #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success failed -action_result.parameter.hash | string | `hash` `sha256` `sha1` `md5` | -action_result.data | string | | -action_result.summary | string | | +action_result.status | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'file analysis' -TCA-0104 - Retrieve File Analysis by hash data from TitaniumCloud +## action: 'get list user overrides' +List User Overrides -Type: **investigate** +Type: **generic** Read only: **False** -TCA-0104 - Provides file analysis data on hashes. Metadata can include relevant portions of static analysis, AV scan information, file sources and any related IP/domain information. +The Network Reputation User Override service enables URL classification overrides. Any URL can be overridden to malicious, suspicious, or known. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**hash** | required | File hash | string | `sha1` `sha256` `md5` `vauld id` +**next_page_sha1** | optional | Optional parameter used for pagination | string | `sha1` #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success failed -action_result.parameter.hash | string | | -action_result.data | string | | -action_result.summary | string | | +action_result.data.\*.user_override.network_locations.\*.network_location | string | `url` `domain` `ip` | +action_result.data.\*.user_override.network_locations.\*.type | string | `url` `domain` `ip` | +action_result.status | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'functional similarity' -TCA-0301 - Retrieve a list of functionally similar hashes to the provided one +## action: 'get list user overrides aggregated' +Returns a list of overrides that the user has made -Type: **investigate** +Type: **generic** Read only: **False** -TCA-0301 - Provides a list of SHA1 hashes of files that are functionally similar to the provided file (SHA1 hash) at the selected precision level. +This API automatically handles paging and returns a list of results instead of a Response object. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**hash** | required | File hash | string | `sha1` -**limit** | optional | Maximum number of results | numeric | +**max_results** | optional | Maximum number of results to be returned in the list | numeric | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success failed -action_result.parameter.hash | string | | -action_result.parameter.limit | numeric | | -action_result.data | string | | -action_result.summary | string | | +action_result.data.\*.\*.network_location | string | `url` `domain` `ip` | +action_result.data.\*.\*.type | string | `url` `domain` `ip` | +action_result.status | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'url reputation' -TCA-0403 - Queries URL Threat Intelligence +## action: 'network reputation user override' +Network Reputation User Override -Type: **investigate** -Read only: **True** +Type: **generic** +Read only: **False** -TCA-0403 - Queries URL Threat Intelligence. +The Network Reputation User Override service enables URL classification overrides. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**url** | required | URL to query | string | `url` +**override_list** | required | List of network locations whose classification needs to be overriden structured in JSON format. Visit documentation for guidance | string | +**remove_overrides_list** | optional | List of network locations whose classification override needs to be removed structured in JSON format. Visit documentation for guidance | string | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success failed -action_result.parameter.url | string | `url` | -action_result.data | string | | -action_result.summary | string | | +action_result.parameter.override_list | string | | +action_result.parameter.remove_overrides_list | string | | +action_result.status | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'get downloaded files' -TCA - 0403 - Get files downloaded from url +## action: 'file reputation user override' +File Reputation User Override Type: **generic** Read only: **False** -Accepts a URL string and returns a list of downloaded files aggregated through multiple pages of results. +The File Reputation User Override service enables File sample classification overrides. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**url** | required | URL string | string | `url` -**extended** | optional | Return extended report | boolean | -**classification** | optional | Return only files of this classification | string | -**last_analysis** | optional | Return only files from the last analysis | boolean | -**analysis_id** | optional | Return only files from this analysis | string | -**results_per_page** | optional | Number of results to be returned in one page, maximum value is 1000 | numeric | -**max_results** | optional | Maximum results to be returned in the list | numeric | +**override_samples** | optional | List of samples to override structured in JSON format. Visit documentation for guidance | string | +**remove_overrides** | optional | List of samples whose classification override needs to be removed structured in JSON format. Visit documentation for guidance | string | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.parameter.url | string | | -action_result.parameter.extended | boolean | | -action_result.parameter.classification | string | | -action_result.parameter.last_analysis | boolean | | -action_result.parameter.analysis_id | string | | -action_result.parameter.results_per_page | numeric | | -action_result.parameter.max_results | numeric | | +action_result.parameter.override_samples | string | | +action_result.parameter.remove_overrides | string | | action_result.status | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'get latest url analysis feed' -TCA - 0403 - Get latest url analysis feed +## action: 'list active file reputation user overrides' +List Active File Reputation User Overrides Type: **generic** Read only: **False** -Returns the latest URL analyses reports aggregated as list. +The File Reputation User Override service enables sample classification overrides. Any sample can be overridden to malicious, suspicious, or known. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**results_per_page** | optional | Number of results to be returned in one page, maximum value is 1000 | numeric | -**max_results** | optional | Maximum results to be returned in the list | numeric | +**hash_type** | required | Required parameter that defines the type of hash | string | +**start_hash** | optional | When this parameter is present, the API will return up to 1000 hashes with a classification override starting from the start_hash value | string | `sha1` `sha256` `md5` #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.parameter.results_per_page | numeric | | -action_result.parameter.max_results | numeric | | +action_result.data.\*.user_override.hash_values | string | `sha1` `sha256` `md5` | action_result.status | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'get url analysis feed from date' -TCA - 0403 - Get url analysis feed from date +## action: 'customer daily usage' +Check daily usage of ReversingLabs API Type: **generic** Read only: **False** -Accepts time format and a start time and returns URL analyses report from that defined time onward aggregated as a list. +API allows ReversingLabs customers to track the usage of TitaniumCloud services provisioned to all accounts in a company. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**time_format** | required | Possible values: 'utc' or 'timestamp' | string | -**start_time** | required | Time from which to retrieve results onwards | string | -**results_per_page** | optional | Number of results to be returned in one page, maximum value is 1000 | numeric | -**max_results** | optional | Maximum results to be returned in the list | numeric | +**date** | required | Specifies the date for which customer usage information should be returned. Users can submit one value per request in the YYYY-MM-DD format. | string | +**company** | optional | When this parameter is checked, the API will return usage for all accounts within the company | boolean | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.parameter.time_format | string | | -action_result.parameter.start_time | string | | -action_result.parameter.results_per_page | numeric | | -action_result.parameter.max_results | numeric | | +action_result.data.\*.date | string | | +action_result.data.\*.usage_report.\*.product | string | | +action_result.data.\*.usage_report.\*.number_of_queries | string | | +action_result.data.\*.usage_report.\*.used_bytes | string | | action_result.status | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'analyze url' -TCA-0404 - Analyze a given URL +## action: 'customer dayrange usage' +Check ReversingLabs API usage for specified time range (in days) -Type: **investigate** +Type: **generic** Read only: **False** -TCA-0404 - This service allows users to submit a URL for analysis. +API allows ReversingLabs customers to track the usage of TitaniumCloud services provisioned to all accounts in a company. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**url** | required | URL to analyze | string | `url` +**from_date** | required | Specifies the from date for which customer usage information should be returned. Users can submit one value per request in the YYYY-MM-DD format | string | +**to_date** | required | Specifies the to date for which customer usage information should be returned. Users can submit one value per request in the YYYY-MM-DD format | string | +**company** | optional | When this parameter is checked, the API will return usage for all accounts within the company | boolean | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success failed -action_result.parameter.url | string | | -action_result.data | string | | -action_result.summary | string | | +action_result.status | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'uri statistics' -TCA-0402 - Retrieve the number of MALICIOUS, SUSPICIOUS and KNOWN files associated with a specific URI +## action: 'customer monthly usage' +Check Monthly usage of ReversingLabs API -Type: **investigate** +Type: **generic** Read only: **False** -TCA-0402 - Provides the number of MALICIOUS, SUSPICIOUS and KNOWN files associated with a specific URI (domain, IP address, email or URL). +API allows ReversingLabs customers to track the usage of TitaniumCloud services provisioned to all accounts in a company. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**uri** | required | Uri | string | `sha1` +**month** | required | Specifies the month for which customer usage information should be returned. Users can submit one value per request in the YYYY-MM format | string | +**company** | optional | When this parameter is checked, the API will return usage for all accounts within the company | boolean | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success failed -action_result.parameter.uri | string | | -action_result.data | string | | -action_result.summary | string | | +action_result.data.\*.month | string | | +action_result.data.\*.usage_report.\*.product | string | | +action_result.data.\*.usage_report.\*.number_of_queries | string | | +action_result.data.\*.usage_report.\*.used_bytes | string | | +action_result.status | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'uri index' -TCA-0401 - Retrieve a list of all available file hashes associated with a given URI +## action: 'customer month range usage' +Check ReversingLabs API usage for specified time range (in months) Type: **generic** Read only: **False** -TCA-0401 - Provides a list of all available file hashes associated with a given URI (domain, IP address, email or URL) regardless of file classification. +API allows ReversingLabs customers to track the usage of TitaniumCloud services provisioned to all accounts in a company. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**uri** | required | Desired URI string | string | `url` `domain` -**limit** | optional | Maximum number of results | numeric | +**from_month** | required | Specifies the from date for which customer usage information should be returned. Users can submit one value per request in the YYYY-MM format | string | +**to_month** | required | Specifies the to date for which customer usage information should be returned. Users can submit one value per request in the YYYY-MM format | string | +**company** | optional | When this parameter is checked, the API will return usage for all accounts within the company | boolean | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success failed -action_result.parameter.limit | numeric | | -action_result.parameter.uri | string | | -action_result.data | string | | -action_result.summary | string | | +action_result.status | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'submit for dynamic analysis' -TCA-0207 - Submit an existing sample for dynamic analysis +## action: 'customer yara api usage' +Check Yara usage on ReversingLabs API -Type: **investigate** +Type: **generic** Read only: **False** -TCA-0207 - This service allows users to detonate a file in the ReversingLabs TitaniumCloud sandbox. To submit a file for analysis, it must exist in TitaniumCloud. +This query returns information about the number of active YARA rulesets for the TitaniumCloud account that sent the request. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**sha1** | required | Selected sample's SHA-1 hash | string | `sha1` `vault id` -**platform** | required | Selected platform on which the analysis will be performed. See TCA-0207 API documentation for available options | string | +**format** | optional | Specify the response format. Supported values are xml and json. The default is JSON | string | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success failed -action_result.parameter.platform | string | | -action_result.parameter.sha1 | string | | -action_result.data | string | | -action_result.summary | string | | +action_result.data.\*.product | string | | +action_result.data.\*.number_of_active_rulesets | string | | +action_result.status | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'submit url for dynamic analysis' -TCA-0207 - Submit an url sample for dynamic analysis +## action: 'customer quota limits' +Returns current quota limits for APIs accessible to the authenticated user or users belonging to the authenticated user's company -Type: **investigate** +Type: **generic** Read only: **False** -TCA-0207 - This service allows users to analyze a url in the ReversingLabs TitaniumCloud sandbox. To submit an url for analysis, it must exist in TitaniumCloud. +API allows ReversingLabs customers to track quota limits of TitaniumCloud services provisioned to all accounts in a company. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**url** | required | Selected sample's url string | string | `url` `domain` -**platform** | required | Selected platform on which the analysis will be performed. See TCA-0207 API documentation for available options | string | +**company** | optional | When this parameter is checked, the API will return quota limits for all accounts within the company | boolean | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.data.\*.rl.url | string | `url` | -action_result.data.\*.rl.sha1 | string | `sha1` | -action_result.data.\*.rl.status | string | | -action_result.data.\*.rl.url_base64 | string | | -action_result.data.\*.rl.analysis_id | string | | +action_result.data.\*.limits.\*.limit | numeric | | +action_result.data.\*.limits.\*.limit_type | string | | +action_result.data.\*.limits.\*.limit_exceeded | boolean | | +action_result.data.\*.limits.\*.products | string | | +action_result.data.\*.limits.\*.users | string | | action_result.status | string | | -action_result.summary | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'dynamic analysis results' -TCA-0106 - Retrieve dynamic analysis results +## action: 'get domain report' +API returns threat intelligence data for the submitted domain -Type: **investigate** +Type: **generic** Read only: **False** -TCA-0106 - This service allows users to retrieve dynamic analysis results for a file that was submitted for dynamic analysis. +The report contains domain reputation from various reputation sources, classification statistics for files downloaded from the domain, the most common threats found on the domain DNS information about the domain, and parent domain information. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**sha1** | required | Selected sample's SHA-1 hash | string | `sha1` -**analysis_id** | optional | Return only the results of this analysis | string | -**latest** | optional | Return only the latest analysis results | boolean | +**domain** | required | The domain for which to retrieve the report | string | `domain` #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success failed -action_result.parameter.analysis_id | string | | -action_result.parameter.latest | boolean | | -action_result.parameter.sha1 | string | | -action_result.data | string | | -action_result.summary | string | | +action_result.status | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'dynamic url analysis results' -TCA-0106 - Retrieve dynamic analysis results for url +## action: 'get domain downloaded files' +Retrieve a list of files downloaded from the submitted domain -Type: **investigate** -Read only: **True** +Type: **generic** +Read only: **False** -TCA-0106 - This service allows users to retrieve dynamic analysis results for an url that was submitted for dynamic analysis. +The response will contain metadata for files downloaded from the submitted domain. Empty fields are not included in the response. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**url** | required | Provide one of the following: sha1, base64 or url | string | `sha1` `url` -**analysis_id** | optional | Return only the results of this analysis | string | -**latest** | optional | Return only the latest analysis results | boolean | +**domain** | required | The domain for which to retrieve the downloaded files | string | `domain` +**extended** | optional | Chose whether you want extended result data set | boolean | +**limit** | optional | The number of files to return in the response. Default is 1000 | numeric | +**classification** | optional | Return only samples that match the requested classification for given domain | string | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.parameter.analysis_id | string | | -action_result.data.0.requested_sha1_url | string | | action_result.status | string | | -action_result.summary | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'reanalyze file' -TCA-0205 - Reanalyze sample +## action: 'get urls from domain' +API provides a list of URLs associated with the requested domain Type: **investigate** Read only: **False** -TCA-0205 - This query sends a sample with the requested hash for rescanning. +API provides a list of URLs associated with the requested domain. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**hash** | required | File hash | string | `md5` `sha1` `sha256` +**domain** | required | The domain for which to retrieve the resolved IP addresses | string | `domain` +**page** | optional | String representing a page of results | string | +**limit** | optional | The number of files to return in the response. Default is 1000 | numeric | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success failed -action_result.parameter.hash | string | | -action_result.data | string | | -action_result.summary | string | | +action_result.data.\*.requested_domain | string | `domain` | +action_result.data.\*.urls.\*.url | string | `url` | +action_result.status | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'upload file' -TCA-0202 - Upload file to TitaniumCloud +## action: 'get resolutions from domain' +API provides a list of domain-to-IP mappings for the requested domain -Type: **generic** +Type: **investigate** Read only: **False** -TCA-0202 - Upload file to TitaniumCloud. +API provides a list of domain-to-IP mappings for the requested domain. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**vault_id** | required | Vault ID of file to upload | string | `vault id` -**file_name** | optional | Filename to use | string | `file name` +**domain** | required | The domain for which to retrieve the domain to IP mappings | string | `domain` +**page** | optional | String representing a page of results | string | +**limit** | optional | The number of files to return in the response. Default is 1000 | numeric | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success failed -action_result.parameter.file_name | string | `file name` | -action_result.parameter.vault_id | string | `pe file` `pdf` `flash` `apk` `jar` `doc` `xls` `ppt` | -action_result.data | string | | -action_result.summary | string | | +action_result.data.\*.requested_domain | string | `domain` | +action_result.data.\*.resolutions.\*.record_type | string | | +action_result.data.\*.resolutions.\*.answer | string | | +action_result.data.\*.resolutions.\*.last_resolution_time | string | | +action_result.data.\*.resolutions.\*.provider | string | | +action_result.status | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'get file' -TCA-0201 - Download a sample from TitaniumCloud +## action: 'get related domains' +API provides a list of domains that have the same top parent domain as the requested domain Type: **investigate** -Read only: **True** +Read only: **False** -TCA-0201 - Download a sample from TitaniumCloud and add it to the vault. +API provides a list of domains that have the same top parent domain as the requested domain. If the requested domain is a top parent domain, the API will return all subdomains. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**hash** | required | Hash of file/sample to download | string | `md5` `sha1` `sha256` +**domain** | required | The domain for which to retrieve the downloaded files | string | `domain` +**page** | optional | String representing a page of results | string | +**limit** | optional | The number of files to return in the response. Default is 1000 | numeric | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.status | string | | success failed -action_result.parameter.hash | string | `md5` `sha1` `sha256` | -action_result.data | string | | -action_result.summary | string | | +action_result.data.\*.requested_domain | string | `domain` | +action_result.data.\*.related_domains.\*.domain | string | `domain` | +action_result.status | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'get network reputation' -Network Reputation API +## action: 'get ip report' +API returns threat intelligence data for the submitted ip address -Type: **investigate** +Type: **generic** Read only: **False** -Service provides information regarding the reputation of a requested URL, domain, or IP address. +The report contains IP reputation from various reputation sources, classification statistics for files downloaded from the IP, and the top threats hosted on the submitted IP. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**network_locations** | required | Network location to check (URL,DNS,IP) | string | `domain` `url` `ip` +**ip_address** | required | The IP address for which to retrieve the report | string | `ip` #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES @@ -1795,71 +2656,78 @@ action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'get list user overrides' -List User Overrides +## action: 'get ip downloaded files' +Retrieve a list of files downloaded from the submitted IP address Type: **generic** Read only: **False** -The Network Reputation User Override service enables URL classification overrides. Any URL can be overridden to malicious, suspicious, or known. +The response will contain metadata for files downloaded from the submitted IP address. Empty fields are not included in the response. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**next_page_sha1** | optional | Optional parameter used for pagination | string | `sha1` +**ip_address** | required | The IP address for which to retrieve the downloaded files | string | `ip` +**extended** | optional | Chose whether you want extended result data set | boolean | +**page** | optional | String representing a page of results | string | +**limit** | optional | The number of files to return in the response. Default is 1000 | numeric | +**classification** | optional | Return only samples that match the requested classification for given domain | string | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.data.\*.user_override.network_locations.\*.network_location | string | `url` `domain` `ip` | -action_result.data.\*.user_override.network_locations.\*.type | string | `url` `domain` `ip` | action_result.status | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'get list user overrides aggregated' -Returns a list of overrides that the user has made +## action: 'get urls from ip' +API provides a list of URLs associated with the requested IP address -Type: **generic** +Type: **investigate** Read only: **False** -This API automatically handles paging and returns a list of results instead of a Response object. +API provides a list of URLs associated with the requested IP address. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**max_results** | optional | Maximum number of results to be returned in the list | numeric | +**ip_address** | required | The IP for which to retrieve the domain resolutions | string | `ip` +**page** | optional | String representing a page of results | string | +**limit** | optional | The number of files to return in the response. Default is 1000 | numeric | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.data.\*.\*.network_location | string | `url` `domain` `ip` | -action_result.data.\*.\*.type | string | `url` `domain` `ip` | +action_result.data.\*.requested_ip | string | `ip` | +action_result.data.\*.urls.\*.url | string | `url` | action_result.status | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'network reputation user override' -Network Reputation User Override +## action: 'get resolutions from ip' +API provides a list of IP-to-domain mappings for the requested IP address -Type: **generic** +Type: **investigate** Read only: **False** -The Network Reputation User Override service enables URL classification overrides. +API provides a list of IP-to-domain mappings for the requested IP address. #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**override_list** | required | List of network locations whose classification needs to be overriden | string | -**remove_overrides_list** | optional | List of network locations whose classification override needs to be removed | string | +**ip_address** | required | The IP address for which to retrieve resolutions | string | `ip` +**page** | optional | String representing a page of results | string | +**limit** | optional | The number of files to return in the response. Default is 1000 | numeric | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.parameter.override_list | string | | -action_result.parameter.remove_overrides_list | string | | +action_result.data.\*.requested_ip | string | `ip` | +action_result.data.\*.resolutions.\*.host_name | string | `domain` | +action_result.data.\*.resolutions.\*.last_resolution_time | string | | +action_result.data.\*.resolutions.\*.provider | string | | action_result.status | string | | action_result.message | string | | summary.total_objects | numeric | | diff --git a/release_notes/1.4.0.md b/release_notes/1.4.0.md new file mode 100644 index 0000000..58c8fc0 --- /dev/null +++ b/release_notes/1.4.0.md @@ -0,0 +1,50 @@ +* Added new actions: + * File Reputation User Override + * List Active File Reputation User Overrides + * Customer Daily Usage + * Customer Dayrange usage + * Customer Monthly Usage + * Customer Month Range Usage + * Customer Yara API Usage + * Customer Quota Limits + * Get Domain Report + * Get Domain Downloaded Files + * Get Urls From Domain + * Get Resolutions From Domain + * Get Related Domains + * Get IP Report + * Get IP Downloaded Files + * Get Urls From IP + * Get Resolutions From IP +* Bug fixes: + * Applied fixes to the data display when response does not contain requested key + * Applied fixes for out of index error while fetching data for dropped files in dynamic analysis results actions +* Enhancements: + * Changed action type for following actions + * get_yara_matches (from generic to investigate) + * yara_retro_enable_hunt (from generic to investigate) + * yara_retro_start_hunt (from generic to investigate) + * get_yara_retro_matches (from generic to investigate) + * advanced_search (from generic to investigate) + * get_url_downloaded_files (from generic to investigate) + * uri_index (from generic to investigate) + * Added new value lists for following actions to enhance UX and control parameter data type: + * get_yara_matches (timestamp, utc) + * get_yara_retro_matches (timestamp, utc) + * get_url_downloaded_files (timestamp, utc) + * submit for dynamic analysis (windows10, windows11, windows7, macos11, linux) + * submit url for dynamic analysis (windows10, windows11, windows7, macos11, linux) + * Adjusted descrioptions on some actions to be more precise + * Added new charts for actions to enhance UX and data readability + * Added color coding in custom views for actions to enhance UX + * Added contextual actions in custom views to enhance UX + * Applied new CSS style for better data readability + * Added custom views for actions: + * customer dayrange usage + * customer month range usage + * get domain downloaded files + * get domain report + * get file reputation user overrides + * get active file reputation user overrides + * get ip downloaded files + * get ip report \ No newline at end of file diff --git a/release_notes/unreleased.md b/release_notes/unreleased.md index f318507..fbcb2fd 100644 --- a/release_notes/unreleased.md +++ b/release_notes/unreleased.md @@ -1,51 +1 @@ **Unreleased** -* Added new actions: - * File Reputation User Override - * List Active File Reputation User Overrides - * Customer Daily Usage - * Customer Dayrange usage - * Customer Monthly Usage - * Customer Month Range Usage - * Customer Yara API Usage - * Customer Quota Limits - * Get Domain Report - * Get Domain Downloaded Files - * Get Urls From Domain - * Get Resolutions From Domain - * Get Related Domains - * Get IP Report - * Get IP Downloaded Files - * Get Urls From IP - * Get Resolutions From IP -* Bug fixes: - * Applied fixes to the data display when response does not contain requested key - * Applied fixes for out of index error while fetching data for dropped files in dynamic analysis results actions -* Enhancements: - * Changed action type for following actions - * get_yara_matches (from generic to investigate) - * yara_retro_enable_hunt (from generic to investigate) - * yara_retro_start_hunt (from generic to investigate) - * get_yara_retro_matches (from generic to investigate) - * advanced_search (from generic to investigate) - * get_url_downloaded_files (from generic to investigate) - * uri_index (from generic to investigate) - * Added new value lists for following actions to enhance UX and control parameter data type: - * get_yara_matches (timestamp, utc) - * get_yara_retro_matches (timestamp, utc) - * get_url_downloaded_files (timestamp, utc) - * submit for dynamic analysis (windows10, windows11, windows7, macos11, linux) - * submit url for dynamic analysis (windows10, windows11, windows7, macos11, linux) - * Adjusted descrioptions on some actions to be more precise - * Added new charts for actions to enhance UX and data readability - * Added color coding in custom views for actions to enhance UX - * Added contextual actions in custom views to enhance UX - * Applied new CSS style for better data readability - * Added custom views for actions: - * customer dayrange usage - * customer month range usage - * get domain downloaded files - * get domain report - * get file reputation user overrides - * get active file reputation user overrides - * get ip downloaded files - * get ip report From 8ceb460acf378b075a5cad2b9a987c487df46e18 Mon Sep 17 00:00:00 2001 From: splunk-soar-connectors-admin Date: Tue, 28 May 2024 12:57:37 +0000 Subject: [PATCH 08/11] Update README.md --- README.md | 43 ++++++++++++++++--------------------------- 1 file changed, 16 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 60bd91d..770d512 100644 --- a/README.md +++ b/README.md @@ -420,7 +420,7 @@ summary.total_objects_successful | numeric | | ## action: 'file reputation user override' TCA-0102 - File Reputation User Override -Type: **investigate** +Type: **generic** Read only: **False** TCA-0102 - The File Reputation User Override service enables File sample classification overrides. @@ -951,7 +951,7 @@ summary.total_objects_successful | numeric | | ## action: 'list active file reputation user overrides' TCA-0102 - List Active File Reputation User Overrides -Type: **investigate** +Type: **generic** Read only: **False** TCA-0102 - The File Reputation User Override service enables sample classification overrides. Any sample can be overridden to malicious, suspicious, or known. @@ -995,27 +995,6 @@ action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | -## action: 'dynamic url analysis results' -TCA-0106 - Retrieve dynamic analysis results for url - -Type: **investigate** -Read only: **true** - -TCA-0106 - This service allows users to retrieve dynamic analysis results for an url that was submitted for dynamic analysis. - -#### Action Parameters -PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS ---------- | -------- | ----------- | ---- | -------- -**url** | required | Provide one of the following: sha1, base64 or url | string | `sha1` `url` | -**analysis_id** | optional | Return only the results of this analysis | string | -**latest** | optional | Return only the latest analysis results | boolean | - -#### Action Output -DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES ---------- | ---- | -------- | -------------- -action_result.parameter.analysis_id | string | | -action_result.parameter.data.0.requested_sha1_url | string | | - ## action: 'reanalyze file' TCA-0205 - Reanalyze sample @@ -1192,7 +1171,7 @@ summary.total_objects_successful | numeric | | ## action: 'yara create ruleset' TCA-0304 - Create a new YARA ruleset -Type: **investigate** +Type: **generic** Read only: **False** TCA-0304 - Create a new YARA ruleset. @@ -1210,6 +1189,7 @@ action_result.status | string | | success or failed action_result.parameter.ruleset_name | string | | action_result.parameter.ruleset_text | string | | action_result.data | string | | +action_result.summary | string | | action_result.message | string | | summary.total_objects | numeric | | summary.total_objects_successful | numeric | | @@ -1287,6 +1267,8 @@ action_result.data | string | | action_result.summary | string | | action_result.message | string | | summary.total_objects | numeric | | +summary.total_objects_successful | numeric | | + ## action: 'yara retro cancel hunt' TCA-0319 - Cancel the retro hunt for the specified ruleset @@ -1303,8 +1285,6 @@ PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- -action_result.data.*.user_override.network_locations.*.network_location | string | `url` `domain` `ip` | -action_result.data.*.user_override.network_locations.*.type | string | `url` `domain` `ip` | action_result.status | string | | success or failed action_result.parameter.ruleset_name | string | | action_result.data.*.ruleset_sha1 | string | | @@ -1565,6 +1545,8 @@ DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- action_result.parameter.ruleset_name | string | | action_result.data.\*.text | string | | +action_result.parameter.ruleset_name | string | | +action_result.data.\*.text | string | | action_result.status | string | | success failed action_result.data | string | | action_result.summary | string | | @@ -1670,6 +1652,13 @@ action_result.data.\*.finish_time | string | | action_result.data.\*.reason | string | | action_result.data.\*.progress | string | | action_result.data.\*.estimated_finish_time | string | | +action_result.parameter.ruleset_name | string | | +action_result.data.\*.retro_status | string | | +action_result.data.\*.start_time | string | | +action_result.data.\*.finish_time | string | | +action_result.data.\*.reason | string | | +action_result.data.\*.progress | string | | +action_result.data.\*.estimated_finish_time | string | | action_result.status | string | | success failed action_result.data | string | | action_result.summary | string | | @@ -2025,7 +2014,7 @@ TCA-0402 - Provides the number of MALICIOUS, SUSPICIOUS and KNOWN files associat #### Action Parameters PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS --------- | -------- | ----------- | ---- | -------- -**uri** | required | Uri | string | `sha1` +**uri** | required | Uri | string | #### Action Output DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES From 79a12474d277d4e330b72bc408d5b2cc095ec5c2 Mon Sep 17 00:00:00 2001 From: mishalp-crest Date: Tue, 28 May 2024 18:38:30 +0530 Subject: [PATCH 09/11] copy pasted next branch files --- README.md | 10 +-- manual_readme_content.md | 1 + reversinglabs_ticloudv2.json | 62 ++---------------- ...bs_ticloudv2_dynamic_analysis_results.html | 48 -------------- ...icloudv2_dynamic_url_analysis_results.html | 7 ++ ...abs_ticloudv2_network_reputation_view.html | 1 + ...versinglabs_sdk_py3-2.4.2-py3-none-any.whl | Bin 67343 -> 0 bytes 7 files changed, 14 insertions(+), 115 deletions(-) delete mode 100644 wheels/py3/reversinglabs_sdk_py3-2.4.2-py3-none-any.whl diff --git a/README.md b/README.md index 770d512..0f26828 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,7 @@ VARIABLE | REQUIRED | TYPE | DESCRIPTION [yara retro check status](#action-yara-retro-check-status) - TCA-0319 - Check the retro hunt status for the specified ruleset [yara retro cancel hunt](#action-yara-retro-cancel-hunt) - TCA-0319 - Cancel the retro hunt for the specified ruleset + ## action: 'test connectivity' Validate the asset configuration for connectivity using supplied configuration @@ -1545,8 +1546,6 @@ DATA PATH | TYPE | CONTAINS | EXAMPLE VALUES --------- | ---- | -------- | -------------- action_result.parameter.ruleset_name | string | | action_result.data.\*.text | string | | -action_result.parameter.ruleset_name | string | | -action_result.data.\*.text | string | | action_result.status | string | | success failed action_result.data | string | | action_result.summary | string | | @@ -1652,13 +1651,6 @@ action_result.data.\*.finish_time | string | | action_result.data.\*.reason | string | | action_result.data.\*.progress | string | | action_result.data.\*.estimated_finish_time | string | | -action_result.parameter.ruleset_name | string | | -action_result.data.\*.retro_status | string | | -action_result.data.\*.start_time | string | | -action_result.data.\*.finish_time | string | | -action_result.data.\*.reason | string | | -action_result.data.\*.progress | string | | -action_result.data.\*.estimated_finish_time | string | | action_result.status | string | | success failed action_result.data | string | | action_result.summary | string | | diff --git a/manual_readme_content.md b/manual_readme_content.md index 3b05502..04e4c61 100644 --- a/manual_readme_content.md +++ b/manual_readme_content.md @@ -73,6 +73,7 @@ VARIABLE | REQUIRED | TYPE | DESCRIPTION [yara retro check status](#action-yara-retro-check-status) - TCA-0319 - Check the retro hunt status for the specified ruleset [yara retro cancel hunt](#action-yara-retro-cancel-hunt) - TCA-0319 - Cancel the retro hunt for the specified ruleset + ## action: 'test connectivity' Validate the asset configuration for connectivity using supplied configuration diff --git a/reversinglabs_ticloudv2.json b/reversinglabs_ticloudv2.json index 526df00..8c8335d 100644 --- a/reversinglabs_ticloudv2.json +++ b/reversinglabs_ticloudv2.json @@ -288,19 +288,7 @@ "param_name": "ruleset_name" } }, - "output": [ - { - "data_path": "action_result.parameter.ruleset_name", - "data_type": "string", - "column_name": "ruleset name", - "column_order": 0 - }, - { - "data_path": "action_result.data.*.text", - "data_type": "string", - "column_name": "text", - "column_order": 1 - }, + "output": [ { "data_path": "action_result.parameter.ruleset_name", "data_type": "string", @@ -576,49 +564,7 @@ "param_name": "ruleset_name" } }, - "output": [ - { - "data_path": "action_result.parameter.ruleset_name", - "data_type": "string", - "column_name": "ruleset name", - "column_order": 0 - }, - { - "data_path": "action_result.data.*.retro_status", - "data_type": "string", - "column_name": "retro status", - "column_order": 1 - }, - { - "data_path": "action_result.data.*.start_time", - "data_type": "string", - "column_name": "start time", - "column_order": 2 - }, - { - "data_path": "action_result.data.*.finish_time", - "data_type": "string", - "column_name": "finish time", - "column_order": 3 - }, - { - "data_path": "action_result.data.*.reason", - "data_type": "string", - "column_name": "reason", - "column_order": 4 - }, - { - "data_path": "action_result.data.*.progress", - "data_type": "string", - "column_name": "progress", - "column_order": 5 - }, - { - "data_path": "action_result.data.*.estimated_finish_time", - "data_type": "string", - "column_name": "estimated finish time", - "column_order": 6 - }, + "output": [ { "data_path": "action_result.parameter.ruleset_name", "data_type": "string", @@ -2633,7 +2579,7 @@ "data_path": "action_result.status", "data_type": "string", "column_name": "status" - }, + }, { "data_path": "action_result.message", "data_type": "string" @@ -4134,7 +4080,7 @@ }, { "module": "reversinglabs_sdk_py3", - "input_file": "wheels/py3/reversinglabs_sdk_py3-2.4.2-py3-none-any.whl" + "input_file": "wheels/py3/reversinglabs_sdk_py3-2.5.4-py3-none-any.whl" }, { "module": "urllib3", diff --git a/views/reversinglabs_ticloudv2_dynamic_analysis_results.html b/views/reversinglabs_ticloudv2_dynamic_analysis_results.html index 30f2244..11ce6bc 100644 --- a/views/reversinglabs_ticloudv2_dynamic_analysis_results.html +++ b/views/reversinglabs_ticloudv2_dynamic_analysis_results.html @@ -45,15 +45,6 @@ display: flex; flex-direction: column; } - - .rl-delimiter { - background-color: #F6143F; - padding: 1px !important; - } - - .rl-text-center { - text-align: center; - } .rl-delimiter { background-color: #F6143F; @@ -85,45 +76,6 @@ padding-right: 2rem; width: 11%; } - - .rl-link { - color: #7CA0F8 !important; - text-decoration: underline; - } - - /* Style the tab */ - .tab { - overflow: hidden; - } - - /* Style the buttons inside the tab */ - .tab button { - background-color: inherit; - float: left; - border: none; - outline: none; - cursor: pointer; - padding: 5px; - transition: 0.3s; - border: 1px solid; - } - - /* Change background color of buttons on hover */ - .tab button:hover { - background-color: #ddd; - } - - /* Create an active/current tablink class */ - .tab button.active { - background-color: #ccc; - } - - /* Style the tab content */ - .tabcontent { - display: none; - padding: 6px 12px; - border-top: none; - } .rl-link { color: #7CA0F8 !important; diff --git a/views/reversinglabs_ticloudv2_dynamic_url_analysis_results.html b/views/reversinglabs_ticloudv2_dynamic_url_analysis_results.html index 4143a8f..99b50a1 100644 --- a/views/reversinglabs_ticloudv2_dynamic_url_analysis_results.html +++ b/views/reversinglabs_ticloudv2_dynamic_url_analysis_results.html @@ -17,6 +17,7 @@ -->